Graphics Map Asset (MW2): Difference between revisions

From COD Engine Research
No edit summary
Jakes625 (talk | contribs)
 
(4 intermediate revisions by 2 users not shown)
Line 3: Line 3:
[[Category:MW2]]
[[Category:MW2]]
The graphics map (or gfx_map) has existed on every Call of Duty so far and is part of the D3DBSP system produced by Radiant. Where the [[:Collision Map Asset (MW2)|collision map]] is used for collision data in the map, the graphics map holds visual systems such as lights and particularly the dPVS system. The Dynamic Potentially Visible Sets (dPVS) were developed by Umbra Software to compute visibility databases in real time, and power the Call of Duty engine to this day.
The graphics map (or gfx_map) has existed on every Call of Duty so far and is part of the D3DBSP system produced by Radiant. Where the [[:Collision Map Asset (MW2)|collision map]] is used for collision data in the map, the graphics map holds visual systems such as lights and particularly the dPVS system. The Dynamic Potentially Visible Sets (dPVS) were developed by Umbra Software to compute visibility databases in real time, and power the Call of Duty engine to this day.
=== Rendering ===
[[MW2_Rendering|Rendering]]
=== Structures ===
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
struct GfxStreamingAabbTree
#pragma pack(push, 4)
{
  unsigned __int16 firstItem;
  unsigned __int16 itemCount;
  unsigned __int16 firstChild;
  unsigned __int16 childCount;
  float mins[3];
  float maxs[3];
};


struct GfxWorldStreamInfo
typedef struct GfxImage GfxImage;
{
typedef struct Material Material;
  int aabbTreeCount;
typedef struct XModel XModel;
  GfxStreamingAabbTree *aabbTrees;
  int leafRefCount;
  int *leafRefs;
};


union GfxColor
typedef struct DpvsPlane
{
{
  unsigned int packed;
    float normal[3];
  char array[4];
    float dist;
};
    uint8_t type;
    uint8_t signbits;
    uint16_t pad12;
} DpvsPlane; // 0x14


union PackedUnitVec
typedef struct GfxWorldDpvsPlanes
{
{
  unsigned int packed;
    int32_t cellCount;
};
    DpvsPlane *planes;
    uint16_t *nodes;
    uint32_t *sceneEntCellBits;
} GfxWorldDpvsPlanes; // 0x10


struct GfxWorldVertex
typedef struct GfxSky
{
{
  float xyz[3];
    int32_t skySurfCount;
  float binormalSign;
    int32_t *skyStartSurfs;
  GfxColor color;
    GfxImage *skyImage;
  float texCoord[2];
    int32_t skySamplerState;
  float lmapCoord[2];
} GfxSky; // 0x10
  PackedUnitVec normal;
  PackedUnitVec tangent;
};


struct GfxWorldVertexData
typedef struct GfxCellTreeCount
{
{
  GfxWorldVertex *vertices;
    uint32_t aabbTreeCount;
  D3DVertexBuffer worldVb;
} GfxCellTreeCount; // 0x04
};


struct GfxLight
typedef struct GfxAabbTree
{
{
  char type;
    float mins[3];
  char canUseShadowMap;
    float maxs[3];
  char unused[2];
    uint16_t childCount;
  float color[3];
    uint16_t surfaceCount;
  float dir[3];
    uint16_t startSurfIndex;
  float origin[3];
    uint16_t smodelIndexCount;
  float radius;
    uint16_t *smodelIndexes;
  float cosHalfFovOuter;
    int32_t childrenOffset;
  float cosHalfFovInner;
} GfxAabbTree; // 0x28
  int exponent;
  unsigned int spotShadowIndex;
  GfxLightDef *def;
};


struct GfxReflectionProbe
typedef struct GfxCellTree
{
{
  float offset[3];
    GfxAabbTree *aabbTrees;
};
} GfxCellTree; // 0x04


struct GfxWorldDpvsPlanes
typedef struct GfxPortalVertex
{
{
  int cellCount;
    float xyz[3];
  cplane_s *planes;
} GfxPortalVertex; // 0x0C
  unsigned __int16 *nodes;
  unsigned int *sceneEntCellBits; //Size = cellCount << 11
};


struct GfxAabbTree
typedef struct GfxPortal
{
{
  float mins[3];
    uint8_t isQueued;
  float maxs[3];
    uint8_t isAncestor;
  unsigned __int16 childCount;
    uint8_t recursionDepth;
  unsigned __int16 surfaceCount;
    uint8_t hullPointCount;
  unsigned __int16 startSurfIndex;
    int32_t hullPointsRuntimePointer;
  unsigned __int16 smodelIndexCount;
    DpvsPlane plane;
  unsigned __int16 *smodelIndexes;
    GfxPortalVertex *vertices;
  int childrenOffset;
    uint8_t unknown20To21[2];
};
    uint8_t vertexCount;
    uint8_t pad23;
    float hullAxis[2][3];
} GfxPortal; // 0x3C


struct GfxLightGridEntry
typedef struct GfxCell
{
{
  unsigned __int16 colorsIndex;
    float mins[3];
  char primaryLightIndex;
    float maxs[3];
  char needsTrace;
    int32_t portalCount;
};
    GfxPortal *portals;
    uint8_t reflectionProbeCount;
    uint8_t pad21[3];
    uint8_t *reflectionProbes;
} GfxCell; // 0x28


struct GfxLightGridColors
typedef struct GfxReflectionProbe
{
{
  char rgb[56][3];
    float offset[3];
};
} GfxReflectionProbe; // 0x0C


struct GfxStaticModelInst
typedef struct GfxTexture
{
{
  float mins[3];
    uint32_t words[6];
  float maxs[3];
} GfxTexture; // 0x18
  GfxColor groundLighting;
};


struct srfTriangles_t
typedef struct GfxLightmapArray
{
{
  int vertexLayerData;
    GfxImage *primary;
  int firstVertex;
    GfxImage *secondary;
  unsigned __int16 vertexCount;
} GfxLightmapArray; // 0x08
  unsigned __int16 triCount;
  int baseIndex;
};


struct GfxSurface
typedef struct GfxWorldVertexData
{
{
  srfTriangles_t tris;
    uint8_t *vertices;
  Material *material;
    int32_t worldVbHandle;
  char lightmapIndex;
    int32_t worldVbOffset;
  char reflectionProbeIndex;
} GfxWorldVertexData; // 0x0C
  char primaryLightIndex;
  bool castsSunShadow;
};


struct GfxCullGroup
typedef struct GfxWorldVertexLayerData
{
{
  float mins[3];
    uint8_t *data;
  float maxs[3];
    int32_t layerVbHandle;
  int surfaceCount;
    int32_t layerVbOffset;
  int startSurfIndex;
} GfxWorldVertexLayerData; // 0x0C
};


struct GfxDrawSurfFields
typedef struct GfxWorldDraw
{
{
  __int64 _bf0;
    uint32_t reflectionProbeCount;
};
    GfxImage **reflectionImages;
    GfxReflectionProbe *reflectionProbes;
    GfxTexture *reflectionProbeTextures;
    int32_t lightmapCount;
    GfxLightmapArray *lightmaps;
    GfxTexture *lightmapPrimaryTextures;
    GfxTexture *lightmapSecondaryTextures;
    GfxImage *skyImage;
    GfxImage *outdoorImage;
    uint32_t vertexCount;
    GfxWorldVertexData vd;
    uint32_t vertexLayerDataSize;
    GfxWorldVertexLayerData vld;
    int32_t indexCount;
    uint16_t *indices;
    int32_t indexBufferRaw;
} GfxWorldDraw; // 0x54


union GfxDrawSurf
typedef struct GfxLightGridEntry
{
{
  GfxDrawSurfFields fields;
    uint16_t colorsIndex;
  unsigned __int64 packed;
    uint8_t primaryLightIndex;
};
    uint8_t needsTrace;
} GfxLightGridEntry; // 0x04


struct GfxWorldDpvsStatic
typedef struct GfxLightGridColors
{
{
  unsigned int smodelCount;
    uint8_t rgb[56][3];
  unsigned int staticSurfaceCount;
} GfxLightGridColors; // 0xA8
  unsigned int litSurfsBegin;
  unsigned int litSurfsEnd;
  char unknown1[0x20];
  char *smodelVisData[3];
  char *surfaceVisData[3];
  unsigned __int16 *sortedSurfIndex;
  GfxStaticModelInst *smodelInsts;
  GfxSurface *surfaces;
  GfxCullGroup *cullGroups;
  GfxStaticModelDrawInst *smodelDrawInsts;
  GfxDrawSurf *surfaceMaterials;
  unsigned int *surfaceCastsSunShadow;
  volatile int usageCount;
};


#pragma pack(push, 4)
typedef struct GfxLightGrid
struct GfxPackedPlacement
{
{
  float origin[3];
    uint32_t hasLightRegions;
  PackedUnitVec axis[3];
    uint32_t sunPrimaryLightIndex;
  float scale;
    uint16_t mins[3];
};
    uint16_t maxs[3];
    uint32_t rowAxis;
    uint32_t colAxis;
    uint16_t *rowDataStart;
    uint32_t rawRowDataSize;
    uint8_t *rawRowData;
    uint32_t entryCount;
    GfxLightGridEntry *entries;
    uint32_t colorCount;
    GfxLightGridColors *colors;
} GfxLightGrid; // 0x38


struct GfxStaticModelDrawInst
typedef struct GfxBrushModel
{
{
  GfxPackedPlacement placement;
    float writableMins[3];
  XModel *model;
    float writableMaxs[3];
  float cullDist;
    float boundsMins[3];
  char reflectionProbeIndex;
    float boundsMaxs[3];
  char primaryLightIndex;
    uint32_t surfaceCount;
  unsigned __int16 lightingHandle;
    uint32_t startSurfIndex;
  char flags;
} GfxBrushModel; // 0x38
};


