/// <inheritdoc /> public override void OnLoad(ConfigNode node) { try { // SETUP TRANSFORMS decalFrontTransform = part.FindModelTransform(decalFront); if (decalFrontTransform == null) { throw new FormatException($"Could not find decalFront transform: '{decalFront}'."); } decalBackTransform = part.FindModelTransform(decalBack); if (decalBackTransform == null) { throw new FormatException($"Could not find decalBack transform: '{decalBack}'."); } decalModelTransform = part.FindModelTransform(decalModel); if (decalModelTransform == null) { throw new FormatException($"Could not find decalModel transform: '{decalModel}'."); } decalProjectorTransform = part.FindModelTransform(decalProjector); if (decalProjectorTransform == null) { throw new FormatException($"Could not find decalProjector transform: '{decalProjector}'."); } decalColliderTransform = part.FindModelTransform(decalCollider); if (decalColliderTransform == null) { throw new FormatException($"Could not find decalCollider transform: '{decalCollider}'."); } // SETUP BACK MATERIAL if (updateBackScale) { var backRenderer = decalBackTransform.GetComponent <MeshRenderer>(); if (backRenderer == null) { this.LogError($"Specified decalBack transform {decalBack} has no renderer attached! Setting updateBackScale to false."); updateBackScale = false; } else { backMaterial = backRenderer.material; if (backMaterial == null) { this.LogError($"Specified decalBack transform {decalBack} has a renderer but no material! Setting updateBackScale to false."); updateBackScale = false; } else { if (backTextureBaseScale == default) { backTextureBaseScale = backMaterial.GetTextureScale(PropertyIDs._MainTex); } } } } // PARSE MATERIAL PROPERTIES // set shader materialProperties.SetShader(shader); materialProperties.AddOrGetProperty <MaterialKeywordProperty>("DECAL_BASE_NORMAL").value = useBaseNormal; // add keyword nodes foreach (var keywordNode in node.GetNodes("KEYWORD")) { materialProperties.ParseProperty <MaterialKeywordProperty>(keywordNode); } // add texture nodes foreach (var textureNode in node.GetNodes("TEXTURE")) { materialProperties.ParseProperty <MaterialTextureProperty>(textureNode); } // add float nodes foreach (var floatNode in node.GetNodes("FLOAT")) { materialProperties.ParseProperty <MaterialTextureProperty>(floatNode); } // add color nodes foreach (var colorNode in node.GetNodes("COLOR")) { materialProperties.ParseProperty <MaterialColorProperty>(colorNode); } // handle texture tiling parameters var tileString = node.GetValue("tile"); if (!string.IsNullOrEmpty(tileString)) { var tileValid = ParseExtensions.TryParseRect(tileString, out tileRect); if (!tileValid) { throw new FormatException($"Invalid rect value for tile '{tileString}'"); } } if (tileRect.x >= 0) { materialProperties.UpdateTile(tileRect); } else if (tileIndex >= 0) { materialProperties.UpdateTile(tileIndex, tileSize); } } catch (Exception e) { this.LogException("Exception parsing partmodule", e); } UpdateMaterials(); foreach (var keyword in _decalMaterial.shaderKeywords) { this.Log($"keyword: {keyword}"); } if (HighLogic.LoadedSceneIsEditor) { UpdateTweakables(); } if (HighLogic.LoadedSceneIsGame) { UpdateScale(); } else { scale = defaultScale; depth = defaultDepth; opacity = defaultOpacity; cutoff = defaultCutoff; wear = defaultWear; // QUEUE PART FOR ICON FIXING IN VAB DecalIconFixer.QueuePart(part.name); } }
public static bool TryParseRect(string str, out Rect value) { return(ParseExtensions.TryParseRect(str, out value)); }