Pārlūkot izejas kodu

Updated project to work with the latest version of Godot. Reworked the code so it is cleaner and easier to understand. Updated comments within code according to changes

TwistedTwigleg 6 gadi atpakaļ
vecāks
revīzija
7ad43829ef

+ 0 - 26
2d/gd_paint/PaintBrushData.gd

@@ -1,26 +0,0 @@
-extends Reference
-
-# The type of brush this brush object is. There are only four types:
-# 'pencil', 'eraser', 'rectangle shape' and 'circle shape'
-var brush_type = "pencil"
-
-# The position of the brush, generally the center of the brush (see Paint_control.gd)
-var brush_pos = Vector2()
-
-# the shape of the brush (only applies to the pencil and eraser)
-# It can be either 'box' or 'circle'
-var brush_shape = "box"
-
-# the size (in pixels) of the brush
-var brush_size = 32
-
-# the color of the brush
-var brush_color = Color(1, 1, 1, 1)
-
-# The bottom right corner of the rectangle shape (if the brush type is 'rectangle shape')
-# NOTE: The top left corner is assumed to be assigned to brush_pos
-var brush_shape_rect_pos_BR = Vector2()
-
-# The radius of the circle shape (if the brush type is 'circle shape')
-# NOTE: It's assumed that brush_pos is the center of the the circle
-var brush_shape_circle_radius = 0

+ 78 - 79
2d/gd_paint/PaintControl.gd

@@ -3,8 +3,8 @@ extends Control
 # The TL position of the canvas
 var TL_node
 
-# A list to hold all of the brushes (called elements here to help distinguish it from the other variables)
-var draw_elements_list = []
+# A list to hold all of the dictionaries that make up each brush.
+var brush_data_list = []
 
 # A boolean to hold whether or not the mouse is inside the drawing area, the mouse position last _process call
 # and the position of the mouse when the left mouse button was pressed
@@ -23,14 +23,19 @@ const UNDO_MODE_SHAPE = -2
 # A constant for whether or not we can undo
 const UNDO_NONE = -1
 
-# The brush_data object. This class just holds all of the data we need for any brush
-var brush_data = preload("res://PaintBrushData.gd")
+# Enums for the various modes and brush shapes that can be applied
+enum BRUSH_MODES {
+	pencil, eraser, circle_shape, rectangle_shape
+}
+enum BRUSH_SHAPES {
+	rectangle, circle
+}
 
 # The current brush settings: The mode, size, color, and shape we have currently selected
-var brush_mode = "pencil"
+var brush_mode = BRUSH_MODES.pencil
 var brush_size = 32
 var brush_color = Color(1, 1, 1, 1)
-var brush_shape = "circle"
+var brush_shape = BRUSH_SHAPES.circle;
 
 # The color of the background. We need this for the eraser (see the how we handle the eraser
 # in the _draw function for more details)
@@ -47,56 +52,51 @@ func _ready():
 
 
 func _process(delta):
-
 	var mouse_pos = get_viewport().get_mouse_position()
-
+	
 	# Check if the mouse is currently inside the canvas/drawing-area
 	is_mouse_in_drawing_area = false
 	if mouse_pos.x > TL_node.global_position.x:
 		if mouse_pos.y > TL_node.global_position.y:
 			is_mouse_in_drawing_area = true
-
-
+	
 	if Input.is_mouse_button_pressed(BUTTON_LEFT):
-
 		# If we do not have a position for when the mouse was first clicked, then this most
 		# be the first time is_mouse_button_pressed has been called since the mouse button was
 		# released, so we need to store the position
 		if mouse_click_start_pos == null:
 			mouse_click_start_pos = mouse_pos
-
+		
 		# If the mouse is inside the canvas and the mouse is 1px away from the position of the mouse last _process call
 		if check_if_mouse_is_inside_canvas():
 			if mouse_pos.distance_to(last_mouse_pos) >= 1:
 				# If we are in pencil or eraser mode, then we need to draw
-				if brush_mode == "pencil" or brush_mode == "eraser":
+				if brush_mode == BRUSH_MODES.pencil or brush_mode == BRUSH_MODES.eraser:
 					# If undo has not been set, meaning we've started a new stroke, then store the size of the
 					# draw_elements_list so we can undo from this point in time
 					if undo_set == false:
 						undo_set = true
-						undo_element_list_num = draw_elements_list.size()
-
+						undo_element_list_num = brush_data_list.size()
 					# Add the brush object to draw_elements_array
 					add_brush(mouse_pos, brush_mode)
-
+	
 	else:
 		# We've finished our stroke, so we can set a new undo (if a new storke is made)
 		undo_set = false
-
+		
 		# If the mouse is inside the canvas
 		if check_if_mouse_is_inside_canvas():
 			# If we're using either the circle shape mode, or the rectangle shape mode, then
 			# add the brush object to draw_elements_array
-			if brush_mode == "circle shape" or brush_mode == "rectangle shape":
+			if brush_mode == BRUSH_MODES.circle_shape or brush_mode == BRUSH_MODES.rectangle_shape:
 				add_brush(mouse_pos, brush_mode)
 				# We handle undo's differently than either pencil or eraser mode, so we need to set undo
 				# element_list_num to -2 so we can tell if we need to undo a shape. See undo_stroke for details
 				undo_element_list_num = UNDO_MODE_SHAPE
-
 		# Since we've released the left mouse, we need to get a new mouse_click_start_pos next time
 		#is_mouse_button_pressed is true.
 		mouse_click_start_pos = null
-
+	
 	# Store mouse_pos as last_mouse_pos now that we're done with _process
 	last_mouse_pos = mouse_pos
 
@@ -107,10 +107,11 @@ func check_if_mouse_is_inside_canvas():
 		# Make sure the mouse click starting position is inside the canvas.
 		# This is so if we start out click outside the canvas (say chosing a color from the color picker)
 		# and then move our mouse back into the canvas, it won't start painting
-		if mouse_click_start_pos.x > TL_node.global_position.x and mouse_click_start_pos.y > TL_node.global_position.y:
-			# Make sure the current mouse position is inside the canvas
-			if is_mouse_in_drawing_area == true:
-				return true
+		if mouse_click_start_pos.x > TL_node.global_position.x:
+			if mouse_click_start_pos.y > TL_node.global_position.y:
+				# Make sure the current mouse position is inside the canvas
+				if is_mouse_in_drawing_area == true:
+					return true
 	return false
 
 
@@ -118,25 +119,25 @@ func undo_stroke():
 	# Only undo a stroke if we have one
 	if undo_element_list_num == UNDO_NONE:
 		return
-
+	
 	# If we are undoing a shape, then we can just remove the latest brush
 	if undo_element_list_num == UNDO_MODE_SHAPE:
-		if draw_elements_list.size() > 0:
-			draw_elements_list.remove(draw_elements_list.size() - 1)
-
+		if brush_data_list.size() > 0:
+			brush_data_list.remove(brush_data_list.size() - 1)
+		
 		# Now that we've undone a shape, we cannot undo again until another stoke is added
 		undo_element_list_num = UNDO_NONE
 		# NOTE: if we only had shape brushes, then we could remove the above line and could let the user
 		# undo until we have a empty element list
-
+	
 	# Otherwise we're removing a either a pencil stroke or a eraser stroke.
 	else:
 		# Figure out how many elements/brushes we've added in the last stroke
-		var elements_to_remove = draw_elements_list.size() - undo_element_list_num
+		var elements_to_remove = brush_data_list.size() - undo_element_list_num
 		# Remove all of the elements we've added this in the last stroke
 		for elment_num in range(0, elements_to_remove):
-			draw_elements_list.pop_back()
-
+			brush_data_list.pop_back()
+		
 		# Now that we've undone a stoke, we cannot undo again until another stoke is added
 		undo_element_list_num = UNDO_NONE
 
@@ -145,23 +146,23 @@ func undo_stroke():
 
 
 func add_brush(mouse_pos, type):
-
-	# Make new brush object
-	var brush = brush_data.new()
-
-	# Assign all of the values based on our global brush settings variables
-	brush.brush_type = type
-	brush.brush_pos = mouse_pos
-	brush.brush_shape = brush_shape
-	brush.brush_size = brush_size
-	brush.brush_color = brush_color
-
-	# If the bursh is a rectangle shape, we need to calculate the top left corner of the rectangle and the
+	# Make new brush dictionary that will hold all of the data we need for the brush.
+	var new_brush = {}
+	
+	# Populate the dictionary with values based on the global brush variables.
+	# We will override these as needed if the brush is a rectange or circle.
+	new_brush.brush_type = type
+	new_brush.brush_pos = mouse_pos
+	new_brush.brush_shape = brush_shape
+	new_brush.brush_size = brush_size
+	new_brush.brush_color = brush_color
+	
+	# If the new bursh is a rectangle shape, we need to calculate the top left corner of the rectangle and the
 	# bottom right corner of the rectangle
