diff --git a/Makefile b/Makefile index a1e0574..0bbb05e 100644 --- a/Makefile +++ b/Makefile @@ -294,7 +294,7 @@ build/%.fbx: %.blend @mkdir -p $(@D) $(BLENDER_3_0) $< --background --python tools/export_fbx.py -- $@ -build/assets/test_chambers/%.h build/assets/test_chambers/%_geo.c build/assets/test_chambers/%_anim.c: build/assets/test_chambers/%.fbx build/assets/materials/static.h $(SKELATOOL64) $(TEXTURE_IMAGES) $(LUA_FILES) +build/assets/test_chambers/%.h build/assets/test_chambers/%_geo.c build/assets/test_chambers/%_anim.c: build/assets/test_chambers/%.fbx assets/test_chambers/%.yaml build/assets/materials/static.h $(SKELATOOL64) $(TEXTURE_IMAGES) $(LUA_FILES) $(SKELATOOL64) --script tools/export_level.lua --fixed-point-scale ${SCENE_SCALE} --model-scale 0.01 --name $(<:build/assets/test_chambers/%.fbx=%) -m assets/materials/static.skm.yaml -o $(<:%.fbx=%.h) $< build/assets/test_chambers/%.o: build/assets/test_chambers/%.c build/assets/materials/static.h diff --git a/src/levels/cutscene_runner.c b/src/levels/cutscene_runner.c index b392eab..54cfe28 100644 --- a/src/levels/cutscene_runner.c +++ b/src/levels/cutscene_runner.c @@ -468,7 +468,7 @@ int cutsceneTrigger(int cutsceneIndex, int triggerIndex) { return 1; } - return 0; + return (gTriggeredCutscenes & cutsceneMask) != 0; } void cutsceneSerialize(struct CutsceneRunner* runner, struct CutsceneSerialized* result) { diff --git a/src/physics/collision_scene.c b/src/physics/collision_scene.c index 259a993..d8e7dd3 100644 --- a/src/physics/collision_scene.c +++ b/src/physics/collision_scene.c @@ -397,7 +397,7 @@ void collisionSceneRaycastDynamic(struct CollisionScene* scene, struct Ray* ray, struct CollisionObject* object = scene->dynamicObjects[i]; - if ((object->collisionLayers & collisionLayers) == 0) { + if ((object->collisionLayers & collisionLayers) == 0 || object->trigger != NULL) { continue; } diff --git a/src/scene/scene.c b/src/scene/scene.c index 1306075..92e64c0 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -609,6 +609,10 @@ void sceneUpdate(struct Scene* scene) { ballCatcherUpdate(&scene->ballCatchers[i], scene->ballLaunchers, scene->ballLancherCount); } + for (int i = 0; i < scene->triggerListenerCount; ++i) { + triggerListenerUpdate(&scene->triggerListeners[i]); + } + signalsEvaluateSignals(gCurrentLevel->signalOperators, gCurrentLevel->signalOperatorCount); for (int i = 0; i < scene->doorCount; ++i) { diff --git a/src/scene/trigger_listener.c b/src/scene/trigger_listener.c index 562afdd..38bb567 100644 --- a/src/scene/trigger_listener.c +++ b/src/scene/trigger_listener.c @@ -29,8 +29,6 @@ enum ObjectTriggerType triggerDetermineType(struct CollisionObject* objectEnteri void triggerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) { struct TriggerListener* listener = data; - struct Trigger* trigger = listener->trigger; - struct Vector3 offset; vector3Sub( &objectEnteringTrigger->body->transform.position, @@ -47,17 +45,7 @@ void triggerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) { enum ObjectTriggerType triggerType = triggerDetermineType(objectEnteringTrigger); - for (int i = 0; i < trigger->triggerCount; ++i) { - struct ObjectTriggerInfo* triggerInfo = &trigger->triggers[i]; - - if (triggerInfo->objectType == triggerType) { - if (triggerInfo->signalIndex != -1) { - signalsSend(triggerInfo->signalIndex); - } - - cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex + i); - } - } + listener->lastTriggerMask |= (1 << triggerType); } void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int triggerIndex) { @@ -83,4 +71,28 @@ void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int listener->triggerIndex = triggerIndex; collisionSceneAddDynamicObject(&listener->collisionObject); + + listener->lastTriggerMask = 0; +} + +void triggerListenerUpdate(struct TriggerListener* listener) { + if (!listener->lastTriggerMask) { + return; + } + + struct Trigger* trigger = listener->trigger; + + for (int i = 0; i < trigger->triggerCount; ++i) { + struct ObjectTriggerInfo* triggerInfo = &trigger->triggers[i]; + + if ((1 << triggerInfo->objectType) & listener->lastTriggerMask) { + if (triggerInfo->signalIndex != -1) { + signalsSend(triggerInfo->signalIndex); + } + + cutsceneTrigger(triggerInfo->cutsceneIndex, listener->triggerIndex + i); + } + } + + listener->lastTriggerMask = 0; } \ No newline at end of file diff --git a/src/scene/trigger_listener.h b/src/scene/trigger_listener.h index 86af9ef..b443f5c 100644 --- a/src/scene/trigger_listener.h +++ b/src/scene/trigger_listener.h @@ -15,8 +15,10 @@ struct TriggerListener { struct Trigger* trigger; short triggerIndex; + short lastTriggerMask; }; void triggerInit(struct TriggerListener* listener, struct Trigger* trigger, int triggerIndex); +void triggerListenerUpdate(struct TriggerListener* listener); #endif \ No newline at end of file