|
@ -1429,16 +1429,12 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) |
|
|
|
|
|
|
|
|
rlEnableTexture(material.maps[MATERIAL_MAP_DIFFUSE].texture.id); |
|
|
rlEnableTexture(material.maps[MATERIAL_MAP_DIFFUSE].texture.id); |
|
|
|
|
|
|
|
|
if (mesh.animVertices) |
|
|
|
|
|
rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.animVertices); |
|
|
|
|
|
else |
|
|
|
|
|
rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.vertices); |
|
|
|
|
|
|
|
|
if (mesh.animVertices) rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.animVertices); |
|
|
|
|
|
else rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.vertices); |
|
|
|
|
|
|
|
|
rlEnableStatePointer(GL_TEXTURE_COORD_ARRAY, mesh.texcoords); |
|
|
rlEnableStatePointer(GL_TEXTURE_COORD_ARRAY, mesh.texcoords); |
|
|
if (mesh.normals) |
|
|
|
|
|
rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.animNormalss); |
|
|
|
|
|
else |
|
|
|
|
|
rlEnableStatePointer(GL_NORMAL_ARRAY, mesh.normals); |
|
|
|
|
|
|
|
|
if (mesh.normals) rlEnableStatePointer(GL_VERTEX_ARRAY, mesh.animNormalss); |
|
|
|
|
|
else rlEnableStatePointer(GL_NORMAL_ARRAY, mesh.normals); |
|
|
|
|
|
|
|
|
rlEnableStatePointer(GL_COLOR_ARRAY, mesh.colors); |
|
|
rlEnableStatePointer(GL_COLOR_ARRAY, mesh.colors); |
|
|
|
|
|
|
|
@ -5215,7 +5211,7 @@ static Model LoadGLTF(const char *fileName) |
|
|
/********************************************************************************************* |
|
|
/********************************************************************************************* |
|
|
|
|
|
|
|
|
Function implemented by Wilhem Barbier(@wbrbr), with modifications by Tyler Bezera(@gamerfiend) |
|
|
Function implemented by Wilhem Barbier(@wbrbr), with modifications by Tyler Bezera(@gamerfiend) |
|
|
Transform handling implemented by Paul Melis (@paulmelis). |
|
|
|
|
|
|
|
|
Transform handling implemented by Paul Melis (@paulmelis) |
|
|
Reviewed by Ramon Santamaria (@raysan5) |
|
|
Reviewed by Ramon Santamaria (@raysan5) |
|
|
|
|
|
|
|
|
FEATURES: |
|
|
FEATURES: |
|
@ -5225,10 +5221,10 @@ static Model LoadGLTF(const char *fileName) |
|
|
PBR specular/glossiness flow and extended texture flows not supported |
|
|
PBR specular/glossiness flow and extended texture flows not supported |
|
|
- Supports multiple meshes per model (every primitives is loaded as a separate mesh) |
|
|
- Supports multiple meshes per model (every primitives is loaded as a separate mesh) |
|
|
- Supports basic animations |
|
|
- Supports basic animations |
|
|
- Transforms, including parent-child relations, are applied on the mesh data, but the |
|
|
|
|
|
hierarchy is not kept (as it can't be represented). |
|
|
|
|
|
|
|
|
- Transforms, including parent-child relations, are applied on the mesh data, |
|
|
|
|
|
but the hierarchy is not kept (as it can't be represented) |
|
|
- Mesh instances in the glTF file (i.e. same mesh linked from multiple nodes) |
|
|
- Mesh instances in the glTF file (i.e. same mesh linked from multiple nodes) |
|
|
are turned into separate raylib Meshes. |
|
|
|
|
|
|
|
|
are turned into separate raylib Meshes |
|
|
|
|
|
|
|
|
RESTRICTIONS: |
|
|
RESTRICTIONS: |
|
|
- Only triangle meshes supported |
|
|
- Only triangle meshes supported |
|
@ -5444,7 +5440,7 @@ static Model LoadGLTF(const char *fileName) |
|
|
// Any glTF mesh linked from more than one Node (i.e. instancing) |
|
|
// Any glTF mesh linked from more than one Node (i.e. instancing) |
|
|
// is turned into multiple Mesh's, as each Node will have its own |
|
|
// is turned into multiple Mesh's, as each Node will have its own |
|
|
// transform applied. |
|
|
// transform applied. |
|
|
// Note: the code below disregards the scenes defined in the file, all nodes are used. |
|
|
|
|
|
|
|
|
// NOTE: The code below disregards the scenes defined in the file, all nodes are used. |
|
|
//---------------------------------------------------------------------------------------------------- |
|
|
//---------------------------------------------------------------------------------------------------- |
|
|
int meshIndex = 0; |
|
|
int meshIndex = 0; |
|
|
for (unsigned int i = 0; i < data->nodes_count; i++) |
|
|
for (unsigned int i = 0; i < data->nodes_count; i++) |
|
@ -5894,7 +5890,6 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
|
|
|
|
|
if (attribute->type == cgltf_type_vec4) |
|
|
if (attribute->type == cgltf_type_vec4) |
|
|
{ |
|
|
{ |
|
|
// TODO: Support component types: u8, u16? |
|
|
|
|
|
if (attribute->component_type == cgltf_component_type_r_8u) |
|
|
if (attribute->component_type == cgltf_component_type_r_8u) |
|
|
{ |
|
|
{ |
|
|
// Init raylib mesh bone weight to copy glTF attribute data |
|
|
// Init raylib mesh bone weight to copy glTF attribute data |
|
@ -5930,6 +5925,7 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
|
|
|
|
|
// Load 4 components of float data type into mesh.boneWeights |
|
|
// Load 4 components of float data type into mesh.boneWeights |
|
|
// for cgltf_attribute_type_weights we have: |
|
|
// for cgltf_attribute_type_weights we have: |
|
|
|
|
|
|
|
|
// - data.meshes[0] (256 vertices) |
|
|
// - data.meshes[0] (256 vertices) |
|
|
// - 256 values, provided as cgltf_type_vec4 of float (4 byte per joint, stride 16) |
|
|
// - 256 values, provided as cgltf_type_vec4 of float (4 byte per joint, stride 16) |
|
|
LOAD_ATTRIBUTE(attribute, 4, float, model.meshes[meshIndex].boneWeights) |
|
|
LOAD_ATTRIBUTE(attribute, 4, float, model.meshes[meshIndex].boneWeights) |
|
@ -5940,8 +5936,8 @@ static Model LoadGLTF(const char *fileName) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// check if we are animated, and the mesh was not given any bone assignments, but is the child of a bone node |
|
|
|
|
|
// in this case we need to fully attach all the verts to the parent bone so it will animate with the bone. |
|
|
|
|
|
|
|
|
// Check if we are animated, and the mesh was not given any bone assignments, but is the child of a bone node |
|
|
|
|
|
// in this case we need to fully attach all the verts to the parent bone so it will animate with the bone |
|
|
if (data->skins_count > 0 && !hasJoints && node->parent != NULL && node->parent->mesh == NULL) |
|
|
if (data->skins_count > 0 && !hasJoints && node->parent != NULL && node->parent->mesh == NULL) |
|
|
{ |
|
|
{ |
|
|
int parentBoneId = -1; |
|
|
int parentBoneId = -1; |
|
@ -5956,16 +5952,15 @@ static Model LoadGLTF(const char *fileName) |
|
|
|
|
|
|
|
|
if (parentBoneId >= 0) |
|
|
if (parentBoneId >= 0) |
|
|
{ |
|
|
{ |
|
|
model.meshes[meshIndex].boneIds = RL_CALLOC(model.meshes[meshIndex].vertexCount * 4, sizeof(unsigned char)); |
|
|
|
|
|
model.meshes[meshIndex].boneWeights = RL_CALLOC(model.meshes[meshIndex].vertexCount * 4, sizeof(float)); |
|
|
|
|
|
|
|
|
model.meshes[meshIndex].boneIds = RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(unsigned char)); |
|
|
|
|
|
model.meshes[meshIndex].boneWeights = RL_CALLOC(model.meshes[meshIndex].vertexCount*4, sizeof(float)); |
|
|
|
|
|
|
|
|
for (int vertexIndex = 0; vertexIndex < model.meshes[meshIndex].vertexCount * 4; vertexIndex += 4) |
|
|
|
|
|
|
|
|
for (int vertexIndex = 0; vertexIndex < model.meshes[meshIndex].vertexCount*4; vertexIndex += 4) |
|
|
{ |
|
|
{ |
|
|
model.meshes[meshIndex].boneIds[vertexIndex] = (unsigned char)parentBoneId; |
|
|
model.meshes[meshIndex].boneIds[vertexIndex] = (unsigned char)parentBoneId; |
|
|
model.meshes[meshIndex].boneWeights[vertexIndex] = 1.0f; |
|
|
model.meshes[meshIndex].boneWeights[vertexIndex] = 1.0f; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Animated vertex data |
|
|
// Animated vertex data |
|
@ -5986,9 +5981,8 @@ static Model LoadGLTF(const char *fileName) |
|
|
model.meshes[meshIndex].boneMatrices[j] = MatrixIdentity(); |
|
|
model.meshes[meshIndex].boneMatrices[j] = MatrixIdentity(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
meshIndex++; // Move to next mesh |
|
|
|
|
|
|
|
|
meshIndex++; // Move to next mesh |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Free all cgltf loaded data |
|
|
// Free all cgltf loaded data |
|
|