コード例 #1
0
        /// <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);
            }
        }
コード例 #2
0
 public static bool TryParseRect(string str, out Rect value)
 {
     return(ParseExtensions.TryParseRect(str, out value));
 }