Пример #1
0
        private double WingInterference(Vector3 rayDirection, List <Part> PartList, float dist)
        {
            double interferencevalue = 1;

            Ray ray = new Ray();

            ray.origin    = parentWingModule.WingCentroid();
            ray.direction = rayDirection;

            RaycastHit hit = new RaycastHit();

            bool gotSomething = false;

            hit.distance = 0;
            RaycastHit[] hits = Physics.RaycastAll(ray, dist, FARAeroUtil.RaycastMask);
            for (int i = 0; i < hits.Length; i++)
            {
                RaycastHit h = hits[i];
                if (h.collider != null)
                {
                    for (int j = 0; j < PartList.Count; j++)
                    {
                        Part p = PartList[j];

                        if (p == parentWingPart)
                        {
                            continue;
                        }

                        FARWingAerodynamicModel w = p.GetComponent <FARWingAerodynamicModel>();

                        if ((object)w != null)
                        {
                            Collider[] colliders = w.PartColliders;

                            for (int k = 0; k < colliders.Length; k++)
                            {
                                if (h.collider == colliders[k] && h.distance > 0)
                                {
                                    double tmp = h.distance / dist;
                                    tmp = FARMathUtil.Clamp(tmp, 0, 1);
                                    interferencevalue = Math.Min(tmp, interferencevalue);
                                    gotSomething      = true;

                                    break;
                                }
                            }
                        }
                        if (gotSomething)
                        {
                            break;
                        }
                    }
                }
            }
            return(interferencevalue);
        }
        private double WingInterference(Vector3 rayDirection, List <Part> PartList, float dist)
        {
            double interferenceValue = 1;

            var ray = new Ray
            {
                origin    = parentWingModule.WingCentroid(),
                direction = rayDirection
            };


            var hit = new RaycastHit();

            bool gotSomething = false;

            hit.distance = 0;
            RaycastHit[] hits = Physics.RaycastAll(ray, dist, FARAeroUtil.RaycastMask);
            foreach (RaycastHit h in hits)
            {
                if (h.collider == null)
                {
                    continue;
                }
                foreach (Part p in PartList)
                {
                    if (p == null)
                    {
                        continue;
                    }

                    if (p == parentWingPart)
                    {
                        continue;
                    }

                    var w = p.GetComponent <FARWingAerodynamicModel>();

                    if (w != null)
                    {
                        Collider[] colliders = w.PartColliders;

                        // ReSharper disable once LoopCanBeConvertedToQuery -> closure
                        foreach (Collider collider in colliders)
                        {
                            if (h.collider == collider && h.distance > 0)
                            {
                                double tmp = h.distance / dist;
                                tmp = tmp.Clamp(0, 1);
                                double tmp2 =
                                    Math.Abs(Vector3.Dot(parentWingPart.partTransform.forward,
                                                         w.part.partTransform.forward));
                                tmp = 1 - (1 - tmp) * tmp2;
                                interferenceValue = Math.Min(tmp, interferenceValue);
                                gotSomething      = true;

                                break;
                            }
                        }
                    }

                    if (gotSomething)
                    {
                        break;
                    }
                }
            }

            return(interferenceValue);
        }
