Fix some minor bugs
This commit is contained in:
parent
bbe5c38eff
commit
5d21991592
|
@ -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
|
||||
|
|
Binary file not shown.
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
#include <math.h>
|
||||
|
||||
struct ColliderCallbacks gCollisionBoxCallbacks = {
|
||||
NULL,
|
||||
raycastBox,
|
||||
collisionBoxSolidMofI,
|
||||
collisionBoxBoundingBox,
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
#include "../math/vector2.h"
|
||||
|
||||
struct ColliderCallbacks gCollisionCylinderCallbacks = {
|
||||
NULL,
|
||||
raycastCylinder,
|
||||
collisionCylinderSolidMofI,
|
||||
collisionCylinderBoundingBox,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -80,7 +80,6 @@ void collisionSphereBoundingBox(struct ColliderTypeData* typeData, struct Transf
|
|||
}
|
||||
|
||||
struct ColliderCallbacks gCollisionSphereCallbacks = {
|
||||
collisionSphereCollideQuad,
|
||||
NULL, // TODO
|
||||
collisionSphereSolidMofI,
|
||||
collisionSphereBoundingBox,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue