Compare commits
	
		
			No commits in common. "64d0280b1fdcf8c967b3c85831a622c461b6b44c" and "808a3a2c3ef0d192f88e543a6654386aeb095845" have entirely different histories.
		
	
	
		
			64d0280b1f
			...
			808a3a2c3e
		
	
		
							
								
								
									
										
											BIN
										
									
								
								editor.scn
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								editor.scn
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							@ -1,100 +0,0 @@
 | 
			
		||||
class_name EditableTerrain extends Node
 | 
			
		||||
 | 
			
		||||
var _image := Image.create(1, 1, false, Image.FORMAT_RGBAF)
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
@export
 | 
			
		||||
var channels := Vector3.ZERO
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
@export
 | 
			
		||||
var size := Vector2i.ZERO:
 | 
			
		||||
	get:
 | 
			
		||||
		return size
 | 
			
		||||
 | 
			
		||||
	set(value):
 | 
			
		||||
		_image.resize(value.x, value.y)
 | 
			
		||||
		_image.fill(Color(0.0, 0.0, 0.0, 0.5))
 | 
			
		||||
 | 
			
		||||
		size = value
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
func get_image() -> void:
 | 
			
		||||
	return _image
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
func paint(point: Vector2i, elevation_level: float,
 | 
			
		||||
	brush_mask: Image, brush_scale: float, brush_intensity: float) -> void:
 | 
			
		||||
 | 
			
		||||
	# Convert worldspace point to image-space coordinates for brush and calculate drawable area.
 | 
			
		||||
	var brush_mask_size := brush_mask.get_size()
 | 
			
		||||
	var brush_size := brush_mask_size * brush_scale
 | 
			
		||||
	var image_size := _image.get_size()
 | 
			
		||||
 | 
			
		||||
	var draw_area := Rect2i(Vector2i.ZERO, image_size).intersection(
 | 
			
		||||
		Rect2i((point - Vector2i(brush_size * 0.5)) + Vector2i(image_size * 0.5), brush_size))
 | 
			
		||||
 | 
			
		||||
	if draw_area.has_area():
 | 
			
		||||
		var scaled_brush_mask_size := brush_mask_size / draw_area.size
 | 
			
		||||
 | 
			
		||||
		elevation_level = clampf(elevation_level, -1.0, 1.0)
 | 
			
		||||
 | 
			
		||||
		for y in draw_area.size.y:
 | 
			
		||||
			var brush_mask_y := int(y * scaled_brush_mask_size.y)
 | 
			
		||||
 | 
			
		||||
			for x in draw_area.size.x:
 | 
			
		||||
				var terrain_map_coord := draw_area.position + Vector2i(x, y)
 | 
			
		||||
				var pixel := _image.get_pixelv(terrain_map_coord)
 | 
			
		||||
 | 
			
		||||
				var mask := brush_mask.get_pixel(
 | 
			
		||||
					int(x * scaled_brush_mask_size.x), brush_mask_y).a
 | 
			
		||||
 | 
			
		||||
				var mask_intensity := brush_intensity * mask
 | 
			
		||||
 | 
			
		||||
				_image.set_pixelv(terrain_map_coord, Color(
 | 
			
		||||
					lerpf(pixel.r, channels.x, mask_intensity),
 | 
			
		||||
						lerpf(pixel.g, channels.y, mask_intensity),
 | 
			
		||||
							lerpf(pixel.b, channels.z, mask_intensity),
 | 
			
		||||
								lerpf(pixel.a, pixel.a + (elevation_level * mask), brush_intensity)))
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
##
 | 
			
		||||
func smooth(point: Vector2i, smoothing_level: float,
 | 
			
		||||
	brush_mask: Image, brush_scale: float, brush_intensity: float) -> void:
 | 
			
		||||
 | 
			
		||||
	# Convert worldspace point to image-space coordinates for brush and calculate drawable area.
 | 
			
		||||
	var brush_mask_size := brush_mask.get_size()
 | 
			
		||||
	var brush_size := brush_mask_size * brush_scale
 | 
			
		||||
	var terrain_map_size := _image.get_size()
 | 
			
		||||
 | 
			
		||||
	var draw_area := Rect2i(Vector2i.ZERO, terrain_map_size).intersection(
 | 
			
		||||
		Rect2i((point - Vector2i(brush_size * 0.5)) +\
 | 
			
		||||
			Vector2i(terrain_map_size * 0.5), brush_size))
 | 
			
		||||
 | 
			
		||||
	if draw_area.has_area():
 | 
			
		||||
		var scaled_brush_mask_size := brush_mask_size / draw_area.size
 | 
			
		||||
 | 
			
		||||
		for y in draw_area.size.y:
 | 
			
		||||
			var brush_mask_y := int(y * scaled_brush_mask_size.y)
 | 
			
		||||
 | 
			
		||||
			for x in draw_area.size.x:
 | 
			
		||||
				var terrain_map_coord := draw_area.position + Vector2i(x, y)
 | 
			
		||||
				var pixel := _image.get_pixelv(terrain_map_coord)
 | 
			
		||||
 | 
			
		||||
				var mask_intensity := brush_intensity * brush_mask.get_pixel(
 | 
			
		||||
					int(x * scaled_brush_mask_size.x), brush_mask_y).a
 | 
			
		||||
 | 
			
		||||
				_image.set_pixelv(terrain_map_coord, Color(
 | 
			
		||||
					lerpf(pixel.r, channels.x, mask_intensity),
 | 
			
		||||
						lerpf(pixel.g, channels.y, mask_intensity), 
 | 
			
		||||
							lerpf(pixel.b, channels.z, mask_intensity),
 | 
			
		||||
								lerpf(pixel.a, smoothing_level, mask_intensity)))
 | 
			
		||||
@ -9,11 +9,6 @@
 | 
			
		||||
config_version=5
 | 
			
		||||
 | 
			
		||||
_global_script_classes=[{
 | 
			
		||||
"base": "Node",
 | 
			
		||||
"class": &"EditableTerrain",
 | 
			
		||||
"language": &"GDScript",
 | 
			
		||||
"path": "res://editor/editable_terrain.gd"
 | 
			
		||||
}, {
 | 
			
		||||
"base": "Node3D",
 | 
			
		||||
"class": &"PlayerController",
 | 
			
		||||
"language": &"GDScript",
 | 
			
		||||
@ -30,7 +25,6 @@ _global_script_classes=[{
 | 
			
		||||
"path": "res://terrain_instance_3d.gd"
 | 
			
		||||
}]
 | 
			
		||||
_global_script_class_icons={
 | 
			
		||||
"EditableTerrain": "",
 | 
			
		||||
"PlayerController": "",
 | 
			
		||||
"Settings": "",
 | 
			
		||||
"TerrainInstance3D": ""
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user