Пример #3
0
        private void FindShieldedParts()
        {
            /*if (HighLogic.LoadedSceneIsEditor/* && FARAeroUtil.EditorAboutToAttach(false) &&
             *  !FARAeroUtil.CurEditorParts.Contains(part))
             *  return;*/

            ClearShieldedParts();
            UpdateShipPartsList();
            CalculateFairingBounds();

            Collider[] colliders = this.PartColliders;

            for (int i = 0; i < VesselPartList.Count; i++)
            {
                Part p = VesselPartList[i];

                if (FARShieldedParts.Contains(p) || p == null || p == part || part.symmetryCounterparts.Contains(p))
                {
                    continue;
                }

                FARBaseAerodynamics     b = null;
                FARBasicDragModel       d = null;
                FARWingAerodynamicModel w = null;
                Vector3 relPos            = -part.transform.position;
                w = p.GetComponent <FARWingAerodynamicModel>();
                if ((object)w == null)
                {
                    d = p.GetComponent <FARBasicDragModel>();
                }
                if ((object)w == null && (object)d == null)
                {
                    continue;
                }
                //if (p.GetComponent<FARPayloadFairingModule>() != null)
                //    continue;
                if (w)
                {
                    b       = w as FARBaseAerodynamics;
                    relPos += w.WingCentroid();
                }
                else
                {
                    b       = d as FARBaseAerodynamics;
                    relPos += p.transform.TransformDirection(d.CenterOfDrag) + p.transform.position;       //No attach node shifting with this
                }

                relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);

                Vector3 fairingCenter = fairingBounds.center;
                fairingCenter *= 0.5f;
                fairingCenter  = this.part.transform.localToWorldMatrix.MultiplyVector(fairingCenter);
                fairingCenter += this.part.transform.position;

                if (fairingBounds.Contains(relPos))
                {
                    Vector3 vecFromPToPFCenter;
                    Vector3 origin;
                    if (w)
                    {
                        origin = w.WingCentroid();
                    }
                    else
                    {
                        origin = p.transform.position;
                    }

                    vecFromPToPFCenter = fairingCenter - origin;

                    RaycastHit[] hits = Physics.RaycastAll(origin, vecFromPToPFCenter, vecFromPToPFCenter.magnitude, FARAeroUtil.RaycastMask);

                    bool outsideMesh = false;

                    for (int k = 0; k < hits.Length; k++)
                    {
                        if (colliders.Contains(hits[k].collider))
                        {
                            outsideMesh = true;
                            break;
                        }
                    }
                    if (outsideMesh)
                    {
                        continue;
                    }

                    FARShieldedParts.Add(p);
                    if (b)
                    {
                        b.ActivateShielding();
                        //print("Shielded: " + p.partInfo.title);
                    }
                    for (int k = 0; k < p.symmetryCounterparts.Count; k++)
                    {
                        Part q = p.symmetryCounterparts[k];

                        if (q == null)
                        {
                            continue;
                        }
                        FARShieldedParts.Add(q);
                        b = q.GetComponent <FARBaseAerodynamics>();
                        if (b)
                        {
                            b.ActivateShielding();
                            //print("Shielded: " + p.partInfo.title);
                        }
                    }
                }
            }
            partsShielded = FARShieldedParts.Count;
        }
        private void FindShieldedParts()
        {
            /*if (HighLogic.LoadedSceneIsEditor/* && FARAeroUtil.EditorAboutToAttach(false) &&
             *  !FARAeroUtil.CurEditorParts.Contains(part))
             *  return;*/
            if (minBounds.Count == 0)
            {
                CalculateFairingBounds();
            }

            ClearShieldedParts();
            UpdateShipPartsList();

            Collider[] colliders;
            try
            {
                colliders = part.GetComponentsInChildren <Collider>();
            }
            catch (Exception e)
            {
                //Fail silently because it's the only way to avoid issues with pWings
                //Debug.LogException(e);
                colliders = new Collider[1] {
                    part.collider
                };
            }

            for (int i = 0; i < VesselPartList.Count; i++)
            {
                Part p = VesselPartList[i];

                if (FARShieldedParts.Contains(p) || p == null || p == part || part.symmetryCounterparts.Contains(p))
                {
                    continue;
                }

                FARBaseAerodynamics     b = null;
                FARBasicDragModel       d = null;
                FARWingAerodynamicModel w = null;
                Vector3 relPos            = -part.transform.position;
                w = p.GetComponent <FARWingAerodynamicModel>();
                if ((object)w == null)
                {
                    d = p.GetComponent <FARBasicDragModel>();
                }
                if ((object)w == null && (object)d == null)
                {
                    continue;
                }
                //if (p.GetComponent<FARPayloadFairingModule>() != null)
                //    continue;
                if (w)
                {
                    b       = w as FARBaseAerodynamics;
                    relPos += w.WingCentroid();
                }
                else
                {
                    b       = d as FARBaseAerodynamics;
                    relPos += p.partTransform.TransformDirection(d.CenterOfDrag) + p.partTransform.position;       //No attach node shifting with this
                }

                relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);
                for (int j = 0; j < minBounds.Count; j++)
                {
                    Vector3 minBoundVec, maxBoundVec;
                    minBoundVec = minBounds[j];
                    maxBoundVec = maxBounds[j];
                    if (relPos.x < maxBoundVec.x && relPos.y < maxBoundVec.y && relPos.z < maxBoundVec.z && relPos.x > minBoundVec.x && relPos.y > minBoundVec.y && relPos.z > minBoundVec.z)
                    {
                        Vector3 vecFromPToPFCenter;
                        if (d)
                        {
                            vecFromPToPFCenter = p.partTransform.InverseTransformPoint(d.CoDshift);
                        }
                        else if (w)
                        {
                            vecFromPToPFCenter = w.WingCentroid();
                        }
                        else
                        {
                            vecFromPToPFCenter = p.partTransform.position;
                        }

                        vecFromPToPFCenter = this.part.partTransform.position - vecFromPToPFCenter;

                        RaycastHit[] hits = Physics.RaycastAll(p.partTransform.position, vecFromPToPFCenter, vecFromPToPFCenter.magnitude, FARAeroUtil.RaycastMask);

                        bool outsideMesh = false;

                        for (int k = 0; k < hits.Length; k++)
                        {
                            if (colliders.Contains(hits[k].collider))
                            {
                                outsideMesh = true;
                                break;
                            }
                        }
                        if (outsideMesh)
                        {
                            break;
                        }

                        FARShieldedParts.Add(p);
                        if (b)
                        {
                            b.isShielded = true;
                            //print("Shielded: " + p.partInfo.title);
                        }
                        for (int k = 0; k < p.symmetryCounterparts.Count; k++)
                        {
                            Part q = p.symmetryCounterparts[k];

                            if (q == null)
                            {
                                continue;
                            }
                            FARShieldedParts.Add(q);
                            b = q.GetComponent <FARBaseAerodynamics>();
                            if (b)
                            {
                                b.isShielded = true;
                                //print("Shielded: " + p.partInfo.title);
                            }
                        }
                        break;
                    }
                }
            }
            partsShielded = FARShieldedParts.Count;
        }
        private void FindShieldedParts()
        {
            if (minBounds == new Vector3())
            {
                CalculateBayBounds();
            }
            ClearShieldedParts();
            bayOpen = false;
            UpdateShipPartsList();

            double y_margin = Math.Max(0.12, 0.03 * (maxBounds.y - minBounds.y));

            foreach (Part p in VesselPartList)
            {
                if (FARShieldedParts.Contains(p) || p == null || p == part || part.symmetryCounterparts.Contains(p))
                {
                    continue;
                }

                FARBaseAerodynamics     b = null;
                FARBasicDragModel       d = null;
                FARWingAerodynamicModel w = null;
                Vector3 relPos            = -part.transform.position;
                w = p.GetComponent <FARWingAerodynamicModel>();
                if ((object)w == null)
                {
                    d = p.GetComponent <FARBasicDragModel>();
                }
                if ((object)w == null && (object)d == null)
                {
                    continue;
                }
                //if (p.GetComponent<FARPayloadFairingModule>() != null)
                //    continue;
                if (w)
                {
                    b       = w as FARBaseAerodynamics;
                    relPos += w.WingCentroid();
                }
                else
                {
                    b       = d as FARBaseAerodynamics;
                    relPos += p.partTransform.TransformDirection(d.CenterOfDrag) + p.partTransform.position;       //No attach node shifting with this
                }

                relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);
                if (relPos.x < maxBounds.x && relPos.y < maxBounds.y + y_margin && relPos.z < maxBounds.z && relPos.x > minBounds.x && relPos.y > minBounds.y - y_margin && relPos.z > minBounds.z)
                {
                    if (relPos.y > maxBounds.y || relPos.y < minBounds.y)
                    {
                        // Enforce strict y bounds for parent and stack children
                        if (p == this.part.parent ||
                            p.parent == this.part && p.attachMode == AttachModes.STACK)
                        {
                            continue;
                        }
                    }

/*                    if (w)
 *                  {
 *                      if (w.nonSideAttach <= 0)
 *                      {
 *                          relPos = p.transform.position - this.part.transform.position;
 *                          relPos -= p.transform.right * Mathf.Sign(p.srfAttachNode.originalOrientation.x) * w.b_2;
 *
 *                          relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);
 *
 *                          if (!(relPos.x < maxBounds.x && relPos.y < maxBounds.y && relPos.z < maxBounds.z && relPos.x > minBounds.x && relPos.y > minBounds.y && relPos.z > minBounds.z))
 *                              continue;
 *                      }
 *                  }*/
                    FARShieldedParts.Add(p);
                    if (b)
                    {
                        b.isShielded = true;
                        //print("Shielded: " + p.partInfo.title);
                    }
                    foreach (Part q in p.symmetryCounterparts)
                    {
                        if (q == null)
                        {
                            continue;
                        }
                        FARShieldedParts.Add(q);
                        b = q.GetComponent <FARBaseAerodynamics>();
                        if (b)
                        {
                            b.isShielded = true;
                            //print("Shielded: " + p.partInfo.title);
                        }
                    }
                }
            }
            if (HighLogic.LoadedSceneIsEditor)
            {
                foreach (Vessel v in FlightGlobals.Vessels)
                {
                    if (v == this.vessel)
                    {
                        continue;
                    }

                    Vector3 relPos = v.transform.position - this.part.transform.position;
                    relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);
                    if (relPos.x < maxBounds.x && relPos.y < maxBounds.y && relPos.z < maxBounds.z && relPos.x > minBounds.x && relPos.y > minBounds.y && relPos.z > minBounds.z)
                    {
                        foreach (Part p in v.Parts)
                        {
                            FARBaseAerodynamics b = null;
                            b = p.GetComponent <FARBaseAerodynamics>();
                            if (b == null)
                            {
                                continue;
                            }

                            FARShieldedParts.Add(p);
                            if (b)
                            {
                                b.isShielded = true;
                                //print("Shielded: " + p.partInfo.title);
                            }
                        }
                    }
                }
            }
            partsShielded = FARShieldedParts.Count;
        }
