public CompoundPartGeoUpdater(CompoundPart part, GeometryPartModule geoModule)
 {
     this.part = part;
     this.geoModule = geoModule;
     lastAttachState = part.attachState;
     lastTarget = part.target;
 }
 public CompoundPartGeoUpdater(CompoundPart part, GeometryPartModule geoModule)
 {
     this.part       = part;
     this.geoModule  = geoModule;
     lastAttachState = part.attachState;
     lastTarget      = part.target;
 }
        public GeometryMesh(MeshData meshData, Transform meshTransform, Matrix4x4 worldToVesselMatrix, GeometryPartModule module)
        {
            Vector3[] untransformedVerts = meshData.vertices;
            int[] triangles = meshData.triangles;
            Bounds meshBounds = meshData.bounds;

            vertices = new Vector3[untransformedVerts.Length];
            this.thisToVesselMatrix = worldToVesselMatrix * meshTransform.localToWorldMatrix;

            for (int i = 0; i < vertices.Length; i++)
            {
                //vertices[i] = thisToVesselMatrix.MultiplyPoint3x4(untransformedVerts[i]);
                Vector3 v = untransformedVerts[i];
                Vector3 vert = Vector3.zero;
                vert.x = thisToVesselMatrix.m00 * v.x + thisToVesselMatrix.m01 * v.y + thisToVesselMatrix.m02 * v.z + thisToVesselMatrix.m03;
                vert.y = thisToVesselMatrix.m10 * v.x + thisToVesselMatrix.m11 * v.y + thisToVesselMatrix.m12 * v.z + thisToVesselMatrix.m13;
                vert.z = thisToVesselMatrix.m20 * v.x + thisToVesselMatrix.m21 * v.y + thisToVesselMatrix.m22 * v.z + thisToVesselMatrix.m23;

                vertices[i] = vert;
            }

            this.triangles = triangles;
            this.meshTransform = meshTransform;

            bounds = TransformBounds(meshBounds, thisToVesselMatrix);

            this.module = module;
            this.part = module.part;

            if (!module.part.isMirrored)
                invertXYZ = 1;
            else
                invertXYZ = -1;
        }
        private void Start()
        {
            if (!CompatibilityChecker.IsAllCompatible())
            {
                this.enabled = false;
                return;
            }

            _vessel      = gameObject.GetComponent <Vessel>();
            this.enabled = true;

            if (_vessel.rootPart.Modules.Contains("MissileLauncher") && _vessel.parts.Count == 1)
            {
                _vessel.rootPart.dragModel = Part.DragModel.CUBE;
                this.enabled = false;
                return;
            }

            _currentGeoModules = new List <GeometryPartModule>();
            for (int i = 0; i < _vessel.parts.Count; i++)
            {
                Part p = _vessel.parts[i];
                p.maximum_drag = 0;
                p.minimum_drag = 0;
                p.angularDrag  = 0;

                /*p.dragModel = Part.DragModel.NONE;
                 * p.dragReferenceVector = Vector3.zero;
                 * p.dragScalar = 0;
                 * p.dragVector = Vector3.zero;
                 * p.dragVectorDir = Vector3.zero;
                 * p.dragVectorDirLocal = Vector3.zero;
                 * p.dragVectorMag = 0;
                 * p.dragVectorSqrMag = 0;
                 *
                 * p.bodyLiftMultiplier = 0;
                 * p.bodyLiftScalar = 0;*/

                GeometryPartModule g = p.GetComponent <GeometryPartModule>();
                if ((object)g != null)
                {
                    _currentGeoModules.Add(g);
                }
                else if (p.Modules.Contains("KerbalEVA"))
                {
                    p.AddModule("GeometryPartModule");
                    g = p.GetComponent <GeometryPartModule>();
                    p.AddModule("FARAeroPartModule");
                    _currentGeoModules.Add(g);
                }
            }

            GameEvents.onVesselGoOffRails.Add(VesselUpdateEvent);
            GameEvents.onVesselChange.Add(VesselUpdateEvent);
            //GameEvents.onVesselLoaded.Add(VesselUpdate);
            GameEvents.onVesselCreate.Add(VesselUpdateEvent);
            GameEvents.onVesselWasModified.Add(VesselUpdateEvent);
            VesselUpdate(false);
        }
Exemplo n.º 5
0
        private void RecalculateVoxel()
        {
            //this has been updated recently in the past; queue an update and return
            if (_updateRateLimiter < FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate)
            {
                VoxelizationUpdateQueued = true;
                return;
            }

            _updateRateLimiter       = 0;
            VoxelizationUpdateQueued = false;
            List <Part> partList = EditorLogic.SortedShipList;

            _currentGeometryModules.Clear();

            foreach (Part p in partList)
            {
                if (!p.Modules.Contains <GeometryPartModule>())
                {
                    continue;
                }
                GeometryPartModule g = p.Modules.GetModule <GeometryPartModule>();
                if (g == null)
                {
                    continue;
                }
                if (g.Ready)
                {
                    _currentGeometryModules.Add(g);
                }
                else
                {
                    _updateRateLimiter       = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                    VoxelizationUpdateQueued = true;
                    return;
                }
            }

            TriggerIGeometryUpdaters();


            if (_currentGeometryModules.Count <= 0)
            {
                return;
            }
            voxelWatch.Start();
            if (_vehicleAero.TryVoxelUpdate(EditorLogic.RootPart.partTransform.worldToLocalMatrix,
                                            EditorLogic.RootPart.partTransform.localToWorldMatrix,
                                            FARSettingsScenarioModule.VoxelSettings.numVoxelsControllableVessel,
                                            partList,
                                            _currentGeometryModules))
            {
                return;
            }
            voxelWatch.Stop();
            voxelWatch.Reset();
            _updateRateLimiter       = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
            VoxelizationUpdateQueued = true;
        }
        public StockProcFairingGeoUpdater(ModuleProceduralFairing fairing, GeometryPartModule geoModule)
        {
            this.fairing = fairing;
            this.geoModule = geoModule;

            if (HighLogic.LoadedSceneIsEditor)
                prevPanelBounds = new List<Bounds>();
        }
Exemplo n.º 7
0
        private void UpdateGeometryModule(Part p)
        {
            GeometryPartModule g = p.GetComponent <GeometryPartModule>();

            if (g != null && g.Ready)
            {
                g.EditorUpdate();
            }
        }
 public StockJettisonTransformGeoUpdater(ModuleJettison engineFairing, GeometryPartModule geoModule)
 {
         this.engineFairing = engineFairing;
         this.geoModule = geoModule;
         if (ObjectsNotNull())
             fairingVisible = engineFairing.jettisonTransform.gameObject.activeSelf && !engineFairing.isJettisoned;
         else
             fairingVisible = false;
 }
        public StockProcFairingGeoUpdater(ModuleProceduralFairing fairing, GeometryPartModule geoModule)
        {
            this.fairing   = fairing;
            this.geoModule = geoModule;

            if (HighLogic.LoadedSceneIsEditor)
            {
                prevPanelBounds = new List <Bounds>();
            }
        }
Exemplo n.º 10
0
        void RecalculateVoxel()
        {
            if (_updateRateLimiter < FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate)        //this has been updated recently in the past; queue an update and return
            {
                _updateQueued = true;
                return;
            }
            else                                //last update was far enough in the past to run; reset rate limit counter and clear the queued flag
            {
                _updateRateLimiter = 0;
                _updateQueued      = false;
            }
            List <Part> partList = EditorLogic.SortedShipList;

            _currentGeometryModules.Clear();

            for (int i = 0; i < partList.Count; i++)
            {
                Part p = partList[i];
                if (p.Modules.Contains <GeometryPartModule>())
                {
                    GeometryPartModule g = p.Modules.GetModule <GeometryPartModule>();
                    if (g != null)
                    {
                        if (g.Ready)
                        {
                            _currentGeometryModules.Add(g);
                        }
                        else
                        {
                            _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                            _updateQueued      = true;
                            //FARLogger.Info("We're not ready!");
                            return;
                        }
                    }
                }
            }
            TriggerIGeometryUpdaters();


            if (_currentGeometryModules.Count > 0)
            {
                voxelWatch.Start();
                if (!_vehicleAero.TryVoxelUpdate(EditorLogic.RootPart.partTransform.worldToLocalMatrix, EditorLogic.RootPart.partTransform.localToWorldMatrix, FARSettingsScenarioModule.VoxelSettings.numVoxelsControllableVessel, partList, _currentGeometryModules, true))
                {
                    voxelWatch.Stop();
                    voxelWatch.Reset();
                    _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                    _updateQueued      = true;
                }
            }
        }
Exemplo n.º 11
0
        private void UpdateGeometryModule(Part p)
        {
            if ((System.Object)p == null)
            {
                return;
            }
            GeometryPartModule g = p.GetComponent <GeometryPartModule>();

            if (g != null && g.Ready)
            {
                g.EditorUpdate();
            }
        }
Exemplo n.º 12
0
        private static void UpdateGeometryModule(Part p)
        {
            if (p is null)
            {
                return;
            }
            GeometryPartModule g = p.GetComponent <GeometryPartModule>();

            if (g != null && g.Ready)
            {
                g.EditorUpdate();
            }
        }
Exemplo n.º 13
0
        protected override void OnStart()
        {
            FARLogger.Info("FARVesselAero on " + vessel.name + " reporting startup");
            base.OnStart();

            if (!HighLogic.LoadedSceneIsFlight)
            {
                enabled = false;
                return;
            }

            _currentGeoModules = new List <GeometryPartModule>();

            Exposure = gameObject.AddComponent <VehicleExposure>();
            Exposure.transform.SetParent(transform, false);
            Exposure.Vessel = vessel;

            foreach (Part p in vessel.parts)
            {
                p.maximum_drag = 0;
                p.minimum_drag = 0;
                p.angularDrag  = 0;

                GeometryPartModule g = p.GetComponent <GeometryPartModule>();
                if (!(g is null))
                {
                    _currentGeoModules.Add(g);
                    if (g.Ready)
                    {
                        geoModulesReady++;
                    }
                }

                if (!p.Modules.Contains <KerbalEVA>() && !p.Modules.Contains <FlagSite>())
                {
                    continue;
                }
                FARLogger.Info("Handling Stuff for KerbalEVA / Flag");
                g = (GeometryPartModule)p.AddModule("GeometryPartModule");
                g.OnStart(StartState());
                p.AddModule("FARAeroPartModule").OnStart(StartState());
                _currentGeoModules.Add(g);
            }

            RequestUpdateVoxel(false);

            enabled = true;
        }
Exemplo n.º 14
0
        private void UpdateGeometryModule(ConstructionEventType type, Part p)
        {
            GeometryPartModule g = p.GetComponent <GeometryPartModule>();

            if (g != null && g.Ready)
            {
                if (type == ConstructionEventType.Unknown)
                {
                    g.RebuildAllMeshData();
                }
                else
                {
                    g.EditorUpdate();
                }
            }
        }
        public GeometryMesh(MeshData meshData, Transform meshTransform, Matrix4x4 worldToVesselMatrix, GeometryPartModule module)
        {
            this.meshLocalVerts = meshData.vertices;
            this.triangles = meshData.triangles;
            Bounds meshBounds = meshData.bounds;

            vertices = new Vector3[meshLocalVerts.Length];
            this.thisToVesselMatrix = worldToVesselMatrix * meshTransform.localToWorldMatrix;

            for (int i = 0; i < vertices.Length; i++)
            {
                //vertices[i] = thisToVesselMatrix.MultiplyPoint3x4(untransformedVerts[i]);
                Vector3 v = meshLocalVerts[i];
                Vector3 vert = Vector3.zero;
                vert.x = thisToVesselMatrix.m00 * v.x + thisToVesselMatrix.m01 * v.y + thisToVesselMatrix.m02 * v.z + thisToVesselMatrix.m03;
                vert.y = thisToVesselMatrix.m10 * v.x + thisToVesselMatrix.m11 * v.y + thisToVesselMatrix.m12 * v.z + thisToVesselMatrix.m13;
                vert.z = thisToVesselMatrix.m20 * v.x + thisToVesselMatrix.m21 * v.y + thisToVesselMatrix.m22 * v.z + thisToVesselMatrix.m23;

                float tmpTestVert = vert.x + vert.y + vert.z;
                if (float.IsNaN(tmpTestVert) || float.IsInfinity(tmpTestVert))
                    ThreadSafeDebugLogger.Instance.RegisterMessage("Mesh error in " + module.part.partInfo.title);
                vertices[i] = vert;
            }

            this.meshTransform = meshTransform;

            bounds = TransformBounds(meshBounds, thisToVesselMatrix);

            float tmpTestBounds = bounds.center.x + bounds.center.y + bounds.center.z +
                bounds.extents.x + bounds.extents.y + bounds.extents.z;
            if (float.IsNaN(tmpTestBounds) || float.IsInfinity(tmpTestBounds))
            {
                ThreadSafeDebugLogger.Instance.RegisterMessage("Bounds error in " + module.part.partInfo.title);
                valid = false;
            }
            else
                valid = true;

            this.module = module;
            this.part = module.part;
            
            if (!module.part.isMirrored)
                invertXYZ = 1;
            else
                invertXYZ = -1;
        }
Exemplo n.º 16
0
 private void CheckGeoModulesReady()
 {
     geoModulesReady = 0;
     for (int i = 0; i < _currentGeoModules.Count; i++)
     {
         GeometryPartModule g = _currentGeoModules[i];
         if (g == null)
         {
             _currentGeoModules.RemoveAt(i);
             i--;
         }
         else
         {
             geoModulesReady++;
         }
     }
 }
Exemplo n.º 17
0
        public StockProcFairingGeoUpdater(ModuleProceduralFairing fairing, GeometryPartModule geoModule)
        {
            this.fairing   = fairing;
            this.geoModule = geoModule;

            if (validParts == null)
            {
                FARLogger.Info("Fairing event setup");
                validParts = new Dictionary <Part, GeometryPartModule>();
                GameEvents.onFairingsDeployed.Add(FairingDeployGeometryUpdate);
            }

            validParts.Add(geoModule.part, geoModule);

            if (HighLogic.LoadedSceneIsEditor)
            {
                prevPanelBounds = new List <Bounds>();
            }
        }
Exemplo n.º 18
0
        private static void UpdateGeometryModule(ConstructionEventType type, Part p)
        {
            if (p is null)
            {
                return;
            }
            GeometryPartModule g = p.GetComponent <GeometryPartModule>();

            if (g == null || !g.Ready)
            {
                return;
            }
            if (type == ConstructionEventType.Unknown)
            {
                g.RebuildAllMeshData();
            }
            else
            {
                g.EditorUpdate();
            }
        }
Exemplo n.º 19
0
 public StockProcAsteroidGeoUpdater(GeometryPartModule geoModule)
 {
     this.geoModule = geoModule;
 }
 public StockProcAsteroidGeoUpdater(ModuleAsteroid asteroid, GeometryPartModule geoModule)
 {
     this.asteroid  = asteroid;
     this.geoModule = geoModule;
 }
Exemplo n.º 21
0
        public void VesselUpdate(bool recalcGeoModules)
        {
            if (vessel == null)
            {
                vessel = gameObject.GetComponent <Vessel>();
                if (vessel == null || vessel.vesselTransform == null)
                {
                    return;
                }
            }

            if (_vehicleAero == null)
            {
                _vehicleAero         = new VehicleAerodynamics();
                _vesselIntakeRamDrag = new VesselIntakeRamDrag();
            }

            if (_updateRateLimiter < FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate)         //this has been updated recently in the past; queue an update and return
            {
                _updateQueued = true;
                return;
            }
            else                                 //last update was far enough in the past to run; reset rate limit counter and clear the queued flag
            {
                _updateRateLimiter = 0;
                _updateQueued      = false;
            }
            if (vessel.rootPart.Modules.Contains <LaunchClamp>())// || _vessel.rootPart.Modules.Contains("KerbalEVA"))
            {
                DisableModule();
                return;
            }
            if (recalcGeoModules)
            {
                _currentGeoModules.Clear();
                geoModulesReady = 0;
                for (int i = 0; i < vessel.Parts.Count; i++)
                {
                    Part p = vessel.Parts[i];
                    GeometryPartModule g = p.Modules.GetModule <GeometryPartModule>();
                    if ((object)g != null)
                    {
                        _currentGeoModules.Add(g);
                        if (g.Ready)
                        {
                            geoModulesReady++;
                        }
                    }
                }
            }
            if (_currentGeoModules.Count > geoModulesReady)
            {
                _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                _updateQueued      = true;
                return;
            }

            if (_currentGeoModules.Count == 0)
            {
                DisableModule();
                Debug.Log("Disabling FARVesselAero on " + vessel.name + " due to no FARGeometryModules on board");
            }

            TriggerIGeometryUpdaters();
            if (FARThreading.VoxelizationThreadpool.RunInMainThread)
            {
                for (int i = _currentGeoModules.Count - 1; i >= 0; --i)
                {
                    if (!_currentGeoModules[i].Ready)
                    {
                        _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                        _updateQueued      = true;
                        return;
                    }
                }
            }

            _voxelCount = VoxelCountFromType();
            if (!_vehicleAero.TryVoxelUpdate(vessel.vesselTransform.worldToLocalMatrix, vessel.vesselTransform.localToWorldMatrix, _voxelCount, vessel.Parts, _currentGeoModules, !setup))
            {
                _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                _updateQueued      = true;
            }
            if (!_updateQueued)
            {
                setup = true;
            }

            Debug.Log("Updating vessel voxel for " + vessel.vesselName);
        }
Exemplo n.º 22
0
        protected override void OnStart()
        {
            Debug.Log("FARVesselAero on " + vessel.name + " reporting startup");
            base.OnStart();

            if (!CompatibilityChecker.IsAllCompatible())
            {
                this.enabled = false;
                return;
            }
            if (!HighLogic.LoadedSceneIsFlight)
            {
                this.enabled = false;
                return;
            }

            _currentGeoModules = new List <GeometryPartModule>();

            /*if (!vessel.rootPart)
             * {
             *  this.enabled = false;
             *  return;
             * }*/

            for (int i = 0; i < vessel.parts.Count; i++)
            {
                Part p = vessel.parts[i];
                p.maximum_drag = 0;
                p.minimum_drag = 0;
                p.angularDrag  = 0;

                /*p.dragModel = Part.DragModel.NONE;
                 * p.dragReferenceVector = Vector3.zero;
                 * p.dragScalar = 0;
                 * p.dragVector = Vector3.zero;
                 * p.dragVectorDir = Vector3.zero;
                 * p.dragVectorDirLocal = Vector3.zero;
                 * p.dragVectorMag = 0;
                 * p.dragVectorSqrMag = 0;
                 *
                 * p.bodyLiftMultiplier = 0;
                 * p.bodyLiftScalar = 0;*/

                GeometryPartModule g = p.GetComponent <GeometryPartModule>();
                if ((object)g != null)
                {
                    _currentGeoModules.Add(g);
                    if (g.Ready)
                    {
                        geoModulesReady++;
                    }
                }
                if (p.Modules.Contains <KerbalEVA>() || p.Modules.Contains <FlagSite>())
                {
                    Debug.Log("Handling Stuff for KerbalEVA / Flag");
                    g = (GeometryPartModule)p.AddModule("GeometryPartModule");
                    g.OnStart(StartState());
                    p.AddModule("FARAeroPartModule").OnStart(StartState());
                    _currentGeoModules.Add(g);
                }
            }
            RequestUpdateVoxel(false);

            this.enabled = true;
            //GameEvents.onVesselLoaded.Add(VesselUpdateEvent);
            //GameEvents.onVesselChange.Add(VesselUpdateEvent);
            //GameEvents.onVesselLoaded.Add(VesselUpdate);
            //GameEvents.onVesselCreate.Add(VesselUpdateEvent);

            //Debug.Log("Starting " + _vessel.vesselName + " aero properties");
        }
Exemplo n.º 23
0
        public void VesselUpdate(bool recalcGeoModules)
        {
            if (_vessel == null)
            {
                _vessel = gameObject.GetComponent <Vessel>();
            }
            if (_vehicleAero == null)
            {
                _vehicleAero         = new VehicleAerodynamics();
                _vesselIntakeRamDrag = new VesselIntakeRamDrag();
            }

            if (_updateRateLimiter < FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate)         //this has been updated recently in the past; queue an update and return
            {
                _updateQueued = true;
                return;
            }
            else                                 //last update was far enough in the past to run; reset rate limit counter and clear the queued flag
            {
                _updateRateLimiter = 0;
                _updateQueued      = false;
            }

            if (_vessel.rootPart.Modules.Contains("LaunchClamp") || _vessel.rootPart.Modules.Contains("KerbalEVA"))
            {
                DisableModule();
                return;
            }

            if (recalcGeoModules)
            {
                _currentGeoModules = new List <GeometryPartModule>();
                geoModulesReady    = 0;
                for (int i = 0; i < _vessel.Parts.Count; i++)
                {
                    Part p = _vessel.parts[i];
                    GeometryPartModule g = p.GetComponent <GeometryPartModule>();
                    if ((object)g != null)
                    {
                        _currentGeoModules.Add(g);
                        if (g.Ready)
                        {
                            geoModulesReady++;
                        }
                    }
                }
            }

            if (_currentGeoModules.Count > geoModulesReady)
            {
                _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                _updateQueued      = true;
                return;
            }

            if (_currentGeoModules.Count == 0)
            {
                DisableModule();
            }

            TriggerIGeometryUpdaters();

            _voxelCount = VoxelCountFromType();
            if (!_vehicleAero.TryVoxelUpdate(_vessel.vesselTransform.worldToLocalMatrix, _vessel.vesselTransform.localToWorldMatrix, _voxelCount, _vessel.Parts, _currentGeoModules, !setup))
            {
                _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                _updateQueued      = true;
            }

            setup = true;

            Debug.Log("Updating vessel voxel for " + _vessel.vesselName);
        }
 public StockJettisonTransformGeoUpdater(ModuleJettison engineFairing, GeometryPartModule geoModule)
 {
     this.engineFairing = engineFairing;
     this.geoModule = geoModule;
     fairingVisible = engineFairing.jettisonTransform.gameObject.activeSelf && !engineFairing.isJettisoned;
 }
        private bool CheckPartForOverridingPartList(GeometryPartModule g)
        {
            if (g.part == null)
                return false;

            PartModuleList modules = g.part.Modules;
            bool returnVal = false;

            for (int i = 0; i < modules.Count; i++)
            {
                PartModule m = modules[i];
                if (m is ferram4.FARControllableSurface)
                {
                    returnVal = true;
                    break;
                }
                if (m is ModuleRCS)
                {
                    returnVal = true;
                    break;
                }
                if (m is ModuleEngines)
                {
                    returnVal = true;
                    break;
                }
            }
            if (g.HasCrossSectionAdjusters)
            {
                returnVal |= g.MaxCrossSectionAdjusterArea > 0;
            }

            return returnVal;
        }
        /*public VehicleVoxel(List<Part> partList, List<GeometryPartModule> geoModules, double elementSize, Vector3 lowerRightCorner, bool multiThreaded = true, bool solidify = true)
        {
            if (clearedPlanes == null)
            {
                clearedPlanes = new Queue<SweepPlanePoint[,]>();
                for (int i = 0; i < MAX_SWEEP_PLANES_IN_QUEUE; i++)
                    clearedPlanes.Enqueue(new SweepPlanePoint[1, 1]);
            }
            Vector3d min = new Vector3d(double.PositiveInfinity, double.PositiveInfinity, double.PositiveInfinity);
            Vector3d max = new Vector3d(double.NegativeInfinity, double.NegativeInfinity, double.NegativeInfinity);

            for (int i = 0; i < geoModules.Count; i++)
            {
                GeometryPartModule m = geoModules[i];
                if ((object)m != null)
                {
                    Vector3d minBounds = m.overallMeshBounds.min;
                    Vector3d maxBounds = m.overallMeshBounds.max;

                    min.x = Math.Min(min.x, minBounds.x);
                    min.y = Math.Min(min.y, minBounds.y);
                    min.z = Math.Min(min.z, minBounds.z);

                    max.x = Math.Max(max.x, maxBounds.x);
                    max.y = Math.Max(max.y, maxBounds.y);
                    max.z = Math.Max(max.z, maxBounds.z);
                }
            }

            Vector3d size = max - min;

            double voxelVolume = size.x * size.y * size.z;
            invElementSize = 1 / elementSize;

            if (double.IsInfinity(voxelVolume))
            {
                Debug.LogError("Voxel Volume was infinity; ending voxelization");
                return;
            }
            double tmp = 0.125 * invElementSize;

            xLength = (int)Math.Ceiling(size.x * tmp) + 1;
            yLength = (int)Math.Ceiling(size.y * tmp) + 1;
            zLength = (int)Math.Ceiling(size.z * tmp) + 1;

            xCellLength = xLength * 8;
            yCellLength = yLength * 8;
            zCellLength = zLength * 8;

            //Debug.Log(elementSize);
            //Debug.Log(xLength + " " + yLength + " " + zLength);
            //Debug.Log(size);

            Vector3d extents = new Vector3d(); //this will be the distance from the center to the edges of the voxel object
            extents.x = xLength * 4 * elementSize;
            extents.y = yLength * 4 * elementSize;
            extents.z = zLength * 4 * elementSize;

            voxelChunks = new VoxelChunk[xLength, yLength, zLength];

            BuildVoxel(geoModules, multiThreaded, solidify);
        }*/
        private bool CheckPartForOverridingPartList(GeometryPartModule g)
        {
            if (g.part == null)
                return false;

            PartModuleList modules = g.part.Modules;
            bool returnVal = false;

            returnVal |= modules.Contains("FARControllableSurface");
            if(g.HasCrossSectionAdjusters)
            {
                returnVal |= g.MaxCrossSectionAdjusterArea > 0;
            }

            return returnVal;
        }
Exemplo n.º 27
0
        public void VesselUpdate(bool recalcGeoModules)
        {
            if (vessel == null)
            {
                vessel = gameObject.GetComponent <Vessel>();
                if (vessel == null || vessel.vesselTransform == null)
                {
                    return;
                }
            }

            if (_vehicleAero == null)
            {
                _vehicleAero         = new VehicleAerodynamics();
                _vesselIntakeRamDrag = new VesselIntakeRamDrag();
            }

            //this has been updated recently in the past; queue an update and return
            if (_updateRateLimiter < FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate)
            {
                _updateQueued = true;
                return;
            }

            _updateRateLimiter = 0;
            _updateQueued      = false;
            if (vessel.rootPart.Modules.Contains <LaunchClamp>())
            {
                DisableModule();
                return;
            }

            if (recalcGeoModules)
            {
                _currentGeoModules.Clear();
                geoModulesReady = 0;
                foreach (Part p in vessel.Parts)
                {
                    GeometryPartModule g = p.Modules.GetModule <GeometryPartModule>();
                    if (g is null)
                    {
                        continue;
                    }
                    _currentGeoModules.Add(g);
                    if (g.Ready)
                    {
                        geoModulesReady++;
                    }
                }
            }

            if (_currentGeoModules.Count > geoModulesReady)
            {
                _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                _updateQueued      = true;
                return;
            }

            if (_currentGeoModules.Count == 0)
            {
                DisableModule();
                FARLogger.Info("Disabling FARVesselAero on " + vessel.name + " due to no FARGeometryModules on board");
            }

            TriggerIGeometryUpdaters();
            if (VoxelizationThreadpool.RunInMainThread)
            {
                for (int i = _currentGeoModules.Count - 1; i >= 0; --i)
                {
                    if (_currentGeoModules[i].Ready)
                    {
                        continue;
                    }
                    _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                    _updateQueued      = true;
                    return;
                }
            }

            _voxelCount = VoxelCountFromType();
            if (!_vehicleAero.TryVoxelUpdate(vessel.vesselTransform.worldToLocalMatrix,
                                             vessel.vesselTransform.localToWorldMatrix,
                                             _voxelCount,
                                             vessel.Parts,
                                             _currentGeoModules,
                                             !setup,
                                             vessel))
            {
                _updateRateLimiter = FARSettingsScenarioModule.VoxelSettings.minPhysTicksPerUpdate - 2;
                _updateQueued      = true;
            }

            if (!_updateQueued)
            {
                setup = true;
            }

            FARLogger.Info("Updating vessel voxel for " + vessel.vesselName);
        }
