public void ResetModel() { if (lengthWidth) { return; } currentDiameter = coreModule.definition.diameter; currentVScale = 0; this.ROLupdateUIFloatEditControl(nameof(currentDiameter), minDiameter, maxDiameter, diameterLargeStep, diameterSmallStep, diameterSlideStep, true, currentDiameter); this.ROLupdateUIFloatEditControl(nameof(currentVScale), -1, 1, 0.25f, 0.05f, 0.001f, true, currentVScale); updateModulePositions(); updateAttachNodes(true); updateAvailableVariants(); updateDragCubes(); if (scaleMass) { updateMass(); } if (scaleCost) { updateCost(); } ROLStockInterop.updatePartHighlighting(part); UpdateTankVolume(lengthWidth); }
/// <summary> /// Updates part highlight renderer list, sends message to ModuleROTFlagDecal to update its renderer, /// sends message to FAR to update voxels, or if createDefaultCube==true will re-render the 'default' stock drag cube for the part<para/> /// Should be called anytime the model geometry in a part is changed -- either models added/deleted, procedural meshes updated. Other methods exist for pure drag-cube updating in ROLStockInterop. /// </summary> /// <param name="part"></param> /// <param name="createDefaultCube"></param> public static void onPartGeometryUpdate(Part part, bool createDefaultCube) { if (!HighLogic.LoadedSceneIsEditor && !HighLogic.LoadedSceneIsFlight) { return; } //noop on prefabs //MonoBehaviour.print(System.Environment.StackTrace); ROLStockInterop.updatePartHighlighting(part); part.airlock = locateAirlock(part); partGeometryUpdate(part); if (isFARInstalled()) { ROLStockInterop.addFarUpdatePart(part); //FARdebug(part); //part.SendMessage("GeometryPartModuleRebuildMeshData"); } else if (createDefaultCube && (HighLogic.LoadedSceneIsEditor || HighLogic.LoadedSceneIsFlight)) { ROLStockInterop.addDragUpdatePart(part); } if (HighLogic.LoadedSceneIsEditor && part.parent == null && part != EditorLogic.RootPart) //likely the part under the cursor; this fixes problems with modular parts not wanting to attach to stuff { part.gameObject.SetLayerRecursive(1, 2097152); //1<<21 = Part Triggers get skipped by the relayering (hatches, ladders, ??) } }
/// <summary> /// Initialization method. Sets up model modules, loads their configs from the input config node. Does all initial linking of part-modules.<para/> /// Does NOT set up their UI interaction -- that is all handled during OnStart() /// </summary> private void Initialize() { if (initialized) { return; } ROLLog.debug($"{modName}: Initialize Starting"); initialized = true; prevLength = panelLength; prevWidth = panelWidth; prevScale = panelScale; ROLLog.debug($"{modName}: Initialize() parseCSV"); coreNodeNames = ROLUtils.parseCSV(coreManagedNodes); ROLLog.debug($"{modName}: Initialize() Model-Module Initialization"); // Model-Module Setup / Initialization ConfigNode node = ROLConfigNodeUtils.parseConfigNode(configNodeData); ROLLog.debug($"{modName}: Initialize() Core Model Nodes"); // List of CORE model nodes from config // each one may contain multiple 'model=modelDefinitionName' entries // but must contain no more than a single 'variant' entry. // If no variant is specified, they are added to the 'Default' variant. ConfigNode[] coreDefNodes = node.GetNodes("CORE"); ROLLog.debug($"{modName}: Initialize() MDLO"); List <ModelDefinitionLayoutOptions> coreDefList = new List <ModelDefinitionLayoutOptions>(); int coreDefLen = coreDefNodes.Length; for (int i = 0; i < coreDefLen; i++) { string variantName = coreDefNodes[i].ROLGetStringValue("variant", "Default"); coreDefs = ROLModelData.getModelDefinitionLayouts(coreDefNodes[i].ROLGetStringValues("model")); coreDefList.AddUniqueRange(coreDefs); ModelDefinitionVariantSet mdvs = getVariantSet(variantName); mdvs.addModels(coreDefs); } coreDefs = coreDefList.ToArray(); coreModule = new ROLModelModule <ModuleROSolar>(part, this, getRootTransform("ModuleROSolar-CORE"), ModelOrientation.CENTRAL, nameof(currentCore), null, null, null); coreModule.name = "ModuleROSolar-Core"; coreModule.getSymmetryModule = m => m.coreModule; coreModule.getValidOptions = () => getVariantSet(currentVariant).definitions; coreModule.setupModelList(coreDefs); coreModule.setupModel(); if (GameDatabase.Instance.GetConfigNode("ROSolar/TechLimits/ROSOLAR_CONFIG") is ConfigNode ROSconfig) { SolarTechLimit.Init(ROSconfig); } stl = SolarTechLimit.GetTechLevel(techLevel); UpdateModulePositions(); UpdateAttachNodes(false); UpdateAvailableVariants(); UpdateMassAndCost(); RecalculateStats(); ROLStockInterop.updatePartHighlighting(part); }
/// <summary> /// Initialization method. Sets up model modules, loads their configs from the input config node. Does all initial linking of part-modules.<para/> /// Does NOT set up their UI interaction -- that is all handled during OnStart() /// </summary> private void initialize() { if (initialized) { return; } initialized = true; prevDiameter = currentDiameter; if (lengthWidth) { prevLength = currentLength; } noseNodeNames = ROLUtils.parseCSV(noseManagedNodes); coreNodeNames = ROLUtils.parseCSV(coreManagedNodes); mountNodeNames = ROLUtils.parseCSV(mountManagedNodes); //model-module setup/initialization ConfigNode node = ROLConfigNodeUtils.parseConfigNode(configNodeData); //list of CORE model nodes from config //each one may contain multiple 'model=modelDefinitionName' entries //but must contain no more than a single 'variant' entry. //if no variant is specified, they are added to the 'Default' variant. ConfigNode[] coreDefNodes = node.GetNodes("CORE"); List <ModelDefinitionLayoutOptions> coreDefList = new List <ModelDefinitionLayoutOptions>(); int coreDefLen = coreDefNodes.Length; for (int i = 0; i < coreDefLen; i++) { string variantName = coreDefNodes[i].ROLGetStringValue("variant", "Default"); coreDefs = ROLModelData.getModelDefinitionLayouts(coreDefNodes[i].ROLGetStringValues("model")); coreDefList.AddUniqueRange(coreDefs); ModelDefinitionVariantSet mdvs = getVariantSet(variantName); mdvs.addModels(coreDefs); } coreDefs = coreDefList.ToArray(); //model defs - brought here so we can capture the array rather than the config node+method call noseDefs = ROLModelData.getModelDefinitions(node.GetNodes("NOSE")); mountDefs = ROLModelData.getModelDefinitions(node.GetNodes("MOUNT")); noseModule = new ROLModelModule <ModuleROTank>(part, this, getRootTransform("ModularPart-NOSE"), ModelOrientation.TOP, nameof(currentNose), null, nameof(currentNoseTexture), nameof(noseModulePersistentData)); noseModule.name = "ModuleROTank-Nose"; noseModule.getSymmetryModule = m => m.noseModule; noseModule.getValidOptions = () => noseDefs; coreModule = new ROLModelModule <ModuleROTank>(part, this, getRootTransform("ModularPart-CORE"), ModelOrientation.CENTRAL, nameof(currentCore), null, nameof(currentCoreTexture), nameof(coreModulePersistentData)); coreModule.name = "ModuleROTank-Core"; coreModule.getSymmetryModule = m => m.coreModule; coreModule.getValidOptions = () => getVariantSet(currentVariant).definitions; mountModule = new ROLModelModule <ModuleROTank>(part, this, getRootTransform("ModularPart-MOUNT"), ModelOrientation.BOTTOM, nameof(currentMount), null, nameof(currentMountTexture), nameof(mountModulePersistentData)); mountModule.name = "ModuleROTank-Mount"; mountModule.getSymmetryModule = m => m.mountModule; mountModule.getValidOptions = () => mountDefs; noseModule.volumeScalar = volumeScalingPower; coreModule.volumeScalar = volumeScalingPower; mountModule.volumeScalar = volumeScalingPower; //set up the model lists and load the currently selected model noseModule.setupModelList(noseDefs); coreModule.setupModelList(coreDefs); mountModule.setupModelList(mountDefs); coreModule.setupModel(); noseModule.setupModel(); mountModule.setupModel(); updateModulePositions(); updateDimensions(); updateAttachNodes(false); updateAvailableVariants(); if (scaleMass) { updateMass(); } if (scaleCost) { updateCost(); } ROLStockInterop.updatePartHighlighting(part); UpdateTankVolume(lengthWidth); }