public void CreateEmptyVertexBuffer() { VertexBufferHelper helper = new VertexBufferHelper(new VertexBuffer(), Syroot.BinaryData.ByteOrder.BigEndian); List <VertexBufferHelperAttrib> atrib = new List <VertexBufferHelperAttrib>(); VertexBufferHelperAttrib position = new VertexBufferHelperAttrib(); position.Name = "_p0"; position.Data = new Maths.Vector4F[200]; position.Format = GX2.GX2AttribFormat.Format_32_32_32_Single; atrib.Add(position); VertexBufferHelperAttrib normal = new VertexBufferHelperAttrib(); normal.Name = "_n0"; normal.Data = new Maths.Vector4F[200]; normal.Format = GX2.GX2AttribFormat.Format_10_10_10_2_SNorm; atrib.Add(normal); helper.Attributes = atrib; var VertexBuffer = helper.ToVertexBuffer(); VertexSkinCount = VertexBuffer.VertexSkinCount; Attributes = VertexBuffer.Attributes; Buffers = VertexBuffer.Buffers; }
public void InjectMeshRigged(Model input, Syroot.BinaryData.ByteOrder BO) { //Deal With Mesh uint[] theFaces = meshes[0].faces.ToArray(); input.Shapes[0].Meshes[0].SetIndices(theFaces); if (input.Shapes[0].Meshes.Count != 1) { for (int i = 0; i < input.Shapes[0].Meshes.Count; i++) { input.Shapes[0].Meshes.RemoveAt(1); } } input.Shapes[0].Radius = 10000000000f; input.Shapes[0].Meshes[0].SubMeshes.Clear(); Bounding LeeT = new Bounding(); LeeT.Center = new Syroot.Maths.Vector3F(0, 0, 0); LeeT.Extent = new Syroot.Maths.Vector3F(10000000000f, 10000000000f, 10000000000f); for (int i = 0; i < input.Shapes[0].SubMeshBoundings.Count; i++) { input.Shapes[0].SubMeshBoundings[i] = LeeT; } SubMesh Setup = new SubMesh(); Setup.Count = (uint)meshes[0].faces.Count; Setup.Offset = 0; for (int vvv = 0; vvv < 1; vvv++) { input.Shapes[0].Meshes[0].SubMeshes.Add(Setup); } //input.Shapes[0].Name = meshes[0].Name; //Deal with Vertexes VertexBufferHelper helper = new VertexBufferHelper(input.VertexBuffers[0], BO); List <VertexBufferHelperAttrib> atrib = new List <VertexBufferHelperAttrib>(); VertexBufferHelperAttrib vertPos = new VertexBufferHelperAttrib(); vertPos.Name = "_p0"; vertPos.Data = meshes[0].verts.ToArray(); vertPos.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_16_16_16_16_Single; VertexBufferHelperAttrib vertUV = new VertexBufferHelperAttrib(); vertUV.Name = "_u0"; vertUV.Data = meshes[0].uvs.ToArray(); vertUV.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_16_16_Single; VertexBufferHelperAttrib vertNorm = new VertexBufferHelperAttrib(); vertNorm.Name = "_n0"; vertNorm.Data = meshes[0].norms.ToArray(); vertNorm.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_10_10_10_2_SNorm; atrib.Add(vertPos); atrib.Add(vertNorm); atrib.Add(vertUV); helper.Attributes = atrib; input.VertexBuffers[0] = helper.ToVertexBuffer(); }
public void SaveFile(string FileName) { int mdl = 0; foreach (Model fmdl in TargetWiiUBFRES.Models.Values) { int s = 0; foreach (Shape shp in fmdl.Shapes.Values) { VertexBufferHelper helper = new VertexBufferHelper(fmdl.VertexBuffers[shp.VertexBufferIndex], TargetWiiUBFRES.ByteOrder); foreach (VertexAttrib att in fmdl.VertexBuffers[shp.VertexBufferIndex].Attributes.Values) { switch (att.Name) { case "_t0": { VertexBufferHelperAttrib tangents = helper["_t0"]; // Access by name int t = 0; foreach (Vector4 tan in models[mdl].poly[s].vertices.tans) { tangents.Data[t] = new Syroot.Maths.Vector4F(tan.X, tan.Y, tan.Z, tan.W); t++; } } break; case "_b0": { VertexBufferHelperAttrib bitangents = helper["_b0"]; // Access by name int b = 0; foreach (Vector4 bitan in models[mdl].poly[s].vertices.bitans) { bitangents.Data[b] = new Syroot.Maths.Vector4F(bitan.X, bitan.Y, bitan.Z, bitan.W); b++; } } break; } } s++; } mdl++; } TargetWiiUBFRES.Save(FileName); }
public void SaveFile(string FileName) { int mdl = 0; foreach (Model fmdl in TargetWiiUBFRES.Models.Values) { int s = 0; foreach (Shape shp in fmdl.Shapes.Values) { VertexBufferHelper helper = new VertexBufferHelper(fmdl.VertexBuffers[shp.VertexBufferIndex], TargetWiiUBFRES.ByteOrder); foreach (VertexAttrib att in fmdl.VertexBuffers[shp.VertexBufferIndex].Attributes.Values) { switch (att.Name) { case "_n0": { VertexBufferHelperAttrib normals = helper["_n0"]; // Access by name } break; case "_t0": { VertexBufferHelperAttrib tangents = helper["_t0"]; // Access by name } break; case "_b0": { VertexBufferHelperAttrib bitangents = helper["_b0"]; // Access by name } break; } fmdl.VertexBuffers[shp.VertexBufferIndex] = helper.ToVertexBuffer(); } s++; } mdl++; } TargetWiiUBFRES.Save(FileName); }
private static Syroot.Maths.Vector4F[] AttributeData(VertexAttrib att, VertexBufferHelper helper, string attName) { VertexBufferHelperAttrib attd = helper[attName]; return(attd.Data); }
public static void SaveVertexBuffer(FSHP fshp) { VertexBuffer buffer = new VertexBuffer(); buffer.Attributes = new ResDict <VertexAttrib>(); VertexBufferHelper helper = new VertexBufferHelper(buffer, Syroot.BinaryData.ByteOrder.BigEndian); List <VertexBufferHelperAttrib> atrib = new List <VertexBufferHelperAttrib>(); fshp.UpdateVertices(); foreach (FSHP.VertexAttribute att in fshp.vertexAttributes) { if (att.Name == "_p0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.verts.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_n0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.norms.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_u0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.uv0.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_u1") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.uv1.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_u2") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.uv2.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_w0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.weights.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_i0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.boneInd.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_b0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.bitans.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_t0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.tans.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } if (att.Name == "_c0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = fshp.colors.ToArray(); vert.Format = att.SetTypeWiiU(att.Format); atrib.Add(vert); } } if (atrib.Count == 0) { MessageBox.Show("Attributes are empty?"); return; } helper.Attributes = atrib; fshp.VertexBufferU = helper.ToVertexBuffer(); fshp.VertexBufferU.VertexSkinCount = fshp.VertexSkinCount; }
private void ReadVertexBuffer(Model mdl, Shape shp, Mesh poly) { //Create a buffer instance which stores all the buffer data VertexBufferHelper helper = new VertexBufferHelper(mdl.VertexBuffers[shp.VertexBufferIndex], TargetSwitchBFRES.ByteOrder); Vertex v = new Vertex(); foreach (VertexAttrib att in mdl.VertexBuffers[shp.VertexBufferIndex].Attributes) { if (att.Name == "_p0") { VertexBufferHelperAttrib position = helper["_p0"]; Syroot.Maths.Vector4F[] vec4Positions = position.Data; foreach (Syroot.Maths.Vector4F p in vec4Positions) { v.pos.Add(new Vector3 { X = p.X, Y = p.Y, Z = p.Z }); } } if (att.Name == "_n0") { VertexBufferHelperAttrib normal = helper["_n0"]; Syroot.Maths.Vector4F[] vec4Normals = normal.Data; foreach (Syroot.Maths.Vector4F n in vec4Normals) { v.nrm.Add(new Vector3 { X = n.X, Y = n.Y, Z = n.Z }); } } if (att.Name == "_u0") { VertexBufferHelperAttrib uv0 = helper["_u0"]; Syroot.Maths.Vector4F[] vec4uv0 = uv0.Data; foreach (Syroot.Maths.Vector4F u in vec4uv0) { v.uv0.Add(new Vector2 { X = u.X, Y = u.Y }); } } if (att.Name == "_u1") { VertexBufferHelperAttrib uv1 = helper["_u1"]; Syroot.Maths.Vector4F[] vec4uv1 = uv1.Data; foreach (Syroot.Maths.Vector4F u in vec4uv1) { v.uv1.Add(new Vector2 { X = u.X, Y = u.Y }); } } if (att.Name == "_u2") { Console.WriteLine(att.Name); VertexBufferHelperAttrib uv2 = helper["_u2"]; Syroot.Maths.Vector4F[] vec4uv2 = uv2.Data; foreach (Syroot.Maths.Vector4F u in vec4uv2) { v.uv2.Add(new Vector2 { X = u.X, Y = u.Y }); } } if (att.Name == "_c0") { VertexBufferHelperAttrib c0 = helper["_c0"]; Syroot.Maths.Vector4F[] vec4c0 = c0.Data; foreach (Syroot.Maths.Vector4F c in vec4c0) { v.col.Add(new Vector4 { X = c.X, Y = c.Y, Z = c.Z, W = c.W }); } } if (att.Name == "_t0") { VertexBufferHelperAttrib t0 = helper["_t0"]; Syroot.Maths.Vector4F[] vec4t0 = t0.Data; foreach (Syroot.Maths.Vector4F u in vec4t0) { v.tans.Add(new Vector4 { X = u.X, Y = u.Y, Z = u.Z, W = u.W }); } } if (att.Name == "_b0") { VertexBufferHelperAttrib b0 = helper["_b0"]; Syroot.Maths.Vector4F[] vec4b0 = b0.Data; foreach (Syroot.Maths.Vector4F u in vec4b0) { v.bitans.Add(new Vector4 { X = u.X, Y = u.Y, Z = u.Z, W = u.W }); } } if (att.Name == "_w0") { VertexBufferHelperAttrib w0 = helper["_w0"]; Syroot.Maths.Vector4F[] vec4w0 = w0.Data; foreach (Syroot.Maths.Vector4F w in vec4w0) { v.weights.Add(new Vector4 { X = w.X, Y = w.Y, Z = w.Z, W = w.W }); } } if (att.Name == "_i0") { VertexBufferHelperAttrib i0 = helper["_i0"]; Syroot.Maths.Vector4F[] vec4i0 = i0.Data; foreach (Syroot.Maths.Vector4F i in vec4i0) { v.nodes.Add(new Vector4 { X = i.X, Y = i.Y, Z = i.Z, W = i.W }); } } } poly.vertices = v; }
public SmModel(Model model, ByteOrder byteOrder) { // Create a List to hold all shape vertices for BBox calculation List <Vector3> positionVectors = new List <Vector3>(); foreach (String shapeKey in model.Shapes.Keys) { Shape shape = model.Shapes[shapeKey]; // Create a List to hold the raw vertices for this Shape List <float> rawVertices = new List <float>(); // Create the VertexBufferHelper with this Shape's vertex buffer VertexBufferHelper helper = new VertexBufferHelper(model.VertexBuffers[shape.VertexBufferIndex], byteOrder); // Get the positions in Vector4Fs VertexBufferHelperAttrib positionAttrib = helper["_p0"]; Syroot.Maths.Vector4F[] vec4Positions = positionAttrib.Data; foreach (Syroot.Maths.Vector4F position in vec4Positions) { // Switch based on format switch (positionAttrib.Format) { case GX2AttribFormat.Format_32_32_32_32_Single: case GX2AttribFormat.Format_32_32_32_Single: rawVertices.Add(position.X); rawVertices.Add(position.Y); rawVertices.Add(position.Z); if (positionAttrib.Format == GX2AttribFormat.Format_32_32_32_32_Single) { rawVertices.Add(position.W); } break; case GX2AttribFormat.Format_16_16_16_16_Single: rawVertices.Add(position.X); rawVertices.Add(position.Y); rawVertices.Add(position.Z); rawVertices.Add(position.W); break; default: throw new Exception("Unhandled attribute format " + positionAttrib.Format + ", go nag OatmealDome"); } } // Convert the list into an array float[] verticesArray = rawVertices.ToArray(); // Create Vector3s for BBox calculation for (int i = 0; i < verticesArray.Length; i += 3) { if (model.Name != "PipePackunDenStepA") { positionVectors.Add(new Vector3(verticesArray[i], verticesArray[i + 1], verticesArray[i + 2])); } else { positionVectors.Add(new Vector3(verticesArray[i], verticesArray[i], verticesArray[i])); } } // Generate the VBO for this Shape int vboId; GL.GenBuffers(1, out vboId); GL.BindBuffer(BufferTarget.ArrayBuffer, vboId); GL.BufferData(BufferTarget.ArrayBuffer, sizeof(float) * verticesArray.Length, verticesArray, BufferUsageHint.StaticDraw); // Use LoD 0 as the mesh meshes.Add(new SmMesh(shape.Meshes[0], vboId)); } // Create the bounding box for this model boundingBox = new SmBoundingBox(positionVectors); }
public void InjectMesh(Model input, Syroot.BinaryData.ByteOrder BO) { //Deal With Mesh uint[] theFaces = meshes[0].faces.ToArray(); input.Shapes[0].Meshes[0].SetIndices(theFaces); if (input.Shapes[0].Meshes.Count != 1) { for (int i = 0; i < input.Shapes[0].Meshes.Count; i++) { input.Shapes[0].Meshes.RemoveAt(1); } } input.Shapes[0].Radius = 10000000000f; input.Shapes[0].Meshes[0].SubMeshes.Clear(); Bounding LeeT = new Bounding(); LeeT.Center = new Syroot.Maths.Vector3F(0, 0, 0); LeeT.Extent = new Syroot.Maths.Vector3F(10000000000f, 10000000000f, 10000000000f); for (int i = 0; i < input.Shapes[0].SubMeshBoundings.Count; i++) { input.Shapes[0].SubMeshBoundings[i] = LeeT; } SubMesh Setup = new SubMesh(); Setup.Count = (uint)meshes[0].faces.Count; Setup.Offset = 0; for (int vvv = 0; vvv < 1; vvv++) { input.Shapes[0].Meshes[0].SubMeshes.Add(Setup); } //input.Shapes[0].Name = meshes[0].Name; //Deal with Vertexes VertexBufferHelper helper = new VertexBufferHelper(input.VertexBuffers[0], BO); List <VertexBufferHelperAttrib> atrib = new List <VertexBufferHelperAttrib>(); VertexBufferHelperAttrib vertPos = new VertexBufferHelperAttrib(); vertPos.Name = "_p0"; vertPos.Data = meshes[0].verts.ToArray(); vertPos.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_16_16_16_16_Single; VertexBufferHelperAttrib vertUV = new VertexBufferHelperAttrib(); vertUV.Name = "_u0"; vertUV.Data = meshes[0].uvs.ToArray(); vertUV.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_16_16_Single; VertexBufferHelperAttrib vertUV1 = new VertexBufferHelperAttrib(); //Add UV Layer 1. Copies UVs from UV0 for now. vertUV1.Name = "_u1"; vertUV1.Data = meshes[0].uvs.ToArray(); vertUV1.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_16_16_Single; VertexBufferHelperAttrib vertNorm = new VertexBufferHelperAttrib(); vertNorm.Name = "_n0"; vertNorm.Data = meshes[0].norms.ToArray(); vertNorm.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_10_10_10_2_SNorm; VertexBufferHelperAttrib vertWeight = new VertexBufferHelperAttrib(); //Adds weights. Becomes Zeroed vertWeight.Name = "_w0"; vertWeight.Data = meshes[0].uvs.ToArray(); vertWeight.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_8_8_8_8_UNorm; VertexBufferHelperAttrib vertIndex = new VertexBufferHelperAttrib(); //Adds Index attirbute. Becomes Zeroed vertIndex.Name = "_i0"; vertIndex.Data = meshes[0].uvs.ToArray(); vertIndex.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_8_8_8_8_UInt; VertexBufferHelperAttrib vertTan = new VertexBufferHelperAttrib(); //Adds Tangent attirbute. Becomes Zeroed vertTan.Name = "_t0"; vertTan.Data = meshes[0].uvs.ToArray(); vertTan.Format = Syroot.NintenTools.Bfres.GX2.GX2AttribFormat.Format_8_8_8_8_SNorm; atrib.Add(vertPos); atrib.Add(vertNorm); atrib.Add(vertUV); atrib.Add(vertUV1); atrib.Add(vertWeight); atrib.Add(vertIndex); atrib.Add(vertTan); helper.Attributes = atrib; input.VertexBuffers[0] = helper.ToVertexBuffer(); }
public void SaveVertexBuffer() { if (BFRES.IsWiiU) { BfresWiiU.SaveVertexBuffer(this); return; } VertexBufferHelper helpernx = new VertexBufferHelper(new VertexBuffer(), Syroot.BinaryData.ByteOrder.LittleEndian); List <VertexBufferHelperAttrib> atrib = new List <VertexBufferHelperAttrib>(); UpdateVertices(); foreach (VertexAttribute att in vertexAttributes) { if (att.Name == "_p0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = verts.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_n0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = norms.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_u0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = uv0.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_u1") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = uv1.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_u2") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = uv2.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_w0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = weights.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_i0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = boneInd.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_b0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = bitans.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_t0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = tans.ToArray(); vert.Format = att.Format; atrib.Add(vert); } if (att.Name == "_c0") { VertexBufferHelperAttrib vert = new VertexBufferHelperAttrib(); vert.Name = att.Name; vert.Data = colors.ToArray(); vert.Format = att.Format; atrib.Add(vert); } } if (atrib.Count == 0) { MessageBox.Show("Attributes are empty?"); return; } helpernx.Attributes = atrib; VertexBuffer = helpernx.ToVertexBuffer(); }
public void Read(ResFile TargetWiiUBFRES) { Nodes.Add(TModels); Nodes.Add(TTextures); Nodes.Add(TShaderparam); Nodes.Add(TColoranim); Nodes.Add(TTextureSRT); Nodes.Add(TTexturePat); Nodes.Add(TBonevisabilty); Nodes.Add(TVisualAnim); Nodes.Add(TShapeAnim); Nodes.Add(TSceneAnim); Nodes.Add(TEmbedded); ImageKey = "bfres"; SelectedImageKey = "bfres"; FSKACount = TargetWiiUBFRES.SkeletalAnims.Count; textures.Clear(); foreach (Texture tex in TargetWiiUBFRES.Textures.Values) { string TextureName = tex.Name; FTEX texture = new FTEX(); texture.ReadFTEX(tex); textures.Add(TextureName, texture); TTextures.Nodes.Add(texture); } int ModelCur = 0; //FMDLs -Models- foreach (Model mdl in TargetWiiUBFRES.Models.Values) { FMDL_Model model = new FMDL_Model(); //This will store VBN data and stuff model.Text = mdl.Name; TModels.Nodes.Add(model); model.Node_Array = new int[mdl.Skeleton.MatrixToBoneList.Count]; int nodes = 0; foreach (ushort node in mdl.Skeleton.MatrixToBoneList) { model.Node_Array[nodes] = node; nodes++; } foreach (Syroot.NintenTools.Bfres.Bone bn in mdl.Skeleton.Bones.Values) { Bone bone = new Bone(model.skeleton); bone.Text = bn.Name; bone.boneId = bn.BillboardIndex; bone.parentIndex = bn.ParentIndex; bone.scale = new float[3]; bone.rotation = new float[4]; bone.position = new float[3]; if (bn.FlagsRotation == BoneFlagsRotation.Quaternion) { bone.boneRotationType = 1; } else { bone.boneRotationType = 0; } bone.scale[0] = bn.Scale.X; bone.scale[1] = bn.Scale.Y; bone.scale[2] = bn.Scale.Z; bone.rotation[0] = bn.Rotation.X; bone.rotation[1] = bn.Rotation.Y; bone.rotation[2] = bn.Rotation.Z; bone.rotation[3] = bn.Rotation.W; bone.position[0] = bn.Position.X; bone.position[1] = bn.Position.Y; bone.position[2] = bn.Position.Z; model.skeleton.bones.Add(bone); } model.skeleton.reset(); model.skeleton.update(); //MeshTime!! int ShapeCur = 0; foreach (Shape shp in mdl.Shapes.Values) { Mesh poly = new Mesh(); poly.Text = shp.Name; poly.MaterialIndex = shp.MaterialIndex; poly.matrFlag = shp.VertexSkinCount; poly.fsklindx = shp.BoneIndex; TModels.Nodes[ModelCur].Nodes.Add(poly); //Create a buffer instance which stores all the buffer data VertexBufferHelper helper = new VertexBufferHelper(mdl.VertexBuffers[shp.VertexBufferIndex], TargetWiiUBFRES.ByteOrder); // VertexBufferHelperAttrib uv1 = helper["_u1"]; Vertex v = new Vertex(); foreach (VertexAttrib att in mdl.VertexBuffers[shp.VertexBufferIndex].Attributes.Values) { if (att.Name == "_p0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib position = helper["_p0"]; Syroot.Maths.Vector4F[] vec4Positions = position.Data; foreach (Syroot.Maths.Vector4F p in vec4Positions) { v.pos.Add(new Vector3 { X = p.X, Y = p.Y, Z = p.Z }); } } if (att.Name == "_n0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib normal = helper["_n0"]; Syroot.Maths.Vector4F[] vec4Normals = normal.Data; foreach (Syroot.Maths.Vector4F n in vec4Normals) { v.nrm.Add(new Vector3 { X = n.X, Y = n.Y, Z = n.Z }); } } if (att.Name == "_u0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib uv0 = helper["_u0"]; Syroot.Maths.Vector4F[] vec4uv0 = uv0.Data; foreach (Syroot.Maths.Vector4F u in vec4uv0) { v.uv0.Add(new Vector2 { X = u.X, Y = u.Y }); } } if (att.Name == "_u1") { Console.WriteLine(att.Name); VertexBufferHelperAttrib uv1 = helper["_u1"]; Syroot.Maths.Vector4F[] vec4uv1 = uv1.Data; foreach (Syroot.Maths.Vector4F u in vec4uv1) { v.uv1.Add(new Vector2 { X = u.X, Y = u.Y }); } } if (att.Name == "_u2") { Console.WriteLine(att.Name); VertexBufferHelperAttrib uv2 = helper["_u2"]; Syroot.Maths.Vector4F[] vec4uv2 = uv2.Data; foreach (Syroot.Maths.Vector4F u in vec4uv2) { v.uv2.Add(new Vector2 { X = u.X, Y = u.Y }); } } if (att.Name == "_c0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib c0 = helper["_c0"]; Syroot.Maths.Vector4F[] vec4c0 = c0.Data; foreach (Syroot.Maths.Vector4F c in vec4c0) { v.col.Add(new Vector4 { X = c.X, Y = c.Y, Z = c.Z, W = c.W }); } } if (att.Name == "_t0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib t0 = helper["_t0"]; Syroot.Maths.Vector4F[] vec4t0 = t0.Data; foreach (Syroot.Maths.Vector4F u in vec4t0) { v.tans.Add(new Vector4 { X = u.X, Y = u.Y, Z = u.Z, W = u.W }); } } if (att.Name == "_b0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib b0 = helper["_b0"]; Syroot.Maths.Vector4F[] vec4b0 = b0.Data; foreach (Syroot.Maths.Vector4F u in vec4b0) { v.bitans.Add(new Vector4 { X = u.X, Y = u.Y, Z = u.Z, W = u.W }); } } if (att.Name == "_w0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib w0 = helper["_w0"]; Syroot.Maths.Vector4F[] vec4w0 = w0.Data; foreach (Syroot.Maths.Vector4F w in vec4w0) { v.weights.Add(new Vector4 { X = w.X, Y = w.Y, Z = w.Z, W = w.W }); } } if (att.Name == "_i0") { Console.WriteLine(att.Name); VertexBufferHelperAttrib i0 = helper["_i0"]; Syroot.Maths.Vector4F[] vec4i0 = i0.Data; foreach (Syroot.Maths.Vector4F i in vec4i0) { v.nodes.Add(new Vector4 { X = i.X, Y = i.Y, Z = i.Z, W = i.W }); } } } poly.vertices = v; //shp.Meshes.Count - 1 //For going to the lowest poly LOD mesh int LODCount = 0; uint FaceCount = FaceCount = shp.Meshes[LODCount].IndexCount; uint[] indicesArray = shp.Meshes[LODCount].GetIndices().ToArray(); poly.BoundingCount = shp.SubMeshBoundings.Count; for (int face = 0; face < FaceCount; face++) { poly.faces.Add((int)indicesArray[face] + (int)shp.Meshes[LODCount].FirstVertex); } int AlbedoCount = 0; string TextureName = ""; int id = 0; foreach (TextureRef tex in mdl.Materials[shp.MaterialIndex].TextureRefs) { TextureName = tex.Name; MatTexture texture = new MatTexture(); poly.Nodes.Add(new TreeNode { Text = TextureName }); if (mdl.Materials[shp.MaterialIndex].Samplers[id].Name == "_a0") { if (AlbedoCount == 0) { try { poly.texHashs.Add(textures[TextureName].texture.display); AlbedoCount++; } catch { poly.texHashs.Add(0); } poly.TextureMapTypes.Add("Diffuse"); } } if (mdl.Materials[shp.MaterialIndex].Samplers[id].Name == "_a1") { try { poly.texHashs.Add(textures[TextureName].texture.display); AlbedoCount++; } catch { poly.texHashs.Add(0); } poly.TextureMapTypes.Add("Diffuse_Layer"); } if (mdl.Materials[shp.MaterialIndex].Samplers[id].Name == "_n0") { try { poly.texHashs.Add(textures[TextureName].texture.display); } catch { poly.texHashs.Add(1); } poly.material.HasNormalMap = true; poly.TextureMapTypes.Add("Normal"); } if (mdl.Materials[shp.MaterialIndex].Samplers[id].Name == "_b0") { try { poly.texHashs.Add(textures[TextureName].texture.display); } catch { poly.texHashs.Add(2); } poly.TextureMapTypes.Add("Bake1"); } if (mdl.Materials[shp.MaterialIndex].Samplers[id].Name == "_b1") { try { poly.texHashs.Add(textures[TextureName].texture.display); } catch { poly.texHashs.Add(3); } poly.TextureMapTypes.Add("Bake2"); } id++; texture.Name = TextureName; } poly.material.Name = mdl.Materials[shp.MaterialIndex].Name; foreach (Sampler smp in mdl.Materials[shp.MaterialIndex].Samplers.Values) { SamplerInfo s = new SamplerInfo(); s.WrapModeU = (int)smp.TexSampler.ClampX; s.WrapModeV = (int)smp.TexSampler.ClampY; s.WrapModeW = (int)smp.TexSampler.ClampZ; poly.material.samplerinfo.Add(s); } using (Syroot.BinaryData.BinaryDataReader reader = new Syroot.BinaryData.BinaryDataReader(new MemoryStream(mdl.Materials[shp.MaterialIndex].ShaderParamData))) { reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; foreach (Syroot.NintenTools.Bfres.ShaderParam param in mdl.Materials[shp.MaterialIndex].ShaderParams.Values) { ShaderParam prm = new ShaderParam(); prm.Type = param.Type; switch (param.Type) { case ShaderParamType.Float: reader.Seek(param.DataOffset, SeekOrigin.Begin); prm.Value_float = reader.ReadSingle(); break; case ShaderParamType.Float2: reader.Seek(param.DataOffset, SeekOrigin.Begin); prm.Value_float2 = new Vector2( reader.ReadSingle(), reader.ReadSingle()); break; case ShaderParamType.Float3: reader.Seek(param.DataOffset, SeekOrigin.Begin); prm.Value_float3 = new Vector3( reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); break; case ShaderParamType.Float4: reader.Seek(param.DataOffset, SeekOrigin.Begin); prm.Value_float4 = new Vector4( reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); break; } poly.material.matparam.Add(param.Name, prm); } reader.Close(); } model.poly.Add(poly); ShapeCur++; } models.Add(model); ModelCur++; } }