Fizzler removes portals

This commit is contained in:
James Lambert 2022-06-15 19:09:48 -06:00
parent 65e61a54c3
commit 403d55b2cd
9 changed files with 61 additions and 12 deletions

View file

@ -20,7 +20,7 @@ struct DecorObject* decorObjectNew(struct DecorObjectDefinition* definition, str
}
void decorObjectInit(struct DecorObject* object, struct DecorObjectDefinition* definition, struct Transform* at, int room) {
collisionObjectInit(&object->collisionObject, &definition->colliderType, &object->rigidBody, definition->mass, COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_GRABBABLE);
collisionObjectInit(&object->collisionObject, &definition->colliderType, &object->rigidBody, definition->mass, COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_GRABBABLE | COLLISION_LAYERS_FIZZLER);
collisionSceneAddDynamicObject(&object->collisionObject);
object->rigidBody.transform = *at;
@ -28,6 +28,8 @@ void decorObjectInit(struct DecorObject* object, struct DecorObjectDefinition* d
object->rigidBody.currentRoom = room;
object->definition = definition;
collisionObjectUpdateBB(&object->collisionObject);
object->dynamicId = dynamicSceneAdd(object, decorObjectRender, &object->rigidBody.transform, definition->radius);
if (definition->soundClipId != -1) {

View file

@ -9,6 +9,8 @@
#define COLLISION_LAYERS_TRANSPARENT (1 << 1)
#define COLLISION_LAYERS_TANGIBLE (1 << 2)
#define COLLISION_LAYERS_GRABBABLE (1 << 3)
#define COLLISION_LAYERS_FIZZLER (1 << 4)
#define COLLISION_LAYERS_BLOCK_PORTAL (1 << 5)
typedef void (*TriggerCallback)(void* data, struct CollisionObject* objectEnteringTrigger);

View file

@ -20,6 +20,8 @@ enum RigidBodyFlags {
// for kinematic bodies that should generate
// contacts with other kinematic bodies
RigidBodyGenerateContacts = (1 << 10),
RigidBodyFizzled = (1 << 11),
};
struct RigidBody {

View file

@ -16,7 +16,7 @@
#define GRAB_RAYCAST_DISTANCE 2.5f
#define PLAYER_COLLISION_LAYERS COLLISION_LAYERS_TANGIBLE
#define PLAYER_COLLISION_LAYERS (COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_FIZZLER)
struct Vector3 gGrabDistance = {0.0f, 0.0f, -1.5f};
struct Vector3 gCameraOffset = {0.0f, 0.0f, 0.0f};

View file

@ -28,7 +28,7 @@ void cubeRender(void* data, struct RenderScene* renderScene) {
}
void cubeInit(struct Cube* cube) {
collisionObjectInit(&cube->collisionObject, &gCubeCollider, &cube->rigidBody, 2.0f, COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_GRABBABLE);
collisionObjectInit(&cube->collisionObject, &gCubeCollider, &cube->rigidBody, 2.0f, COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_GRABBABLE | COLLISION_LAYERS_FIZZLER);
collisionSceneAddDynamicObject(&cube->collisionObject);
cube->collisionObject.body->flags |= RigidBodyFlagsGrabbable;

View file

@ -3,17 +3,24 @@
#include "../util/memory.h"
#include "../graphics/render_scene.h"
#include "../scene/dynamic_scene.h"
#include "../physics/collision_scene.h"
#include "../models/models.h"
#define GFX_PER_PARTICLE(particleCount) ((particleCount) + (((particleCount) + 7) >> 3) + 1)
void fizzlerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
if (objectEnteringTrigger->body) {
objectEnteringTrigger->body->flags |= RigidBodyFizzled;
}
}
void fizzlerRender(void* data, struct RenderScene* renderScene) {
struct Fizzler* fizzler = (struct Fizzler*)data;
Mtx* matrix = renderStateRequestMatrices(renderScene->renderState, 1);
transformToMatrixL(&fizzler->transform, matrix, SCENE_SCALE);
transformToMatrixL(&fizzler->rigidBody.transform, matrix, SCENE_SCALE);
renderSceneAdd(renderScene, fizzler->modelGraphics, matrix, fizzler_material_index, &fizzler->transform.position, NULL);
renderSceneAdd(renderScene, fizzler->modelGraphics, matrix, fizzler_material_index, &fizzler->rigidBody.transform.position, NULL);
}
void fizzlerSpawnParticle(struct Fizzler* fizzler, int particleIndex) {
@ -71,8 +78,27 @@ void fizzlerSpawnParticle(struct Fizzler* fizzler, int particleIndex) {
currentVertex->v.cn[0] = 255; currentVertex->v.cn[1] = 255; currentVertex->v.cn[2] = 255; currentVertex->v.cn[3] = 255;
}
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height) {
fizzler->transform = *transform;
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height, int room) {
fizzler->collisionBox.sideLength.x = width;
fizzler->collisionBox.sideLength.y = height;
fizzler->collisionBox.sideLength.z = 0.25f;
fizzler->colliderType.type = CollisionShapeTypeBox;
fizzler->colliderType.data = &fizzler->collisionBox;
fizzler->colliderType.bounce = 0.0f;
fizzler->colliderType.friction = 0.0f;
fizzler->colliderType.callbacks = &gCollisionBoxCallbacks;
collisionObjectInit(&fizzler->collisionObject, &fizzler->colliderType, &fizzler->rigidBody, 1.0f, COLLISION_LAYERS_FIZZLER | COLLISION_LAYERS_BLOCK_PORTAL);
rigidBodyMarkKinematic(&fizzler->rigidBody);
fizzler->collisionObject.trigger = fizzlerTrigger;
fizzler->rigidBody.transform = *transform;
fizzler->rigidBody.currentRoom = room;
collisionObjectUpdateBB(&fizzler->collisionObject);
collisionSceneAddDynamicObject(&fizzler->collisionObject);
fizzler->maxExtent = (int)(width * SCENE_SCALE * 0.5f);
fizzler->maxVerticalExtent = (int)(height * SCENE_SCALE * 0.5f);
@ -120,7 +146,7 @@ void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float wid
}
}
fizzler->dynamicId = dynamicSceneAdd(fizzler, fizzlerRender, &fizzler->transform, sqrtf(width * width + height * height) * 0.5f);
fizzler->dynamicId = dynamicSceneAdd(fizzler, fizzlerRender, &fizzler->rigidBody.transform, sqrtf(width * width + height * height) * 0.5f);
}
void fizzlerUpdate(struct Fizzler* fizzler) {

View file

@ -6,6 +6,9 @@
#include "defs.h"
#include "../util/time.h"
#include "../physics/collision_box.h"
#include "../physics/collision_object.h"
#define FIZZLER_PARTICLES_PER_1x1 2.5f
#define FIZZLER_PARTICLE_VELOCITY 1.0f
#define FIZZLER_UNITS_PER_UPDATE (int)(SCENE_SCALE * FIZZLER_PARTICLE_VELOCITY * FIXED_DELTA_TIME)
@ -17,7 +20,10 @@
#define IMAGE_HEIGHT 32
struct Fizzler {
struct Transform transform;
struct CollisionObject collisionObject;
struct RigidBody rigidBody;
struct ColliderTypeData colliderType;
struct CollisionBox collisionBox;
Vtx* modelVertices;
Gfx* modelGraphics;
short particleCount;
@ -27,7 +33,7 @@ struct Fizzler {
short dynamicId;
};
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height);
void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float width, float height, int room);
void fizzlerUpdate(struct Fizzler* fizzler);
#endif

View file

@ -93,7 +93,7 @@ void sceneInit(struct Scene* scene) {
fizzlerTransform.position = fizzlerDef->position;
fizzlerTransform.rotation = fizzlerDef->rotation;
fizzlerTransform.scale = gOneVec;
fizzlerInit(&scene->fizzlers[i], &fizzlerTransform, fizzlerDef->width, fizzlerDef->height);
fizzlerInit(&scene->fizzlers[i], &fizzlerTransform, fizzlerDef->width, fizzlerDef->height, fizzlerDef->roomIndex);
}
}
@ -205,6 +205,12 @@ void sceneCheckPortals(struct Scene* scene) {
sceneFirePortal(scene, &raycastRay, &playerUp, 1, scene->player.body.currentRoom);
soundPlayerPlay(soundsPortalgunShoot[1], 1.0f, 1.0f, NULL);
}
if (scene->player.body.flags & RigidBodyFizzled) {
sceneClosePortal(scene, 0);
sceneClosePortal(scene, 1);
scene->player.body.flags &= ~RigidBodyFizzled;
}
}
void sceneUpdatePortalListener(struct Scene* scene, int portalIndex, int listenerIndex) {
@ -292,7 +298,7 @@ int sceneOpenPortal(struct Scene* scene, struct Transform* at, int portalIndex,
int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* playerUp, int portalIndex, int roomIndex) {
struct RaycastHit hit;
if (!collisionSceneRaycast(&gCollisionScene, roomIndex, ray, COLLISION_LAYERS_STATIC, 1000000.0f, 0, &hit)) {
if (!collisionSceneRaycast(&gCollisionScene, roomIndex, ray, COLLISION_LAYERS_STATIC | COLLISION_LAYERS_BLOCK_PORTAL, 1000000.0f, 0, &hit)) {
return 0;
}
@ -319,4 +325,8 @@ int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* player
}
return sceneOpenPortal(scene, &portalLocation, portalIndex, quadIndex, hit.roomIndex);
}
void sceneClosePortal(struct Scene* scene, int portalIndex) {
gCollisionScene.portalTransforms[portalIndex] = NULL;
}

View file

@ -43,5 +43,6 @@ void sceneRender(struct Scene* scene, struct RenderState* renderState, struct Gr
void sceneUpdate(struct Scene* scene);
int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* playerUp, int portalIndex, int roomIndex);
void sceneClosePortal(struct Scene* scene, int portalIndex);
#endif