diff --git a/README.md b/README.md index eedb9ac..ee9a96c 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,11 @@ where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where blender ## Current TODO list +Player cant pickup objects Create elevator geometry -Collide player with objects in scene -Cylinder touching bug -Allow player to press button + +Allow player to press button -- kinda +Cylinder raycasting Radio Create radio model Create radio texture diff --git a/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend b/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend index 3175888..94a0951 100644 Binary files a/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend and b/assets/test_chambers/test_chamber_00/test_chamber_00_0.blend differ diff --git a/skelatool64/src/definition_generator/CollisionGenerator.cpp b/skelatool64/src/definition_generator/CollisionGenerator.cpp index 73bff10..85f716b 100644 --- a/skelatool64/src/definition_generator/CollisionGenerator.cpp +++ b/skelatool64/src/definition_generator/CollisionGenerator.cpp @@ -29,7 +29,7 @@ void CollisionGrid::AddToCells(const aiAABB& box, short value) { if (minX >= spanX) minX = spanX - 1; if (maxZ < 0) maxZ = 0; - if (minX >= spanZ) minZ = spanZ - 1; + if (minZ >= spanZ) minZ = spanZ - 1; for (int currX = minX; currX <= maxX; ++currX) { for (int currZ = minZ; currZ <= maxZ; ++currZ) { @@ -67,7 +67,11 @@ std::shared_ptr generateCollision(const aiScene* scene } for (auto nodeInfo : nodes) { + if (std::string(nodeInfo.node->mName.C_Str()) == "@collision quad_Wall.023") { + std::cout << "foo bar"; + } for (unsigned i = 0; i < nodeInfo.node->mNumMeshes; ++i) { + aiMesh* mesh = scene->mMeshes[nodeInfo.node->mMeshes[i]]; bool isTransparent = std::find(nodeInfo.arguments.begin(), nodeInfo.arguments.end(), "transparent") != nodeInfo.arguments.end(); diff --git a/src/physics/collision.h b/src/physics/collision.h index edf2a88..f4ec79f 100644 --- a/src/physics/collision.h +++ b/src/physics/collision.h @@ -35,7 +35,6 @@ typedef int (*MinkowsiSumWithBasis)(void* data, struct Basis* basis, struct Vect typedef int (*CollideWithSphere)(void* data, struct Transform* transform, struct CollisionSphere* sphere, struct Vector3* spherePos, struct ContactManifold* contact); struct ColliderCallbacks { - CollideWithQuad collideWithQuad; RaycastCollider raycast; MomentOfInertiaCalculator mofICalculator; BoundingBoxCalculator boundingBoxCalculator; diff --git a/src/physics/collision_box.c b/src/physics/collision_box.c index 18b5bcd..8f9885e 100644 --- a/src/physics/collision_box.c +++ b/src/physics/collision_box.c @@ -6,7 +6,6 @@ #include struct ColliderCallbacks gCollisionBoxCallbacks = { - NULL, raycastBox, collisionBoxSolidMofI, collisionBoxBoundingBox, diff --git a/src/physics/collision_cylinder.c b/src/physics/collision_cylinder.c index 9f5a254..b2aee9c 100644 --- a/src/physics/collision_cylinder.c +++ b/src/physics/collision_cylinder.c @@ -8,7 +8,6 @@ #include "../math/vector2.h" struct ColliderCallbacks gCollisionCylinderCallbacks = { - NULL, raycastCylinder, collisionCylinderSolidMofI, collisionCylinderBoundingBox, diff --git a/src/physics/collision_scene.c b/src/physics/collision_scene.c index 99932a8..bf92272 100644 --- a/src/physics/collision_scene.c +++ b/src/physics/collision_scene.c @@ -130,34 +130,6 @@ int collisionSceneFilterPortalContacts(struct ContactManifold* contact) { return writeIndex; } -void collisionObjectQueryScene(struct CollisionObject* object, struct CollisionScene* scene, void* data, ManifoldCallback callback) { - CollideWithQuad quadCollider = object->collider->callbacks->collideWithQuad; - - if (!quadCollider) { - return; - } - - short colliderIndices[MAX_COLLIDERS]; - int quadCount = collisionObjectRoomColliders(&scene->world->rooms[object->body->currentRoom], &object->boundingBox, colliderIndices); - - struct ContactManifold localContact; - - for (int i = 0; i < quadCount; ++i) { - localContact.contactCount = 0; - - struct CollisionObject* quadObject = &scene->quads[colliderIndices[i]]; - - if ((quadObject->collisionLayers & object->collisionLayers) == 0) { - continue; - } - - if (quadCollider(object->collider->data, &object->body->transform, quadObject->collider->data, &localContact) && - collisionSceneFilterPortalContacts(&localContact)) { - callback(data, &localContact); - } - } -} - int collisionSceneIsTouchingSinglePortal(struct Vector3* contactPoint, struct Vector3* contactNormal, struct Transform* portalTransform, int portalIndex) { struct Vector3 localPoint; transformPointInverseNoScale(portalTransform, contactPoint, &localPoint); diff --git a/src/physics/collision_scene.h b/src/physics/collision_scene.h index 81dac14..735f3e1 100644 --- a/src/physics/collision_scene.h +++ b/src/physics/collision_scene.h @@ -30,8 +30,6 @@ void collisionObjectCollideWithScene(struct CollisionObject* object, struct Coll int collisionSceneIsTouchingPortal(struct Vector3* contactPoint, struct Vector3* contactNormal); int collisionSceneIsPortalOpen(); -void collisionObjectQueryScene(struct CollisionObject* object, struct CollisionScene* scene, void* data, ManifoldCallback callback); - int collisionSceneRaycast(struct CollisionScene* scene, int roomIndex, struct Ray* ray, int collisionLayers, float maxDistance, int passThroughPortals, struct RaycastHit* hit); void collisionSceneGetPortalTransform(int fromPortal, struct Transform* out); diff --git a/src/physics/collision_sphere.c b/src/physics/collision_sphere.c index e50392a..aa3bdab 100644 --- a/src/physics/collision_sphere.c +++ b/src/physics/collision_sphere.c @@ -80,7 +80,6 @@ void collisionSphereBoundingBox(struct ColliderTypeData* typeData, struct Transf } struct ColliderCallbacks gCollisionSphereCallbacks = { - collisionSphereCollideQuad, NULL, // TODO collisionSphereSolidMofI, collisionSphereBoundingBox, diff --git a/src/player/player.c b/src/player/player.c index 4c16e31..0129d58 100644 --- a/src/player/player.c +++ b/src/player/player.c @@ -15,6 +15,8 @@ #define GRAB_RAYCAST_DISTANCE 2.5f +#define PLAYER_COLLISION_LAYERS COLLISION_LAYERS_TANGIBLE + struct Vector3 gGrabDistance = {0.0f, 0.0f, -1.5f}; struct Vector3 gCameraOffset = {0.0f, 0.0f, 0.0f}; @@ -41,7 +43,7 @@ struct ColliderTypeData gPlayerColliderData = { }; void playerInit(struct Player* player, struct Location* startLocation) { - collisionObjectInit(&player->collisionObject, &gPlayerColliderData, &player->body, 1.0f, COLLISION_LAYERS_TANGIBLE); + collisionObjectInit(&player->collisionObject, &gPlayerColliderData, &player->body, 1.0f, PLAYER_COLLISION_LAYERS); rigidBodyMarkKinematic(&player->body); player->body.flags |= RigidBodyGenerateContacts; collisionSceneAddDynamicObject(&player->collisionObject); @@ -126,6 +128,8 @@ void playerUpdateGrabbedObject(struct Player* player) { struct RaycastHit hit; + player->collisionObject.collisionLayers = 0; + if (collisionSceneRaycast(&gCollisionScene, player->body.currentRoom, &ray, COLLISION_LAYERS_GRABBABLE | COLLISION_LAYERS_TANGIBLE, GRAB_RAYCAST_DISTANCE, 1, &hit) && hit.object->body && (hit.object->body->flags & RigidBodyFlagsGrabbable)) { player->grabbing = hit.object->body; @@ -135,6 +139,8 @@ void playerUpdateGrabbedObject(struct Player* player) { player->grabbingThroughPortal = PLAYER_GRABBING_THROUGH_NOTHING; } } + + player->collisionObject.collisionLayers = PLAYER_COLLISION_LAYERS; } }