예제 #1
0
        /// <summary>
        /// Checks whether plugins have updated for a particular engine, thus necessitating that the engine parameters be fit again
        /// Checks version and checksum of SolverEngines and whichever assembly declares the type of engine
        /// Looks for values DeclaringAssemblyVersion, DeclaringAssemblyChecksum, SolverEnginesVersion, SolverEnginesAssemblyChecksum in node
        /// </summary>
        /// <param name="engine">Engine module to check.  Only used to find its declaring assembly.  Can be null</param>
        /// <param name="node">ConfigNode to check for versions and checksums</param>
        /// <returns></returns>
        public static bool PluginUpdateCheck(ModuleEnginesSolver engine, ConfigNode node)
        {
            bool result = false;

            if (engine != null)
            {
                Assembly assembly = engine.GetType().Assembly;
                result |= (AssemblyVersion(assembly) != node.GetValue("DeclaringAssemblyVersion"));
                result |= (AssemblyChecksum(assembly) != node.GetValue("DeclaringAssemblyChecksum"));
            }
            result |= (SolverEnginesVersion != node.GetValue("SolverEnginesVersion"));
            result |= (SolverEnginesAssemblyChecksum != node.GetValue("SolverEnginesAssemblyChecksum"));
            return(result);
        }
        /// <summary>
        /// Searches for engine in the database
        /// </summary>
        /// <param name="engine">Engine module to search for.  Will use engine class, part name, and engineID to identify it</param>
        /// <returns>ConfigNode associated with engine if found, otherwise null</returns>
        public static ConfigNode GetNodeForEngine(ModuleEnginesSolver engine)
        {
            string partName = engine.part.name;
            string engineType = engine.GetType().Name;
            string engineID = engine.engineID;

            ConfigNode partNode = database.GetNode(partName);
            if (partNode != null)
            {
                foreach (ConfigNode moduleNode in partNode.GetNodes(engineType))
                {
                    if (moduleNode.GetValue("engineID") == engineID)
                        return moduleNode;
                }
            }

            return null;
        }
예제 #3
0
        /// <summary>
        /// Searches for engine in the database
        /// </summary>
        /// <param name="engine">Engine module to search for.  Will use engine class, part name, and engineID to identify it</param>
        /// <returns>ConfigNode associated with engine if found, otherwise null</returns>
        public static ConfigNode GetNodeForEngine(ModuleEnginesSolver engine)
        {
            string partName   = engine.part.name;
            string engineType = engine.GetType().Name;
            string engineID   = engine.engineID;

            ConfigNode partNode = database.GetNode(partName);

            if (partNode != null)
            {
                foreach (ConfigNode moduleNode in partNode.GetNodes(engineType))
                {
                    if (moduleNode.GetValue("engineID") == engineID)
                    {
                        return(moduleNode);
                    }
                }
            }

            return(null);
        }
