コード例 #1
0
        private static void RuleInspectorOnGUI(Rect rect, OsnowaTile.TilingRule tilingRule)
        {
            float y = rect.yMin;

            EditorGUI.BeginChangeCheck();
            GUI.Label(new Rect(rect.xMin, y, k_LabelWidth, k_SingleLineHeight), "Rule");
            tilingRule.m_RuleTransform = (OsnowaTile.TilingRule.Transform)EditorGUI.EnumPopup(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_RuleTransform);
            y += k_SingleLineHeight;
            GUI.Label(new Rect(rect.xMin, y, k_LabelWidth, k_SingleLineHeight), "Collider");
            tilingRule.m_ColliderType = (Tile.ColliderType)EditorGUI.EnumPopup(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_ColliderType);
            y += k_SingleLineHeight;
            GUI.Label(new Rect(rect.xMin, y, k_LabelWidth, k_SingleLineHeight), "Output");
            tilingRule.m_Output = (OsnowaTile.TilingRule.OutputSprite)EditorGUI.EnumPopup(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_Output);
            y += k_SingleLineHeight;

            if (tilingRule.m_Output == OsnowaTile.TilingRule.OutputSprite.Animation)
            {
                GUI.Label(new Rect(rect.xMin, y, k_LabelWidth, k_SingleLineHeight), "Speed");
                tilingRule.m_AnimationSpeed = EditorGUI.FloatField(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_AnimationSpeed);
                y += k_SingleLineHeight;
            }
            if (tilingRule.m_Output == OsnowaTile.TilingRule.OutputSprite.Random)
            {
                GUI.Label(new Rect(rect.xMin, y, k_LabelWidth, k_SingleLineHeight), "Noise");
                tilingRule.m_PerlinScale = EditorGUI.Slider(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_PerlinScale, 0.001f, 0.999f);
                y += k_SingleLineHeight;

                GUI.Label(new Rect(rect.xMin, y, k_LabelWidth, k_SingleLineHeight), "Shuffle");
                tilingRule.m_RandomTransform = (OsnowaTile.TilingRule.Transform)EditorGUI.EnumPopup(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_RandomTransform);
                y += k_SingleLineHeight;
            }

            if (tilingRule.m_Output != OsnowaTile.TilingRule.OutputSprite.Single)
            {
                GUI.Label(new Rect(rect.xMin, y, k_LabelWidth, k_SingleLineHeight), "Size");
                EditorGUI.BeginChangeCheck();
                int newLength = EditorGUI.DelayedIntField(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_Sprites.Length);
                if (EditorGUI.EndChangeCheck())
                {
                    Array.Resize(ref tilingRule.m_Sprites, Math.Max(newLength, 1));
                }
                y += k_SingleLineHeight;

                for (int i = 0; i < tilingRule.m_Sprites.Length; i++)
                {
                    tilingRule.m_Sprites[i] = EditorGUI.ObjectField(new Rect(rect.xMin + k_LabelWidth, y, rect.width - k_LabelWidth, k_SingleLineHeight), tilingRule.m_Sprites[i], typeof(Sprite), false) as Sprite;
                    y += k_SingleLineHeight;
                }
            }
        }
コード例 #2
0
        private void AddRuleForSprite(int[] sides, int i, Sprite[] sprites, int amountOfAdditionalCentralSprites)
        {
            int matchingPattern = sides[i];

            if (matchingPattern == 0)
            {
                return;
            }
            OsnowaTile.TilingRule rule = new OsnowaTile.TilingRule {
                m_Sprites = { [0] = sprites[i] }
            };
            char[] patternDigits = matchingPattern.ToString().ToCharArray();

            string centralSpriteSides = "78946123";
            bool   isCentral          = centralSpriteSides.All(d => patternDigits.Contains(d));

            if (isCentral)
            {
                EditedTile.m_DefaultSprite = sprites[i];
                rule.m_Sprites             = new Sprite[1 + amountOfAdditionalCentralSprites];
                rule.m_Sprites[0]          = sprites[i];
                if (amountOfAdditionalCentralSprites > 0)
                {
                    rule.m_Output          = OsnowaTile.TilingRule.OutputSprite.Random;
                    rule.m_RandomTransform = OsnowaTile.TilingRule.Transform.MirrorX;
                }
            }

            SetNeighborForCornerIfNeeded(patternDigits, '7', 0, '4', '8', rule);
            SetNeighborForCornerIfNeeded(patternDigits, '9', 2, '6', '8', rule);
            SetNeighborForCornerIfNeeded(patternDigits, '1', 5, '4', '2', rule);
            SetNeighborForCornerIfNeeded(patternDigits, '3', 7, '2', '6', rule);

            rule.m_Neighbors[1] = patternDigits.Contains('8')
                                ? OsnowaTile.TilingRule.Neighbor.This
                                : OsnowaTile.TilingRule.Neighbor.NotThis;
            rule.m_Neighbors[3] = patternDigits.Contains('4')
                                ? OsnowaTile.TilingRule.Neighbor.This
                                : OsnowaTile.TilingRule.Neighbor.NotThis;
            rule.m_Neighbors[4] = patternDigits.Contains('6')
                                ? OsnowaTile.TilingRule.Neighbor.This
                                : OsnowaTile.TilingRule.Neighbor.NotThis;
            rule.m_Neighbors[6] = patternDigits.Contains('2')
                                ? OsnowaTile.TilingRule.Neighbor.This
                                : OsnowaTile.TilingRule.Neighbor.NotThis;

            EditedTile.m_TilingRules.Add(rule);
        }
