Fix some minor bugs

This commit is contained in:
James Lambert 2022-06-07 12:38:02 -06:00
parent bbe5c38eff
commit 5d21991592
10 changed files with 16 additions and 39 deletions

View file

@ -57,10 +57,11 @@ where `/home/james/Blender/blender-2.93.1-linux-x64` is the folder where blender
## Current TODO list ## Current TODO list
Player cant pickup objects
Create elevator geometry Create elevator geometry
Collide player with objects in scene <!-- Cylinder touching bug -->
Cylinder touching bug Allow player to press button -- kinda
Allow player to press button Cylinder raycasting
Radio Radio
Create radio model Create radio model
Create radio texture Create radio texture

View file

@ -29,7 +29,7 @@ void CollisionGrid::AddToCells(const aiAABB& box, short value) {
if (minX >= spanX) minX = spanX - 1; if (minX >= spanX) minX = spanX - 1;
if (maxZ < 0) maxZ = 0; 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 currX = minX; currX <= maxX; ++currX) {
for (int currZ = minZ; currZ <= maxZ; ++currZ) { for (int currZ = minZ; currZ <= maxZ; ++currZ) {
@ -67,7 +67,11 @@ std::shared_ptr<CollisionGeneratorOutput> generateCollision(const aiScene* scene
} }
for (auto nodeInfo : nodes) { 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) { for (unsigned i = 0; i < nodeInfo.node->mNumMeshes; ++i) {
aiMesh* mesh = scene->mMeshes[nodeInfo.node->mMeshes[i]]; aiMesh* mesh = scene->mMeshes[nodeInfo.node->mMeshes[i]];
bool isTransparent = std::find(nodeInfo.arguments.begin(), nodeInfo.arguments.end(), "transparent") != nodeInfo.arguments.end(); bool isTransparent = std::find(nodeInfo.arguments.begin(), nodeInfo.arguments.end(), "transparent") != nodeInfo.arguments.end();

View file

@ -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); typedef int (*CollideWithSphere)(void* data, struct Transform* transform, struct CollisionSphere* sphere, struct Vector3* spherePos, struct ContactManifold* contact);
struct ColliderCallbacks { struct ColliderCallbacks {
CollideWithQuad collideWithQuad;
RaycastCollider raycast; RaycastCollider raycast;
MomentOfInertiaCalculator mofICalculator; MomentOfInertiaCalculator mofICalculator;
BoundingBoxCalculator boundingBoxCalculator; BoundingBoxCalculator boundingBoxCalculator;

View file

@ -6,7 +6,6 @@
#include <math.h> #include <math.h>
struct ColliderCallbacks gCollisionBoxCallbacks = { struct ColliderCallbacks gCollisionBoxCallbacks = {
NULL,
raycastBox, raycastBox,
collisionBoxSolidMofI, collisionBoxSolidMofI,
collisionBoxBoundingBox, collisionBoxBoundingBox,

View file

@ -8,7 +8,6 @@
#include "../math/vector2.h" #include "../math/vector2.h"
struct ColliderCallbacks gCollisionCylinderCallbacks = { struct ColliderCallbacks gCollisionCylinderCallbacks = {
NULL,
raycastCylinder, raycastCylinder,
collisionCylinderSolidMofI, collisionCylinderSolidMofI,
collisionCylinderBoundingBox, collisionCylinderBoundingBox,

View file

@ -130,34 +130,6 @@ int collisionSceneFilterPortalContacts(struct ContactManifold* contact) {
return writeIndex; 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) { int collisionSceneIsTouchingSinglePortal(struct Vector3* contactPoint, struct Vector3* contactNormal, struct Transform* portalTransform, int portalIndex) {
struct Vector3 localPoint; struct Vector3 localPoint;
transformPointInverseNoScale(portalTransform, contactPoint, &localPoint); transformPointInverseNoScale(portalTransform, contactPoint, &localPoint);

View file

@ -30,8 +30,6 @@ void collisionObjectCollideWithScene(struct CollisionObject* object, struct Coll
int collisionSceneIsTouchingPortal(struct Vector3* contactPoint, struct Vector3* contactNormal); int collisionSceneIsTouchingPortal(struct Vector3* contactPoint, struct Vector3* contactNormal);
int collisionSceneIsPortalOpen(); 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); 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); void collisionSceneGetPortalTransform(int fromPortal, struct Transform* out);

View file

@ -80,7 +80,6 @@ void collisionSphereBoundingBox(struct ColliderTypeData* typeData, struct Transf
} }
struct ColliderCallbacks gCollisionSphereCallbacks = { struct ColliderCallbacks gCollisionSphereCallbacks = {
collisionSphereCollideQuad,
NULL, // TODO NULL, // TODO
collisionSphereSolidMofI, collisionSphereSolidMofI,
collisionSphereBoundingBox, collisionSphereBoundingBox,

View file

@ -15,6 +15,8 @@
#define GRAB_RAYCAST_DISTANCE 2.5f #define GRAB_RAYCAST_DISTANCE 2.5f
#define PLAYER_COLLISION_LAYERS COLLISION_LAYERS_TANGIBLE
struct Vector3 gGrabDistance = {0.0f, 0.0f, -1.5f}; struct Vector3 gGrabDistance = {0.0f, 0.0f, -1.5f};
struct Vector3 gCameraOffset = {0.0f, 0.0f, 0.0f}; struct Vector3 gCameraOffset = {0.0f, 0.0f, 0.0f};
@ -41,7 +43,7 @@ struct ColliderTypeData gPlayerColliderData = {
}; };
void playerInit(struct Player* player, struct Location* startLocation) { 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); rigidBodyMarkKinematic(&player->body);
player->body.flags |= RigidBodyGenerateContacts; player->body.flags |= RigidBodyGenerateContacts;
collisionSceneAddDynamicObject(&player->collisionObject); collisionSceneAddDynamicObject(&player->collisionObject);
@ -126,6 +128,8 @@ void playerUpdateGrabbedObject(struct Player* player) {
struct RaycastHit hit; 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)) { 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; player->grabbing = hit.object->body;
@ -135,6 +139,8 @@ void playerUpdateGrabbedObject(struct Player* player) {
player->grabbingThroughPortal = PLAYER_GRABBING_THROUGH_NOTHING; player->grabbingThroughPortal = PLAYER_GRABBING_THROUGH_NOTHING;
} }
} }
player->collisionObject.collisionLayers = PLAYER_COLLISION_LAYERS;
} }
} }