Compare commits

...

3 Commits

Author SHA1 Message Date
Jarrod Doyle d144a1c805
Add specificity to some model fields 2025-03-09 20:27:40 +00:00
Jarrod Doyle c01502f218
Add cell weather 2025-03-09 20:27:06 +00:00
Jarrod Doyle 96bca0fac7
Add LM_PARAM chunk 2025-03-09 20:26:17 +00:00
5 changed files with 48 additions and 6 deletions

View File

@ -4,9 +4,15 @@
// TODO: All these types should be enums lol
enum ObjectType : u8 {
Static,
Rotating,
Sliding,
};
struct Object {
char name[8];
u8 type;
ObjectType type;
s32 parameter;
float min_range;
float max_range;
@ -41,8 +47,19 @@ struct AuxMaterialInfo {
}
};
enum VHotId : u32 {
LightPosition = 1,
LightDirection = 8,
Anchor = 2,
Particle1 = 3,
Particle2 = 4,
Particle3 = 5,
Particle4 = 6,
Particle5 = 7,
};
struct VHot {
u32 id;
VHotId id;
Vec3<float> location;
};

View File

@ -28,6 +28,7 @@
#include "db_files/chunks/HotRegions.hexpat"
#include "db_files/chunks/L$_.hexpat"
#include "db_files/chunks/LD$_.hexpat"
#include "db_files/chunks/LM_PARAM.hexpat"
#include "db_files/chunks/MAPISRC.hexpat"
#include "db_files/chunks/Mission_GameSysEAX.hexpat"
#include "db_files/chunks/MultiBrush.hexpat"

View File

@ -66,6 +66,7 @@ struct TOCEntry {
("FOGZONEVAR"): Chunk<FogZoneVar> fog_zone_var @ offset;
("GameSysEAX"): Chunk<AccousticsProperty> gamesys_eax @ offset;
("HotRegions"): Chunk<HotRegions> hot_regions @ offset;
("LM_PARAM"): Chunk<LmParams> lm_params @ offset;
("MAPISRC"): Chunk<MapISrc> map_i_src @ offset;
("MissionEAX"): Chunk<AccousticsProperty> mission_eax @ offset;
("MultiBrush"): Chunk<MultiBrush> multibrush @ offset;
@ -92,11 +93,9 @@ struct TOCEntry {
}
else if (std::string::starts_with(name, "LD$")) {
Chunk<LinkDataChunk> link_data @ offset [[name(name)]];
// std::print("LD: {}", name);
}
else if (std::string::starts_with(name, "L$")) {
Chunk<LinkMap> link_chunk @ offset [[name(name)]];
// std::print("L: {}", name);
}
else {
std::print("Didn't load chunk: {}", name);

View File

@ -0,0 +1,17 @@
#pragma once
#include "Common.hexpat"
struct LmParams {
u32 unknown1; // I think this is struct size (seemingly always 36)
float attenuation;
float saturation;
u32 shadow_type; // TODO: Enum
u32 softness; // TODO: Enum
float center_weight;
u32 depth_mode; // TODO: Enum (16, 32, 32-2x)
bool lightmapped_water;
padding[3];
s32 lightmap_scale;
u32 animlight_cutoff;
};

View File

@ -19,6 +19,7 @@ using WrLightMapDataPixel;
using WrBspTree;
using WrBspTreeNode;
using WrBspTreeCellPlane;
using WrCellWeather;
using WrLightTable;
using WrLightTableData;
using WrLightTableAnimLight;
@ -32,7 +33,7 @@ struct WrExt {
WrHeader header;
WrCell cells[header.cell_count];
WrBspTree bsp_tree;
padding[header.cell_count]; // This is suspicious. Fog? SEE VFIGS MISSDEEDS!!
WrCellWeather weather[header.cell_count];
WrLightTable lights;
WrCsgCellTable csg_cell_table;
};
@ -147,7 +148,9 @@ struct WrLightMap {
u32 count = 1 + std::bit::popcount(parent.p_light_list[i].anim_light_bitmask);
u32 bytes_per_pixel = parent.parent.header.bytes_per_pixel;
WrLightMapLayer layers[count];
// WrLightMapLayer layers[count];
// u8 pixels[count * width * height * bytes_per_pixel];
padding[count * width * height * bytes_per_pixel];
};
struct WrLightMapLayer {
@ -178,6 +181,11 @@ struct WrBspTreeCellPlane {
s32 plane_id;
};
bitfield WrCellWeather {
fog_zone : 4; // No fog and fog zone 0 share a value. Cells have flags & 64 if they're foggy
ambient_zone : 4;
};
struct WrLightTable {
s32 light_count;
s32 dynamic_light_count;