Only load some models when needed

This commit is contained in:
James Lambert 2023-07-15 11:28:43 -06:00
parent 148534a67f
commit 77a44b2e64
9 changed files with 63 additions and 39 deletions

View file

@ -168,20 +168,15 @@ build/src/scene/elevator.o: build/assets/models/props/round_elevator_collision.h
# Source engine scale is 64x # Source engine scale is 64x
# #
MODEL_LIST = assets/models/cube/cube.blend \ MODEL_LIST = assets/models/player/chell.blend \
assets/models/player/chell.blend \
assets/models/portal_gun/v_portalgun.blend \ assets/models/portal_gun/v_portalgun.blend \
assets/models/portal_gun/w_portalgun.blend \ assets/models/portal_gun/w_portalgun.blend \
assets/models/props/autoportal_frame/autoportal_frame.blend \
assets/models/props/button.blend \ assets/models/props/button.blend \
assets/models/signage/clock_digits.blend \
assets/models/props/door_01.blend \ assets/models/props/door_01.blend \
assets/models/props/door_02.blend \ assets/models/props/door_02.blend \
assets/models/props/combine_ball_catcher.blend \ assets/models/props/combine_ball_catcher.blend \
assets/models/props/combine_ball_launcher.blend \ assets/models/props/combine_ball_launcher.blend \
assets/models/props/cylinder_test.blend \
assets/models/props/portal_cleanser.blend \ assets/models/props/portal_cleanser.blend \
assets/models/props/radio.blend \
assets/models/props/round_elevator.blend \ assets/models/props/round_elevator.blend \
assets/models/props/round_elevator_interior.blend \ assets/models/props/round_elevator_interior.blend \
assets/models/props/round_elevator_collision.blend \ assets/models/props/round_elevator_collision.blend \
@ -201,7 +196,12 @@ MODEL_LIST = assets/models/cube/cube.blend \
assets/models/grav_flare.blend \ assets/models/grav_flare.blend \
assets/models/fleck_ash2.blend assets/models/fleck_ash2.blend
DYNAMIC_MODEL_LIST = assets/models/signage/clock.blend DYNAMIC_MODEL_LIST = assets/models/cube/cube.blend \
assets/models/props/autoportal_frame/autoportal_frame.blend \
assets/models/props/cylinder_test.blend \
assets/models/props/radio.blend \
assets/models/signage/clock_digits.blend \
assets/models/signage/clock.blend
ANIM_LIST = build/assets/models/pedestal_anim.o \ ANIM_LIST = build/assets/models/pedestal_anim.o \
@ -224,7 +224,7 @@ build/assets/models/%.h build/assets/models/%_geo.c build/assets/models/%_anim.c
build/src/models/models.o: $(MODEL_HEADERS) build/src/models/models.o: $(MODEL_HEADERS)
build/src/decor/decor_object_list.o: $(MODEL_HEADERS) build/src/decor/decor_object_list.o: build/assets/models/dynamic_model_list.h build/assets/materials/static.h
build/src/scene/portal.o: $(MODEL_HEADERS) build/src/scene/portal.o: $(MODEL_HEADERS)

View file

@ -132,7 +132,7 @@ make -f Makefile.docker
- [ ] pausing while glados is speaking can end her speech early - [ ] pausing while glados is speaking can end her speech early
- [ ] don't repeat camera destruction speech every time - [ ] don't repeat camera destruction speech every time
- [ ] don't count boxes on buttons until it is released and stable - [ ] don't count boxes on buttons until it is released and stable
- [ ] dynamically load data - [x] dynamically load data
- [x] fizzle radio/camera - [x] fizzle radio/camera
- [x] add fizller sides - [x] add fizller sides
- [x] flash portal opacity when other portal moves - [x] flash portal opacity when other portal moves

View file

@ -5,6 +5,7 @@
#include "../util/memory.h" #include "../util/memory.h"
#include "../audio/soundplayer.h" #include "../audio/soundplayer.h"
#include "../util/time.h" #include "../util/time.h"
#include "../util/dynamic_asset_loader.h"
#define TIME_TO_FIZZLE 2.0f #define TIME_TO_FIZZLE 2.0f
#define FIZZLE_TIME_STEP (FIXED_DELTA_TIME / TIME_TO_FIZZLE) #define FIZZLE_TIME_STEP (FIXED_DELTA_TIME / TIME_TO_FIZZLE)
@ -44,7 +45,7 @@ void decorObjectRender(void* data, struct DynamicRenderDataList* renderList, str
dynamicRenderListAddData( dynamicRenderListAddData(
renderList, renderList,
decorBuildFizzleGfx(object->definition->graphics, object->fizzleTime, renderState), decorBuildFizzleGfx(dynamicAssetModel(object->definition->dynamicModelIndex), object->fizzleTime, renderState),
matrix, matrix,
(object->fizzleTime > 0.0f) ? object->definition->materialIndexFizzled : object->definition->materialIndex, (object->fizzleTime > 0.0f) ? object->definition->materialIndexFizzled : object->definition->materialIndex,
&object->rigidBody.transform.position, &object->rigidBody.transform.position,
@ -89,6 +90,8 @@ void decorObjectInit(struct DecorObject* object, struct DecorObjectDefinition* d
object->originalRotation = at->rotation; object->originalRotation = at->rotation;
object->originalRoom = room; object->originalRoom = room;
dynamicAssetModelPreload(definition->dynamicModelIndex);
if (definition->colliderType.type != CollisionShapeTypeNone) { if (definition->colliderType.type != CollisionShapeTypeNone) {
collisionObjectUpdateBB(&object->collisionObject); collisionObjectUpdateBB(&object->collisionObject);
} }

View file

@ -16,7 +16,7 @@ struct DecorObjectDefinition {
struct ColliderTypeData colliderType; struct ColliderTypeData colliderType;
float mass; float mass;
float radius; float radius;
Gfx* graphics; short dynamicModelIndex;
short materialIndex; short materialIndex;
short materialIndexFizzled; short materialIndexFizzled;
short soundClipId; short soundClipId;

View file

@ -1,11 +1,8 @@
#include "decor_object_list.h" #include "decor_object_list.h"
#include "../../build/assets/models/props/autoportal_frame/autoportal_frame.h"
#include "../../build/assets/models/props/cylinder_test.h"
#include "../../build/assets/models/cube/cube.h"
#include "../../build/assets/models/props/radio.h"
#include "../../build/assets/materials/static.h" #include "../../build/assets/materials/static.h"
#include "../../build/src/audio/clips.h" #include "../../build/src/audio/clips.h"
#include "../../build/assets/models/dynamic_model_list.h"
#include "../physics/collision_cylinder.h" #include "../physics/collision_cylinder.h"
#include "../physics/collision_box.h" #include "../physics/collision_box.h"
@ -46,7 +43,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
}, },
1.0f, 1.0f,
0.92f, 0.92f,
&props_cylinder_test_model_gfx[0], PROPS_CYLINDER_TEST_DYNAMIC_MODEL,
.materialIndex = PLASTIC_PLASTICWALL001A_INDEX, .materialIndex = PLASTIC_PLASTICWALL001A_INDEX,
.soundClipId = -1, .soundClipId = -1,
}, },
@ -60,7 +57,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
}, },
0.2f, 0.2f,
0.4f, 0.4f,
&props_radio_model_gfx[0], PROPS_RADIO_DYNAMIC_MODEL,
.materialIndex = RADIO_INDEX, .materialIndex = RADIO_INDEX,
.materialIndexFizzled = RADIO_FIZZLED_INDEX, .materialIndexFizzled = RADIO_FIZZLED_INDEX,
.soundClipId = SOUNDS_LOOPING_RADIO_MIX, .soundClipId = SOUNDS_LOOPING_RADIO_MIX,
@ -75,7 +72,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
}, },
2.0f, 2.0f,
0.55f, 0.55f,
&cube_cube_model_gfx[0], CUBE_CUBE_DYNAMIC_MODEL,
.materialIndex = CUBE_INDEX, .materialIndex = CUBE_INDEX,
.materialIndexFizzled = CUBE_FIZZLED_INDEX, .materialIndexFizzled = CUBE_FIZZLED_INDEX,
.soundClipId = -1, .soundClipId = -1,
@ -91,7 +88,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
}, },
2.0f, 2.0f,
0.55f, 0.55f,
&cube_cube_model_gfx[0], CUBE_CUBE_DYNAMIC_MODEL,
.materialIndex = CUBE_INDEX, .materialIndex = CUBE_INDEX,
.materialIndexFizzled = CUBE_FIZZLED_INDEX, .materialIndexFizzled = CUBE_FIZZLED_INDEX,
.soundClipId = -1, .soundClipId = -1,
@ -106,7 +103,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
}, },
0.0f, 0.0f,
1.0f, 1.0f,
&props_autoportal_frame_autoportal_frame_model_gfx[0], PROPS_AUTOPORTAL_FRAME_AUTOPORTAL_FRAME_DYNAMIC_MODEL,
.materialIndex = AUTOPORTAL_FRAME_INDEX, .materialIndex = AUTOPORTAL_FRAME_INDEX,
.soundClipId = -1, .soundClipId = -1,
} }

View file

@ -7,10 +7,11 @@
#include "../util/time.h" #include "../util/time.h"
#include "signals.h" #include "signals.h"
#include "../decor/decor_object_list.h" #include "../decor/decor_object_list.h"
#include "../util/dynamic_asset_loader.h"
#include "../../build/assets/materials/static.h" #include "../../build/assets/materials/static.h"
#include "../../build/assets/models/cube/cube.h"
#include "../../build/assets/models/props/box_dropper.h" #include "../../build/assets/models/props/box_dropper.h"
#include "../../build/assets/models/dynamic_model_list.h"
#define DROOPER_RELOAD_TIME 2.0f #define DROOPER_RELOAD_TIME 2.0f
#define DROPPER_DROP_TIME 0.5f #define DROPPER_DROP_TIME 0.5f
@ -79,7 +80,7 @@ void boxDropperRender(void* data, struct DynamicRenderDataList* renderList, stru
dynamicRenderListAddData( dynamicRenderListAddData(
renderList, renderList,
cube_cube_model_gfx, dynamicAssetModel(CUBE_CUBE_DYNAMIC_MODEL),
pendingBoxMatrix, pendingBoxMatrix,
CUBE_INDEX, CUBE_INDEX,
&dropper->transform.position, &dropper->transform.position,
@ -106,6 +107,8 @@ void boxDropperInit(struct BoxDropper* dropper, struct BoxDropperDefinition* def
dropper->reloadTimer = DROOPER_RELOAD_TIME; dropper->reloadTimer = DROOPER_RELOAD_TIME;
dynamicSceneSetRoomFlags(dropper->dynamicId, ROOM_FLAG_FROM_INDEX(dropper->roomIndex)); dynamicSceneSetRoomFlags(dropper->dynamicId, ROOM_FLAG_FROM_INDEX(dropper->roomIndex));
dynamicAssetModelPreload(CUBE_CUBE_DYNAMIC_MODEL);
} }
void boxDropperUpdate(struct BoxDropper* dropper) { void boxDropperUpdate(struct BoxDropper* dropper) {

View file

@ -6,6 +6,7 @@
#include "../levels/levels.h" #include "../levels/levels.h"
#include "../levels/cutscene_runner.h" #include "../levels/cutscene_runner.h"
#include "../build/assets/models/signage/clock_digits.h" #include "../build/assets/models/signage/clock_digits.h"
#include "../util/memory.h"
#include "../build/assets/models/dynamic_model_list.h" #include "../build/assets/models/dynamic_model_list.h"
@ -33,11 +34,13 @@ void clockSetDigit(int digitIndex, int currDigit) {
return; return;
} }
Vtx* digitPointer = dynamicAssetFixPointer(SIGNAGE_CLOCK_DIGITS_DYNAMIC_MODEL, gClockDigits[digitIndex]);
for (int i = 0; i < 4; ++i) { for (int i = 0; i < 4; ++i) {
gClockDigits[digitIndex][i].v.tc[0] += (currDigit - prevDigit) * DIGIT_WIDTH; digitPointer[i].v.tc[0] += (currDigit - prevDigit) * DIGIT_WIDTH;
} }
gCurrentClockDigits[digitIndex] = (u8)currDigit; gCurrentClockDigits[digitIndex] = (u8)currDigit;
osWritebackDCache(gClockDigits[digitIndex], sizeof(Vtx) * 4); osWritebackDCache(digitPointer, sizeof(Vtx) * 4);
} }
void clockSetTime(float timeInSeconds) { void clockSetTime(float timeInSeconds) {
@ -98,7 +101,7 @@ void clockRenderRender(void* data, struct DynamicRenderDataList* renderList, str
dynamicRenderListAddData( dynamicRenderListAddData(
renderList, renderList,
signage_clock_digits_model_gfx, dynamicAssetModel(SIGNAGE_CLOCK_DIGITS_DYNAMIC_MODEL),
matrix, matrix,
CLOCK_DIGITS_INDEX, CLOCK_DIGITS_INDEX,
&clock->transform.position, &clock->transform.position,
@ -107,7 +110,8 @@ void clockRenderRender(void* data, struct DynamicRenderDataList* renderList, str
} }
void clockInit(struct Clock* clock, struct ClockDefinition* definition) { void clockInit(struct Clock* clock, struct ClockDefinition* definition) {
dynamicAssetPreload(SIGNAGE_CLOCK_DYNAMIC_MODEL); dynamicAssetModelPreload(SIGNAGE_CLOCK_DYNAMIC_MODEL);
dynamicAssetModelPreload(SIGNAGE_CLOCK_DIGITS_DYNAMIC_MODEL);
clock->transform.position = definition->position; clock->transform.position = definition->position;
clock->transform.rotation = definition->rotation; clock->transform.rotation = definition->rotation;
@ -117,6 +121,8 @@ void clockInit(struct Clock* clock, struct ClockDefinition* definition) {
int dynamicId = dynamicSceneAdd(clock, clockRenderRender, &clock->transform.position, 0.8f); int dynamicId = dynamicSceneAdd(clock, clockRenderRender, &clock->transform.position, 0.8f);
dynamicSceneSetRoomFlags(dynamicId, ROOM_FLAG_FROM_INDEX(clock->roomIndex)); dynamicSceneSetRoomFlags(dynamicId, ROOM_FLAG_FROM_INDEX(clock->roomIndex));
zeroMemory(gCurrentClockDigits, sizeof(gCurrentClockDigits));
} }
void clockUpdate(struct Clock* clock) { void clockUpdate(struct Clock* clock) {

View file

@ -6,6 +6,7 @@
extern struct DynamicAssetModel gDynamicModels[]; extern struct DynamicAssetModel gDynamicModels[];
Gfx* gLoadedModels[DYNAMIC_MODEL_COUNT]; Gfx* gLoadedModels[DYNAMIC_MODEL_COUNT];
u32 gModelPointerOffset[DYNAMIC_MODEL_COUNT];
Gfx gBlankGfx[] = { Gfx gBlankGfx[] = {
gsSPEndDisplayList(), gsSPEndDisplayList(),
@ -17,24 +18,30 @@ void dynamicAssetsReset() {
#define ADJUST_POINTER_POS(ptr, offset) (void*)((ptr) ? (char*)(ptr) + (offset) : 0) #define ADJUST_POINTER_POS(ptr, offset) (void*)((ptr) ? (char*)(ptr) + (offset) : 0)
Gfx* dynamicAssetFixModelPointers(Gfx* gfx, u32 pointerOffset, u32 segmentStart, u32 segmentEnd) { Gfx* dynamicAssetFixModelPointers(Gfx* gfx, u32 pointerOffset, u32 segmentStart, u32 segmentLength) {
// only adjust pointers that land within the segment // only adjust pointers that land within the segment
if ((u32)gfx < segmentStart || (u32)gfx >= segmentEnd) { if ((u32)gfx < segmentStart || (u32)gfx >= segmentStart + segmentLength) {
return gfx; return gfx;
} }
gfx = ADJUST_POINTER_POS(gfx, pointerOffset); gfx = ADJUST_POINTER_POS(gfx, pointerOffset);
while (1) {
Gfx* result = gfx;
// prevent an infinite loop, although this G_ENDL
// isn't reached this will be bad anyway
Gfx* maxGfx = gfx + (segmentLength >> 3);
while (gfx < maxGfx) {
int commandType = _SHIFTR(gfx->words.w0, 24, 8); int commandType = _SHIFTR(gfx->words.w0, 24, 8);
switch (commandType) { switch (commandType) {
case G_ENDDL: case G_ENDDL:
return gfx; return result;
case G_DL: case G_DL:
if (gfx->dma.par == G_DL_NOPUSH) { if (gfx->dma.par == G_DL_NOPUSH) {
break; break;
} }
gfx->dma.addr = (u32)dynamicAssetFixModelPointers((Gfx*)gfx->dma.addr, pointerOffset, segmentStart, segmentEnd); gfx->dma.addr = (u32)dynamicAssetFixModelPointers((Gfx*)gfx->dma.addr, pointerOffset, segmentStart, segmentLength);
break; break;
case G_VTX: case G_VTX:
gfx->dma.addr = (u32)ADJUST_POINTER_POS(gfx->dma.addr, pointerOffset); gfx->dma.addr = (u32)ADJUST_POINTER_POS(gfx->dma.addr, pointerOffset);
@ -47,20 +54,20 @@ Gfx* dynamicAssetFixModelPointers(Gfx* gfx, u32 pointerOffset, u32 segmentStart,
return NULL; return NULL;
} }
Gfx* dynamicAssetLoadModel(struct DynamicAssetModel* model) { Gfx* dynamicAssetLoadModel(struct DynamicAssetModel* model, u32* pointerOffset) {
u32 length = (u32)model->addressEnd - (u32)model->addressStart; u32 length = (u32)model->addressEnd - (u32)model->addressStart;
void* assetMemoryChunk = malloc(length); void* assetMemoryChunk = malloc(length);
romCopy(model->addressStart, assetMemoryChunk, length); romCopy(model->addressStart, assetMemoryChunk, length);
u32 pointerOffset = (u32)assetMemoryChunk - (u32)model->segmentStart; *pointerOffset = (u32)assetMemoryChunk - (u32)model->segmentStart;
return dynamicAssetFixModelPointers(model->model, pointerOffset, (u32)model->segmentStart, (u32)model->segmentStart + length); return dynamicAssetFixModelPointers(model->model, *pointerOffset, (u32)model->segmentStart, length);
} }
void dynamicAssetPreload(int index) { void dynamicAssetModelPreload(int index) {
if (index < 0 || index >= DYNAMIC_MODEL_COUNT || gLoadedModels[index] ) { if (index < 0 || index >= DYNAMIC_MODEL_COUNT || gLoadedModels[index] ) {
return; return;
} }
gLoadedModels[index] = dynamicAssetLoadModel(&gDynamicModels[index]); gLoadedModels[index] = dynamicAssetLoadModel(&gDynamicModels[index], &gModelPointerOffset[index]);
} }
Gfx* dynamicAssetModel(int index) { Gfx* dynamicAssetModel(int index) {
@ -69,4 +76,12 @@ Gfx* dynamicAssetModel(int index) {
} }
return gLoadedModels[index]; return gLoadedModels[index];
}
void* dynamicAssetFixPointer(int index, void* ptr) {
if (index < 0 || index >= DYNAMIC_MODEL_COUNT || !gLoadedModels[index]) {
return NULL;
}
return (void*)ADJUST_POINTER_POS(ptr, gModelPointerOffset[index]);
} }

View file

@ -10,11 +10,11 @@ struct DynamicAssetModel {
Gfx* model; Gfx* model;
}; };
Gfx* dynamicAssetLoadModel(struct DynamicAssetModel* model);
void dynamicAssetsReset(); void dynamicAssetsReset();
void dynamicAssetPreload(int index); void dynamicAssetModelPreload(int index);
Gfx* dynamicAssetModel(int index); Gfx* dynamicAssetModel(int index);
void* dynamicAssetFixPointer(int index, void* ptr);
#endif #endif