Exemplo n.º 1
0
        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]);
                }
            }
        }
Exemplo n.º 2
0
        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);
                }
            }
        }