private void LoadBMD(Model model) { Nodes.Clear(); ShapeFolder = new TreeNode("Shapes"); SkeletonFolder = new TreeNode("Skeleton"); MaterialFolder = new TreeNode("Materials"); TextureFolder = new BMDTextureFolder("Textures"); Nodes.Add(ShapeFolder); Nodes.Add(MaterialFolder); Nodes.Add(SkeletonFolder); Nodes.Add(TextureFolder); BMDFile = model; FillSkeleton(BMDFile.Scenegraph, Skeleton, BMDFile.Joints.FlatSkeleton); foreach (var bone in Skeleton.bones) { if (bone.Parent == null) { SkeletonFolder.Nodes.Add(bone); } } for (int i = 0; i < BMDFile.Shapes.Shapes.Count; i++) { var curShape = BMDFile.Shapes.Shapes[i]; var mat = new BMDMaterialWrapper(BMDFile.Materials.GetMaterial(i), BMDFile); MaterialFolder.Nodes.Add(mat); var shpWrapper = new BMDShapeWrapper(curShape, BMDFile, mat); shpWrapper.Text = $"Shape {i}"; ShapeFolder.Nodes.Add(shpWrapper); Renderer.Meshes.Add(shpWrapper); var polyGroup = new STGenericPolygonGroup(); shpWrapper.PolygonGroups.Add(polyGroup); var VertexAttributes = BMDFile.VertexData.Attributes; int vertexID = 0; int packetID = 0; foreach (var att in curShape.Descriptor.Attributes) { shpWrapper.Nodes.Add($"Attribute {att.Key} {att.Value.Item1}"); } foreach (SuperBMDLib.Geometry.Packet pack in curShape.Packets) { int primID = 0; foreach (SuperBMDLib.Geometry.Primitive prim in pack.Primitives) { List <SuperBMDLib.Geometry.Vertex> triVertices = J3DUtility.PrimitiveToTriangles(prim); for (int triIndex = 0; triIndex < triVertices.Count; triIndex += 3) { polyGroup.faces.AddRange(new int[] { vertexID + 2, vertexID + 1, vertexID }); for (int triVertIndex = 0; triVertIndex < 3; triVertIndex++) { SuperBMDLib.Geometry.Vertex vert = triVertices[triIndex + triVertIndex]; Vertex vertex = new Vertex(); vertex.pos = VertexAttributes.Positions[(int)vert.GetAttributeIndex(GXVertexAttribute.Position)]; shpWrapper.vertices.Add(vertex); if (curShape.Descriptor.CheckAttribute(GXVertexAttribute.Normal)) { vertex.nrm = VertexAttributes.Normals[(int)vert.NormalIndex]; } if (curShape.Descriptor.CheckAttribute(GXVertexAttribute.Color0)) { var color0 = VertexAttributes.Color_0[(int)vert.Color0Index]; vertex.col = new OpenTK.Vector4(color0.R, color0.G, color0.B, color0.A); } for (int j = 0; j < vert.VertexWeight.WeightCount; j++) { vertex.boneWeights.Add(vert.VertexWeight.Weights[j]); vertex.boneIds.Add(vert.VertexWeight.BoneIndices[j]); } if (vert.VertexWeight.WeightCount == 1) { if (BMDFile.SkinningEnvelopes.InverseBindMatrices.Count > vert.VertexWeight.BoneIndices[0]) { Matrix4 test = BMDFile.SkinningEnvelopes.InverseBindMatrices[vert.VertexWeight.BoneIndices[0]].Inverted(); test.Transpose(); vertex.pos = OpenTK.Vector3.TransformPosition(vertex.pos, test); vertex.nrm = OpenTK.Vector3.TransformNormal(vertex.nrm, test); } else { vertex.pos = OpenTK.Vector3.TransformPosition(vertex.pos, BMDFile.Joints.FlatSkeleton[vert.VertexWeight.BoneIndices[0]].TransformationMatrix); vertex.nrm = OpenTK.Vector3.TransformNormal(vertex.nrm, BMDFile.Joints.FlatSkeleton[vert.VertexWeight.BoneIndices[0]].TransformationMatrix); } } for (int texCoordNum = 0; texCoordNum < 8; texCoordNum++) { if (curShape.Descriptor.CheckAttribute(GXVertexAttribute.Tex0 + texCoordNum)) { switch (texCoordNum) { case 0: vertex.uv0 = VertexAttributes.TexCoord_0[(int)vert.TexCoord0Index]; break; case 1: vertex.uv1 = VertexAttributes.TexCoord_0[(int)vert.TexCoord0Index]; break; case 2: vertex.uv2 = VertexAttributes.TexCoord_0[(int)vert.TexCoord0Index]; break; } } } vertexID++; } } primID++; } packetID++; } } CorrectMaterialIndices(Renderer.Meshes, BMDFile.Scenegraph, BMDFile.Materials); for (int i = 0; i < BMDFile.Textures.Textures.Count; i++) { var texWrapper = new BMDTextureWrapper(BMDFile.Textures.Textures[i]); TextureFolder.Nodes.Add(texWrapper); Renderer.TextureList.Add(texWrapper); } }
public BMDShapeWrapper(Shape shape, SuperBMDLib.Model model, BMDMaterialWrapper mat) { BMDShape = shape; ParentModel = model; material = mat; }
public BMDTextureMap(BMDMaterialWrapper mat) { material = mat; }