aboutsummaryrefslogtreecommitdiff
path: root/src/models.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/models.c')
-rw-r--r--src/models.c104
1 files changed, 52 insertions, 52 deletions
diff --git a/src/models.c b/src/models.c
index 80d9a13a..8a36c279 100644
--- a/src/models.c
+++ b/src/models.c
@@ -55,7 +55,6 @@ extern unsigned int whiteTexture;
//----------------------------------------------------------------------------------
// Module specific Functions Declaration
//----------------------------------------------------------------------------------
-static float GetHeightValue(Color pixel);
static Mesh LoadOBJ(const char *fileName);
//----------------------------------------------------------------------------------
@@ -557,7 +556,7 @@ void DrawGizmo(Vector3 position)
// Load a 3d model (from file)
Model LoadModel(const char *fileName)
{
- Model model;
+ Model model = { 0 };
Mesh mesh = { 0 };
// NOTE: Initialize default data for model in case loading fails, maybe a cube?
@@ -608,17 +607,19 @@ Model LoadModelEx(Mesh data)
}
// Load a heightmap image as a 3d model
-Model LoadHeightmap(Image heightmap, float maxHeight)
+// NOTE: model map size is defined in generic units
+Model LoadHeightmap(Image heightmap, Vector3 size)
{
+ #define GRAY_VALUE(c) ((c.r+c.g+c.b)/3)
+
Mesh mesh;
int mapX = heightmap.width;
int mapZ = heightmap.height;
- Color *heightmapPixels = GetImageData(heightmap);
+ Color *pixels = GetImageData(heightmap);
// NOTE: One vertex per pixel
- // TODO: Consider resolution when generating model data?
int numTriangles = (mapX-1)*(mapZ-1)*2; // One quad every four pixels
mesh.vertexCount = numTriangles*3;
@@ -634,7 +635,7 @@ Model LoadHeightmap(Image heightmap, float maxHeight)
int trisCounter = 0;
- float scaleFactor = maxHeight/255; // TODO: Review scaleFactor calculation
+ Vector3 scaleFactor = { size.x/mapX, size.y/255.0f, size.z/mapZ };
for(int z = 0; z < mapZ-1; z++)
{
@@ -644,17 +645,17 @@ Model LoadHeightmap(Image heightmap, float maxHeight)
//----------------------------------------------------------
// one triangle - 3 vertex
- mesh.vertices[vCounter] = x;
- mesh.vertices[vCounter + 1] = GetHeightValue(heightmapPixels[x + z*mapX])*scaleFactor;
- mesh.vertices[vCounter + 2] = z;
+ mesh.vertices[vCounter] = (float)x*scaleFactor.x;
+ mesh.vertices[vCounter + 1] = (float)GRAY_VALUE(pixels[x + z*mapX])*scaleFactor.y;
+ mesh.vertices[vCounter + 2] = (float)z*scaleFactor.z;
- mesh.vertices[vCounter + 3] = x;
- mesh.vertices[vCounter + 4] = GetHeightValue(heightmapPixels[x + (z+1)*mapX])*scaleFactor;
- mesh.vertices[vCounter + 5] = z+1;
+ mesh.vertices[vCounter + 3] = (float)x*scaleFactor.x;
+ mesh.vertices[vCounter + 4] = (float)GRAY_VALUE(pixels[x + (z + 1)*mapX])*scaleFactor.y;
+ mesh.vertices[vCounter + 5] = (float)(z + 1)*scaleFactor.z;
- mesh.vertices[vCounter + 6] = x+1;
- mesh.vertices[vCounter + 7] = GetHeightValue(heightmapPixels[(x+1) + z*mapX])*scaleFactor;
- mesh.vertices[vCounter + 8] = z;
+ mesh.vertices[vCounter + 6] = (float)(x + 1)*scaleFactor.x;
+ mesh.vertices[vCounter + 7] = (float)GRAY_VALUE(pixels[(x + 1) + z*mapX])*scaleFactor.y;
+ mesh.vertices[vCounter + 8] = (float)z*scaleFactor.z;
// another triangle - 3 vertex
mesh.vertices[vCounter + 9] = mesh.vertices[vCounter + 6];
@@ -665,21 +666,21 @@ Model LoadHeightmap(Image heightmap, float maxHeight)
mesh.vertices[vCounter + 13] = mesh.vertices[vCounter + 4];
mesh.vertices[vCounter + 14] = mesh.vertices[vCounter + 5];
- mesh.vertices[vCounter + 15] = x+1;
- mesh.vertices[vCounter + 16] = GetHeightValue(heightmapPixels[(x+1) + (z+1)*mapX])*scaleFactor;
- mesh.vertices[vCounter + 17] = z+1;
+ mesh.vertices[vCounter + 15] = (float)(x + 1)*scaleFactor.x;
+ mesh.vertices[vCounter + 16] = (float)GRAY_VALUE(pixels[(x + 1) + (z + 1)*mapX])*scaleFactor.y;
+ mesh.vertices[vCounter + 17] = (float)(z + 1)*scaleFactor.z;
vCounter += 18; // 6 vertex, 18 floats
// Fill texcoords array with data
//--------------------------------------------------------------
- mesh.texcoords[tcCounter] = (float)x / (mapX-1);
- mesh.texcoords[tcCounter + 1] = (float)z / (mapZ-1);
+ mesh.texcoords[tcCounter] = (float)x/(mapX - 1);
+ mesh.texcoords[tcCounter + 1] = (float)z/(mapZ - 1);
- mesh.texcoords[tcCounter + 2] = (float)x / (mapX-1);
- mesh.texcoords[tcCounter + 3] = (float)(z+1) / (mapZ-1);
+ mesh.texcoords[tcCounter + 2] = (float)x/(mapX - 1);
+ mesh.texcoords[tcCounter + 3] = (float)(z + 1)/(mapZ - 1);
- mesh.texcoords[tcCounter + 4] = (float)(x+1) / (mapX-1);
- mesh.texcoords[tcCounter + 5] = (float)z / (mapZ-1);
+ mesh.texcoords[tcCounter + 4] = (float)(x + 1)/(mapX - 1);
+ mesh.texcoords[tcCounter + 5] = (float)z/(mapZ - 1);
mesh.texcoords[tcCounter + 6] = mesh.texcoords[tcCounter + 4];
mesh.texcoords[tcCounter + 7] = mesh.texcoords[tcCounter + 5];
@@ -687,13 +688,12 @@ Model LoadHeightmap(Image heightmap, float maxHeight)
mesh.texcoords[tcCounter + 8] = mesh.texcoords[tcCounter + 2];
mesh.texcoords[tcCounter + 9] = mesh.texcoords[tcCounter + 3];
- mesh.texcoords[tcCounter + 10] = (float)(x+1) / (mapX-1);
- mesh.texcoords[tcCounter + 11] = (float)(z+1) / (mapZ-1);
+ mesh.texcoords[tcCounter + 10] = (float)(x + 1)/(mapX - 1);
+ mesh.texcoords[tcCounter + 11] = (float)(z + 1)/(mapZ - 1);
tcCounter += 12; // 6 texcoords, 12 floats
// Fill normals array with data
//--------------------------------------------------------------
- // NOTE: Current Model implementation doe not use normals!
for (int i = 0; i < 18; i += 3)
{
mesh.normals[nCounter + i] = 0.0f;
@@ -704,12 +704,11 @@ Model LoadHeightmap(Image heightmap, float maxHeight)
// TODO: Calculate normals in an efficient way
nCounter += 18; // 6 vertex, 18 floats
-
trisCounter += 2;
}
}
- free(heightmapPixels);
+ free(pixels);
// Fill color data
// NOTE: Not used any more... just one plain color defined at DrawModel()
@@ -1149,14 +1148,14 @@ void DrawModel(Model model, Vector3 position, float scale, Color tint)
Vector3 vScale = { scale, scale, scale };
Vector3 rotationAxis = { 0.0f, 0.0f, 0.0f };
- DrawModelEx(model, position, 0.0f, rotationAxis, vScale, tint);
+ DrawModelEx(model, position, rotationAxis, 0.0f, vScale, tint);
}
// Draw a model with extended parameters
-void DrawModelEx(Model model, Vector3 position, float rotationAngle, Vector3 rotationAxis, Vector3 scale, Color tint)
+void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint)
{
// NOTE: Rotation must be provided in degrees, it's converted to radians inside rlglDrawModel()
- rlglDrawModel(model, position, rotationAngle, rotationAxis, scale, tint, false);
+ rlglDrawModel(model, position, rotationAxis, rotationAngle, scale, tint, false);
}
// Draw a model wires (with texture if set)
@@ -1165,14 +1164,14 @@ void DrawModelWires(Model model, Vector3 position, float scale, Color color)
Vector3 vScale = { scale, scale, scale };
Vector3 rotationAxis = { 0.0f, 0.0f, 0.0f };
- rlglDrawModel(model, position, 0.0f, rotationAxis, vScale, color, true);
+ rlglDrawModel(model, position, rotationAxis, 0.0f, vScale, color, true);
}
// Draw a model wires (with texture if set) with extended parameters
-void DrawModelWiresEx(Model model, Vector3 position, float rotationAngle, Vector3 rotationAxis, Vector3 scale, Color tint)
+void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint)
{
// NOTE: Rotation must be provided in degrees, it's converted to radians inside rlglDrawModel()
- rlglDrawModel(model, position, rotationAngle, rotationAxis, scale, tint, true);
+ rlglDrawModel(model, position, rotationAxis, rotationAngle, scale, tint, true);
}
// Draw a billboard
@@ -1275,6 +1274,20 @@ void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle sourceRec, Vec
rlDisableTexture();
}
+// Draw a bounding box with wires
+void DrawBoundingBox(BoundingBox box)
+{
+ Vector3 size;
+
+ size.x = fabsf(box.max.x - box.min.x);
+ size.y = fabsf(box.max.y - box.min.y);
+ size.z = fabsf(box.max.z - box.min.z);
+
+ Vector3 center = { box.min.x + size.x/2.0f, box.min.y + size.y/2.0f, box.min.z + size.z/2.0f };
+
+ DrawCubeWires(center, size.x, size.y, size.z, GREEN);
+}
+
// Detect collision between two spheres
bool CheckCollisionSpheres(Vector3 centerA, float radiusA, Vector3 centerB, float radiusB)
{
@@ -1401,10 +1414,8 @@ bool CheckCollisionRayBox(Ray ray, Vector3 minBBox, Vector3 maxBBox)
return collision;
}
-// TODO: Useful function to check collision area?
-//BoundingBox GetCollisionArea(BoundingBox box1, BoundingBox box2)
-
// Calculate mesh bounding box limits
+// NOTE: minVertex and maxVertex should be transformed by model transform matrix (position, scale, rotate)
BoundingBox CalculateBoundingBox(Mesh mesh)
{
// Get min and max vertex to construct bounds (AABB)
@@ -1413,15 +1424,10 @@ BoundingBox CalculateBoundingBox(Mesh mesh)
for (int i = 1; i < mesh.vertexCount; i++)
{
- // TODO: Compare min and max with previous vertex
- //minVertex = Vector3.Min(minVertex, mesh.vertices[i]);
- //maxVertex = Vector3.Max(maxVertex, mesh.vertices[i]);
+ minVertex = VectorMin(minVertex, (Vector3){ mesh.vertices[i*3], mesh.vertices[i*3 + 1], mesh.vertices[i*3 + 2] });
+ maxVertex = VectorMax(maxVertex, (Vector3){ mesh.vertices[i*3], mesh.vertices[i*3 + 1], mesh.vertices[i*3 + 2] });
}
-
- // NOTE: For OBB, transform mesh by model transform matrix
- //minVertex = VectorTransform(meshMin, mesh.transform);
- //maxVertex = VectorTransform(meshMax, mesh.transform);
-
+
// Create the bounding box
BoundingBox box;
box.min = minVertex;
@@ -1681,12 +1687,6 @@ Vector3 ResolveCollisionCubicmap(Image cubicmap, Vector3 mapPosition, Vector3 *p
// Module specific Functions Definition
//----------------------------------------------------------------------------------
-// Get current vertex y altitude (proportional to pixel colors in grayscale)
-static float GetHeightValue(Color pixel)
-{
- return (((float)pixel.r + (float)pixel.g + (float)pixel.b)/3);
-}
-
// Load OBJ mesh data
static Mesh LoadOBJ(const char *fileName)
{