mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-20 10:37:37 -04:00
Support vertically tiled fizzlers
Reduces dynamic object and dynamic collision object count.
This commit is contained in:
parent
1e8275eec3
commit
3ed8552a9c
|
@ -16,6 +16,9 @@
|
||||||
#define IMAGE_WIDTH 16
|
#define IMAGE_WIDTH 16
|
||||||
#define IMAGE_HEIGHT 64
|
#define IMAGE_HEIGHT 64
|
||||||
|
|
||||||
|
#define FRAME_HEIGHT 2
|
||||||
|
#define FRAME_WIDTH 0.125
|
||||||
|
|
||||||
#define GFX_PER_PARTICLE(particleCount) ((particleCount) + (((particleCount) + 7) >> 3) + 1)
|
#define GFX_PER_PARTICLE(particleCount) ((particleCount) + (((particleCount) + 7) >> 3) + 1)
|
||||||
|
|
||||||
void fizzlerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
|
void fizzlerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
|
||||||
|
@ -45,18 +48,6 @@ struct Transform gRelativeRight = {
|
||||||
{1.0f, 1.0f, 1.0f},
|
{1.0f, 1.0f, 1.0f},
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CollisionBox gFizzlerFrameBox = {
|
|
||||||
{0.125f, 1.0f, 0.125f}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ColliderTypeData gFizzlerFrameCollider = {
|
|
||||||
CollisionShapeTypeBox,
|
|
||||||
&gFizzlerFrameBox,
|
|
||||||
0.0f,
|
|
||||||
1.0f,
|
|
||||||
&gCollisionBoxCallbacks
|
|
||||||
};
|
|
||||||
|
|
||||||
void fizzlerRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState) {
|
void fizzlerRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState) {
|
||||||
struct Fizzler* fizzler = (struct Fizzler*)data;
|
struct Fizzler* fizzler = (struct Fizzler*)data;
|
||||||
|
|
||||||
|
@ -70,22 +61,33 @@ void fizzlerRender(void* data, struct DynamicRenderDataList* renderList, struct
|
||||||
|
|
||||||
dynamicRenderListAddData(renderList, fizzler->modelGraphics, matrix, PORTAL_CLEANSER_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
dynamicRenderListAddData(renderList, fizzler->modelGraphics, matrix, PORTAL_CLEANSER_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
||||||
|
|
||||||
Mtx* sideMatrices = renderStateRequestMatrices(renderState, 2);
|
int height = fizzler->collisionBox.sideLength.y * 2;
|
||||||
|
int rows = (int)(height / FRAME_HEIGHT);
|
||||||
|
Mtx* sideMatrices = renderStateRequestMatrices(renderState, rows * 2);
|
||||||
|
|
||||||
if (!sideMatrices) {
|
if (!sideMatrices) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Transform combinedTransform;
|
Gfx* sideModel = dynamicAssetModel(PROPS_PORTAL_CLEANSER_DYNAMIC_MODEL);
|
||||||
|
struct Transform sideTransform;
|
||||||
|
int sideY = (height - FRAME_HEIGHT) / 2;
|
||||||
|
|
||||||
|
for (int i = 0; i < rows; ++i, sideY -= FRAME_HEIGHT) {
|
||||||
|
int sideIndex = i * 2;
|
||||||
|
|
||||||
gRelativeLeft.position.x = fizzler->collisionBox.sideLength.x;
|
gRelativeLeft.position.x = fizzler->collisionBox.sideLength.x;
|
||||||
transformConcat(&fizzler->rigidBody.transform, &gRelativeLeft, &combinedTransform);
|
gRelativeLeft.position.y = sideY;
|
||||||
transformToMatrixL(&combinedTransform, &sideMatrices[0], SCENE_SCALE);
|
transformConcat(&fizzler->rigidBody.transform, &gRelativeLeft, &sideTransform);
|
||||||
dynamicRenderListAddData(renderList, dynamicAssetModel(PROPS_PORTAL_CLEANSER_DYNAMIC_MODEL), &sideMatrices[0], PORTAL_CLEANSER_WALL_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
transformToMatrixL(&sideTransform, &sideMatrices[sideIndex], SCENE_SCALE);
|
||||||
|
dynamicRenderListAddData(renderList, sideModel, &sideMatrices[sideIndex], PORTAL_CLEANSER_WALL_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
||||||
|
|
||||||
gRelativeRight.position.x = -fizzler->collisionBox.sideLength.x;
|
gRelativeRight.position.x = -fizzler->collisionBox.sideLength.x;
|
||||||
transformConcat(&fizzler->rigidBody.transform, &gRelativeRight, &combinedTransform);
|
gRelativeRight.position.y = sideY;
|
||||||
transformToMatrixL(&combinedTransform, &sideMatrices[1], SCENE_SCALE);
|
transformConcat(&fizzler->rigidBody.transform, &gRelativeRight, &sideTransform);
|
||||||
dynamicRenderListAddData(renderList, dynamicAssetModel(PROPS_PORTAL_CLEANSER_DYNAMIC_MODEL), &sideMatrices[1], PORTAL_CLEANSER_WALL_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
transformToMatrixL(&sideTransform, &sideMatrices[sideIndex + 1], SCENE_SCALE);
|
||||||
|
dynamicRenderListAddData(renderList, sideModel, &sideMatrices[sideIndex + 1], PORTAL_CLEANSER_WALL_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fizzlerSpawnParticle(struct Fizzler* fizzler, int particleIndex) {
|
void fizzlerSpawnParticle(struct Fizzler* fizzler, int particleIndex) {
|
||||||
|
@ -154,11 +156,21 @@ void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float wid
|
||||||
fizzler->colliderType.friction = 0.0f;
|
fizzler->colliderType.friction = 0.0f;
|
||||||
fizzler->colliderType.callbacks = &gCollisionBoxCallbacks;
|
fizzler->colliderType.callbacks = &gCollisionBoxCallbacks;
|
||||||
|
|
||||||
|
fizzler->frameCollisionBox.sideLength.x = FRAME_WIDTH;
|
||||||
|
fizzler->frameCollisionBox.sideLength.y = height;
|
||||||
|
fizzler->frameCollisionBox.sideLength.z = FRAME_WIDTH;
|
||||||
|
|
||||||
|
fizzler->frameColliderType.type = CollisionShapeTypeBox;
|
||||||
|
fizzler->frameColliderType.data = &fizzler->frameCollisionBox;
|
||||||
|
fizzler->frameColliderType.bounce = 0.0f;
|
||||||
|
fizzler->frameColliderType.friction = 0.0f;
|
||||||
|
fizzler->frameColliderType.callbacks = &gCollisionBoxCallbacks;
|
||||||
|
|
||||||
collisionObjectInit(&fizzler->collisionObject, &fizzler->colliderType, &fizzler->rigidBody, 1.0f, COLLISION_LAYERS_FIZZLER | COLLISION_LAYERS_BLOCK_PORTAL);
|
collisionObjectInit(&fizzler->collisionObject, &fizzler->colliderType, &fizzler->rigidBody, 1.0f, COLLISION_LAYERS_FIZZLER | COLLISION_LAYERS_BLOCK_PORTAL);
|
||||||
rigidBodyMarkKinematic(&fizzler->rigidBody);
|
rigidBodyMarkKinematic(&fizzler->rigidBody);
|
||||||
collisionObjectInit(&fizzler->frameLeftCollisionObject, &gFizzlerFrameCollider, &fizzler->frameLeftRigidBody, 1.0f, COLLISION_LAYERS_TANGIBLE);
|
collisionObjectInit(&fizzler->frameLeftCollisionObject, &fizzler->frameColliderType, &fizzler->frameLeftRigidBody, 1.0f, COLLISION_LAYERS_TANGIBLE);
|
||||||
rigidBodyMarkKinematic(&fizzler->frameLeftRigidBody);
|
rigidBodyMarkKinematic(&fizzler->frameLeftRigidBody);
|
||||||
collisionObjectInit(&fizzler->frameRightCollisionObject, &gFizzlerFrameCollider, &fizzler->frameRightRigidBody, 1.0f, COLLISION_LAYERS_TANGIBLE);
|
collisionObjectInit(&fizzler->frameRightCollisionObject, &fizzler->frameColliderType, &fizzler->frameRightRigidBody, 1.0f, COLLISION_LAYERS_TANGIBLE);
|
||||||
rigidBodyMarkKinematic(&fizzler->frameRightRigidBody);
|
rigidBodyMarkKinematic(&fizzler->frameRightRigidBody);
|
||||||
|
|
||||||
fizzler->collisionObject.trigger = fizzlerTrigger;
|
fizzler->collisionObject.trigger = fizzlerTrigger;
|
||||||
|
@ -169,13 +181,13 @@ void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float wid
|
||||||
struct Vector3 left = {-1.0f, 0.0f, 0.0f};
|
struct Vector3 left = {-1.0f, 0.0f, 0.0f};
|
||||||
quatMultVector(&transform->rotation, &left, &left);
|
quatMultVector(&transform->rotation, &left, &left);
|
||||||
fizzler->frameLeftRigidBody.transform = *transform;
|
fizzler->frameLeftRigidBody.transform = *transform;
|
||||||
vector3AddScaled(&transform->position, &left, width - gFizzlerFrameBox.sideLength.x, &fizzler->frameLeftRigidBody.transform.position);
|
vector3AddScaled(&transform->position, &left, width - fizzler->frameCollisionBox.sideLength.x, &fizzler->frameLeftRigidBody.transform.position);
|
||||||
fizzler->frameLeftRigidBody.currentRoom = room;
|
fizzler->frameLeftRigidBody.currentRoom = room;
|
||||||
|
|
||||||
struct Vector3 right;
|
struct Vector3 right;
|
||||||
vector3Negate(&left, &right);
|
vector3Negate(&left, &right);
|
||||||
fizzler->frameRightRigidBody.transform = *transform;
|
fizzler->frameRightRigidBody.transform = *transform;
|
||||||
vector3AddScaled(&transform->position, &right, width - gFizzlerFrameBox.sideLength.x, &fizzler->frameRightRigidBody.transform.position);
|
vector3AddScaled(&transform->position, &right, width - fizzler->frameCollisionBox.sideLength.x, &fizzler->frameRightRigidBody.transform.position);
|
||||||
fizzler->frameRightRigidBody.currentRoom = room;
|
fizzler->frameRightRigidBody.currentRoom = room;
|
||||||
|
|
||||||
fizzler->cubeSignalIndex = cubeSignalIndex;
|
fizzler->cubeSignalIndex = cubeSignalIndex;
|
||||||
|
|
|
@ -24,7 +24,9 @@ struct Fizzler {
|
||||||
struct RigidBody frameLeftRigidBody;
|
struct RigidBody frameLeftRigidBody;
|
||||||
struct RigidBody frameRightRigidBody;
|
struct RigidBody frameRightRigidBody;
|
||||||
struct ColliderTypeData colliderType;
|
struct ColliderTypeData colliderType;
|
||||||
|
struct ColliderTypeData frameColliderType;
|
||||||
struct CollisionBox collisionBox;
|
struct CollisionBox collisionBox;
|
||||||
|
struct CollisionBox frameCollisionBox;
|
||||||
Vtx* modelVertices;
|
Vtx* modelVertices;
|
||||||
Gfx* modelGraphics;
|
Gfx* modelGraphics;
|
||||||
short particleCount;
|
short particleCount;
|
||||||
|
|
|
@ -120,6 +120,7 @@ for _, fizzler in pairs(sk_scene.nodes_for_type('@fizzler')) do
|
||||||
local position, rotation, scale = fizzler.node.full_transformation:decompose()
|
local position, rotation, scale = fizzler.node.full_transformation:decompose()
|
||||||
local bounding_box = fizzler.node.meshes[1].bb
|
local bounding_box = fizzler.node.meshes[1].bb
|
||||||
local width = (bounding_box.max.x - bounding_box.min.x) * scale.x * 0.5
|
local width = (bounding_box.max.x - bounding_box.min.x) * scale.x * 0.5
|
||||||
|
local height = (bounding_box.max.y - bounding_box.min.y) * scale.y * 0.5
|
||||||
|
|
||||||
local room_index = room_export.node_nearest_room_index(fizzler.node)
|
local room_index = room_export.node_nearest_room_index(fizzler.node)
|
||||||
|
|
||||||
|
@ -127,7 +128,7 @@ for _, fizzler in pairs(sk_scene.nodes_for_type('@fizzler')) do
|
||||||
position,
|
position,
|
||||||
rotation,
|
rotation,
|
||||||
width,
|
width,
|
||||||
1,
|
height,
|
||||||
room_index,
|
room_index,
|
||||||
signals.optional_signal_index_for_name(fizzler.arguments[1]),
|
signals.optional_signal_index_for_name(fizzler.arguments[1]),
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue