Ejemplo n.º 1
0
 public void Copy(ref MODEL_NODE nc)
 {
     nc.Name               = Name;
     nc.NextSiblingNode    = NextSiblingNode;
     nc.NextChildNode      = NextChildNode;
     nc.ParentNode         = ParentNode;
     nc.Translation[0]     = Translation[0];
     nc.Translation[1]     = Translation[1];
     nc.Translation[2]     = Translation[2];
     nc.Rotation[0]        = Rotation[0];
     nc.Rotation[1]        = Rotation[1];
     nc.Rotation[2]        = Rotation[2];
     nc.Rotation[3]        = Rotation[3];
     nc.DistanceFromParent = DistanceFromParent;
 }
Ejemplo n.º 2
0
        public void InitializeAnimationProcessing()
        {
            m_AniNodes       = new MODEL_NODE[m_header.Nodes.Count];
            m_NodeTransforms = new MODEL_NODE_TRANSFORM[m_header.Nodes.Count];
            for (int x = 0; x < m_header.Nodes.Count; x++)
            {
                m_AniNodes[x] = new MODEL_NODE();
                m_Nodes[x].Copy(ref m_AniNodes[x]);
                m_NodeTransforms[x] = new MODEL_NODE_TRANSFORM();
            }

            this.ProcessNodeOrientation(0);
            //Process the node and vertex transformations to initialize everything
            this.InverseTransformModel();

            m_bAnimationEnabled = true;
        }
