diff --git a/examples/others/iqm_loader/models_iqm_animation.c b/examples/others/iqm_loader/models_iqm_animation.c index 418208a84..d384338c6 100644 --- a/examples/others/iqm_loader/models_iqm_animation.c +++ b/examples/others/iqm_loader/models_iqm_animation.c @@ -12,6 +12,7 @@ #include "raylib.h" #define RIQM_IMPLEMENTATION +#define RAYMATH_IMPLEMENTATION #include "riqm.h" int main() @@ -30,18 +31,18 @@ int main() camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target) camera.fovy = 45.0f; // Camera field-of-view Y camera.type = CAMERA_PERSPECTIVE; // Camera mode type - + // Load the animated model mesh and basic data AnimatedModel model = LoadAnimatedModel("resources/guy.iqm"); - +printf("VER %i\n",rlGetVersion()); // Load model texture and set material // NOTE: There is only 1 mesh and 1 material (both at index 0), thats what the 2 0's are model = AnimatedModelAddTexture(model, "resources/guytex.png"); // REPLACE! model = SetMeshMaterial(model, 0, 0); // REPLACE! - + // Load animation data Animation anim = LoadAnimationFromIQM("resources/guyanim.iqm"); - + int animFrameCounter = 0; SetCameraMode(camera, CAMERA_FREE); // Set free camera mode @@ -55,7 +56,7 @@ int main() // Update //---------------------------------------------------------------------------------- UpdateCamera(&camera); - + // Play animation when spacebar is held down if (IsKeyDown(KEY_SPACE)) { @@ -67,17 +68,17 @@ int main() // Draw //---------------------------------------------------------------------------------- BeginDrawing(); - + ClearBackground(RAYWHITE); BeginMode3D(camera); DrawAnimatedModel(model, Vector3Zero(), 1.0f, WHITE); // Draw animated model - + DrawGrid(10, 1.0f); // Draw a grid EndMode3D(); - + DrawText("(c) Guy IQM 3D model by -------", screenWidth - 200, screenHeight - 20, 10, GRAY); DrawFPS(10, 10); diff --git a/examples/others/iqm_loader/riqm.h b/examples/others/iqm_loader/riqm.h index 6f2748363..307eaac85 100644 --- a/examples/others/iqm_loader/riqm.h +++ b/examples/others/iqm_loader/riqm.h @@ -34,6 +34,11 @@ #ifndef RIQM_H #define RIQM_H +// TODO dont break everything +static bool vaoSupported = false; +static Matrix modelview; +static Matrix projection; + #include <stdio.h> // Required for: FILE //#define RIQM_STATIC @@ -68,26 +73,26 @@ typedef struct Pose { typedef struct Animation { int jointCount; Joint *joints; // NOTE: Joints in anims do not have names - + int frameCount; float framerate; - + Pose **framepose; } Animation; typedef struct AnimatedMesh { char name[MESH_NAME_LENGTH]; - + int vertexCount; int triangleCount; - + float *vertices; float *normals; float *texcoords; float *animVertices; float *animNormals; unsigned short *triangles; - + int *weightId; float *weightBias; @@ -98,14 +103,14 @@ typedef struct AnimatedMesh { typedef struct AnimatedModel { int meshCount; AnimatedMesh *mesh; - + int materialCount; int *meshMaterialId; Material *materials; - + int jointCount; Joint *joints; - + Pose *basepose; Matrix transform; } AnimatedModel; @@ -268,6 +273,18 @@ void rlLoadAnimatedMesh(AnimatedMesh *amesh, bool dynamic) amesh->vboId[5] = 0; // Vertex texcoords2 VBO UNUSED amesh->vboId[6] = 0; // Vertex indices VBO +#if defined(GRAPHICS_API_OPENGL_11) +TraceLog(LOG_WARNING, "OGL 11"); +#endif +#if defined(GRAPHICS_API_OPENGL_21) +TraceLog(LOG_WARNING, "OGL 21"); +#endif +#if defined(GRAPHICS_API_OPENGL_33) +TraceLog(LOG_WARNING, "OGL 33"); +#endif +#if defined(GRAPHICS_API_OPENGL_ES2) +TraceLog(LOG_WARNING, "OGL ES2"); +#endif #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) int drawHint = GL_STATIC_DRAW; if (dynamic) drawHint = GL_DYNAMIC_DRAW; @@ -467,7 +484,7 @@ void rlDrawAnimatedMesh(AnimatedMesh amesh, Material material, Matrix transform) rlPushMatrix(); rlMultMatrixf(MatrixToFloat(transform)); - rlColor4ub(material.maps[MAP_DIFFUSE].color.rotation, material.maps[MAP_DIFFUSE].color.g, material.maps[MAP_DIFFUSE].color.b, material.maps[MAP_DIFFUSE].color.a); + rlColor4ub(material.maps[MAP_DIFFUSE].color.r, material.maps[MAP_DIFFUSE].color.g, material.maps[MAP_DIFFUSE].color.b, material.maps[MAP_DIFFUSE].color.a); if (amesh.triangles != NULL) glDrawElements(GL_TRIANGLES, amesh.triangleCount*3, GL_UNSIGNED_SHORT, amesh.triangles); else glDrawArrays(GL_TRIANGLES, 0, amesh.vertexCount); @@ -485,29 +502,29 @@ void rlDrawAnimatedMesh(AnimatedMesh amesh, Material material, Matrix transform) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) // Bind shader program - glUseProgram(material.scalehader.id); + glUseProgram(material.shader.id); // Matrices and other values required by shader //----------------------------------------------------- // Calculate and send to shader model matrix (used by PBR shader) - if (material.scalehader.locs[LOC_MATRIX_MODEL] != -1) SetShaderValueMatrix(material.scalehader, material.scalehader.locs[LOC_MATRIX_MODEL], transform); + if (material.shader.locs[LOC_MATRIX_MODEL] != -1) SetShaderValueMatrix(material.shader, material.shader.locs[LOC_MATRIX_MODEL], transform); // Upload to shader material.colDiffuse - if (material.scalehader.locs[LOC_COLOR_DIFFUSE] != -1) - glUniform4f(material.scalehader.locs[LOC_COLOR_DIFFUSE], (float)material.maps[MAP_DIFFUSE].color.rotation/255.0f, + if (material.shader.locs[LOC_COLOR_DIFFUSE] != -1) + glUniform4f(material.shader.locs[LOC_COLOR_DIFFUSE], (float)material.maps[MAP_DIFFUSE].color.r/255.0f, (float)material.maps[MAP_DIFFUSE].color.g/255.0f, (float)material.maps[MAP_DIFFUSE].color.b/255.0f, (float)material.maps[MAP_DIFFUSE].color.a/255.0f); // Upload to shader material.colSpecular (if available) - if (material.scalehader.locs[LOC_COLOR_SPECULAR] != -1) - glUniform4f(material.scalehader.locs[LOC_COLOR_SPECULAR], (float)material.maps[MAP_SPECULAR].color.rotation/255.0f, + if (material.shader.locs[LOC_COLOR_SPECULAR] != -1) + glUniform4f(material.shader.locs[LOC_COLOR_SPECULAR], (float)material.maps[MAP_SPECULAR].color.r/255.0f, (float)material.maps[MAP_SPECULAR].color.g/255.0f, (float)material.maps[MAP_SPECULAR].color.b/255.0f, (float)material.maps[MAP_SPECULAR].color.a/255.0f); - if (material.scalehader.locs[LOC_MATRIX_VIEW] != -1) SetShaderValueMatrix(material.scalehader, material.scalehader.locs[LOC_MATRIX_VIEW], modelview); - if (material.scalehader.locs[LOC_MATRIX_PROJECTION] != -1) SetShaderValueMatrix(material.scalehader, material.scalehader.locs[LOC_MATRIX_PROJECTION], projection); + if (material.shader.locs[LOC_MATRIX_VIEW] != -1) SetShaderValueMatrix(material.shader, material.shader.locs[LOC_MATRIX_VIEW], modelview); + if (material.shader.locs[LOC_MATRIX_PROJECTION] != -1) SetShaderValueMatrix(material.shader, material.shader.locs[LOC_MATRIX_PROJECTION], projection); // At this point the modelview matrix just contains the view matrix (camera) // That's because BeginMode3D() sets it an no model-drawing function modifies it, all use rlPushMatrix() and rlPopMatrix() @@ -527,7 +544,7 @@ void rlDrawAnimatedMesh(AnimatedMesh amesh, Material material, Matrix transform) if ((i == MAP_IRRADIANCE) || (i == MAP_PREFILTER) || (i == MAP_CUBEMAP)) glBindTexture(GL_TEXTURE_CUBE_MAP, material.maps[i].texture.id); else glBindTexture(GL_TEXTURE_2D, material.maps[i].texture.id); - glUniform1i(material.scalehader.locs[LOC_MAP_DIFFUSE + i], i); + glUniform1i(material.shader.locs[LOC_MAP_DIFFUSE + i], i); } } @@ -539,54 +556,54 @@ void rlDrawAnimatedMesh(AnimatedMesh amesh, Material material, Matrix transform) // Bind mesh VBO data: vertex position (shader-location = 0) glBindBuffer(GL_ARRAY_BUFFER, amesh.vboId[0]); - glVertexAttribPointer(material.scalehader.locs[LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.scalehader.locs[LOC_VERTEX_POSITION]); + glVertexAttribPointer(material.shader.locs[LOC_VERTEX_POSITION], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.locs[LOC_VERTEX_POSITION]); // Bind mesh VBO data: vertex texcoords (shader-location = 1) glBindBuffer(GL_ARRAY_BUFFER, amesh.vboId[1]); - glVertexAttribPointer(material.scalehader.locs[LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.scalehader.locs[LOC_VERTEX_TEXCOORD01]); + glVertexAttribPointer(material.shader.locs[LOC_VERTEX_TEXCOORD01], 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.locs[LOC_VERTEX_TEXCOORD01]); // Bind mesh VBO data: vertex normals (shader-location = 2, if available) - if (material.scalehader.locs[LOC_VERTEX_NORMAL] != -1) + if (material.shader.locs[LOC_VERTEX_NORMAL] != -1) { glBindBuffer(GL_ARRAY_BUFFER, amesh.vboId[2]); - glVertexAttribPointer(material.scalehader.locs[LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.scalehader.locs[LOC_VERTEX_NORMAL]); + glVertexAttribPointer(material.shader.locs[LOC_VERTEX_NORMAL], 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.locs[LOC_VERTEX_NORMAL]); } // Bind mesh VBO data: vertex colors (shader-location = 3, if available) - if (material.scalehader.locs[LOC_VERTEX_COLOR] != -1) + if (material.shader.locs[LOC_VERTEX_COLOR] != -1) { if (amesh.vboId[3] != 0) { glBindBuffer(GL_ARRAY_BUFFER, amesh.vboId[3]); - glVertexAttribPointer(material.scalehader.locs[LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); - glEnableVertexAttribArray(material.scalehader.locs[LOC_VERTEX_COLOR]); + glVertexAttribPointer(material.shader.locs[LOC_VERTEX_COLOR], 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + glEnableVertexAttribArray(material.shader.locs[LOC_VERTEX_COLOR]); } else { // Set default value for unused attribute // NOTE: Required when using default shader and no VAO support - glVertexAttrib4f(material.scalehader.locs[LOC_VERTEX_COLOR], 1.0f, 1.0f, 1.0f, 1.0f); - glDisableVertexAttribArray(material.scalehader.locs[LOC_VERTEX_COLOR]); + glVertexAttrib4f(material.shader.locs[LOC_VERTEX_COLOR], 1.0f, 1.0f, 1.0f, 1.0f); + glDisableVertexAttribArray(material.shader.locs[LOC_VERTEX_COLOR]); } } // Bind mesh VBO data: vertex tangents (shader-location = 4, if available) - if (material.scalehader.locs[LOC_VERTEX_TANGENT] != -1) + if (material.shader.locs[LOC_VERTEX_TANGENT] != -1) { glBindBuffer(GL_ARRAY_BUFFER, amesh.vboId[4]); - glVertexAttribPointer(material.scalehader.locs[LOC_VERTEX_TANGENT], 4, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.scalehader.locs[LOC_VERTEX_TANGENT]); + glVertexAttribPointer(material.shader.locs[LOC_VERTEX_TANGENT], 4, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.locs[LOC_VERTEX_TANGENT]); } // Bind mesh VBO data: vertex texcoords2 (shader-location = 5, if available) - if (material.scalehader.locs[LOC_VERTEX_TEXCOORD02] != -1) + if (material.shader.locs[LOC_VERTEX_TEXCOORD02] != -1) { glBindBuffer(GL_ARRAY_BUFFER, amesh.vboId[5]); - glVertexAttribPointer(material.scalehader.locs[LOC_VERTEX_TEXCOORD02], 2, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.scalehader.locs[LOC_VERTEX_TEXCOORD02]); + glVertexAttribPointer(material.shader.locs[LOC_VERTEX_TEXCOORD02], 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.locs[LOC_VERTEX_TEXCOORD02]); } if (amesh.triangles != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, amesh.vboId[6]); @@ -608,7 +625,7 @@ void rlDrawAnimatedMesh(AnimatedMesh amesh, Material material, Matrix transform) Matrix matMVP = MatrixMultiply(modelview, projection); // Transform to screen-space coordinates // Send combined model-view-projection matrix to shader - glUniformMatrix4fv(material.scalehader.locs[LOC_MATRIX_MVP], 1, false, MatrixToFloat(matMVP)); + glUniformMatrix4fv(material.shader.locs[LOC_MATRIX_MVP], 1, false, MatrixToFloat(matMVP)); // Draw call! if (amesh.triangles != NULL) glDrawElements(GL_TRIANGLES, amesh.triangleCount*3, GL_UNSIGNED_SHORT, 0); // Indexed vertices draw @@ -649,14 +666,14 @@ extern "C" { // Prevents name mangling of functions AnimatedModel LoadAnimatedModel(const char *filename) { AnimatedModel out = LoadIQM(filename); - + for (int i = 0; i < out.meshCount; i++) rlLoadAnimatedMesh(&out.mesh[i], false); out.transform = MatrixIdentity(); out.meshMaterialId = malloc(sizeof(int)*out.meshCount); out.materials = NULL; out.materialCount = 0; - + for (int i = 0; i < out.meshCount; i++) out.meshMaterialId[i] = -1; return out; @@ -666,32 +683,32 @@ AnimatedModel LoadAnimatedModel(const char *filename) AnimatedModel AnimatedModelAddTexture(AnimatedModel model, const char *filename) { Texture2D texture = LoadTexture(filename); - + model.materials = realloc(model.materials, sizeof(Material)*(model.materialCount + 1)); model.materials[model.materialCount] = LoadMaterialDefault(); model.materials[model.materialCount].maps[MAP_DIFFUSE].texture = texture; model.materialCount++; - + return model; } // Set the material for a mesh AnimatedModel SetMeshMaterial(AnimatedModel model, int meshid, int textureid) { - if (meshid > model.meshCount) + if (meshid > model.meshCount) { TraceLog(LOG_WARNING, "MeshId greater than meshCount\n"); return model; } - if (textureid > model.materialCount) + if (textureid > model.materialCount) { TraceLog(LOG_WARNING,"textureid greater than materialCount\n"); return model; } model.meshMaterialId[meshid] = textureid; - + return model; } @@ -699,18 +716,18 @@ AnimatedModel SetMeshMaterial(AnimatedModel model, int meshid, int textureid) Animation LoadAnimationFromIQM(const char *filename) { Animation animation = { 0 }; - + FILE *iqmFile; IQMHeader iqm; iqmFile = fopen(filename,"rb"); - + if (!iqmFile) { TraceLog(LOG_ERROR, "[%s] Unable to open file", filename); return animation; } - + // header fread(&iqm, sizeof(IQMHeader), 1, iqmFile); @@ -720,17 +737,17 @@ Animation LoadAnimationFromIQM(const char *filename) fclose(iqmFile); return animation; } - + if (iqm.version != IQM_VERSION) { TraceLog(LOG_ERROR, "IQM version %i is incorrect.", iqm.version); fclose(iqmFile); return animation; } - + // header if (iqm.num_anims > 1) TraceLog(LOG_WARNING, "More than 1 animation in file, only the first one will get loaded"); - + // joints IQMPose *poses; poses = malloc(sizeof(IQMPose)*iqm.num_poses); @@ -739,7 +756,7 @@ Animation LoadAnimationFromIQM(const char *filename) animation.jointCount = iqm.num_poses; animation.joints = malloc(sizeof(Joint)*iqm.num_poses); - + for (int j = 0; j < iqm.num_poses; j++) { strcpy(animation.joints[j].name, ANIMJOINTNAME); @@ -763,91 +780,91 @@ Animation LoadAnimationFromIQM(const char *filename) for (int j = 0; j < anim.num_frames; j++) animation.framepose[j] = malloc(sizeof(Pose)*iqm.num_poses); int dcounter = anim.first_frame*iqm.num_framechannels; - + for (int frame = 0; frame < anim.num_frames; frame++) { for (int i = 0; i < iqm.num_poses; i++) { animation.framepose[frame][i].translation.x = poses[i].channeloffset[0]; - + if (poses[i].mask & 0x01) { animation.framepose[frame][i].translation.x += framedata[dcounter]*poses[i].channelscale[0]; dcounter++; } - + animation.framepose[frame][i].translation.y = poses[i].channeloffset[1]; - + if (poses[i].mask & 0x02) { animation.framepose[frame][i].translation.y += framedata[dcounter]*poses[i].channelscale[1]; dcounter++; } - + animation.framepose[frame][i].translation.z = poses[i].channeloffset[2]; - + if (poses[i].mask & 0x04) { animation.framepose[frame][i].translation.z += framedata[dcounter]*poses[i].channelscale[2]; dcounter++; } - + animation.framepose[frame][i].rotation.x = poses[i].channeloffset[3]; - + if (poses[i].mask & 0x08) { animation.framepose[frame][i].rotation.x += framedata[dcounter]*poses[i].channelscale[3]; dcounter++; } - + animation.framepose[frame][i].rotation.y = poses[i].channeloffset[4]; - + if (poses[i].mask & 0x10) { animation.framepose[frame][i].rotation.y += framedata[dcounter]*poses[i].channelscale[4]; dcounter++; } - + animation.framepose[frame][i].rotation.z = poses[i].channeloffset[5]; - + if (poses[i].mask & 0x20) { animation.framepose[frame][i].rotation.z += framedata[dcounter]*poses[i].channelscale[5]; dcounter++; } - + animation.framepose[frame][i].rotation.w = poses[i].channeloffset[6]; - + if (poses[i].mask & 0x40) { animation.framepose[frame][i].rotation.w += framedata[dcounter]*poses[i].channelscale[6]; dcounter++; } - + animation.framepose[frame][i].scale.x = poses[i].channeloffset[7]; - + if (poses[i].mask & 0x80) { animation.framepose[frame][i].scale.x += framedata[dcounter]*poses[i].channelscale[7]; dcounter++; } - + animation.framepose[frame][i].scale.y = poses[i].channeloffset[8]; - + if (poses[i].mask & 0x100) { animation.framepose[frame][i].scale.y += framedata[dcounter]*poses[i].channelscale[8]; dcounter++; } - + animation.framepose[frame][i].scale.z = poses[i].channeloffset[9]; - + if (poses[i].mask & 0x200) { animation.framepose[frame][i].scale.z += framedata[dcounter]*poses[i].channelscale[9]; dcounter++; } - + animation.framepose[frame][i].rotation = QuaternionNormalize(animation.framepose[frame][i].rotation); } } @@ -869,7 +886,7 @@ Animation LoadAnimationFromIQM(const char *filename) free(framedata); free(poses); - + fclose(iqmFile); return animation; @@ -882,7 +899,7 @@ void UnloadAnimatedModel(AnimatedModel model) free(model.meshMaterialId); free(model.joints); free(model.basepose); - + for (int i = 0; i < model.meshCount; i++) rlUnloadAnimatedMesh(&model.mesh[i]); free(model.mesh); @@ -893,7 +910,7 @@ void UnloadAnimation(Animation anim) { free(anim.joints); free(anim.framepose); - + for (int i = 0; i < anim.frameCount; i++) free(anim.framepose[i]); } @@ -901,12 +918,12 @@ void UnloadAnimation(Animation anim) bool CheckSkeletonsMatch(AnimatedModel model, Animation anim) { if (model.jointCount != anim.jointCount) return 0; - + for (int i = 0; i < model.jointCount; i++) { if (model.joints[i].parent != anim.joints[i].parent) return 0; } - + return 1; } @@ -931,7 +948,7 @@ void AnimateModel(AnimatedModel model, Animation anim, int frame) int vcounter = 0; int wcounter = 0; int weightId = 0; - + for (int i = 0; i < model.mesh[m].vertexCount; i++) { weightId = model.mesh[m].weightId[wcounter]; @@ -941,7 +958,7 @@ void AnimateModel(AnimatedModel model, Animation anim, int frame) outt = anim.framepose[frame][weightId].translation; outr = anim.framepose[frame][weightId].rotation; outs = anim.framepose[frame][weightId].scale; - + // vertices outv = (Vector3){model.mesh[m].vertices[vcounter],model.mesh[m].vertices[vcounter + 1],model.mesh[m].vertices[vcounter + 2]}; outv = Vector3MultiplyV(outv,outs); @@ -951,7 +968,7 @@ void AnimateModel(AnimatedModel model, Animation anim, int frame) model.mesh[m].animVertices[vcounter] = outv.x; model.mesh[m].animVertices[vcounter + 1] = outv.y; model.mesh[m].animVertices[vcounter + 2] = outv.z; - + // normals outn = (Vector3){model.mesh[m].normals[vcounter],model.mesh[m].normals[vcounter + 1],model.mesh[m].normals[vcounter + 2]}; outn = Vector3RotateByQuaternion(outn,QuaternionMultiply(outr,QuaternionInvert(baser))); @@ -969,7 +986,7 @@ void DrawAnimatedModel(AnimatedModel model,Vector3 position,float scale,Color ti { Vector3 vScale = { scale, scale, scale }; Vector3 rotationAxis = { 0.0f,0.0f,0.0f }; - + DrawAnimatedModelEx(model, position, rotationAxis, 0.0f, vScale, tint); } @@ -981,14 +998,14 @@ void DrawAnimatedModelEx(AnimatedModel model,Vector3 position,Vector3 rotationAx TraceLog(LOG_WARNING,"No materials set, can't draw animated mesh\n"); return; } - + Matrix matScale = MatrixScale(scale.x,scale.y,scale.z); Matrix matRotation = MatrixRotate(rotationAxis,rotationAngle*DEG2RAD); Matrix matTranslation = MatrixTranslate(position.x,position.y,position.z); Matrix matTransform = MatrixMultiply(MatrixMultiply(matScale,matRotation),matTranslation); model.transform = MatrixMultiply(model.transform,matTransform); - + for (int i = 0; i < model.meshCount; i++) { rlUpdateAnimatedMesh(&model.mesh[i]); @@ -1005,7 +1022,7 @@ void DrawAnimatedModelEx(AnimatedModel model,Vector3 position,Vector3 rotationAx static AnimatedModel LoadIQM(const char *filename) { AnimatedModel model = { 0 }; - + FILE *iqmFile; IQMHeader iqm; @@ -1013,7 +1030,7 @@ static AnimatedModel LoadIQM(const char *filename) IQMTriangle *tri; IQMVertexArray *va; IQMJoint *ijoint; - + float *vertex; float *normal; float *text; @@ -1021,13 +1038,13 @@ static AnimatedModel LoadIQM(const char *filename) unsigned char *blendw; iqmFile = fopen(filename, "rb"); - + if (!iqmFile) { TraceLog(LOG_ERROR, "[%s] Unable to open file", filename); return model; } - + // header fread(&iqm,sizeof(IQMHeader), 1, iqmFile); @@ -1037,14 +1054,14 @@ static AnimatedModel LoadIQM(const char *filename) fclose(iqmFile); return model; } - + if(iqm.version != IQM_VERSION) { TraceLog(LOG_ERROR, "IQM version %i is incorrect.", iqm.version); fclose(iqmFile); return model; } - + // meshes imesh = malloc(sizeof(IQMMesh)*iqm.num_meshes); fseek(iqmFile, iqm.ofs_meshes, SEEK_SET); @@ -1052,7 +1069,7 @@ static AnimatedModel LoadIQM(const char *filename) model.meshCount = iqm.num_meshes; model.mesh = malloc(sizeof(AnimatedMesh)*iqm.num_meshes); - + for (int i = 0; i < iqm.num_meshes; i++) { fseek(iqmFile,iqm.ofs_text+imesh[i].name,SEEK_SET); @@ -1068,7 +1085,7 @@ static AnimatedModel LoadIQM(const char *filename) model.mesh[i].animVertices = malloc(sizeof(float)*imesh[i].num_vertexes*3); model.mesh[i].animNormals = malloc(sizeof(float)*imesh[i].num_vertexes*3); } - + // tris tri = malloc(sizeof(IQMTriangle)*iqm.num_triangles); fseek(iqmFile, iqm.ofs_triangles, SEEK_SET); @@ -1077,7 +1094,7 @@ static AnimatedModel LoadIQM(const char *filename) for (int m = 0; m < iqm.num_meshes; m++) { int tcounter = 0; - + for (int i=imesh[m].first_triangle; i < imesh[m].first_triangle+imesh[m].num_triangles; i++) { // IQM triangles are stored counter clockwise, but raylib sets opengl to clockwise drawing, so we swap them around @@ -1087,7 +1104,7 @@ static AnimatedModel LoadIQM(const char *filename) tcounter += 3; } } - + // vertarrays va = malloc(sizeof(IQMVertexArray)*iqm.num_vertexarrays); fseek(iqmFile, iqm.ofs_vertexarrays, SEEK_SET); @@ -1102,7 +1119,7 @@ static AnimatedModel LoadIQM(const char *filename) vertex = malloc(sizeof(float)*iqm.num_vertexes*3); fseek(iqmFile, va[i].offset, SEEK_SET); fread(vertex, sizeof(float)*iqm.num_vertexes*3, 1, iqmFile); - + for (int m = 0; m < iqm.num_meshes; m++) { int vcounter = 0; @@ -1119,7 +1136,7 @@ static AnimatedModel LoadIQM(const char *filename) normal = malloc(sizeof(float)*iqm.num_vertexes*3); fseek(iqmFile, va[i].offset, SEEK_SET); fread(normal, sizeof(float)*iqm.num_vertexes*3, 1, iqmFile); - + for (int m = 0; m < iqm.num_meshes; m++) { int vcounter = 0; @@ -1136,7 +1153,7 @@ static AnimatedModel LoadIQM(const char *filename) text = malloc(sizeof(float)*iqm.num_vertexes*2); fseek(iqmFile, va[i].offset, SEEK_SET); fread(text, sizeof(float)*iqm.num_vertexes*2, 1, iqmFile); - + for (int m = 0; m < iqm.num_meshes; m++) { int vcounter = 0; @@ -1181,7 +1198,7 @@ static AnimatedModel LoadIQM(const char *filename) } break; } } - + // joints, include base poses ijoint = malloc(sizeof(IQMJoint)*iqm.num_joints); fseek(iqmFile, iqm.ofs_joints, SEEK_SET); @@ -1190,14 +1207,14 @@ static AnimatedModel LoadIQM(const char *filename) model.jointCount = iqm.num_joints; model.joints = malloc(sizeof(Joint)*iqm.num_joints); model.basepose = malloc(sizeof(Pose)*iqm.num_joints); - + for (int i = 0; i < iqm.num_joints; i++) { // joints model.joints[i].parent = ijoint[i].parent; fseek(iqmFile, iqm.ofs_text + ijoint[i].name, SEEK_SET); fread(model.joints[i].name,sizeof(char)*JOINT_NAME_LENGTH, 1, iqmFile); - + // basepose model.basepose[i].translation.x = ijoint[i].translate[0]; model.basepose[i].translation.y = ijoint[i].translate[1]; @@ -1212,7 +1229,7 @@ static AnimatedModel LoadIQM(const char *filename) model.basepose[i].scale.y = ijoint[i].scale[1]; model.basepose[i].scale.z = ijoint[i].scale[2]; } - + // build base pose for (int i = 0; i < model.jointCount; i++) { @@ -1224,7 +1241,7 @@ static AnimatedModel LoadIQM(const char *filename) model.basepose[i].scale = Vector3MultiplyV(model.basepose[i].scale, model.basepose[model.joints[i].parent].scale); } } - + fclose(iqmFile); free(imesh); free(tri); @@ -1235,8 +1252,8 @@ static AnimatedModel LoadIQM(const char *filename) free(blendi); free(blendw); free(ijoint); - + return model; } -#endif \ No newline at end of file +#endif diff --git a/examples/others/iqm_loader/rlgl.h b/examples/others/iqm_loader/rlgl.h index 0a66a8f0e..04ef50f7d 100644 --- a/examples/others/iqm_loader/rlgl.h +++ b/examples/others/iqm_loader/rlgl.h @@ -69,7 +69,7 @@ // Security check in case no GRAPHICS_API_OPENGL_* defined #if !defined(GRAPHICS_API_OPENGL_11) && !defined(GRAPHICS_API_OPENGL_21) && !defined(GRAPHICS_API_OPENGL_33) && !defined(GRAPHICS_API_OPENGL_ES2) - #define GRAPHICS_API_OPENGL_11 + #define GRAPHICS_API_OPENGL_33 #endif // Security check in case multiple GRAPHICS_API_OPENGL_* defined