inject: introduce OBJECT_3D editor

This adds the ability to edit OBJECT_3Ds (static mesh properties). It
alos addresses potential memory corruption in the scenario where a new
data type is present in an injection but it is being loaded into a
version of the game that doesn't recognise it.
This commit is contained in:
lahm86 2025-03-14 20:14:26 +00:00
parent 70bf6a089d
commit 77ca92d205
3 changed files with 43 additions and 2 deletions

View file

@ -125,7 +125,9 @@ static void M_InitialiseBlock(VFILE *const file)
const INJECTION_DATA_TYPE data_type = VFile_ReadS32(file);
const int32_t data_count = VFile_ReadS32(file);
const int32_t data_size = VFile_ReadS32(file);
m_DataCounts[data_type] += data_count;
if (data_type >= 0 && data_type < IDT_NUMBER_OF) {
m_DataCounts[data_type] += data_count;
}
switch (data_type) {
case IDT_ROOM_EDIT_META: {

View file

@ -37,6 +37,9 @@ static void M_ApplyFace3Edit(
const FACE_EDIT *edit, FACE3 *faces, uint16_t texture);
static uint16_t *M_GetMeshTexture(const FACE_EDIT *edit);
static void M_Object3DEdits(const INJECTION *injection, int32_t data_count);
static BOUNDS_16 M_ReadBounds16(VFILE *file);
static void M_MeshEdits(
const INJECTION *const injection, const int32_t data_count)
{
@ -207,4 +210,39 @@ static uint16_t *M_GetMeshTexture(const FACE_EDIT *const edit)
return nullptr;
}
static void M_Object3DEdits(
const INJECTION *const injection, const int32_t data_count)
{
for (int32_t i = 0; i < data_count; i++) {
const int32_t obj_id = VFile_ReadS32(injection->fp);
const bool collidable = VFile_ReadU8(injection->fp) == 1;
const bool visible = VFile_ReadU8(injection->fp) == 1;
const BOUNDS_16 collision_bounds = M_ReadBounds16(injection->fp);
const BOUNDS_16 draw_bounds = M_ReadBounds16(injection->fp);
STATIC_OBJECT_3D *const obj = Object_Get3DStatic(obj_id);
if (!obj->loaded) {
continue;
}
obj->collidable = collidable;
obj->visible = visible;
obj->collision_bounds = collision_bounds;
obj->draw_bounds = draw_bounds;
}
}
static BOUNDS_16 M_ReadBounds16(VFILE *const file)
{
BOUNDS_16 bounds = {};
bounds.min.x = VFile_ReadS16(file);
bounds.max.x = VFile_ReadS16(file);
bounds.min.y = VFile_ReadS16(file);
bounds.max.y = VFile_ReadS16(file);
bounds.min.z = VFile_ReadS16(file);
bounds.max.z = VFile_ReadS16(file);
return bounds;
}
REGISTER_INJECT_EDITOR(IDT_MESH_EDITS, M_MeshEdits)
REGISTER_INJECT_EDITOR(IDT_OBJECT_3D_EDITS, M_Object3DEdits)

View file

@ -65,7 +65,8 @@ typedef enum {
IDT_VIS_PORTAL_EDITS = 23,
IDT_CAMERA_EDITS = 24,
IDT_FRAME_EDITS = 25,
IDT_NUMBER_OF = 26,
IDT_OBJECT_3D_EDITS = 26,
IDT_NUMBER_OF = 27,
} INJECTION_DATA_TYPE;
typedef enum {