Example #1
0
        /// <summary>
        ///   Initializes a new instance.
        /// </summary>
        /// <param name="position">Indicates the position of the gear cylinder (front, left, right).</param>
        /// <param name="startState">Indicates the initital state of the gear cylinder.</param>
        public GearCylinder(Position position, GearStates startState)
            : base(position)
        {
            _stateMachine = startState;
            GearCylinderIsStuckFault.Name = $"{Position}GearCylinderIsStuck";

            _latchingBoxExtended  = new LatchingBox(8, 4, $"{Position}GearCylinderLatchingBoxExtended");
            _latchingBoxRetracted = new LatchingBox(8, 4, $"{Position}GearCylinderLatchingBoxRetracted");
        }
Example #2
0
        void UpdateAero()
        {
            if (previousState != CurrentState)
            {
                if (CurrentState == GearStates.Retracted || CurrentState == GearStates.Deployed)
                {
                    part.dragModel = CurrentState == GearStates.Deployed ? Part.DragModel.DEFAULT : Part.DragModel.NONE;
                    StartCoroutine(DelayedMeshUpdate());
                }
            }

            previousState = CurrentState;
        }
Example #3
0
 public GearCylinderIsStuckFaultEffect(Position position, GearStates start)
     : base(position, start)
 {
 }
