Browse Source

Added struct definitions and marshaling code to obtain texture numbers for brush model surfaces

console
Nico de Poel 5 years ago
parent
commit
403e7d0eb4
  1. 16
      Assets/Scripts/Data/QModel.cs
  2. 23
      Assets/Scripts/Data/QTexture.cs
  3. 2
      Assets/Scripts/Modules/BrushModel.cs

16
Assets/Scripts/Data/QModel.cs

@ -259,6 +259,8 @@ public struct QSurface
public bool cachedDLight; public bool cachedDLight;
public IntPtr samples; // Pointer to byte public IntPtr samples; // Pointer to byte
public QTexInfo TextureInfo => Marshal.PtrToStructure<QTexInfo>(texInfo);
public IEnumerable<QGLPolyVert[]> GetPolygons() public IEnumerable<QGLPolyVert[]> GetPolygons()
{ {
// This is so nasty. We have to deconstruct a linked list of variable-sized structs. Yuck. // This is so nasty. We have to deconstruct a linked list of variable-sized structs. Yuck.
@ -297,3 +299,17 @@ public struct QGLPolyVert
public QVec2 textureUV; public QVec2 textureUV;
public QVec2 lightmapUV; public QVec2 lightmapUV;
} }
/// <summary>
/// Managed equivalent of mtexinfo_t
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct QTexInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2 * 4)] public float[] vecs;
public float mipAdjust;
public IntPtr texture; // Pointer to texture_t
public int flags;
public QTexture Texture => Marshal.PtrToStructure<QTexture>(texture);
}

23
Assets/Scripts/Data/QTexture.cs

@ -1,6 +1,25 @@
using System; using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
/// <summary>
/// Managed equivalent of texture_t
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 0, CharSet = CharSet.Ansi)]
public struct QTexture
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] public string name;
public uint width, height;
public IntPtr glTexture; // Pointer to gltexture_t
public IntPtr fullBright; // Pointer to gltexture_t
public IntPtr warpImage; // Pointer to gltexture_t
public uint TextureNum => QGLTexture.TexNumFromPtr(glTexture);
public uint FullBrightNum => QGLTexture.TexNumFromPtr(fullBright);
public uint WarpImageNum => QGLTexture.TexNumFromPtr(warpImage);
// Rest of the fields are left out, so we don't unnecessarily marshal any unused data
}
/// <summary> /// <summary>
/// Managed equivalent of gltexture_t /// Managed equivalent of gltexture_t
/// </summary> /// </summary>
@ -23,6 +42,10 @@ public class QGLTexture
public char shirt; public char shirt;
public char pants; public char pants;
public int visFrame; public int visFrame;
// Conveniently make use of the fact that texNum is the first field in QGLTexture,
// so we don't have to marshal the entire struct to get the texture number out of it.
public static uint TexNumFromPtr(IntPtr ptr) => ptr == IntPtr.Zero ? 0 : unchecked((uint)Marshal.ReadInt32(ptr));
} }
/// <summary> /// <summary>

2
Assets/Scripts/Modules/BrushModel.cs

@ -52,6 +52,8 @@ public class BrushModel
mesh.UploadMeshData(true); mesh.UploadMeshData(true);
meshes.Add(mesh); meshes.Add(mesh);
} }
var texNum = surfaces[surfIdx].TextureInfo.Texture.TextureNum;
} }
// DEBUG // DEBUG

Loading…
Cancel
Save