void UpdateODEJoint() { bool needCreate = PushedToWorld && !Broken; bool created = jointID != dJointID.Zero; if (needCreate == created) { return; } if (needCreate) { ODEBody odeBody1 = (ODEBody)Body1; ODEBody odeBody2 = (ODEBody)Body2; jointID = Ode.dJointCreateFixed(((ODEPhysicsScene)Scene).worldID, IntPtr.Zero); Ode.SetJointContactsEnabled(jointID, false); //ContactsEnabled ); Ode.dJointAttach(jointID, odeBody1.bodyID, odeBody2.bodyID); Ode.dJointSetFixed(jointID); Ode.BodyDataAddJoint(odeBody1.bodyData, jointID); Ode.BodyDataAddJoint(odeBody2.bodyData, jointID); } else { DestroyODEJoint(); } }
void UpdateODEJoint() { bool needCreate = PushedToWorld && !Broken; bool created = jointID != dJointID.Zero; if (needCreate == created) { return; } if (needCreate) { ODEBody odeBody1 = (ODEBody)Body1; ODEBody odeBody2 = (ODEBody)Body2; jointID = Ode.dJointCreateSlider(((ODEPhysicsScene)Scene).worldID, IntPtr.Zero); Ode.SetJointContactsEnabled(jointID, ContactsEnabled); Ode.dJointSetSliderParam(jointID, Ode.dJointParams.dParamFudgeFactor, Defines.jointFudgeFactor); Ode.dJointAttach(jointID, odeBody1.bodyID, odeBody2.bodyID); axis.UpdateToLibrary(true); Ode.BodyDataAddJoint(odeBody1.bodyData, jointID); Ode.BodyDataAddJoint(odeBody2.bodyData, jointID); } else { DestroyODEJoint(); } }
void UpdateODEJoint() { bool needCreate = PushedToWorld && !Broken; bool created = jointID != dJointID.Zero; if (needCreate == created) { return; } if (needCreate) { if (Math.Abs(Vec3.Dot(axis1.Direction, axis2.Direction)) > .095f) { Log.Warning("UniversalJoint: Invalid axes."); return; } if (Axis1.LimitsEnabled && Axis1.LimitLow > Axis1.LimitHigh) { Log.Warning("UniversalJoint: Invalid axis1 limits (low > high)."); return; } if (Axis2.LimitsEnabled && Axis2.LimitLow > Axis2.LimitHigh) { Log.Warning("UniversalJoint: Invalid axis2 limits (low > high)."); return; } ODEBody odeBody1 = (ODEBody)Body1; ODEBody odeBody2 = (ODEBody)Body2; jointID = Ode.dJointCreateUniversal(((ODEPhysicsScene)Scene).worldID, IntPtr.Zero); Ode.SetJointContactsEnabled(jointID, ContactsEnabled); Ode.dJointSetUniversalParam(jointID, Ode.dJointParams.dParamFudgeFactor, Defines.jointFudgeFactor); Ode.dJointSetUniversalParam(jointID, Ode.dJointParams.dParamFudgeFactor2, Defines.jointFudgeFactor); Ode.dJointAttach(jointID, odeBody1.bodyID, odeBody2.bodyID); Ode.dJointSetUniversalAnchor(jointID, Anchor.X, Anchor.Y, Anchor.Z); axis1.UpdateToLibrary(true); axis2.UpdateToLibrary(true); axis1LocalAxis = Body1.Rotation.GetInverse() * axis1.Direction; axis2LocalAxis = Body1.Rotation.GetInverse() * axis2.Direction; Ode.BodyDataAddJoint(odeBody1.bodyData, jointID); Ode.BodyDataAddJoint(odeBody2.bodyData, jointID); } else { DestroyODEJoint(); } }
void UpdateODEJoint() { bool needCreate = PushedToWorld && !Broken; bool created = jointID != dJointID.Zero; if (needCreate == created) { return; } if (needCreate) { if (Axis.LimitsEnabled && Axis.LimitLow > Axis.LimitHigh) { Log.Warning("HingeJoint: Invalid axis limits (low > high)."); return; } ODEBody odeBody1 = (ODEBody)Body1; ODEBody odeBody2 = (ODEBody)Body2; jointID = Ode.dJointCreateHinge(((ODEPhysicsScene)Scene).worldID, IntPtr.Zero); Ode.SetJointContactsEnabled(jointID, ContactsEnabled); Ode.dJointSetHingeParam(jointID, Ode.dJointParams.dParamFudgeFactor, Defines.jointFudgeFactor); Ode.dJointAttach(jointID, odeBody1.bodyID, odeBody2.bodyID); Ode.dJointSetHingeAnchor(jointID, Anchor.X, Anchor.Y, Anchor.Z); axis.UpdateToLibrary(true); Ode.BodyDataAddJoint(odeBody1.bodyData, jointID); Ode.BodyDataAddJoint(odeBody2.bodyData, jointID); } else { DestroyODEJoint(); } }
void UpdateODEJoint() { bool needCreate = PushedToWorld && !Broken; bool created = jointID != dJointID.Zero; ODEBody odeBody1 = (ODEBody)Body1; ODEBody odeBody2 = (ODEBody)Body2; if (needCreate && (odeBody1.bodyID == dBodyID.Zero || odeBody2.bodyID == dBodyID.Zero)) { Log.Warning("ODEHinge2Joint: It is necessary that both bodies were not static."); needCreate = false; } if (needCreate == created) { return; } if (needCreate) { if (Math.Abs(Vec3.Dot(axis1.Direction, axis2.Direction)) > .095f) { Log.Warning("Hinge2Joint: Invalid axes."); return; } if (Axis1.LimitsEnabled && Axis1.LimitLow > Axis1.LimitHigh) { Log.Warning("Hinge2Joint: Invalid axis1 limits (low > high)."); return; } if (Axis2.LimitsEnabled && Axis2.LimitLow > Axis2.LimitHigh) { Log.Warning("Hinge2Joint: Invalid axis2 limits (low > high)."); return; } jointID = Ode.dJointCreateHinge2(((ODEPhysicsScene)Scene).worldID, IntPtr.Zero); Ode.SetJointContactsEnabled(jointID, ContactsEnabled); Ode.dJointSetHinge2Param(jointID, Ode.dJointParams.dParamFudgeFactor, Defines.jointFudgeFactor); Ode.dJointSetHinge2Param(jointID, Ode.dJointParams.dParamFudgeFactor2, Defines.jointFudgeFactor); Ode.dJointAttach(jointID, odeBody1.bodyID, odeBody2.bodyID); Ode.dJointSetHinge2Anchor(jointID, Anchor.X, Anchor.Y, Anchor.Z); axis1.UpdateToLibrary(true); axis2.UpdateToLibrary(true); UpdateSuspension(); Ode.BodyDataAddJoint(odeBody1.bodyData, jointID); Ode.BodyDataAddJoint(odeBody2.bodyData, jointID); } else { DestroyODEJoint(); } }