Ejemplo n.º 3
0
        public void LoadTagData()
        {
            m_bModelLoaded = false;
            BinaryReader br = new BinaryReader(m_stream);

            // Load the header
            m_header.Load(ref br);

            // Load the nodes and allocate the node transforms
            br.BaseStream.Seek(m_header.Nodes.Offset, SeekOrigin.Begin);
            m_Nodes = new MODEL_NODE[m_header.Nodes.Count];
            for (int x = 0; x < m_Nodes.Length; x++)
            {
                m_Nodes[x] = new MODEL_NODE();
                m_Nodes[x].LoadPc(ref br);
            }

            // Load the regions
            br.BaseStream.Seek(m_header.Regions.Offset, SeekOrigin.Begin);
            m_regions = new MODEL_REGION[m_header.Regions.Count];
            for (int x = 0; x < m_regions.Length; x++)
            {
                m_regions[x] = new MODEL_REGION();
                m_regions[x].Load(ref br);
            }
            // Load child permutations
            for (int x = 0; x < m_regions.Length; x++)
            {
                br.BaseStream.Seek(m_regions[x].Permutations.Offset, SeekOrigin.Begin);
                for (int y = 0; y < m_regions[x].Permutations.Count; y++)
                {
                    m_regions[x].PERMUTATIONS[y] = new MODEL_REGION_PERMUTATION();
                    m_regions[x].PERMUTATIONS[y].Load(ref br);
                }
            }

            // Load the Geometries
            br.BaseStream.Seek(m_header.Geometries.Offset, SeekOrigin.Begin);
            m_geometries = new MODEL_GEOMETRY_HEADER[m_header.Geometries.Count];
            for (int x = 0; x < m_geometries.Length; x++)
            {
                m_geometries[x] = new MODEL_GEOMETRY_HEADER();
                m_geometries[x].Load(ref br, this.Header.GameVersion);
            }

            // Load child Submesh Headers
            for (int g = 0; g < m_geometries.Length; g++)
            {
                for (int s = 0; s < m_geometries[g].SubmeshHeaders.Count; s++)
                {
                    if (this.Header.GameVersion == MapfileVersion.XHALO1)
                    {
                        m_geometries[g].XSUBMESHHEADERS[s]        = new XBOXMODEL_SUBMESH_HEADER();
                        m_geometries[g].XSUBMESHHEADERS[s].UScale = m_header.u_scale;
                        m_geometries[g].XSUBMESHHEADERS[s].VScale = m_header.v_scale;
                        m_geometries[g].XSUBMESHHEADERS[s].Load(br);
                    }
                    else
                    {
                        m_geometries[g].SUBMESHHEADERS[s]        = new PCMODEL_SUBMESH_HEADER();
                        m_geometries[g].SUBMESHHEADERS[s].UScale = m_header.u_scale;
                        m_geometries[g].SUBMESHHEADERS[s].VScale = m_header.v_scale;
                        m_geometries[g].SUBMESHHEADERS[s].Load(ref br);
                    }
                }

                for (int s = 0; s < m_geometries[g].SubmeshHeaders.Count; s++)
                {
                    if (this.Header.GameVersion == MapfileVersion.XHALO1)
                    {
                        m_geometries[g].XSUBMESHHEADERS[s].LoadRawData(ref br, this.m_Buffer);
                    }
                    else
                    {
                        m_geometries[g].SUBMESHHEADERS[s].LoadRawData(ref br, this.m_Buffer);
                    }
                }
            }

            // Load the shaders
            br.BaseStream.Seek(m_header.Shaders.Offset, SeekOrigin.Begin);
            m_shaders = new MODEL_SHADER[m_header.Shaders.Count];
            for (int x = 0; x < m_shaders.Length; x++)
            {
                m_shaders[x] = new MODEL_SHADER();
                m_shaders[x].Load(ref br);
            }
            // Now load all of the strings
            for (int x = 0; x < m_shaders.Length; x++)
            {
                m_shaders[x].Shader.ReadString(ref br);
            }

            for (int x = 0; x < m_shaders.Length; x++)
            {
                string tagclass = new string(m_shaders[x].Shader.tag);
                m_shaders[x].ShaderManagerIndex = MdxRender.SM.RegisterShader(new TagFileName(m_shaders[x].Shader.data, tagclass, this.m_PromHeader.GameVersion));
            }

            //Sync up submesh ShaderManagerIndex with global shader manager
            for (int g = 0; g < m_geometries.Length; g++)
            {
                for (int s = 0; s < m_geometries[g].SubmeshHeaders.Count; s++)
                {
                    if (this.Header.GameVersion == MapfileVersion.XHALO1)
                    {
                        string      tag_type        = new string(m_shaders[m_geometries[g].XSUBMESHHEADERS[s].ShaderIndex].Shader.tag);
                        TagFileName shader_filename = new TagFileName(m_shaders[m_geometries[g].XSUBMESHHEADERS[s].ShaderIndex].Shader.data,
                                                                      tag_type, this.m_PromHeader.GameVersion);
                        m_geometries[g].XSUBMESHHEADERS[s].m_Mesh.RegisterShader(shader_filename);
                    }
                    else
                    {
                        string      tag_type        = new string(m_shaders[m_geometries[g].SUBMESHHEADERS[s].ShaderIndex].Shader.tag);
                        TagFileName shader_filename = new TagFileName(m_shaders[m_geometries[g].SUBMESHHEADERS[s].ShaderIndex].Shader.data,
                                                                      tag_type, this.m_PromHeader.GameVersion);
                        m_geometries[g].SUBMESHHEADERS[s].m_Mesh.RegisterShader(shader_filename);
                    }
                }
            }

            //determine bounding box for camera viewer
            if (this.Header.GameVersion == MapfileVersion.XHALO1)
            {
                for (int g = 0; g < m_header.Geometries.Count; g++)
                {
                    for (int s = 0; s < m_geometries[g].SubmeshHeaders.Count; s++)
                    {
                        m_geometries[g].XSUBMESHHEADERS[s].m_Mesh.UpdateBoundingBox(ref m_BoundingBox);
                    }
                }
            }
            else
            {
                for (int g = 0; g < m_header.Geometries.Count; g++)
                {
                    for (int s = 0; s < m_geometries[g].SubmeshHeaders.Count; s++)
                    {
                        m_geometries[g].SUBMESHHEADERS[s].m_Mesh.UpdateBoundingBox(ref m_BoundingBox);
                    }
                }
            }

            m_bModelLoaded = true;
        }