private void ReloadModel(Model model) { if (Renderer != null) { Renderer.Meshes.Clear(); } DrawableContainer.Drawables.Clear(); Renderer = new GFBMDL_Render(); Renderer.GfbmdlFile = this; DrawableContainer.Drawables.Add(Renderer); Nodes.Clear(); Model = new GFLXModel(); Model.LoadFile(model, this, Renderer); TreeNode SkeletonWrapper = new TreeNode("Skeleton"); TreeNode MaterialFolderWrapper = new TreeNode("Materials"); TreeNode VisualGroupWrapper = new TreeNode("Visual Groups"); TreeNode Textures = new TreeNode("Textures"); if (Model.Skeleton.bones.Count > 0) { Nodes.Add(SkeletonWrapper); DrawableContainer.Drawables.Add(Model.Skeleton); foreach (var bone in Model.Skeleton.bones) { if (bone.Parent == null) { SkeletonWrapper.Nodes.Add(bone); } } } List <string> loadedTextures = new List <string>(); for (int i = 0; i < Model.Textures.Count; i++) { foreach (var bntx in PluginRuntime.bntxContainers) { if (bntx.Textures.ContainsKey(Model.Textures[i]) && !loadedTextures.Contains(Model.Textures[i])) { TreeNode tex = new TreeNode(Model.Textures[i]); tex.ImageKey = "texture"; tex.SelectedImageKey = "texture"; tex.Tag = bntx.Textures[Model.Textures[i]]; Textures.Nodes.Add(tex); loadedTextures.Add(Model.Textures[i]); } } } loadedTextures.Clear(); Nodes.Add(MaterialFolderWrapper); Nodes.Add(VisualGroupWrapper); if (Textures.Nodes.Count > 0) { Nodes.Add(Textures); } for (int i = 0; i < Model.GenericMaterials.Count; i++) { MaterialFolderWrapper.Nodes.Add(Model.GenericMaterials[i]); } for (int i = 0; i < Model.GenericMeshes.Count; i++) { VisualGroupWrapper.Nodes.Add(Model.GenericMeshes[i]); } }
public void LoadFile(Model model, GFBMDL file, GFBMDL_Render Renderer) { Model = model; ParentFile = file; Renderer.Meshes.Clear(); for (int m = 0; m < Model.Materials?.Count; m++) { GenericMaterials.Add(new GFLXMaterialData(this, Model.Materials[m])); } List <int> SkinningIndices = new List <int>(); for (int b = 0; b < Model.Bones?.Count; b++) { var bone = Model.Bones[b]; Skeleton.bones.Add(new GFLXBone(this, bone)); if (bone.RigidCheck == null) { SkinningIndices.Add(b); } } Skeleton.reset(); Skeleton.update(); for (int g = 0; g < Model.Groups?.Count; g++) { var group = Model.Groups[g]; var mesh = Model.Meshes[g]; OpenTK.Matrix4 transform = OpenTK.Matrix4.Identity; GFLXMesh genericMesh = new GFLXMesh(this, group, mesh); genericMesh.Checked = true; genericMesh.ImageKey = "model"; genericMesh.SelectedImageKey = "model"; int boneIndex = (int)group.BoneIndex; if (boneIndex < Skeleton.bones.Count && boneIndex > 0) { genericMesh.BoneIndex = boneIndex; transform = Skeleton.bones[boneIndex].Transform; genericMesh.Text = Skeleton.bones[boneIndex].Text; } // if (group.MeshID < Skeleton.bones.Count && group.MeshID > 0) // genericMesh.Text = Skeleton.bones[(int)group.MeshID].Text; Renderer.Meshes.Add(genericMesh); GenericMeshes.Add(genericMesh); //Load the vertex data genericMesh.Transform = transform; genericMesh.vertices = GFLXMeshBufferHelper.LoadVertexData(mesh, transform, SkinningIndices); genericMesh.FlipUvsVertical(); //Load faces for (int p = 0; p < mesh.Polygons?.Count; p++) { var poly = mesh.Polygons[p]; var polygonGroup = new STGenericPolygonGroup(); polygonGroup.MaterialIndex = (int)poly.MaterialIndex; genericMesh.PolygonGroups.Add(polygonGroup); if (GenericMaterials.Count > poly.MaterialIndex) { polygonGroup.Material = GenericMaterials[(int)poly.MaterialIndex]; } for (int f = 0; f < poly.Faces?.Count; f++) { polygonGroup.faces.Add((int)poly.Faces[f]); } } } }