예제 #4
0
        /// <summary>
        /// Store fitted engine parameters in the database so they can be accessed later
        /// </summary>
        /// <param name="engine">Engine to associated this config node with</param>
        /// <param name="node">Config node describing engine parameters (both input parameters and fitted parameters)</param>
        public static void SetNodeForEngine(ModuleEnginesSolver engine, ConfigNode node)
        {
            string partName   = engine.part.name;
            string engineType = engine.GetType().Name;
            string engineID   = engine.engineID;

            Assembly assembly = engine.GetType().Assembly;

            node.SetValue("engineID", engineID, true);
            node.SetValue("DeclaringAssemblyVersion", EngineDatabase.AssemblyVersion(assembly), true);
            node.SetValue("DeclaringAssemblyChecksum", EngineDatabase.AssemblyChecksum(assembly), true);
            node.SetValue("SolverEnginesVersion", SolverEnginesVersion, true);
            node.SetValue("SolverEnginesAssemblyChecksum", SolverEnginesAssemblyChecksum, true);

            ConfigNode partNode  = database.GetNode(partName);
            int        nodeIndex = 0;

            if (partNode != null)
            {
                ConfigNode[] moduleNodes = partNode.GetNodes(engineType);
                for (int i = 0; i < moduleNodes.Length; i++)
                {
                    ConfigNode mNode = moduleNodes[i];
                    if (mNode.GetValue("engineID") == engineID)
                    {
                        nodeIndex = i;
                    }
                }
            }
            else
            {
                partNode = new ConfigNode(partName);
                database.AddNode(partNode);
                nodeIndex = 0;
            }

            partNode.SetNode(engineType, node, nodeIndex, true);

            SaveDatabase();
        }
        /// <summary>
        /// Store fitted engine parameters in the database so they can be accessed later
        /// </summary>
        /// <param name="engine">Engine to associated this config node with</param>
        /// <param name="node">Config node describing engine parameters (both input parameters and fitted parameters)</param>
        public static void SetNodeForEngine(ModuleEnginesSolver engine, ConfigNode node)
        {
            string partName = engine.part.name;
            string engineType = engine.GetType().Name;
            string engineID = engine.engineID;

            Assembly assembly = engine.GetType().Assembly;

            node.SetValue("engineID", engineID, true);
            node.SetValue("DeclaringAssemblyVersion", EngineDatabase.AssemblyVersion(assembly), true);
            node.SetValue("DeclaringAssemblyChecksum", EngineDatabase.AssemblyChecksum(assembly), true);
            node.SetValue("SolverEnginesVersion", SolverEnginesVersion, true);
            node.SetValue("SolverEnginesAssemblyChecksum", SolverEnginesAssemblyChecksum, true);

            ConfigNode partNode = database.GetNode(partName);
            int nodeIndex = 0;

            if (partNode != null)
            {
                ConfigNode[] moduleNodes = partNode.GetNodes(engineType);
                for (int i = 0; i < moduleNodes.Length; i++ )
                {
                    ConfigNode mNode = moduleNodes[i];
                    if (mNode.GetValue("engineID") == engineID)
                    {
                        nodeIndex = i;
                    }
                }
            }
            else
            {
                partNode = new ConfigNode(partName);
                database.AddNode(partNode);
                nodeIndex = 0;
            }

            partNode.SetNode(engineType, node, nodeIndex, true);

            SaveDatabase();
        }
 /// <summary>
 /// Checks whether plugins have updated for a particular engine, thus necessitating that the engine parameters be fit again
 /// Checks version and checksum of SolverEngines and whichever assembly declares the type of engine
 /// Looks for values DeclaringAssemblyVersion, DeclaringAssemblyChecksum, SolverEnginesVersion, SolverEnginesAssemblyChecksum in node
 /// </summary>
 /// <param name="engine">Engine module to check.  Only used to find its declaring assembly.  Can be null</param>
 /// <param name="node">ConfigNode to check for versions and checksums</param>
 /// <returns></returns>
 public static bool PluginUpdateCheck(ModuleEnginesSolver engine, ConfigNode node)
 {
     bool result = false;
     if (engine != null)
     {
         Assembly assembly = engine.GetType().Assembly;
         result |= (AssemblyVersion(assembly) != node.GetValue("DeclaringAssemblyVersion"));
         result |= (AssemblyChecksum(assembly) != node.GetValue("DeclaringAssemblyChecksum"));
     }
     result |= (SolverEnginesVersion != node.GetValue("SolverEnginesVersion"));
     result |= (SolverEnginesAssemblyChecksum != node.GetValue("SolverEnginesAssemblyChecksum"));
     return result;
 }
