Example #1
0
        /// <summary>
        /// Render and show a preview of a building.
        /// </summary>
        /// <param name="building">The building to render</param>
        public void RenderPreview()
        {
            bool validRender = false;

            if (renderPrefab is PropInfo prop)
            {
                if (prop.m_isDecal)
                {
                    // Special case for decals - just use main texture directly.
                    previewSprite.texture = prop.m_material.mainTexture?.MakeReadable();

                    // Change width of previw sprite for non-square decals and ensure preview is centred in window; use double multiplied by 100 to avoid bizarre rounding errors.
                    double widthRatio = 100d, heightRatio = 100d;
                    if (prop.m_material.mainTexture.width > prop.m_material.mainTexture.height)
                    {
                        // Wider than high.
                        heightRatio = ((prop.m_material.mainTexture.height * 100d) / prop.m_material.mainTexture.width);
                    }
                    if (prop.m_material.mainTexture.width < prop.m_material.mainTexture.height)
                    {
                        // Higher than wide.
                        widthRatio = ((prop.m_material.mainTexture.width * 100d) / prop.m_material.mainTexture.height);
                    }

                    // Set preview sprite size and centre in renderPanel.
                    previewSprite.width            = (float)((renderPanel.width * widthRatio) / 100d);
                    previewSprite.height           = (float)((renderPanel.height * heightRatio) / 100d);
                    previewSprite.relativePosition = new Vector2((renderPanel.width - previewSprite.width) / 2f, (renderPanel.height - previewSprite.height) / 2f);

                    // Treat this as a valid render.
                    validRender = true;
                }
                else
                {
                    // Not a decal - don't render anything without a mesh or material.
                    if (prop?.m_mesh != null && prop.m_material != null && !prop.m_mesh.name.Equals("none"))
                    {
                        // Set mesh and material for render.
                        renderer.Mesh     = prop.m_mesh;
                        renderer.Material = prop.m_material;

                        if (prop.m_material?.mainTexture == null)
                        {
                            if (prop.m_variations != null && prop.m_variations.Length > 0 && prop.m_variations[0].m_prop != null)
                            {
                                renderer.Mesh     = prop.m_variations[0].m_prop.m_mesh;
                                renderer.Material = prop.m_variations[0].m_prop.m_material;
                            }
                        }

                        // If the selected prop has colour variations, temporarily set the colour to the default for rendering.
                        if (prop.m_useColorVariations)
                        {
                            Color originalColor = prop.m_material.color;
                            prop.m_material.color = prop.m_color0;
                            renderer.Render();
                            prop.m_material.color = originalColor;
                        }
                        else
                        {
                            // No temporary colour change needed.
                            renderer.Render();
                        }

                        // We got a valid render; ensure preview sprite is square (decal previews can change width), set display texture, and set status flag.
                        previewSprite.relativePosition = Vector3.zero;
                        previewSprite.size             = renderPanel.size;
                        previewSprite.texture          = renderer.Texture;
                        validRender = true;
                    }
                    // If not a valid render, try to show thumbnail instead.
                    else if (prop.m_Atlas != null && !string.IsNullOrEmpty(prop.m_Thumbnail))
                    {
                        // Show thumbnail.
                        ShowThumbnail(prop.m_Atlas, prop.m_Thumbnail);

                        // All done here.
                        return;
                    }
                }
            }
            else if (renderPrefab is TreeInfo tree)
            {
                // Don't render anything without a mesh or material.
                if (tree?.m_mesh != null && tree.m_material != null)
                {
                    // Set mesh and material for render.
                    renderer.Mesh     = tree.m_mesh;
                    renderer.Material = tree.m_material;

                    // Render.
                    renderer.Render();

                    // We got a valid render; ensure preview sprite is square (decal previews can change width), set display texture, and set status flag.
                    previewSprite.relativePosition = Vector3.zero;
                    previewSprite.size             = renderPanel.size;
                    previewSprite.texture          = renderer.Texture;
                    validRender = true;
                }
                // If not a valid render, try to show thumbnail instead.
                else if (tree.m_Atlas != null && !string.IsNullOrEmpty(tree.m_Thumbnail))
                {
                    // Show thumbnail.
                    ShowThumbnail(tree.m_Atlas, tree.m_Thumbnail);

                    // All done here.
                    return;
                }
            }

            // Reset background if we didn't get a valid render.
            if (!validRender)
            {
                previewSprite.Hide();
                thumbnailSprite.Hide();
                noPreviewSprite.Show();
                return;
            }

            // If we got here, we should have a render; show it.
            noPreviewSprite.Hide();
            thumbnailSprite.Hide();
            previewSprite.Show();
        }