Example #4
0
 /// <summary>
 ///   Initializes a new instance.
 /// </summary>
 /// <param name="startState">Indicates the initial state of the gears.</param>
 public MechanicalPartPlants(GearStates startState)
 {
     GearFront = new Gear(Position.Front, startState);
     GearLeft  = new Gear(Position.Left, startState);
     GearRight = new Gear(Position.Right, startState);
 }
        public void FixedUpdate()
        {
            float negTiltAngleAdjust = (legAngle < 0) ? 180 : 0;

            if (transformsToMirror != string.Empty)
            {
                if (isMirrored)
                {
                    foreach (var t in transformsToMirrorList)
                    {
                        t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 180 - negTiltAngleAdjust, t.localRotation.eulerAngles.z);
                    }
                }
                else
                {
                    foreach (var t in transformsToMirrorList)
                    {
                        t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 0 + negTiltAngleAdjust, t.localRotation.eulerAngles.z);
                    }
                }
            }

            if (mirrorRetractedWheel && isMirrored)
            {
                retractedWheelTargetTransform.localRotation = Quaternion.Euler(retractedWheelTargetTransform.localRotation.x, retractedWheelTargetTransform.localRotation.y, 180);
            }


            wheelColliderHolderTransform.localRotation = wheelHingeTransform.localRotation;

            //scene specific stuff
            if (HighLogic.LoadedSceneIsEditor)
            {
                tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward);

                wheelHeight = Mathf.Clamp(wheelHeight, minHeight, maxHeight);
                wheelColliderHolderTransform.localPosition = new Vector3(0, 0, -wheelHeight);
                deployedWheelTargetTransform.localPosition = new Vector3(0, 0, -wheelHeight);

                //wheel angle target stuff
                float wlocalYrot = isMirrored ? wheelAngle : -wheelAngle;
                float wlocalZrot = isMirrored && mirrorDeployedWheel ? 180 : 0;
                deployedWheelTargetTransform.localRotation = Quaternion.Euler(0, wlocalYrot, wlocalZrot);

                //leg angle target stuff
                float legLocalXrot = 270 + legAngle;
                float legLocalYrot = 0;
                float legLocalZrot = 0;
                if (legAngle != 0)
                {
                    legLocalYrot = isMirrored ? 270 : 90;
                    legLocalZrot = isMirrored ? 90 : 270;
                }

                tiltTargetTransform.localRotation = Quaternion.Euler(legLocalXrot, legLocalYrot, legLocalZrot);

                //scale
                transform.localScale = algScale * Vector3.one;
            }
            else
            {
                if (CurrentState == GearStates.Deployed)
                {
                    tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward);

                    /*
                     * foreach(WheelCollider wheelCollider in part.FindModelComponents<WheelCollider>())
                     * {
                     *      suspensionDistance = Mathf.Cos(tiltAngleP*Mathf.Deg2Rad) * wheelHeight;
                     *      wheelCollider.suspensionDistance = suspensionDistance;
                     *      jointSpring.spring = suspensionSpring;
                     *      jointSpring.damper = suspensionDamper;
                     *      jointSpring.targetPosition = wheelCollider.suspensionSpring.targetPosition;
                     *      wheelCollider.suspensionSpring = jointSpring;
                     *      //wheelCollider.brakeTorque = brakeTorque;
                     * }
                     */

                    //set wheel collider values
                    for (int i = 0; i < wheelColliders.Length; i++)
                    {
                        suspensionDistance = Mathf.Cos(tiltAngleP * Mathf.Deg2Rad) * wheelHeight;
                        wheelColliders[i].suspensionDistance = suspensionDistance;
                        jointSpring.spring                 = suspensionSpring;
                        jointSpring.damper                 = suspensionDamper;
                        jointSpring.targetPosition         = wheelColliders[i].suspensionSpring.targetPosition;
                        wheelColliders[i].suspensionSpring = jointSpring;
                    }

                    float mirrorMult = isMirrored ? 1 : -1;

                    float m = wheelHeight * Mathf.Sin(tiltAngleP * Mathf.Deg2Rad);

                    float localX = m * Mathf.Cos(tiltAngleP * Mathf.Deg2Rad) * mirrorMult;

                    float localZ = -(m * Mathf.Sin(tiltAngleP * Mathf.Deg2Rad));

                    wheelColliderHolderTransform.localPosition = new Vector3(localX, 0, localZ);
                }
                else
                {
                    /*
                     * foreach(var wheelCollider in part.FindModelComponents<WheelCollider>())
                     * {
                     *      wheelCollider.suspensionDistance = 0;
                     * }
                     */

                    for (int i = 0; i < wheelColliders.Length; i++)
                    {
                        wheelColliders[i].suspensionDistance = 0;
                    }

                    wheelColliderHolderTransform.localPosition = Mathf.Clamp01((currentNormTime - stageNormTime) / (1 - stageNormTime)) * new Vector3(0, 0, -wheelHeight);
                }
            }



            //get animation normalized time and current state
            float animNormTime = 0;

            if (!hasLoaded)
            {
                //emptyAnimation.Stop();
                anim.normalizedTime = animNormTimeP;
                hasLoaded           = true;
            }
            else
            {
                animNormTimeP = anim.normalizedTime;
                animSpeedP    = anim.speed;
            }

            deployTime          = anim.length;
            anim.normalizedTime = Mathf.Clamp01(anim.normalizedTime);
            if (emptyAnimation.isPlaying)
            {
                animNormTime = 1 - anim.normalizedTime;
            }

            for (int i = 0; i < wheelColliders.Length; i++)
            {
                if (animNormTime < 0.2f && CurrentState != GearStates.Deployed)
                {
                    wheelColliders[i].radius = 0.0001f;
                }
                else
                {
                    wheelColliders[i].radius = wheelRadius;
                }
            }

            if (animNormTime == 0 && !emptyAnimation.isPlaying)
            {
                CurrentState = TargetState;
            }
            else if (anim.speed < 0)
            {
                TargetState  = GearStates.Deployed;
                CurrentState = GearStates.Deploying;
            }
            else if (anim.speed > 0)
            {
                TargetState  = GearStates.Retracted;
                CurrentState = GearStates.Retracting;
            }

            Steering();

            UpdateDoors();

            doorsNormTime = (90 / doorSpeed) / deployTime;

            deployTime -= 90 / doorSpeed;

            UpdateGear();

            UpdateWheelAlignment();

            SavePosAndRot();
        }
        public override void OnStart(PartModule.StartState state)
        {
            base.OnStart(state);

            emptyAnimation = part.FindModelAnimators(animationName)[0];
            anim           = emptyAnimation[animationName];

            //set max and min for wheel height
            var wheelHeightTweakable = (UI_FloatRange)Fields["wheelHeight"].uiControlEditor;

            wheelHeightTweakable.maxValue = maxHeight;
            wheelHeightTweakable.minValue = minHeight;

            //set max wheelAngle tweakable
            var wheelAngleTweakable = (UI_FloatRange)Fields["wheelAngle"].uiControlEditor;

            wheelAngleTweakable.maxValue = maxWheelAngle;
            wheelAngleTweakable.minValue = 0;

            //set min/max leg tilt tweakable
            var tiltAngleTweakable = (UI_FloatRange)Fields["legAngle"].uiControlEditor;

            tiltAngleTweakable.maxValue = maxTilt;
            tiltAngleTweakable.minValue = minTilt;

            //set max brakeTorque tweakable
            var brakeTorqueTweakable = (UI_FloatRange)Fields["brakeTorque"].uiControlEditor;

            brakeTorqueTweakable.maxValue = maxBrakeTorque;



            //tiltTransforms
            tiltTransform              = part.FindModelTransform(tiltTransformName);
            tiltTargetTransform        = part.FindModelTransform(tiltTargetTransformName);
            tiltRetractTargetTransform = part.FindModelTransform(tiltRetractTargetTransformName);

            //deployTransforms
            deployTransform        = part.FindModelTransform(deployTransformName);
            deployTargetTransform  = part.FindModelTransform(deployTargetTransformName);
            retractTargetTransform = part.FindModelTransform(retractTargetTransformName);

            //wheelTransforms
            wheelHingeTransform           = part.FindModelTransform(wheelHingeTransformName);
            retractedWheelTargetTransform = part.FindModelTransform(retractedWheelTargetTransformName);
            deployedWheelTargetTransform  = part.FindModelTransform(deployedWheelTargetTransformName);

            wheelColliderTarget          = part.FindModelTransform(wheelColliderTargetName);
            wheelColliderHolderTransform = part.FindModelTransform("wheelColliderHolder");

            wheelAlignmentTransform = part.FindModelTransform(wheelAlignmentTransformName);

            if (canSteer)
            {
                steeringTransform = part.FindModelTransform(steeringTransformName);
            }

            initialHeight = Vector3.Distance(deployedWheelTargetTransform.localPosition, retractedWheelTargetTransform.localPosition);

            SetUpDoors();

            if (animSpeedP > 0)
            {
                animNormTimeP = 1;
            }
            else if (animSpeedP < 0)
            {
                animNormTimeP = 0;
            }


            anim.normalizedTime = animNormTimeP;

            float animNormTime = 1 - animNormTimeP;

            animNormTime = Mathf.Clamp01(animNormTime);

            if (animNormTime >= 1)
            {
                CurrentState = GearStates.Deployed;
            }
            else if (animNormTime <= 0)
            {
                CurrentState = GearStates.Retracted;
            }
            else if (anim.speed < 0)
            {
                CurrentState = GearStates.Deploying;
            }
            else
            {
                CurrentState = GearStates.Retracting;
            }

            if (posAndRotSaved)
            {
                LoadPosAndRot();
            }

            if (CurrentState == GearStates.Deployed || CurrentState == GearStates.Deploying)
            {
                wheelHingeTransform.localPosition = deployedWheelTargetTransform.localPosition;
                wheelHingeTransform.localRotation = deployedWheelTargetTransform.localRotation;
                tiltTransform.localRotation       = tiltTargetTransform.localRotation;
                deployTransform.localRotation     = deployTargetTransform.localRotation;
            }
            else
            {
                wheelHingeTransform.localPosition = retractedWheelTargetTransform.localPosition;
                wheelHingeTransform.localRotation = retractedWheelTargetTransform.localRotation;
                tiltTransform.localRotation       = tiltRetractTargetTransform.localRotation;
                deployTransform.localRotation     = retractTargetTransform.localRotation;
            }

            part.OnEditorAttach += new Callback(OnEditorAttach);


            //fs wheel overrides
            fsWheel             = part.FindModuleImplementing <FSBDwheel>();
            fsWheel.brakeTorque = brakeTorque;


            //scale
            transform.localScale = algScale * Vector3.one;

            if (part.FindModelTransform(boundsCollider) != null)
            {
                Destroy(part.FindModelTransform(boundsCollider).gameObject);
            }

            if (!HighLogic.LoadedSceneIsEditor)
            {
                showSettings = false;
            }
            RefreshTweakables();

            wheelColliders = part.FindModelComponents <WheelCollider>();
        }