예제 #7
0
        private void FixedUpdate()
        {
            if (!HighLogic.LoadedSceneIsFlight || !vessel)
            {
                return;
            }
            if (vessel.altitude > vessel.mainBody.atmosphereDepth)
            {
                return;
            }
            int newCount = vessel.Parts.Count;

            if (partsCount != newCount)
            {
                partsCount = newCount;
                updatePartsList();
            }


            InletArea  = 0d;
            EngineArea = 0d;
            OverallTPR = 0d;
            AreaRatio  = 0d;

            for (int j = engineList.Count - 1; j >= 0; --j)
            {
                ModuleEnginesSolver e = engineList[j];
                if ((object)e != null && e.EngineIgnited)
                {
                    EngineArea += e.Need_Area;
                }
            }

            for (int j = inletList.Count - 1; j >= 0; --j)
            {
                AJEInlet i = inletList[j];
                if ((object)i != null)
                {
                    double area = i.UsableArea();
                    InletArea  += area;
                    OverallTPR += area * i.overallTPR;
                }
            }

            if (InletArea > 0d)
            {
                if (EngineArea > 0d)
                {
                    AreaRatio   = Math.Min(1d, InletArea / EngineArea);
                    OverallTPR /= InletArea;
                    OverallTPR *= AreaRatio;
                }
                else
                {
                    AreaRatio = 1d;
                }
            }

            AmbientTherm.FromVesselAmbientConditions(vessel);
            Mach = vessel.mach;

            // Transform from static frame to vessel frame, increasing total pressure and temperature
            if (vessel.srfSpeed < 0.01d)
            {
                InletTherm.CopyFrom(AmbientTherm);
            }
            else
            {
                InletTherm.FromChangeReferenceFrame(AmbientTherm, vessel.srfSpeed);
            }
            InletTherm.P *= OverallTPR; // TPR accounts for loss of total pressure by inlet

            // Push parameters to each engine

            for (int i = engineList.Count - 1; i >= 0; --i)
            {
                engineList[i].UpdateInletEffects(InletTherm, AreaRatio, OverallTPR);
            }
        }
예제 #8
0
        protected void InitializeThrustTransforms()
        {
            if (thrustTransformInfos == null && part.partInfo != null && part.partInfo.partPrefab != null && part.partInfo.partPrefab != this)
            {
                ModuleEnginesSolver prefabModule = null;

                for (int i = 0; i < part.partInfo.partPrefab.Modules.Count; i++)
                {
                    ModuleEnginesSolver m = part.partInfo.partPrefab.Modules[i] as ModuleEnginesSolver;
                    if (m == null)
                    {
                        continue;
                    }
                    if (m.engineID != engineID)
                    {
                        continue;
                    }

                    prefabModule = m;
                    break;
                }

                if (prefabModule == null)
                {
                    Debug.LogError($"[{GetType().Name}] unable to find prefab module");
                    return;
                }

                thrustTransformInfos = prefabModule.thrustTransformInfos;
            }

            if (thrustTransformInfos == null)
            {
                return;
            }

            thrustTransforms.Clear();
            thrustTransformMultipliers.Clear();
            float normalization = 0;

            foreach (ThrustTransformInfo info in thrustTransformInfos)
            {
                Transform[] transforms = part.FindModelTransforms(info.transformName);

                if (transforms.Length == 0)
                {
                    Debug.LogError($"[{GetType().Name}] no transforms named {info.transformName} found");
                    continue;
                }

                if (info.multipliers != null && transforms.Length != info.multipliers.Length)
                {
                    Debug.LogError($"[{GetType().Name}] found {transforms.Length} transforms named {info.transformName} but got {info.multipliers.Length} multipliers");
                    continue;
                }

                for (int i = 0; i < transforms.Length; i++)
                {
                    thrustTransforms.Add(transforms[i]);

                    float multiplier = info.overallMultiplier;
                    if (info.multipliers != null)
                    {
                        multiplier *= info.multipliers[i];
                    }
                    thrustTransformMultipliers.Add(multiplier);
                    normalization += multiplier;
                }
            }

            if (normalization == 0)
            {
                normalization = 1;
            }
            for (int i = 0; i < thrustTransformMultipliers.Count; i++)
            {
                thrustTransformMultipliers[i] /= normalization;
            }
        }
예제 #9
0
 public EngineParameterInfo(ModuleEnginesSolver module, FieldInfo field, EngineParameter param)
 {
     Module = module;
     Field  = field;
     Param  = param;
 }
예제 #10
0
 public EngineParameterInfo(ModuleEnginesSolver module, FieldInfo field, EngineParameter param)
 {
     Module = module;
     Field = field;
     Param = param;
 }