public void HandleKeyboard() { if (Event.current.keyCode == KeyCode.Alpha1) { brushType = BrushType.Brush1; } if (Event.current.keyCode == KeyCode.Alpha2) { brushType = BrushType.Brush3; } if (Event.current.keyCode == KeyCode.Alpha3) { brushType = BrushType.Brush5; } if (Event.current.keyCode == KeyCode.RightBracket) { brushType = (BrushType)((int)brushType < 2 ? (int)brushType + 1 : 0); } if (Event.current.keyCode == KeyCode.LeftBracket) { brushType = (BrushType)((int)brushType > 0 ? (int)brushType - 1 : 2); } if (Event.current.keyCode == KeyCode.RightArrow && (Event.current.control || Event.current.command) && Event.current.type == EventType.keyDown) { selection = null; selectionActive = false; ragePixelSprite.shiftCell(1, true); ragePixelSprite.refreshMesh(); animStripGUI.isDirty = true; Event.current.Use(); } if (Event.current.keyCode == KeyCode.LeftArrow && (Event.current.control || Event.current.command) && Event.current.type == EventType.keyDown) { selection = null; selectionActive = false; ragePixelSprite.shiftCell(-1, true); ragePixelSprite.refreshMesh(); animStripGUI.isDirty = true; Event.current.Use(); } if (Event.current.keyCode == KeyCode.Z && (Event.current.control || Event.current.command) && Event.current.alt && Event.current.type == EventType.keyDown) { DoPaintUndo(); animStripGUI.isDirty = true; spriteSheetGUI.isDirty = true; atlasTextureIsDirty = true; Event.current.Use(); } if (Event.current.keyCode == KeyCode.D && (Event.current.control || Event.current.command) && Event.current.alt && Event.current.type == EventType.keyDown && mode == Mode.Select) { backBuffer.PasteBitmap(selection.X, selection.Y, frontBuffer); animStripGUI.isDirty = true; spriteSheetGUI.isDirty = true; atlasTextureIsDirty = true; Event.current.Use(); } if (Event.current.keyCode == KeyCode.X && (Event.current.control || Event.current.command) && Event.current.alt && Event.current.type == EventType.keyDown && mode == Mode.Select) { SavePaintUndo(); RagePixelUtil.Settings.clipboard = new RagePixelBitmap(frontBuffer.pixels, frontBuffer.Width(), frontBuffer.Height()); selectionActive = false; Rect currentUV = ragePixelSprite.GetCurrentCell().uv; Rect selectionUV = new Rect( currentUV.xMin + (float)selection.X / (float)spritesheetTexture.width, currentUV.yMin + (float)selection.Y / (float)spritesheetTexture.height, (float)(selection.X2 - selection.X + 1) / (float)spritesheetTexture.width, (float)(selection.Y2 - selection.Y + 1) / (float)spritesheetTexture.height ); RagePixelUtil.clearPixels(spritesheetTexture, selectionUV); spritesheetTexture.Apply(); atlasTextureIsDirty = true; selection = null; Event.current.Use(); } if (Event.current.keyCode == KeyCode.C && (Event.current.control || Event.current.command) && Event.current.alt && Event.current.type == EventType.keyDown && mode == Mode.Select) { RagePixelUtil.Settings.clipboard = new RagePixelBitmap(frontBuffer.pixels, frontBuffer.Width(), frontBuffer.Height()); selection = null; selectionActive = false; Event.current.Use(); } if (Event.current.keyCode == KeyCode.V && (Event.current.control || Event.current.command) && Event.current.alt && Event.current.type == EventType.keyDown) { if (RagePixelUtil.Settings.clipboard != null) { mode = Mode.Select; SavePaintUndo(); Rect spriteUV = ragePixelSprite.GetCurrentCell().uv; selection = new RagePixelTexelRect( 0, 0, Mathf.Min(RagePixelUtil.Settings.clipboard.Width(), ragePixelSprite.GetCurrentRow().pixelSizeX), Mathf.Min(RagePixelUtil.Settings.clipboard.Height(), ragePixelSprite.GetCurrentRow().pixelSizeY) ); backBuffer = GrabSprite(spriteUV); frontBuffer = RagePixelUtil.Settings.clipboard; frontBufferPosition = new RagePixelTexel(0, 0); frontBufferDragStartPosition = new RagePixelTexel(0, 0); PasteBitmapToSpritesheetAlpha(frontBufferPosition, spriteUV, frontBuffer); selectionActive = true; spritesheetTexture.Apply(); Event.current.Use(); } } }
public RagePixelBitmap GrabRectFromSpritesheet(RagePixelTexelRect rect) { return new RagePixelBitmap( ragePixelSprite.spriteSheet.getImage( ragePixelSprite.GetCurrentRowIndex(), ragePixelSprite.GetCurrentCellIndex(), rect.X, rect.Y, rect.Width(), rect.Height() ), rect.Width(), rect.Height() ); }
public void CutRectInSpritesheet(RagePixelTexelRect rect, Rect spriteUV) { for (int y = rect.Y; y <= rect.Y2; y++) { for (int x = rect.X; x <= rect.X2; x++) { spritesheetTexture.SetPixel( (int)(spriteUV.x * spritesheetTexture.width) + x, (int)(spriteUV.y * spritesheetTexture.height) + y, new Color(0f, 0f, 0f, 0f) ); } } }
public override void OnInspectorGUI() { InvokeOnSelectedEvent(); GUILayout.Space(5f); if (ragePixelSprite.spriteSheet == null) { ragePixelSprite.spriteSheet = (RagePixelSpriteSheet)EditorGUILayout.ObjectField("Sprite Sheet", ragePixelSprite.spriteSheet, typeof(RagePixelSpriteSheet), false, null); if (ragePixelSprite.spriteSheet != null) { if (ragePixelSprite.currentRowKey == 0 || ragePixelSprite.currentCellKey == 0) { ragePixelSprite.currentRowKey = ragePixelSprite.spriteSheet.rows[0].key; ragePixelSprite.currentCellKey = ragePixelSprite.spriteSheet.rows[0].cells[0].key; } _spritesheetTexture = null; ragePixelSprite.meshIsDirty = true; ragePixelSprite.refreshMesh(); } } else if (!Application.isPlaying) { int spriteSheetGUIMargin = 7; RagePixelSpriteSheet oldSheet = ragePixelSprite.spriteSheet; ragePixelSprite.spriteSheet = (RagePixelSpriteSheet)EditorGUILayout.ObjectField( "Sprite sheet", ragePixelSprite.spriteSheet, typeof(RagePixelSpriteSheet), false ); if (ragePixelSprite.spriteSheet != null) { if (oldSheet != ragePixelSprite.spriteSheet) { if (ragePixelSprite.currentRowKey == 0 || ragePixelSprite.currentCellKey == 0) { ragePixelSprite.currentRowKey = ragePixelSprite.spriteSheet.rows[0].key; ragePixelSprite.currentCellKey = ragePixelSprite.spriteSheet.rows[0].cells[0].key; } _spritesheetTexture = null; ragePixelSprite.meshIsDirty = true; ragePixelSprite.refreshMesh(); } spriteSheetGUI.maxWidth = Screen.width - spriteSheetGUIMargin; spriteSheetGUI.spriteSheet = ragePixelSprite.spriteSheet; spriteSheetGUI.currentRowKey = ragePixelSprite.currentRowKey; animStripGUI.currentCellKey = ragePixelSprite.currentCellKey; RagePixelSprite.Mode oldMode = ragePixelSprite.mode; ragePixelSprite.mode = (RagePixelSprite.Mode)EditorGUILayout.EnumPopup( "Mode", ragePixelSprite.mode ); if (oldMode != ragePixelSprite.mode) { mode = Mode.Default; selection = null; selectionActive = false; ragePixelSprite.meshIsDirty = true; ragePixelSprite.refreshMesh(); ragePixelSprite.SnapToScale(); } if (ragePixelSprite.mode == RagePixelSprite.Mode.Grid9) { EditorGUI.indentLevel = 1; bool changed = GUI.changed; ragePixelSprite.grid9Left = Mathf.Max(Mathf.Min(EditorGUILayout.IntField("Left Margin", ragePixelSprite.grid9Left), ragePixelSprite.pixelSizeX - ragePixelSprite.grid9Right, ragePixelSprite.GetCurrentRow().pixelSizeX - ragePixelSprite.grid9Right - 1), 0); ragePixelSprite.grid9Top = Mathf.Max(Mathf.Min(EditorGUILayout.IntField("Top Margin", ragePixelSprite.grid9Top), ragePixelSprite.pixelSizeY - ragePixelSprite.grid9Bottom, ragePixelSprite.GetCurrentRow().pixelSizeY - ragePixelSprite.grid9Bottom - 1), 0); ragePixelSprite.grid9Right = Mathf.Max(Mathf.Min(EditorGUILayout.IntField("Right Margin", ragePixelSprite.grid9Right), ragePixelSprite.pixelSizeX - ragePixelSprite.grid9Left, ragePixelSprite.GetCurrentRow().pixelSizeX - ragePixelSprite.grid9Left - 1), 0); ragePixelSprite.grid9Bottom = Mathf.Max(Mathf.Min(EditorGUILayout.IntField("Bottom Margin", ragePixelSprite.grid9Bottom), ragePixelSprite.pixelSizeY - ragePixelSprite.grid9Top, ragePixelSprite.GetCurrentRow().pixelSizeY - ragePixelSprite.grid9Top - 1), 0); if (changed != GUI.changed) { ragePixelSprite.meshIsDirty = true; ragePixelSprite.refreshMesh(); } showGrid9Gizmo = EditorGUILayout.Toggle("Show Gizmos", showGrid9Gizmo); EditorGUI.indentLevel = 0; } RagePixelSprite.PivotMode oldPivotMode = ragePixelSprite.pivotMode; ragePixelSprite.pivotMode = (RagePixelSprite.PivotMode)EditorGUILayout.EnumPopup("Pivot", ragePixelSprite.pivotMode); if (oldPivotMode != ragePixelSprite.pivotMode) { ragePixelSprite.meshIsDirty = true; ragePixelSprite.refreshMesh(); ragePixelSprite.SnapToScale(); } Color oldColor = ragePixelSprite.tintColor; ragePixelSprite.tintColor = EditorGUILayout.ColorField("Tint Color", ragePixelSprite.tintColor); if (ragePixelSprite.tintColor != oldColor) { ragePixelSprite.vertexColorsAreDirty = true; ragePixelSprite.refreshMesh(); } ragePixelSprite.animationMode = (RagePixelSprite.AnimationMode)EditorGUILayout.EnumPopup("Animation Mode", ragePixelSprite.animationMode); ragePixelSprite.playAnimation = EditorGUILayout.Toggle("Play On Awake", ragePixelSprite.playAnimation); GUILayout.Space(7f); spriteSheetGUI.spriteSheet = ragePixelSprite.spriteSheet; spriteSheetGUI.currentRowKey = ragePixelSprite.currentRowKey; if (spriteSheetGUI.HandleGUIEvent(Event.current)) { ragePixelSprite.currentRowKey = spriteSheetGUI.currentRowKey; ragePixelSprite.currentCellKey = ragePixelSprite.spriteSheet.GetRow(ragePixelSprite.currentRowKey).cells[0].key; ragePixelSprite.pixelSizeX = ragePixelSprite.GetCurrentRow().pixelSizeX; ragePixelSprite.pixelSizeY = ragePixelSprite.GetCurrentRow().pixelSizeY; ragePixelSprite.meshIsDirty = true; ragePixelSprite.refreshMesh(); Repaint(); } spriteSheetGUI.positionX = spriteSheetGUIMargin; Rect spriteSheetR = EditorGUILayout.BeginVertical(); GUILayout.Space(spriteSheetGUI.pixelHeight); EditorGUI.DrawPreviewTexture( new Rect( spriteSheetGUIMargin, spriteSheetR.yMin, spriteSheetGUI.pixelWidth, spriteSheetR.height ), spriteSheetGUI.spriteSheetTexture); EditorGUILayout.EndVertical(); if ((int)spriteSheetR.yMin > 0) { spriteSheetGUI.positionY = (int)spriteSheetR.yMin; } Rect rButtons = EditorGUILayout.BeginVertical(); GUILayout.Space(defaultSceneButtonWidth + 5f); GUI.color = RagePixelGUIIcons.greenButtonColor; if (GUI.Button(new Rect(spriteSheetGUIMargin, rButtons.yMin + 2f, defaultSceneButtonWidth + 6f, defaultSceneButtonHeight), "NEW")) { int index = ragePixelSprite.spriteSheet.GetIndex(spriteSheetGUI.currentRowKey); RagePixelRow row = ragePixelSprite.spriteSheet.AddRow( RagePixelUtil.RandomKey(), index + 1, ragePixelSprite.GetCurrentRow().pixelSizeX, ragePixelSprite.GetCurrentRow().pixelSizeY ); RagePixelCell cell = row.InsertCell(0, RagePixelUtil.RandomKey()); ragePixelSprite.currentRowKey = row.key; ragePixelSprite.currentCellKey = cell.key; RagePixelUtil.RebuildAtlas(ragePixelSprite.spriteSheet, true, "AddRow"); atlasTextureIsDirty = true; } GUI.color = RagePixelGUIIcons.redButtonColor; if (GUI.Button(new Rect(spriteSheetGUIMargin + defaultSceneButtonWidth + 6f, rButtons.yMin + 2f, defaultSceneButtonWidth + 6f, defaultSceneButtonHeight), "DEL")) { if (ragePixelSprite.spriteSheet.rows.Length > 1) { if (EditorUtility.DisplayDialog("Delete selected sprite (no undo)?", "Are you sure?", "Delete", "Cancel")) { int index = ragePixelSprite.spriteSheet.GetIndex(spriteSheetGUI.currentRowKey); ragePixelSprite.spriteSheet.RemoveRowByKey(spriteSheetGUI.currentRowKey); ragePixelSprite.currentRowKey = ragePixelSprite.spriteSheet.rows[Mathf.Clamp(index, 0, ragePixelSprite.spriteSheet.rows.Length - 1)].key; ragePixelSprite.pixelSizeX = ragePixelSprite.GetCurrentRow().pixelSizeX; ragePixelSprite.pixelSizeY = ragePixelSprite.GetCurrentRow().pixelSizeY; RagePixelUtil.RebuildAtlas(ragePixelSprite.spriteSheet, false, "DeleteRow"); ragePixelSprite.currentCellKey = ragePixelSprite.GetCurrentRow().cells[0].key; ragePixelSprite.meshIsDirty = true; ragePixelSprite.refreshMesh(); atlasTextureIsDirty = true; } } else { EditorUtility.DisplayDialog("Cannot delete", "Cannot delete the last sprite.", "OK"); } } GUI.color = RagePixelGUIIcons.neutralButtonColor; if (GUI.Button(new Rect(spriteSheetGUIMargin + defaultSceneButtonWidth * 2f + 12f, rButtons.yMin + 2f, defaultSceneButtonWidth + 10f, defaultSceneButtonHeight), "EDIT")) { if (ragePixelSprite.spriteSheet != null) { RagePixelSpriteSheetEditorWindow editorWindow = ScriptableObject.CreateInstance(typeof(RagePixelSpriteSheetEditorWindow)) as RagePixelSpriteSheetEditorWindow; editorWindow.inspector = this; if (ragePixelSprite != null) { editorWindow.selectedSprite = ragePixelSprite; } editorWindow.title = "Spritesheet"; editorWindow.spriteSheet = ragePixelSprite.spriteSheet; editorWindow.Show(); } } EditorGUILayout.EndVertical(); GUI.color = Color.white; GUILayout.Space(7f); } } else { GUILayout.Space(5f); EditorUtility.SetSelectedWireframeHidden(meshRenderer, true); GUILayout.Label("Inspector GUI disabled in play mode"); GUILayout.Space(5f); } }
public void HandlePaintGUI() { int guiPosX = 5; int guiPosY = (int)(scenePixelHeight / 2f - defaultSceneButtonWidth * 5f * 0.5f); GUI.color = GetSceneButtonColor(mode == Mode.Default); if (GUI.Button(new Rect(guiPosX, guiPosY, defaultSceneButtonWidth, defaultSceneButtonWidth), RagePixelGUIIcons.Cursor)) { selection = null; selectionActive = false; paintColorPickerGUI.gizmoVisible = false; mode = Mode.Default; Tools.current = Tool.Move; } GUI.color = GetSceneButtonColor(mode == Mode.Pen); if (GUI.Button(new Rect(guiPosX, guiPosY += defaultSceneButtonHeight, defaultSceneButtonWidth, defaultSceneButtonWidth), RagePixelGUIIcons.Pen)) { selection = null; selectionActive = false; paintColorPickerGUI.gizmoVisible = true; mode = Mode.Pen; Tools.current = Tool.None; } if (mode == Mode.Pen) { GUI.color = GetSceneButtonColor(brushType == BrushType.Brush1); if (GUI.Button(new Rect(guiPosX + defaultSceneButtonWidth + 2, guiPosY, 9, 8), "")) { brushType = BrushType.Brush1; } GUI.color = GetSceneButtonColor(brushType == BrushType.Brush3); if (GUI.Button(new Rect(guiPosX + defaultSceneButtonWidth + 2, guiPosY + 10, 12, 10), "")) { brushType = BrushType.Brush3; } GUI.color = GetSceneButtonColor(brushType == BrushType.Brush5); if (GUI.Button(new Rect(guiPosX + defaultSceneButtonWidth + 2, guiPosY + 20, 15, 12), "")) { brushType = BrushType.Brush5; } } GUI.color = GetSceneButtonColor(mode == Mode.Fill); if (GUI.Button(new Rect(guiPosX, guiPosY += defaultSceneButtonWidth, defaultSceneButtonWidth, defaultSceneButtonWidth), RagePixelGUIIcons.Fill)) { selection = null; selectionActive = false; paintColorPickerGUI.gizmoVisible = true; mode = Mode.Fill; Tools.current = Tool.None; } GUI.color = GetSceneButtonColor(mode == Mode.Select); if (ragePixelSprite.mode == RagePixelSprite.Mode.Grid9) { GUI.color = new Color(1f, 1f, 1f, 0.1f); } if (GUI.Button(new Rect(guiPosX, guiPosY += defaultSceneButtonWidth, defaultSceneButtonWidth, defaultSceneButtonWidth), RagePixelGUIIcons.Select) && ragePixelSprite.mode != RagePixelSprite.Mode.Grid9) { selection = null; selectionActive = false; mode = Mode.Select; Tools.current = Tool.None; } GUI.color = GetSceneButtonColor(mode == Mode.Resize); if (ragePixelSprite.mode == RagePixelSprite.Mode.Grid9) { GUI.color = new Color(1f, 1f, 1f, 0.1f); } if (GUI.Button(new Rect(guiPosX, guiPosY += defaultSceneButtonWidth, defaultSceneButtonWidth, defaultSceneButtonWidth), RagePixelGUIIcons.Resize) && ragePixelSprite.mode != RagePixelSprite.Mode.Grid9) { ragePixelSprite.SnapToScale(); selection = null; selectionActive = false; mode = Mode.Resize; Tools.current = Tool.None; } }
public void HandleModeSelect() { if (Event.current.type == EventType.mouseDown || Event.current.type == EventType.mouseDrag || Event.current.type == EventType.mouseUp) { Vector3 mouseWorldPosition = sceneScreenToWorldPoint(Event.current.mousePosition); RagePixelTexel texel = WorldToTexelCoords(spritesheetTexture, ragePixelSprite.transform, mouseWorldPosition); int spriteWidth = ragePixelSprite.GetCurrentRow().pixelSizeX; int spriteHeight = ragePixelSprite.GetCurrentRow().pixelSizeY; if (texel.X >= 0 && texel.X < spriteWidth && texel.Y >= 0 && texel.Y < spriteHeight) { if (Event.current.type == EventType.mouseDown) { if (Event.current.button == 0) { if (selection == null) { selectionActive = false; selectionStart = texel; selection = new RagePixelTexelRect(texel.X, texel.Y, texel.X, texel.Y); } else { if (texel.X < frontBufferPosition.X || texel.Y < frontBufferPosition.Y || texel.X > frontBufferPosition.X + selection.Width() || texel.Y > frontBufferPosition.Y + selection.Height()) { selectionActive = false; selectionStart = texel; selection = new RagePixelTexelRect(texel.X, texel.Y, texel.X, texel.Y); } else { frontBufferDragStartMousePosition = texel; frontBufferDragStartPosition = frontBufferPosition; } } } } if (Event.current.type == EventType.mouseDrag) { if (selectionActive) { RagePixelTexel movement = new RagePixelTexel(texel.X - frontBufferDragStartMousePosition.X, texel.Y - frontBufferDragStartMousePosition.Y); frontBufferPosition = new RagePixelTexel(frontBufferDragStartPosition.X + movement.X, frontBufferDragStartPosition.Y + movement.Y); Rect spriteUV = ragePixelSprite.GetCurrentCell().uv; PasteBitmapToSpritesheet(new RagePixelTexel(0, 0), spriteUV, backBuffer); PasteBitmapToSpritesheetAlpha(frontBufferPosition, spriteUV, frontBuffer); spritesheetTexture.Apply(); } else { selection = new RagePixelTexelRect(selectionStart.X, selectionStart.Y, texel.X, texel.Y); } } if (Event.current.type == EventType.mouseUp && !selectionActive) { if (selection.Width() > 1 || selection.Height() > 1) { SavePaintUndo(); Rect spriteUV = ragePixelSprite.GetCurrentCell().uv; frontBuffer = GrabRectFromSpritesheet(selection); CutRectInSpritesheet(selection, spriteUV); backBuffer = GrabSprite(spriteUV); frontBufferPosition = new RagePixelTexel(selection.X, selection.Y); frontBufferDragStartPosition = new RagePixelTexel(selection.X, selection.Y); PasteBitmapToSpritesheetAlpha(frontBufferPosition, spriteUV, frontBuffer); selectionActive = true; spritesheetTexture.Apply(); } else { selection = null; selectionActive = false; } } if (selectionActive && Event.current.type == EventType.mouseUp) { spritesheetTexture.Apply(); atlasTextureIsDirty = true; } } else { if (Event.current.type != EventType.mouseDrag) { mode = Mode.Default; } } if (Event.current.type != EventType.mouseUp) { Event.current.Use(); } } }