-	if type == "rectangle shape":
+	if type == BRUSH_MODES.rectangle_shape:
 		var TL_pos = Vector2()
 		var BR_pos = Vector2()
-
+		
 		# Figure out the left and right positions of the corners and assign them to the proper variable
 		if mouse_pos.x < mouse_click_start_pos.x:
 			TL_pos.x = mouse_pos.x
@@ -169,7 +170,7 @@ func add_brush(mouse_pos, type):
 		else:
 			TL_pos.x = mouse_click_start_pos.x
 			BR_pos.x = mouse_pos.x
-
+		
 		# Figure out the top and bottom positions of the corners and assign them to the proper variable
 		if mouse_pos.y < mouse_click_start_pos.y:
 			TL_pos.y = mouse_pos.y
@@ -177,85 +178,83 @@ func add_brush(mouse_pos, type):
 		else:
 			TL_pos.y = mouse_click_start_pos.y
 			BR_pos.y = mouse_pos.y
-
+		
 		# Assign the positions to the brush
-		brush.brush_pos = TL_pos
-		brush.brush_shape_rect_pos_BR = BR_pos
-
+		new_brush.brush_pos = TL_pos
+		new_brush.brush_shape_rect_pos_BR = BR_pos
+	
 	# If the brush isa circle shape, then we need to calculate the radius of the circle
-	if type == "circle shape":
+	if type == BRUSH_MODES.circle_shape:
 		# Get the center point inbetween the mouse position and the position of the mouse when we clicked
 		var center_pos = Vector2((mouse_pos.x + mouse_click_start_pos.x) / 2, (mouse_pos.y + mouse_click_start_pos.y) / 2)
 		# Assign the brush position to the center point, and calculate the radius of the circle using the distance from
 		# the center to the top/bottom positon of the mouse
-		brush.brush_pos = center_pos
-		brush.brush_shape_circle_radius = center_pos.distance_to(Vector2(center_pos.x, mouse_pos.y))
-
+		new_brush.brush_pos = center_pos
+		new_brush.brush_shape_circle_radius = center_pos.distance_to(Vector2(center_pos.x, mouse_pos.y))
+	
 	# Add the brush and update/draw all of the brushes
-	draw_elements_list.append(brush)
+	brush_data_list.append(new_brush)
 	update()
 
 
-
 func _draw():
-	# Go through all of the brushes in draw_elements_list
-	for brush in draw_elements_list:
-
+	# Go through all of the brushes in brush_data_list
+	for brush in brush_data_list:
+		
 		# If the brush is a pencil
-		if brush.brush_type == "pencil":
-			# If the brush shape is a box, then we need to make a Rect2 so we can use draw_rect.
+		if brush.brush_type == BRUSH_MODES.pencil:
+			# If the brush shape is a rectangle, then we need to make a Rect2 so we can use draw_rect.
 			# Draw_rect draws a rectagle at the top left corner, using the scale for the size.
 			# So we offset the position by half of the brush size so the rectangle's center is at mouse position
-			if brush.brush_shape == "box":
+			if brush.brush_shape == BRUSH_SHAPES.rectangle:
 				var rect = Rect2(brush.brush_pos - Vector2(brush.brush_size / 2, brush.brush_size / 2), Vector2(brush.brush_size, brush.brush_size))
 				draw_rect(rect, brush.brush_color)
 			# If the brush shape is a circle, then we draw a circle at the mouse position,
 			# making the radius half of brush size (so the circle is brush size pixels in diameter)
-			elif brush.brush_shape == "circle":
+			elif brush.brush_shape == BRUSH_SHAPES.circle:
 				draw_circle(brush.brush_pos, brush.brush_size / 2, brush.brush_color)
-
+		
 		# If the brush is a eraser
