summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorraysan5 <[email protected]>2021-10-12 20:22:12 +0200
committerraysan5 <[email protected]>2021-10-12 20:22:12 +0200
commit252bd2273880e9cc94933099df96ee712f5bdf9c (patch)
treefb95241d5f9eef9b58f8aa5f93c4a9ed55b799fa /src
parent0b0711027ac3860067347298b6aa16c5fc65f454 (diff)
parente168c6dd818d89d88738e3590f5ae94a4a819223 (diff)
downloadraylib-252bd2273880e9cc94933099df96ee712f5bdf9c.tar.gz
raylib-252bd2273880e9cc94933099df96ee712f5bdf9c.zip
Merge branch 'master' of https://github.com/raysan5/raylib
Diffstat (limited to 'src')
-rw-r--r--src/raylib.h2
-rw-r--r--src/rmodels.c106
2 files changed, 108 insertions, 0 deletions
diff --git a/src/raylib.h b/src/raylib.h
index e29ff577..1f2c0f20 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -1383,7 +1383,9 @@ RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color);
RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters
RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires
RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone
+RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos
RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires
+RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos
RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ
RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line
RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0))
diff --git a/src/rmodels.c b/src/rmodels.c
index 9cba9453..98572985 100644
--- a/src/rmodels.c
+++ b/src/rmodels.c
@@ -703,6 +703,64 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h
rlPopMatrix();
}
+// Draw a cylinder with base at startPos and top at endPos
+// NOTE: It could be also used for pyramid and cone
+void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color)
+{
+ if (sides < 3) sides = 3;
+
+ int numVertex = sides*6;
+ rlCheckRenderBatchLimit(numVertex);
+ if(sides < 3) sides = 3;
+
+ Vector3 direction = { endPos.x - startPos.x, endPos.y - startPos.y, endPos.z - startPos.z };
+ // Construct a basis of the base and the top face:
+ Vector3 b1 = Vector3Normalize(Vector3Perpendicular(direction));
+ Vector3 b2 = Vector3Normalize(Vector3CrossProduct(b1, direction));
+
+ float baseAngle = (2.0*PI)/sides;
+
+ rlBegin(RL_TRIANGLES);
+ rlColor4ub(color.r, color.g, color.b, color.a);
+
+ for (int i = 0; i < sides; i++) {
+ // compute the four vertices
+ float s1 = sinf(baseAngle*(i + 0))*startRadius;
+ float c1 = cosf(baseAngle*(i + 0))*startRadius;
+ Vector3 w1 = { startPos.x + s1*b1.x + c1*b2.x, startPos.y + s1*b1.y + c1*b2.y, startPos.z + s1*b1.z + c1*b2.z };
+ float s2 = sinf(baseAngle*(i + 1))*startRadius;
+ float c2 = cosf(baseAngle*(i + 1))*startRadius;
+ Vector3 w2 = { startPos.x + s2*b1.x + c2*b2.x, startPos.y + s2*b1.y + c2*b2.y, startPos.z + s2*b1.z + c2*b2.z };
+ float s3 = sinf(baseAngle*(i + 0))*endRadius;
+ float c3 = cosf(baseAngle*(i + 0))*endRadius;
+ Vector3 w3 = { endPos.x + s3*b1.x + c3*b2.x, endPos.y + s3*b1.y + c3*b2.y, endPos.z + s3*b1.z + c3*b2.z };
+ float s4 = sinf(baseAngle*(i + 1))*endRadius;
+ float c4 = cosf(baseAngle*(i + 1))*endRadius;
+ Vector3 w4 = { endPos.x + s4*b1.x + c4*b2.x, endPos.y + s4*b1.y + c4*b2.y, endPos.z + s4*b1.z + c4*b2.z };
+
+ if (startRadius > 0) { //
+ rlVertex3f(startPos.x, startPos.y, startPos.z); // |
+ rlVertex3f(w2.x, w2.y, w2.z); // T0
+ rlVertex3f(w1.x, w1.y, w1.z); // |
+ } //
+ // w2 x.-----------x startPos
+ rlVertex3f(w1.x, w1.y, w1.z); // | |\'. T0 /
+ rlVertex3f(w2.x, w2.y, w2.z); // T1 | \ '. /
+ rlVertex3f(w3.x, w3.y, w3.z); // | |T \ '. /
+ // | 2 \ T 'x w1
+ rlVertex3f(w2.x, w2.y, w2.z); // | w4 x.---\-1-|---x endPos
+ rlVertex3f(w4.x, w4.y, w4.z); // T2 '. \ |T3/
+ rlVertex3f(w3.x, w3.y, w3.z); // | '. \ | /
+ // '.\|/
+ if (endRadius > 0) { // 'x w3
+ rlVertex3f(endPos.x, endPos.y, endPos.z); // |
+ rlVertex3f(w3.x, w3.y, w3.z); // T3
+ rlVertex3f(w4.x, w4.y, w4.z); // |
+ } //
+ }
+ rlEnd();
+}
+
// Draw a wired cylinder
// NOTE: It could be also used for pyramid and cone
void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int sides, Color color)
@@ -736,6 +794,54 @@ void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, fl
rlPopMatrix();
}
+
+// Draw a wired cylinder with base at startPos and top at endPos
+// NOTE: It could be also used for pyramid and cone
+void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color)
+{
+ if (sides < 3) sides = 3;
+
+ int numVertex = sides*6;
+ rlCheckRenderBatchLimit(numVertex);
+
+ Vector3 difference = Vector3Subtract(endPos, startPos);
+ // Construct a basis of the base and the top face:
+ Vector3 b1 = Vector3Normalize(Vector3Perpendicular(difference));
+ Vector3 b2 = Vector3Normalize(Vector3CrossProduct(b1, difference));
+
+ float baseAngle = (2.0*PI)/sides;
+
+ rlBegin(RL_LINES);
+ rlColor4ub(color.r, color.g, color.b, color.a);
+
+ for (int i = 0; i < sides; i++) {
+ // compute the four vertices
+ float s1 = sinf(baseAngle*(i + 0))*startRadius;
+ float c1 = cosf(baseAngle*(i + 0))*startRadius;
+ Vector3 w1 = { startPos.x + s1*b1.x + c1*b2.x, startPos.y + s1*b1.y + c1*b2.y, startPos.z + s1*b1.z + c1*b2.z };
+ float s2 = sinf(baseAngle*(i + 1))*startRadius;
+ float c2 = cosf(baseAngle*(i + 1))*startRadius;
+ Vector3 w2 = { startPos.x + s2*b1.x + c2*b2.x, startPos.y + s2*b1.y + c2*b2.y, startPos.z + s2*b1.z + c2*b2.z };
+ float s3 = sinf(baseAngle*(i + 0))*endRadius;
+ float c3 = cosf(baseAngle*(i + 0))*endRadius;
+ Vector3 w3 = { endPos.x + s3*b1.x + c3*b2.x, endPos.y + s3*b1.y + c3*b2.y, endPos.z + s3*b1.z + c3*b2.z };
+ float s4 = sinf(baseAngle*(i + 1))*endRadius;
+ float c4 = cosf(baseAngle*(i + 1))*endRadius;
+ Vector3 w4 = { endPos.x + s4*b1.x + c4*b2.x, endPos.y + s4*b1.y + c4*b2.y, endPos.z + s4*b1.z + c4*b2.z };
+
+ rlVertex3f(w1.x, w1.y, w1.z);
+ rlVertex3f(w2.x, w2.y, w2.z);
+
+ rlVertex3f(w1.x, w1.y, w1.z);
+ rlVertex3f(w3.x, w3.y, w3.z);
+
+ rlVertex3f(w3.x, w3.y, w3.z);
+ rlVertex3f(w4.x, w4.y, w4.z);
+ }
+ rlEnd();
+}
+
+
// Draw a plane
void DrawPlane(Vector3 centerPos, Vector2 size, Color color)
{