From 08e51a44d97e5925b3d962bdd8d686fd05b9cfc4 Mon Sep 17 00:00:00 2001 From: westonCoder Date: Sun, 15 Oct 2023 17:18:31 -0500 Subject: [PATCH 1/3] Fixes Portal Height - I am not really sure if this is the exact value you were going for with this, but 1.6 seems to match the collision to the top and bottom of the portal cutout. - larger items like boxes seem to pass through much easier now. - have not seen any negative side effect from this. --- src/physics/collision_scene.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/physics/collision_scene.h b/src/physics/collision_scene.h index 5640584..caf3128 100644 --- a/src/physics/collision_scene.h +++ b/src/physics/collision_scene.h @@ -8,7 +8,7 @@ #include "defs.h" #include "point_constraint.h" -#define PORTAL_COVER_HEIGHT 0.708084f +#define PORTAL_COVER_HEIGHT 1.6 #define PORTAL_COVER_WIDTH 0.84085f #define PORTAL_THICKNESS 0.11f From d5c8eee04d190a6f2be0b0c3e62ff8afea862b13 Mon Sep 17 00:00:00 2001 From: westonCoder Date: Mon, 16 Oct 2023 11:20:50 -0500 Subject: [PATCH 2/3] changed both variable names, and adjusted surrounding code --- src/physics/collision_scene.c | 4 ++-- src/physics/collision_scene.h | 4 ++-- src/scene/portal.c | 20 ++++++++++---------- src/scene/render_plan.c | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/physics/collision_scene.c b/src/physics/collision_scene.c index 07ca900..31af8dc 100644 --- a/src/physics/collision_scene.c +++ b/src/physics/collision_scene.c @@ -186,8 +186,8 @@ int collisionSceneIsTouchingSinglePortal(struct Vector3* contactPoint, struct Ve return 0; } - localPoint.x *= (2.0f / PORTAL_COVER_WIDTH); - localPoint.y *= (2.0f / PORTAL_COVER_HEIGHT); + localPoint.x *= (1.0f / PORTAL_COVER_WIDTH_RADIUS); + localPoint.y *= (1.0f / PORTAL_COVER_HEIGHT_RADIUS); localPoint.z = 0.0f; if (vector3MagSqrd(&localPoint) >= 1.0f) { diff --git a/src/physics/collision_scene.h b/src/physics/collision_scene.h index caf3128..a200b18 100644 --- a/src/physics/collision_scene.h +++ b/src/physics/collision_scene.h @@ -8,8 +8,8 @@ #include "defs.h" #include "point_constraint.h" -#define PORTAL_COVER_HEIGHT 1.6 -#define PORTAL_COVER_WIDTH 0.84085f +#define PORTAL_COVER_HEIGHT_RADIUS 0.708084f +#define PORTAL_COVER_WIDTH_RADIUS 0.420425f #define PORTAL_THICKNESS 0.11f diff --git a/src/scene/portal.c b/src/scene/portal.c index b586483..00046c5 100644 --- a/src/scene/portal.c +++ b/src/scene/portal.c @@ -30,14 +30,14 @@ struct ColliderTypeData gPortalColliderType = { #define CALC_SCREEN_SPACE(clip_space, screen_size) ((clip_space + 1.0f) * ((screen_size) / 2)) struct Vector3 gPortalOutline[PORTAL_LOOP_SIZE] = { - {0.0f, 1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT, 0}, - {0.353553f * SCENE_SCALE * PORTAL_COVER_WIDTH, 0.707107f * SCENE_SCALE * PORTAL_COVER_HEIGHT, 0}, - {0.5f * SCENE_SCALE * PORTAL_COVER_WIDTH, 0.0f, 0}, - {0.353553f * SCENE_SCALE * PORTAL_COVER_WIDTH, -0.707107f * SCENE_SCALE * PORTAL_COVER_HEIGHT, 0}, - {0.0f, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT, 0}, - {-0.353553f * SCENE_SCALE * PORTAL_COVER_WIDTH, -0.707107f * SCENE_SCALE * PORTAL_COVER_HEIGHT, 0}, - {-0.5f * SCENE_SCALE * PORTAL_COVER_WIDTH, 0.0f, 0}, - {-0.353553f * SCENE_SCALE * PORTAL_COVER_WIDTH, 0.707107f * SCENE_SCALE * PORTAL_COVER_HEIGHT, 0}, + {0.0f, 1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {0.5f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, 0.0f, 0}, + {SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {0.0f, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {-1.0f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {-0.5f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, 0.0f, 0}, + {-1.0f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, }; #define PORTAL_CLIPPING_PLANE_BIAS (SCENE_SCALE * 0.25f) @@ -86,12 +86,12 @@ void portalCalculateBB(struct Transform* portalTransform, struct Box3D* bb) { bb->min = bb->max = portalTransform->position; struct Vector3 nextDir; - vector3Scale(&portalUp, &nextDir, PORTAL_COVER_HEIGHT * 0.5f); + vector3Scale(&portalUp, &nextDir, PORTAL_COVER_HEIGHT_RADIUS * 0.5f); box3DExtendDirection(bb, &nextDir, bb); vector3Negate(&nextDir, &nextDir); box3DExtendDirection(bb, &nextDir, bb); - vector3Scale(&portalRight, &nextDir, PORTAL_COVER_WIDTH * 0.5f); + vector3Scale(&portalRight, &nextDir, PORTAL_COVER_WIDTH_RADIUS * 0.5f); box3DExtendDirection(bb, &nextDir, bb); vector3Negate(&nextDir, &nextDir); box3DExtendDirection(bb, &nextDir, bb); diff --git a/src/scene/render_plan.c b/src/scene/render_plan.c index 9f8ddf7..c8aa84d 100644 --- a/src/scene/render_plan.c +++ b/src/scene/render_plan.c @@ -266,7 +266,7 @@ int renderPlanPortal(struct RenderPlan* renderPlan, struct Scene* scene, struct struct Vector3 cameraForward; quatMultVector(&next->camera.transform.rotation, &gForward, &cameraForward); - next->camera.nearPlane = (-vector3Dot(&portalOffset, &cameraForward)) * SCENE_SCALE - SCENE_SCALE * PORTAL_COVER_HEIGHT * 0.5f; + next->camera.nearPlane = (-vector3Dot(&portalOffset, &cameraForward)) * SCENE_SCALE - SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS * 0.5f; if (next->camera.nearPlane < current->camera.nearPlane) { next->camera.nearPlane = current->camera.nearPlane; From 2e5626b794d67513a9644ec92ffb1c301f6543a0 Mon Sep 17 00:00:00 2001 From: westonCoder Date: Mon, 16 Oct 2023 13:23:45 -0500 Subject: [PATCH 3/3] made all requested changes --- src/scene/portal.c | 16 ++++++++-------- src/scene/render_plan.c | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/scene/portal.c b/src/scene/portal.c index 00046c5..41a1a3d 100644 --- a/src/scene/portal.c +++ b/src/scene/portal.c @@ -31,13 +31,13 @@ struct ColliderTypeData gPortalColliderType = { struct Vector3 gPortalOutline[PORTAL_LOOP_SIZE] = { {0.0f, 1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, - {SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, - {0.5f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, 0.0f, 0}, - {SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {0.707107f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {1.0f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, 0.0f, 0}, + {0.707107f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, {0.0f, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, - {-1.0f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, - {-0.5f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, 0.0f, 0}, - {-1.0f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {-0.707107f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, -1.0f * SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, + {-1.0f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, 0.0f, 0}, + {-0.707107f * SCENE_SCALE * PORTAL_COVER_WIDTH_RADIUS, SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS, 0}, }; #define PORTAL_CLIPPING_PLANE_BIAS (SCENE_SCALE * 0.25f) @@ -86,12 +86,12 @@ void portalCalculateBB(struct Transform* portalTransform, struct Box3D* bb) { bb->min = bb->max = portalTransform->position; struct Vector3 nextDir; - vector3Scale(&portalUp, &nextDir, PORTAL_COVER_HEIGHT_RADIUS * 0.5f); + vector3Scale(&portalUp, &nextDir, PORTAL_COVER_HEIGHT_RADIUS); box3DExtendDirection(bb, &nextDir, bb); vector3Negate(&nextDir, &nextDir); box3DExtendDirection(bb, &nextDir, bb); - vector3Scale(&portalRight, &nextDir, PORTAL_COVER_WIDTH_RADIUS * 0.5f); + vector3Scale(&portalRight, &nextDir, PORTAL_COVER_WIDTH_RADIUS); box3DExtendDirection(bb, &nextDir, bb); vector3Negate(&nextDir, &nextDir); box3DExtendDirection(bb, &nextDir, bb); diff --git a/src/scene/render_plan.c b/src/scene/render_plan.c index c8aa84d..7ac654f 100644 --- a/src/scene/render_plan.c +++ b/src/scene/render_plan.c @@ -266,7 +266,7 @@ int renderPlanPortal(struct RenderPlan* renderPlan, struct Scene* scene, struct struct Vector3 cameraForward; quatMultVector(&next->camera.transform.rotation, &gForward, &cameraForward); - next->camera.nearPlane = (-vector3Dot(&portalOffset, &cameraForward)) * SCENE_SCALE - SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS * 0.5f; + next->camera.nearPlane = (-vector3Dot(&portalOffset, &cameraForward)) * SCENE_SCALE - SCENE_SCALE * PORTAL_COVER_HEIGHT_RADIUS; if (next->camera.nearPlane < current->camera.nearPlane) { next->camera.nearPlane = current->camera.nearPlane;