struct cplane_s
typedef struct MaterialMemory
{
{
  float normal[3];
    Material *material;
  float dist;
    int32_t memory;
  char type;
} MaterialMemory; // 0x08
  char signbits;
};


struct GfxPortalWritable
typedef struct Sunflare
{
{
  bool isQueued;
    uint32_t hasValidData;
  bool isAncestor;
    Material *spriteMaterial;
  char recursionDepth;
    Material *flareMaterial;
  char hullPointCount;
    float spriteSize;
  float (*hullPoints)[2];
    float flareMinSize;
};
    float flareMinDot;
    float flareMaxSize;
    float flareMaxDot;
    float flareMaxAlpha;
    int32_t flareFadeInTime;
    int32_t flareFadeOutTime;
    float blindMinDot;
    float blindMaxDot;
    float blindMaxDarken;
    int32_t blindFadeInTime;
    int32_t blindFadeOutTime;
    float glareMinDot;
    float glareMaxDot;
    float glareMaxLighten;
    int32_t glareFadeInTime;
    int32_t glareFadeOutTime;
    float sunFxPosition[3];
} Sunflare; // 0x60


struct DpvsPlane
typedef struct GfxSceneDynModel
{
{
  float coeffs[4];
    uint16_t lod;
  char side[3];
    uint16_t surfId;
};
    uint16_t dynEntId;
} GfxSceneDynModel; // 0x06


struct GfxPortal
typedef struct GfxSceneDynBrush
{
{
  GfxPortalWritable writable;
    uint16_t surfId;
  DpvsPlane plane;
    uint16_t dynEntId;
  float (*vertices)[3];
} GfxSceneDynBrush; // 0x04
      char unknown[2];
  char vertexCount;
  float hullAxis[2][3];
};


struct GfxCell
typedef struct GfxShadowGeometry
{
{
  float mins[3];
    uint16_t surfaceCount;
  float maxs[3];
    uint16_t smodelCount;
  int portalCount;
    uint16_t *sortedSurfIndex;
  GfxPortal *portals;
    uint16_t *smodelIndex;
  char reflectionProbeCount;
} GfxShadowGeometry; // 0x0C
  char *reflectionProbes;
};


struct GfxLightmapArray
typedef struct GfxLightRegionAxis
{
{
  GfxImage *primary;
    float dir[3];
  GfxImage *secondary;
    float midPoint;
};
    float halfSize;
} GfxLightRegionAxis; // 0x14


struct GfxLightGrid
typedef struct GfxLightRegionHull
{
{
  bool hasLightRegions;
    float kdopMidPoint[9];
  unsigned int sunPrimaryLightIndex;
    float kdopHalfSize[9];
  unsigned __int16 mins[3];
    uint32_t axisCount;
  unsigned __int16 maxs[3];
    GfxLightRegionAxis *axis;
  unsigned int rowAxis;
} GfxLightRegionHull; // 0x50
  unsigned int colAxis;
  unsigned __int16 *rowDataStart;
  unsigned int rawRowDataSize;
  char *rawRowData;
  unsigned int entryCount;
  GfxLightGridEntry *entries;
  unsigned int colorCount;
  GfxLightGridColors *colors;
};


struct GfxBrushModelWritable
typedef struct GfxLightRegion
{
{
  float mins[3];
    int32_t hullCount;
  float maxs[3];
    GfxLightRegionHull *hulls;
};
} GfxLightRegion; // 0x08


struct GfxBrushModel
typedef struct GfxPackedPlacement
{
{
  GfxBrushModelWritable writable;
    float origin[3];
  float bounds[2][3];
    uint32_t packedAxis[3];
  unsigned int surfaceCount;
    float scale;
  unsigned int startSurfIndex;
} GfxPackedPlacement; // 0x1C
};


struct MaterialMemory
typedef struct GfxStaticModelInst
{
{
  Material *material;
    float mins[3];
  int memory;
    float maxs[3];
};
    uint32_t groundLighting;
    uint8_t unknown1CTo23[8];
} GfxStaticModelInst; // 0x24


struct sunflare_t
typedef struct SrfTriangles
{
{
  bool hasValidData;
    int32_t vertexLayerData;
  Material *spriteMaterial;
    int32_t baseVertex;
  Material *flareMaterial;
    uint32_t minVertexIndex;
  float spriteSize;
    uint16_t vertexCount;
  float flareMinSize;
    uint16_t triCount;
  float flareMinDot;
    int32_t baseIndex;
  float flareMaxSize;
} SrfTriangles; // 0x14
  float flareMaxDot;
  float flareMaxAlpha;
  int flareFadeInTime;
  int flareFadeOutTime;
  float blindMinDot;
  float blindMaxDot;
  float blindMaxDarken;
  int blindFadeInTime;
  int blindFadeOutTime;
  float glareMinDot;
  float glareMaxDot;
  float glareMaxLighten;
  int glareFadeInTime;
  int glareFadeOutTime;
  float sunFxPosition[3];
};


