public void InverseNodeTransform(NodeTransform[] node_array) { Util.Matrix vert_transform = new Util.Matrix(); //Microsoft.DirectX.Matrix vert_transform = new Microsoft.DirectX.Matrix(); //Microsoft.DirectX.Vector3 vec = new Microsoft.DirectX.Vector3(); for (int v = 0; v < m_ModelVerts.Length; v++) { if (m_ModelVerts[v].node1_index != -1) { vert_transform = node_array[m_ModelVerts[v].node1_index].m_absolute; //inverse transform positions vert_transform.TranslateVect(ref m_ModelVerts[v].it_pos[0], ref m_ModelVerts[v].it_pos[1], ref m_ModelVerts[v].it_pos[2]); vert_transform.inverseRotateVect(ref m_ModelVerts[v].it_pos[0], ref m_ModelVerts[v].it_pos[1], ref m_ModelVerts[v].it_pos[2]); //inverse transform normals vert_transform.TranslateVect(ref m_ModelVerts[v].it_norm[0], ref m_ModelVerts[v].it_norm[1], ref m_ModelVerts[v].it_norm[2]); vert_transform.inverseRotateVect(ref m_ModelVerts[v].it_norm[0], ref m_ModelVerts[v].it_norm[1], ref m_ModelVerts[v].it_norm[2]); } } }
public void UpdateKeyframe(Animations Ani) { Util.Matrix vert_transform = new Util.Matrix(); //copy new nodes into local node structure for (int n = 0; n < m_Model.m_Nodes.Length; n++) { Ani.GetAnimationNode(n, ref m_AniNodes[n].Translation, ref m_AniNodes[n].Rotation); } ProcessNodeOrientation(0); //TODO: update local mesh buffers (DX buffers are updated during draw) for (int n = 0; n < m_Model.m_Nodes.Length; n++) { //Update node locations for our "debug" viewer m_Model.NodeTransforms[n].m_FinalNode[0] = 0; m_Model.NodeTransforms[n].m_FinalNode[1] = 0; m_Model.NodeTransforms[n].m_FinalNode[2] = 0; vert_transform = m_Model.NodeTransforms[n].m_absolute; vert_transform.inverseRotateVect(ref m_Model.NodeTransforms[n].m_FinalNode[0], ref m_Model.NodeTransforms[n].m_FinalNode[1], ref m_Model.NodeTransforms[n].m_FinalNode[2]); vert_transform.inverseTranslateVect(m_Model.NodeTransforms[n].m_FinalNode); } //Perform transform operations on active permutation/LOD to save CPU int geo_index = 0; int perm_index = 0; for (int region = 0; region < m_Model.m_Regions.Length; region++) { geo_index = m_Model.m_Regions[region].Permutations[perm_index].LodMeshIndex[(int)m_Model.LevelOfDetail]; for (int m = 0; m < m_Model.m_MeshList[geo_index].Length; m++) { m_Model.m_MeshList[geo_index][m].NodeTransform(m_Model.NodeTransforms); } } }