From 11c3b2d826819eac6e3947a4daffb726186ea908 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Sun, 9 May 2021 14:54:51 +0200 Subject: [PATCH] Defined structs for BSP SubModels and Nodes, which will allow for a more systematic conversion to Unity meshes. Also moved more marshalling code into the data classes, which seems like a more natural place. --- Assets/Scripts/Data/QModel.cs | 43 +++++++++++++++++++ Assets/Scripts/Modules/BrushModel.cs | 5 ++- .../Scripts/Modules/RenderModule.Interop.cs | 4 +- Assets/Scripts/Modules/RenderModule.cs | 4 +- 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/Assets/Scripts/Data/QModel.cs b/Assets/Scripts/Data/QModel.cs index e459e8d..37a05ef 100644 --- a/Assets/Scripts/Data/QModel.cs +++ b/Assets/Scripts/Data/QModel.cs @@ -32,6 +32,7 @@ public class QModel public int numSubModels; public IntPtr subModels; // Array of dmodel_t + public QSubModel[] SubModels => subModels.ToStructArray(numSubModels); public int numPlanes; public IntPtr planes; // Array of mplane_t @@ -53,6 +54,7 @@ public class QModel public int numSurfaces; public IntPtr surfaces; // Array of msurface_t + public QSurface[] Surfaces => surfaces.ToStructArray(numSurfaces); public int numSurfEdges; public IntPtr surfEdges; // Array of int @@ -222,6 +224,47 @@ public struct QSTVert public int s, t; } +/// +/// Managed equivalent of dmodel_t +/// +[StructLayout(LayoutKind.Sequential, Pack = 0)] +public struct QSubModel +{ + public QVec3 mins, maxs; + public QVec3 origin; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxMapHulls)] public int[] headNode; + public int visLeafs; + public int firstFace, numFaces; + + public QNode GetHeadNode(QModel model) + { + IntPtr nodePtr = IntPtr.Add(model.nodes, headNode[0]); + return Marshal.PtrToStructure(nodePtr); + } +} + +/// +/// Managed equivalent of mnode_t +/// +[StructLayout(LayoutKind.Sequential, Pack = 0)] +public struct QNode +{ + public int contents; // 0 for nodes, negative for leafs + public int visFrame; + public QVec3 mins, maxs; + public IntPtr parent; // Pointer to mnode_t + public IntPtr plane; // Pointer to mplane_t + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public IntPtr[] children; // Array of pointers to mnode_t + public uint firstSurface; + public uint numSurfaces; + + public QNode[] Children => new[] + { + Marshal.PtrToStructure(children[0]), + Marshal.PtrToStructure(children[1]), + }; +} + /// /// Managed equivalent of msurface_t /// diff --git a/Assets/Scripts/Modules/BrushModel.cs b/Assets/Scripts/Modules/BrushModel.cs index e2fb2b6..39a1ecf 100644 --- a/Assets/Scripts/Modules/BrushModel.cs +++ b/Assets/Scripts/Modules/BrushModel.cs @@ -12,8 +12,11 @@ public class BrushModel this.name = name; } - public void ImportMeshData(QModel model, QSurface[] surfaces) + public void ImportMeshData(QModel model) { + var subModels = model.SubModels; + var surfaces = model.Surfaces; + List vertices = new List(); List textureUVs = new List(); List lightmapUVs = new List(); diff --git a/Assets/Scripts/Modules/RenderModule.Interop.cs b/Assets/Scripts/Modules/RenderModule.Interop.cs index 0489cfc..b155fb3 100644 --- a/Assets/Scripts/Modules/RenderModule.Interop.cs +++ b/Assets/Scripts/Modules/RenderModule.Interop.cs @@ -92,9 +92,7 @@ public partial class RenderModule: CallbackHandler if (model == null || model.type != QModelType.Brush) return -1; - var surfaces = model.surfaces.ToStructArray(model.numSurfaces); - - return GetSelf(target).UploadBrushModel(model, surfaces); + return GetSelf(target).UploadBrushModel(model); } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] diff --git a/Assets/Scripts/Modules/RenderModule.cs b/Assets/Scripts/Modules/RenderModule.cs index 9a851b9..7f8d493 100644 --- a/Assets/Scripts/Modules/RenderModule.cs +++ b/Assets/Scripts/Modules/RenderModule.cs @@ -119,12 +119,12 @@ public partial class RenderModule return 1; } - private int UploadBrushModel(QModel model, QSurface[] surfaces) + private int UploadBrushModel(QModel model) { Debug.Log($"Brush model '{model.name}' with {model.numVertices} vertices, {model.numEdges} edges, {model.numSurfaces} surfaces"); var brushModel = new BrushModel(model.name); - brushModel.ImportMeshData(model, surfaces); + brushModel.ImportMeshData(model); return 1; }