mirror of
https://github.com/Relintai/utilities_gamedev.git
synced 2025-01-04 14:59:38 +01:00
Also added the world_generator addon.
This commit is contained in:
parent
a011b454c8
commit
d9313e105b
7
world_generator/plugin.cfg
Normal file
7
world_generator/plugin.cfg
Normal file
@ -0,0 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="WorldGenerator"
|
||||
description=""
|
||||
author="Relintai"
|
||||
version=""
|
||||
script="plugin.gd"
|
78
world_generator/plugin.gd
Normal file
78
world_generator/plugin.gd
Normal file
@ -0,0 +1,78 @@
|
||||
tool
|
||||
extends EditorPlugin
|
||||
|
||||
var SWorldGeneratorSettings = preload("res://addons/world_generator/resources/world_generator_settings.gd")
|
||||
|
||||
var SWorldGenBaseResource = preload("res://addons/world_generator/resources/world_gen_base_resource.gd")
|
||||
var SWorldGenWorld = preload("res://addons/world_generator/resources/world_gen_world.gd")
|
||||
var SContinent = preload("res://addons/world_generator/resources/continent.gd")
|
||||
var SZone = preload("res://addons/world_generator/resources/zone.gd")
|
||||
var SSubZone = preload("res://addons/world_generator/resources/subzone.gd")
|
||||
|
||||
var editor_packed_scene = preload("res://addons/world_generator/ui/MainScreen.tscn")
|
||||
var editor_scene = null
|
||||
|
||||
var tool_button : ToolButton = null
|
||||
|
||||
func _enter_tree():
|
||||
add_custom_type("WorldGeneratorSettings", "Resource", SWorldGeneratorSettings, null)
|
||||
|
||||
add_custom_type("WorldGenBaseResource", "Resource", SWorldGenBaseResource, null)
|
||||
#Don't change the base to "WorldGenBaseResource" else it will complain about a non-existant class
|
||||
#Also it works perfectly like this
|
||||
add_custom_type("WorldGenWorld", "Resource", SWorldGenWorld, null)
|
||||
add_custom_type("Continent", "Resource", SContinent, null)
|
||||
add_custom_type("Zone", "Resource", SZone, null)
|
||||
add_custom_type("SubZone", "Resource", SSubZone, null)
|
||||
|
||||
editor_scene = editor_packed_scene.instance()
|
||||
editor_scene.set_plugin(self)
|
||||
|
||||
tool_button = add_control_to_bottom_panel(editor_scene, "World Editor")
|
||||
tool_button.hide()
|
||||
|
||||
func _exit_tree():
|
||||
remove_custom_type("WorldGeneratorSettings")
|
||||
|
||||
remove_custom_type("WorldGenBaseResource")
|
||||
remove_custom_type("WorldGenWorld")
|
||||
remove_custom_type("Continent")
|
||||
remove_custom_type("Zone")
|
||||
remove_custom_type("SubZone")
|
||||
|
||||
remove_control_from_bottom_panel(editor_scene)
|
||||
|
||||
|
||||
func handles(object):
|
||||
return object is WorldGenWorld
|
||||
|
||||
func edit(object):
|
||||
#if editor_scene:
|
||||
# make_bottom_panel_item_visible(editor_scene)
|
||||
|
||||
if object is WorldGenWorld:
|
||||
var wgw : WorldGenWorld = object as WorldGenWorld
|
||||
wgw.setup()
|
||||
editor_scene.set_wgworld(wgw)
|
||||
|
||||
func make_visible(visible):
|
||||
if tool_button:
|
||||
if visible:
|
||||
tool_button.show()
|
||||
else:
|
||||
#if tool_button.pressed:
|
||||
# tool_button.pressed = false
|
||||
|
||||
if !tool_button.pressed:
|
||||
tool_button.hide()
|
||||
|
||||
func get_plugin_icon():
|
||||
return null
|
||||
|
||||
func get_plugin_name():
|
||||
return "WorldGeneratorEditor"
|
||||
|
||||
func has_main_screen():
|
||||
return false
|
||||
|
||||
|
32
world_generator/raycast/world_gen_raycast.gd
Normal file
32
world_generator/raycast/world_gen_raycast.gd
Normal file
@ -0,0 +1,32 @@
|
||||
tool
|
||||
extends Reference
|
||||
class_name WorldGenRaycast
|
||||
|
||||
var current_index : int = -1
|
||||
var base_resources : Array = Array()
|
||||
var local_positions : PoolVector2Array = PoolVector2Array()
|
||||
var local_uvs : PoolVector2Array = PoolVector2Array()
|
||||
|
||||
func get_local_position() -> Vector2:
|
||||
return local_positions[current_index]
|
||||
|
||||
func get_local_uv() -> Vector2:
|
||||
return local_uvs[current_index]
|
||||
|
||||
# WorldGenBaseResource (can't explicitly add -> cyclic dependency)
|
||||
func get_resource():
|
||||
return base_resources[current_index]
|
||||
|
||||
func next() -> bool:
|
||||
current_index += 1
|
||||
|
||||
return base_resources.size() > current_index
|
||||
|
||||
func size() -> int:
|
||||
return base_resources.size()
|
||||
|
||||
# base_resource -> WorldGenBaseResource
|
||||
func add_data(base_resource, local_pos : Vector2, local_uv : Vector2) -> void:
|
||||
base_resources.append(base_resource)
|
||||
local_positions.append(local_pos)
|
||||
local_uvs.append(local_uv)
|
39
world_generator/resources/continent.gd
Normal file
39
world_generator/resources/continent.gd
Normal file
@ -0,0 +1,39 @@
|
||||
tool
|
||||
extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
|
||||
class_name Continent
|
||||
|
||||
export(Array) var zones : Array
|
||||
|
||||
func get_content() -> Array:
|
||||
return zones
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
zones = arr
|
||||
|
||||
func create_content(item_name : String = "") -> void:
|
||||
var zone : Zone = Zone.new()
|
||||
zone.resource_name = item_name
|
||||
|
||||
var r : Rect2 = get_rect()
|
||||
r.position = Vector2()
|
||||
r.size.x /= 10.0
|
||||
r.size.y /= 10.0
|
||||
|
||||
zone.set_rect(r)
|
||||
|
||||
add_content(zone)
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
zones.append(entry)
|
||||
entry.set_parent_pos(get_parent_pos() + get_rect().position)
|
||||
emit_changed()
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
for i in range(zones.size()):
|
||||
if zones[i] == entry:
|
||||
zones.remove(i)
|
||||
emit_changed()
|
||||
return
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
7
world_generator/resources/subzone.gd
Normal file
7
world_generator/resources/subzone.gd
Normal file
@ -0,0 +1,7 @@
|
||||
tool
|
||||
extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
|
||||
class_name SubZone
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
||||
|
182
world_generator/resources/world_gen_base_resource.gd
Normal file
182
world_generator/resources/world_gen_base_resource.gd
Normal file
@ -0,0 +1,182 @@
|
||||
tool
|
||||
extends Resource
|
||||
class_name WorldGenBaseResource
|
||||
|
||||
export(Rect2) var rect : Rect2 = Rect2(0, 0, 100, 100)
|
||||
export(bool) var locked : bool = false
|
||||
|
||||
var _parent_pos : Vector2 = Vector2()
|
||||
|
||||
func setup() -> void:
|
||||
_setup()
|
||||
|
||||
for c in get_content():
|
||||
if c:
|
||||
c.set_parent_pos(_parent_pos + get_rect().position)
|
||||
c.setup()
|
||||
|
||||
func _setup() -> void:
|
||||
pass
|
||||
|
||||
func get_rect() -> Rect2:
|
||||
return rect
|
||||
|
||||
func set_rect(r : Rect2) -> void:
|
||||
rect = r
|
||||
emit_changed()
|
||||
|
||||
func get_locked() -> bool:
|
||||
return locked
|
||||
|
||||
func set_locked(r : bool) -> void:
|
||||
locked = r
|
||||
emit_changed()
|
||||
|
||||
func get_parent_pos() -> Vector2:
|
||||
return _parent_pos
|
||||
|
||||
func set_parent_pos(parent_pos : Vector2) -> void:
|
||||
_parent_pos = parent_pos
|
||||
|
||||
for c in get_content():
|
||||
if c:
|
||||
c.set_parent_pos(_parent_pos + get_rect().position)
|
||||
|
||||
func get_content() -> Array:
|
||||
return Array()
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
pass
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
pass
|
||||
|
||||
func create_content(item_name : String = "") -> void:
|
||||
pass
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
pass
|
||||
|
||||
func get_content_with_name(name : String) -> WorldGenBaseResource:
|
||||
if resource_name == name:
|
||||
return self
|
||||
|
||||
for c in get_content():
|
||||
if c:
|
||||
var cc = c.get_content_with_name(name)
|
||||
if cc:
|
||||
return cc
|
||||
|
||||
return null
|
||||
|
||||
func get_all_contents_with_name(name : String) -> Array:
|
||||
var arr : Array = Array()
|
||||
|
||||
if resource_name == name:
|
||||
arr.append(self)
|
||||
|
||||
for c in get_content():
|
||||
if c:
|
||||
var cc : Array = c.get_all_contents_with_name(name)
|
||||
arr.append_array(cc)
|
||||
|
||||
return arr
|
||||
|
||||
func duplicate_content_entry(entry : WorldGenBaseResource, add : bool = true) -> WorldGenBaseResource:
|
||||
var de : WorldGenBaseResource = entry.duplicate(true)
|
||||
de.resource_name += " (Duplicate)"
|
||||
|
||||
if add:
|
||||
add_content(de)
|
||||
|
||||
return de
|
||||
|
||||
func setup_terra_library(library : TerrainLibrary, pseed : int) -> void:
|
||||
_setup_terra_library(library, pseed)
|
||||
|
||||
for c in get_content():
|
||||
if c:
|
||||
c.setup_terra_library(library, pseed)
|
||||
|
||||
func _setup_terra_library(library : TerrainLibrary, pseed : int) -> void:
|
||||
pass
|
||||
|
||||
func generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
|
||||
var p : Vector2 = Vector2(chunk.get_position_x(), chunk.get_position_z())
|
||||
|
||||
var raycast : WorldGenRaycast = get_hit_stack(p)
|
||||
|
||||
if raycast.size() == 0:
|
||||
_generate_terra_chunk_fallback(chunk, pseed, spawn_mobs)
|
||||
return
|
||||
|
||||
while raycast.next():
|
||||
raycast.get_resource()._generate_terra_chunk(chunk, pseed, spawn_mobs, raycast)
|
||||
|
||||
func _generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool, raycast : WorldGenRaycast) -> void:
|
||||
pass
|
||||
|
||||
func _generate_terra_chunk_fallback(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
|
||||
chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_TYPE, 1)
|
||||
chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL, 1)
|
||||
chunk.set_voxel(1, 0, 0, TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL)
|
||||
|
||||
func generate_map(pseed : int) -> Image:
|
||||
var img : Image = Image.new()
|
||||
|
||||
img.create(get_rect().size.x, get_rect().size.y, false, Image.FORMAT_RGBA8)
|
||||
|
||||
add_to_map(img, pseed)
|
||||
|
||||
return img
|
||||
|
||||
func add_to_map(img : Image, pseed : int) -> void:
|
||||
_add_to_map(img, pseed)
|
||||
|
||||
for c in get_content():
|
||||
if c:
|
||||
c.add_to_map(img, pseed)
|
||||
|
||||
func _add_to_map(img : Image, pseed : int) -> void:
|
||||
pass
|
||||
|
||||
func get_hit_stack(pos : Vector2, raycast : WorldGenRaycast = null) -> WorldGenRaycast:
|
||||
var r : Rect2 = get_rect()
|
||||
var local_pos : Vector2 = pos - rect.position
|
||||
r.position = Vector2()
|
||||
|
||||
if !raycast:
|
||||
raycast = WorldGenRaycast.new()
|
||||
|
||||
if r.has_point(local_pos):
|
||||
var local_uv : Vector2 = local_pos / rect.size
|
||||
raycast.add_data(self, local_pos, local_uv)
|
||||
|
||||
for c in get_content():
|
||||
if c:
|
||||
c.get_hit_stack(local_pos, raycast)
|
||||
|
||||
return raycast
|
||||
|
||||
func get_editor_rect_border_color() -> Color:
|
||||
return Color(1, 1, 1, 1)
|
||||
|
||||
func get_editor_rect_color() -> Color:
|
||||
return Color(1, 1, 1, 0.9)
|
||||
|
||||
func get_editor_rect_border_size() -> int:
|
||||
return 2
|
||||
|
||||
func get_editor_font_color() -> Color:
|
||||
return Color(0, 0, 0, 1)
|
||||
|
||||
func get_editor_class() -> String:
|
||||
return "WorldGenBaseResource"
|
||||
|
||||
func get_editor_additional_text() -> String:
|
||||
return "WorldGenBaseResource"
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
inspector.add_slot_line_edit("get_name", "set_name", "Name")
|
||||
inspector.add_slot_rect2("get_rect", "set_rect", "Rect", 1)
|
||||
inspector.add_slot_bool("get_locked", "set_locked", "Locked")
|
63
world_generator/resources/world_gen_world.gd
Normal file
63
world_generator/resources/world_gen_world.gd
Normal file
@ -0,0 +1,63 @@
|
||||
tool
|
||||
extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
|
||||
class_name WorldGenWorld
|
||||
|
||||
export(Array) var continents : Array
|
||||
|
||||
func get_content() -> Array:
|
||||
return continents
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
continents = arr
|
||||
|
||||
func create_content(item_name : String = "") -> void:
|
||||
var continent : Continent = Continent.new()
|
||||
continent.resource_name = item_name
|
||||
|
||||
add_content(continent)
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
var r : Rect2 = get_rect()
|
||||
r.position = Vector2()
|
||||
r.size.x /= 10.0
|
||||
r.size.y /= 10.0
|
||||
|
||||
entry.set_rect(r)
|
||||
|
||||
continents.append(entry)
|
||||
entry.set_parent_pos(get_parent_pos() + get_rect().position)
|
||||
emit_changed()
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
for i in range(continents.size()):
|
||||
if continents[i] == entry:
|
||||
continents.remove(i)
|
||||
emit_changed()
|
||||
return
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
||||
|
||||
func generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
|
||||
var p : Vector2 = Vector2(chunk.get_position_x(), chunk.get_position_z())
|
||||
|
||||
var raycast : WorldGenRaycast = get_hit_stack(p)
|
||||
|
||||
if raycast.size() == 0:
|
||||
_generate_terra_chunk_fallback(chunk, pseed, spawn_mobs)
|
||||
return
|
||||
|
||||
_generate_terra_chunk(chunk, pseed, spawn_mobs, raycast)
|
||||
|
||||
while raycast.next():
|
||||
raycast.get_resource()._generate_terra_chunk(chunk, pseed, spawn_mobs, raycast)
|
||||
|
||||
|
||||
func _generate_terra_chunk(chunk: TerrainChunk, pseed : int, spawn_mobs: bool, raycast : WorldGenRaycast) -> void:
|
||||
pass
|
||||
|
||||
func _generate_terra_chunk_fallback(chunk: TerrainChunk, pseed : int, spawn_mobs: bool) -> void:
|
||||
chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_TYPE, 1)
|
||||
chunk.channel_ensure_allocated(TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL, 1)
|
||||
chunk.set_voxel(1, 0, 0, TerrainChunkDefault.DEFAULT_CHANNEL_ISOLEVEL)
|
||||
|
88
world_generator/resources/world_generator_settings.gd
Normal file
88
world_generator/resources/world_generator_settings.gd
Normal file
@ -0,0 +1,88 @@
|
||||
tool
|
||||
extends Resource
|
||||
class_name WorldGeneratorSettings
|
||||
|
||||
export(PoolStringArray) var continent_class_folders : PoolStringArray
|
||||
export(PoolStringArray) var zone_class_folders : PoolStringArray
|
||||
export(PoolStringArray) var subzone_class_folders : PoolStringArray
|
||||
|
||||
enum WorldGeneratorScriptType {
|
||||
CONTINENT = 0,
|
||||
ZONE = 1,
|
||||
SUBZONE = 2,
|
||||
};
|
||||
|
||||
func evaluate_scripts(script_type : int, tree : Tree) -> void:
|
||||
if (script_type == WorldGeneratorScriptType.CONTINENT):
|
||||
evaluate_continent_scripts(tree)
|
||||
elif (script_type == WorldGeneratorScriptType.ZONE):
|
||||
evaluate_zone_scripts(tree)
|
||||
elif (script_type == WorldGeneratorScriptType.SUBZONE):
|
||||
evaluate_subzone_scripts(tree)
|
||||
|
||||
func evaluate_continent_scripts(tree : Tree) -> void:
|
||||
tree.clear()
|
||||
|
||||
var root : TreeItem = tree.create_item()
|
||||
root.set_text(0, "Continent")
|
||||
root.set_meta("class_name", "Continent")
|
||||
|
||||
for s in continent_class_folders:
|
||||
evaluate_folder(s, tree, root)
|
||||
|
||||
root.select(0)
|
||||
|
||||
func evaluate_zone_scripts(tree : Tree) -> void:
|
||||
tree.clear()
|
||||
|
||||
var root : TreeItem = tree.create_item()
|
||||
root.set_text(0, "Zone")
|
||||
root.set_meta("class_name", "Zone")
|
||||
|
||||
for s in zone_class_folders:
|
||||
evaluate_folder(s, tree, root)
|
||||
|
||||
root.select(0)
|
||||
|
||||
func evaluate_subzone_scripts(tree : Tree) -> void:
|
||||
tree.clear()
|
||||
|
||||
var root : TreeItem = tree.create_item()
|
||||
root.set_text(0, "SubZone")
|
||||
root.set_meta("class_name", "SubZone")
|
||||
|
||||
for s in subzone_class_folders:
|
||||
evaluate_folder(s, tree, root)
|
||||
|
||||
root.select(0)
|
||||
|
||||
func evaluate_folder(folder : String, tree : Tree, root : TreeItem) -> void:
|
||||
var ti : TreeItem = null
|
||||
|
||||
var dir = Directory.new()
|
||||
if dir.open(folder) == OK:
|
||||
dir.list_dir_begin()
|
||||
var file_name = dir.get_next()
|
||||
while file_name != "":
|
||||
if !dir.current_is_dir():
|
||||
#print("Found file: " + file_name)
|
||||
|
||||
if !ti:
|
||||
var n : String = folder.substr(folder.find_last("/") + 1)
|
||||
|
||||
if n != "":
|
||||
ti = tree.create_item(root)
|
||||
ti.set_text(0, n)
|
||||
else:
|
||||
ti = root
|
||||
|
||||
var e : TreeItem = tree.create_item(ti)
|
||||
|
||||
e.set_text(0, file_name.get_file())
|
||||
e.set_meta("file", folder + "/" + file_name)
|
||||
|
||||
file_name = dir.get_next()
|
||||
else:
|
||||
print("An error occurred when trying to access the path.")
|
||||
|
||||
|
39
world_generator/resources/zone.gd
Normal file
39
world_generator/resources/zone.gd
Normal file
@ -0,0 +1,39 @@
|
||||
tool
|
||||
extends "res://addons/world_generator/resources/world_gen_base_resource.gd"
|
||||
class_name Zone
|
||||
|
||||
export(Array) var subzones : Array
|
||||
|
||||
func get_content() -> Array:
|
||||
return subzones
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
subzones = arr
|
||||
|
||||
func create_content(item_name : String = "") -> void:
|
||||
var subzone : SubZone = SubZone.new()
|
||||
subzone.resource_name = item_name
|
||||
|
||||
var r : Rect2 = get_rect()
|
||||
r.position = Vector2()
|
||||
r.size.x /= 10.0
|
||||
r.size.y /= 10.0
|
||||
|
||||
subzone.set_rect(r)
|
||||
|
||||
add_content(subzone)
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
subzones.append(entry)
|
||||
entry.set_parent_pos(get_parent_pos() + get_rect().position)
|
||||
emit_changed()
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
for i in range(subzones.size()):
|
||||
if subzones[i] == entry:
|
||||
subzones.remove(i)
|
||||
emit_changed()
|
||||
return
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
351
world_generator/test/test_world.tres
Normal file
351
world_generator/test/test_world.tres
Normal file
@ -0,0 +1,351 @@
|
||||
[gd_resource type="Resource" load_steps=40 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/resources/world_gen_world.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/world_generator/resources/continent.gd" type="Script" id=2]
|
||||
[ext_resource path="res://addons/world_generator/resources/zone.gd" type="Script" id=3]
|
||||
[ext_resource path="res://addons/world_generator/resources/subzone.gd" type="Script" id=4]
|
||||
[ext_resource path="res://scripts/world_generator/continents/test_continent.gd" type="Script" id=5]
|
||||
[ext_resource path="res://scripts/world_generator/zones/test_zone.gd" type="Script" id=6]
|
||||
[ext_resource path="res://scripts/world_generator/subzones/test_subzone.gd" type="Script" id=7]
|
||||
|
||||
[sub_resource type="Resource" id=14]
|
||||
resource_name = "qwe"
|
||||
script = ExtResource( 4 )
|
||||
rect = Rect2( 21, 25, 150, 79 )
|
||||
locked = false
|
||||
|
||||
[sub_resource type="Resource" id=15]
|
||||
resource_name = "we"
|
||||
script = ExtResource( 4 )
|
||||
rect = Rect2( 7, 9, 54, 34 )
|
||||
locked = false
|
||||
|
||||
[sub_resource type="Resource" id=34]
|
||||
resource_name = "yy"
|
||||
script = ExtResource( 7 )
|
||||
rect = Rect2( 66, 11, 100, 91 )
|
||||
locked = false
|
||||
|
||||
[sub_resource type="Resource" id=8]
|
||||
resource_name = "asdasr"
|
||||
script = ExtResource( 3 )
|
||||
rect = Rect2( 35, 21, 191.4, 127.8 )
|
||||
locked = false
|
||||
subzones = [ SubResource( 14 ), SubResource( 15 ), SubResource( 34 ) ]
|
||||
|
||||
[sub_resource type="Resource" id=13]
|
||||
resource_name = "qqq"
|
||||
script = ExtResource( 3 )
|
||||
rect = Rect2( 17, 59, 200.4, 52 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=24]
|
||||
resource_name = "trtrtr"
|
||||
script = ExtResource( 3 )
|
||||
rect = Rect2( 0, 0, 57.1, 45.8 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="GDScript" id=25]
|
||||
script/source = "tool
|
||||
extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
|
||||
class_name Zone
|
||||
|
||||
export(Array) var subzones : Array
|
||||
|
||||
func get_content() -> Array:
|
||||
return subzones
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
subzones = arr
|
||||
|
||||
func create_content(item_name : String = \"\") -> void:
|
||||
var subzone : SubZone = SubZone.new()
|
||||
subzone.resource_name = item_name
|
||||
|
||||
var r : Rect2 = get_rect()
|
||||
r.position = Vector2()
|
||||
r.size.x /= 10.0
|
||||
r.size.y /= 10.0
|
||||
|
||||
subzone.set_rect(r)
|
||||
|
||||
add_content(subzone)
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
subzones.append(entry)
|
||||
emit_changed()
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
for i in range(subzones.size()):
|
||||
if subzones[i] == entry:
|
||||
subzones.remove(i)
|
||||
emit_changed()
|
||||
return
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
||||
"
|
||||
|
||||
[sub_resource type="Resource" id=26]
|
||||
resource_name = "trtrtr (Duplicate)"
|
||||
script = SubResource( 25 )
|
||||
rect = Rect2( 64, 6, 158.1, 39.8 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=32]
|
||||
resource_name = "tttte"
|
||||
script = ExtResource( 3 )
|
||||
rect = Rect2( 103, 28, 100, 100 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=35]
|
||||
resource_name = "yu"
|
||||
script = ExtResource( 6 )
|
||||
rect = Rect2( 88, 21, 100, 100 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=1]
|
||||
resource_name = "wwww"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 163, 35, 241, 158 )
|
||||
zones = [ SubResource( 8 ), SubResource( 13 ), SubResource( 24 ), SubResource( 26 ), SubResource( 32 ), SubResource( 35 ) ]
|
||||
|
||||
[sub_resource type="Resource" id=2]
|
||||
resource_name = "efefef"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 107, 271, 100, 49 )
|
||||
|
||||
[sub_resource type="Resource" id=3]
|
||||
resource_name = "grgrg"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 498, 185, 100, 100 )
|
||||
|
||||
[sub_resource type="Resource" id=9]
|
||||
resource_name = "asd"
|
||||
script = ExtResource( 3 )
|
||||
rect = Rect2( 528, 34, 0, 0 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=10]
|
||||
resource_name = "qqq"
|
||||
script = ExtResource( 3 )
|
||||
rect = Rect2( 528, 34, 0, 0 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=4]
|
||||
resource_name = "qwdasd"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 522, 29, 63, 54 )
|
||||
zones = [ SubResource( 9 ), SubResource( 10 ) ]
|
||||
|
||||
[sub_resource type="Resource" id=11]
|
||||
resource_name = "q"
|
||||
script = ExtResource( 3 )
|
||||
rect = Rect2( 14, 11, 53, 59 )
|
||||
locked = false
|
||||
subzones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=5]
|
||||
resource_name = "qwe"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 473, 331, 100, 100 )
|
||||
zones = [ SubResource( 11 ) ]
|
||||
|
||||
[sub_resource type="GDScript" id=16]
|
||||
script/source = "tool
|
||||
extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
|
||||
class_name Continent
|
||||
|
||||
export(Array) var zones : Array
|
||||
|
||||
func get_content() -> Array:
|
||||
return zones
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
zones = arr
|
||||
|
||||
func create_content(item_name : String = \"\") -> void:
|
||||
var zone : Zone = Zone.new()
|
||||
zone.resource_name = item_name
|
||||
|
||||
var r : Rect2 = get_rect()
|
||||
r.position = Vector2()
|
||||
r.size.x /= 10.0
|
||||
r.size.y /= 10.0
|
||||
|
||||
zone.set_rect(r)
|
||||
|
||||
add_content(zone)
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
zones.append(entry)
|
||||
emit_changed()
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
for i in range(zones.size()):
|
||||
if zones[i] == entry:
|
||||
zones.remove(i)
|
||||
emit_changed()
|
||||
return
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
||||
"
|
||||
|
||||
[sub_resource type="Resource" id=17]
|
||||
resource_name = "qwetwwqasd"
|
||||
script = SubResource( 16 )
|
||||
rect = Rect2( 473, 331, 100, 100 )
|
||||
locked = false
|
||||
zones = [ SubResource( 11 ) ]
|
||||
|
||||
[sub_resource type="GDScript" id=18]
|
||||
script/source = "tool
|
||||
extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
|
||||
class_name Continent
|
||||
|
||||
export(Array) var zones : Array
|
||||
|
||||
func get_content() -> Array:
|
||||
return zones
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
zones = arr
|
||||
|
||||
func create_content(item_name : String = \"\") -> void:
|
||||
var zone : Zone = Zone.new()
|
||||
zone.resource_name = item_name
|
||||
|
||||
var r : Rect2 = get_rect()
|
||||
r.position = Vector2()
|
||||
r.size.x /= 10.0
|
||||
r.size.y /= 10.0
|
||||
|
||||
zone.set_rect(r)
|
||||
|
||||
add_content(zone)
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
zones.append(entry)
|
||||
emit_changed()
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
for i in range(zones.size()):
|
||||
if zones[i] == entry:
|
||||
zones.remove(i)
|
||||
emit_changed()
|
||||
return
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
||||
"
|
||||
|
||||
[sub_resource type="Resource" id=19]
|
||||
resource_name = "qwesat"
|
||||
script = SubResource( 18 )
|
||||
rect = Rect2( 613, 346, 100, 100 )
|
||||
locked = false
|
||||
zones = [ SubResource( 11 ) ]
|
||||
|
||||
[sub_resource type="Resource" id=20]
|
||||
resource_name = "ggg"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 26, 51, 100, 100 )
|
||||
|
||||
[sub_resource type="GDScript" id=21]
|
||||
script/source = "tool
|
||||
extends \"res://addons/world_generator/resources/world_gen_base_resource.gd\"
|
||||
class_name Continent
|
||||
|
||||
export(Array) var zones : Array
|
||||
|
||||
func get_content() -> Array:
|
||||
return zones
|
||||
|
||||
func set_content(arr : Array) -> void:
|
||||
zones = arr
|
||||
|
||||
func create_content(item_name : String = \"\") -> void:
|
||||
var zone : Zone = Zone.new()
|
||||
zone.resource_name = item_name
|
||||
|
||||
var r : Rect2 = get_rect()
|
||||
r.position = Vector2()
|
||||
r.size.x /= 10.0
|
||||
r.size.y /= 10.0
|
||||
|
||||
zone.set_rect(r)
|
||||
|
||||
add_content(zone)
|
||||
|
||||
func add_content(entry : WorldGenBaseResource) -> void:
|
||||
zones.append(entry)
|
||||
emit_changed()
|
||||
|
||||
func remove_content_entry(entry : WorldGenBaseResource) -> void:
|
||||
for i in range(zones.size()):
|
||||
if zones[i] == entry:
|
||||
zones.remove(i)
|
||||
emit_changed()
|
||||
return
|
||||
|
||||
func setup_property_inspector(inspector) -> void:
|
||||
.setup_property_inspector(inspector)
|
||||
"
|
||||
|
||||
[sub_resource type="Resource" id=22]
|
||||
resource_name = "ggg (Duplicate)"
|
||||
script = SubResource( 21 )
|
||||
rect = Rect2( 33, 181, 100, 100 )
|
||||
locked = false
|
||||
zones = [ ]
|
||||
|
||||
[sub_resource type="Resource" id=23]
|
||||
resource_name = "eeqqq"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 256, 365, 100, 100 )
|
||||
|
||||
[sub_resource type="Resource" id=27]
|
||||
resource_name = "asd"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 337, 79, 100, 100 )
|
||||
|
||||
[sub_resource type="Resource" id=28]
|
||||
resource_name = "asd"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 244, 234, 100, 100 )
|
||||
|
||||
[sub_resource type="Resource" id=29]
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 377, 69, 284, 238 )
|
||||
|
||||
[sub_resource type="Resource" id=30]
|
||||
resource_name = "tttttt"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 188, 225, 233, 259 )
|
||||
|
||||
[sub_resource type="Resource" id=31]
|
||||
resource_name = "ttttyuqtttt"
|
||||
script = ExtResource( 2 )
|
||||
rect = Rect2( 339, 76, 220, 170 )
|
||||
|
||||
[sub_resource type="Resource" id=33]
|
||||
resource_name = "qttt"
|
||||
script = ExtResource( 5 )
|
||||
rect = Rect2( 99, 78, 213, 105 )
|
||||
locked = false
|
||||
zones = [ ]
|
||||
|
||||
[resource]
|
||||
resource_name = "asdasdsse"
|
||||
script = ExtResource( 1 )
|
||||
rect = Rect2( 0, 0, 1000, 1000 )
|
||||
locked = false
|
||||
continents = [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ), SubResource( 17 ), SubResource( 19 ), SubResource( 20 ), SubResource( 22 ), SubResource( 23 ), SubResource( 27 ), SubResource( 28 ), SubResource( 29 ), SubResource( 30 ), SubResource( 31 ), SubResource( 33 ) ]
|
175
world_generator/ui/DataList.gd
Normal file
175
world_generator/ui/DataList.gd
Normal file
@ -0,0 +1,175 @@
|
||||
tool
|
||||
extends Tree
|
||||
|
||||
export(int, "Continent,Zone,Sub Zone") var class_types : int = 0
|
||||
|
||||
var edited_resource : WorldGenBaseResource = null
|
||||
var name_edited_resource : WorldGenBaseResource = null
|
||||
|
||||
var _ignore_changed_event : bool = false
|
||||
|
||||
var _plugin : EditorPlugin = null
|
||||
var _undo_redo : UndoRedo = null
|
||||
|
||||
func _init():
|
||||
connect("item_activated", self, "on_item_activated")
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
_plugin = plugin
|
||||
_undo_redo = _plugin.get_undo_redo()
|
||||
|
||||
func _enter_tree():
|
||||
var dir : Directory = Directory.new()
|
||||
|
||||
if dir.file_exists("res://world_generator_settings.tres"):
|
||||
var wgs : WorldGeneratorSettings = load("res://world_generator_settings.tres") as WorldGeneratorSettings
|
||||
|
||||
if !wgs:
|
||||
return
|
||||
|
||||
wgs.evaluate_scripts(class_types, $NameDialog/VBoxContainer/Tree)
|
||||
|
||||
func add_item(item_name : String = "") -> void:
|
||||
if !edited_resource:
|
||||
return
|
||||
|
||||
var ti : TreeItem = $NameDialog/VBoxContainer/Tree.get_selected()
|
||||
|
||||
if !ti:
|
||||
return
|
||||
|
||||
var e : WorldGenBaseResource = null
|
||||
|
||||
if ti.has_meta("class_name"):
|
||||
var cn : String = ti.get_meta("class_name")
|
||||
|
||||
if cn == "Continent":
|
||||
e = Continent.new()
|
||||
elif cn == "Zone":
|
||||
e = Zone.new()
|
||||
elif cn == "SubZone":
|
||||
e = SubZone.new()
|
||||
|
||||
elif ti.has_meta("file"):
|
||||
var cls = load(ti.get_meta("file"))
|
||||
|
||||
if cls:
|
||||
e = cls.new()
|
||||
|
||||
if !e:
|
||||
return
|
||||
|
||||
e.resource_name = item_name
|
||||
|
||||
#edited_resource.add_content(e)
|
||||
#remove_content_entry
|
||||
|
||||
_undo_redo.create_action("WE: Created Entry")
|
||||
_undo_redo.add_do_method(edited_resource, "add_content", e)
|
||||
_undo_redo.add_undo_method(edited_resource, "remove_content_entry", e)
|
||||
_undo_redo.commit_action()
|
||||
|
||||
func refresh() -> void:
|
||||
clear()
|
||||
|
||||
if !edited_resource:
|
||||
return
|
||||
|
||||
var root : TreeItem = create_item()
|
||||
|
||||
var data : Array = edited_resource.get_content()
|
||||
|
||||
for d in data:
|
||||
if d:
|
||||
var n : String = d.resource_name
|
||||
|
||||
if n == "":
|
||||
n = "<no name>"
|
||||
|
||||
var item : TreeItem = create_item(root)
|
||||
|
||||
item.set_text(0, n)
|
||||
item.set_meta("res", d)
|
||||
|
||||
func set_edited_resource(res : WorldGenBaseResource)-> void:
|
||||
if edited_resource:
|
||||
edited_resource.disconnect("changed", self, "on_resource_changed")
|
||||
|
||||
edited_resource = res
|
||||
|
||||
if edited_resource:
|
||||
edited_resource.connect("changed", self, "on_resource_changed")
|
||||
|
||||
refresh()
|
||||
|
||||
func add_button_pressed() -> void:
|
||||
$NameDialog/VBoxContainer/LineEdit.text = ""
|
||||
$NameDialog.popup_centered()
|
||||
|
||||
func name_dialog_ok_pressed() -> void:
|
||||
add_item($NameDialog/VBoxContainer/LineEdit.text)
|
||||
|
||||
func name_edit_dialog_ok_pressed() -> void:
|
||||
if name_edited_resource:
|
||||
name_edited_resource.resource_name = $NameEditDialog/VBoxContainer/LineEdit.text
|
||||
name_edited_resource.emit_changed()
|
||||
name_edited_resource = null
|
||||
on_resource_changed()
|
||||
|
||||
func delete_button_pressed() -> void:
|
||||
var item : TreeItem = get_selected()
|
||||
|
||||
if !item:
|
||||
return
|
||||
|
||||
var item_resource = item.get_meta("res")
|
||||
|
||||
if !item_resource:
|
||||
return
|
||||
|
||||
#edited_resource.remove_content_entry(item_resource)
|
||||
|
||||
_undo_redo.create_action("WE: Created Entry")
|
||||
_undo_redo.add_do_method(edited_resource, "remove_content_entry", item_resource)
|
||||
_undo_redo.add_undo_method(edited_resource, "add_content", item_resource)
|
||||
_undo_redo.commit_action()
|
||||
|
||||
func duplicate_button_pressed() -> void:
|
||||
var item : TreeItem = get_selected()
|
||||
|
||||
if !item:
|
||||
return
|
||||
|
||||
var item_resource = item.get_meta("res")
|
||||
|
||||
if !item_resource:
|
||||
return
|
||||
|
||||
#edited_resource.duplicate_content_entry(item_resource)
|
||||
|
||||
var de = edited_resource.duplicate_content_entry(item_resource, false)
|
||||
|
||||
_undo_redo.create_action("WE: Created Entry")
|
||||
_undo_redo.add_do_method(edited_resource, "add_content", de)
|
||||
_undo_redo.add_undo_method(edited_resource, "remove_content_entry", de)
|
||||
_undo_redo.commit_action()
|
||||
|
||||
func on_resource_changed() -> void:
|
||||
if _ignore_changed_event:
|
||||
return
|
||||
|
||||
call_deferred("refresh")
|
||||
|
||||
func on_item_activated() -> void:
|
||||
var item : TreeItem = get_selected()
|
||||
|
||||
if !item:
|
||||
return
|
||||
|
||||
name_edited_resource = item.get_meta("res")
|
||||
|
||||
if !name_edited_resource:
|
||||
return
|
||||
|
||||
$NameEditDialog/VBoxContainer/LineEdit.text = name_edited_resource.resource_name
|
||||
$NameEditDialog.popup_centered()
|
84
world_generator/ui/DataList.tscn
Normal file
84
world_generator/ui/DataList.tscn
Normal file
@ -0,0 +1,84 @@
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/DataList.gd" type="Script" id=1]
|
||||
|
||||
[node name="DataList" type="Tree"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
hide_root = true
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="NameDialog" type="ConfirmationDialog" parent="."]
|
||||
margin_right = 329.0
|
||||
margin_bottom = 313.0
|
||||
window_title = "Name"
|
||||
resizable = true
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="NameDialog"]
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = 321.0
|
||||
margin_bottom = 277.0
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="Label2" type="Label" parent="NameDialog/VBoxContainer"]
|
||||
margin_right = 313.0
|
||||
margin_bottom = 14.0
|
||||
text = "Class"
|
||||
|
||||
[node name="Tree" type="Tree" parent="NameDialog/VBoxContainer"]
|
||||
margin_top = 18.0
|
||||
margin_right = 313.0
|
||||
margin_bottom = 223.0
|
||||
rect_min_size = Vector2( 0, 200 )
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Label" type="Label" parent="NameDialog/VBoxContainer"]
|
||||
margin_top = 227.0
|
||||
margin_right = 313.0
|
||||
margin_bottom = 241.0
|
||||
text = "Name"
|
||||
|
||||
[node name="LineEdit" type="LineEdit" parent="NameDialog/VBoxContainer"]
|
||||
margin_top = 245.0
|
||||
margin_right = 313.0
|
||||
margin_bottom = 269.0
|
||||
|
||||
[node name="NameEditDialog" type="ConfirmationDialog" parent="."]
|
||||
margin_right = 223.0
|
||||
margin_bottom = 82.0
|
||||
window_title = "Name"
|
||||
resizable = true
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="NameEditDialog"]
|
||||
margin_left = 8.0
|
||||
margin_top = 8.0
|
||||
margin_right = 215.0
|
||||
margin_bottom = 50.0
|
||||
|
||||
[node name="Label" type="Label" parent="NameEditDialog/VBoxContainer"]
|
||||
margin_right = 207.0
|
||||
margin_bottom = 14.0
|
||||
text = "Name"
|
||||
|
||||
[node name="LineEdit" type="LineEdit" parent="NameEditDialog/VBoxContainer"]
|
||||
margin_top = 18.0
|
||||
margin_right = 207.0
|
||||
margin_bottom = 42.0
|
||||
|
||||
[connection signal="confirmed" from="NameDialog" to="." method="name_dialog_ok_pressed"]
|
||||
[connection signal="confirmed" from="NameEditDialog" to="." method="name_edit_dialog_ok_pressed"]
|
21
world_generator/ui/MainScreen.gd
Normal file
21
world_generator/ui/MainScreen.gd
Normal file
@ -0,0 +1,21 @@
|
||||
tool
|
||||
extends PanelContainer
|
||||
|
||||
var edited_world
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
$TabContainer/World.set_plugin(plugin)
|
||||
$TabContainer/Continent.set_plugin(plugin)
|
||||
$TabContainer/Zone.set_plugin(plugin)
|
||||
$TabContainer/SubZone.set_plugin(plugin)
|
||||
|
||||
func refresh() -> void:
|
||||
$TabContainer/World.set_wgworld(edited_world)
|
||||
$TabContainer/Continent.set_wgworld(edited_world)
|
||||
$TabContainer/Zone.set_wgworld(edited_world)
|
||||
$TabContainer/SubZone.set_wgworld(edited_world)
|
||||
|
||||
func set_wgworld(wgw : WorldGenWorld) -> void:
|
||||
edited_world = wgw
|
||||
|
||||
refresh()
|
47
world_generator/ui/MainScreen.tscn
Normal file
47
world_generator/ui/MainScreen.tscn
Normal file
@ -0,0 +1,47 @@
|
||||
[gd_scene load_steps=6 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/MainScreen.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/world_generator/ui/tabs/World.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/world_generator/ui/tabs/Continent.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/world_generator/ui/tabs/Zone.tscn" type="PackedScene" id=4]
|
||||
[ext_resource path="res://addons/world_generator/ui/tabs/SubZone.tscn" type="PackedScene" id=5]
|
||||
|
||||
[node name="WorldGenerator" type="PanelContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
rect_min_size = Vector2( 0, 200 )
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="TabContainer" type="TabContainer" parent="."]
|
||||
margin_left = 7.0
|
||||
margin_top = 7.0
|
||||
margin_right = 1017.0
|
||||
margin_bottom = 593.0
|
||||
tab_align = 0
|
||||
|
||||
[node name="World" parent="TabContainer" instance=ExtResource( 2 )]
|
||||
|
||||
[node name="Continent" parent="TabContainer" instance=ExtResource( 3 )]
|
||||
visible = false
|
||||
margin_left = 4.0
|
||||
margin_top = 32.0
|
||||
margin_right = -4.0
|
||||
margin_bottom = -4.0
|
||||
|
||||
[node name="Zone" parent="TabContainer" instance=ExtResource( 4 )]
|
||||
visible = false
|
||||
margin_left = 4.0
|
||||
margin_top = 32.0
|
||||
margin_right = -4.0
|
||||
margin_bottom = -4.0
|
||||
|
||||
[node name="SubZone" parent="TabContainer" instance=ExtResource( 5 )]
|
||||
visible = false
|
||||
margin_left = 4.0
|
||||
margin_top = 32.0
|
||||
margin_right = -4.0
|
||||
margin_bottom = -4.0
|
12
world_generator/ui/RectEditor.gd
Normal file
12
world_generator/ui/RectEditor.gd
Normal file
@ -0,0 +1,12 @@
|
||||
tool
|
||||
extends PanelContainer
|
||||
|
||||
func _init():
|
||||
# Control/EditorZoomWidget
|
||||
pass
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
$ScrollContainer/MarginContainer/RectView.set_plugin(plugin)
|
||||
|
||||
func set_edited_resource(res : WorldGenBaseResource):
|
||||
$ScrollContainer/MarginContainer/RectView.set_edited_resource(res)
|
54
world_generator/ui/RectEditor.tscn
Normal file
54
world_generator/ui/RectEditor.tscn
Normal file
@ -0,0 +1,54 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/RectEditor.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/world_generator/widgets/EditorZoomWidget.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/world_generator/ui/RectView.gd" type="Script" id=3]
|
||||
|
||||
[node name="RectEditor" type="PanelContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="."]
|
||||
margin_left = 7.0
|
||||
margin_top = 7.0
|
||||
margin_right = 1017.0
|
||||
margin_bottom = 593.0
|
||||
|
||||
[node name="MarginContainer" type="MarginContainer" parent="ScrollContainer"]
|
||||
margin_right = 400.0
|
||||
margin_bottom = 400.0
|
||||
custom_constants/margin_right = 200
|
||||
custom_constants/margin_top = 200
|
||||
custom_constants/margin_left = 200
|
||||
custom_constants/margin_bottom = 200
|
||||
|
||||
[node name="RectView" type="Control" parent="ScrollContainer/MarginContainer"]
|
||||
margin_left = 200.0
|
||||
margin_top = 200.0
|
||||
margin_right = 200.0
|
||||
margin_bottom = 200.0
|
||||
script = ExtResource( 3 )
|
||||
zoom_widget_path = NodePath("../../../Control/EditorZoomWidget")
|
||||
|
||||
[node name="Control" type="Control" parent="."]
|
||||
margin_left = 7.0
|
||||
margin_top = 7.0
|
||||
margin_right = 1017.0
|
||||
margin_bottom = 593.0
|
||||
mouse_filter = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="EditorZoomWidget" parent="Control" instance=ExtResource( 2 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 115.0
|
||||
margin_bottom = 22.0
|
||||
custom_constants/separation = -8
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
116
world_generator/ui/RectView.gd
Normal file
116
world_generator/ui/RectView.gd
Normal file
@ -0,0 +1,116 @@
|
||||
tool
|
||||
extends Control
|
||||
|
||||
var rect_editor_node_scene : PackedScene = preload("res://addons/world_generator/ui/RectViewNode.tscn")
|
||||
|
||||
export(NodePath) var zoom_widget_path : NodePath = ""
|
||||
|
||||
var _rect_scale : float = 1
|
||||
|
||||
var edited_resource : WorldGenBaseResource = null
|
||||
var edited_resource_current_size : Vector2 = Vector2()
|
||||
|
||||
var _plugin : EditorPlugin = null
|
||||
var _undo_redo : UndoRedo = null
|
||||
|
||||
func _enter_tree():
|
||||
var zoom_widget : Node = get_node_or_null(zoom_widget_path)
|
||||
|
||||
if !zoom_widget:
|
||||
return
|
||||
|
||||
if !zoom_widget.is_connected("zoom_changed", self, "on_zoom_changed"):
|
||||
zoom_widget.connect("zoom_changed", self, "on_zoom_changed")
|
||||
|
||||
if !is_connected("visibility_changed", self, "on_visibility_changed"):
|
||||
connect("visibility_changed", self, "on_visibility_changed")
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
_plugin = plugin
|
||||
_undo_redo = _plugin.get_undo_redo()
|
||||
|
||||
func on_visibility_changed() -> void:
|
||||
call_deferred("apply_zoom")
|
||||
|
||||
func apply_zoom() -> void:
|
||||
if !edited_resource:
|
||||
return
|
||||
|
||||
var rect : Rect2 = edited_resource.rect
|
||||
edited_resource_current_size = rect.size
|
||||
rect.position = rect.position * _rect_scale
|
||||
rect.size = rect.size * _rect_scale
|
||||
set_custom_minimum_size(rect.size)
|
||||
|
||||
var p : MarginContainer = get_parent() as MarginContainer
|
||||
|
||||
p.add_constant_override("margin_left", min(rect.size.x / 4.0, 50 * _rect_scale))
|
||||
p.add_constant_override("margin_right", min(rect.size.x / 4.0, 50 * _rect_scale))
|
||||
p.add_constant_override("margin_top", min(rect.size.y / 4.0, 50 * _rect_scale))
|
||||
p.add_constant_override("margin_bottom", min(rect.size.y / 4.0, 50 * _rect_scale))
|
||||
|
||||
for c in get_children():
|
||||
c.set_editor_rect_scale(_rect_scale)
|
||||
|
||||
func on_zoom_changed(zoom : float) -> void:
|
||||
_rect_scale = zoom
|
||||
apply_zoom()
|
||||
|
||||
func _draw():
|
||||
draw_rect(Rect2(Vector2(), get_size()), Color(0.2, 0.2, 0.2, 1))
|
||||
|
||||
func refresh() -> void:
|
||||
clear()
|
||||
|
||||
if !edited_resource:
|
||||
return
|
||||
|
||||
var rect : Rect2 = edited_resource.rect
|
||||
edited_resource_current_size = rect.size
|
||||
rect.position = rect.position * _rect_scale
|
||||
rect.size = rect.size * _rect_scale
|
||||
set_custom_minimum_size(rect.size)
|
||||
|
||||
apply_zoom()
|
||||
|
||||
refresh_rects()
|
||||
|
||||
func clear() -> void:
|
||||
pass
|
||||
|
||||
func refresh_rects() -> void:
|
||||
clear_rects()
|
||||
|
||||
if !edited_resource:
|
||||
return
|
||||
|
||||
var cont : Array = edited_resource.get_content()
|
||||
|
||||
for c in cont:
|
||||
if c:
|
||||
var s : Node = rect_editor_node_scene.instance()
|
||||
|
||||
add_child(s)
|
||||
s.set_plugin(_plugin)
|
||||
s.set_editor_rect_scale(_rect_scale)
|
||||
s.edited_resource_parent_size = edited_resource_current_size
|
||||
s.set_edited_resource(c)
|
||||
|
||||
func clear_rects():
|
||||
for c in get_children():
|
||||
c.queue_free()
|
||||
remove_child(c)
|
||||
|
||||
func set_edited_resource(res : WorldGenBaseResource):
|
||||
if edited_resource:
|
||||
edited_resource.disconnect("changed", self, "on_edited_resource_changed")
|
||||
|
||||
edited_resource = res
|
||||
|
||||
refresh()
|
||||
|
||||
if edited_resource:
|
||||
edited_resource.connect("changed", self, "on_edited_resource_changed")
|
||||
|
||||
func on_edited_resource_changed() -> void:
|
||||
call_deferred("refresh")
|
227
world_generator/ui/RectViewNode.gd
Normal file
227
world_generator/ui/RectViewNode.gd
Normal file
@ -0,0 +1,227 @@
|
||||
tool
|
||||
extends MarginContainer
|
||||
|
||||
enum DragType {
|
||||
DRAG_NONE = 0,
|
||||
DRAG_MOVE = 1,
|
||||
DRAG_RESIZE_TOP = 1 << 1,
|
||||
DRAG_RESIZE_RIGHT = 1 << 2,
|
||||
DRAG_RESIZE_BOTTOM = 1 << 3,
|
||||
DRAG_RESIZE_LEFT = 1 << 4
|
||||
};
|
||||
|
||||
var edited_resource : WorldGenBaseResource = null
|
||||
var edited_resource_parent_size : Vector2 = Vector2()
|
||||
|
||||
var _edited_resource_rect_border_color : Color = Color(1, 1, 1, 1)
|
||||
var _edited_resource_rect_color : Color = Color(0.8, 0.8, 0.8, 0.9)
|
||||
var _editor_rect_border_size : int = 2
|
||||
var _edited_resource_font_color : Color = Color(0, 0, 0, 1)
|
||||
var _editor_additional_text : String = ""
|
||||
|
||||
var drag_type : int
|
||||
var drag_offset : Vector2
|
||||
var drag_offset_far : Vector2
|
||||
|
||||
var _rect_scale : float = 1
|
||||
|
||||
var _edited_resource_event_ignore : bool = false
|
||||
|
||||
var _plugin : EditorPlugin = null
|
||||
var _undo_redo : UndoRedo = null
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
_plugin = plugin
|
||||
_undo_redo = _plugin.get_undo_redo()
|
||||
|
||||
func _draw():
|
||||
draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_color)
|
||||
draw_rect(Rect2(Vector2(), get_size()), _edited_resource_rect_border_color, false, _editor_rect_border_size)
|
||||
|
||||
var font : Font = get_font("font")
|
||||
|
||||
var res_name : String = "NULL"
|
||||
|
||||
if edited_resource:
|
||||
res_name = edited_resource.resource_name
|
||||
|
||||
var res_cls : String = ""
|
||||
|
||||
if edited_resource:
|
||||
res_cls = edited_resource.get_editor_class()
|
||||
|
||||
draw_string(font, Vector2(_editor_rect_border_size, font.get_height()), res_name, _edited_resource_font_color)
|
||||
draw_string(font, Vector2(_editor_rect_border_size, font.get_height() * 2), _editor_additional_text, _edited_resource_font_color, get_rect().size.x)
|
||||
|
||||
if res_cls != "":
|
||||
draw_string(font, Vector2(_editor_rect_border_size, font.get_height() * 3), res_cls, _edited_resource_font_color, get_rect().size.x)
|
||||
|
||||
func refresh() -> void:
|
||||
if !edited_resource:
|
||||
return
|
||||
|
||||
#anchor is bottom left here
|
||||
var rect : Rect2 = edited_resource.get_rect()
|
||||
rect.position *= _rect_scale
|
||||
rect.size *= _rect_scale
|
||||
|
||||
#anchor needs to be on top left here
|
||||
var rp : Vector2 = rect.position
|
||||
rp.y = edited_resource_parent_size.y * _rect_scale - rect.size.y - rect.position.y
|
||||
rect_position = rp
|
||||
rect_size = rect.size
|
||||
|
||||
update()
|
||||
|
||||
func set_editor_rect_scale(rect_scale) -> void:
|
||||
_rect_scale = rect_scale
|
||||
|
||||
refresh()
|
||||
|
||||
func set_edited_resource(res : WorldGenBaseResource):
|
||||
edited_resource = res
|
||||
|
||||
if edited_resource:
|
||||
_edited_resource_rect_border_color = edited_resource.get_editor_rect_border_color()
|
||||
_edited_resource_rect_color = edited_resource.get_editor_rect_color()
|
||||
_editor_rect_border_size = edited_resource.get_editor_rect_border_size()
|
||||
_edited_resource_font_color = edited_resource.get_editor_font_color()
|
||||
_editor_additional_text = edited_resource.get_editor_additional_text()
|
||||
|
||||
edited_resource.connect("changed", self, "on_edited_resource_changed")
|
||||
|
||||
refresh()
|
||||
|
||||
func on_edited_resource_changed() -> void:
|
||||
if _edited_resource_event_ignore:
|
||||
return
|
||||
|
||||
refresh()
|
||||
|
||||
#based on / ported from engine/scene/gui/dialogs.h and .cpp
|
||||
func _notification(p_what : int) -> void:
|
||||
if (p_what == NOTIFICATION_MOUSE_EXIT):
|
||||
# Reset the mouse cursor when leaving the resizable window border.
|
||||
if (edited_resource && !edited_resource.locked && !drag_type):
|
||||
if (get_default_cursor_shape() != CURSOR_ARROW):
|
||||
set_default_cursor_shape(CURSOR_ARROW)
|
||||
|
||||
#based on / ported from engine/scene/gui/dialogs.h and .cpp
|
||||
func _gui_input(p_event : InputEvent) -> void:
|
||||
if (p_event is InputEventMouseButton) && (p_event.get_button_index() == BUTTON_LEFT):
|
||||
var mb : InputEventMouseButton = p_event as InputEventMouseButton
|
||||
|
||||
if (mb.is_pressed()):
|
||||
# Begin a possible dragging operation.
|
||||
drag_type = _drag_hit_test(Vector2(mb.get_position().x, mb.get_position().y))
|
||||
|
||||
if (drag_type != DragType.DRAG_NONE):
|
||||
drag_offset = get_global_mouse_position() - get_position()
|
||||
|
||||
drag_offset_far = get_position() + get_size() - get_global_mouse_position()
|
||||
|
||||
elif (drag_type != DragType.DRAG_NONE && !mb.is_pressed()):
|
||||
# End a dragging operation.
|
||||
drag_type = DragType.DRAG_NONE
|
||||
|
||||
var rect : Rect2 = get_rect()
|
||||
#rect needs to be converted back
|
||||
rect.position.y = edited_resource_parent_size.y * _rect_scale - rect.size.y - rect.position.y
|
||||
rect.position /= _rect_scale
|
||||
rect.size /= _rect_scale
|
||||
|
||||
#edited_resource.set_rect(rect)
|
||||
_edited_resource_event_ignore = true
|
||||
_undo_redo.create_action("WE: Drag End")
|
||||
_undo_redo.add_do_method(edited_resource, "set_rect", rect)
|
||||
_undo_redo.add_undo_method(edited_resource, "set_rect", edited_resource.get_rect())
|
||||
_undo_redo.commit_action()
|
||||
_edited_resource_event_ignore = false
|
||||
|
||||
if p_event is InputEventMouseMotion:
|
||||
var mm : InputEventMouseMotion = p_event as InputEventMouseMotion
|
||||
|
||||
if (drag_type == DragType.DRAG_NONE):
|
||||
# Update the cursor while moving along the borders.
|
||||
var cursor = CURSOR_ARROW
|
||||
if (!edited_resource.locked):
|
||||
var preview_drag_type : int = _drag_hit_test(Vector2(mm.get_position().x, mm.get_position().y))
|
||||
|
||||
var top_left : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_LEFT
|
||||
var bottom_right : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_RIGHT
|
||||
var top_right : int = DragType.DRAG_RESIZE_TOP + DragType.DRAG_RESIZE_RIGHT
|
||||
var bottom_left : int = DragType.DRAG_RESIZE_BOTTOM + DragType.DRAG_RESIZE_LEFT
|
||||
|
||||
match (preview_drag_type):
|
||||
DragType.DRAG_RESIZE_TOP:
|
||||
cursor = CURSOR_VSIZE
|
||||
DragType.DRAG_RESIZE_BOTTOM:
|
||||
cursor = CURSOR_VSIZE
|
||||
DragType.DRAG_RESIZE_LEFT:
|
||||
cursor = CURSOR_HSIZE
|
||||
DragType.DRAG_RESIZE_RIGHT:
|
||||
cursor = CURSOR_HSIZE
|
||||
top_left:
|
||||
cursor = CURSOR_FDIAGSIZE
|
||||
bottom_right:
|
||||
cursor = CURSOR_FDIAGSIZE
|
||||
top_right:
|
||||
cursor = CURSOR_BDIAGSIZE
|
||||
bottom_left:
|
||||
cursor = CURSOR_BDIAGSIZE
|
||||
|
||||
if (get_cursor_shape() != cursor):
|
||||
set_default_cursor_shape(cursor);
|
||||
|
||||
else:
|
||||
# Update while in a dragging operation.
|
||||
var global_pos : Vector2 = get_global_mouse_position()
|
||||
|
||||
var rect : Rect2 = get_rect()
|
||||
var min_size : Vector2 = get_combined_minimum_size()
|
||||
|
||||
if (drag_type == DragType.DRAG_MOVE):
|
||||
rect.position = global_pos - drag_offset
|
||||
else:
|
||||
if (drag_type & DragType.DRAG_RESIZE_TOP):
|
||||
var bottom : int = rect.position.y + rect.size.y
|
||||
var max_y : int = bottom - min_size.y
|
||||
rect.position.y = min(global_pos.y - drag_offset.y, max_y)
|
||||
rect.size.y = bottom - rect.position.y
|
||||
elif (drag_type & DragType.DRAG_RESIZE_BOTTOM):
|
||||
rect.size.y = global_pos.y - rect.position.y + drag_offset_far.y
|
||||
|
||||
if (drag_type & DragType.DRAG_RESIZE_LEFT):
|
||||
var right : int = rect.position.x + rect.size.x
|
||||
var max_x : int = right - min_size.x
|
||||
rect.position.x = min(global_pos.x - drag_offset.x, max_x)
|
||||
rect.size.x = right - rect.position.x
|
||||
elif (drag_type & DragType.DRAG_RESIZE_RIGHT):
|
||||
rect.size.x = global_pos.x - rect.position.x + drag_offset_far.x
|
||||
|
||||
set_size(rect.size)
|
||||
set_position(rect.position)
|
||||
|
||||
#based on / ported from engine/scene/gui/dialogs.h and .cpp
|
||||
func _drag_hit_test(pos : Vector2) -> int:
|
||||
var drag_type : int = DragType.DRAG_NONE
|
||||
|
||||
if (!edited_resource.locked):
|
||||
var scaleborder_size : int = 5 #get_constant("scaleborder_size", "WindowDialog")
|
||||
|
||||
var rect : Rect2 = get_rect()
|
||||
|
||||
if (pos.y < (scaleborder_size)):
|
||||
drag_type = DragType.DRAG_RESIZE_TOP
|
||||
elif (pos.y >= (rect.size.y - scaleborder_size)):
|
||||
drag_type = DragType.DRAG_RESIZE_BOTTOM
|
||||
|
||||
if (pos.x < scaleborder_size):
|
||||
drag_type |= DragType.DRAG_RESIZE_LEFT
|
||||
elif (pos.x >= (rect.size.x - scaleborder_size)):
|
||||
drag_type |= DragType.DRAG_RESIZE_RIGHT
|
||||
|
||||
if (drag_type == DragType.DRAG_NONE):
|
||||
drag_type = DragType.DRAG_MOVE
|
||||
|
||||
return drag_type
|
11
world_generator/ui/RectViewNode.tscn
Normal file
11
world_generator/ui/RectViewNode.tscn
Normal file
@ -0,0 +1,11 @@
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/RectViewNode.gd" type="Script" id=1]
|
||||
|
||||
[node name="RectViewNode" type="MarginContainer"]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
492
world_generator/ui/ResourcePropertyList.gd
Normal file
492
world_generator/ui/ResourcePropertyList.gd
Normal file
@ -0,0 +1,492 @@
|
||||
tool
|
||||
extends ScrollContainer
|
||||
|
||||
var EditorResourceWidget : PackedScene = preload("res://addons/world_generator/widgets/EditorResourceWidget.tscn")
|
||||
|
||||
var _edited_resource : WorldGenBaseResource = null
|
||||
var properties : Array = Array()
|
||||
|
||||
var _ignore_changed_evend : bool = false
|
||||
var _refresh_queued : bool = false
|
||||
|
||||
var _plugin : EditorPlugin = null
|
||||
var _undo_redo : UndoRedo = null
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
_plugin = plugin
|
||||
_undo_redo = _plugin.get_undo_redo()
|
||||
|
||||
func add_h_separator() -> int:
|
||||
var hsep : HSeparator = HSeparator.new()
|
||||
|
||||
var content_node = $MainContainer/Content
|
||||
|
||||
content_node.add_child(hsep)
|
||||
var slot_idx : int = content_node.get_child_count() - 1
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_color(getter : String, setter : String) -> int:
|
||||
var cp : ColorPickerButton = ColorPickerButton.new()
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, cp)
|
||||
|
||||
cp.color = _edited_resource.call(getter)
|
||||
|
||||
cp.connect("color_changed", _edited_resource, setter)
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_label(getter : String, setter : String, slot_name : String) -> int:
|
||||
var l : Label = Label.new()
|
||||
|
||||
l.text = slot_name
|
||||
|
||||
return add_slot(getter, setter, l)
|
||||
|
||||
func add_slot_resource(getter : String, setter : String, slot_name : String, resource_type : String = "Resource") -> int:
|
||||
var bc : HBoxContainer = HBoxContainer.new()
|
||||
bc.set_h_size_flags(SIZE_EXPAND_FILL)
|
||||
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
bc.add_child(l)
|
||||
|
||||
var r : Control = EditorResourceWidget.instance()
|
||||
r.set_plugin(_plugin)
|
||||
r.set_resource_type(resource_type)
|
||||
r.set_resource(_edited_resource.call(getter))
|
||||
r.set_h_size_flags(SIZE_EXPAND_FILL)
|
||||
|
||||
bc.add_child(r)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
|
||||
r.connect("on_resource_changed", self, "on_widget_resource_changed", [ slot_idx ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_line_edit(getter : String, setter : String, slot_name : String, placeholder : String = "") -> int:
|
||||
var bc : HBoxContainer = HBoxContainer.new()
|
||||
bc.set_h_size_flags(SIZE_EXPAND_FILL)
|
||||
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
bc.add_child(l)
|
||||
|
||||
var le : LineEdit = LineEdit.new()
|
||||
le.placeholder_text = placeholder
|
||||
le.set_h_size_flags(SIZE_EXPAND_FILL)
|
||||
bc.add_child(le)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
|
||||
le.text = _edited_resource.call(getter)
|
||||
|
||||
le.connect("text_entered", self, "on_slot_line_edit_text_entered", [ slot_idx ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_enum(getter : String, setter : String, slot_name : String, values : Array) -> int:
|
||||
var bc : VBoxContainer = VBoxContainer.new()
|
||||
|
||||
if slot_name:
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
bc.add_child(l)
|
||||
|
||||
var mb : OptionButton = OptionButton.new()
|
||||
|
||||
for v in values:
|
||||
mb.add_item(v)
|
||||
|
||||
bc.add_child(mb)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
|
||||
mb.selected = _edited_resource.call(getter)
|
||||
|
||||
mb.connect("item_selected", self, "on_slot_enum_item_selected", [ slot_idx ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_int(getter : String, setter : String, slot_name : String, prange : Vector2 = Vector2(-1000, 1000)) -> int:
|
||||
var bc : HBoxContainer = HBoxContainer.new()
|
||||
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
l.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
bc.add_child(l)
|
||||
|
||||
var sb : SpinBox = SpinBox.new()
|
||||
sb.rounded = true
|
||||
sb.min_value = prange.x
|
||||
sb.max_value = prange.y
|
||||
bc.add_child(sb)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
|
||||
sb.value = _edited_resource.call(getter)
|
||||
|
||||
sb.connect("value_changed", self, "on_int_spinbox_value_changed", [ slot_idx ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_bool(getter : String, setter : String, slot_name : String) -> int:
|
||||
var cb : CheckBox = CheckBox.new()
|
||||
cb.text = slot_name
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, cb)
|
||||
|
||||
cb.pressed = _edited_resource.call(getter)
|
||||
|
||||
cb.connect("toggled", self, "on_checkbox_value_changed", [ slot_idx ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_float(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
|
||||
var bc : HBoxContainer = HBoxContainer.new()
|
||||
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
l.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
bc.add_child(l)
|
||||
|
||||
var sb : SpinBox = SpinBox.new()
|
||||
bc.add_child(sb)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
sb.rounded = false
|
||||
sb.step = step
|
||||
sb.min_value = prange.x
|
||||
sb.max_value = prange.y
|
||||
sb.value = _edited_resource.call(getter)
|
||||
|
||||
sb.connect("value_changed", self, "on_float_spinbox_value_changed", [ slot_idx ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_vector2(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
|
||||
var bc : VBoxContainer = VBoxContainer.new()
|
||||
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
bc.add_child(l)
|
||||
|
||||
var sbx : SpinBox = SpinBox.new()
|
||||
bc.add_child(sbx)
|
||||
|
||||
var sby : SpinBox = SpinBox.new()
|
||||
bc.add_child(sby)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
sbx.rounded = false
|
||||
sby.rounded = false
|
||||
sbx.step = step
|
||||
sby.step = step
|
||||
sbx.min_value = prange.x
|
||||
sbx.max_value = prange.y
|
||||
sby.min_value = prange.x
|
||||
sby.max_value = prange.y
|
||||
|
||||
var val : Vector2 = _edited_resource.call(getter)
|
||||
|
||||
sbx.value = val.x
|
||||
sby.value = val.y
|
||||
|
||||
sbx.connect("value_changed", self, "on_vector2_spinbox_value_changed", [ slot_idx, sbx, sby ])
|
||||
sby.connect("value_changed", self, "on_vector2_spinbox_value_changed", [ slot_idx, sbx, sby ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot_vector3(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-1000, 1000)) -> int:
|
||||
var bc : VBoxContainer = VBoxContainer.new()
|
||||
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
bc.add_child(l)
|
||||
|
||||
var sbx : SpinBox = SpinBox.new()
|
||||
bc.add_child(sbx)
|
||||
|
||||
var sby : SpinBox = SpinBox.new()
|
||||
bc.add_child(sby)
|
||||
|
||||
var sbz : SpinBox = SpinBox.new()
|
||||
bc.add_child(sbz)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
sbx.rounded = false
|
||||
sby.rounded = false
|
||||
sbz.rounded = false
|
||||
sbx.step = step
|
||||
sby.step = step
|
||||
sbz.step = step
|
||||
sbx.min_value = prange.x
|
||||
sbx.max_value = prange.y
|
||||
sby.min_value = prange.x
|
||||
sby.max_value = prange.y
|
||||
sbz.min_value = prange.x
|
||||
sbz.max_value = prange.y
|
||||
|
||||
var val : Vector3 = _edited_resource.call(getter)
|
||||
|
||||
sbx.value = val.x
|
||||
sby.value = val.y
|
||||
sbz.value = val.z
|
||||
|
||||
sbx.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
|
||||
sby.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
|
||||
sbz.connect("value_changed", self, "on_vector3_spinbox_value_changed", [ slot_idx, sbx, sby, sbz ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
|
||||
func add_slot_rect2(getter : String, setter : String, slot_name : String, step : float = 0.1, prange : Vector2 = Vector2(-10000, 10000)) -> int:
|
||||
var bc : VBoxContainer = VBoxContainer.new()
|
||||
bc.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
|
||||
var l : Label = Label.new()
|
||||
l.text = slot_name
|
||||
bc.add_child(l)
|
||||
|
||||
var hc1 : HBoxContainer = HBoxContainer.new()
|
||||
hc1.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
bc.add_child(hc1)
|
||||
|
||||
var sbx : SpinBox = SpinBox.new()
|
||||
sbx.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
hc1.add_child(sbx)
|
||||
|
||||
var sby : SpinBox = SpinBox.new()
|
||||
sby.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
hc1.add_child(sby)
|
||||
|
||||
var hc2 : HBoxContainer = HBoxContainer.new()
|
||||
hc2.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
bc.add_child(hc2)
|
||||
|
||||
var sbw : SpinBox = SpinBox.new()
|
||||
sbw.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
hc2.add_child(sbw)
|
||||
|
||||
var sbh : SpinBox = SpinBox.new()
|
||||
sbh.size_flags_horizontal = SIZE_EXPAND_FILL
|
||||
hc2.add_child(sbh)
|
||||
|
||||
var slot_idx : int = add_slot(getter, setter, bc)
|
||||
sbx.rounded = false
|
||||
sby.rounded = false
|
||||
sbw.rounded = false
|
||||
sbh.rounded = false
|
||||
sbx.step = step
|
||||
sby.step = step
|
||||
sbw.step = step
|
||||
sbh.step = step
|
||||
sbx.min_value = prange.x
|
||||
sbx.max_value = prange.y
|
||||
sby.min_value = prange.x
|
||||
sby.max_value = prange.y
|
||||
sbw.min_value = prange.x
|
||||
sbw.max_value = prange.y
|
||||
sbh.min_value = prange.x
|
||||
sbh.max_value = prange.y
|
||||
|
||||
var val : Rect2 = _edited_resource.call(getter)
|
||||
|
||||
sbx.value = val.position.x
|
||||
sby.value = val.position.y
|
||||
sbw.value = val.size.x
|
||||
sbh.value = val.size.y
|
||||
|
||||
sbx.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
|
||||
sby.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
|
||||
sbw.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
|
||||
sbh.connect("value_changed", self, "on_rect2_spinbox_value_changed", [ slot_idx, [ sbx, sby, sbw, sbh ] ])
|
||||
|
||||
return slot_idx
|
||||
|
||||
func add_slot(getter : String, setter : String, control : Control) -> int:
|
||||
var content_node = $MainContainer/Content
|
||||
|
||||
content_node.add_child(control)
|
||||
var child_idx : int = content_node.get_child_count() - 1
|
||||
|
||||
var arr : Array = Array()
|
||||
|
||||
arr.append(child_idx)
|
||||
arr.append(getter)
|
||||
arr.append(setter)
|
||||
arr.append(control)
|
||||
|
||||
properties.append(arr)
|
||||
|
||||
var slot_idx : int = properties.size() - 1
|
||||
|
||||
return slot_idx
|
||||
|
||||
func get_property_control(slot_idx : int) -> Node:
|
||||
return properties[slot_idx][3]
|
||||
|
||||
func on_int_spinbox_value_changed(val : float, slot_idx) -> void:
|
||||
_ignore_changed_evend = true
|
||||
|
||||
#_edited_resource.call(properties[slot_idx][2], int(val))
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], int(val))
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_checkbox_value_changed(val : bool, slot_idx) -> void:
|
||||
_ignore_changed_evend = true
|
||||
|
||||
#_edited_resource.call(properties[slot_idx][2], val)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], val)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_float_spinbox_value_changed(val : float, slot_idx) -> void:
|
||||
_ignore_changed_evend = true
|
||||
|
||||
#_edited_resource.call(properties[slot_idx][2], val)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], val)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_vector2_spinbox_value_changed(val : float, slot_idx, spinbox_x, spinbox_y) -> void:
|
||||
_ignore_changed_evend = true
|
||||
var vv : Vector2 = Vector2(spinbox_x.value, spinbox_y.value)
|
||||
|
||||
#_edited_resource.call(properties[slot_idx][2], vv)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], vv)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_vector3_spinbox_value_changed(val : float, slot_idx, spinbox_x, spinbox_y, spinbox_z) -> void:
|
||||
_ignore_changed_evend = true
|
||||
var vv : Vector3 = Vector3(spinbox_x.value, spinbox_y.value, spinbox_z.value)
|
||||
|
||||
#_edited_resource.call(properties[slot_idx][2], vv)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], vv)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_rect2_spinbox_value_changed(val : float, slot_idx, spinboxes) -> void:
|
||||
_ignore_changed_evend = true
|
||||
var vv : Rect2 = Rect2(spinboxes[0].value, spinboxes[1].value, spinboxes[2].value, spinboxes[3].value)
|
||||
|
||||
#_edited_resource.call(properties[slot_idx][2], vv)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], vv)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_slot_enum_item_selected(val : int, slot_idx : int) -> void:
|
||||
_ignore_changed_evend = true
|
||||
#_edited_resource.call(properties[slot_idx][2], val)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], val)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_slot_line_edit_text_entered(text : String, slot_idx : int) -> void:
|
||||
_ignore_changed_evend = true
|
||||
#_edited_resource.call(properties[slot_idx][2], text)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], text)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func on_widget_resource_changed(res : Resource, slot_idx : int) -> void:
|
||||
_ignore_changed_evend = true
|
||||
#_edited_resource.call(properties[slot_idx][2], res)
|
||||
|
||||
_undo_redo.create_action("WE: Set Value")
|
||||
_undo_redo.add_do_method(_edited_resource, properties[slot_idx][2], res)
|
||||
_undo_redo.add_undo_method(_edited_resource, properties[slot_idx][2], _edited_resource.call(properties[slot_idx][1]))
|
||||
_undo_redo.commit_action()
|
||||
|
||||
_ignore_changed_evend = false
|
||||
|
||||
func clear() -> void:
|
||||
properties.clear()
|
||||
|
||||
var content_node = $MainContainer/Content
|
||||
|
||||
if !content_node:
|
||||
return
|
||||
|
||||
for c in content_node.get_children():
|
||||
c.queue_free()
|
||||
content_node.remove_child(c)
|
||||
|
||||
func refresh() -> void:
|
||||
clear()
|
||||
|
||||
var cls_str : String = "[none]"
|
||||
var script_str : String = "[none]"
|
||||
|
||||
if _edited_resource:
|
||||
cls_str = _edited_resource.get_class()
|
||||
|
||||
var scr = _edited_resource.get_script()
|
||||
|
||||
if scr:
|
||||
script_str = scr.resource_path
|
||||
|
||||
_edited_resource.setup_property_inspector(self)
|
||||
|
||||
$MainContainer/HBoxContainer/ClassLE.text = cls_str
|
||||
$MainContainer/HBoxContainer2/ScriptLE.text = script_str
|
||||
|
||||
_refresh_queued = false
|
||||
|
||||
func edit_resource(wgw) -> void:
|
||||
if _edited_resource:
|
||||
_edited_resource.disconnect("changed", self, "on_edited_resource_changed")
|
||||
|
||||
_edited_resource = wgw
|
||||
|
||||
#if !_edited_resource.is_connected("changed", self, "on_edited_resource_changed"):
|
||||
if _edited_resource:
|
||||
_edited_resource.connect("changed", self, "on_edited_resource_changed")
|
||||
|
||||
refresh()
|
||||
|
||||
func on_edited_resource_changed() -> void:
|
||||
if _ignore_changed_evend:
|
||||
return
|
||||
|
||||
if _refresh_queued:
|
||||
return
|
||||
|
||||
_refresh_queued = true
|
||||
call_deferred("refresh")
|
81
world_generator/ui/ResourcePropertyList.tscn
Normal file
81
world_generator/ui/ResourcePropertyList.tscn
Normal file
@ -0,0 +1,81 @@
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.gd" type="Script" id=1]
|
||||
|
||||
[node name="ResourcePropertyList" type="ScrollContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
rect_min_size = Vector2( 100, 0 )
|
||||
scroll_horizontal_enabled = false
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="MainContainer" type="VBoxContainer" parent="."]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 90.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Label" type="Label" parent="MainContainer"]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 14.0
|
||||
text = "Properties"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="MainContainer"]
|
||||
margin_top = 18.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 22.0
|
||||
|
||||
[node name="Content" type="VBoxContainer" parent="MainContainer"]
|
||||
margin_top = 26.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 26.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="HSeparator2" type="HSeparator" parent="MainContainer"]
|
||||
margin_top = 30.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 34.0
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="MainContainer"]
|
||||
margin_top = 38.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 62.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Label" type="Label" parent="MainContainer/HBoxContainer"]
|
||||
margin_top = 5.0
|
||||
margin_right = 37.0
|
||||
margin_bottom = 19.0
|
||||
text = "Class "
|
||||
valign = 1
|
||||
|
||||
[node name="ClassLE" type="LineEdit" parent="MainContainer/HBoxContainer"]
|
||||
margin_left = 41.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
editable = false
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="MainContainer"]
|
||||
margin_top = 66.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 90.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Label" type="Label" parent="MainContainer/HBoxContainer2"]
|
||||
margin_top = 5.0
|
||||
margin_right = 36.0
|
||||
margin_bottom = 19.0
|
||||
text = "Script"
|
||||
valign = 1
|
||||
|
||||
[node name="ScriptLE" type="LineEdit" parent="MainContainer/HBoxContainer2"]
|
||||
margin_left = 40.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
editable = false
|
19
world_generator/ui/WorldTab.gd
Normal file
19
world_generator/ui/WorldTab.gd
Normal file
@ -0,0 +1,19 @@
|
||||
tool
|
||||
extends HBoxContainer
|
||||
|
||||
var edited_world
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
$HSplitContainer/ResourcePropertyList.set_plugin(plugin)
|
||||
$HSplitContainer/RectEditor.set_plugin(plugin)
|
||||
$VBoxContainer/DataList.set_plugin(plugin)
|
||||
|
||||
func refresh() -> void:
|
||||
$HSplitContainer/ResourcePropertyList.edit_resource(edited_world)
|
||||
$VBoxContainer/DataList.set_edited_resource(edited_world)
|
||||
$HSplitContainer/RectEditor.set_edited_resource(edited_world)
|
||||
|
||||
func set_wgworld(wgw : WorldGenWorld) -> void:
|
||||
edited_world = wgw
|
||||
|
||||
refresh()
|
56
world_generator/ui/tabs/Continent.gd
Normal file
56
world_generator/ui/tabs/Continent.gd
Normal file
@ -0,0 +1,56 @@
|
||||
tool
|
||||
extends HBoxContainer
|
||||
|
||||
var edited_world : WorldGenWorld = null
|
||||
var edited_continent : Continent = null
|
||||
|
||||
func _ready():
|
||||
var option_button : OptionButton = $HSplitContainer/VBoxContainer/OptionButton
|
||||
option_button.connect("item_selected", self, "on_item_selected")
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.set_plugin(plugin)
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_plugin(plugin)
|
||||
$HSplitContainer/RectEditor.set_plugin(plugin)
|
||||
|
||||
func refresh_continent() -> void:
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.edit_resource(edited_continent)
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_edited_resource(edited_continent)
|
||||
$HSplitContainer/RectEditor.set_edited_resource(edited_continent)
|
||||
|
||||
# if !edited_continent:
|
||||
# return
|
||||
|
||||
func refresh() -> void:
|
||||
var option_button : OptionButton = $HSplitContainer/VBoxContainer/OptionButton
|
||||
option_button.clear()
|
||||
|
||||
if !edited_world:
|
||||
return
|
||||
|
||||
var content : Array = edited_world.get_content()
|
||||
|
||||
for c in content:
|
||||
if c:
|
||||
option_button.add_item(c.resource_name)
|
||||
option_button.set_item_metadata(option_button.get_item_count() - 1, c)
|
||||
|
||||
if !edited_continent:
|
||||
edited_continent = c
|
||||
|
||||
refresh_continent()
|
||||
|
||||
func set_wgworld(wgw : WorldGenWorld) -> void:
|
||||
edited_world = wgw
|
||||
|
||||
refresh()
|
||||
|
||||
func set_continent(continent : Continent) -> void:
|
||||
edited_continent = continent
|
||||
|
||||
refresh_continent()
|
||||
|
||||
func on_item_selected(idx : int) -> void:
|
||||
var option_button : OptionButton = $HSplitContainer/VBoxContainer/OptionButton
|
||||
|
||||
set_continent(option_button.get_item_metadata(idx))
|
100
world_generator/ui/tabs/Continent.tscn
Normal file
100
world_generator/ui/tabs/Continent.tscn
Normal file
@ -0,0 +1,100 @@
|
||||
[gd_scene load_steps=5 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/tabs/Continent.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/world_generator/ui/DataList.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/world_generator/ui/RectEditor.tscn" type="PackedScene" id=4]
|
||||
|
||||
[node name="Continent" type="HBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="."]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="RectEditor" parent="HSplitContainer" instance=ExtResource( 4 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 735.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"]
|
||||
margin_left = 747.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
|
||||
[node name="OptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer"]
|
||||
margin_right = 277.0
|
||||
margin_bottom = 20.0
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"]
|
||||
margin_top = 24.0
|
||||
margin_right = 277.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="ResourcePropertyList" parent="HSplitContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 2 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 100.0
|
||||
margin_bottom = 576.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2"]
|
||||
margin_left = 104.0
|
||||
margin_right = 277.0
|
||||
margin_bottom = 576.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Label" type="Label" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
margin_right = 173.0
|
||||
margin_bottom = 14.0
|
||||
text = "Zones"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
margin_top = 18.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 38.0
|
||||
|
||||
[node name="AddButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
|
||||
margin_right = 37.0
|
||||
margin_bottom = 20.0
|
||||
text = "Add"
|
||||
|
||||
[node name="DeleteButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 41.0
|
||||
margin_right = 96.0
|
||||
margin_bottom = 20.0
|
||||
text = "Delete"
|
||||
|
||||
[node name="Duplicate" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 100.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 20.0
|
||||
text = "Duplicate"
|
||||
|
||||
[node name="DataList" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer" instance=ExtResource( 3 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_top = 42.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 576.0
|
||||
class_types = 1
|
||||
|
||||
[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/AddButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="add_button_pressed"]
|
||||
[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/DeleteButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="delete_button_pressed"]
|
||||
[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/Duplicate" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="duplicate_button_pressed"]
|
122
world_generator/ui/tabs/SubZone.gd
Normal file
122
world_generator/ui/tabs/SubZone.gd
Normal file
@ -0,0 +1,122 @@
|
||||
tool
|
||||
extends HBoxContainer
|
||||
|
||||
var edited_world : WorldGenWorld = null
|
||||
var edited_continent : Continent = null
|
||||
var edited_zone : Zone = null
|
||||
var edited_sub_zone : SubZone = null
|
||||
|
||||
func _ready():
|
||||
var coption_button : OptionButton = $VBoxContainer/ContinentOptionButton
|
||||
coption_button.connect("item_selected", self, "on_continent_item_selected")
|
||||
|
||||
var zoption_button : OptionButton = $VBoxContainer/ZoneOptionButton
|
||||
zoption_button.connect("item_selected", self, "on_zone_item_selected")
|
||||
|
||||
var szoption_button : OptionButton = $VBoxContainer/SubZoneOptionButton
|
||||
szoption_button.connect("item_selected", self, "on_sub_zone_item_selected")
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
$VBoxContainer/HBoxContainer2/ResourcePropertyList.set_plugin(plugin)
|
||||
|
||||
func continent_changed() -> void:
|
||||
var option_button : OptionButton = $VBoxContainer/ZoneOptionButton
|
||||
option_button.clear()
|
||||
edited_zone = null
|
||||
edited_sub_zone = null
|
||||
|
||||
if !edited_continent:
|
||||
return
|
||||
|
||||
var content : Array = edited_continent.get_content()
|
||||
|
||||
for c in content:
|
||||
if c:
|
||||
option_button.add_item(c.resource_name)
|
||||
option_button.set_item_metadata(option_button.get_item_count() - 1, c)
|
||||
|
||||
if !edited_zone:
|
||||
edited_zone = c
|
||||
|
||||
zone_changed()
|
||||
|
||||
func zone_changed() -> void:
|
||||
var option_button : OptionButton = $VBoxContainer/SubZoneOptionButton
|
||||
option_button.clear()
|
||||
edited_sub_zone = null
|
||||
|
||||
if !edited_zone:
|
||||
return
|
||||
|
||||
var content : Array = edited_zone.get_content()
|
||||
|
||||
for c in content:
|
||||
if c:
|
||||
option_button.add_item(c.resource_name)
|
||||
option_button.set_item_metadata(option_button.get_item_count() - 1, c)
|
||||
|
||||
if !edited_sub_zone:
|
||||
edited_sub_zone = c
|
||||
|
||||
sub_zone_changed()
|
||||
|
||||
|
||||
func sub_zone_changed() -> void:
|
||||
$VBoxContainer/HBoxContainer2/ResourcePropertyList.edit_resource(edited_sub_zone)
|
||||
|
||||
func refresh() -> void:
|
||||
var option_button : OptionButton = $VBoxContainer/ContinentOptionButton
|
||||
option_button.clear()
|
||||
|
||||
if !edited_world:
|
||||
return
|
||||
|
||||
var content : Array = edited_world.get_content()
|
||||
|
||||
for c in content:
|
||||
if c:
|
||||
option_button.add_item(c.resource_name)
|
||||
option_button.set_item_metadata(option_button.get_item_count() - 1, c)
|
||||
|
||||
if !edited_continent:
|
||||
edited_continent = c
|
||||
|
||||
continent_changed()
|
||||
|
||||
func set_wgworld(wgw : WorldGenWorld) -> void:
|
||||
edited_world = wgw
|
||||
edited_continent = null
|
||||
edited_zone = null
|
||||
|
||||
refresh()
|
||||
|
||||
func set_continent(continent : Continent) -> void:
|
||||
edited_continent = continent
|
||||
edited_zone = null
|
||||
|
||||
continent_changed()
|
||||
|
||||
func set_zone(zone : Zone) -> void:
|
||||
edited_zone = zone
|
||||
|
||||
zone_changed()
|
||||
|
||||
func set_sub_zone(sub_zone : SubZone) -> void:
|
||||
edited_sub_zone = sub_zone
|
||||
|
||||
sub_zone_changed()
|
||||
|
||||
func on_continent_item_selected(idx : int) -> void:
|
||||
var option_button : OptionButton = $VBoxContainer/ContinentOptionButton
|
||||
|
||||
set_continent(option_button.get_item_metadata(idx))
|
||||
|
||||
func on_zone_item_selected(idx : int) -> void:
|
||||
var option_button : OptionButton = $VBoxContainer/ZoneOptionButton
|
||||
|
||||
set_zone(option_button.get_item_metadata(idx))
|
||||
|
||||
func on_sub_zone_item_selected(idx : int) -> void:
|
||||
var option_button : OptionButton = $VBoxContainer/SubZoneOptionButton
|
||||
|
||||
set_sub_zone(option_button.get_item_metadata(idx))
|
49
world_generator/ui/tabs/SubZone.tscn
Normal file
49
world_generator/ui/tabs/SubZone.tscn
Normal file
@ -0,0 +1,49 @@
|
||||
[gd_scene load_steps=3 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/tabs/SubZone.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
|
||||
|
||||
[node name="SubZone" type="HBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="ContinentOptionButton" type="OptionButton" parent="VBoxContainer"]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 20.0
|
||||
|
||||
[node name="ZoneOptionButton" type="OptionButton" parent="VBoxContainer"]
|
||||
margin_top = 24.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 44.0
|
||||
|
||||
[node name="SubZoneOptionButton" type="OptionButton" parent="VBoxContainer"]
|
||||
margin_top = 48.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 68.0
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer"]
|
||||
margin_top = 72.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="ResourcePropertyList" parent="VBoxContainer/HBoxContainer2" instance=ExtResource( 2 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 528.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
82
world_generator/ui/tabs/World.tscn
Normal file
82
world_generator/ui/tabs/World.tscn
Normal file
@ -0,0 +1,82 @@
|
||||
[gd_scene load_steps=5 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/world_generator/ui/WorldTab.gd" type="Script" id=5]
|
||||
[ext_resource path="res://addons/world_generator/ui/DataList.tscn" type="PackedScene" id=6]
|
||||
[ext_resource path="res://addons/world_generator/ui/RectEditor.tscn" type="PackedScene" id=7]
|
||||
|
||||
[node name="World" type="HBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = 4.0
|
||||
margin_top = 32.0
|
||||
margin_right = -4.0
|
||||
margin_bottom = -4.0
|
||||
script = ExtResource( 5 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="."]
|
||||
margin_right = 839.0
|
||||
margin_bottom = 564.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="RectEditor" parent="HSplitContainer" instance=ExtResource( 7 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 727.0
|
||||
margin_bottom = 564.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="ResourcePropertyList" parent="HSplitContainer" instance=ExtResource( 2 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_left = 739.0
|
||||
margin_right = 839.0
|
||||
margin_bottom = 564.0
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
margin_left = 843.0
|
||||
margin_right = 1016.0
|
||||
margin_bottom = 564.0
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer"]
|
||||
margin_right = 173.0
|
||||
margin_bottom = 14.0
|
||||
text = "Continents"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"]
|
||||
margin_top = 18.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 38.0
|
||||
|
||||
[node name="AddButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
margin_right = 37.0
|
||||
margin_bottom = 20.0
|
||||
text = "Add"
|
||||
|
||||
[node name="DeleteButton" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
margin_left = 41.0
|
||||
margin_right = 96.0
|
||||
margin_bottom = 20.0
|
||||
text = "Delete"
|
||||
|
||||
[node name="Duplicate" type="Button" parent="VBoxContainer/HBoxContainer"]
|
||||
margin_left = 100.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 20.0
|
||||
text = "Duplicate"
|
||||
|
||||
[node name="DataList" parent="VBoxContainer" instance=ExtResource( 6 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_top = 42.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 564.0
|
||||
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/AddButton" to="VBoxContainer/DataList" method="add_button_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/DeleteButton" to="VBoxContainer/DataList" method="delete_button_pressed"]
|
||||
[connection signal="pressed" from="VBoxContainer/HBoxContainer/Duplicate" to="VBoxContainer/DataList" method="duplicate_button_pressed"]
|
92
world_generator/ui/tabs/Zone.gd
Normal file
92
world_generator/ui/tabs/Zone.gd
Normal file
@ -0,0 +1,92 @@
|
||||
tool
|
||||
extends HBoxContainer
|
||||
|
||||
var edited_world : WorldGenWorld = null
|
||||
var edited_continent : Continent = null
|
||||
var edited_zone : Zone = null
|
||||
|
||||
func _ready():
|
||||
var coption_button : OptionButton = $HSplitContainer/VBoxContainer/ContinentOptionButton
|
||||
coption_button.connect("item_selected", self, "on_continent_item_selected")
|
||||
|
||||
var zoption_button : OptionButton = $HSplitContainer/VBoxContainer/ZoneOptionButton
|
||||
zoption_button.connect("item_selected", self, "on_zone_item_selected")
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.set_plugin(plugin)
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_plugin(plugin)
|
||||
$HSplitContainer/RectEditor.set_plugin(plugin)
|
||||
|
||||
func refresh() -> void:
|
||||
var option_button : OptionButton = $HSplitContainer/VBoxContainer/ContinentOptionButton
|
||||
option_button.clear()
|
||||
edited_continent = null
|
||||
edited_zone = null
|
||||
|
||||
if !edited_world:
|
||||
return
|
||||
|
||||
var content : Array = edited_world.get_content()
|
||||
|
||||
for c in content:
|
||||
if c:
|
||||
option_button.add_item(c.resource_name)
|
||||
option_button.set_item_metadata(option_button.get_item_count() - 1, c)
|
||||
|
||||
if !edited_continent:
|
||||
edited_continent = c
|
||||
|
||||
continent_changed()
|
||||
|
||||
func continent_changed() -> void:
|
||||
var option_button : OptionButton = $HSplitContainer/VBoxContainer/ZoneOptionButton
|
||||
option_button.clear()
|
||||
edited_zone = null
|
||||
|
||||
if !edited_continent:
|
||||
return
|
||||
|
||||
var content : Array = edited_continent.get_content()
|
||||
|
||||
for c in content:
|
||||
if c:
|
||||
option_button.add_item(c.resource_name)
|
||||
option_button.set_item_metadata(option_button.get_item_count() - 1, c)
|
||||
|
||||
if !edited_zone:
|
||||
edited_zone = c
|
||||
|
||||
zone_changed()
|
||||
|
||||
func zone_changed() -> void:
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/ResourcePropertyList.edit_resource(edited_zone)
|
||||
$HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList.set_edited_resource(edited_zone)
|
||||
$HSplitContainer/RectEditor.set_edited_resource(edited_zone)
|
||||
|
||||
func set_continent(continent : Continent) -> void:
|
||||
edited_continent = continent
|
||||
edited_zone = null
|
||||
|
||||
continent_changed()
|
||||
|
||||
func set_zone(zone : Zone) -> void:
|
||||
edited_zone = zone
|
||||
|
||||
zone_changed()
|
||||
|
||||
func set_wgworld(wgw : WorldGenWorld) -> void:
|
||||
edited_world = wgw
|
||||
edited_continent = null
|
||||
edited_zone = null
|
||||
|
||||
refresh()
|
||||
|
||||
func on_continent_item_selected(idx : int) -> void:
|
||||
var option_button : OptionButton = $HSplitContainer/VBoxContainer/ContinentOptionButton
|
||||
|
||||
set_continent(option_button.get_item_metadata(idx))
|
||||
|
||||
func on_zone_item_selected(idx : int) -> void:
|
||||
var option_button : OptionButton = $HSplitContainer/VBoxContainer/ZoneOptionButton
|
||||
|
||||
set_zone(option_button.get_item_metadata(idx))
|
105
world_generator/ui/tabs/Zone.tscn
Normal file
105
world_generator/ui/tabs/Zone.tscn
Normal file
@ -0,0 +1,105 @@
|
||||
[gd_scene load_steps=5 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/ui/tabs/Zone.gd" type="Script" id=1]
|
||||
[ext_resource path="res://addons/world_generator/ui/ResourcePropertyList.tscn" type="PackedScene" id=2]
|
||||
[ext_resource path="res://addons/world_generator/ui/DataList.tscn" type="PackedScene" id=3]
|
||||
[ext_resource path="res://addons/world_generator/ui/RectEditor.tscn" type="PackedScene" id=4]
|
||||
|
||||
[node name="Zone" type="HBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource( 1 )
|
||||
__meta__ = {
|
||||
"_edit_use_anchors_": false
|
||||
}
|
||||
|
||||
[node name="HSplitContainer" type="HSplitContainer" parent="."]
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="RectEditor" parent="HSplitContainer" instance=ExtResource( 4 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 735.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer"]
|
||||
margin_left = 747.0
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 600.0
|
||||
|
||||
[node name="ContinentOptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer"]
|
||||
margin_right = 277.0
|
||||
margin_bottom = 20.0
|
||||
|
||||
[node name="ZoneOptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer"]
|
||||
margin_top = 24.0
|
||||
margin_right = 277.0
|
||||
margin_bottom = 44.0
|
||||
|
||||
[node name="HBoxContainer2" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"]
|
||||
margin_top = 48.0
|
||||
margin_right = 277.0
|
||||
margin_bottom = 600.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="ResourcePropertyList" parent="HSplitContainer/VBoxContainer/HBoxContainer2" instance=ExtResource( 2 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_right = 100.0
|
||||
margin_bottom = 552.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2"]
|
||||
margin_left = 104.0
|
||||
margin_right = 277.0
|
||||
margin_bottom = 552.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Label" type="Label" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
margin_right = 173.0
|
||||
margin_bottom = 14.0
|
||||
text = "Sub Zones"
|
||||
align = 1
|
||||
valign = 1
|
||||
|
||||
[node name="HBoxContainer" type="HBoxContainer" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer"]
|
||||
margin_top = 18.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 38.0
|
||||
|
||||
[node name="AddButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
|
||||
margin_right = 37.0
|
||||
margin_bottom = 20.0
|
||||
text = "Add"
|
||||
|
||||
[node name="DeleteButton" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 41.0
|
||||
margin_right = 96.0
|
||||
margin_bottom = 20.0
|
||||
text = "Delete"
|
||||
|
||||
[node name="Duplicate" type="Button" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer"]
|
||||
margin_left = 100.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 20.0
|
||||
text = "Duplicate"
|
||||
|
||||
[node name="DataList" parent="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer" instance=ExtResource( 3 )]
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
margin_top = 42.0
|
||||
margin_right = 173.0
|
||||
margin_bottom = 552.0
|
||||
class_types = 2
|
||||
|
||||
[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/AddButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="add_button_pressed"]
|
||||
[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/DeleteButton" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="delete_button_pressed"]
|
||||
[connection signal="pressed" from="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/HBoxContainer/Duplicate" to="HSplitContainer/VBoxContainer/HBoxContainer2/VBoxContainer/DataList" method="duplicate_button_pressed"]
|
80
world_generator/widgets/EditorResourceWidget.gd
Normal file
80
world_generator/widgets/EditorResourceWidget.gd
Normal file
@ -0,0 +1,80 @@
|
||||
tool
|
||||
extends HBoxContainer
|
||||
|
||||
var _resource_type : String = "Resource"
|
||||
var _resource : Resource = null
|
||||
var _plugin : EditorPlugin = null
|
||||
|
||||
signal on_resource_changed(new_res)
|
||||
|
||||
func _enter_tree():
|
||||
$ResourceButton.set_drag_forwarding(self)
|
||||
|
||||
func set_resource_type(type : String) -> void:
|
||||
_resource_type = type
|
||||
|
||||
func set_resource(res : Resource) -> void:
|
||||
if res && !res.is_class(_resource_type):
|
||||
return
|
||||
|
||||
var emit : bool = res != _resource
|
||||
|
||||
_resource = res
|
||||
|
||||
refresh_ui()
|
||||
|
||||
if emit:
|
||||
emit_signal("on_resource_changed", _resource)
|
||||
|
||||
func refresh_ui() -> void:
|
||||
if _resource:
|
||||
var text : String = _resource.resource_name
|
||||
|
||||
if text == "":
|
||||
text = _resource.get_class()
|
||||
|
||||
$ResourceButton.text = text
|
||||
else:
|
||||
$ResourceButton.text = "[null]"
|
||||
|
||||
func on_clear_button_pressed() -> void:
|
||||
if _resource:
|
||||
set_resource(null)
|
||||
|
||||
func on_resource_button_pressed() -> void:
|
||||
if _resource && _plugin:
|
||||
_plugin.get_editor_interface().inspect_object(_resource)
|
||||
|
||||
#examples
|
||||
#{files:[res://modules/planets/test_planet/test_world.tres], from:@@4176:[Tree:9070], type:files}
|
||||
#{from:Button:[Button:917001], resource:[Resource:26180], type:resource}
|
||||
|
||||
func can_drop_data_fw(position, data, from_control):
|
||||
return true
|
||||
|
||||
func drop_data_fw(position, data, from_control):
|
||||
if data["type"] == "resource":
|
||||
var res : Resource = data["resource"]
|
||||
set_resource(res)
|
||||
elif data["type"] == "files":
|
||||
var files : Array = data["files"]
|
||||
|
||||
for f in files:
|
||||
var res : Resource = load(f)
|
||||
set_resource(res)
|
||||
return
|
||||
|
||||
func get_drag_data_fw(position, from_control):
|
||||
if !_resource:
|
||||
return
|
||||
|
||||
var d : Dictionary = Dictionary()
|
||||
|
||||
d["from"] = self
|
||||
d["resource"] = _resource
|
||||
d["type"] = "resource"
|
||||
|
||||
return d
|
||||
|
||||
func set_plugin(plugin : EditorPlugin) -> void:
|
||||
_plugin = plugin
|
23
world_generator/widgets/EditorResourceWidget.tscn
Normal file
23
world_generator/widgets/EditorResourceWidget.tscn
Normal file
@ -0,0 +1,23 @@
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/widgets/EditorResourceWidget.gd" type="Script" id=1]
|
||||
|
||||
[node name="EditorResourceWidget" type="HBoxContainer"]
|
||||
margin_right = 376.0
|
||||
margin_bottom = 40.0
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="ResourceButton" type="Button" parent="."]
|
||||
margin_right = 342.0
|
||||
margin_bottom = 40.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="Clear" type="Button" parent="."]
|
||||
margin_left = 346.0
|
||||
margin_right = 376.0
|
||||
margin_bottom = 40.0
|
||||
rect_min_size = Vector2( 30, 0 )
|
||||
text = "X"
|
||||
|
||||
[connection signal="pressed" from="ResourceButton" to="." method="on_resource_button_pressed"]
|
||||
[connection signal="pressed" from="Clear" to="." method="on_clear_button_pressed"]
|
218
world_generator/widgets/EditorZoomWidget.gd
Normal file
218
world_generator/widgets/EditorZoomWidget.gd
Normal file
@ -0,0 +1,218 @@
|
||||
tool
|
||||
extends HBoxContainer
|
||||
|
||||
#This is a port of godot 4.0's EditorZoomWidget
|
||||
|
||||
#/*************************************************************************/
|
||||
#/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
|
||||
#/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
#/* */
|
||||
#/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
#/* a copy of this software and associated documentation files (the */
|
||||
#/* "Software"), to deal in the Software without restriction, including */
|
||||
#/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
#/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
#/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
#/* the following conditions: */
|
||||
#/* */
|
||||
#/* The above copyright notice and this permission notice shall be */
|
||||
#/* included in all copies or substantial portions of the Software. */
|
||||
#/* */
|
||||
#/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
#/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
#/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
#/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
#/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
#/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
#/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
#/*************************************************************************/
|
||||
|
||||
var zoom_minus : Button
|
||||
var zoom_reset : Button
|
||||
var zoom_plus : Button
|
||||
|
||||
var EDSCALE : float = 1
|
||||
|
||||
export(float) var zoom : float = 1.0 setget set_zoom, get_zoom
|
||||
|
||||
signal zoom_changed(zoom)
|
||||
|
||||
func _init() -> void:
|
||||
# Zoom buttons
|
||||
zoom_minus = Button.new()
|
||||
zoom_minus.set_flat(true)
|
||||
add_child(zoom_minus)
|
||||
zoom_minus.connect("pressed", self, "_button_zoom_minus")
|
||||
zoom_minus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", tr("Zoom Out"), KEY_MASK_CMD | KEY_MINUS))
|
||||
zoom_minus.set_focus_mode(FOCUS_NONE)
|
||||
|
||||
zoom_reset = Button.new()
|
||||
zoom_reset.set_flat(true)
|
||||
add_child(zoom_reset)
|
||||
zoom_reset.add_constant_override("outline_size", 1)
|
||||
zoom_reset.add_color_override("font_outline_color", Color(0, 0, 0))
|
||||
zoom_reset.add_color_override("font_color", Color(1, 1, 1))
|
||||
zoom_reset.connect("pressed", self, "_button_zoom_reset")
|
||||
zoom_reset.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", tr("Zoom Reset"), KEY_MASK_CMD | KEY_0))
|
||||
zoom_reset.set_focus_mode(FOCUS_NONE)
|
||||
#Prevent the button's size from changing when the text size changes
|
||||
zoom_reset.set_custom_minimum_size(Vector2(75, 0))
|
||||
|
||||
zoom_plus = Button.new()
|
||||
zoom_plus.set_flat(true)
|
||||
add_child(zoom_plus)
|
||||
zoom_plus.connect("pressed", self, "_button_zoom_plus")
|
||||
zoom_plus.set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", tr("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)) # Usually direct access key for PLUS
|
||||
zoom_plus.set_focus_mode(FOCUS_NONE)
|
||||
|
||||
_update_zoom_label()
|
||||
|
||||
add_constant_override("separation", round(-8))
|
||||
|
||||
func get_zoom() -> float:
|
||||
return zoom
|
||||
|
||||
func set_zoom(p_zoom : float) -> void:
|
||||
if (p_zoom > 0 && p_zoom != zoom):
|
||||
zoom = p_zoom;
|
||||
_update_zoom_label();
|
||||
|
||||
func set_zoom_by_increments(p_increment_count : int, p_integer_only : bool) -> void:
|
||||
# Remove editor scale from the index computation.
|
||||
var zoom_noscale : float = zoom / max(1, EDSCALE)
|
||||
var CMP_EPSILON : float = 0.00001
|
||||
|
||||
if (p_integer_only):
|
||||
# Only visit integer scaling factors above 100%, and fractions with an integer denominator below 100%
|
||||
# (1/2 = 50%, 1/3 = 33.33%, 1/4 = 25%, …).
|
||||
# This is useful when working on pixel art projects to avoid distortion.
|
||||
# This algorithm is designed to handle fractional start zoom values correctly
|
||||
# (e.g. 190% will zoom up to 200% and down to 100%).
|
||||
if (zoom_noscale + p_increment_count * 0.001 >= 1.0 - CMP_EPSILON):
|
||||
# New zoom is certain to be above 100%.
|
||||
if (p_increment_count >= 1):
|
||||
# Zooming.
|
||||
set_zoom(floor(zoom_noscale + p_increment_count) * max(1, EDSCALE))
|
||||
else:
|
||||
# Dezooming.
|
||||
set_zoom(ceil(zoom_noscale + p_increment_count) * max(1, EDSCALE))
|
||||
else:
|
||||
if (p_increment_count >= 1):
|
||||
# Zooming. Convert the current zoom into a denominator.
|
||||
var new_zoom : float = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count)
|
||||
if (is_equal_approx(zoom_noscale, new_zoom)):
|
||||
# New zoom is identical to the old zoom, so try again.
|
||||
# This can happen due to floating-point precision issues.
|
||||
new_zoom = 1.0 / ceil(1.0 / zoom_noscale - p_increment_count - 1)
|
||||
|
||||
set_zoom(new_zoom * max(1, EDSCALE));
|
||||
else:
|
||||
# Dezooming. Convert the current zoom into a denominator.
|
||||
var new_zoom : float = 1.0 / floor(1.0 / zoom_noscale - p_increment_count)
|
||||
if (is_equal_approx(zoom_noscale, new_zoom)):
|
||||
# New zoom is identical to the old zoom, so try again.
|
||||
# This can happen due to floating-point precision issues.
|
||||
new_zoom = 1.0 / floor(1.0 / zoom_noscale - p_increment_count + 1)
|
||||
|
||||
set_zoom(new_zoom * max(1, EDSCALE))
|
||||
else:
|
||||
# Base increment factor defined as the twelveth root of two.
|
||||
# This allow a smooth geometric evolution of the zoom, with the advantage of
|
||||
# visiting all integer power of two scale factors.
|
||||
# note: this is analogous to the 'semitones' interval in the music world
|
||||
# In order to avoid numerical imprecisions, we compute and edit a zoom index
|
||||
# with the following relation: zoom = 2 ^ (index / 12)
|
||||
|
||||
if (zoom < CMP_EPSILON || p_increment_count == 0):
|
||||
return
|
||||
|
||||
# zoom = 2**(index/12) => log2(zoom) = index/12
|
||||
var closest_zoom_index : float = round(log(zoom_noscale) * 12.0 / log(2.0))
|
||||
|
||||
var new_zoom_index : float = closest_zoom_index + p_increment_count
|
||||
var new_zoom : float = pow(2.0, new_zoom_index / 12.0)
|
||||
|
||||
# Restore Editor scale transformation
|
||||
new_zoom *= max(1, EDSCALE)
|
||||
|
||||
set_zoom(new_zoom)
|
||||
|
||||
|
||||
func _update_zoom_label() -> void:
|
||||
var zoom_text : String = ""
|
||||
|
||||
# The zoom level displayed is relative to the editor scale
|
||||
# (like in most image editors). Its lower bound is clamped to 1 as some people
|
||||
# lower the editor scale to increase the available real estate,
|
||||
# even if their display doesn't have a particularly low DPI.
|
||||
|
||||
if (zoom >= 10):
|
||||
# Don't show a decimal when the zoom level is higher than 1000 %.
|
||||
#zoom_text = (rtos(round((zoom / max(1, EDSCALE)) * 100))) + " %"
|
||||
zoom_text = (String(round((zoom / max(1, EDSCALE)) * 100))) + " %"
|
||||
else:
|
||||
var v : float = (zoom / max(1, EDSCALE)) * 100
|
||||
var val : float = floor(v / 0.1 + 0.5) * 0.1
|
||||
|
||||
# zoom_text = (rtos(val)) + " %"
|
||||
zoom_text = (String(val)) + " %"
|
||||
|
||||
zoom_reset.set_text(zoom_text)
|
||||
|
||||
func _button_zoom_minus() -> void:
|
||||
set_zoom_by_increments(-6, Input.is_key_pressed(KEY_ALT));
|
||||
emit_signal("zoom_changed", zoom);
|
||||
|
||||
func _button_zoom_reset() -> void:
|
||||
set_zoom(1.0 * max(1, EDSCALE));
|
||||
emit_signal("zoom_changed", zoom);
|
||||
|
||||
func _button_zoom_plus() -> void:
|
||||
set_zoom_by_increments(6, Input.is_key_pressed(KEY_ALT));
|
||||
emit_signal("zoom_changed", zoom);
|
||||
|
||||
func _notification(p_what : int) -> void:
|
||||
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED):
|
||||
zoom_minus.icon = get_icon("ZoomLess", "EditorIcons")
|
||||
zoom_plus.icon = get_icon("ZoomMore", "EditorIcons")
|
||||
|
||||
#from godot editor/editor_Settings.cpp
|
||||
func ED_SHORTCUT(p_path : String, p_name : String, p_keycode : int, editor_settings : EditorSettings = null) -> ShortCut:
|
||||
if OS.get_name() == "OSX":
|
||||
# Use Cmd+Backspace as a general replacement for Delete shortcuts on macOS
|
||||
if (p_keycode == KEY_DELETE):
|
||||
p_keycode = KEY_MASK_CMD | KEY_BACKSPACE
|
||||
|
||||
var ie : InputEventKey = null
|
||||
if (p_keycode):
|
||||
ie = InputEventKey.new()
|
||||
|
||||
ie.set_unicode(p_keycode & KEY_CODE_MASK)
|
||||
ie.set_scancode(p_keycode & KEY_CODE_MASK)
|
||||
ie.set_shift(bool(p_keycode & KEY_MASK_SHIFT))
|
||||
ie.set_alt(bool(p_keycode & KEY_MASK_ALT))
|
||||
ie.set_control(bool(p_keycode & KEY_MASK_CTRL))
|
||||
ie.set_metakey(bool(p_keycode & KEY_MASK_META))
|
||||
|
||||
if (!editor_settings):
|
||||
var sc : ShortCut
|
||||
sc = ShortCut.new()
|
||||
sc.set_name(p_name)
|
||||
sc.set_shortcut(ie)
|
||||
sc.set_meta("original", ie)
|
||||
return sc
|
||||
|
||||
var sc : ShortCut = editor_settings.get_shortcut(p_path)
|
||||
if (sc.is_valid()):
|
||||
sc.set_name(p_name); #keep name (the ones that come from disk have no name)
|
||||
sc.set_meta("original", ie); #to compare against changes
|
||||
return sc;
|
||||
|
||||
sc = ShortCut.new()
|
||||
sc.set_name(p_name)
|
||||
sc.set_shortcut(ie)
|
||||
sc.set_meta("original", ie) #to compare against changes
|
||||
editor_settings.add_shortcut(p_path, sc)
|
||||
|
||||
return sc
|
||||
|
8
world_generator/widgets/EditorZoomWidget.tscn
Normal file
8
world_generator/widgets/EditorZoomWidget.tscn
Normal file
@ -0,0 +1,8 @@
|
||||
[gd_scene load_steps=2 format=2]
|
||||
|
||||
[ext_resource path="res://addons/world_generator/widgets/EditorZoomWidget.gd" type="Script" id=1]
|
||||
|
||||
[node name="EditorZoomWidget" type="HBoxContainer"]
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
script = ExtResource( 1 )
|
Loading…
Reference in New Issue
Block a user