struct GfxShadowGeometry
typedef struct GfxSurface
{
{
  unsigned __int16 surfaceCount;
    SrfTriangles tris;
  unsigned __int16 smodelCount;
    Material *material;
  unsigned __int16 *sortedSurfIndex;
    uint8_t lightmapIndex;
  unsigned __int16 *smodelIndex;
    uint8_t reflectionProbeIndex;
};
    uint8_t primaryLightIndex;
    uint8_t castsSunShadow;
} GfxSurface; // 0x1C


struct GfxLightRegionAxis
typedef union GfxMapDrawSurf
{
{
  float dir[3];
    uint64_t packed;
  float midPoint;
} GfxMapDrawSurf; // 0x08
  float halfSize;
};


struct GfxLightRegionHull
typedef struct GfxCullGroup
{
{
  float kdopMidPoint[9];
    float mins[3];
  float kdopHalfSize[9];
    float maxs[3];
  unsigned int axisCount;
    int32_t surfaceCount;
  GfxLightRegionAxis *axis;
    int32_t startSurfIndex;
};
} GfxCullGroup; // 0x20


struct GfxLightRegion
typedef struct GfxStaticModelDrawInst
{
{
  unsigned int hullCount;
    GfxPackedPlacement placement;
  GfxLightRegionHull *hulls;
    XModel *model;
};
    uint16_t cullDist;
    uint16_t lightingHandle;
    uint8_t reflectionProbeIndex;
    uint8_t primaryLightIndex;
    uint8_t flags;
    uint8_t firstMaterialSkinIndex;
    uint8_t unknown28;
    uint8_t unknown29;
    uint8_t unknown2A;
    uint8_t unknown2B;
} GfxStaticModelDrawInst; // 0x2C


struct GfxWorldDpvsDynamic
typedef struct GfxWorldDpvsStatic
{
{
  unsigned int dynEntClientWordCount[2];
    uint32_t smodelCount;
  unsigned int dynEntClientCount[2];
    uint32_t staticSurfaceCount;
  unsigned int *dynEntCellBits[2];
    uint32_t litSurfsBegin;
  char *dynEntVisData[2][3];
    uint32_t litSurfsEnd;
};
    uint32_t visibilityCounts[8];
    uint32_t *smodelVisData[3];
    uint32_t *surfaceVisData[3];
    uint16_t *sortedSurfIndex;
    GfxStaticModelInst *smodelInsts;
    GfxSurface *surfaces;
    GfxCullGroup *cullGroups;
    GfxStaticModelDrawInst *smodelDrawInsts;
    GfxMapDrawSurf *surfaceMaterials;
    uint32_t *surfaceCastsSunShadow;
    volatile uint32_t usageCount;
} GfxWorldDpvsStatic; // 0x68


struct SunLightParseParams
typedef struct GfxWorldDpvsDynamic
{
{
  char name[64];
    uint32_t dynEntClientWordCount[2];
  float ambientScale;
    uint32_t dynEntClientCount[2];
  float ambientColor[3];
    uint32_t *dynEntCellBits[2];
  float diffuseFraction;
    uint8_t *dynEntVisData[6];
  float sunLight;
} GfxWorldDpvsDynamic; // 0x30
  float sunColor[3];
  float diffuseColor[3];
  bool diffuseColorHasBeenSet;
  float angles[3];
};


struct GfxWorldVertexLayerData
typedef struct GfxHeroOnlyLight
{
{
  char *data;
    uint8_t bytes[0x38];
  D3DVertexBuffer layerVb;
} GfxHeroOnlyLight; // 0x38
};


typedef char GfxTexture[0x34];
typedef struct GfxWorld
 
struct GfxWorldDraw
{
{
  unsigned int reflectionProbeCount;
    const char *name;
  GfxImage * * reflectionImages;
    const char *baseName;
  GfxReflectionProbe *reflectionProbes;
    int32_t planeCount;
  GfxTexture * reflectionProbeTextures; //Count = refelctionProbeCount
    int32_t nodeCount;
  int lightmapCount;
    int32_t surfaceCount;
  GfxLightmapArray *lightmaps;
    uint32_t skyCount;
  GfxTexture * lightmapPrimaryTextures; //Count = lightmapCount
    GfxSky *skies;
  GfxTexture * lightmapSecondaryTextures; //Count = lightmapCount
    int32_t primaryLightFirstShadowable;
  GfxImage *skyImage;
    int32_t primaryLightCount;
  GfxImage *outdoorImage;
    int32_t sortKeyLitDecal;
  unsigned int vertexCount;
    int32_t sortKeyEffectDecal;
  GfxWorldVertexData vd;
    int32_t sortKeyEffectAuto;
  unsigned int vertexLayerDataSize;
    int32_t sortKeyDistortion;
  GfxWorldVertexLayerData vld;
    GfxWorldDpvsPlanes dpvsPlanes;
  int indexCount;
    GfxCellTreeCount *cellTreeCounts;
  unsigned __int16 *indices;
    GfxCellTree *cellTrees;
  D3DIndexBuffer indexBuffer;
    GfxCell *cells;
};
    GfxWorldDraw worldDraw;
    GfxLightGrid lightGrid;
    int32_t modelCount;
    GfxBrushModel *models;
    float mins[3];
    float maxs[3];
    uint32_t checksum;
    int32_t materialMemoryCount;
    MaterialMemory *materialMemory;
    Sunflare sun;
    float outdoorLookupMatrix[16];
    GfxImage *outdoorImage;
    uint32_t *cellCasterBits;
    uint32_t *cellCasterBits2;
    GfxSceneDynModel *sceneDynModel;
    GfxSceneDynBrush *sceneDynBrush;
    uint32_t *primaryLightEntityShadowVis;
    uint32_t *primaryLightDynEntShadowVis[2];
    uint8_t *primaryLightForModelDynEnt;
    GfxShadowGeometry *shadowGeom;
    GfxLightRegion *lightRegion;
    GfxWorldDpvsStatic dpvs;
    GfxWorldDpvsDynamic dpvsDyn;
    uint32_t unknown26C;
    uint32_t heroOnlyLightCount;
    GfxHeroOnlyLight *heroOnlyLights;
    uint32_t unknown278;
    int32_t umbraGateCount;
    uint8_t *umbraGateData;
    uint8_t *umbraGateData2;
} GfxWorld; // 0x288 on PS3/32-bit


