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
|
## 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
|
||||||
|
|
Binary file not shown.
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
struct ColliderCallbacks gCollisionBoxCallbacks = {
|
struct ColliderCallbacks gCollisionBoxCallbacks = {
|
||||||
NULL,
|
|
||||||
raycastBox,
|
raycastBox,
|
||||||
collisionBoxSolidMofI,
|
collisionBoxSolidMofI,
|
||||||
collisionBoxBoundingBox,
|
collisionBoxBoundingBox,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue