public void LoadModel(string modelid) { AssetDescription asset; AssetDescription assettex; Scene.RenderFilter filt = Scene.RenderFilter.All; var job = ResourceManager.CreateNewJob($@"Loading mesh"); if (modelid.StartsWith("c")) { asset = AssetLocator.GetChrModel(modelid); assettex = AssetLocator.GetChrTextures(modelid); } else if (modelid.StartsWith("o")) { asset = AssetLocator.GetObjModel(modelid); assettex = AssetLocator.GetNullAsset(); } else { asset = AssetLocator.GetNullAsset(); assettex = AssetLocator.GetNullAsset(); } var res = ResourceManager.GetResource <Resource.FlverResource>(asset.AssetVirtualPath); if (_renderMesh != null) { //RenderScene.RemoveObject(_renderMesh); } _renderMesh = MeshRenderableProxy.MeshRenderableFromFlverResource(RenderScene, res); //_renderMesh.DrawFilter = filt; _renderMesh.World = Matrix4x4.Identity; _flverhandle = res; _currentModel = modelid; if (!res.IsLoaded || res.AccessLevel != AccessLevel.AccessFull) { if (asset.AssetArchiveVirtualPath != null) { job.AddLoadArchiveTask(asset.AssetArchiveVirtualPath, AccessLevel.AccessFull, false, Resource.ResourceManager.ResourceType.Flver); } else if (asset.AssetVirtualPath != null) { job.AddLoadFileTask(asset.AssetVirtualPath, AccessLevel.AccessFull); } if (assettex.AssetArchiveVirtualPath != null) { job.AddLoadArchiveTask(assettex.AssetArchiveVirtualPath, AccessLevel.AccessGPUOptimizedOnly, false, Resource.ResourceManager.ResourceType.Texture); } else if (assettex.AssetVirtualPath != null) { job.AddLoadFileTask(assettex.AssetVirtualPath, AccessLevel.AccessGPUOptimizedOnly); } _loadingTask = job.StartJobAsync(); } }
public void LoadFlver(FLVER2 flver, MeshRenderableProxy proxy) { var meshesNode = new NamedEntity(this, null, "Meshes"); Objects.Add(meshesNode); RootObject.AddChild(meshesNode); for (int i = 0; i < flver.Meshes.Count; i++) { var meshnode = new NamedEntity(this, flver.Meshes[i], $@"mesh_{i}"); if (proxy.Submeshes.Count > 0) { meshnode.RenderSceneMesh = proxy.Submeshes[i]; proxy.Submeshes[i].SetSelectable(meshnode); } Objects.Add(meshnode); meshesNode.AddChild(meshnode); } var materialsNode = new NamedEntity(this, null, "Materials"); Objects.Add(materialsNode); RootObject.AddChild(materialsNode); for (int i = 0; i < flver.Materials.Count; i++) { var matnode = new Entity(this, flver.Materials[i]); Objects.Add(matnode); materialsNode.AddChild(matnode); } var layoutsNode = new NamedEntity(this, null, "Layouts"); Objects.Add(layoutsNode); RootObject.AddChild(layoutsNode); for (int i = 0; i < flver.BufferLayouts.Count; i++) { var laynode = new NamedEntity(this, flver.BufferLayouts[i], $@"layout_{i}"); Objects.Add(laynode); layoutsNode.AddChild(laynode); } var bonesNode = new NamedEntity(this, null, "Bones"); Objects.Add(bonesNode); RootObject.AddChild(bonesNode); var boneEntList = new List <TransformableNamedEntity>(); for (int i = 0; i < flver.Bones.Count; i++) { var bonenode = new TransformableNamedEntity(this, flver.Bones[i], flver.Bones[i].Name); bonenode.RenderSceneMesh = Universe.GetBoneDrawable(this, bonenode); Objects.Add(bonenode); boneEntList.Add(bonenode); } for (int i = 0; i < flver.Bones.Count; i++) { if (flver.Bones[i].ParentIndex == -1) { bonesNode.AddChild(boneEntList[i]); } else { boneEntList[flver.Bones[i].ParentIndex].AddChild(boneEntList[i]); } } // Add dummy polys attached to bones var dmysNode = new NamedEntity(this, null, "DummyPolys"); Objects.Add(dmysNode); RootObject.AddChild(dmysNode); for (int i = 0; i < flver.Dummies.Count; i++) { var dmynode = new TransformableNamedEntity(this, flver.Dummies[i], $@"dmy_{i}"); dmynode.RenderSceneMesh = Universe.GetDummyPolyDrawable(this, dmynode); Objects.Add(dmynode); dmysNode.AddChild(dmynode); } }
public void OnGui(GameType game) { if (ImGui.Begin("Navmesh Build")) { if (game != GameType.DarkSoulsIII) { ImGui.Text("Navmesh building only supported for DS3"); ImGui.End(); return; } var sel = _selection.GetSingleFilteredSelection <Entity>(); if (sel != null && sel.RenderSceneMesh != null && sel.RenderSceneMesh is MeshRenderableProxy mrp && mrp.ResourceHandle != null && mrp.ResourceHandle is ResourceHandle <HavokCollisionResource> col) { ImGui.LabelText("value", "lable"); ImGui.DragFloat("Cell size", ref Cellsize, 0.005f, 0.0f); ImGui.DragFloat("Cell height", ref Cellheight, 0.005f, 0.0f); ImGui.DragFloat("Slope Angle", ref SlopeAngle, 0.5f, 0.0f, 85.0f); ImGui.DragFloat("Agent Height", ref AgentHeight, 0.005f, 0.0f); ImGui.DragFloat("Agent Climb", ref AgentClimb, 0.005f, 0.0f); ImGui.DragFloat("Agent Radius", ref AgentRadius, 0.005f, 0.0f); ImGui.DragInt("Min Region Area", ref MinRegionArea, 1, 0); if (ImGui.Button("Build Navmesh")) { var buildverts = new List <Vector3>(); var buildindices = new List <int>(); int vbase = 0; foreach (var sm in col.Get().GPUMeshes) { buildverts.AddRange(sm.PickingVertices); foreach (var i in sm.PickingIndices) { buildindices.Add(i + vbase); } vbase += sm.PickingVertices.Length; } //var sm = col.Resource.Get().GPUMeshes[0]; var bv = buildverts.ToArray(); //buildindices.Reverse(); var bi = buildindices.ToArray(); foreach (var i in bi) { var x = bv[i]; } NavGen.SetNavmeshBuildParams(Cellsize, Cellheight, SlopeAngle, AgentHeight, AgentClimb, AgentRadius, MinRegionArea); var p = new hkaiNavMeshBuilder.BuildParams(); p.Cellsize = Cellsize; p.Cellheight = Cellheight; p.SlopeAngle = SlopeAngle; p.AgentHeight = AgentHeight; p.AgentClimb = AgentClimb; p.AgentRadius = AgentRadius; p.MinRegionArea = MinRegionArea; var builder = new hkaiNavMeshBuilder(); var built = builder.BuildNavmesh(p, buildverts, buildindices); BuildSuccess = (built != null); DidBuild = true; if (BuildSuccess) { if (_previewMesh != null) { _previewMesh.Dispose(); } var res = HavokNavmeshResource.ResourceFromNavmeshRoot(built); _previewResource = ResourceHandle <HavokNavmeshResource> .TempHandleFromResource(res); _previewMesh = MeshRenderableProxy.MeshRenderableFromHavokNavmeshResource(_scene, _previewResource, true); _previewMesh.World = mrp.World; // Do a test save var path = $@"{_locator.GameModDirectory}\navout\test.hkx"; using (FileStream s2 = File.Create(path)) { BinaryWriterEx bw = new BinaryWriterEx(false, s2); var s = new HKX2.PackFileSerializer(); s.Serialize(built, bw); } /*vcount = NavGen.GetMeshVertCount(); * icount = NavGen.GetMeshTriCount(); * * if (icount > 0) * { * // Make preview mesh * ushort[] verts = new ushort[vcount * 3]; * ushort[] indices = new ushort[icount * 3 * 2]; * NavGen.GetMeshVerts(verts); * NavGen.GetMeshTris(indices); * * Vector3[] bounds = new Vector3[2]; * NavGen.GetBoundingBox(bounds); * * if (_previewMesh != null) * { * _previewMesh.UnregisterWithScene(); * _previewMesh = null; * } * * var nvm = new Scene.NvmRenderer(bounds[0], bounds[1], Cellsize, Cellheight, verts, indices); * _previewMesh = new Scene.Mesh(Scene, nvm.Bounds, nvm); * _previewMesh.Highlighted = true; * }*/ } } if (DidBuild) { if (BuildSuccess) { ImGui.Text("Successfully built navmesh"); ImGui.Text($@"Vertex count: {vcount}"); ImGui.Text($@"Triangle count: {icount}"); } else { ImGui.Text("Navmesh build failed"); } } } else { ImGui.Text("Select a single collision mesh to generate a navmesh"); } }