Fizzler removes portals
This commit is contained in:
parent
65e61a54c3
commit
403d55b2cd
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
}
|
|
@ -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
|
Loading…
Reference in a new issue