-		elif brush.brush_type == "eraser":
+		elif brush.brush_type == BRUSH_MODES.eraser:
 			# NOTE: this is a really cheap way of erasing that isn't really erasing!
-			# But I couldn't think of a easy(ish) way to make an actual eraser
-
-			# Erasing works exactly the same was as pencil does for both the box shape and the circle shape,
+			# However, this gives similar results in a fairy simple way!
+			
+			# Erasing works exactly the same was as pencil does for both the rectangle shape and the circle shape,
 			# but instead of using brush.brush_color, we instead use bg_color instead.
-			if brush.brush_shape == "box":
+			if brush.brush_shape == BRUSH_SHAPES.rectangle:
 				var rect = Rect2(brush.brush_pos - Vector2(brush.brush_size / 2, brush.brush_size / 2), Vector2(brush.brush_size, brush.brush_size))
 				draw_rect(rect, bg_color)
-			elif brush.brush_shape == "circle":
+			elif brush.brush_shape == BRUSH_SHAPES.circle:
 				draw_circle(brush.brush_pos, brush.brush_size / 2, bg_color)
-
+		
 		# If the brush is a rectangle shape
-		elif brush.brush_type == "rectangle shape":
+		elif brush.brush_type == BRUSH_MODES.rectangle_shape:
 			# We make a Rect2 with the postion at the top left. To get the size we take the bottom right position
 			# and subtract the top left corner's position
 			var rect = Rect2(brush.brush_pos, brush.brush_shape_rect_pos_BR - brush.brush_pos)
 			draw_rect(rect, brush.brush_color)
-
+		
 		# If the brush is a circle shape
-		elif brush.brush_type == "circle shape":
+		elif brush.brush_type == BRUSH_MODES.circle_shape:
 			# We simply draw a circle using stored in brush
 			draw_circle(brush.brush_pos, brush.brush_shape_circle_radius, brush.brush_color)
 
 
 
 func save_picture(path):
-
 	# Wait a couple frames so the save dialog isn't in the way
 	yield (get_tree(), "idle_frame")
 	yield (get_tree(), "idle_frame")
-
+	
 	# Get the viewport image
 	var img = get_viewport().get_texture().get_data()
 	# Crop the image so we only have canvas area.
 	var cropped_image = img.get_rect(Rect2(TL_node.global_position, IMAGE_SIZE))
 	# Flip the image on the Y-axis (it's flipped upside down by default)
 	cropped_image.flip_y()
-
+	
 	# Save the image with the passed in path we got from the save dialog
 	cropped_image.save_png(path)
-
+	
 	return
 

+ 4 - 369
2d/gd_paint/Paint_root.tscn

@@ -5,582 +5,217 @@
 [ext_resource path="res://PaintTools.png" type="Texture" id=3]
 
 [sub_resource type="StyleBoxFlat" id=1]
-
-content_margin_left = -1.0
-content_margin_right = -1.0
-content_margin_top = -1.0
-content_margin_bottom = -1.0
 bg_color = Color( 1, 1, 1, 1 )
