void FMD3Model::RenderFrame(FTexture * skin, int frameno, int cm, Matrix3x4 *modeltoworld, int translation) { if (frameno>=numFrames) return; MD3Frame * frame = &frames[frameno]; // I can't confirm correctness of this because no model I have tested uses this information // gl.MatrixMode(GL_MODELVIEW); // gl.Translatef(frame->origin[0], frame->origin[1], frame->origin[2]); for(int i=0;i<numSurfaces;i++) { MD3Surface * surf = &surfaces[i]; if (!skin) { if (surf->numSkins==0) return; skin = surf->skins[0]; if (!skin) return; } FMaterial * tex = FMaterial::ValidateTexture(skin); tex->Bind(cm, 0, translation); RenderTriangles(surf, surf->vertices + frameno * surf->numVertices, modeltoworld); } }
void FMD3Model::RenderFrame(FTexture * skin, int frameno, int cm, int translation) { if (frameno>=numFrames) return; MD3Frame * frame = &frames[frameno]; // I can't confirm correctness of this because no model I have tested uses this information // glMatrixMode(GL_MODELVIEW); // glTranslatef(frame->origin[0], frame->origin[1], frame->origin[2]); for(int i=0;i<numSurfaces;i++) { MD3Surface * surf = &surfaces[i]; // [BB] In case no skin is specified via MODELDEF, check if the MD3 has a skin for the current surface. // Note: Each surface may have a different skin. FTexture *surfaceSkin = skin; if (!surfaceSkin) { if (surf->numSkins==0) return; surfaceSkin = surf->skins[0]; if (!surfaceSkin) return; } FMaterial * tex = FMaterial::ValidateTexture(surfaceSkin); tex->Bind(cm, 0, translation); RenderTriangles(surf, surf->vertices + frameno * surf->numVertices); } }
void FMD3Model::RenderFrameInterpolated(FTexture * skin, int frameno, int frameno2, double inter, int cm, int translation) { if (frameno>=numFrames || frameno2>=numFrames) return; for(int i=0;i<numSurfaces;i++) { MD3Surface * surf = &surfaces[i]; // [BB] In case no skin is specified via MODELDEF, check if the MD3 has a skin for the current surface. // Note: Each surface may have a different skin. FTexture *surfaceSkin = skin; if (!surfaceSkin) { if (surf->numSkins==0) return; surfaceSkin = surf->skins[0]; if (!surfaceSkin) return; } FMaterial * tex = FMaterial::ValidateTexture(surfaceSkin); tex->Bind(cm, 0, translation); MD3Vertex* verticesInterpolated = new MD3Vertex[surfaces[i].numVertices]; MD3Vertex* vertices1 = surf->vertices + frameno * surf->numVertices; MD3Vertex* vertices2 = surf->vertices + frameno2 * surf->numVertices; // [BB] Calculate the interpolated vertices by linear interpolation. for( int k = 0; k < surf->numVertices; k++ ) { verticesInterpolated[k].x = (1-inter)*vertices1[k].x+ (inter)*vertices2[k].x; verticesInterpolated[k].y = (1-inter)*vertices1[k].y+ (inter)*vertices2[k].y; verticesInterpolated[k].z = (1-inter)*vertices1[k].z+ (inter)*vertices2[k].z; // [BB] Apparently RenderTriangles doesn't use nx, ny, nz, so don't interpolate them. } RenderTriangles(surf, verticesInterpolated); delete[] verticesInterpolated; } }
void FMD3Model::RenderFrameInterpolated(FTexture * skin, int frameno, int frameno2, double inter, int cm, Matrix3x4 *modeltoworld, int translation) { if (frameno>=numFrames || frameno2>=numFrames) return; for(int i=0;i<numSurfaces;i++) { MD3Surface * surf = &surfaces[i]; if (!skin) { if (surf->numSkins==0) return; skin = surf->skins[0]; if (!skin) return; } FMaterial * tex = FMaterial::ValidateTexture(skin); tex->Bind(cm, 0, translation); MD3Vertex* verticesInterpolated = new MD3Vertex[surfaces[i].numVertices]; MD3Vertex* vertices1 = surf->vertices + frameno * surf->numVertices; MD3Vertex* vertices2 = surf->vertices + frameno2 * surf->numVertices; // [BB] Calculate the interpolated vertices by linear interpolation. for( int k = 0; k < surf->numVertices; k++ ) { verticesInterpolated[k].x = (1-inter)*vertices1[k].x+ (inter)*vertices2[k].x; verticesInterpolated[k].y = (1-inter)*vertices1[k].y+ (inter)*vertices2[k].y; verticesInterpolated[k].z = (1-inter)*vertices1[k].z+ (inter)*vertices2[k].z; // [BB] Apparently RenderTriangles doesn't use nx, ny, nz, so don't interpolate them. } RenderTriangles(surf, verticesInterpolated, modeltoworld); delete[] verticesInterpolated; } }