示例#1
0
        public void BuildLods(FrameObjectModel model, IndexBuffer[] indexBuffers, VertexBuffer[] vertexBuffers)
        {
            BuildLods(model.Geometry, model.Material, vertexBuffers, indexBuffers);

            if (model.Skeleton != null && model.SkeletonHierarchy != null && model.BlendInfo != null)
            {
                skeleton        = new Skeleton();
                skeleton.Joints = new Joint[model.Skeleton.BoneNames.Length];
                for (int i = 0; i < skeleton.Joints.Length; i++)
                {
                    var joint = new Joint();
                    joint.Name           = model.Skeleton.BoneNames[i].ToString();
                    joint.ParentIndex    = model.SkeletonHierarchy.ParentIndices[i];
                    joint.Parent         = (joint.ParentIndex != 0xFF) ? skeleton.Joints[joint.ParentIndex] : null;
                    joint.LocalTransform = model.Skeleton.JointTransforms[i];

                    skeleton.Joints[i] = joint;
                }

                //skeleton.ComputeTransforms();
            }

            for (int i = 0; i < model.BlendInfo.BoneIndexInfos.Length; i++)
            {
                var    indexInfos = model.BlendInfo.BoneIndexInfos[i];
                var    lod        = lods[i];
                bool[] remapped   = new bool[lod.Vertices.Length];
                for (int x = 0; x < indexInfos.NumMaterials; x++)
                {
                    var  part   = lod.Parts[x];
                    byte offset = 0;
                    for (int s = 0; s < indexInfos.BonesSlot[x]; s++)
                    {
                        offset += indexInfos.BonesPerPool[s];
                    }

                    for (uint z = part.StartIndex; z < part.StartIndex + (part.NumFaces * 3); z++)
                    {
                        uint index = lod.Indices[z];
                        if (!remapped[index])
                        {
                            for (uint f = 0; f < indexInfos.NumWeightsPerVertex[x]; f++)
                            {
                                var previousBoneID = lod.Vertices[index].BoneIDs[f];
                                lod.Vertices[index].BoneIDs[f] = indexInfos.IDs[offset + previousBoneID];
                            }
                            remapped[index] = true;
                        }
                    }
                }
            }
        }
示例#2
0
 /// <summary>
 /// Constructor used to build Lods. This is used when you want to compile all mesh data together, ready for exporting.
 /// </summary>
 public Model(FrameObjectModel frameModel, IndexBuffer[] indexBuffers, VertexBuffer[] vertexBuffers,
              FrameGeometry frameGeometry, FrameMaterial frameMaterial)
 {
     this.frameModel    = frameModel;
     this.indexBuffers  = indexBuffers;
     this.vertexBuffers = vertexBuffers;
     this.frameGeometry = frameGeometry;
     this.frameMaterial = frameMaterial;
     model           = new M2TStructure();
     model.IsSkinned = true;
     model.Name      = frameMesh.Name.String;
     model.AOTexture = frameMesh.OMTextureHash.String;
     model.BuildLods(frameGeometry, frameMaterial, vertexBuffers, indexBuffers);
 }
        public void BuildLods(FrameObjectModel model, IndexBuffer[] indexBuffers, VertexBuffer[] vertexBuffers)
        {
            BuildLods(model.Geometry, model.Material, vertexBuffers, indexBuffers);

            if (model.Skeleton != null && model.SkeletonHierarchy != null && model.BlendInfo != null)
            {
                skeleton           = new Skeleton();
                skeleton.BoneNames = new string[model.Skeleton.BoneNames.Length];
                skeleton.Parents   = new byte[model.SkeletonHierarchy.ParentIndices.Length];
                skeleton.Transform = new Matrix[model.RestTransform.Length];
                for (int i = 0; i < model.Skeleton.BoneNames.Length; i++)
                {
                    skeleton.BoneNames[i] = model.Skeleton.BoneNames[i].ToString();
                    skeleton.Parents[i]   = model.SkeletonHierarchy.ParentIndices[i];
                    skeleton.Transform[i] = model.RestTransform[i];
                }
            }

            for (int i = 0; i < model.BlendInfo.BoneIndexInfos.Length; i++)
            {
                var    indexInfos = model.BlendInfo.BoneIndexInfos[i];
                var    lod        = lods[i];
                bool[] remapped   = new bool[lod.Vertices.Length];
                for (int x = 0; x < indexInfos.NumMaterials; x++)
                {
                    var  part   = lod.Parts[x];
                    byte offset = 0;
                    for (int s = 0; s < indexInfos.BonesSlot[x]; s++)
                    {
                        offset += (byte)(indexInfos.BonesPerPool[s]);
                    }

                    for (uint z = part.StartIndex; z < part.StartIndex + (part.NumFaces * 3); z++)
                    {
                        int index = lod.Indices[z];
                        if (!remapped[index])
                        {
                            for (uint f = 0; f < indexInfos.NumWeightsPerVertex[x]; f++)
                            {
                                var previousBoneID = lod.Vertices[index].BoneIDs[f];
                                lod.Vertices[index].BoneIDs[f] = indexInfos.IDs[offset + previousBoneID];
                            }
                            remapped[index] = true;
                        }
                    }
                }
            }
        }
示例#4
0
 public Model(FrameObjectModel frameModel, IndexBuffer[] indexBuffers, VertexBuffer[] vertexBuffers)
 {
     this.frameModel    = frameModel;
     this.indexBuffers  = indexBuffers;
     this.vertexBuffers = vertexBuffers;
     frameGeometry      = frameModel.Geometry;
     frameMaterial      = frameModel.Material;
     blendInfo          = frameModel.BlendInfo;
     skeleton           = frameModel.Skeleton;
     skeletonHierarchy  = frameModel.SkeletonHierarchy;
     model           = new M2TStructure();
     model.IsSkinned = true;
     model.Name      = frameModel.Name.ToString();
     model.AOTexture = frameModel.OMTextureHash.String;
     model.BuildLods(frameModel, indexBuffers, vertexBuffers);
 }