Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,17 @@ default Vector3d getAngularVelocity(final PhysicsPipelineBody body, final Vector
* @param configuration the configuration of the constraint
*/
default <T extends PhysicsConstraintHandle> T addConstraint(@Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final PhysicsConstraintConfiguration<T> 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 extends PhysicsConstraintHandle> T addConstraint(@Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final PhysicsConstraintConfiguration<T> configuration) {
throw new UnsupportedOperationException("Not implemented");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 extends PhysicsConstraintHandle> T addConstraint(@Nullable final ServerSubLevel sublevelA, @Nullable final ServerSubLevel sublevelB, final PhysicsConstraintConfiguration<T> configuration) {
if (sublevelA == null && sublevelB == null) {
public <T extends PhysicsConstraintHandle> T addConstraint(@Nullable final PhysicsPipelineBody bodyA, @Nullable final PhysicsPipelineBody bodyB, final PhysicsConstraintConfiguration<T> 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());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
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;

public class RapierFixedConstraintHandle extends RapierConstraintHandle implements FixedConstraintHandle {
/**
* 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(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
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;

public class RapierFreeConstraintHandle extends RapierConstraintHandle implements FreeConstraintHandle {
/**
* 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(),
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -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(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
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;

public class RapierRotaryConstraintHandle extends RapierConstraintHandle implements RotaryConstraintHandle {
/**
* 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(),
Expand Down
22 changes: 10 additions & 12 deletions common/src/main/rust/rapier/src/joints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down