You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
8.7 KiB
C#
208 lines
8.7 KiB
C#
6 months ago
|
using System;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace Autohand {
|
||
|
public class PlaceJoint : PlacePoint {
|
||
|
[Tooltip("This is for connecting grabbables together, leave empty if using a static")]
|
||
|
public Grabbable localGrabbable;
|
||
|
public Rigidbody localRigidbody;
|
||
|
public Vector3 anchor;
|
||
|
public Vector3 axis = Vector3.right;
|
||
|
public bool autoConfigureConnection = true;
|
||
|
public Vector3 connectedAnchor;
|
||
|
public Vector3 secondaryAxis = Vector3.up;
|
||
|
public ConfigurableJointMotion xMotion, yMotion, zMotion;
|
||
|
public ConfigurableJointMotion angularXMotion, angularYMotion, angularZMotion;
|
||
|
[SerializeField]
|
||
|
public SerializedSoftJointLimitSpring linearLimitSpring;
|
||
|
[SerializeField]
|
||
|
public SerializedSoftJointLimit linearLimit;
|
||
|
[SerializeField]
|
||
|
public SerializedSoftJointLimitSpring angularXLimitSpring;
|
||
|
public SerializedSoftJointLimit lowAngularXLimit;
|
||
|
public SerializedSoftJointLimit highAngularXLimit;
|
||
|
public SerializedSoftJointLimitSpring angularYZLimitSpring;
|
||
|
public SerializedSoftJointLimit angularYLimit;
|
||
|
public SerializedSoftJointLimit angularZLimit;
|
||
|
public Vector3 targetPosition;
|
||
|
public Vector3 targetVelocity;
|
||
|
public SerializedJointDrive xDrive;
|
||
|
public SerializedJointDrive yDrive;
|
||
|
public SerializedJointDrive zDrive;
|
||
|
public Vector3 targetAngularVelocity;
|
||
|
public RotationDriveMode rotationDriveMode;
|
||
|
public SerializedJointDrive angularXDrive;
|
||
|
public SerializedJointDrive angularYZDrive;
|
||
|
public SerializedJointDrive slerpDrive;
|
||
|
public JointProjectionMode projectionMode = JointProjectionMode.PositionAndRotation;
|
||
|
public float projectionDistance = 0f;
|
||
|
public float projectionAngle = 0;
|
||
|
public bool configuredInWorldSpace;
|
||
|
public bool swapBodies;
|
||
|
|
||
|
|
||
|
public bool enableCollision = false;
|
||
|
public bool enablePreprocessing = true;
|
||
|
public float breakForce = float.PositiveInfinity;
|
||
|
public float breakTorque = float.PositiveInfinity;
|
||
|
public float massScale = 1;
|
||
|
public float connectedMassScale = 1;
|
||
|
[Range(1, 255), Tooltip("The solver iterations to use while a placeJoint is connected, higher is higher quality joint stability but more expensive 1-255")]
|
||
|
public int solverIterations = 100;
|
||
|
[Range(1, 255), Tooltip("The velocity solver iterations to use while a placeJoint is connected, higher is higher quality joint stability but more expensive 1-255")]
|
||
|
public int velocitySolverIterations = 100;
|
||
|
|
||
|
Quaternion targetRotation = Quaternion.identity;
|
||
|
ConfigurableJoint connectionJoint = null;
|
||
|
|
||
|
Vector3 prePlacedPos;
|
||
|
Quaternion prePlacedRot;
|
||
|
|
||
|
|
||
|
protected void Start() {
|
||
|
//base.Start();
|
||
|
base.makePlacedKinematic = false;
|
||
|
base.placedJointLink = null;
|
||
|
}
|
||
|
internal override void Highlight(Grabbable placeObj) {
|
||
|
base.Highlight(placeObj);
|
||
|
}
|
||
|
|
||
|
public override bool CanPlace(Grabbable placeObj, bool checkRoot = true) {
|
||
|
return base.CanPlace(placeObj) && placeObj.body != localRigidbody;
|
||
|
}
|
||
|
|
||
|
//protected override void OnEnable() {
|
||
|
// base.OnEnable();
|
||
|
// if(localGrabbable != null)
|
||
|
// localGrabbable.OnReleaseEvent += OnReleased;
|
||
|
//}
|
||
|
|
||
|
//protected override void OnDisable() {
|
||
|
// base.OnDisable();
|
||
|
// if(localGrabbable != null)
|
||
|
// localGrabbable.OnReleaseEvent -= OnReleased;
|
||
|
//}
|
||
|
//void OnReleased(Hand hand, Grabbable grab) {
|
||
|
// if(localGrabbable != null) {
|
||
|
// Remove();
|
||
|
// }
|
||
|
//}
|
||
|
|
||
|
public override void Place(Grabbable placeObj) {
|
||
|
prePlacedPos = placeObj.transform.position;
|
||
|
prePlacedRot = placeObj.transform.rotation;
|
||
|
|
||
|
base.Place(placeObj);
|
||
|
if(connectionJoint == null && placedObject != null) {
|
||
|
CreateConnection(placeObj);
|
||
|
}
|
||
|
|
||
|
if(localGrabbable) {
|
||
|
if (localGrabbable.body != null)
|
||
|
{
|
||
|
localGrabbable.body.velocity = Vector3.zero;
|
||
|
localGrabbable.body.angularVelocity = Vector3.zero;
|
||
|
}
|
||
|
for(int i = 0; i < localGrabbable.jointedBodies.Count; i++) {
|
||
|
localGrabbable.jointedBodies[i].velocity = Vector3.zero;
|
||
|
localGrabbable.jointedBodies[i].angularVelocity = Vector3.zero;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
private void FixedUpdate() {
|
||
|
if(placedObject != null) {
|
||
|
if(connectionJoint == null)
|
||
|
Remove(placedObject);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
public override void Remove(Grabbable placeObj) {
|
||
|
if(localGrabbable != null && localGrabbable.body != null)
|
||
|
localGrabbable.RemoveJointedBody(placeObj.body);
|
||
|
placeObj.RemoveJointedBody(localRigidbody);
|
||
|
|
||
|
if(connectionJoint != null) {
|
||
|
Destroy(connectionJoint);
|
||
|
connectionJoint = null;
|
||
|
}
|
||
|
|
||
|
localRigidbody.solverIterations = Physics.defaultSolverIterations;
|
||
|
localRigidbody.solverVelocityIterations = Physics.defaultSolverVelocityIterations;
|
||
|
base.Remove(placeObj);
|
||
|
|
||
|
}
|
||
|
|
||
|
Vector3 pregrabPos;
|
||
|
Quaternion pregrabRot;
|
||
|
public void CreateConnection(Grabbable connection) {
|
||
|
if(localRigidbody != null) {
|
||
|
connection.AddJointedBody(localRigidbody);
|
||
|
if(localGrabbable != null && localGrabbable.body != null)
|
||
|
localGrabbable.AddJointedBody(connection.body);
|
||
|
}
|
||
|
|
||
|
localRigidbody.solverIterations = solverIterations;
|
||
|
localRigidbody.solverVelocityIterations = velocitySolverIterations;
|
||
|
connectionJoint = connection.gameObject.AddComponent<ConfigurableJoint>();
|
||
|
connectionJoint.connectedBody = localRigidbody;
|
||
|
connectionJoint.anchor = anchor;
|
||
|
connectionJoint.axis = axis;
|
||
|
connectionJoint.autoConfigureConnectedAnchor = false;
|
||
|
connectionJoint.connectedAnchor = Vector3.zero;
|
||
|
connectionJoint.secondaryAxis = secondaryAxis;
|
||
|
connectionJoint.xMotion = xMotion;
|
||
|
connectionJoint.yMotion = yMotion;
|
||
|
connectionJoint.zMotion = zMotion;
|
||
|
connectionJoint.angularXMotion = angularXMotion;
|
||
|
connectionJoint.angularYMotion = angularYMotion;
|
||
|
connectionJoint.angularZMotion = angularZMotion;
|
||
|
connectionJoint.linearLimitSpring = linearLimitSpring;
|
||
|
connectionJoint.linearLimit = linearLimit;
|
||
|
connectionJoint.angularXLimitSpring = angularXLimitSpring;
|
||
|
connectionJoint.lowAngularXLimit = lowAngularXLimit;
|
||
|
connectionJoint.highAngularXLimit = highAngularXLimit;
|
||
|
connectionJoint.angularYZLimitSpring = angularYZLimitSpring;
|
||
|
connectionJoint.angularYLimit = angularYLimit;
|
||
|
connectionJoint.angularZLimit = angularZLimit;
|
||
|
connectionJoint.targetPosition = targetPosition;
|
||
|
connectionJoint.targetVelocity = targetVelocity;
|
||
|
connectionJoint.xDrive = xDrive;
|
||
|
connectionJoint.yDrive = yDrive;
|
||
|
connectionJoint.zDrive = zDrive;
|
||
|
connectionJoint.targetAngularVelocity = targetAngularVelocity;
|
||
|
connectionJoint.rotationDriveMode = rotationDriveMode;
|
||
|
connectionJoint.angularXDrive = angularXDrive;
|
||
|
connectionJoint.angularYZDrive = angularYZDrive;
|
||
|
connectionJoint.slerpDrive = slerpDrive;
|
||
|
connectionJoint.projectionMode = projectionMode;
|
||
|
connectionJoint.projectionDistance = projectionDistance;
|
||
|
connectionJoint.projectionAngle = projectionAngle;
|
||
|
connectionJoint.configuredInWorldSpace = configuredInWorldSpace;
|
||
|
connectionJoint.swapBodies = swapBodies;
|
||
|
connectionJoint.enableCollision = enableCollision;
|
||
|
connectionJoint.enablePreprocessing = enablePreprocessing;
|
||
|
connectionJoint.breakForce = breakForce;
|
||
|
connectionJoint.breakTorque = breakTorque;
|
||
|
connectionJoint.massScale = massScale;
|
||
|
connectionJoint.connectedMassScale = connectedMassScale;
|
||
|
}
|
||
|
|
||
|
|
||
|
public void Destroyjoint()
|
||
|
{
|
||
|
if (connectionJoint != null)
|
||
|
{
|
||
|
Destroy(connectionJoint);
|
||
|
if (localGrabbable != null)
|
||
|
localGrabbable.RemoveJointedBody(placedObject.body);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|