mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -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_HEIGHT 64
|
||||
|
||||
#define FRAME_HEIGHT 2
|
||||
#define FRAME_WIDTH 0.125
|
||||
|
||||
#define GFX_PER_PARTICLE(particleCount) ((particleCount) + (((particleCount) + 7) >> 3) + 1)
|
||||
|
||||
void fizzlerTrigger(void* data, struct CollisionObject* objectEnteringTrigger) {
|
||||
|
@ -45,18 +48,6 @@ struct Transform gRelativeRight = {
|
|||
{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) {
|
||||
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);
|
||||
|
||||
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) {
|
||||
return;
|
||||
}
|
||||
|
||||
struct Transform combinedTransform;
|
||||
gRelativeLeft.position.x = fizzler->collisionBox.sideLength.x;
|
||||
transformConcat(&fizzler->rigidBody.transform, &gRelativeLeft, &combinedTransform);
|
||||
transformToMatrixL(&combinedTransform, &sideMatrices[0], SCENE_SCALE);
|
||||
dynamicRenderListAddData(renderList, dynamicAssetModel(PROPS_PORTAL_CLEANSER_DYNAMIC_MODEL), &sideMatrices[0], PORTAL_CLEANSER_WALL_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
||||
Gfx* sideModel = dynamicAssetModel(PROPS_PORTAL_CLEANSER_DYNAMIC_MODEL);
|
||||
struct Transform sideTransform;
|
||||
int sideY = (height - FRAME_HEIGHT) / 2;
|
||||
|
||||
gRelativeRight.position.x = -fizzler->collisionBox.sideLength.x;
|
||||
transformConcat(&fizzler->rigidBody.transform, &gRelativeRight, &combinedTransform);
|
||||
transformToMatrixL(&combinedTransform, &sideMatrices[1], SCENE_SCALE);
|
||||
dynamicRenderListAddData(renderList, dynamicAssetModel(PROPS_PORTAL_CLEANSER_DYNAMIC_MODEL), &sideMatrices[1], PORTAL_CLEANSER_WALL_INDEX, &fizzler->rigidBody.transform.position, NULL);
|
||||
for (int i = 0; i < rows; ++i, sideY -= FRAME_HEIGHT) {
|
||||
int sideIndex = i * 2;
|
||||
|
||||
gRelativeLeft.position.x = fizzler->collisionBox.sideLength.x;
|
||||
gRelativeLeft.position.y = sideY;
|
||||
transformConcat(&fizzler->rigidBody.transform, &gRelativeLeft, &sideTransform);
|
||||
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.y = sideY;
|
||||
transformConcat(&fizzler->rigidBody.transform, &gRelativeRight, &sideTransform);
|
||||
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) {
|
||||
|
@ -154,11 +156,21 @@ void fizzlerInit(struct Fizzler* fizzler, struct Transform* transform, float wid
|
|||
fizzler->colliderType.friction = 0.0f;
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
|
||||
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};
|
||||
quatMultVector(&transform->rotation, &left, &left);
|
||||
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;
|
||||
|
||||
struct Vector3 right;
|
||||
vector3Negate(&left, &right);
|
||||
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->cubeSignalIndex = cubeSignalIndex;
|
||||
|
|
|
@ -24,7 +24,9 @@ struct Fizzler {
|
|||
struct RigidBody frameLeftRigidBody;
|
||||
struct RigidBody frameRightRigidBody;
|
||||
struct ColliderTypeData colliderType;
|
||||
struct ColliderTypeData frameColliderType;
|
||||
struct CollisionBox collisionBox;
|
||||
struct CollisionBox frameCollisionBox;
|
||||
Vtx* modelVertices;
|
||||
Gfx* modelGraphics;
|
||||
short particleCount;
|
||||
|
|
|
@ -118,8 +118,9 @@ local fizzlers = {}
|
|||
|
||||
for _, fizzler in pairs(sk_scene.nodes_for_type('@fizzler')) do
|
||||
local position, rotation, scale = fizzler.node.full_transformation:decompose()
|
||||
local bounding_box = fizzler.node.meshes[1].bb
|
||||
local width = (bounding_box.max.x - bounding_box.min.x) * scale.x * 0.5
|
||||
local bounding_box = fizzler.node.meshes[1].bb
|
||||
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)
|
||||
|
||||
|
@ -127,7 +128,7 @@ for _, fizzler in pairs(sk_scene.nodes_for_type('@fizzler')) do
|
|||
position,
|
||||
rotation,
|
||||
width,
|
||||
1,
|
||||
height,
|
||||
room_index,
|
||||
signals.optional_signal_index_for_name(fizzler.arguments[1]),
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue