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; } } } } }
/// <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; } } } } }
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); }