[models] Move vboId ALLOC/FREE to rlgl module #1603
Actually, it seems more logical that rlgl takes care of OpenGL data than the models module... Also, models module loaded vertex data is unloaded by models module.
This commit is contained in:
parent
34f5532fad
commit
ef8318f5e3
3 changed files with 48 additions and 79 deletions
88
src/models.c
88
src/models.c
|
@ -92,9 +92,7 @@
|
|||
//----------------------------------------------------------------------------------
|
||||
// Defines and Macros
|
||||
//----------------------------------------------------------------------------------
|
||||
#ifndef DEFAULT_MESH_VERTEX_BUFFERS
|
||||
#define DEFAULT_MESH_VERTEX_BUFFERS 7 // Number of vertex buffers (VBO) per mesh
|
||||
#endif
|
||||
// ...
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Types and Structures Definition
|
||||
|
@ -860,8 +858,21 @@ void UploadMesh(Mesh *mesh)
|
|||
// Unload mesh from memory (RAM and/or VRAM)
|
||||
void UnloadMesh(Mesh mesh)
|
||||
{
|
||||
// Unload rlgl mesh vboId data
|
||||
rlUnloadMesh(mesh);
|
||||
RL_FREE(mesh.vboId);
|
||||
|
||||
RL_FREE(mesh.vertices);
|
||||
RL_FREE(mesh.texcoords);
|
||||
RL_FREE(mesh.normals);
|
||||
RL_FREE(mesh.colors);
|
||||
RL_FREE(mesh.tangents);
|
||||
RL_FREE(mesh.texcoords2);
|
||||
RL_FREE(mesh.indices);
|
||||
|
||||
RL_FREE(mesh.animVertices);
|
||||
RL_FREE(mesh.animNormals);
|
||||
RL_FREE(mesh.boneWeights);
|
||||
RL_FREE(mesh.boneIds);
|
||||
}
|
||||
|
||||
// Export mesh data to file
|
||||
|
@ -1128,8 +1139,6 @@ Mesh GenMeshPoly(int sides, float radius)
|
|||
|
||||
if (sides < 3) return mesh;
|
||||
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
int vertexCount = sides*3;
|
||||
|
||||
// Vertices definition
|
||||
|
@ -1186,6 +1195,7 @@ Mesh GenMeshPoly(int sides, float radius)
|
|||
RL_FREE(texcoords);
|
||||
|
||||
// Upload vertex data to GPU (static mesh)
|
||||
// NOTE: mesh.vboId array is allocated inside rlLoadMesh()
|
||||
rlLoadMesh(&mesh, false);
|
||||
|
||||
return mesh;
|
||||
|
@ -1195,7 +1205,6 @@ Mesh GenMeshPoly(int sides, float radius)
|
|||
Mesh GenMeshPlane(float width, float length, int resX, int resZ)
|
||||
{
|
||||
Mesh mesh = { 0 };
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
#define CUSTOM_MESH_GEN_PLANE
|
||||
#if defined(CUSTOM_MESH_GEN_PLANE)
|
||||
|
@ -1329,7 +1338,6 @@ Mesh GenMeshPlane(float width, float length, int resX, int resZ)
|
|||
Mesh GenMeshCube(float width, float height, float length)
|
||||
{
|
||||
Mesh mesh = { 0 };
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
#define CUSTOM_MESH_GEN_CUBE
|
||||
#if defined(CUSTOM_MESH_GEN_CUBE)
|
||||
|
@ -1498,8 +1506,6 @@ RLAPI Mesh GenMeshSphere(float radius, int rings, int slices)
|
|||
|
||||
if ((rings >= 3) && (slices >= 3))
|
||||
{
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
par_shapes_mesh *sphere = par_shapes_create_parametric_sphere(slices, rings);
|
||||
par_shapes_scale(sphere, radius, radius, radius);
|
||||
// NOTE: Soft normals are computed internally
|
||||
|
@ -1544,8 +1550,6 @@ RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices)
|
|||
{
|
||||
if (radius < 0.0f) radius = 0.0f;
|
||||
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
par_shapes_mesh *sphere = par_shapes_create_hemisphere(slices, rings);
|
||||
par_shapes_scale(sphere, radius, radius, radius);
|
||||
// NOTE: Soft normals are computed internally
|
||||
|
@ -1588,8 +1592,6 @@ Mesh GenMeshCylinder(float radius, float height, int slices)
|
|||
|
||||
if (slices >= 3)
|
||||
{
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
// Instance a cylinder that sits on the Z=0 plane using the given tessellation
|
||||
// levels across the UV domain. Think of "slices" like a number of pizza
|
||||
// slices, and "stacks" like a number of stacked rings.
|
||||
|
@ -1653,8 +1655,6 @@ Mesh GenMeshTorus(float radius, float size, int radSeg, int sides)
|
|||
|
||||
if ((sides >= 3) && (radSeg >= 3))
|
||||
{
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
if (radius > 1.0f) radius = 1.0f;
|
||||
else if (radius < 0.1f) radius = 0.1f;
|
||||
|
||||
|
@ -1701,8 +1701,6 @@ Mesh GenMeshKnot(float radius, float size, int radSeg, int sides)
|
|||
|
||||
if ((sides >= 3) && (radSeg >= 3))
|
||||
{
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
if (radius > 3.0f) radius = 3.0f;
|
||||
else if (radius < 0.5f) radius = 0.5f;
|
||||
|
||||
|
@ -1747,7 +1745,6 @@ Mesh GenMeshHeightmap(Image heightmap, Vector3 size)
|
|||
#define GRAY_VALUE(c) ((c.r+c.g+c.b)/3)
|
||||
|
||||
Mesh mesh = { 0 };
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
int mapX = heightmap.width;
|
||||
int mapZ = heightmap.height;
|
||||
|
@ -1883,7 +1880,6 @@ Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize)
|
|||
#define COLOR_EQUAL(col1, col2) ((col1.r == col2.r)&&(col1.g == col2.g)&&(col1.b == col2.b)&&(col1.a == col2.a))
|
||||
|
||||
Mesh mesh = { 0 };
|
||||
mesh.vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
Color *pixels = LoadImageColors(cubicmap);
|
||||
|
||||
|
@ -2842,7 +2838,6 @@ static Model LoadOBJ(const char *fileName)
|
|||
model.meshes[mi].vertices = (float *)RL_CALLOC(model.meshes[mi].vertexCount*3, sizeof(float));
|
||||
model.meshes[mi].texcoords = (float *)RL_CALLOC(model.meshes[mi].vertexCount*2, sizeof(float));
|
||||
model.meshes[mi].normals = (float *)RL_CALLOC(model.meshes[mi].vertexCount*3, sizeof(float));
|
||||
model.meshes[mi].vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
model.meshMaterial[mi] = mi;
|
||||
}
|
||||
|
||||
|
@ -3108,8 +3103,6 @@ static Model LoadIQM(const char *fileName)
|
|||
// NOTE: Animated vertex should be re-uploaded to GPU (if not using GPU skinning)
|
||||
model.meshes[i].animVertices = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
|
||||
model.meshes[i].animNormals = RL_CALLOC(model.meshes[i].vertexCount*3, sizeof(float));
|
||||
|
||||
model.meshes[i].vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
}
|
||||
|
||||
// Triangles data processing
|
||||
|
@ -3726,10 +3719,7 @@ static Model LoadGLTF(const char *fileName)
|
|||
model.boneCount = (int)data->nodes_count;
|
||||
model.bones = RL_CALLOC(model.boneCount, sizeof(BoneInfo));
|
||||
model.bindPose = RL_CALLOC(model.boneCount, sizeof(Transform));
|
||||
|
||||
for (int i = 0; i < model.meshCount; i++)
|
||||
model.meshes[i].vboId = (unsigned int *)RL_CALLOC(DEFAULT_MESH_VERTEX_BUFFERS, sizeof(unsigned int));
|
||||
|
||||
|
||||
for (unsigned int j = 0; j < data->nodes_count; j++)
|
||||
{
|
||||
strcpy(model.bones[j].name, data->nodes[j].name == 0 ? "ANIMJOINT" : data->nodes[j].name);
|
||||
|
@ -3738,43 +3728,25 @@ static Model LoadGLTF(const char *fileName)
|
|||
|
||||
for (unsigned int i = 0; i < data->nodes_count; i++)
|
||||
{
|
||||
if (data->nodes[i].has_translation)
|
||||
{
|
||||
memcpy(&model.bindPose[i].translation, data->nodes[i].translation, 3 * sizeof(float));
|
||||
}
|
||||
else
|
||||
{
|
||||
model.bindPose[i].translation = Vector3Zero();
|
||||
}
|
||||
|
||||
if (data->nodes[i].has_rotation)
|
||||
{
|
||||
memcpy(&model.bindPose[i].rotation, data->nodes[i].rotation, 4 * sizeof(float));
|
||||
}
|
||||
else
|
||||
{
|
||||
model.bindPose[i].rotation = QuaternionIdentity();
|
||||
}
|
||||
if (data->nodes[i].has_translation) memcpy(&model.bindPose[i].translation, data->nodes[i].translation, 3 * sizeof(float));
|
||||
else model.bindPose[i].translation = Vector3Zero();
|
||||
|
||||
if (data->nodes[i].has_rotation) memcpy(&model.bindPose[i].rotation, data->nodes[i].rotation, 4 * sizeof(float));
|
||||
else model.bindPose[i].rotation = QuaternionIdentity();
|
||||
|
||||
model.bindPose[i].rotation = QuaternionNormalize(model.bindPose[i].rotation);
|
||||
|
||||
if (data->nodes[i].has_scale)
|
||||
{
|
||||
memcpy(&model.bindPose[i].scale, data->nodes[i].scale, 3 * sizeof(float));
|
||||
}
|
||||
else
|
||||
{
|
||||
model.bindPose[i].scale = Vector3One();
|
||||
}
|
||||
if (data->nodes[i].has_scale) memcpy(&model.bindPose[i].scale, data->nodes[i].scale, 3 * sizeof(float));
|
||||
else model.bindPose[i].scale = Vector3One();
|
||||
}
|
||||
|
||||
for (int i = 0; i < model.boneCount; i++)
|
||||
{
|
||||
Transform* currentTransform = model.bindPose + i;
|
||||
BoneInfo* currentBone = model.bones + i;
|
||||
Transform *currentTransform = model.bindPose + i;
|
||||
BoneInfo *currentBone = model.bones + i;
|
||||
int root = currentBone->parent;
|
||||
if (root >= model.boneCount)
|
||||
root = 0;
|
||||
Transform* parentTransform = model.bindPose + root;
|
||||
if (root >= model.boneCount) root = 0;
|
||||
Transform *parentTransform = model.bindPose + root;
|
||||
|
||||
if (currentBone->parent >= 0)
|
||||
{
|
||||
|
@ -3791,7 +3763,7 @@ static Model LoadGLTF(const char *fileName)
|
|||
Color tint = (Color){ 255, 255, 255, 255 };
|
||||
const char *texPath = GetDirectoryPath(fileName);
|
||||
|
||||
//Ensure material follows raylib support for PBR (metallic/roughness flow)
|
||||
// Ensure material follows raylib support for PBR (metallic/roughness flow)
|
||||
if (data->materials[i].has_pbr_metallic_roughness)
|
||||
{
|
||||
tint.r = (unsigned char)(data->materials[i].pbr_metallic_roughness.base_color_factor[0] * 255);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue