Graphics Map Asset (MW2): Difference between revisions

From COD Engine Research
Jakes625 (talk | contribs)
No edit summary
Jakes625 (talk | contribs)
 
(One intermediate revision by the same user not shown)
Line 9: Line 9:
=== Structures ===
=== Structures ===
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
struct XModelDrawInfo
#pragma pack(push, 4)
{
  unsigned __int16 lod;
  unsigned __int16 surfId;
};


struct GfxSceneDynModel
typedef struct GfxImage GfxImage;
{
typedef struct Material Material;
  XModelDrawInfo info;
typedef struct XModel XModel;
  unsigned __int16 dynEntId;
};


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


struct GfxSceneDynBrush
typedef struct GfxWorldDpvsPlanes
{
{
  BModelDrawInfo info;
    int32_t cellCount;
  unsigned __int16 dynEntId;
    DpvsPlane *planes;
};
    uint16_t *nodes;
    uint32_t *sceneEntCellBits;
} GfxWorldDpvsPlanes; // 0x10


struct GfxStreamingAabbTree
typedef struct GfxSky
{
{
  unsigned __int16 firstItem;
    int32_t skySurfCount;
  unsigned __int16 itemCount;
    int32_t *skyStartSurfs;
  unsigned __int16 firstChild;
    GfxImage *skyImage;
  unsigned __int16 childCount;
    int32_t skySamplerState;
  float mins[3];
} GfxSky; // 0x10
  float maxs[3];
};


struct GfxWorldStreamInfo
typedef struct GfxCellTreeCount
{
{
  int aabbTreeCount;
    uint32_t aabbTreeCount;
  GfxStreamingAabbTree *aabbTrees;
} GfxCellTreeCount; // 0x04
  int leafRefCount;
  int *leafRefs;
};


union GfxColor
typedef struct GfxAabbTree
{
{
  unsigned int packed;
    float mins[3];
  char array[4];
    float maxs[3];
};
    uint16_t childCount;
    uint16_t surfaceCount;
    uint16_t startSurfIndex;
    uint16_t smodelIndexCount;
    uint16_t *smodelIndexes;
    int32_t childrenOffset;
} GfxAabbTree; // 0x28


union PackedUnitVec
typedef struct GfxCellTree
{
{
  unsigned int packed;
    GfxAabbTree *aabbTrees;
};
} GfxCellTree; // 0x04


struct GfxWorldVertex
typedef struct GfxPortalVertex
{
{
  float xyz[3];
    float xyz[3];
  float binormalSign;
} GfxPortalVertex; // 0x0C
  GfxColor color;
  float texCoord[2];
  float lmapCoord[2];
  PackedUnitVec normal;
  PackedUnitVec tangent;
};


