void MOCamera::enable(void) { MRenderingContext * render = MEngine::getInstance()->getRenderingContext(); // get viewport render->getViewport(m_currentViewport); // projection mode render->setMatrixMode(M_MATRIX_PROJECTION); render->loadIdentity(); float ratio = (m_currentViewport[2] / (float)m_currentViewport[3]); MVector3 scale = getTransformedScale(); MVector3 iScale(1.0f / scale.x, 1.0f / scale.y, 1.0f / scale.z); MMatrix4x4 iScaleMatrix; iScaleMatrix.setScale(iScale); MMatrix4x4 inverseMatrix = ((*getMatrix()) * iScaleMatrix).getInverse(); // perspective view if(! isOrtho()) { // normal perspective projection render->setPerspectiveView(m_fov, ratio, m_clippingNear, m_clippingFar); // model view mode render->setMatrixMode(M_MATRIX_MODELVIEW); render->loadIdentity(); render->multMatrix(&inverseMatrix); // get current matrices render->getModelViewMatrix(&m_currentViewMatrix); render->getProjectionMatrix(&m_currentProjMatrix); return; } // ortho view float height = m_fov * 0.5f; float width = height * ratio; render->setOrthoView(-width, width, -height, height, m_clippingNear, m_clippingFar); // model view mode render->setMatrixMode(M_MATRIX_MODELVIEW); render->loadIdentity(); render->multMatrix(&inverseMatrix); // get current matrices render->getModelViewMatrix(&m_currentViewMatrix); render->getProjectionMatrix(&m_currentProjMatrix); }
void MOCamera::updateViewMatrix(void) { MVector3 scale = getTransformedScale(); MVector3 iScale(1.0f / scale.x, 1.0f / scale.y, 1.0f / scale.z); MMatrix4x4 iScaleMatrix; iScaleMatrix.setScale(iScale); m_currentViewMatrix = ((*getMatrix()) * iScaleMatrix).getInverse(); }
// skinning void computeSkinning ( MArmature * armature, MSkinData * skinData, const MVector3 * baseVertices, const MVector3 * baseNormals, const MVector3 * baseTangents, MVector3 * vertices, MVector3 * normals, MVector3 * tangents) { MMatrix4x4 matrix; unsigned int p; unsigned int pSize = skinData->getPointsNumber(); if(baseTangents && baseNormals) { for(p = 0; p < pSize; p++) { MSkinPoint * point = skinData->getPoint(p); const unsigned short * bonesIds = point->getBonesIds(); const float * bonesWeights = point->getBonesWeights(); unsigned int vertexId = point->getVertexId(); unsigned int b, bSize = point->getBonesNumber(); memset(matrix.entries, 0, sizeof(float)*16); for(b=0; b<bSize; b++) { MOBone * bone = armature->getBone(bonesIds[b]); blendMatrices(&matrix, bone->getSkinMatrix(), bonesWeights[b]); } vertices[vertexId] = matrix * baseVertices[vertexId]; normals[vertexId] = matrix.getRotatedVector3(baseNormals[vertexId]); tangents[vertexId] = matrix.getRotatedVector3(baseTangents[vertexId]); } } else if(baseNormals) { for(p = 0; p < pSize; p++) { MSkinPoint * point = skinData->getPoint(p); const unsigned short * bonesIds = point->getBonesIds(); const float * bonesWeights = point->getBonesWeights(); unsigned int vertexId = point->getVertexId(); unsigned int b, bSize = point->getBonesNumber(); memset(matrix.entries, 0, sizeof(float)*16); for(b=0; b<bSize; b++) { MOBone * bone = armature->getBone(bonesIds[b]); blendMatrices(&matrix, bone->getSkinMatrix(), bonesWeights[b]); } vertices[vertexId] = matrix * baseVertices[vertexId]; normals[vertexId] = matrix.getRotatedVector3(baseNormals[vertexId]); } } else { for(p = 0; p < pSize; p++) { MSkinPoint * point = skinData->getPoint(p); const unsigned short * bonesIds = point->getBonesIds(); const float * bonesWeights = point->getBonesWeights(); unsigned int vertexId = point->getVertexId(); unsigned int b, bSize = point->getBonesNumber(); memset(matrix.entries, 0, sizeof(float)*16); for(b=0; b<bSize; b++) { MOBone * bone = armature->getBone(bonesIds[b]); blendMatrices(&matrix, bone->getSkinMatrix(), bonesWeights[b]); } vertices[vertexId] = matrix * baseVertices[vertexId]; } } }
MVector3 MQuaternion::getEulerAngles(void) const { MMatrix4x4 matrix; matrix.setRotationAxis(getAngle(), getAxis()); return matrix.getEulerAngles(); }