struct unknownGfxWorldStruct2
#pragma pack(pop)
{
</syntaxhighlight>
  int unknownCount;
  int * unknownArray;
  GfxImage * unknownImage;
  int unknown;
};


struct GfxWorld
==== Notes ====
{
<syntaxhighlight lang="C">
  const char *name;
// sceneEntCellBits count = cellCount << 9 uint32_t values.
  const char *baseName;
// rowDataStart count = maxs[rowAxis] - mins[rowAxis] + 1 uint16_t values.
  int planeCount;
// vertices payload size = vertexCount * 0x10 bytes.
  int nodeCount;
// vertexLayerData payload size = vertexLayerDataSize bytes.
      int unknown2;
// cellCasterBits count = cellCount * ((cellCount + 31) >> 5) uint32_t values.
      unsigned int unknownCount1;
// cellCasterBits2 count = ((cellCount + 31) >> 5) uint32_t values.
      unknownGfxWorldStruct2 * unknownStructs1; //Count = unknownCount1;
// sceneDynModel count = dpvsDyn.dynEntClientCount[0].
      char unknown1[0x18];
// sceneDynBrush count = dpvsDyn.dynEntClientCount[1].
  GfxWorldDpvsPlanes dpvsPlanes; //The following rely on the count in this
// primaryLightEntityShadowVis count = max(0, primaryLightCount - primaryLightFirstShadowable - 1) * 0x2000 uint32_t values.
      char *unknown4;
// primaryLightDynEntShadowVis[0] count = same shadowable tail * sceneDynModel count.
  GfxAabbTree *aabbTree;
// primaryLightDynEntShadowVis[1] count = same shadowable tail * sceneDynBrush count.
  GfxCell *cells;
// primaryLightForModelDynEnt count = sceneDynModel count bytes.
  GfxWorldDraw worldDraw;
// dpvs.smodelVisData[i] count = dpvs.visibilityCounts[6] uint32_t values.
  GfxLightGrid lightGrid;
// dpvs.surfaceVisData[i] count = dpvs.visibilityCounts[7] uint32_t values.
  int modelCount;
// dpvs.sortedSurfIndex count = dpvs.staticSurfaceCount uint16_t values.
  GfxBrushModel *models;
// dpvs.smodelInsts and dpvs.smodelDrawInsts count = dpvs.smodelCount.
  float mins[3];
// dpvs.surfaces, dpvs.cullGroups, and dpvs.surfaceMaterials count = surfaceCount.
  float maxs[3];
// dpvs.surfaceCastsSunShadow count = dpvs.visibilityCounts[7] uint32_t values.
  unsigned int checksum;
// dpvsDyn.dynEntCellBits[i] count = dynEntClientWordCount[i] * dpvsPlanes.cellCount uint32_t values.
  int materialMemoryCount;
// dpvsDyn.dynEntVisData load order is [0, 3, 1, 4, 2, 5].
  MaterialMemory *materialMemory;
// dpvsDyn.dynEntVisData[0..2] byte size = dynEntClientWordCount[0] << 5.
  sunflare_t sun;
// dpvsDyn.dynEntVisData[3..5] byte size = dynEntClientWordCount[1] << 5.
  unsigned int *cellCasterBits[2];
// heroOnlyLights count = heroOnlyLightCount, stride 0x38.
  GfxSceneDynModel *sceneDynModel;
// umbraGateData and umbraGateData2 byte size = umbraGateCount + 0x1000.
  GfxSceneDynBrush *sceneDynBrush;
  unsigned int *primaryLightEntityShadowVis;
  unsigned int *primaryLightDynEntShadowVis[2];
  char *primaryLightForModelDynEnt;
  GfxShadowGeometry *shadowGeom;
  GfxLightRegion *lightRegion;
  GfxWorldDpvsStatic dpvs;
  GfxWorldDpvsDynamic dpvsDyn;
      unsigned int unknownCount2;
      char * unknown2; //Size = unknownCount2 * 0x38
      int unknown3;
};
#pragma pack(pop)
</syntaxhighlight>
</syntaxhighlight>
Keep in mind that the checksum is checked on other clients using the mapcrc dvar.
Keep in mind that the checksum is checked on other clients using the mapcrc dvar.

