public void SaveShape() { if (!BFRES.IsWiiU) { Shape = BfresSwitch.SaveShape(this); } else { ShapeU = BfresWiiU.SaveShape(this); } }
public void SaveShape(bool IsWiiU) { if (IsWiiU) { ShapeU = BfresWiiU.SaveShape(this); } else { Shape = BfresSwitch.SaveShape(this); } }
public FMDL NewModel(bool AddTreeNode = true) { FMDL fmdl = new FMDL(); if (IsWiiU) { fmdl.ModelU = new ResU.Model(); //Create skeleton with empty bone var skeleton = new ResU.Skeleton(); //Create skeleton with empty bone skeleton.Bones.Add("Root", new ResU.Bone() { Name = "Root" }); fmdl.ModelU.Skeleton = skeleton; var shape = new ResU.Shape() { Name = "NewShape" }; shape.CreateEmptyMesh(); var VertexBuffer = new ResU.VertexBuffer(); VertexBuffer.CreateEmptyVertexBuffer(); fmdl.ModelU.VertexBuffers.Add(VertexBuffer); fmdl.ModelU.Shapes.Add("NewShape", shape); fmdl.ModelU.Materials.Add("NewMaterial", new ResU.Material() { Name = "NewMaterial", RenderState = new ResU.RenderState(), }); BfresWiiU.ReadModel(fmdl, fmdl.ModelU); ((BFRES)Parent).DrawableContainer.Drawables.Add(fmdl.Skeleton); } else { fmdl.Model = new ResNX.Model(); //Create skeleton with empty bone var skeleton = new ResNX.Skeleton(); //Create skeleton with empty bone skeleton.Bones.Add(new ResNX.Bone() { Name = "Root" }); fmdl.Model.Skeleton = skeleton; var shape = new ResNX.Shape() { Name = "NewShape" }; shape.CreateEmptyMesh(); fmdl.Model.Shapes.Add(shape); fmdl.Model.Materials.Add(new ResNX.Material() { Name = "NewMaterial" }); var VertexBuffer = new ResNX.VertexBuffer(); VertexBuffer.CreateEmptyVertexBuffer(); fmdl.Model.VertexBuffers.Add(VertexBuffer); BfresSwitch.ReadModel(fmdl, fmdl.Model); ((BFRES)Parent).DrawableContainer.Drawables.Add(fmdl.Skeleton); } if (AddTreeNode) { AddNode(fmdl, "NewModel"); } return(fmdl); }
public void NewModel() { FMDL fmdl = new FMDL(); if (IsWiiU) { fmdl.ModelU = new ResU.Model(); //Create skeleton with empty bone var skeleton = new ResU.Skeleton(); //Create skeleton with empty bone skeleton.Bones.Add("Root", new ResU.Bone() { Name = "Root" }); fmdl.ModelU.Skeleton = skeleton; var shape = new ResU.Shape() { Name = "NewShape" }; shape.CreateEmptyMesh(); var VertexBuffer = new ResU.VertexBuffer(); VertexBuffer.CreateEmptyVertexBuffer(); fmdl.ModelU.VertexBuffers.Add(VertexBuffer); fmdl.ModelU.Shapes.Add("NewShape", shape); fmdl.ModelU.Materials.Add("NewMaterial", new ResU.Material() { Name = "NewMaterial" }); BfresWiiU.ReadModel(fmdl, fmdl.ModelU); ((BFRES)Parent).AddSkeletonDrawable(fmdl.Skeleton); } else { fmdl.Model = new ResNX.Model(); //Create skeleton with empty bone var skeleton = new ResNX.Skeleton(); //Create skeleton with empty bone skeleton.Bones.Add(new ResNX.Bone() { Name = "Root" }); fmdl.Model.Skeleton = skeleton; var shape = new ResNX.Shape() { Name = "NewShape" }; shape.CreateEmptyMesh(); fmdl.Model.Shapes.Add(shape); fmdl.Model.Materials.Add(new ResNX.Material() { Name = "NewMaterial" }); var VertexBuffer = new ResNX.VertexBuffer(); VertexBuffer.CreateEmptyVertexBuffer(); fmdl.Model.VertexBuffers.Add(VertexBuffer); BfresSwitch.ReadModel(fmdl, fmdl.Model); ((BFRES)Parent).AddSkeletonDrawable(fmdl.Skeleton); } AddNode(fmdl, "NewModel"); }
public void Replace(object sender, EventArgs args) { bool IsWiiU = (GetResFileU() != null); OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Supported Formats|*.bfobj;*.fbx;*.dae; *.obj;|" + "Bfres Object (shape/vertices) |*.bfobj|" + "FBX |*.fbx|" + "DAE |*.dae|" + "OBJ |*.obj|" + "All files(*.*)|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { string ext = System.IO.Path.GetExtension(ofd.FileName); ext = ext.ToLower(); switch (ext) { case ".bfobj": if (IsWiiU) { var shp = new ResU.Shape(); shp.Import(ofd.FileName, VertexBufferU, GetResFileU()); shp.Name = Text; shp.MaterialIndex = (ushort)MaterialIndex; BfresWiiU.ReadShapesVertices(this, shp, VertexBufferU, GetParentModel()); } else { Shape shp = new Shape(); shp.Import(ofd.FileName, VertexBuffer); shp.Name = Text; shp.MaterialIndex = (ushort)MaterialIndex; BfresSwitch.ReadShapesVertices(this, shp, VertexBuffer, GetParentModel()); } break; default: AssimpData assimp = new AssimpData(); assimp.LoadFile(ofd.FileName); AssimpMeshSelector selector = new AssimpMeshSelector(); selector.LoadMeshes(assimp, Index); if (selector.ShowDialog() == DialogResult.OK) { if (assimp.objects.Count == 0) { MessageBox.Show("No models found!"); return; } BfresModelImportSettings settings = new BfresModelImportSettings(); settings.SetModelAttributes(assimp.objects[0]); if (settings.ShowDialog() == DialogResult.OK) { STGenericObject obj = selector.GetSelectedMesh(); Cursor.Current = Cursors.WaitCursor; VertexBufferIndex = obj.VertexBufferIndex; vertices = obj.vertices; CreateBoneList(obj, (FMDL)Parent.Parent); CreateIndexList(obj, (FMDL)Parent.Parent); VertexSkinCount = obj.GetMaxSkinInfluenceCount(); vertexAttributes = settings.CreateNewAttributes(); ApplyImportSettings(settings, GetMaterial()); lodMeshes = obj.lodMeshes; CreateNewBoundingBoxes(); SaveShape(IsWiiU); SaveVertexBuffer(); Cursor.Current = Cursors.Default; } } break; } UpdateVertexData(); } }
//Function addes shapes, vertices and meshes public void AddOjects(string FileName, ResFile resFileNX, ResU.ResFile resFileU, bool Replace = true) { int totalSkinCountLimiter = 0; bool IsWiiU = (resFileU != null); if (shapes.Count > 0) { totalSkinCountLimiter = shapes[0].VertexSkinCount; } int MatStartIndex = materials.Count; string ext = System.IO.Path.GetExtension(FileName); ext = ext.ToLower(); switch (ext) { case ".bfobj": Cursor.Current = Cursors.WaitCursor; if (Replace) { shapes.Clear(); Nodes["FshpFolder"].Nodes.Clear(); } if (IsWiiU) { var shpS = new ResU.Shape(); var vertexBufferU = new ResU.VertexBuffer(); shpS.Import(FileName, vertexBufferU, resFileU); FSHP shapeS = new FSHP(); shapeS.ShapeU = shpS; BfresWiiU.ReadShapesVertices(shapeS, shpS, vertexBufferU, this); shapes.Add(shapeS); Nodes["FshpFolder"].Nodes.Add(shapeS); } else { Shape shpS = new Shape(); VertexBuffer vertexBuffer = new VertexBuffer(); shpS.Import(FileName, vertexBuffer); FSHP shapeS = new FSHP(); shapeS.Shape = shpS; BfresSwitch.ReadShapesVertices(shapeS, shpS, vertexBuffer, this); shapes.Add(shapeS); Nodes["FshpFolder"].Nodes.Add(shapeS); } IsEdited = true; Cursor.Current = Cursors.Default; break; case ".bfmdl": Cursor.Current = Cursors.WaitCursor; if (Replace) { shapes.Clear(); Nodes["FshpFolder"].Nodes.Clear(); materials.Clear(); Nodes["FmatFolder"].Nodes.Clear(); } if (IsWiiU) { var mdlU = new ResU.Model(); mdlU.Import(FileName, resFileU); mdlU.Name = Text; BfresWiiU.ReadModel(this, mdlU); } else { Model mdl = new Model(); mdl.Import(FileName, resFileNX); mdl.Name = Text; Console.WriteLine(mdl.ShapeCount); Console.WriteLine(mdl.MaterialCount); Console.WriteLine(mdl.VertexBufferCount); Console.WriteLine(mdl.Skeleton.Bones.Count); BfresSwitch.ReadModel(this, mdl); } IsEdited = true; Cursor.Current = Cursors.Default; break; case ".csv": CsvModel csvModel = new CsvModel(); csvModel.LoadFile(new System.IO.FileStream(FileName, System.IO.FileMode.Open), true); if (csvModel.objects.Count == 0) { MessageBox.Show("No models found!"); return; } BfresModelImportSettings csvsettings = new BfresModelImportSettings(); csvsettings.DisableMaterialEdits(); csvsettings.SkinCountLimit = totalSkinCountLimiter; csvsettings.SetModelAttributes(csvModel.objects[0]); if (csvsettings.ShowDialog() == DialogResult.OK) { if (Replace) { shapes.Clear(); Nodes["FshpFolder"].Nodes.Clear(); } Cursor.Current = Cursors.WaitCursor; foreach (STGenericObject obj in csvModel.objects) { FSHP shape = new FSHP(); Nodes["FshpFolder"].Nodes.Add(shape); shapes.Add(shape); shape.VertexBufferIndex = shapes.Count; shape.vertices = obj.vertices; shape.MaterialIndex = 0; shape.vertexAttributes = csvsettings.CreateNewAttributes(); shape.BoneIndex = 0; shape.Text = obj.ObjectName; shape.lodMeshes = obj.lodMeshes; shape.CreateNewBoundingBoxes(); shape.CreateBoneList(obj, this); shape.CreateIndexList(obj, this); //Todo find better way. Currently uses import settings now shape.ApplyImportSettings(csvsettings, GetMaterial(shape.MaterialIndex)); shape.VertexSkinCount = obj.GetMaxSkinInfluenceCount(); shape.BoneIndices = shape.GetIndices(Skeleton); shape.SaveShape(IsWiiU); shape.SaveVertexBuffer(); if (IsWiiU) { shape.ShapeU.SubMeshBoundingIndices = new List <ushort>(); shape.ShapeU.SubMeshBoundingIndices.Add(0); shape.ShapeU.SubMeshBoundingNodes = new List <ResU.BoundingNode>(); shape.ShapeU.SubMeshBoundingNodes.Add(new ResU.BoundingNode() { LeftChildIndex = 0, NextSibling = 0, SubMeshIndex = 0, RightChildIndex = 0, Unknown = 0, SubMeshCount = 1, }); } if (IsWiiU) { BfresWiiU.ReadShapesVertices(shape, shape.ShapeU, shape.VertexBufferU, this); } else { BfresSwitch.ReadShapesVertices(shape, shape.Shape, shape.VertexBuffer, this); } } Cursor.Current = Cursors.Default; } IsEdited = true; break; default: AssimpData assimp = new AssimpData(); assimp.LoadFile(FileName); if (assimp.objects.Count == 0) { MessageBox.Show("No models found!"); return; } BfresModelImportSettings settings = new BfresModelImportSettings(); settings.SetModelAttributes(assimp.objects[0]); if (settings.ShowDialog() == DialogResult.OK) { bool UseMats = settings.ExternalMaterialPath != string.Empty; if (Replace) { shapes.Clear(); Nodes["FshpFolder"].Nodes.Clear(); } Cursor.Current = Cursors.WaitCursor; if (Replace && UseMats) { materials.Clear(); Nodes["FmatFolder"].Nodes.Clear(); MatStartIndex = 0; } if (UseMats) { foreach (STGenericMaterial mat in assimp.materials) { FMAT fmat = new FMAT(); if (IsWiiU) { fmat.MaterialU = new ResU.Material(); fmat.MaterialU.Import(settings.ExternalMaterialPath, resFileU); BfresWiiU.ReadMaterial(fmat, fmat.MaterialU); } else { fmat.Material = new Material(); fmat.Material.Import(settings.ExternalMaterialPath); fmat.ReadMaterial(fmat.Material); } fmat.Text = mat.Text; //Setup placeholder textures //Note we can't add/remove samplers so we must fill these slots foreach (var t in fmat.TextureMaps) { t.wrapModeS = 0; t.wrapModeT = 0; switch (t.Type) { case STGenericMatTexture.TextureType.Diffuse: t.Name = "Basic_Alb"; break; case STGenericMatTexture.TextureType.Emission: t.Name = "Basic_Emm"; break; case STGenericMatTexture.TextureType.Normal: t.Name = "Basic_Nrm"; break; case STGenericMatTexture.TextureType.Specular: t.Name = "Basic_Spm"; break; case STGenericMatTexture.TextureType.SphereMap: t.Name = "Basic_Sphere"; break; case STGenericMatTexture.TextureType.Metalness: t.Name = "Basic_Mtl"; break; case STGenericMatTexture.TextureType.Roughness: t.Name = "Basic_Rgh"; break; case STGenericMatTexture.TextureType.MRA: t.Name = "Basic_MRA"; break; case STGenericMatTexture.TextureType.Shadow: t.Name = "Basic_Bake_st0"; break; case STGenericMatTexture.TextureType.Light: t.Name = "Basic_Bake_st1"; break; } } if (PluginRuntime.bntxContainers.Count > 0 && Parent != null) { foreach (var node in Parent.Parent.Nodes) { if (node is BNTX) { var bntx = (BNTX)node; bntx.ImportBasicTextures("Basic_Alb"); bntx.ImportBasicTextures("Basic_Nrm"); bntx.ImportBasicTextures("Basic_Spm"); bntx.ImportBasicTextures("Basic_Sphere"); bntx.ImportBasicTextures("Basic_Mtl"); bntx.ImportBasicTextures("Basic_Rgh"); bntx.ImportBasicTextures("Basic_MRA"); bntx.ImportBasicTextures("Basic_Bake_st0"); bntx.ImportBasicTextures("Basic_Bake_st1"); bntx.ImportBasicTextures("Basic_Emm"); } } } if (PluginRuntime.ftexContainers.Count > 0 && Parent != null) { foreach (var node in Parent.Parent.Nodes) { if (node is BFRESGroupNode) { if (((BFRESGroupNode)node).Type == BRESGroupType.Textures) { var ftexCont = (BFRESGroupNode)node; ftexCont.ImportBasicTextures("Basic_Alb"); ftexCont.ImportBasicTextures("Basic_Nrm"); ftexCont.ImportBasicTextures("Basic_Spm"); ftexCont.ImportBasicTextures("Basic_Sphere"); ftexCont.ImportBasicTextures("Basic_Mtl"); ftexCont.ImportBasicTextures("Basic_Rgh"); ftexCont.ImportBasicTextures("Basic_MRA"); ftexCont.ImportBasicTextures("Basic_Bake_st0"); ftexCont.ImportBasicTextures("Basic_Bake_st1"); ftexCont.ImportBasicTextures("Basic_Emm"); } } } } foreach (var tex in mat.TextureMaps) { foreach (var t in fmat.TextureMaps) { if (t.Type == tex.Type) { t.Name = tex.Name; t.wrapModeS = tex.wrapModeS; t.wrapModeT = tex.wrapModeT; t.wrapModeW = tex.wrapModeW; t.Type = tex.Type; } } } List <string> keyList = new List <string>(materials.Keys); fmat.Text = Utils.RenameDuplicateString(keyList, fmat.Text); if (IsWiiU) { fmat.MaterialU.Name = Text; fmat.SetMaterial(fmat.MaterialU, resFileU); } else { fmat.Material.Name = Text; fmat.SetMaterial(fmat.Material); } materials.Add(fmat.Text, fmat); Nodes["FmatFolder"].Nodes.Add(fmat); } } if (settings.ImportBones) { if (assimp.skeleton.bones.Count > 0) { Skeleton.bones.Clear(); Skeleton.node.Nodes.Clear(); if (IsWiiU) { BfresWiiU.SaveSkeleton(Skeleton, assimp.skeleton.bones); } else { BfresSwitch.SaveSkeleton(Skeleton, assimp.skeleton.bones); } } } if (materials.Count <= 0) { //Force material creation if there is none present FMAT fmat = new FMAT(); fmat.Text = "NewMaterial"; materials.Add(fmat.Text, fmat); Nodes["FmatFolder"].Nodes.Add(fmat); if (IsWiiU) { fmat.MaterialU = new ResU.Material(); fmat.MaterialU.Name = "NewMaterial"; BfresWiiU.ReadMaterial(fmat, fmat.MaterialU); } else { fmat.Material = new Material(); fmat.Material.Name = "NewMaterial"; fmat.ReadMaterial(fmat.Material); } } foreach (STGenericObject obj in assimp.objects) { FSHP shape = new FSHP(); Nodes["FshpFolder"].Nodes.Add(shape); shapes.Add(shape); shape.VertexBufferIndex = shapes.Count; shape.vertices = obj.vertices; shape.vertexAttributes = settings.CreateNewAttributes(); shape.BoneIndex = obj.BoneIndex; STConsole.WriteLine(Text + " " + obj.MaterialIndex); if (UseMats) { shape.MaterialIndex = obj.MaterialIndex + MatStartIndex; } else { shape.MaterialIndex = 0; } if (shape.MaterialIndex >= materials.Count) { shape.MaterialIndex = 0; } shape.Text = obj.ObjectName; shape.lodMeshes = obj.lodMeshes; shape.CreateNewBoundingBoxes(); shape.CreateBoneList(obj, this); shape.CreateIndexList(obj, this); shape.ApplyImportSettings(settings, GetMaterial(shape.MaterialIndex)); shape.VertexSkinCount = obj.GetMaxSkinInfluenceCount(); shape.BoneIndices = shape.GetIndices(Skeleton); shape.SaveShape(IsWiiU); shape.SaveVertexBuffer(); if (IsWiiU) { shape.ShapeU.SubMeshBoundingIndices = new List <ushort>(); shape.ShapeU.SubMeshBoundingIndices.Add(0); shape.ShapeU.SubMeshBoundingNodes = new List <ResU.BoundingNode>(); shape.ShapeU.SubMeshBoundingNodes.Add(new ResU.BoundingNode() { LeftChildIndex = 0, NextSibling = 0, SubMeshIndex = 0, RightChildIndex = 0, Unknown = 0, SubMeshCount = 1, }); } List <string> keyList = shapes.Select(o => o.Text).ToList(); shape.Text = Utils.RenameDuplicateString(keyList, shape.Text); if (IsWiiU) { BfresWiiU.ReadShapesVertices(shape, shape.ShapeU, shape.VertexBufferU, this); } else { BfresSwitch.ReadShapesVertices(shape, shape.Shape, shape.VertexBuffer, this); } } IsEdited = true; Cursor.Current = Cursors.Default; } break; } if (IsEdited) { UpdateVertexData(); } }