-draw_center = true
-border_width_left = 0
-border_width_top = 0
-border_width_right = 0
-border_width_bottom = 0
-border_color = Color( 0.8, 0.8, 0.8, 1 )
-border_blend = false
-corner_radius_top_left = 0
-corner_radius_top_right = 0
-corner_radius_bottom_right = 0
-corner_radius_bottom_left = 0
-corner_detail = 8
-expand_margin_left = 0.0
-expand_margin_right = 0.0
-expand_margin_top = 0.0
-expand_margin_bottom = 0.0
-shadow_color = Color( 0, 0, 0, 0.6 )
-shadow_size = 0
-anti_aliasing = true
-anti_aliasing_size = 1
-
-[node name="Paint_root" type="Control"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
+
+[node name="PaintRoot" type="Control"]
 margin_right = 40.0
 margin_bottom = 40.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
 
 [node name="DrawingAreaBG" type="Panel" parent="."]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 350.0
 margin_right = 1280.0
 margin_bottom = 720.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
 custom_styles/panelf = SubResource( 1 )
 custom_styles/panel = SubResource( 1 )
 custom_styles/panelnc = SubResource( 1 )
-_sections_unfolded = [ "Rect", "Visibility", "custom_styles" ]
 
 [node name="PaintControl" type="Control" parent="."]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_right = 40.0
 margin_bottom = 40.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
 script = ExtResource( 1 )
-_sections_unfolded = [ "Rect" ]
 
 [node name="TLPos" type="Position2D" parent="PaintControl"]
-
 position = Vector2( 350, 0 )
-_sections_unfolded = [ "Transform" ]
 
 [node name="ToolsPanel" type="Panel" parent="."]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_right = 350.0
 margin_bottom = 720.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
 script = ExtResource( 2 )
 
 [node name="LabelTools" type="Label" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 10.0
 margin_right = 330.0
 margin_bottom = 24.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 2
-size_flags_horizontal = 1
-size_flags_vertical = 4
 text = "Selected tool: pencil"
 align = 1
-percent_visible = 1.0
-lines_skipped = 0
-max_lines_visible = -1
 
 [node name="ButtonToolPencil" type="Button" parent="ToolsPanel"]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 40.0
 margin_top = 40.0
 margin_right = 100.0
 margin_bottom = 100.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
-_sections_unfolded = [ "Rect" ]
 
 [node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolPencil"]
-
 position = Vector2( 30, 30 )
 scale = Vector2( 2.5, 2.5 )
 texture = ExtResource( 3 )
 region_enabled = true
 region_rect = Rect2( 0, 0, 16, 16 )
-_sections_unfolded = [ "Region" ]
 
 [node name="ButtonToolEraser" type="Button" parent="ToolsPanel"]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 110.0
 margin_top = 40.0
 margin_right = 170.0
 margin_bottom = 100.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
-_sections_unfolded = [ "Rect" ]
 
 [node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolEraser"]
-
 position = Vector2( 30, 30 )
 scale = Vector2( 2.5, 2.5 )
 texture = ExtResource( 3 )
 region_enabled = true
 region_rect = Rect2( 16, 0, 16, 16 )
-_sections_unfolded = [ "Region" ]
 
 [node name="ButtonToolRectangle" type="Button" parent="ToolsPanel"]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 180.0
 margin_top = 40.0
 margin_right = 240.0
 margin_bottom = 100.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
-_sections_unfolded = [ "Rect" ]
 
 [node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolRectangle"]
-
 position = Vector2( 30, 30 )
 scale = Vector2( 2.5, 2.5 )
 texture = ExtResource( 3 )
 region_enabled = true
 region_rect = Rect2( 0, 16, 16, 16 )
-_sections_unfolded = [ "Region" ]
 
 [node name="ButtonToolCircle" type="Button" parent="ToolsPanel"]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 250.0
 margin_top = 40.0
 margin_right = 310.0
 margin_bottom = 100.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
-_sections_unfolded = [ "Rect" ]
 
 [node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonToolCircle"]
-
 position = Vector2( 30, 30 )
 scale = Vector2( 2.5, 2.5 )
 texture = ExtResource( 3 )
 region_enabled = true
 region_rect = Rect2( 16, 16, 16, 16 )
-_sections_unfolded = [ "Region" ]
 
 [node name="LabelBrushColor" type="Label" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 120.0
 margin_right = 330.0
 margin_bottom = 134.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 2
-size_flags_horizontal = 1
-size_flags_vertical = 4
 text = "Current color"
 align = 1
-percent_visible = 1.0
-lines_skipped = 0
-max_lines_visible = -1
 
 [node name="ColorPickerBrush" type="ColorPickerButton" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 140.0
 margin_right = 330.0
 margin_bottom = 190.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
 color = Color( 1, 1, 1, 1 )
-edit_alpha = true
 
 [node name="LabelBrushSize" type="Label" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 210.0
 margin_right = 330.0
 margin_bottom = 224.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 2
-size_flags_horizontal = 1
-size_flags_vertical = 4
 text = "Brush size: 32px"
 align = 1
-percent_visible = 1.0
-lines_skipped = 0
-max_lines_visible = -1
 
 [node name="HScrollBarBrushSize" type="HScrollBar" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 230.0
 margin_right = 330.0
 margin_bottom = 260.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 0
 min_value = 1.0
-max_value = 100.0
-step = 0.0
-page = 0.0
 value = 32.0
-exp_edit = false
-rounded = false
-custom_step = -1.0
 
 [node name="LabelBrushShape" type="Label" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 280.0
 margin_right = 330.0
 margin_bottom = 294.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 2
-size_flags_horizontal = 1
-size_flags_vertical = 4
 text = "Brush shape: circle"
 align = 1
-percent_visible = 1.0
-lines_skipped = 0
-max_lines_visible = -1
 
 [node name="ButtonShapeBox" type="Button" parent="ToolsPanel"]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 100.0
 margin_top = 300.0
 margin_right = 160.0
 margin_bottom = 360.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
-_sections_unfolded = [ "Rect" ]
 
 [node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonShapeBox"]
-
 position = Vector2( 30, 30 )
 scale = Vector2( 2.5, 2.5 )
 texture = ExtResource( 3 )
 region_enabled = true
 region_rect = Rect2( 0, 16, 16, 16 )
-_sections_unfolded = [ "Region" ]
 
 [node name="ButtonShapeCircle" type="Button" parent="ToolsPanel"]
-
 editor/display_folded = true
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 190.0
 margin_top = 300.0
 margin_right = 250.0
 margin_bottom = 360.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
-_sections_unfolded = [ "Rect" ]
 
 [node name="Sprite" type="Sprite" parent="ToolsPanel/ButtonShapeCircle"]
-
 position = Vector2( 30, 30 )
 scale = Vector2( 2.5, 2.5 )
 texture = ExtResource( 3 )
 region_enabled = true
 region_rect = Rect2( 16, 16, 16, 16 )
-_sections_unfolded = [ "Region" ]
 
 [node name="LabelBackgroundColor" type="Label" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 400.0
 margin_right = 330.0
 margin_bottom = 414.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 2
-size_flags_horizontal = 1
-size_flags_vertical = 4
 text = "Background color"
 align = 1
-percent_visible = 1.0
-lines_skipped = 0
-max_lines_visible = -1
 
 [node name="ColorPickerBackground" type="ColorPickerButton" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 420.0
 margin_right = 330.0
 margin_bottom = 470.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
-flat = false
 color = Color( 1, 1, 1, 1 )
 edit_alpha = false
 
 [node name="LabelStats" type="Label" parent="ToolsPanel"]
-
 modulate = Color( 0.414062, 0.414062, 0.414062, 1 )
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 20.0
 margin_top = 590.0
 margin_right = 330.0
 margin_bottom = 604.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 2
-size_flags_horizontal = 1
-size_flags_vertical = 4
 text = "Brush objects: 00000"
 align = 1
-percent_visible = 1.0
-lines_skipped = 0
-max_lines_visible = -1
-_sections_unfolded = [ "Visibility" ]
 
 [node name="ButtonUndo" type="Button" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 10.0
 margin_top = 520.0
 margin_right = 340.0
 margin_bottom = 560.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
 text = "Undo last stroke"
-flat = false
 
 [node name="ButtonSave" type="Button" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 10.0
 margin_top = 620.0
 margin_right = 340.0
 margin_bottom = 660.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
 text = "Save picture"
-flat = false
 
 [node name="ButtonClear" type="Button" parent="ToolsPanel"]
-
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_left = 10.0
 margin_top = 670.0
 margin_right = 340.0
 margin_bottom = 710.0
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-toggle_mode = false
-enabled_focus_mode = 2
-shortcut = null
-group = null
 text = "Clear picture"
-flat = false
 
 [node name="SaveFileDialog" type="FileDialog" parent="."]
-
-visible = false
-anchor_left = 0.0
-anchor_top = 0.0
-anchor_right = 0.0
-anchor_bottom = 0.0
 margin_right = 600.0
 margin_bottom = 400.0
-rect_min_size = Vector2( 200, 70 )
-rect_pivot_offset = Vector2( 0, 0 )
-rect_clip_content = false
-mouse_filter = 0
-size_flags_horizontal = 1
-size_flags_vertical = 1
-popup_exclusive = false
-window_title = "Save a File"
 resizable = true
-dialog_hide_on_ok = false
-mode = 4
 access = 2
 filters = PoolStringArray( "*.png" )
-show_hidden_files = false
-
-
+current_dir = "/home/ubuntu_noah/Documents/New_2019_GitHub_Repositories/godot-demo-projects/2d/gd_paint"
+current_path = "/home/ubuntu_noah/Documents/New_2019_GitHub_Repositories/godot-demo-projects/2d/gd_paint/"

+ 27 - 15
2d/gd_paint/ToolsPanel.gd

@@ -12,7 +12,6 @@ var save_dialog
 
 
 func _ready():
-
 	# Get PaintControl and SaveFileDialog
 	paint_control = get_parent().get_node("PaintControl")
 	save_dialog = get_parent().get_node("SaveFileDialog")
@@ -27,7 +26,7 @@ func _ready():
 	get_node("ButtonToolEraser").connect("pressed", self, "button_pressed", ["mode_eraser"])
 	get_node("ButtonToolRectangle").connect("pressed", self, "button_pressed", ["mode_rectangle"])
 	get_node("ButtonToolCircle").connect("pressed", self, "button_pressed", ["mode_circle"])
-	get_node("ButtonShapeBox").connect("pressed", self, "button_pressed", ["shape_box"])
+	get_node("ButtonShapeBox").connect("pressed", self, "button_pressed", ["shape_rectangle"])
 	get_node("ButtonShapeCircle").connect("pressed", self, "button_pressed", ["shape_circle"])
 
 	# Assign all of the needed signals for the other brush settings (and ColorPickerBackground)
@@ -50,45 +49,56 @@ func _ready():
 
 func _physics_process(delta):
 	# Update the status label with the newest brush element count
-	label_stats.text = "Brush objects: " + String(paint_control.draw_elements_list.size())
+	label_stats.text = "Brush objects: " + String(paint_control.brush_data_list.size())
 
 
 func button_pressed(button_name):
-
 	# If a brush mode button is pressed
+	var tool_name = null
+	var shape_name = null
+	
 	if button_name == "mode_pencil":
-		paint_control.brush_mode = "pencil"
+		paint_control.brush_mode = paint_control.BRUSH_MODES.pencil
+		tool_name = "pencil"
 	elif button_name == "mode_eraser":
-		paint_control.brush_mode = "eraser"
+		paint_control.brush_mode = paint_control.BRUSH_MODES.eraser
+		tool_name = "eraser"
 	elif button_name == "mode_rectangle":
-		paint_control.brush_mode = "rectangle shape"
+		paint_control.brush_mode = paint_control.BRUSH_MODES.rectangle_shape
+		tool_name = "rectangle shape"
 	elif button_name == "mode_circle":
-		paint_control.brush_mode = "circle shape"
+		paint_control.brush_mode = paint_control.BRUSH_MODES.circle_shape
+		tool_name = "circle shape"
 
 	# If a brush shape button is pressed
-	elif button_name == "shape_box":
-		paint_control.brush_shape = "box"
+	elif button_name == "shape_rectangle":
+		paint_control.brush_shape = paint_control.BRUSH_SHAPES.rectangle
+		shape_name = "rectangle"
 	elif button_name == "shape_circle":
-		paint_control.brush_shape = "circle"
+		paint_control.brush_shape = paint_control.BRUSH_SHAPES.circle
+		shape_name = "circle";
 
 	# If a opperation button is pressed
 	elif button_name == "clear_picture":
-		paint_control.draw_elements_list = []
+		paint_control.brush_data_list = []
 		paint_control.update()
 	elif button_name == "save_picture":
 		save_dialog.popup_centered()
 	elif button_name == "undo_stroke":
 		paint_control.undo_stroke()
-
+	
 	# Update the labels (in case the brush mode or brush shape has changed)
-	label_tools.text = "Selected tool: " + paint_control.brush_mode
-	label_brush_shape.text = "Brush shape: " + paint_control.brush_shape
+	if tool_name != null:
+		label_tools.text = "Selected tool: " + tool_name
+	if shape_name != null:
+		label_brush_shape.text = "Brush shape: " + shape_name
 
 
 func brush_color_changed(color):
 	# Change the brush color to whatever color the color picker is
 	paint_control.brush_color = color
 
+
 func background_color_changed(color):
 	# Change the background color to whatever colorthe background color picker is
 	get_parent().get_node("DrawingAreaBG").modulate = color
@@ -96,11 +106,13 @@ func background_color_changed(color):
 	# Because of how the eraser works we also need to redraw the paint control
 	paint_control.update()
 
+
 func brush_size_changed(value):
 	# Change the size of the brush, and update the label to reflect the new value
 	paint_control.brush_size = ceil(value)
 	label_brush_size.text = "Brush size: " + String(ceil(value)) + "px"
 
+
 func save_file_selected(path):
 	# Call save_picture in paint_control, passing in the path we recieved from SaveFileDialog
 	paint_control.save_picture(path)

+ 0 - 87
2d/gd_paint/default_env.tres

@@ -1,101 +1,14 @@
 [gd_resource type="Environment" load_steps=2 format=2]
 
 [sub_resource type="ProceduralSky" id=1]
-
-radiance_size = 4
 sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 )
 sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 )
 sky_curve = 0.25
-sky_energy = 1.0
 ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 )
 ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 )
 ground_curve = 0.01
-ground_energy = 1.0
-sun_color = Color( 1, 1, 1, 1 )
-sun_latitude = 35.0
-sun_longitude = 0.0
-sun_angle_min = 1.0
-sun_angle_max = 100.0
-sun_curve = 0.05
 sun_energy = 16.0
-texture_size = 2
 
 [resource]
-
 background_mode = 2
 background_sky = SubResource( 1 )
-background_sky_custom_fov = 0.0
-background_color = Color( 0, 0, 0, 1 )
-background_energy = 1.0
-background_canvas_max_layer = 0
-ambient_light_color = Color( 0, 0, 0, 1 )
-ambient_light_energy = 1.0
-ambient_light_sky_contribution = 1.0
-fog_enabled = false
-fog_color = Color( 0.5, 0.6, 0.7, 1 )
-fog_sun_color = Color( 1, 0.9, 0.7, 1 )
-fog_sun_amount = 0.0
-fog_depth_enabled = true
-fog_depth_begin = 10.0
-fog_depth_curve = 1.0
-fog_transmit_enabled = false
-fog_transmit_curve = 1.0
-fog_height_enabled = false
-fog_height_min = 0.0
-fog_height_max = 100.0
-fog_height_curve = 1.0
-tonemap_mode = 0
-tonemap_exposure = 1.0
-tonemap_white = 1.0
-auto_exposure_enabled = false
-auto_exposure_scale = 0.4
-auto_exposure_min_luma = 0.05
-auto_exposure_max_luma = 8.0
-auto_exposure_speed = 0.5
-ss_reflections_enabled = false
-ss_reflections_max_steps = 64
-ss_reflections_fade_in = 0.15
-ss_reflections_fade_out = 2.0
-ss_reflections_depth_tolerance = 0.2
-ss_reflections_roughness = true
-ssao_enabled = false
-ssao_radius = 1.0
-ssao_intensity = 1.0
-ssao_radius2 = 0.0
-ssao_intensity2 = 1.0
-ssao_bias = 0.01
-ssao_light_affect = 0.0
-ssao_color = Color( 0, 0, 0, 1 )
-ssao_quality = 0
-ssao_blur = 3
-ssao_edge_sharpness = 4.0
-dof_blur_far_enabled = false
-dof_blur_far_distance = 10.0
-dof_blur_far_transition = 5.0
-dof_blur_far_amount = 0.1
-dof_blur_far_quality = 1
-dof_blur_near_enabled = false
-dof_blur_near_distance = 2.0
-dof_blur_near_transition = 1.0
-dof_blur_near_amount = 0.1
-dof_blur_near_quality = 1
-glow_enabled = false
-glow_levels/1 = false
-glow_levels/2 = false
-glow_levels/3 = true
-glow_levels/4 = false
-glow_levels/5 = true
-glow_levels/6 = false
-glow_levels/7 = false
-glow_intensity = 0.8
-glow_strength = 1.0
-glow_bloom = 0.0
-glow_blend_mode = 2
-glow_hdr_threshold = 1.0
-glow_hdr_scale = 2.0
-glow_bicubic_upscale = false
-adjustment_enabled = false
-adjustment_brightness = 1.0
-adjustment_contrast = 1.0
-adjustment_saturation = 1.0
-

+ 6 - 1
2d/gd_paint/project.godot

@@ -6,7 +6,12 @@
 ;   [section] ; section goes between []
 ;   param=value ; assign values to parameters
 
-config_version=3
+config_version=4
+
+_global_script_classes=[  ]
+_global_script_class_icons={
+
+}
 
 [application]