Browse Source

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.

console
Nico de Poel 5 years ago
parent
commit
11c3b2d826
  1. 43
      Assets/Scripts/Data/QModel.cs
  2. 5
      Assets/Scripts/Modules/BrushModel.cs
  3. 4
      Assets/Scripts/Modules/RenderModule.Interop.cs
  4. 4
      Assets/Scripts/Modules/RenderModule.cs

43
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<QSubModel>(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<QSurface>(numSurfaces);
public int numSurfEdges;
public IntPtr surfEdges; // Array of int
@ -222,6 +224,47 @@ public struct QSTVert
public int s, t;
}
/// <summary>
/// Managed equivalent of dmodel_t
/// </summary>
[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<QNode>(nodePtr);
}
}
/// <summary>
/// Managed equivalent of mnode_t
/// </summary>
[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<QNode>(children[0]),
Marshal.PtrToStructure<QNode>(children[1]),
};
}
/// <summary>
/// Managed equivalent of msurface_t
/// </summary>

5
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<Vector3> vertices = new List<Vector3>();
List<Vector2> textureUVs = new List<Vector2>();
List<Vector2> lightmapUVs = new List<Vector2>();

4
Assets/Scripts/Modules/RenderModule.Interop.cs

@ -92,9 +92,7 @@ public partial class RenderModule: CallbackHandler<RenderModule>
if (model == null || model.type != QModelType.Brush)
return -1;
var surfaces = model.surfaces.ToStructArray<QSurface>(model.numSurfaces);
return GetSelf(target).UploadBrushModel(model, surfaces);
return GetSelf(target).UploadBrushModel(model);
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

4
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;
}

Loading…
Cancel
Save