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
Player cant pickup objects
Create elevator geometry
Collide player with objects in scene
Cylinder touching bug
Allow player to press button
<!-- Cylinder touching bug -->
Allow player to press button -- kinda
Cylinder raycasting
Radio
Create radio model
Create radio texture

View file

@ -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<CollisionGeneratorOutput> 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();

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);
struct ColliderCallbacks {
CollideWithQuad collideWithQuad;
RaycastCollider raycast;
MomentOfInertiaCalculator mofICalculator;
BoundingBoxCalculator boundingBoxCalculator;

View file

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

View file

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

View file

@ -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);

View file

@ -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);

View file

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

View file

@ -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;
}
}