Latest revision as of 22:25, 5 July 2026

The graphics map (or gfx_map) has existed on every Call of Duty so far and is part of the D3DBSP system produced by Radiant. Where the collision map is used for collision data in the map, the graphics map holds visual systems such as lights and particularly the dPVS system. The Dynamic Potentially Visible Sets (dPVS) were developed by Umbra Software to compute visibility databases in real time, and power the Call of Duty engine to this day.

Rendering

Rendering

Structures

#pragma pack(push, 4)

typedef struct GfxImage GfxImage;
typedef struct Material Material;
typedef struct XModel XModel;

typedef struct DpvsPlane
{
    float normal[3];
    float dist;
    uint8_t type;
    uint8_t signbits;
    uint16_t pad12;
} DpvsPlane; // 0x14

typedef struct GfxWorldDpvsPlanes
{
    int32_t cellCount;
    DpvsPlane *planes;
    uint16_t *nodes;
    uint32_t *sceneEntCellBits;
} GfxWorldDpvsPlanes; // 0x10

typedef struct GfxSky
{
    int32_t skySurfCount;
    int32_t *skyStartSurfs;
    GfxImage *skyImage;
    int32_t skySamplerState;
} GfxSky; // 0x10

typedef struct GfxCellTreeCount
{
    uint32_t aabbTreeCount;
} GfxCellTreeCount; // 0x04

typedef struct GfxAabbTree
{
    float mins[3];
    float maxs[3];
    uint16_t childCount;
    uint16_t surfaceCount;
    uint16_t startSurfIndex;
    uint16_t smodelIndexCount;
    uint16_t *smodelIndexes;
    int32_t childrenOffset;
} GfxAabbTree; // 0x28

typedef struct GfxCellTree
{
    GfxAabbTree *aabbTrees;
} GfxCellTree; // 0x04

typedef struct GfxPortalVertex
{
    float xyz[3];
} GfxPortalVertex; // 0x0C

typedef struct GfxPortal
{
    uint8_t isQueued;
    uint8_t isAncestor;
    uint8_t recursionDepth;
    uint8_t hullPointCount;
    int32_t hullPointsRuntimePointer;
    DpvsPlane plane;
    GfxPortalVertex *vertices;
    uint8_t unknown20To21[2];
    uint8_t vertexCount;
    uint8_t pad23;
    float hullAxis[2][3];
} GfxPortal; // 0x3C

typedef struct GfxCell
{
    float mins[3];
    float maxs[3];
    int32_t portalCount;
    GfxPortal *portals;
    uint8_t reflectionProbeCount;
    uint8_t pad21[3];
    uint8_t *reflectionProbes;
} GfxCell; // 0x28

typedef struct GfxReflectionProbe
{
    float offset[3];
} GfxReflectionProbe; // 0x0C

typedef struct GfxTexture
{
    uint32_t words[6];
} GfxTexture; // 0x18

typedef struct GfxLightmapArray
{
    GfxImage *primary;
    GfxImage *secondary;
} GfxLightmapArray; // 0x08

typedef struct GfxWorldVertexData
{
    uint8_t *vertices;
    int32_t worldVbHandle;
    int32_t worldVbOffset;
} GfxWorldVertexData; // 0x0C

typedef struct GfxWorldVertexLayerData
{
    uint8_t *data;
    int32_t layerVbHandle;
    int32_t layerVbOffset;
} GfxWorldVertexLayerData; // 0x0C

typedef struct GfxWorldDraw
{
    uint32_t reflectionProbeCount;
    GfxImage **reflectionImages;
    GfxReflectionProbe *reflectionProbes;
    GfxTexture *reflectionProbeTextures;
    int32_t lightmapCount;
    GfxLightmapArray *lightmaps;
    GfxTexture *lightmapPrimaryTextures;
    GfxTexture *lightmapSecondaryTextures;
    GfxImage *skyImage;
    GfxImage *outdoorImage;
    uint32_t vertexCount;
    GfxWorldVertexData vd;
    uint32_t vertexLayerDataSize;
    GfxWorldVertexLayerData vld;
    int32_t indexCount;
    uint16_t *indices;
    int32_t indexBufferRaw;
} GfxWorldDraw; // 0x54

typedef struct GfxLightGridEntry
{
    uint16_t colorsIndex;
    uint8_t primaryLightIndex;
    uint8_t needsTrace;
} GfxLightGridEntry; // 0x04

typedef struct GfxLightGridColors
{
    uint8_t rgb[56][3];
} GfxLightGridColors; // 0xA8

