using System; using System.Runtime.InteropServices; /// /// Managed equivalent of model_t /// [StructLayout(LayoutKind.Sequential, Pack = 0, CharSet = CharSet.Ansi)] public class QModel { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = QConstants.MaxQPath)] public string name; public uint pathId; public bool needLoad; public QModelType type; public int numFrames; public QSyncType syncType; public int flags; // Volume occupied by the model graphics public QVec3 mins, maxs; public QVec3 ymins, ymaxs; public QVec3 rmins, rmaxs; // Solid volume for clipping public bool clipBox; public QVec3 clipMins, clipMaxs; // Brush model public int firstModelSurface, numModelSurfaces; public int numSubModels; public IntPtr subModels; // Array of dmodel_t public int numPlanes; public IntPtr planes; // Array of mplane_t public int numLeafs; public IntPtr leafs; // Array of mleaf_t public int numVertices; public IntPtr vertices; // Array of mvertex_t public int numEdges; public IntPtr edges; // Array of medge_t public int numNodes; public IntPtr nodes; // Array of mnode_t public int numTexInfo; public IntPtr texInfo; // Array of mtexinfo_t public int numSurfaces; public IntPtr surfaces; // Array of msurface_t public int numSurfEdges; public IntPtr surfEdges; // Array of int public int numClipNodes; public IntPtr clipNodes; // Array of dclipnode_t public int numMarkSurfaces; public IntPtr markSurfaces; // Array of msurface_t pointers [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxMapHulls)] public QHull[] hulls; public int numTextures; public IntPtr textures; // Array of texture_t pointers public IntPtr visData; // Array of bytes public IntPtr lightData; // Array of bytes [MarshalAs(UnmanagedType.LPStr)] public string entities; public bool visWarn; public int bspVersion; // VBO data from QuakeSpasm; unused by UniQuake public uint meshvbo; public uint meshIndexesVbo; public int vboIndexOfs; public int vboXyzOfs; public int vboStofs; public IntPtr userCache; } /// /// Managed equivalent of aliashdr_t /// [StructLayout(LayoutKind.Sequential, Pack = 0)] public class QAliasHeader { public int ident; public int version; public QVec3 scale; public QVec3 scaleOrigin; public float boundingRadius; public QVec3 eyePosition; public int numSkins; public int skinWidth; public int skinHeight; public int numVerts; public int numTriangles; public int numFrames; public QSyncType syncType; public int flags; public float size; // VBO data from QuakeSpasm; unused by UniQuake public int numVertsVbo; public IntPtr meshDesc; public int numIndexes; public IntPtr indexes; public IntPtr vertexes; public int numPoses; public int poseVerts; public int poseData; public int commands; [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins * 4)] public IntPtr[] glTextures; [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins * 4)] public IntPtr[] fbTextures; [MarshalAs(UnmanagedType.ByValArray, SizeConst = QConstants.MaxSkins)] public int[] texels; // Actually variable sized, but we receive an additional pointer to the first element so we can manually marshal the entire array [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public QAliasFrameDesc[] frames; } /// /// Managed equivalent of modtype_t /// public enum QModelType { Brush, Sprite, Alias, } /// /// Managed equivalent of synctype_t /// public enum QSyncType { Sync = 0, Rand } /// /// Managed equivalent of aliasframetype_t /// public enum QAliasFrameType { Single = 0, Group, } /// /// Managed equivalent of aliasskintype_t /// public enum QAliasSkinType { Single = 0, Group, } /// /// Managed equivalent of hull_t /// [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct QHull { public IntPtr clipNodes; // Array of dclipnode_t public IntPtr planes; // Array of mplane_t public int firstClipNode; public int lastClipNode; public QVec3 clipMins; public QVec3 clipMaxs; } /// /// Managed equivalent of maliasframedesc_t /// [StructLayout(LayoutKind.Sequential, Pack = 0, CharSet = CharSet.Ansi)] public struct QAliasFrameDesc { public int firstPose; public int numPoses; public float interval; public QTriVertex bboxMin; public QTriVertex bboxMax; public int frame; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string name; } /// /// Managed equivalent of trivertx_t /// [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct QTriVertex { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] v; public byte lightNormalIndex; } /// /// Managed equivalent of mtriangle_t /// [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct QTriangle { public int facesFront; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public int[] vertIndex; } /// /// Managed equivalent of stvert_t /// [StructLayout(LayoutKind.Sequential, Pack = 0)] public struct QSTVert { public int onSeam; public int s, t; }