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; } } }
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); }
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(); } }
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; }
public MenuItemData(OsnowaTile.TilingRule mRule, OsnowaTile.TilingRule.Transform mNewValue) { this.m_Rule = mRule; this.m_NewValue = mNewValue; }
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(); } } } } }
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; } }
private void AddToRandomRuleForCenter(int additionalSpriteIndex, Sprite sprite, OsnowaTile.TilingRule randomRuleForCenter) { randomRuleForCenter.m_Sprites[1 + additionalSpriteIndex] = sprite; }