typedef struct GfxLightGrid
{
    uint32_t hasLightRegions;
    uint32_t sunPrimaryLightIndex;
    uint16_t mins[3];
    uint16_t maxs[3];
    uint32_t rowAxis;
    uint32_t colAxis;
    uint16_t *rowDataStart;
    uint32_t rawRowDataSize;
    uint8_t *rawRowData;
    uint32_t entryCount;
    GfxLightGridEntry *entries;
    uint32_t colorCount;
    GfxLightGridColors *colors;
} GfxLightGrid; // 0x38

typedef struct GfxBrushModel
{
    float writableMins[3];
    float writableMaxs[3];
    float boundsMins[3];
    float boundsMaxs[3];
    uint32_t surfaceCount;
    uint32_t startSurfIndex;
} GfxBrushModel; // 0x38

typedef struct MaterialMemory
{
    Material *material;
    int32_t memory;
} MaterialMemory; // 0x08

typedef struct Sunflare
{
    uint32_t hasValidData;
    Material *spriteMaterial;
    Material *flareMaterial;
    float spriteSize;
    float flareMinSize;
    float flareMinDot;
    float flareMaxSize;
    float flareMaxDot;
    float flareMaxAlpha;
    int32_t flareFadeInTime;
    int32_t flareFadeOutTime;
    float blindMinDot;
    float blindMaxDot;
    float blindMaxDarken;
    int32_t blindFadeInTime;
    int32_t blindFadeOutTime;
    float glareMinDot;
    float glareMaxDot;
    float glareMaxLighten;
    int32_t glareFadeInTime;
    int32_t glareFadeOutTime;
    float sunFxPosition[3];
} Sunflare; // 0x60

typedef struct GfxSceneDynModel
{
    uint16_t lod;
    uint16_t surfId;
    uint16_t dynEntId;
} GfxSceneDynModel; // 0x06

typedef struct GfxSceneDynBrush
{
    uint16_t surfId;
    uint16_t dynEntId;
} GfxSceneDynBrush; // 0x04

typedef struct GfxShadowGeometry
{
    uint16_t surfaceCount;
    uint16_t smodelCount;
    uint16_t *sortedSurfIndex;
    uint16_t *smodelIndex;
} GfxShadowGeometry; // 0x0C

typedef struct GfxLightRegionAxis
{
    float dir[3];
    float midPoint;
    float halfSize;
} GfxLightRegionAxis; // 0x14

typedef struct GfxLightRegionHull
{
    float kdopMidPoint[9];
    float kdopHalfSize[9];
    uint32_t axisCount;
    GfxLightRegionAxis *axis;
} GfxLightRegionHull; // 0x50

typedef struct GfxLightRegion
{
    int32_t hullCount;
    GfxLightRegionHull *hulls;
} GfxLightRegion; // 0x08

typedef struct GfxPackedPlacement
{
    float origin[3];
    uint32_t packedAxis[3];
    float scale;
} GfxPackedPlacement; // 0x1C

typedef struct GfxStaticModelInst
{
    float mins[3];
    float maxs[3];
    uint32_t groundLighting;
    uint8_t unknown1CTo23[8];
} GfxStaticModelInst; // 0x24

typedef struct SrfTriangles
{
    int32_t vertexLayerData;
    int32_t baseVertex;
    uint32_t minVertexIndex;
    uint16_t vertexCount;
    uint16_t triCount;
    int32_t baseIndex;
} SrfTriangles; // 0x14

typedef struct GfxSurface
{
    SrfTriangles tris;
    Material *material;
    uint8_t lightmapIndex;
    uint8_t reflectionProbeIndex;
    uint8_t primaryLightIndex;
    uint8_t castsSunShadow;
} GfxSurface; // 0x1C

typedef union GfxMapDrawSurf
{
    uint64_t packed;
} GfxMapDrawSurf; // 0x08

typedef struct GfxCullGroup
{
    float mins[3];
    float maxs[3];
    int32_t surfaceCount;
    int32_t startSurfIndex;
} GfxCullGroup; // 0x20

typedef struct GfxStaticModelDrawInst
{
    GfxPackedPlacement placement;
    XModel *model;
    uint16_t cullDist;
    uint16_t lightingHandle;
    uint8_t reflectionProbeIndex;
    uint8_t primaryLightIndex;
    uint8_t flags;
    uint8_t firstMaterialSkinIndex;
    uint8_t unknown28;
    uint8_t unknown29;
    uint8_t unknown2A;
    uint8_t unknown2B;
} GfxStaticModelDrawInst; // 0x2C

typedef struct GfxWorldDpvsStatic
{
    uint32_t smodelCount;
    uint32_t staticSurfaceCount;
    uint32_t litSurfsBegin;
    uint32_t litSurfsEnd;
    uint32_t visibilityCounts[8];
    uint32_t *smodelVisData[3];
    uint32_t *surfaceVisData[3];
    uint16_t *sortedSurfIndex;
    GfxStaticModelInst *smodelInsts;
    GfxSurface *surfaces;
    GfxCullGroup *cullGroups;
    GfxStaticModelDrawInst *smodelDrawInsts;
    GfxMapDrawSurf *surfaceMaterials;
    uint32_t *surfaceCastsSunShadow;
    volatile uint32_t usageCount;
} GfxWorldDpvsStatic; // 0x68