Example #7
0
 /// <summary>
 ///   Initializes a new instance.
 /// </summary>
 /// <param name="position">The position the gear is located at on the airplane.</param>
 /// <param name="startState">Indicates the state the gear is in when the simulation is started.</param>
 public Gear(Position position, GearStates startState)
 {
     Position = position;
     State    = startState;
     GearIsStuckFault.Name = $"{Position}GearIsStuck";
 }
Example #8
0
 /// <summary>
 ///   Initializes a new instance.
 /// </summary>
 /// <param name="startState">Indicates the initital states of the gear cylinder state machines. </param>
 public MechanicalPartActuators(GearStates startState)
 {
     FrontGearCylinder = new GearCylinder(Position.Front, startState);
     LeftGearCylinder  = new GearCylinder(Position.Left, startState);
     RightGearCylinder = new GearCylinder(Position.Right, startState);
 }
        void UpdateAero()
        {
            if(previousState!=CurrentState)
            {
                if(CurrentState == GearStates.Retracted || CurrentState == GearStates.Deployed)
                {
                    part.dragModel = CurrentState == GearStates.Deployed ? Part.DragModel.DEFAULT : Part.DragModel.NONE;
                    StartCoroutine(DelayedMeshUpdate());
                }
            }

            previousState = CurrentState;
        }
        public override void OnStart(PartModule.StartState state)
        {
            base.OnStart(state);

            emptyAnimation = part.FindModelAnimators(animationName)[0];
            anim = emptyAnimation[animationName];

            //set max and min for wheel height
            var wheelHeightTweakable = (UI_FloatRange) Fields["wheelHeight"].uiControlEditor;
            wheelHeightTweakable.maxValue = maxHeight;
            wheelHeightTweakable.minValue = minHeight;

            //set max wheelAngle tweakable
            var wheelAngleTweakable = (UI_FloatRange) Fields["wheelAngle"].uiControlEditor;
            wheelAngleTweakable.maxValue = maxWheelAngle;
            wheelAngleTweakable.minValue = 0;

            //set min/max leg tilt tweakable
            var tiltAngleTweakable = (UI_FloatRange) Fields["legAngle"].uiControlEditor;
            tiltAngleTweakable.maxValue = maxTilt;
            tiltAngleTweakable.minValue = minTilt;

            //set max brakeTorque tweakable
            var brakeTorqueTweakable = (UI_FloatRange)Fields["brakeTorque"].uiControlEditor;
            brakeTorqueTweakable.maxValue = maxBrakeTorque;

            //tiltTransforms
            tiltTransform = part.FindModelTransform(tiltTransformName);
            tiltTargetTransform = part.FindModelTransform(tiltTargetTransformName);
            tiltRetractTargetTransform = part.FindModelTransform(tiltRetractTargetTransformName);

            //deployTransforms
            deployTransform = part.FindModelTransform(deployTransformName);
            deployTargetTransform = part.FindModelTransform (deployTargetTransformName);
            retractTargetTransform = part.FindModelTransform(retractTargetTransformName);

            //wheelTransforms
            wheelHingeTransform = part.FindModelTransform (wheelHingeTransformName);
            retractedWheelTargetTransform = part.FindModelTransform (retractedWheelTargetTransformName);
            deployedWheelTargetTransform = part.FindModelTransform (deployedWheelTargetTransformName);

            wheelColliderTarget = part.FindModelTransform(wheelColliderTargetName);
            wheelColliderHolderTransform = part.FindModelTransform("wheelColliderHolder");

            wheelAlignmentTransform = part.FindModelTransform(wheelAlignmentTransformName);

            if(canSteer)
            {
                steeringTransform = part.FindModelTransform (steeringTransformName);
            }

            initialHeight = Vector3.Distance(deployedWheelTargetTransform.localPosition, retractedWheelTargetTransform.localPosition);

            SetUpDoors();

            if(animSpeedP > 0)
            {
                animNormTimeP = 1;
            }
            else if(animSpeedP < 0)
            {
                animNormTimeP = 0;
            }

            anim.normalizedTime = animNormTimeP;

            float animNormTime = 1-animNormTimeP;
            animNormTime = Mathf.Clamp01(animNormTime);

            if(animNormTime >= 1)
            {
                CurrentState = GearStates.Deployed;
            }
            else if(animNormTime <= 0)
            {
                CurrentState = GearStates.Retracted;
            }
            else if(anim.speed < 0)
            {
                CurrentState = GearStates.Deploying;
            }
            else
            {
                CurrentState = GearStates.Retracting;
            }

            if(posAndRotSaved) LoadPosAndRot();

            if(CurrentState == GearStates.Deployed || CurrentState == GearStates.Deploying)
            {
                wheelHingeTransform.localPosition = deployedWheelTargetTransform.localPosition;
                wheelHingeTransform.localRotation = deployedWheelTargetTransform.localRotation;
                tiltTransform.localRotation = tiltTargetTransform.localRotation;
                deployTransform.localRotation = deployTargetTransform.localRotation;
            }
            else
            {
                wheelHingeTransform.localPosition = retractedWheelTargetTransform.localPosition;
                wheelHingeTransform.localRotation = retractedWheelTargetTransform.localRotation;
                tiltTransform.localRotation = tiltRetractTargetTransform.localRotation;
                deployTransform.localRotation = retractTargetTransform.localRotation;
            }

            part.OnEditorAttach += new Callback(OnEditorAttach);

            //fs wheel overrides
            fsWheel = part.FindModuleImplementing<FSBDwheel>();
            fsWheel.brakeTorque = brakeTorque;

            //scale
            transform.localScale = algScale * Vector3.one;

            if(part.FindModelTransform(boundsCollider)!=null)
            {
                DestroyImmediate(part.FindModelTransform(boundsCollider).gameObject);
            }

            if(!HighLogic.LoadedSceneIsEditor)
            {
                showSettings = false;
            }
            RefreshTweakables();

            wheelColliders = part.FindModelComponents<WheelCollider>();

            previousState = CurrentState;
            part.SendMessage("GeometryPartModuleRebuildMeshData");

            if(state != StartState.Editor)
            {
                part.mass = baseMass * Mathf.Pow(algScale, 3);
            }
        }
        public void FixedUpdate()
        {
            float negTiltAngleAdjust = (legAngle < 0) ? 180 : 0;
            if(transformsToMirror!=string.Empty)
            {
                if(isMirrored)
                {
                    foreach(var t in transformsToMirrorList)
                    {
                        t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 180 - negTiltAngleAdjust, t.localRotation.eulerAngles.z);
                    }
                }
                else
                {
                    foreach(var t in transformsToMirrorList)
                    {
                        t.localRotation = Quaternion.Euler(t.localRotation.eulerAngles.x, 0 + negTiltAngleAdjust, t.localRotation.eulerAngles.z);
                    }
                }
            }

            if(mirrorRetractedWheel && isMirrored)
            {
                retractedWheelTargetTransform.localRotation = Quaternion.Euler(retractedWheelTargetTransform.localRotation.x, retractedWheelTargetTransform.localRotation.y, 180);
            }

            wheelColliderHolderTransform.localRotation = wheelHingeTransform.localRotation;

            //scene specific stuff
            if(HighLogic.LoadedSceneIsEditor)
            {
                tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward);

                wheelHeight = Mathf.Clamp(wheelHeight, minHeight, maxHeight);
                wheelColliderHolderTransform.localPosition = new Vector3(0, 0, -wheelHeight);
                deployedWheelTargetTransform.localPosition = new Vector3(0, 0, -wheelHeight);

                //wheel angle target stuff
                float wlocalYrot = isMirrored ? wheelAngle : -wheelAngle;
                float wlocalZrot = isMirrored && mirrorDeployedWheel ? 180 : 0;
                deployedWheelTargetTransform.localRotation = Quaternion.Euler(0, wlocalYrot, wlocalZrot);

                //leg angle target stuff
                float legLocalXrot = 270+legAngle;
                float legLocalYrot = 0;
                float legLocalZrot = 0;
                if(legAngle!=0)
                {
                    legLocalYrot = isMirrored ? 270 : 90;
                    legLocalZrot = isMirrored ? 90 : 270;
                }

                tiltTargetTransform.localRotation = Quaternion.Euler(legLocalXrot, legLocalYrot, legLocalZrot);

                //scale
                transform.localScale = algScale * Vector3.one;
            }
            else
            {
                if(CurrentState == GearStates.Deployed)
                {
                    tiltAngleP = Vector3.Angle(deployedWheelTargetTransform.forward, tiltTargetTransform.forward);

                    /*
                    foreach(WheelCollider wheelCollider in part.FindModelComponents<WheelCollider>())
                    {
                        suspensionDistance = Mathf.Cos(tiltAngleP*Mathf.Deg2Rad) * wheelHeight;
                        wheelCollider.suspensionDistance = suspensionDistance;
                        jointSpring.spring = suspensionSpring;
                        jointSpring.damper = suspensionDamper;
                        jointSpring.targetPosition = wheelCollider.suspensionSpring.targetPosition;
                        wheelCollider.suspensionSpring = jointSpring;
                        //wheelCollider.brakeTorque = brakeTorque;
                    }
                    */

                    //set wheel collider values
                    for(int i = 0; i < wheelColliders.Length; i++)
                    {
                        suspensionDistance = Mathf.Cos(tiltAngleP*Mathf.Deg2Rad) * wheelHeight;
                        wheelColliders[i].suspensionDistance = suspensionDistance;
                        jointSpring.spring = suspensionSpring;
                        jointSpring.damper = suspensionDamper;
                        jointSpring.targetPosition = wheelColliders[i].suspensionSpring.targetPosition;
                        wheelColliders[i].suspensionSpring = jointSpring;
                    }

                    float mirrorMult = isMirrored ? 1 : -1;

                    float m = wheelHeight * Mathf.Sin(tiltAngleP*Mathf.Deg2Rad);

                    float localX = m * Mathf.Cos (tiltAngleP * Mathf.Deg2Rad) * mirrorMult;

                    float localZ = -(m * Mathf.Sin (tiltAngleP * Mathf.Deg2Rad));

                    wheelColliderHolderTransform.localPosition = new Vector3(localX, 0, localZ);
                }
                else
                {
                    /*
                    foreach(var wheelCollider in part.FindModelComponents<WheelCollider>())
                    {
                        wheelCollider.suspensionDistance = 0;
                    }
                     */

                    for(int i = 0; i < wheelColliders.Length; i++)
                    {
                        wheelColliders[i].suspensionDistance = 0;
                    }

                    wheelColliderHolderTransform.localPosition = Mathf.Clamp01((currentNormTime-stageNormTime)/(1-stageNormTime)) * new Vector3(0,0,-wheelHeight);
                }
            }

            //get animation normalized time and current state
            float animNormTime = 0;

            if(!hasLoaded)
            {
                //emptyAnimation.Stop();
                anim.normalizedTime = animNormTimeP;
                hasLoaded = true;
            }
            else
            {
                animNormTimeP = anim.normalizedTime;
                animSpeedP = anim.speed;
            }

            deployTime = anim.length;
            anim.normalizedTime = Mathf.Clamp01(anim.normalizedTime);
            if(emptyAnimation.isPlaying) animNormTime = 1-anim.normalizedTime;

            for(int i = 0; i < wheelColliders.Length; i++)
            {
                if(animNormTime < 0.2f && CurrentState != GearStates.Deployed)
                {
                    wheelColliders[i].radius = 0.0001f;
                }
                else
                {
                    wheelColliders[i].radius = wheelRadius;
                }
            }

            if(animNormTime == 0 && !emptyAnimation.isPlaying)
            {
                CurrentState = TargetState;
            }
            else if(anim.speed < 0)
            {
                TargetState = GearStates.Deployed;
                CurrentState = GearStates.Deploying;
            }
            else if(anim.speed > 0)
            {
                TargetState = GearStates.Retracted;
                CurrentState = GearStates.Retracting;
            }

            Steering();

            UpdateDoors();

            doorsNormTime = (90/doorSpeed)/deployTime;

            deployTime -= 90/doorSpeed;

            UpdateGear();

            UpdateWheelAlignment();

            SavePosAndRot();

            UpdateAero();
        }