static inline void drawMesh(MODEL *psModel, int now, int mesh) { MESH *psMesh = &psModel->mesh[mesh]; assert(psMesh); if (psMesh->frameArray) { FRAME *psFrame = &psMesh->frameArray[psMesh->currentFrame]; FRAME *nextFrame = psFrame; double fraction = 1.0f / (psFrame->timeSlice * 1000) * (now - psMesh->lastChange); // until next frame Vector3f vec; glPushMatrix(); // save matrix state assert(psMesh->currentFrame < psMesh->frames); if (psMesh->currentFrame == psMesh->frames - 1) { nextFrame = &psMesh->frameArray[0]; // wrap around } else { nextFrame = &psMesh->frameArray[psMesh->currentFrame + 1]; } // Try to avoid crap drivers from taking down the entire system assert(finitef(psFrame->translation.x) && finitef(psFrame->translation.y) && finitef(psFrame->translation.z)); assert(psFrame->rotation.x >= -360.0f && psFrame->rotation.y >= -360.0f && psFrame->rotation.z >= -360.0f); assert(psFrame->rotation.x <= 360.0f && psFrame->rotation.y <= 360.0f && psFrame->rotation.z <= 360.0f); // Translate interpolateVectors(psFrame->translation, nextFrame->translation, &vec, fraction); glTranslatef(vec.x, vec.z, vec.y); // z and y flipped // Rotate interpolateVectors(psFrame->rotation, nextFrame->rotation, &vec, fraction); glRotatef(vec.x, 1, 0, 0); glRotatef(vec.z, 0, 1, 0); // z and y flipped again... glRotatef(vec.y, 0, 0, 1); // Morph if (!psMesh->teamColours) { psMesh->currentTextureArray = psFrame->textureArray; } } glTexCoordPointer(2, GL_FLOAT, 0, psMesh->textureArray[psMesh->currentTextureArray]); glVertexPointer(3, GL_FLOAT, 0, psMesh->vertexArray); glDrawElements(GL_TRIANGLES, psMesh->faces * 3, GL_UNSIGNED_INT, psMesh->indexArray); if (psMesh->frameArray) { glPopMatrix(); // restore position for next mesh } }
Point bkgl::interpolatePoint(int x, int y, Point p1, Point p2, float distance) { Color c = colorInterpolation(p1.getColor(), p2.getColor(), distance); float z = zInterpolation(p1.z, p2.z, distance); cml::vector4f world = interpolateVectors(p1.world, p2.world, distance); Normal normal = interpolateVectors(p1.normal, p2.normal, distance); return Point(x, y, z, 0, c, world, normal); }