Пример #1
0
        /// <summary>
        /// Remap specified source material to the target material.
        /// </summary>
        /// <param name="mappings">Material mappings.</param>
        /// <param name="from">Source material.</param>
        /// <returns>
        /// The remapped material; or source material when no mapping was found or no
        /// target material was specified.
        /// </returns>
        public static Material RemapMaterial(this IMaterialMappings mappings, Material from)
        {
            if (mappings.MaterialMappingFrom == null || mappings.MaterialMappingTo == null)
            {
                return(from);
            }

            int index = Array.IndexOf(mappings.MaterialMappingFrom, from);

            return(index >= 0 && index < mappings.MaterialMappingTo.Length
                ? mappings.MaterialMappingTo[index]
                : from);
        }
Пример #2
0
        public BrushDesignerMaterialMapper(BrushDesignerView designer)
        {
            this.brush    = designer.Brush;
            this.mappings = designer.Brush as IMaterialMappings;

            if (this.mappings.MaterialMappingFrom == null)
            {
                this.mappings.MaterialMappingFrom = new Material[0];
            }
            if (this.mappings.MaterialMappingTo == null)
            {
                this.mappings.MaterialMappingTo = new Material[0];
            }

            // Prepare material preview style.
            this.materialPreviewStyle             = new GUIStyle(GUI.skin.box);
            this.materialPreviewStyle.fixedHeight = this.materialPreviewStyle.fixedWidth = 114;
        }
Пример #3
0
        /// <exclude/>
        public static void DrawNow(Material previewMaterial, Transform obj, Matrix4x4 matrix, IMaterialMappings materialMappings)
        {
            Matrix4x4 modelMatrix;
            Matrix4x4 inversePrefabMatrix = matrix * obj.localToWorldMatrix.inverse;

            try {
                s_DrawNowRendererComponents.Clear();
                obj.GetComponentsInChildren <Renderer>(true, s_DrawNowRendererComponents);

                foreach (var renderer in s_DrawNowRendererComponents)
                {
                    // Skip inactive renderers!
                    if (!renderer.enabled)
                    {
                        continue;
                    }

                    // Calculate model matrix for tile preview.
                    Transform subObject = renderer.transform;
                    if (subObject != obj)
                    {
                        modelMatrix = inversePrefabMatrix * subObject.localToWorldMatrix;
                    }
                    else
                    {
                        modelMatrix = matrix;
                    }

                    // Attempt to render preview!
                    var spriteRenderer = renderer as SpriteRenderer;
                    if (spriteRenderer != null)
                    {
                        DrawNow(previewMaterial, spriteRenderer, modelMatrix);
                        continue;
                    }

                    var mesh = SharedMeshFromRenderer(renderer);
                    if (mesh == null)
                    {
                        continue;
                    }

                    DrawNow(previewMaterial, mesh, renderer, materialMappings, modelMatrix);
                }
            }
            finally {
                s_DrawNowRendererComponents.Clear();
            }
        }
Пример #4
0
        /// <exclude/>
        public static void DrawNow(Material previewMaterial, Mesh mesh, Renderer renderer, IMaterialMappings materialMappings, Matrix4x4 matrix)
        {
            if (renderer == null || !renderer.enabled)
            {
                return;
            }

            Material[] materials = renderer.sharedMaterials;
            if (materials == null)
            {
                return;
            }

            for (int submesh = 0; submesh < materials.Length; ++submesh)
            {
                // Remap material?
                var m = materials[submesh];
                if (materialMappings != null)
                {
                    m = materialMappings.RemapMaterial(m);
                }

                // Use preview material when specified; otherwise just use material from renderer.
                if (previewMaterial != null)
                {
                    previewMaterial.mainTexture = m.mainTexture;
                    m = previewMaterial;
                }

                int passCount = m.passCount;
                for (int pass = 0; pass < passCount; ++pass)
                {
                    m.SetPass(pass);
                    Graphics.DrawMeshNow(mesh, matrix, submesh);
                }
            }
        }
Пример #5
0
    /// <summary>
    /// Copies common brush properties from v1.x brush to v2.x brush.
    /// </summary>
    /// <remarks>
    /// <para>Also copies material mappings and filters materials to use the
    /// material assets provided by v2.x where possible.</para>
    /// </remarks>
    /// <param name="newBrush">The new brush.</param>
    /// <param name="oldBrush">The old brush.</param>
    private void CopyCommonBrushProperties(Brush newBrush, MonoBehaviour oldBrush)
    {
        newBrush.visibility = (bool)_fiTileBrush_hideBrush.GetValue(oldBrush)
                        ? BrushVisibility.Hidden
                        : BrushVisibility.Shown;
        newBrush.group = (int)_fiTileBrush_tileGroup.GetValue(oldBrush);

        if (_fiTileBrush_overrideTag != null)
        {
            newBrush.overrideTag = (bool)_fiTileBrush_overrideTag.GetValue(oldBrush);
        }
        newBrush.tag = oldBrush.gameObject.tag;
        if (_fiTileBrush_overrideLayer != null)
        {
            newBrush.overrideLayer = (bool)_fiTileBrush_overrideLayer.GetValue(oldBrush);
        }
        newBrush.layer = oldBrush.gameObject.layer;

        if (_fiTileBrush_category != null)
        {
            newBrush.category = (int)_fiTileBrush_category.GetValue(oldBrush);
        }

        newBrush.applyPrefabTransform = (bool)_fiTileBrush_applyPrefabTransform.GetValue(oldBrush);

        if (_fiTileBrush_scaleMode != null)
        {
            newBrush.scaleMode = (Rotorz.Tile.ScaleMode)_fiTileBrush_scaleMode.GetValue(oldBrush);
        }
        newBrush.transformScale = oldBrush.transform.localScale;

        newBrush.Static = oldBrush.gameObject.isStatic;
        newBrush.Smooth = (bool)_fiTileBrush_smooth.GetValue(oldBrush);

        if (_fiTileBrush_userFlags != null)
        {
            _fiBrush_userFlags.SetValue(newBrush, _fiTileBrush_userFlags.GetValue(oldBrush));
        }

        // Copy material mappings if applicable.
        // Note: Material mappings do not apply to all types of brush.
        IMaterialMappings materialMappings = newBrush as IMaterialMappings;

        if (materialMappings != null)
        {
            Material[] materialsFrom = (Material[])_fiTileBrush_materialMapFrom.GetValue(oldBrush);
            Material[] materialsTo   = (Material[])_fiTileBrush_materialMapTo.GetValue(oldBrush);

            // Use the new default material asset instead of the old one.
            for (int i = 0; i < materialsFrom.Length; ++i)
            {
                materialsFrom[i] = FilterMaterial(materialsFrom[i]);
            }

            // Use the new Cave and Grass material assets instead of the old ones.
            for (int i = 0; i < materialsTo.Length; ++i)
            {
                materialsTo[i] = FilterMaterial(materialsTo[i]);
            }

            materialMappings.MaterialMappingFrom = materialsFrom;
            materialMappings.MaterialMappingTo   = materialsTo;
        }
    }