struct GfxWorldVertexData
typedef struct GfxPortal
{
{
  GfxWorldVertex *vertices;
    uint8_t isQueued;
  D3DVertexBuffer worldVb;
    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


struct GfxLight
typedef struct GfxCell
{
{
  char type;
    float mins[3];
  char canUseShadowMap;
    float maxs[3];
  char unused[2];
    int32_t portalCount;
  float color[3];
    GfxPortal *portals;
  float dir[3];
    uint8_t reflectionProbeCount;
  float origin[3];
    uint8_t pad21[3];
  float radius;
    uint8_t *reflectionProbes;
  float cosHalfFovOuter;
} GfxCell; // 0x28
  float cosHalfFovInner;
  int exponent;
  unsigned int spotShadowIndex;
  GfxLightDef *def;
};


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


struct GfxWorldDpvsPlanes
typedef struct GfxTexture
{
{
  int cellCount;
    uint32_t words[6];
  cplane_s *planes;
} GfxTexture; // 0x18
  unsigned __int16 *nodes;
  unsigned int *sceneEntCellBits; //Size = cellCount << 11
};


struct GfxAabbTree
typedef struct GfxLightmapArray
{
{
  float mins[3];
    GfxImage *primary;
  float maxs[3];
    GfxImage *secondary;
  unsigned __int16 childCount;
} GfxLightmapArray; // 0x08
  unsigned __int16 surfaceCount;
  unsigned __int16 startSurfIndex;
  unsigned __int16 smodelIndexCount;
  unsigned __int16 *smodelIndexes;
  int childrenOffset;
};


struct GfxLightGridEntry
typedef struct GfxWorldVertexData
{
{
  unsigned __int16 colorsIndex;
    uint8_t *vertices;
  char primaryLightIndex;
    int32_t worldVbHandle;
  char needsTrace;
    int32_t worldVbOffset;
};
} GfxWorldVertexData; // 0x0C


struct GfxLightGridColors
typedef struct GfxWorldVertexLayerData
{
{
  char rgb[56][3];
    uint8_t *data;
};
    int32_t layerVbHandle;
    int32_t layerVbOffset;
} GfxWorldVertexLayerData; // 0x0C


struct GfxStaticModelInst
typedef struct GfxWorldDraw
{
{
  float mins[3];
    uint32_t reflectionProbeCount;
  float maxs[3];
    GfxImage **reflectionImages;
  GfxColor groundLighting;
    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


struct srfTriangles_t
typedef struct GfxLightGridEntry
{
{
  int vertexLayerData;
    uint16_t colorsIndex;
  int firstVertex;
    uint8_t primaryLightIndex;
  unsigned __int16 vertexCount;
    uint8_t needsTrace;
  unsigned __int16 triCount;
} GfxLightGridEntry; // 0x04
  int baseIndex;
};


struct GfxSurface
typedef struct GfxLightGridColors
{
{
  srfTriangles_t tris;
    uint8_t rgb[56][3];
  Material *material;
} GfxLightGridColors; // 0xA8
  char lightmapIndex;
  char reflectionProbeIndex;
  char primaryLightIndex;
  bool castsSunShadow;
};


struct GfxCullGroup
typedef struct GfxLightGrid
{
{
  float mins[3];
    uint32_t hasLightRegions;
  float maxs[3];
    uint32_t sunPrimaryLightIndex;
  int surfaceCount;
    uint16_t mins[3];
  int startSurfIndex;
    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 GfxDrawSurfFields
typedef struct GfxBrushModel
{
{
  __int64 _bf0;
    float writableMins[3];
};
    float writableMaxs[3];
    float boundsMins[3];
    float boundsMaxs[3];
    uint32_t surfaceCount;
    uint32_t startSurfIndex;
} GfxBrushModel; // 0x38


union GfxDrawSurf
typedef struct MaterialMemory
{
{
  GfxDrawSurfFields fields;
    Material *material;
  unsigned __int64 packed;
    int32_t memory;
};
} MaterialMemory; // 0x08


struct GfxWorldDpvsStatic
typedef struct Sunflare
{
{
  unsigned int smodelCount;
    uint32_t hasValidData;
  unsigned int staticSurfaceCount;
    Material *spriteMaterial;
  unsigned int litSurfsBegin;
    Material *flareMaterial;
  unsigned int litSurfsEnd;
    float spriteSize;
  char unknown1[0x20];
    float flareMinSize;
  char *smodelVisData[3];
    float flareMinDot;
  char *surfaceVisData[3];
    float flareMaxSize;
  unsigned __int16 *sortedSurfIndex;
    float flareMaxDot;
  GfxStaticModelInst *smodelInsts;
    float flareMaxAlpha;
  GfxSurface *surfaces;
    int32_t flareFadeInTime;
  GfxCullGroup *cullGroups;
    int32_t flareFadeOutTime;
  GfxStaticModelDrawInst *smodelDrawInsts;
    float blindMinDot;
  GfxDrawSurf *surfaceMaterials;
    float blindMaxDot;
  unsigned int *surfaceCastsSunShadow;
    float blindMaxDarken;
  volatile int usageCount;
    int32_t blindFadeInTime;
};
    int32_t blindFadeOutTime;
    float glareMinDot;
    float glareMaxDot;
    float glareMaxLighten;
    int32_t glareFadeInTime;
    int32_t glareFadeOutTime;
    float sunFxPosition[3];
} Sunflare; // 0x60


#pragma pack(push, 4)
typedef struct GfxSceneDynModel
struct GfxPackedPlacement
{
{
  float origin[3];
    uint16_t lod;
  PackedUnitVec axis[3];
    uint16_t surfId;
  float scale;
    uint16_t dynEntId;
};
} GfxSceneDynModel; // 0x06


struct GfxStaticModelDrawInst
typedef struct GfxSceneDynBrush
{
{
  GfxPackedPlacement placement;
    uint16_t surfId;
  XModel *model;
    uint16_t dynEntId;
  float cullDist;
} GfxSceneDynBrush; // 0x04
  char reflectionProbeIndex;
  char primaryLightIndex;
  unsigned __int16 lightingHandle;
  char flags;
};


struct cplane_s
typedef struct GfxShadowGeometry
{
{
  float normal[3];
    uint16_t surfaceCount;
  float dist;
    uint16_t smodelCount;
  char type;
    uint16_t *sortedSurfIndex;
  char signbits;
    uint16_t *smodelIndex;
};
} GfxShadowGeometry; // 0x0C


struct GfxPortalWritable
typedef struct GfxLightRegionAxis
{
{
  bool isQueued;
    float dir[3];
  bool isAncestor;
    float midPoint;
  char recursionDepth;
    float halfSize;
  char hullPointCount;
} GfxLightRegionAxis; // 0x14
  float (*hullPoints)[2];
};


struct DpvsPlane
typedef struct GfxLightRegionHull
{
{
  float coeffs[4];
    float kdopMidPoint[9];
  char side[3];
    float kdopHalfSize[9];
};
    uint32_t axisCount;
    GfxLightRegionAxis *axis;
} GfxLightRegionHull; // 0x50


struct GfxPortal
typedef struct GfxLightRegion
{
{
  GfxPortalWritable writable;
    int32_t hullCount;
  DpvsPlane plane;
    GfxLightRegionHull *hulls;
  float (*vertices)[3];
} GfxLightRegion; // 0x08
      char unknown[2];
  char vertexCount;
  float hullAxis[2][3];
};


struct GfxCell
typedef struct GfxPackedPlacement
{
{
  float mins[3];
    float origin[3];
  float maxs[3];
    uint32_t packedAxis[3];
  int portalCount;
    float scale;
  GfxPortal *portals;
} GfxPackedPlacement; // 0x1C
  char reflectionProbeCount;
  char *reflectionProbes;
};


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


struct GfxLightGrid
typedef struct SrfTriangles
{
{
  bool hasLightRegions;
    int32_t vertexLayerData;
  unsigned int sunPrimaryLightIndex;
    int32_t baseVertex;
  unsigned __int16 mins[3];
    uint32_t minVertexIndex;
  unsigned __int16 maxs[3];
    uint16_t vertexCount;
  unsigned int rowAxis;
    uint16_t triCount;
  unsigned int colAxis;
    int32_t baseIndex;
  unsigned __int16 *rowDataStart;
} SrfTriangles; // 0x14
  unsigned int rawRowDataSize;
  char *rawRowData;
  unsigned int entryCount;
  GfxLightGridEntry *entries;
  unsigned int colorCount;
  GfxLightGridColors *colors;
};


struct GfxBrushModelWritable
typedef struct GfxSurface
{
{
  float mins[3];
    SrfTriangles tris;
  float maxs[3];
    Material *material;
};
    uint8_t lightmapIndex;
    uint8_t reflectionProbeIndex;
    uint8_t primaryLightIndex;
    uint8_t castsSunShadow;
} GfxSurface; // 0x1C


struct GfxBrushModel
typedef union GfxMapDrawSurf
{
{
  GfxBrushModelWritable writable;
    uint64_t packed;
  float bounds[2][3];
} GfxMapDrawSurf; // 0x08
  unsigned int surfaceCount;
  unsigned int startSurfIndex;
};


struct MaterialMemory
typedef struct GfxCullGroup
{
{
  Material *material;
    float mins[3];
  int memory;
    float maxs[3];
};
    int32_t surfaceCount;
    int32_t startSurfIndex;
} GfxCullGroup; // 0x20


struct sunflare_t
typedef struct GfxStaticModelDrawInst
{
{
  bool hasValidData;
    GfxPackedPlacement placement;
  Material *spriteMaterial;
    XModel *model;
  Material *flareMaterial;
    uint16_t cullDist;
  float spriteSize;
    uint16_t lightingHandle;
  float flareMinSize;
    uint8_t reflectionProbeIndex;
  float flareMinDot;
    uint8_t primaryLightIndex;
  float flareMaxSize;
    uint8_t flags;
  float flareMaxDot;
    uint8_t firstMaterialSkinIndex;
  float flareMaxAlpha;
    uint8_t unknown28;
  int flareFadeInTime;
    uint8_t unknown29;
  int flareFadeOutTime;
    uint8_t unknown2A;
  float blindMinDot;
    uint8_t unknown2B;
  float blindMaxDot;
} GfxStaticModelDrawInst; // 0x2C
  float blindMaxDarken;
  int blindFadeInTime;
  int blindFadeOutTime;
  float glareMinDot;
  float glareMaxDot;
  float glareMaxLighten;
  int glareFadeInTime;
  int glareFadeOutTime;
  float sunFxPosition[3];
};


struct GfxShadowGeometry
typedef struct GfxWorldDpvsStatic
{
{
  unsigned __int16 surfaceCount;
    uint32_t smodelCount;
  unsigned __int16 smodelCount;
    uint32_t staticSurfaceCount;
  unsigned __int16 *sortedSurfIndex;
    uint32_t litSurfsBegin;
  unsigned __int16 *smodelIndex;
    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 GfxLightRegionAxis
typedef struct GfxWorldDpvsDynamic
{
{
  float dir[3];
    uint32_t dynEntClientWordCount[2];
  float midPoint;
    uint32_t dynEntClientCount[2];
  float halfSize;
    uint32_t *dynEntCellBits[2];
};
    uint8_t *dynEntVisData[6];
} GfxWorldDpvsDynamic; // 0x30


struct GfxLightRegionHull
typedef struct GfxHeroOnlyLight
{
{
  float kdopMidPoint[9];
    uint8_t bytes[0x38];
  float kdopHalfSize[9];
} GfxHeroOnlyLight; // 0x38
  unsigned int axisCount;
  GfxLightRegionAxis *axis;
};


struct GfxLightRegion
typedef struct GfxWorld
{
{
  unsigned int hullCount;
    const char *name;
  GfxLightRegionHull *hulls;
    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


struct GfxWorldDpvsDynamic
#pragma pack(pop)
{
</syntaxhighlight>
  unsigned int dynEntClientWordCount[2];
  unsigned int dynEntClientCount[2];
  unsigned int *dynEntCellBits[2];
  char *dynEntVisData[2][3];
};


struct SunLightParseParams
==== Notes ====
{
<syntaxhighlight lang="C">
  char name[64];
// sceneEntCellBits count = cellCount << 9 uint32_t values.
  float ambientScale;
// rowDataStart count = maxs[rowAxis] - mins[rowAxis] + 1 uint16_t values.
  float ambientColor[3];
// vertices payload size = vertexCount * 0x10 bytes.
  float diffuseFraction;
// vertexLayerData payload size = vertexLayerDataSize bytes.
  float sunLight;
// cellCasterBits count = cellCount * ((cellCount + 31) >> 5) uint32_t values.
  float sunColor[3];
// cellCasterBits2 count = ((cellCount + 31) >> 5) uint32_t values.
  float diffuseColor[3];
// sceneDynModel count = dpvsDyn.dynEntClientCount[0].
  bool diffuseColorHasBeenSet;
// sceneDynBrush count = dpvsDyn.dynEntClientCount[1].
  float angles[3];
// 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.
</syntaxhighlight>


struct GfxWorldVertexLayerData
{
  char *data;
  D3DVertexBuffer layerVb;
};
typedef char GfxTexture[0x34];
struct GfxWorldDraw
{
  unsigned int reflectionProbeCount;
  GfxImage * * reflectionImages;
  GfxReflectionProbe *reflectionProbes;
  GfxTexture * reflectionProbeTextures; //Count = refelctionProbeCount
  int lightmapCount;
  GfxLightmapArray *lightmaps;
  GfxTexture * lightmapPrimaryTextures; //Count = lightmapCount
  GfxTexture * lightmapSecondaryTextures; //Count = lightmapCount
  GfxImage *skyImage;
  GfxImage *outdoorImage;
  unsigned int vertexCount;
  GfxWorldVertexData vd;
  unsigned int vertexLayerDataSize;
  GfxWorldVertexLayerData vld;
  int indexCount;
  unsigned __int16 *indices;
  D3DIndexBuffer indexBuffer;
};
struct unknownGfxWorldStruct2
{
  int unknownCount;
  int * unknownArray;
  GfxImage * unknownImage;
  int unknown;
};
struct GfxWorld
{
  const char *name;
  const char *baseName;
  int planeCount;
  int nodeCount;
      int unknown2;
      unsigned int unknownCount1;
      unknownGfxWorldStruct2 * unknownStructs1; //Count = unknownCount1;
      char unknown1[0x18];
  GfxWorldDpvsPlanes dpvsPlanes; //The following rely on the count in this
      char *unknown4;
  GfxAabbTree *aabbTree;
  GfxCell *cells;
  GfxWorldDraw worldDraw;
  GfxLightGrid lightGrid;
  int modelCount;
  GfxBrushModel *models;
  float mins[3];
  float maxs[3];
  unsigned int checksum;
  int materialMemoryCount;
  MaterialMemory *materialMemory;
  sunflare_t sun;
  unsigned int *cellCasterBits[2];
  GfxSceneDynModel *sceneDynModel;
  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>
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.