typedef struct GfxWorldDpvsDynamic
{
    uint32_t dynEntClientWordCount[2];
    uint32_t dynEntClientCount[2];
    uint32_t *dynEntCellBits[2];
    uint8_t *dynEntVisData[6];
} GfxWorldDpvsDynamic; // 0x30

typedef struct GfxHeroOnlyLight
{
    uint8_t bytes[0x38];
} GfxHeroOnlyLight; // 0x38

typedef struct GfxWorld
{
    const char *name;
    const char *baseName;
    int32_t planeCount;
    int32_t nodeCount;
    int32_t surfaceCount;
    uint32_t skyCount;
    GfxSky *skies;
    int32_t primaryLightFirstShadowable;
    int32_t primaryLightCount;
    int32_t sortKeyLitDecal;
    int32_t sortKeyEffectDecal;
    int32_t sortKeyEffectAuto;
    int32_t sortKeyDistortion;
    GfxWorldDpvsPlanes dpvsPlanes;
    GfxCellTreeCount *cellTreeCounts;
    GfxCellTree *cellTrees;
    GfxCell *cells;
    GfxWorldDraw worldDraw;
    GfxLightGrid lightGrid;
    int32_t modelCount;
    GfxBrushModel *models;
    float mins[3];
    float maxs[3];
    uint32_t checksum;
    int32_t materialMemoryCount;
    MaterialMemory *materialMemory;
    Sunflare sun;
    float outdoorLookupMatrix[16];
    GfxImage *outdoorImage;
    uint32_t *cellCasterBits;
    uint32_t *cellCasterBits2;
    GfxSceneDynModel *sceneDynModel;
    GfxSceneDynBrush *sceneDynBrush;
    uint32_t *primaryLightEntityShadowVis;
    uint32_t *primaryLightDynEntShadowVis[2];
    uint8_t *primaryLightForModelDynEnt;
    GfxShadowGeometry *shadowGeom;
    GfxLightRegion *lightRegion;
    GfxWorldDpvsStatic dpvs;
    GfxWorldDpvsDynamic dpvsDyn;
    uint32_t unknown26C;
    uint32_t heroOnlyLightCount;
    GfxHeroOnlyLight *heroOnlyLights;
    uint32_t unknown278;
    int32_t umbraGateCount;
    uint8_t *umbraGateData;
    uint8_t *umbraGateData2;
} GfxWorld; // 0x288 on PS3/32-bit

#pragma pack(pop)

Notes

// sceneEntCellBits count = cellCount << 9 uint32_t values.
// rowDataStart count = maxs[rowAxis] - mins[rowAxis] + 1 uint16_t values.
// vertices payload size = vertexCount * 0x10 bytes.
// vertexLayerData payload size = vertexLayerDataSize bytes.
// cellCasterBits count = cellCount * ((cellCount + 31) >> 5) uint32_t values.
// cellCasterBits2 count = ((cellCount + 31) >> 5) uint32_t values.
// sceneDynModel count = dpvsDyn.dynEntClientCount[0].
// sceneDynBrush count = dpvsDyn.dynEntClientCount[1].
// primaryLightEntityShadowVis count = max(0, primaryLightCount - primaryLightFirstShadowable - 1) * 0x2000 uint32_t values.
// primaryLightDynEntShadowVis[0] count = same shadowable tail * sceneDynModel count.
// primaryLightDynEntShadowVis[1] count = same shadowable tail * sceneDynBrush count.
// primaryLightForModelDynEnt count = sceneDynModel count bytes.
// dpvs.smodelVisData[i] count = dpvs.visibilityCounts[6] uint32_t values.
// dpvs.surfaceVisData[i] count = dpvs.visibilityCounts[7] uint32_t values.
// dpvs.sortedSurfIndex count = dpvs.staticSurfaceCount uint16_t values.
// dpvs.smodelInsts and dpvs.smodelDrawInsts count = dpvs.smodelCount.
// dpvs.surfaces, dpvs.cullGroups, and dpvs.surfaceMaterials count = surfaceCount.
// dpvs.surfaceCastsSunShadow count = dpvs.visibilityCounts[7] uint32_t values.
// dpvsDyn.dynEntCellBits[i] count = dynEntClientWordCount[i] * dpvsPlanes.cellCount uint32_t values.
// dpvsDyn.dynEntVisData load order is [0, 3, 1, 4, 2, 5].
// dpvsDyn.dynEntVisData[0..2] byte size = dynEntClientWordCount[0] << 5.
// dpvsDyn.dynEntVisData[3..5] byte size = dynEntClientWordCount[1] << 5.
// heroOnlyLights count = heroOnlyLightCount, stride 0x38.
// umbraGateData and umbraGateData2 byte size = umbraGateCount + 0x1000.

Keep in mind that the checksum is checked on other clients using the mapcrc dvar.