diff --git a/common/src/main/java/dev/ryanhcode/sable/api/physics/PhysicsPipeline.java b/common/src/main/java/dev/ryanhcode/sable/api/physics/PhysicsPipeline.java index c51e8b35..de729f9f 100644 --- a/common/src/main/java/dev/ryanhcode/sable/api/physics/PhysicsPipeline.java +++ b/common/src/main/java/dev/ryanhcode/sable/api/physics/PhysicsPipeline.java @@ -221,6 +221,17 @@ default Vector3d getAngularVelocity(final PhysicsPipelineBody body, final Vector * @param configuration the configuration of the constraint */ default T addConstraint(@Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final PhysicsConstraintConfiguration configuration) { + return this.addConstraint((PhysicsPipelineBody) sublevelA, sublevelB, configuration); + } + + /** + * Adds a constraint to the engine, returning its handle + * + * @param bodyA the first rigid-body to constrain, or null to constrain the second rigid-body to the world + * @param bodyB the second rigid-body to constrain, or null to constrain the first rigid-body to the world + * @param configuration the configuration of the constraint + */ + default T addConstraint(@Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final PhysicsConstraintConfiguration configuration) { throw new UnsupportedOperationException("Not implemented"); } diff --git a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/RapierPhysicsPipeline.java b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/RapierPhysicsPipeline.java index 011e0200..ba6ebe80 100644 --- a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/RapierPhysicsPipeline.java +++ b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/RapierPhysicsPipeline.java @@ -617,37 +617,37 @@ public void wakeUp(final PhysicsPipelineBody body) { /** * Adds a constraint to the engine, returning its handle * - * @param sublevelA the first sub-level to constrain, or null to constrain the second sub-level to the world - * @param sublevelB the second sub-level to constrain, or null to constrain the first sub-level to the world + * @param bodyA the first rigid-body to constrain, or null to constrain the second rigid-body to the world + * @param bodyB the second rigid-body to constrain, or null to constrain the first rigid-body to the world * @param configuration the configuration of the constraint */ @SuppressWarnings("unchecked") @Override - public T addConstraint(@Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final PhysicsConstraintConfiguration configuration) { - if (sublevelA == null && sublevelB == null) { + public T addConstraint(@Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final PhysicsConstraintConfiguration configuration) { + if (bodyA == null && bodyB == null) { Sable.LOGGER.error("Cannot add a constraint between the static world and static world"); return null; } - if (sublevelA == sublevelB) { - Sable.LOGGER.error("Cannot add a constraint between a sub-level and itself"); + if (bodyA == bodyB) { + Sable.LOGGER.error("Cannot add a constraint between a rigid-body and itself"); return null; } if (configuration instanceof final RotaryConstraintConfiguration config) { - return (T) RapierRotaryConstraintHandle.create(this.level, sublevelA, sublevelB, config); + return (T) RapierRotaryConstraintHandle.create(this.level, bodyA, bodyB, config); } if (configuration instanceof final FixedConstraintConfiguration config) { - return (T) RapierFixedConstraintHandle.create(this.level, sublevelA, sublevelB, config); + return (T) RapierFixedConstraintHandle.create(this.level, bodyA, bodyB, config); } if (configuration instanceof final FreeConstraintConfiguration config) { - return (T) RapierFreeConstraintHandle.create(this.level, sublevelA, sublevelB, config); + return (T) RapierFreeConstraintHandle.create(this.level, bodyA, bodyB, config); } if (configuration instanceof final GenericConstraintConfiguration config) { - return (T) RapierGenericConstraintHandle.create(this.level, sublevelA, sublevelB, config); + return (T) RapierGenericConstraintHandle.create(this.level, bodyA, bodyB, config); } Sable.LOGGER.error("Unknown constraint configuration type: {}", configuration.getClass().getName()); diff --git a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/fixed/RapierFixedConstraintHandle.java b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/fixed/RapierFixedConstraintHandle.java index 0fbcb28e..46ea248e 100644 --- a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/fixed/RapierFixedConstraintHandle.java +++ b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/fixed/RapierFixedConstraintHandle.java @@ -1,10 +1,10 @@ package dev.ryanhcode.sable.physics.impl.rapier.constraint.fixed; +import dev.ryanhcode.sable.api.physics.PhysicsPipelineBody; import dev.ryanhcode.sable.api.physics.constraint.fixed.FixedConstraintConfiguration; import dev.ryanhcode.sable.api.physics.constraint.fixed.FixedConstraintHandle; import dev.ryanhcode.sable.physics.impl.rapier.Rapier3D; import dev.ryanhcode.sable.physics.impl.rapier.constraint.RapierConstraintHandle; -import dev.ryanhcode.sable.sublevel.ServerSubLevel; import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.Nullable; @@ -12,13 +12,13 @@ public class RapierFixedConstraintHandle extends RapierConstraintHandle implemen /** * Creates a rapier constraint handle */ - public static RapierFixedConstraintHandle create(final ServerLevel serverLevel, @Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final FixedConstraintConfiguration config) { + public static RapierFixedConstraintHandle create(final ServerLevel serverLevel, @Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final FixedConstraintConfiguration config) { final int sceneID = Rapier3D.getID(serverLevel); final long handle = Rapier3D.addFixedConstraint( sceneID, - sublevelA == null ? -1 : Rapier3D.getID(sublevelA), - sublevelB == null ? -1 : Rapier3D.getID(sublevelB), + bodyA == null ? -1 : Rapier3D.getID(bodyA), + bodyB == null ? -1 : Rapier3D.getID(bodyB), config.pos1().x(), config.pos1().y(), config.pos1().z(), diff --git a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/free/RapierFreeConstraintHandle.java b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/free/RapierFreeConstraintHandle.java index 4bfd6f90..8a42c77c 100644 --- a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/free/RapierFreeConstraintHandle.java +++ b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/free/RapierFreeConstraintHandle.java @@ -1,10 +1,10 @@ package dev.ryanhcode.sable.physics.impl.rapier.constraint.free; +import dev.ryanhcode.sable.api.physics.PhysicsPipelineBody; import dev.ryanhcode.sable.api.physics.constraint.free.FreeConstraintConfiguration; import dev.ryanhcode.sable.api.physics.constraint.free.FreeConstraintHandle; import dev.ryanhcode.sable.physics.impl.rapier.Rapier3D; import dev.ryanhcode.sable.physics.impl.rapier.constraint.RapierConstraintHandle; -import dev.ryanhcode.sable.sublevel.ServerSubLevel; import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.Nullable; @@ -12,13 +12,13 @@ public class RapierFreeConstraintHandle extends RapierConstraintHandle implement /** * Creates a rapier constraint handle */ - public static RapierFreeConstraintHandle create(final ServerLevel serverLevel, @Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final FreeConstraintConfiguration config) { + public static RapierFreeConstraintHandle create(final ServerLevel serverLevel, @Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final FreeConstraintConfiguration config) { final int sceneID = Rapier3D.getID(serverLevel); final long handle = Rapier3D.addFreeConstraint( sceneID, - sublevelA == null ? -1 : Rapier3D.getID(sublevelA), - sublevelB == null ? -1 : Rapier3D.getID(sublevelB), + bodyA == null ? -1 : Rapier3D.getID(bodyA), + bodyB == null ? -1 : Rapier3D.getID(bodyB), config.pos1().x(), config.pos1().y(), config.pos1().z(), diff --git a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/generic/RapierGenericConstraintHandle.java b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/generic/RapierGenericConstraintHandle.java index 24160741..75f0db3d 100644 --- a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/generic/RapierGenericConstraintHandle.java +++ b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/generic/RapierGenericConstraintHandle.java @@ -1,11 +1,11 @@ package dev.ryanhcode.sable.physics.impl.rapier.constraint.generic; +import dev.ryanhcode.sable.api.physics.PhysicsPipelineBody; import dev.ryanhcode.sable.api.physics.constraint.ConstraintJointAxis; import dev.ryanhcode.sable.api.physics.constraint.generic.GenericConstraintConfiguration; import dev.ryanhcode.sable.api.physics.constraint.generic.GenericConstraintHandle; import dev.ryanhcode.sable.physics.impl.rapier.Rapier3D; import dev.ryanhcode.sable.physics.impl.rapier.constraint.RapierConstraintHandle; -import dev.ryanhcode.sable.sublevel.ServerSubLevel; import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -21,7 +21,7 @@ public class RapierGenericConstraintHandle extends RapierConstraintHandle implem /** * Creates a rapier constraint handle */ - public static RapierGenericConstraintHandle create(final ServerLevel serverLevel, @Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final GenericConstraintConfiguration config) { + public static RapierGenericConstraintHandle create(final ServerLevel serverLevel, @Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final GenericConstraintConfiguration config) { final int sceneID = Rapier3D.getID(serverLevel); int lockedAxesMask = 0; @@ -31,8 +31,8 @@ public static RapierGenericConstraintHandle create(final ServerLevel serverLevel final long handle = Rapier3D.addGenericConstraint( sceneID, - sublevelA == null ? -1 : Rapier3D.getID(sublevelA), - sublevelB == null ? -1 : Rapier3D.getID(sublevelB), + bodyA == null ? -1 : Rapier3D.getID(bodyA), + bodyB == null ? -1 : Rapier3D.getID(bodyB), config.pos1().x(), config.pos1().y(), config.pos1().z(), diff --git a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/rotary/RapierRotaryConstraintHandle.java b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/rotary/RapierRotaryConstraintHandle.java index b30563d2..64945549 100644 --- a/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/rotary/RapierRotaryConstraintHandle.java +++ b/common/src/main/java/dev/ryanhcode/sable/physics/impl/rapier/constraint/rotary/RapierRotaryConstraintHandle.java @@ -1,10 +1,10 @@ package dev.ryanhcode.sable.physics.impl.rapier.constraint.rotary; +import dev.ryanhcode.sable.api.physics.PhysicsPipelineBody; import dev.ryanhcode.sable.api.physics.constraint.rotary.RotaryConstraintConfiguration; import dev.ryanhcode.sable.api.physics.constraint.rotary.RotaryConstraintHandle; import dev.ryanhcode.sable.physics.impl.rapier.Rapier3D; import dev.ryanhcode.sable.physics.impl.rapier.constraint.RapierConstraintHandle; -import dev.ryanhcode.sable.sublevel.ServerSubLevel; import net.minecraft.server.level.ServerLevel; import org.jetbrains.annotations.Nullable; @@ -12,13 +12,13 @@ public class RapierRotaryConstraintHandle extends RapierConstraintHandle impleme /** * Creates a rapier constraint handle */ - public static RapierRotaryConstraintHandle create(final ServerLevel serverLevel, @Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final RotaryConstraintConfiguration config) { + public static RapierRotaryConstraintHandle create(final ServerLevel serverLevel, @Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final RotaryConstraintConfiguration config) { final int sceneID = Rapier3D.getID(serverLevel); final long handle = Rapier3D.addRotaryConstraint( sceneID, - sublevelA == null ? -1 : Rapier3D.getID(sublevelA), - sublevelB == null ? -1 : Rapier3D.getID(sublevelB), + bodyA == null ? -1 : Rapier3D.getID(bodyA), + bodyB == null ? -1 : Rapier3D.getID(bodyB), config.pos1().x(), config.pos1().y(), config.pos1().z(), diff --git a/common/src/main/rust/rapier/src/joints.rs b/common/src/main/rust/rapier/src/joints.rs index 71f6a7d5..67d0a72f 100644 --- a/common/src/main/rust/rapier/src/joints.rs +++ b/common/src/main/rust/rapier/src/joints.rs @@ -70,12 +70,11 @@ pub fn tick(scene_id: jint) { )); } let local_anchor_1 = joint.pos_a - - if let Some(id_a) = joint.id_a { - let rb_a = &scene.level_colliders[&id_a]; - rb_a.center_of_mass.unwrap() - } else { - Vector3::new(0.0, 0.0, 0.0) - }; + - joint + .id_a + .and_then(|id| scene.level_colliders.get(&id)) + .and_then(|rb| rb.center_of_mass) + .unwrap_or_default(); impulse_joint.data.set_local_anchor1(Vector::new( local_anchor_1.x as Real, local_anchor_1.y as Real, @@ -89,12 +88,11 @@ pub fn tick(scene_id: jint) { )); } let local_anchor_2 = joint.pos_b - - if let Some(id_b) = joint.id_b { - let rb_b = &scene.level_colliders[&id_b]; - rb_b.center_of_mass.unwrap() - } else { - Vector3::new(0.0, 0.0, 0.0) - }; + - joint + .id_b + .and_then(|id| scene.level_colliders.get(&id)) + .and_then(|rb| rb.center_of_mass) + .unwrap_or_default(); impulse_joint.data.set_local_anchor2(Vector::new( local_anchor_2.x as Real, local_anchor_2.y as Real,