Only load some models when needed
This commit is contained in:
parent
148534a67f
commit
77a44b2e64
16
Makefile
16
Makefile
|
@ -168,20 +168,15 @@ build/src/scene/elevator.o: build/assets/models/props/round_elevator_collision.h
|
|||
# Source engine scale is 64x
|
||||
#
|
||||
|
||||
MODEL_LIST = assets/models/cube/cube.blend \
|
||||
assets/models/player/chell.blend \
|
||||
MODEL_LIST = assets/models/player/chell.blend \
|
||||
assets/models/portal_gun/v_portalgun.blend \
|
||||
assets/models/portal_gun/w_portalgun.blend \
|
||||
assets/models/props/autoportal_frame/autoportal_frame.blend \
|
||||
assets/models/props/button.blend \
|
||||
assets/models/signage/clock_digits.blend \
|
||||
assets/models/props/door_01.blend \
|
||||
assets/models/props/door_02.blend \
|
||||
assets/models/props/combine_ball_catcher.blend \
|
||||
assets/models/props/combine_ball_launcher.blend \
|
||||
assets/models/props/cylinder_test.blend \
|
||||
assets/models/props/portal_cleanser.blend \
|
||||
assets/models/props/radio.blend \
|
||||
assets/models/props/round_elevator.blend \
|
||||
assets/models/props/round_elevator_interior.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/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 \
|
||||
|
@ -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/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)
|
||||
|
||||
|
|
|
@ -132,7 +132,7 @@ make -f Makefile.docker
|
|||
- [ ] pausing while glados is speaking can end her speech early
|
||||
- [ ] don't repeat camera destruction speech every time
|
||||
- [ ] don't count boxes on buttons until it is released and stable
|
||||
- [ ] dynamically load data
|
||||
- [x] dynamically load data
|
||||
- [x] fizzle radio/camera
|
||||
- [x] add fizller sides
|
||||
- [x] flash portal opacity when other portal moves
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "../util/memory.h"
|
||||
#include "../audio/soundplayer.h"
|
||||
#include "../util/time.h"
|
||||
#include "../util/dynamic_asset_loader.h"
|
||||
|
||||
#define TIME_TO_FIZZLE 2.0f
|
||||
#define FIZZLE_TIME_STEP (FIXED_DELTA_TIME / TIME_TO_FIZZLE)
|
||||
|
@ -44,7 +45,7 @@ void decorObjectRender(void* data, struct DynamicRenderDataList* renderList, str
|
|||
|
||||
dynamicRenderListAddData(
|
||||
renderList,
|
||||
decorBuildFizzleGfx(object->definition->graphics, object->fizzleTime, renderState),
|
||||
decorBuildFizzleGfx(dynamicAssetModel(object->definition->dynamicModelIndex), object->fizzleTime, renderState),
|
||||
matrix,
|
||||
(object->fizzleTime > 0.0f) ? object->definition->materialIndexFizzled : object->definition->materialIndex,
|
||||
&object->rigidBody.transform.position,
|
||||
|
@ -89,6 +90,8 @@ void decorObjectInit(struct DecorObject* object, struct DecorObjectDefinition* d
|
|||
object->originalRotation = at->rotation;
|
||||
object->originalRoom = room;
|
||||
|
||||
dynamicAssetModelPreload(definition->dynamicModelIndex);
|
||||
|
||||
if (definition->colliderType.type != CollisionShapeTypeNone) {
|
||||
collisionObjectUpdateBB(&object->collisionObject);
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ struct DecorObjectDefinition {
|
|||
struct ColliderTypeData colliderType;
|
||||
float mass;
|
||||
float radius;
|
||||
Gfx* graphics;
|
||||
short dynamicModelIndex;
|
||||
short materialIndex;
|
||||
short materialIndexFizzled;
|
||||
short soundClipId;
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
#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/src/audio/clips.h"
|
||||
#include "../../build/assets/models/dynamic_model_list.h"
|
||||
|
||||
#include "../physics/collision_cylinder.h"
|
||||
#include "../physics/collision_box.h"
|
||||
|
@ -46,7 +43,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
|
|||
},
|
||||
1.0f,
|
||||
0.92f,
|
||||
&props_cylinder_test_model_gfx[0],
|
||||
PROPS_CYLINDER_TEST_DYNAMIC_MODEL,
|
||||
.materialIndex = PLASTIC_PLASTICWALL001A_INDEX,
|
||||
.soundClipId = -1,
|
||||
},
|
||||
|
@ -60,7 +57,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
|
|||
},
|
||||
0.2f,
|
||||
0.4f,
|
||||
&props_radio_model_gfx[0],
|
||||
PROPS_RADIO_DYNAMIC_MODEL,
|
||||
.materialIndex = RADIO_INDEX,
|
||||
.materialIndexFizzled = RADIO_FIZZLED_INDEX,
|
||||
.soundClipId = SOUNDS_LOOPING_RADIO_MIX,
|
||||
|
@ -75,7 +72,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
|
|||
},
|
||||
2.0f,
|
||||
0.55f,
|
||||
&cube_cube_model_gfx[0],
|
||||
CUBE_CUBE_DYNAMIC_MODEL,
|
||||
.materialIndex = CUBE_INDEX,
|
||||
.materialIndexFizzled = CUBE_FIZZLED_INDEX,
|
||||
.soundClipId = -1,
|
||||
|
@ -91,7 +88,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
|
|||
},
|
||||
2.0f,
|
||||
0.55f,
|
||||
&cube_cube_model_gfx[0],
|
||||
CUBE_CUBE_DYNAMIC_MODEL,
|
||||
.materialIndex = CUBE_INDEX,
|
||||
.materialIndexFizzled = CUBE_FIZZLED_INDEX,
|
||||
.soundClipId = -1,
|
||||
|
@ -106,7 +103,7 @@ struct DecorObjectDefinition gDecorObjectDefinitions[] = {
|
|||
},
|
||||
0.0f,
|
||||
1.0f,
|
||||
&props_autoportal_frame_autoportal_frame_model_gfx[0],
|
||||
PROPS_AUTOPORTAL_FRAME_AUTOPORTAL_FRAME_DYNAMIC_MODEL,
|
||||
.materialIndex = AUTOPORTAL_FRAME_INDEX,
|
||||
.soundClipId = -1,
|
||||
}
|
||||
|
|
|
@ -7,10 +7,11 @@
|
|||
#include "../util/time.h"
|
||||
#include "signals.h"
|
||||
#include "../decor/decor_object_list.h"
|
||||
#include "../util/dynamic_asset_loader.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/dynamic_model_list.h"
|
||||
|
||||
#define DROOPER_RELOAD_TIME 2.0f
|
||||
#define DROPPER_DROP_TIME 0.5f
|
||||
|
@ -79,7 +80,7 @@ void boxDropperRender(void* data, struct DynamicRenderDataList* renderList, stru
|
|||
|
||||
dynamicRenderListAddData(
|
||||
renderList,
|
||||
cube_cube_model_gfx,
|
||||
dynamicAssetModel(CUBE_CUBE_DYNAMIC_MODEL),
|
||||
pendingBoxMatrix,
|
||||
CUBE_INDEX,
|
||||
&dropper->transform.position,
|
||||
|
@ -106,6 +107,8 @@ void boxDropperInit(struct BoxDropper* dropper, struct BoxDropperDefinition* def
|
|||
dropper->reloadTimer = DROOPER_RELOAD_TIME;
|
||||
|
||||
dynamicSceneSetRoomFlags(dropper->dynamicId, ROOM_FLAG_FROM_INDEX(dropper->roomIndex));
|
||||
|
||||
dynamicAssetModelPreload(CUBE_CUBE_DYNAMIC_MODEL);
|
||||
}
|
||||
|
||||
void boxDropperUpdate(struct BoxDropper* dropper) {
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "../levels/levels.h"
|
||||
#include "../levels/cutscene_runner.h"
|
||||
#include "../build/assets/models/signage/clock_digits.h"
|
||||
#include "../util/memory.h"
|
||||
|
||||
#include "../build/assets/models/dynamic_model_list.h"
|
||||
|
||||
|
@ -33,11 +34,13 @@ void clockSetDigit(int digitIndex, int currDigit) {
|
|||
return;
|
||||
}
|
||||
|
||||
Vtx* digitPointer = dynamicAssetFixPointer(SIGNAGE_CLOCK_DIGITS_DYNAMIC_MODEL, gClockDigits[digitIndex]);
|
||||
|
||||
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;
|
||||
osWritebackDCache(gClockDigits[digitIndex], sizeof(Vtx) * 4);
|
||||
osWritebackDCache(digitPointer, sizeof(Vtx) * 4);
|
||||
}
|
||||
|
||||
void clockSetTime(float timeInSeconds) {
|
||||
|
@ -98,7 +101,7 @@ void clockRenderRender(void* data, struct DynamicRenderDataList* renderList, str
|
|||
|
||||
dynamicRenderListAddData(
|
||||
renderList,
|
||||
signage_clock_digits_model_gfx,
|
||||
dynamicAssetModel(SIGNAGE_CLOCK_DIGITS_DYNAMIC_MODEL),
|
||||
matrix,
|
||||
CLOCK_DIGITS_INDEX,
|
||||
&clock->transform.position,
|
||||
|
@ -107,7 +110,8 @@ void clockRenderRender(void* data, struct DynamicRenderDataList* renderList, str
|
|||
}
|
||||
|
||||
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.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);
|
||||
dynamicSceneSetRoomFlags(dynamicId, ROOM_FLAG_FROM_INDEX(clock->roomIndex));
|
||||
|
||||
zeroMemory(gCurrentClockDigits, sizeof(gCurrentClockDigits));
|
||||
}
|
||||
|
||||
void clockUpdate(struct Clock* clock) {
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
extern struct DynamicAssetModel gDynamicModels[];
|
||||
Gfx* gLoadedModels[DYNAMIC_MODEL_COUNT];
|
||||
u32 gModelPointerOffset[DYNAMIC_MODEL_COUNT];
|
||||
|
||||
Gfx gBlankGfx[] = {
|
||||
gsSPEndDisplayList(),
|
||||
|
@ -17,24 +18,30 @@ void dynamicAssetsReset() {
|
|||
|
||||
#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
|
||||
if ((u32)gfx < segmentStart || (u32)gfx >= segmentEnd) {
|
||||
if ((u32)gfx < segmentStart || (u32)gfx >= segmentStart + segmentLength) {
|
||||
return gfx;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
switch (commandType) {
|
||||
case G_ENDDL:
|
||||
return gfx;
|
||||
return result;
|
||||
case G_DL:
|
||||
if (gfx->dma.par == G_DL_NOPUSH) {
|
||||
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;
|
||||
case G_VTX:
|
||||
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;
|
||||
}
|
||||
|
||||
Gfx* dynamicAssetLoadModel(struct DynamicAssetModel* model) {
|
||||
Gfx* dynamicAssetLoadModel(struct DynamicAssetModel* model, u32* pointerOffset) {
|
||||
u32 length = (u32)model->addressEnd - (u32)model->addressStart;
|
||||
void* assetMemoryChunk = malloc(length);
|
||||
romCopy(model->addressStart, assetMemoryChunk, length);
|
||||
u32 pointerOffset = (u32)assetMemoryChunk - (u32)model->segmentStart;
|
||||
return dynamicAssetFixModelPointers(model->model, pointerOffset, (u32)model->segmentStart, (u32)model->segmentStart + length);
|
||||
*pointerOffset = (u32)assetMemoryChunk - (u32)model->segmentStart;
|
||||
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] ) {
|
||||
return;
|
||||
}
|
||||
|
||||
gLoadedModels[index] = dynamicAssetLoadModel(&gDynamicModels[index]);
|
||||
gLoadedModels[index] = dynamicAssetLoadModel(&gDynamicModels[index], &gModelPointerOffset[index]);
|
||||
}
|
||||
|
||||
Gfx* dynamicAssetModel(int index) {
|
||||
|
@ -69,4 +76,12 @@ Gfx* dynamicAssetModel(int 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]);
|
||||
}
|
|
@ -10,11 +10,11 @@ struct DynamicAssetModel {
|
|||
Gfx* model;
|
||||
};
|
||||
|
||||
Gfx* dynamicAssetLoadModel(struct DynamicAssetModel* model);
|
||||
|
||||
void dynamicAssetsReset();
|
||||
|
||||
void dynamicAssetPreload(int index);
|
||||
void dynamicAssetModelPreload(int index);
|
||||
Gfx* dynamicAssetModel(int index);
|
||||
|
||||
void* dynamicAssetFixPointer(int index, void* ptr);
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue