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); }
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>(); }
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>(); } }
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; } } }
private void UpdateGeometryModule(Part p) { if ((System.Object)p == null) { return; } GeometryPartModule g = p.GetComponent <GeometryPartModule>(); if (g != null && g.Ready) { g.EditorUpdate(); } }
private static void UpdateGeometryModule(Part p) { if (p is null) { return; } GeometryPartModule g = p.GetComponent <GeometryPartModule>(); if (g != null && g.Ready) { g.EditorUpdate(); } }
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; }
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; }
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++; } } }
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>(); } }
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(); } }
public StockProcAsteroidGeoUpdater(GeometryPartModule geoModule) { this.geoModule = geoModule; }
public StockProcAsteroidGeoUpdater(ModuleAsteroid asteroid, GeometryPartModule geoModule) { this.asteroid = asteroid; this.geoModule = geoModule; }
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); }
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"); }
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; }
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); }
public StockJettisonTransformGeoUpdater(ModuleJettison engineFairing, GeometryPartModule geoModule) { this.engineFairing = engineFairing; this.geoModule = geoModule; fairingVisible = engineFairing.jettisonTransform.gameObject.activeSelf; }
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"); }