Пример #6
0
        private void FindShieldedParts()
        {
            if (minBounds == new Vector3())
            {
                CalculateBayBounds();
            }
            ClearShieldedParts();
            bayOpen = false;
            UpdateShipPartsList();

            double y_margin = Math.Max(0.12, 0.03 * (maxBounds.y - minBounds.y));

            Collider[] colliders;
            try
            {
                colliders = part.GetComponentsInChildren <Collider>();
            }
            catch (Exception e)
            {
                //Fail silently because it's the only way to avoid issues with pWings
                //Debug.LogException(e);
                colliders = new Collider[1] {
                    part.collider
                };
            }

            for (int i = 0; i < VesselPartList.Count; i++)
            {
                Part p = VesselPartList[i];

                if (FARShieldedParts.Contains(p) || p == null || p == part || part.symmetryCounterparts.Contains(p))
                {
                    continue;
                }

                FARBaseAerodynamics     b = null;
                FARBasicDragModel       d = null;
                FARWingAerodynamicModel w = null;
                Vector3 relPos            = -part.transform.position;
                w = p.GetComponent <FARWingAerodynamicModel>();
                if ((object)w == null)
                {
                    d = p.GetComponent <FARBasicDragModel>();
                }
                if ((object)w == null && (object)d == null)
                {
                    continue;
                }
                //if (p.GetComponent<FARPayloadFairingModule>() != null)
                //    continue;
                if (w)
                {
                    b       = w as FARBaseAerodynamics;
                    relPos += w.WingCentroid();
                }
                else
                {
                    b       = d as FARBaseAerodynamics;
                    relPos += p.partTransform.TransformDirection(d.CenterOfDrag) + p.partTransform.position;       //No attach node shifting with this
                }

                relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);
                if (relPos.x < maxBounds.x && relPos.y < maxBounds.y + y_margin && relPos.z < maxBounds.z && relPos.x > minBounds.x && relPos.y > minBounds.y - y_margin && relPos.z > minBounds.z)
                {
                    if (relPos.y > maxBounds.y || relPos.y < minBounds.y)
                    {
                        // Enforce strict y bounds for parent and stack children
                        if (p == this.part.parent ||
                            p.parent == this.part && p.attachMode == AttachModes.STACK)
                        {
                            continue;
                        }
                    }
                    Vector3 vecFromPToCargoBayCenter;

                    /*if (d)
                     *  vecFromPToCargoBayCenter = p.partTransform.InverseTransformPoint(d.CoDshift);
                     * else if (w)
                     *  vecFromPToCargoBayCenter = w.WingCentroid();
                     * else*/
                    vecFromPToCargoBayCenter = p.partTransform.position;

                    vecFromPToCargoBayCenter = this.part.partTransform.position - vecFromPToCargoBayCenter;

                    RaycastHit[] hits = Physics.RaycastAll(p.partTransform.position, vecFromPToCargoBayCenter, vecFromPToCargoBayCenter.magnitude, FARAeroUtil.RaycastMask);

                    bool outsideMesh = false;

                    for (int j = 0; j < hits.Length; j++)
                    {
                        if (colliders.Contains(hits[j].collider))
                        {
                            outsideMesh = true;
                            break;
                        }
                    }
                    if (outsideMesh)
                    {
                        break;
                    }

                    FARShieldedParts.Add(p);
                    if (b)
                    {
                        b.isShielded = true;
                        //print("Shielded: " + p.partInfo.title);
                    }
                    for (int j = 0; j < p.symmetryCounterparts.Count; j++)
                    {
                        Part q = p.symmetryCounterparts[j];
                        if (q == null)
                        {
                            continue;
                        }
                        FARShieldedParts.Add(q);
                        b = q.GetComponent <FARBaseAerodynamics>();
                        if (b)
                        {
                            b.isShielded = true;
                            //print("Shielded: " + p.partInfo.title);
                        }
                    }
                }
            }
            partsShielded = FARShieldedParts.Count;
        }