コード例 #3
0
        private void OnDrawElement(Rect rect, int index, bool isactive, bool isfocused)
        {
            OsnowaTile.TilingRule rule = EditedTile.m_TilingRules[index];

            float yPos        = rect.yMin + 2f;
            float height      = rect.height - k_PaddingBetweenRules;
            float matrixWidth = k_DefaultElementHeight;

            Rect inspectorRect = new Rect(rect.xMin, yPos, rect.width - matrixWidth * 2f - 20f, height);
            Rect matrixRect    = new Rect(rect.xMax - matrixWidth * 2f - 10f, yPos, matrixWidth, k_DefaultElementHeight);
            Rect spriteRect    = new Rect(rect.xMax - matrixWidth - 5f, yPos, matrixWidth, k_DefaultElementHeight);

            EditorGUI.BeginChangeCheck();
            RuleInspectorOnGUI(inspectorRect, rule);
            RuleMatrixOnGUI(matrixRect, rule);
            SpriteOnGUI(spriteRect, rule);
            if (EditorGUI.EndChangeCheck())
            {
                SaveTile();
            }
        }
コード例 #4
0
 private void SpriteOnGUI(Rect rect, OsnowaTile.TilingRule tilingRule)
 {
     tilingRule.m_Sprites[0] = EditorGUI.ObjectField(new Rect(rect.xMax - rect.height, rect.yMin, rect.height, rect.height), tilingRule.m_Sprites[0], typeof(Sprite), false) as Sprite;
 }
コード例 #5
0
 public MenuItemData(OsnowaTile.TilingRule mRule, OsnowaTile.TilingRule.Transform mNewValue)
 {
     this.m_Rule     = mRule;
     this.m_NewValue = mNewValue;
 }
コード例 #6
0
        private static void RuleMatrixOnGUI(Rect rect, OsnowaTile.TilingRule tilingRule)
        {
            Handles.color = EditorGUIUtility.isProSkin ? new Color(1f, 1f, 1f, 0.2f) : new Color(0f, 0f, 0f, 0.2f);
            int   index = 0;
            float w     = rect.width / 3f;
            float h     = rect.height / 3f;

            for (int y = 0; y <= 3; y++)
            {
                float top = rect.yMin + y * h;
                Handles.DrawLine(new Vector3(rect.xMin, top), new Vector3(rect.xMax, top));
            }
            for (int x = 0; x <= 3; x++)
            {
                float left = rect.xMin + x * w;
                Handles.DrawLine(new Vector3(left, rect.yMin), new Vector3(left, rect.yMax));
            }
            Handles.color = Color.white;

            for (int y = 0; y <= 2; y++)
            {
                for (int x = 0; x <= 2; x++)
                {
                    Rect r = new Rect(rect.xMin + x * w, rect.yMin + y * h, w - 1, h - 1);
                    if (x != 1 || y != 1)
                    {
                        switch (tilingRule.m_Neighbors[index])
                        {
                        case OsnowaTile.TilingRule.Neighbor.This:
                            GUI.DrawTexture(r, arrows[y * 3 + x]);
                            break;

                        case OsnowaTile.TilingRule.Neighbor.NotThis:
                            GUI.DrawTexture(r, arrows[9]);
                            break;
                        }
                        if (Event.current.type == EventType.MouseDown && r.Contains(Event.current.mousePosition))
                        {
                            tilingRule.m_Neighbors[index] = (OsnowaTile.TilingRule.Neighbor)(((int)tilingRule.m_Neighbors[index] + 1) % 3);
                            GUI.changed = true;
                            Event.current.Use();
                        }

                        index++;
                    }
                    else
                    {
                        switch (tilingRule.m_RuleTransform)
                        {
                        case OsnowaTile.TilingRule.Transform.Rotated:
                            GUI.DrawTexture(r, autoTransforms[0]);
                            break;

                        case OsnowaTile.TilingRule.Transform.MirrorX:
                            GUI.DrawTexture(r, autoTransforms[1]);
                            break;

                        case OsnowaTile.TilingRule.Transform.MirrorY:
                            GUI.DrawTexture(r, autoTransforms[2]);
                            break;
                        }

                        if (Event.current.type == EventType.MouseDown && r.Contains(Event.current.mousePosition))
                        {
                            tilingRule.m_RuleTransform = (OsnowaTile.TilingRule.Transform)(((int)tilingRule.m_RuleTransform + 1) % 4);
                            GUI.changed = true;
                            Event.current.Use();
                        }
                    }
                }
            }
        }
コード例 #7
0
 private static void SetNeighborForCornerIfNeeded(char[] patternDigits, char probed, int probedIndex, char firstNeeded, char secondNeeded, OsnowaTile.TilingRule rule)
 {
     if (patternDigits.Contains(firstNeeded) && patternDigits.Contains(secondNeeded))
     {
         rule.m_Neighbors[probedIndex] = patternDigits.Contains(probed)
                                 ? OsnowaTile.TilingRule.Neighbor.This
                                 : OsnowaTile.TilingRule.Neighbor.NotThis;
     }
 }
コード例 #8
0
 private void AddToRandomRuleForCenter(int additionalSpriteIndex, Sprite sprite, OsnowaTile.TilingRule randomRuleForCenter)
 {
     randomRuleForCenter.m_Sprites[1 + additionalSpriteIndex] = sprite;
 }