2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2026-06-06 16:52:35 +00:00

feat: gfxworld now uses surface flags for surfaces

This commit is contained in:
LJW-Dev
2026-03-22 18:45:05 +08:00
committed by Jan Laupetin
parent 816fc2f7cb
commit f47792ebe4
2 changed files with 31 additions and 75 deletions
+17 -70
View File
@@ -52,7 +52,7 @@ namespace BSPFlags
SURF_TYPE_ORIGIN,
SURF_TYPE_SKY,
SURF_TYPE_NOCASTSHADOW,
SURF_TYPE_ONLYCASTSHADOW,
SURF_TYPE_CASTSUNSHADOW,
SURF_TYPE_PHYSICSGEOM,
SURF_TYPE_LIGHTPORTAL,
SURF_TYPE_CAULK,
@@ -129,7 +129,7 @@ namespace BSPFlags
{0, 0 }, // origin
{4, 0x800 }, // sky
{0x40000, 0 }, // noCastShadow
{0x80000, 0 }, // onlyCastShadow
{0x80000, 0 }, // castSunShadow
{0, 0 }, // physicsGeom
{0, 0 }, // lightPortal
{0x1000, 0 }, // caulk
@@ -175,7 +175,7 @@ namespace BSPFlags
SURF_TYPE_CANSHOOTCLIP,
SURF_TYPE_SKY,
SURF_TYPE_NOCASTSHADOW,
SURF_TYPE_ONLYCASTSHADOW,
SURF_TYPE_CASTSUNSHADOW,
SURF_TYPE_CAULK,
SURF_TYPE_AREALIGHT,
SURF_TYPE_SLICK,
@@ -193,71 +193,18 @@ namespace BSPFlags
SURF_TYPE_NODLIGHT,
};
constexpr const char* surfaceTypeToNameMap[SURF_TYPE_COUNT] = {"bark",
"brick",
"carpet",
"cloth",
"concrete",
"dirt",
"flesh",
"foliage",
"glass",
"grass",
"gravel",
"ice",
"metal",
"mud",
"paper",
"plaster",
"rock",
"sand",
"snow",
"water",
"wood",
"asphalt",
"ceramic",
"plastic",
"rubber",
"cushion",
"fruit",
"paintedmetal",
"player",
"tallgrass",
"riotshield",
"opaqueglass",
"clipmissile",
"ai_nosight",
"clipshot",
"playerclip",
"monsterclip",
"vehicleclip",
"itemclip",
"nodrop",
"nonsolid",
"detail",
"structural",
"portal",
"canshootclip",
"origin",
"sky",
"nocastshadow",
"onlycastshadow",
"physicsgeom",
"lightportal",
"caulk",
"arealight",
"slick",
"noimpact",
"nomarks",
"nopenetrate",
"ladder",
"nodamage",
"mantleon",
"mantleover",
"mount",
"nosteps",
"nodraw",
"noreceivedynamicshadow",
"nodlight",
"none"};
constexpr const char* surfaceTypeToNameMap[SURF_TYPE_COUNT] = {"bark", "brick", "carpet", "cloth", "concrete",
"dirt", "flesh", "foliage", "glass", "grass",
"gravel", "ice", "metal", "mud", "paper",
"plaster", "rock", "sand", "snow", "water",
"wood", "asphalt", "ceramic", "plastic", "rubber",
"cushion", "fruit", "paintedmetal", "player", "tallgrass",
"riotshield", "opaqueglass", "clipmissile", "ai_nosight", "clipshot",
"playerclip", "monsterclip", "vehicleclip", "itemclip", "nodrop",
"nonsolid", "detail", "structural", "portal", "canshootclip",
"origin", "sky", "nocastshadow", "castshadow", "physicsgeom",
"lightportal", "caulk", "arealight", "slick", "noimpact",
"nomarks", "nopenetrate", "ladder", "nodamage", "mantleon",
"mantleover", "mount", "nosteps", "nodraw", "noreceivedynamicshadow",
"nodlight", "none"};
} // namespace BSPFlags
@@ -61,11 +61,6 @@ namespace BSP
BSPSurface& bspSurface = bsp->gfxWorld.surfaces.at(surfIdx);
GfxSurface* gfxSurface = &gfxWorld->dpvs.surfaces[surfIdx];
gfxSurface->primaryLightIndex = BSPEditableConstants::DEFAULT_SURFACE_LIGHT;
gfxSurface->lightmapIndex = BSPEditableConstants::DEFAULT_SURFACE_LIGHTMAP;
gfxSurface->reflectionProbeIndex = BSPEditableConstants::DEFAULT_SURFACE_REFLECTION_PROBE;
gfxSurface->flags = BSPEditableConstants::DEFAULT_SURFACE_FLAGS;
gfxSurface->tris.triCount = bspSurface.triCount;
gfxSurface->tris.baseIndex = bspSurface.indexOfFirstIndex;
gfxSurface->tris.vertexCount = bspSurface.vertexCount;
@@ -109,6 +104,20 @@ namespace BSP
gfxSurface->tris.maxs.y = gfxSurface->bounds[1].y;
gfxSurface->tris.maxs.z = gfxSurface->bounds[1].z;
gfxSurface->flags = 0;
if ((bspMaterial.contentFlags & BSPFlags::surfaceTypeToFlagMap[BSPFlags::SURF_TYPE_SKY].contentFlags) != 0)
gfxSurface->flags |= GFX_SURFACE_IS_SKY;
if ((bspMaterial.contentFlags & BSPFlags::surfaceTypeToFlagMap[BSPFlags::SURF_TYPE_NODRAW].contentFlags) != 0)
gfxSurface->flags |= GFX_SURFACE_NO_DRAW;
if ((bspMaterial.surfaceFlags & BSPFlags::surfaceTypeToFlagMap[BSPFlags::SURF_TYPE_CASTSUNSHADOW].surfaceFlags) != 0)
gfxSurface->flags |= GFX_SURFACE_CASTS_SUN_SHADOW;
if ((bspMaterial.surfaceFlags & BSPFlags::surfaceTypeToFlagMap[BSPFlags::SURF_TYPE_NOCASTSHADOW].surfaceFlags) == 0)
gfxSurface->flags |= GFX_SURFACE_CASTS_SHADOW;
gfxSurface->primaryLightIndex = BSPEditableConstants::DEFAULT_SURFACE_LIGHT;
gfxSurface->lightmapIndex = BSPEditableConstants::DEFAULT_SURFACE_LIGHTMAP;
gfxSurface->reflectionProbeIndex = BSPEditableConstants::DEFAULT_SURFACE_REFLECTION_PROBE;
// unknown value
gfxSurface->tris.himipRadiusInvSq = 0.0f;
}