Exemplo n.º 28
0
 public StockJettisonTransformGeoUpdater(ModuleJettison engineFairing, GeometryPartModule geoModule)
 {
     this.engineFairing = engineFairing;
     this.geoModule     = geoModule;
     fairingVisible     = engineFairing.jettisonTransform.gameObject.activeSelf;
 }
Exemplo n.º 29
0
        private void Start()
        {
            if (!CompatibilityChecker.IsAllCompatible())
            {
                this.enabled = false;
                return;
            }

            _vessel      = gameObject.GetComponent <Vessel>();
            this.enabled = true;

            if (_vessel.rootPart.Modules.Contains("MissileLauncher") && _vessel.parts.Count == 1)
            {
                _vessel.rootPart.dragModel = Part.DragModel.CUBE;
                this.enabled = false;
                return;
            }

            _currentGeoModules = new List <GeometryPartModule>();
            for (int i = 0; i < _vessel.parts.Count; i++)
            {
                Part p = _vessel.parts[i];
                p.maximum_drag = 0;
                p.minimum_drag = 0;
                p.angularDrag  = 0;

                /*p.dragModel = Part.DragModel.NONE;
                 * p.dragReferenceVector = Vector3.zero;
                 * p.dragScalar = 0;
                 * p.dragVector = Vector3.zero;
                 * p.dragVectorDir = Vector3.zero;
                 * p.dragVectorDirLocal = Vector3.zero;
                 * p.dragVectorMag = 0;
                 * p.dragVectorSqrMag = 0;
                 *
                 * p.bodyLiftMultiplier = 0;
                 * p.bodyLiftScalar = 0;*/

                GeometryPartModule g = p.GetComponent <GeometryPartModule>();
                if ((object)g != null)
                {
                    _currentGeoModules.Add(g);
                    if (g.Ready)
                    {
                        geoModulesReady++;
                    }
                }
                if (p.Modules.Contains <KerbalEVA>() || p.Modules.Contains <FlagSite>())
                {
                    Debug.Log("Handling Stuff for KerbalEVA / Flag");
                    g = (GeometryPartModule)p.AddModule("GeometryPartModule");
                    g.OnStart(StartState());
                    p.AddModule("FARAeroPartModule").OnStart(StartState());
                    _currentGeoModules.Add(g);
                }
            }

            GameEvents.onVesselGoOffRails.Add(VesselUpdateEvent);
            //GameEvents.onVesselChange.Add(VesselUpdateEvent);
            //GameEvents.onVesselLoaded.Add(VesselUpdate);
            //GameEvents.onVesselCreate.Add(VesselUpdateEvent);
            GameEvents.onVesselWasModified.Add(VesselUpdateEvent);
            RequestUpdateVoxel(false);

            if (_vessel == null)
            {
                _vessel = gameObject.GetComponent <Vessel>();
                if (_vessel == null)
                {
                    return;
                }
            }

            if (_vehicleAero == null)
            {
                _vehicleAero         = new VehicleAerodynamics();
                _vesselIntakeRamDrag = new VesselIntakeRamDrag();
            }
            //Debug.Log("Starting " + _vessel.vesselName + " aero properties");
        }