Пример #7
0
        private void FindShieldedParts()
        {
            if (minBounds == new Vector3())
            {
                CalculateBayBounds();
            }
            ClearShieldedParts();
            bayOpen = false;
            UpdateShipPartsList();

            double y_margin = Math.Max(0.12, 0.03 * (maxBounds.y - minBounds.y));

            Collider[] colliders = this.PartColliders;

            for (int i = 0; i < VesselPartList.Count; i++)
            {
                Part p = VesselPartList[i];

                if (FARShieldedParts.Contains(p) || p == null || p == part || part.symmetryCounterparts.Contains(p))
                {
                    continue;
                }

                FARBaseAerodynamics     b = null;
                FARBasicDragModel       d = null;
                FARWingAerodynamicModel w = null;
                Vector3 relPos            = -part.transform.position;
                w = p.GetComponent <FARWingAerodynamicModel>();
                if ((object)w == null)
                {
                    d = p.GetComponent <FARBasicDragModel>();
                }
                if ((object)w == null && (object)d == null)
                {
                    continue;
                }
                //if (p.GetComponent<FARPayloadFairingModule>() != null)
                //    continue;
                if (w)
                {
                    b       = w as FARBaseAerodynamics;
                    relPos += w.WingCentroid();
                }
                else
                {
                    b       = d as FARBaseAerodynamics;
                    relPos += p.partTransform.TransformDirection(d.CenterOfDrag) + p.partTransform.position;       //No attach node shifting with this
                }

                relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);
                if (relPos.x < maxBounds.x && relPos.y < maxBounds.y + y_margin && relPos.z < maxBounds.z && relPos.x > minBounds.x && relPos.y > minBounds.y - y_margin && relPos.z > minBounds.z)
                {
                    if (relPos.y > maxBounds.y || relPos.y < minBounds.y)
                    {
                        // Enforce strict y bounds for parent and stack children
                        if (p == this.part.parent ||
                            p.parent == this.part && p.attachMode == AttachModes.STACK)
                        {
                            continue;
                        }
                    }
                    Vector3 vecFromPToCargoBayCenter;
                    Vector3 origin;
                    if (w)
                    {
                        origin = w.WingCentroid();
                    }
                    else
                    {
                        origin = p.transform.position;
                    }

                    vecFromPToCargoBayCenter = part.transform.position - origin;

                    if (w)  //This accounts for wings that are clipping into the cargo bay.
                    {
                        origin -= vecFromPToCargoBayCenter.normalized * 0.1f;
                    }

                    RaycastHit[] hits = Physics.RaycastAll(origin, vecFromPToCargoBayCenter, vecFromPToCargoBayCenter.magnitude, FARAeroUtil.RaycastMask);

                    bool outsideMesh = false;

                    for (int j = 0; j < hits.Length; j++)
                    {
                        if (colliders.Contains(hits[j].collider))
                        {
                            outsideMesh = true;
                            break;
                        }
                    }
                    if (outsideMesh)
                    {
                        continue;
                    }

                    FARShieldedParts.Add(p);
                    if (b)
                    {
                        b.ActivateShielding();
                        //print("Shielded: " + p.partInfo.title);
                    }
                    for (int j = 0; j < p.symmetryCounterparts.Count; j++)
                    {
                        Part q = p.symmetryCounterparts[j];
                        if (q == null)
                        {
                            continue;
                        }
                        FARShieldedParts.Add(q);
                        b = q.GetComponent <FARBaseAerodynamics>();
                        if (b)
                        {
                            b.ActivateShielding();
                            //print("Shielded: " + p.partInfo.title);
                        }
                    }
                }
            }
            partsShielded = FARShieldedParts.Count;
        }
        private void FindShieldedParts()
        {
            /*if (HighLogic.LoadedSceneIsEditor/* && FARAeroUtil.EditorAboutToAttach(false) &&
             *  !FARAeroUtil.CurEditorParts.Contains(part))
             *  return;*/
            if (minBounds.Count == 0)
            {
                CalculateFairingBounds();
            }

            ClearShieldedParts();
            UpdateShipPartsList();

            foreach (Part p in VesselPartList)
            {
                if (FARShieldedParts.Contains(p) || p == null || p == part || part.symmetryCounterparts.Contains(p))
                {
                    continue;
                }

                FARBaseAerodynamics     b = null;
                FARBasicDragModel       d = null;
                FARWingAerodynamicModel w = null;
                Vector3 relPos            = -part.transform.position;
                w = p.GetComponent <FARWingAerodynamicModel>();
                if ((object)w == null)
                {
                    d = p.GetComponent <FARBasicDragModel>();
                }
                if ((object)w == null && (object)d == null)
                {
                    continue;
                }
                //if (p.GetComponent<FARPayloadFairingModule>() != null)
                //    continue;
                if (w)
                {
                    b       = w as FARBaseAerodynamics;
                    relPos += w.WingCentroid();
                }
                else
                {
                    b       = d as FARBaseAerodynamics;
                    relPos += p.partTransform.TransformDirection(d.CenterOfDrag) + p.partTransform.position;       //No attach node shifting with this
                }


                relPos = this.part.transform.worldToLocalMatrix.MultiplyVector(relPos);
                for (int i = 0; i < minBounds.Count; i++)
                {
                    Vector3 minBoundVec, maxBoundVec;
                    minBoundVec = minBounds[i];
                    maxBoundVec = maxBounds[i];
                    if (relPos.x < maxBoundVec.x && relPos.y < maxBoundVec.y && relPos.z < maxBoundVec.z && relPos.x > minBoundVec.x && relPos.y > minBoundVec.y && relPos.z > minBoundVec.z)
                    {
                        FARShieldedParts.Add(p);
                        if (b)
                        {
                            b.isShielded = true;
                            //print("Shielded: " + p.partInfo.title);
                        }
                        foreach (Part q in p.symmetryCounterparts)
                        {
                            if (q == null)
                            {
                                continue;
                            }
                            FARShieldedParts.Add(q);
                            b = q.GetComponent <FARBaseAerodynamics>();
                            if (b)
                            {
                                b.isShielded = true;
                                //print("Shielded: " + p.partInfo.title);
                            }
                        }
                        break;
                    }
                }
            }
            partsShielded = FARShieldedParts.Count;
        }