|
@@ -3458,7 +3458,7 @@ static Model LoadIQM(const char *fileName)
|
|
|
IQM_TANGENT = 3, // NOTE: Tangents unused by default
|
|
|
IQM_BLENDINDEXES = 4,
|
|
|
IQM_BLENDWEIGHTS = 5,
|
|
|
- IQM_COLOR = 6, // NOTE: Vertex colors unused by default
|
|
|
+ IQM_COLOR = 6,
|
|
|
IQM_CUSTOM = 0x10 // NOTE: Custom vertex values unused by default
|
|
|
};
|
|
|
|
|
@@ -3474,6 +3474,7 @@ static Model LoadIQM(const char *fileName)
|
|
|
float *text = NULL;
|
|
|
char *blendi = NULL;
|
|
|
unsigned char *blendw = NULL;
|
|
|
+ unsigned char *color = NULL;
|
|
|
|
|
|
// In case file can not be read, return an empty model
|
|
|
if (fileDataPtr == NULL) return model;
|
|
@@ -3662,6 +3663,25 @@ static Model LoadIQM(const char *fileName)
|
|
|
}
|
|
|
}
|
|
|
} break;
|
|
|
+ case IQM_COLOR:
|
|
|
+ {
|
|
|
+ color = RL_MALLOC(iqmHeader->num_vertexes*4*sizeof(unsigned char));
|
|
|
+ //fseek(iqmFile, va[i].offset, SEEK_SET);
|
|
|
+ //fread(blendw, iqmHeader->num_vertexes*4*sizeof(unsigned char), 1, iqmFile);
|
|
|
+ memcpy(color, fileDataPtr + va[i].offset, iqmHeader->num_vertexes*4*sizeof(unsigned char));
|
|
|
+
|
|
|
+ for (unsigned int m = 0; m < iqmHeader->num_meshes; m++)
|
|
|
+ {
|
|
|
+ model.meshes[m].colors = RL_CALLOC(model.meshes[m].vertexCount*4, sizeof(unsigned char));
|
|
|
+
|
|
|
+ int vCounter = 0;
|
|
|
+ for (unsigned int i = imesh[m].first_vertex*4; i < (imesh[m].first_vertex + imesh[m].num_vertexes)*4; i++)
|
|
|
+ {
|
|
|
+ model.meshes[m].colors[vCounter] = color[i];
|
|
|
+ vCounter++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -4301,6 +4321,40 @@ static Model LoadGLTF(const char *fileName)
|
|
|
TRACELOG(LOG_WARNING, "MODEL: [%s] glTF normals must be float or int", fileName);
|
|
|
}
|
|
|
}
|
|
|
+ else if (data->meshes[i].primitives[p].attributes[j].type == cgltf_attribute_type_color)
|
|
|
+ {
|
|
|
+ cgltf_accessor *acc = data->meshes[i].primitives[p].attributes[j].data;
|
|
|
+ model.meshes[primitiveIndex].colors = RL_MALLOC(acc->count*4*sizeof(unsigned char));
|
|
|
+
|
|
|
+ if (acc->component_type == cgltf_component_type_r_8u)
|
|
|
+ {
|
|
|
+ for (int a = 0; a < acc->count; a++)
|
|
|
+ {
|
|
|
+ GLTFReadValue(acc, a, model.meshes[primitiveIndex].colors + (a*4), 4, sizeof(unsigned char));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (acc->component_type == cgltf_component_type_r_16u)
|
|
|
+ {
|
|
|
+ TRACELOG(LOG_WARNING, "MODEL: [%s] converting glTF colors to unsigned char", fileName);
|
|
|
+ for (int a = 0; a < acc->count; a++)
|
|
|
+ {
|
|
|
+ unsigned short readValue[4];
|
|
|
+ for (int a = 0; a < acc->count; a++)
|
|
|
+ {
|
|
|
+ GLTFReadValue(acc, a, readValue, 4, sizeof(unsigned short));
|
|
|
+ // 257 = 65535/255
|
|
|
+ model.meshes[primitiveIndex].colors[(a*4) + 0] = (unsigned char)(readValue[0] / 257);
|
|
|
+ model.meshes[primitiveIndex].colors[(a*4) + 1] = (unsigned char)(readValue[1] / 257);
|
|
|
+ model.meshes[primitiveIndex].colors[(a*4) + 2] = (unsigned char)(readValue[2] / 257);
|
|
|
+ model.meshes[primitiveIndex].colors[(a*4) + 3] = (unsigned char)(readValue[3] / 257);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TRACELOG(LOG_WARNING, "MODEL: [%s] glTF colors must be uchar or ushort", fileName);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
cgltf_accessor *acc = data->meshes[i].primitives[p].indices;
|