diff --git a/Makefile b/Makefile index ee13a83..b86b80d 100644 --- a/Makefile +++ b/Makefile @@ -206,6 +206,8 @@ build/src/scene/render_plan.o: $(MODEL_HEADERS) build/src/scene/portal_render.o: $(MODEL_HEADERS) +build/src/player/player.o: build/assets/models/player/chell.h build/assets/materials/static.h + build/anims.ld: $(ANIM_LIST) tools/generate_animation_ld.js @mkdir -p $(@D) node tools/generate_animation_ld.js $@ $(ANIM_LIST) diff --git a/src/player/player.c b/src/player/player.c index e0442d1..55daec8 100644 --- a/src/player/player.c +++ b/src/player/player.c @@ -14,6 +14,9 @@ #include "../util/time.h" #include "../physics/contact_insertion.h" +#include "../build/assets/models/player/chell.h" +#include "../build/assets/materials/static.h" + #define GRAB_RAYCAST_DISTANCE 2.5f #define PLAYER_COLLISION_LAYERS (COLLISION_LAYERS_TANGIBLE | COLLISION_LAYERS_FIZZLER) @@ -46,6 +49,48 @@ struct ColliderTypeData gPlayerColliderData = { &gCollisionCylinderCallbacks, }; +void playerRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState) { + struct Player* player = (struct Player*)data; + + Mtx* matrix = renderStateRequestMatrices(renderState, 1); + + if (!matrix) { + return; + } + + struct Transform finalPlayerTransform; + + struct Vector3 forwardVector; + struct Vector3 unusedRight; + + playerGetMoveBasis(&player->lookTransform, &forwardVector, &unusedRight); + + finalPlayerTransform.position = player->body.transform.position; + quatLook(&forwardVector, &gUp, &finalPlayerTransform.rotation); + finalPlayerTransform.scale = gOneVec; + + finalPlayerTransform.position.y -= PLAYER_HEAD_HEIGHT; + + transformToMatrixL(&finalPlayerTransform, matrix, SCENE_SCALE); + + // Mtx* armature = renderStateRequestMatrices(renderState, PROPS_BOX_DROPPER_DEFAULT_BONES_COUNT); + + // if (!armature) { + // return; + // } + + // skCalculateTransforms(&player->armature, armature); + + dynamicRenderListAddData( + renderList, + player_chell_model_gfx, + matrix, + DEFAULT_INDEX, + &player->body.transform.position, + NULL + ); +} + void playerInit(struct Player* player, struct Location* startLocation, struct Vector3* velocity) { collisionObjectInit(&player->collisionObject, &gPlayerColliderData, &player->body, 1.0f, PLAYER_COLLISION_LAYERS); // rigidBodyMarkKinematic(&player->body); @@ -59,6 +104,9 @@ void playerInit(struct Player* player, struct Location* startLocation, struct Ve player->yawVelocity = 0.0f; player->flags = 0; + player->dynamicId = dynamicSceneAdd(player, playerRender, &player->body.transform, 1.5f); + dynamicSceneSetFlags(player->dynamicId, DYNAMIC_SCENE_OBJECT_SKIP_ROOT); + if (startLocation) { player->lookTransform = startLocation->transform; player->body.currentRoom = startLocation->roomIndex; @@ -69,6 +117,8 @@ void playerInit(struct Player* player, struct Location* startLocation, struct Ve player->body.transform = player->lookTransform; collisionObjectUpdateBB(&player->collisionObject); + + dynamicSceneSetRoomFlags(player->dynamicId, ROOM_FLAG_FROM_INDEX(player->body.currentRoom)); } #define PLAYER_SPEED (150.0f / 64.0f) @@ -389,4 +439,6 @@ void playerUpdate(struct Player* player, struct Transform* cameraTransform) { collisionObjectUpdateBB(&player->collisionObject); player->body.currentRoom = worldCheckDoorwayCrossings(&gCurrentLevel->world, &player->lookTransform.position, player->body.currentRoom, doorwayMask); + + dynamicSceneSetRoomFlags(player->dynamicId, ROOM_FLAG_FROM_INDEX(player->body.currentRoom)); } diff --git a/src/player/player.h b/src/player/player.h index ec2d927..d7d60ba 100644 --- a/src/player/player.h +++ b/src/player/player.h @@ -6,6 +6,7 @@ #include "../physics/rigid_body.h" #include "../physics/collision_object.h" #include "../levels/level_definition.h" +#include "../scene/dynamic_scene.h" #define PLAYER_GRABBING_THROUGH_NOTHING -1 @@ -20,6 +21,7 @@ struct Player { struct RigidBody body; struct Transform lookTransform; short grabbingThroughPortal; + short dynamicId; struct CollisionObject* grabbing; float pitchVelocity; float yawVelocity; @@ -29,8 +31,6 @@ struct Player { void playerInit(struct Player* player, struct Location* startLocation, struct Vector3* velocity); void playerUpdate(struct Player* player, struct Transform* cameraTransform); -void playerRender(struct Player* player, struct RenderState* renderState); - void playerGetMoveBasis(struct Transform* transform, struct Vector3* forward, struct Vector3* right); #endif \ No newline at end of file diff --git a/src/scene/dynamic_render_list.c b/src/scene/dynamic_render_list.c index a0318d3..1cfc01a 100644 --- a/src/scene/dynamic_render_list.c +++ b/src/scene/dynamic_render_list.c @@ -61,6 +61,10 @@ void dynamicRenderListPopulate(struct DynamicRenderDataList* list, struct Render continue; } + if (stages[stageIndex].currentDepth == STARTING_RENDER_DEPTH && (object->flags & DYNAMIC_SCENE_OBJECT_SKIP_ROOT)) { + continue; + } + if (isSphereOutsideFrustrum(&stages[stageIndex].cameraMatrixInfo.cullingInformation, &scaledPos, object->scaledRadius)) { continue; } diff --git a/src/scene/dynamic_scene.h b/src/scene/dynamic_scene.h index 7fc51b5..93a7019 100644 --- a/src/scene/dynamic_scene.h +++ b/src/scene/dynamic_scene.h @@ -14,6 +14,7 @@ typedef void (*DynamicRender)(void* data, struct DynamicRenderDataList* renderLi #define DYNAMIC_SCENE_OBJECT_FLAGS_USED (1 << 0) #define DYNAMIC_SCENE_OBJECT_FLAGS_ACTIVE (1 << 1) +#define DYNAMIC_SCENE_OBJECT_SKIP_ROOT (1 << 2) #define INVALID_DYNAMIC_OBJECT -1 diff --git a/src/scene/render_plan.c b/src/scene/render_plan.c index 0008dee..c5bf36a 100644 --- a/src/scene/render_plan.c +++ b/src/scene/render_plan.c @@ -431,8 +431,8 @@ void renderPlanExecute(struct RenderPlan* renderPlan, struct Scene* scene, struc dynamicRenderListPopulate(dynamicList, renderPlan->stageProps, renderPlan->stageCount, renderState); - for (int i = renderPlan->stageCount - 1; i >= 0; --i) { - struct RenderProps* current = &renderPlan->stageProps[i]; + for (int stageIndex = renderPlan->stageCount - 1; stageIndex >= 0; --stageIndex) { + struct RenderProps* current = &renderPlan->stageProps[stageIndex]; if (!cameraApplyMatrices(renderState, ¤t->cameraMatrixInfo)) { return; @@ -492,7 +492,7 @@ void renderPlanExecute(struct RenderPlan* renderPlan, struct Scene* scene, struc portalIndex = 1 - portalIndex; } - staticRender(¤t->camera.transform, ¤t->cameraMatrixInfo.cullingInformation, current->visiblerooms, dynamicList, i, renderState); + staticRender(¤t->camera.transform, ¤t->cameraMatrixInfo.cullingInformation, current->visiblerooms, dynamicList, stageIndex, renderState); } dynamicRenderListFree(dynamicList);