private void SetSegmentMaterialSelected(CritterSegment segment, bool on) {
     if(on) {
         segment.GetComponent<MeshRenderer>().material.SetFloat("_Selected", 1f);  // turn on selected
     }
     else {
         segment.GetComponent<MeshRenderer>().material.SetFloat("_Selected", 0f);  // de-select
     }
 }
 private void SetSegmentMaterialHover(CritterSegment segment, bool on) {
     // bool on true=is hovering;   false=not hovering
     if(on) {
         segment.GetComponent<MeshRenderer>().material.SetFloat("_DisplayTarget", 1f);  // turn on crosshairs
     }
     else {
         segment.GetComponent<MeshRenderer>().material.SetFloat("_DisplayTarget", 0f);  // turn off crosshairs
     }
 }
 private Vector3 GetJointAnchor(CritterSegment segment) {
     CritterNode node = segment.sourceNode;
     Vector3 retVec = new Vector3(0f, 0f, 0f);
     retVec.x = 0f;
     retVec.y = 0f;  // These might change when/if I implement childAttachPos, or initial Rotation
     retVec.z = -0.5f;
     return retVec;
 }
 private Vector3 GetJointConnectedAnchor(CritterSegment segment) {
     //Vector3 retVec = new Vector3(0f, 0f, 0f);
     //retVec.x = 0f;
     //retVec.y = 0f;  // These might change when/if I implement childAttachPos, or initial Rotation
     //retVec.z = -0.5f;
     CritterNode node = segment.sourceNode;
     Vector3 attachDir = node.jointLink.attachDir;
     // MODIFY AttachDir based on recursion Forward:
     // $*$*$*$*$*$*$*$ This code is duplicated in SetTransform --  Look into how to combine!!!
     if (segment.recursionNumber > 1) {  // if segment is not the root of a recursion chain
         attachDir = Vector3.Lerp(attachDir, new Vector3(0f, 0f, 1f), segment.sourceNode.jointLink.recursionForward);
     }
     if (segment.mirrorX) {
         attachDir.x *= -1f;
     }
     if (segment.mirrorY) {
         attachDir.y *= -1f;
     }
     if (segment.mirrorZ) {
         attachDir.z *= -1f;
     }
     return ConvertAttachDirToLocalCoords(attachDir);
 }
 void ConfigureJointSettings(CritterSegment segment, ref ConfigurableJoint joint) {
     CritterNode node = segment.sourceNode;
     joint.breakForce = 100000f;
     joint.breakTorque = 100000f;
     if (node.jointLink.jointType == CritterJointLink.JointType.Fixed) { // Fixed Joint
                                                                               // Lock mobility:
         joint.xMotion = ConfigurableJointMotion.Locked;
         joint.yMotion = ConfigurableJointMotion.Locked;
         joint.zMotion = ConfigurableJointMotion.Locked;
         joint.angularXMotion = ConfigurableJointMotion.Locked;
         joint.angularYMotion = ConfigurableJointMotion.Locked;
         joint.angularZMotion = ConfigurableJointMotion.Locked;
     }
     else if (node.jointLink.jointType == CritterJointLink.JointType.HingeX) { // Uni-Axis Hinge Joint
         joint.axis = new Vector3(1f, 0f, 0f);
         joint.secondaryAxis = new Vector3(0f, 1f, 0f);
         JointDrive jointDrive = joint.angularXDrive;
         //jointDrive.mode = JointDriveMode.Velocity;
         jointDrive.positionDamper = 1f;
         jointDrive.positionSpring = 1f;
         joint.angularXDrive = jointDrive;
         // Lock mobility:
         joint.xMotion = ConfigurableJointMotion.Locked;
         joint.yMotion = ConfigurableJointMotion.Locked;
         joint.zMotion = ConfigurableJointMotion.Locked;
         if (node.jointLink.jointLimitPrimary == 180)
             joint.angularXMotion = ConfigurableJointMotion.Free;
         else
             joint.angularXMotion = ConfigurableJointMotion.Limited;
         joint.angularYMotion = ConfigurableJointMotion.Locked;
         joint.angularZMotion = ConfigurableJointMotion.Locked;
         // Joint Limits:
         SoftJointLimit limitXMin = joint.lowAngularXLimit;
         limitXMin.bounciness = 0f;
         //limitXMin.contactDistance = 1f;
         limitXMin.limit = -node.jointLink.jointLimitPrimary;
         joint.lowAngularXLimit = limitXMin;
         SoftJointLimit limitXMax = joint.highAngularXLimit;
         limitXMax.bounciness = 0f;
         limitXMax.limit = node.jointLink.jointLimitPrimary;
         joint.highAngularXLimit = limitXMax;
     }
     else if (node.jointLink.jointType == CritterJointLink.JointType.HingeY) { // Uni-Axis Hinge Joint
         joint.axis = new Vector3(1f, 0f, 0f);
         joint.secondaryAxis = new Vector3(0f, 1f, 0f);
         JointDrive jointDrive = joint.angularYZDrive;
         //jointDrive.mode = JointDriveMode.Velocity;
         jointDrive.positionDamper = 1f;
         jointDrive.positionSpring = 1f;
         joint.angularYZDrive = jointDrive;
         // Lock mobility:
         joint.xMotion = ConfigurableJointMotion.Locked;
         joint.yMotion = ConfigurableJointMotion.Locked;
         joint.zMotion = ConfigurableJointMotion.Locked;
         joint.angularXMotion = ConfigurableJointMotion.Locked;
         if (node.jointLink.jointLimitPrimary == 180)
             joint.angularYMotion = ConfigurableJointMotion.Free;
         else
             joint.angularYMotion = ConfigurableJointMotion.Limited;
         joint.angularZMotion = ConfigurableJointMotion.Locked;
         // Joint Limits:
         SoftJointLimit limitY = joint.angularYLimit;
         limitY.bounciness = 0f;
         limitY.limit = node.jointLink.jointLimitPrimary;
         joint.angularYLimit = limitY;
     }
     else if (node.jointLink.jointType == CritterJointLink.JointType.HingeZ) { // Uni-Axis Hinge Joint
         joint.axis = new Vector3(0f, 1f, 0f);
         joint.secondaryAxis = new Vector3(1f, 0f, 0f);
         JointDrive jointDrive = joint.angularYZDrive;
         //jointDrive.mode = JointDriveMode.Velocity;
         jointDrive.positionDamper = 1f;
         jointDrive.positionSpring = 1f;
         joint.angularYZDrive = jointDrive;
         // Lock mobility:
         joint.xMotion = ConfigurableJointMotion.Locked;
         joint.yMotion = ConfigurableJointMotion.Locked;
         joint.zMotion = ConfigurableJointMotion.Locked;
         joint.angularXMotion = ConfigurableJointMotion.Locked;
         joint.angularYMotion = ConfigurableJointMotion.Locked;
         if (node.jointLink.jointLimitPrimary == 180)
             joint.angularZMotion = ConfigurableJointMotion.Free;
         else
             joint.angularZMotion = ConfigurableJointMotion.Limited;
         // Joint Limits:
         SoftJointLimit limitZ = joint.angularZLimit;
         limitZ.bounciness = 0f;
         limitZ.limit = node.jointLink.jointLimitPrimary;
         joint.angularZLimit = limitZ;
     }
     else if (node.jointLink.jointType == CritterJointLink.JointType.DualXY) { // Uni-Axis Hinge Joint
         joint.axis = new Vector3(1f, 0f, 0f);
         joint.secondaryAxis = new Vector3(0f, 1f, 0f);
         JointDrive jointDriveX = joint.angularXDrive;
         JointDrive jointDriveY = joint.angularYZDrive;
         //jointDrive.mode = JointDriveMode.Velocity;
         jointDriveX.positionDamper = 1f;
         jointDriveX.positionSpring = 1f;
         joint.angularXDrive = jointDriveX;
         jointDriveY.positionDamper = 1f;
         jointDriveY.positionSpring = 1f;
         joint.angularYZDrive = jointDriveY;
         // Lock mobility:
         joint.xMotion = ConfigurableJointMotion.Locked;
         joint.yMotion = ConfigurableJointMotion.Locked;
         joint.zMotion = ConfigurableJointMotion.Locked;
         if (node.jointLink.jointLimitPrimary == 180) {
             joint.angularXMotion = ConfigurableJointMotion.Free;
             joint.angularYMotion = ConfigurableJointMotion.Free;
         }                
         else {
             joint.angularXMotion = ConfigurableJointMotion.Limited;
             joint.angularYMotion = ConfigurableJointMotion.Limited;
         }
         joint.angularZMotion = ConfigurableJointMotion.Locked;
         // Joint Limits:
         SoftJointLimit limitXMin = joint.lowAngularXLimit;
         limitXMin.bounciness = 0f;
         limitXMin.limit = -node.jointLink.jointLimitPrimary;
         joint.lowAngularXLimit = limitXMin;
         SoftJointLimit limitXMax = joint.highAngularXLimit;
         limitXMax.bounciness = 0f;
         limitXMax.limit = node.jointLink.jointLimitPrimary;
         joint.highAngularXLimit = limitXMax;
         SoftJointLimit limitYMax = joint.angularYLimit;
         limitYMax.bounciness = 0f;
         limitYMax.limit = node.jointLink.jointLimitSecondary;
         joint.angularYLimit = limitYMax;
     }
 }