|
|
@ -302,9 +302,9 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color |
|
|
|
rlBegin(RL_TRIANGLES); |
|
|
|
rlColor4ub(color.r, color.g, color.b, color.a); |
|
|
|
|
|
|
|
for(int i = 0; i < (rings + 2); i++) |
|
|
|
for (int i = 0; i < (rings + 2); i++) |
|
|
|
{ |
|
|
|
for(int j = 0; j < slices; j++) |
|
|
|
for (int j = 0; j < slices; j++) |
|
|
|
{ |
|
|
|
rlVertex3f(cos(DEG2RAD*(270+(180/(rings + 1))*i)) * sin(DEG2RAD*(j*360/slices)), |
|
|
|
sin(DEG2RAD*(270+(180/(rings + 1))*i)), |
|
|
@ -341,9 +341,9 @@ void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Col |
|
|
|
rlBegin(RL_LINES); |
|
|
|
rlColor4ub(color.r, color.g, color.b, color.a); |
|
|
|
|
|
|
|
for(int i = 0; i < (rings + 2); i++) |
|
|
|
for (int i = 0; i < (rings + 2); i++) |
|
|
|
{ |
|
|
|
for(int j = 0; j < slices; j++) |
|
|
|
for (int j = 0; j < slices; j++) |
|
|
|
{ |
|
|
|
rlVertex3f(cos(DEG2RAD*(270+(180/(rings + 1))*i)) * sin(DEG2RAD*(j*360/slices)), |
|
|
|
sin(DEG2RAD*(270+(180/(rings + 1))*i)), |
|
|
@ -386,7 +386,7 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h |
|
|
|
if (radiusTop > 0) |
|
|
|
{ |
|
|
|
// Draw Body ------------------------------------------------------------------------------------- |
|
|
|
for(int i = 0; i < 360; i += 360/sides) |
|
|
|
for (int i = 0; i < 360; i += 360/sides) |
|
|
|
{ |
|
|
|
rlVertex3f(sin(DEG2RAD*i) * radiusBottom, 0, cos(DEG2RAD*i) * radiusBottom); //Bottom Left |
|
|
|
rlVertex3f(sin(DEG2RAD*(i+360/sides)) * radiusBottom, 0, cos(DEG2RAD*(i+360/sides)) * radiusBottom); //Bottom Right |
|
|
@ -398,7 +398,7 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h |
|
|
|
} |
|
|
|
|
|
|
|
// Draw Cap -------------------------------------------------------------------------------------- |
|
|
|
for(int i = 0; i < 360; i += 360/sides) |
|
|
|
for (int i = 0; i < 360; i += 360/sides) |
|
|
|
{ |
|
|
|
rlVertex3f(0, height, 0); |
|
|
|
rlVertex3f(sin(DEG2RAD*i) * radiusTop, height, cos(DEG2RAD*i) * radiusTop); |
|
|
@ -408,7 +408,7 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h |
|
|
|
else |
|
|
|
{ |
|
|
|
// Draw Cone ------------------------------------------------------------------------------------- |
|
|
|
for(int i = 0; i < 360; i += 360/sides) |
|
|
|
for (int i = 0; i < 360; i += 360/sides) |
|
|
|
{ |
|
|
|
rlVertex3f(0, height, 0); |
|
|
|
rlVertex3f(sin(DEG2RAD*i) * radiusBottom, 0, cos(DEG2RAD*i) * radiusBottom); |
|
|
@ -417,7 +417,7 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h |
|
|
|
} |
|
|
|
|
|
|
|
// Draw Base ----------------------------------------------------------------------------------------- |
|
|
|
for(int i = 0; i < 360; i += 360/sides) |
|
|
|
for (int i = 0; i < 360; i += 360/sides) |
|
|
|
{ |
|
|
|
rlVertex3f(0, 0, 0); |
|
|
|
rlVertex3f(sin(DEG2RAD*(i+360/sides)) * radiusBottom, 0, cos(DEG2RAD*(i+360/sides)) * radiusBottom); |
|
|
@ -431,7 +431,7 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h |
|
|
|
// NOTE: It could be also used for pyramid and cone |
|
|
|
void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int sides, Color color) |
|
|
|
{ |
|
|
|
if(sides < 3) sides = 3; |
|
|
|
if (sides < 3) sides = 3; |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
rlTranslatef(position.x, position.y, position.z); |
|
|
@ -439,7 +439,7 @@ void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, fl |
|
|
|
rlBegin(RL_LINES); |
|
|
|
rlColor4ub(color.r, color.g, color.b, color.a); |
|
|
|
|
|
|
|
for(int i = 0; i < 360; i += 360/sides) |
|
|
|
for (int i = 0; i < 360; i += 360/sides) |
|
|
|
{ |
|
|
|
rlVertex3f(sin(DEG2RAD*i) * radiusBottom, 0, cos(DEG2RAD*i) * radiusBottom); |
|
|
|
rlVertex3f(sin(DEG2RAD*(i+360/sides)) * radiusBottom, 0, cos(DEG2RAD*(i+360/sides)) * radiusBottom); |
|
|
@ -500,7 +500,7 @@ void DrawGrid(int slices, float spacing) |
|
|
|
int halfSlices = slices / 2; |
|
|
|
|
|
|
|
rlBegin(RL_LINES); |
|
|
|
for(int i = -halfSlices; i <= halfSlices; i++) |
|
|
|
for (int i = -halfSlices; i <= halfSlices; i++) |
|
|
|
{ |
|
|
|
if (i == 0) |
|
|
|
{ |
|
|
@ -798,9 +798,9 @@ static Mesh GenMeshHeightmap(Image heightmap, Vector3 size) |
|
|
|
|
|
|
|
Vector3 scaleFactor = { size.x/mapX, size.y/255.0f, size.z/mapZ }; |
|
|
|
|
|
|
|
for(int z = 0; z < mapZ-1; z++) |
|
|
|
for (int z = 0; z < mapZ-1; z++) |
|
|
|
{ |
|
|
|
for(int x = 0; x < mapX-1; x++) |
|
|
|
for (int x = 0; x < mapX-1; x++) |
|
|
|
{ |
|
|
|
// Fill vertices array with data |
|
|
|
//---------------------------------------------------------- |
|
|
@ -1417,7 +1417,7 @@ bool CheckCollisionRaySphere(Ray ray, Vector3 spherePosition, float sphereRadius |
|
|
|
float vector = VectorDotProduct(raySpherePos, ray.direction); |
|
|
|
float d = sphereRadius*sphereRadius - (distance*distance - vector*vector); |
|
|
|
|
|
|
|
if(d >= 0.0f) collision = true; |
|
|
|
if (d >= 0.0f) collision = true; |
|
|
|
|
|
|
|
return collision; |
|
|
|
} |
|
|
@ -1432,14 +1432,14 @@ bool CheckCollisionRaySphereEx(Ray ray, Vector3 spherePosition, float sphereRadi |
|
|
|
float vector = VectorDotProduct(raySpherePos, ray.direction); |
|
|
|
float d = sphereRadius*sphereRadius - (distance*distance - vector*vector); |
|
|
|
|
|
|
|
if(d >= 0.0f) collision = true; |
|
|
|
if (d >= 0.0f) collision = true; |
|
|
|
|
|
|
|
// Calculate collision point |
|
|
|
Vector3 offset = ray.direction; |
|
|
|
float collisionDistance = 0; |
|
|
|
|
|
|
|
// Check if ray origin is inside the sphere to calculate the correct collision point |
|
|
|
if(distance < sphereRadius) collisionDistance = vector + sqrt(d); |
|
|
|
if (distance < sphereRadius) collisionDistance = vector + sqrt(d); |
|
|
|
else collisionDistance = vector - sqrt(d); |
|
|
|
|
|
|
|
VectorScale(&offset, collisionDistance); |
|
|
@ -1777,11 +1777,11 @@ static Mesh LoadOBJ(const char *fileName) |
|
|
|
// First reading pass: Get numVertex, numNormals, numTexCoords, numTriangles |
|
|
|
// NOTE: vertex, texcoords and normals could be optimized (to be used indexed on faces definition) |
|
|
|
// NOTE: faces MUST be defined as TRIANGLES (3 vertex per face) |
|
|
|
while(!feof(objFile)) |
|
|
|
while (!feof(objFile)) |
|
|
|
{ |
|
|
|
fscanf(objFile, "%c", &dataType); |
|
|
|
|
|
|
|
switch(dataType) |
|
|
|
switch (dataType) |
|
|
|
{ |
|
|
|
case '#': // Comments |
|
|
|
case 'o': // Object name (One OBJ file can contain multible named meshes) |
|
|
@ -1842,11 +1842,11 @@ static Mesh LoadOBJ(const char *fileName) |
|
|
|
// Second reading pass: Get vertex data to fill intermediate arrays |
|
|
|
// NOTE: This second pass is required in case of multiple meshes defined in same OBJ |
|
|
|
// TODO: Consider that different meshes can have different vertex data available (position, texcoords, normals) |
|
|
|
while(!feof(objFile)) |
|
|
|
while (!feof(objFile)) |
|
|
|
{ |
|
|
|
fscanf(objFile, "%c", &dataType); |
|
|
|
|
|
|
|
switch(dataType) |
|
|
|
switch (dataType) |
|
|
|
{ |
|
|
|
case '#': case 'o': case 'g': case 's': case 'm': case 'u': case 'f': fgets(comments, 200, objFile); break; |
|
|
|
case 'v': |
|
|
@ -1903,11 +1903,11 @@ static Mesh LoadOBJ(const char *fileName) |
|
|
|
if (numNormals == 0) TraceLog(INFO, "[%s] No normals data on OBJ, normals will be generated from faces data", fileName); |
|
|
|
|
|
|
|
// Third reading pass: Get faces (triangles) data and fill VertexArray |
|
|
|
while(!feof(objFile)) |
|
|
|
while (!feof(objFile)) |
|
|
|
{ |
|
|
|
fscanf(objFile, "%c", &dataType); |
|
|
|
|
|
|
|
switch(dataType) |
|
|
|
switch (dataType) |
|
|
|
{ |
|
|
|
case '#': case 'o': case 'g': case 's': case 'm': case 'u': case 'v': fgets(comments, 200, objFile); break; |
|
|
|
case 'f': |
|
|
@ -2023,7 +2023,7 @@ static Material LoadMTL(const char *fileName) |
|
|
|
return material; |
|
|
|
} |
|
|
|
|
|
|
|
while(!feof(mtlFile)) |
|
|
|
while (!feof(mtlFile)) |
|
|
|
{ |
|
|
|
fgets(buffer, MAX_BUFFER_SIZE, mtlFile); |
|
|
|
|
|
|
|