Compare commits
2 Commits
db39715354
...
c8072b8457
| Author | SHA1 | Date | |
|---|---|---|---|
| c8072b8457 | |||
| 166e6d6b4a |
BIN
assets/blender/buildings/building-elements.blend
Normal file
BIN
assets/blender/buildings/building-elements.blend
Normal file
Binary file not shown.
BIN
godot/astream/building-layouts/Material.material
Normal file
BIN
godot/astream/building-layouts/Material.material
Normal file
Binary file not shown.
BIN
godot/astream/building-layouts/building-elements.glb
Normal file
BIN
godot/astream/building-layouts/building-elements.glb
Normal file
Binary file not shown.
1066
godot/astream/building-layouts/building-elements.glb.import
Normal file
1066
godot/astream/building-layouts/building-elements.glb.import
Normal file
File diff suppressed because it is too large
Load Diff
80543
godot/astream/npc/roster.json
Normal file
80543
godot/astream/npc/roster.json
Normal file
File diff suppressed because it is too large
Load Diff
16
godot/main/building_layout_editor.gd
Normal file
16
godot/main/building_layout_editor.gd
Normal file
@@ -0,0 +1,16 @@
|
||||
extends Spatial
|
||||
|
||||
|
||||
# Declare member variables here. Examples:
|
||||
# var a = 2
|
||||
# var b = "text"
|
||||
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||
#func _process(delta):
|
||||
# pass
|
||||
306
godot/main/building_layout_editor.tscn
Normal file
306
godot/main/building_layout_editor.tscn
Normal file
@@ -0,0 +1,306 @@
|
||||
[gd_scene load_steps=4 format=2]
|
||||
|
||||
[ext_resource path="res://main/building_layout_editor.gd" type="Script" id=1]
|
||||
[ext_resource path="res://astream/building-layouts/building-elements.glb" type="PackedScene" id=2]
|
||||
|
||||
[sub_resource type="CubeMesh" id=1]
|
||||
size = Vector3( 40, 1, 40 )
|
||||
|
||||
[node name="building_layout_editor" type="Spatial"]
|
||||
script = ExtResource( 1 )
|
||||
|
||||
[node name="menu_panel" type="HBoxContainer" parent="."]
|
||||
unique_name_in_owner = true
|
||||
margin_right = 1024.0
|
||||
margin_bottom = 20.0
|
||||
|
||||
[node name="FileMenu" type="MenuButton" parent="menu_panel"]
|
||||
margin_right = 35.0
|
||||
margin_bottom = 20.0
|
||||
text = "File"
|
||||
items = [ "Save", null, 0, false, false, 100, 0, null, "", false ]
|
||||
switch_on_hover = true
|
||||
|
||||
[node name="ElementMenu" type="MenuButton" parent="menu_panel"]
|
||||
margin_left = 39.0
|
||||
margin_right = 104.0
|
||||
margin_bottom = 20.0
|
||||
focus_mode = 2
|
||||
text = "Element"
|
||||
items = [ "Layout...", null, 0, false, false, 200, 0, null, "", false, "Element types...", null, 0, false, false, 201, 0, null, "", false, "Elements...", null, 0, false, false, 202, 0, null, "", false, "", null, 0, false, true, 3, 0, null, "", true ]
|
||||
switch_on_hover = true
|
||||
|
||||
[node name="ExteriorMenu" type="MenuButton" parent="menu_panel"]
|
||||
margin_left = 108.0
|
||||
margin_right = 169.0
|
||||
margin_bottom = 20.0
|
||||
focus_mode = 2
|
||||
text = "Exterior"
|
||||
switch_on_hover = true
|
||||
|
||||
[node name="InteriorMenu" type="MenuButton" parent="menu_panel"]
|
||||
margin_left = 173.0
|
||||
margin_right = 233.0
|
||||
margin_bottom = 20.0
|
||||
focus_mode = 2
|
||||
text = "Interior"
|
||||
switch_on_hover = true
|
||||
|
||||
[node name="MeshInstance" type="MeshInstance" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0 )
|
||||
mesh = SubResource( 1 )
|
||||
|
||||
[node name="DirectionalLight" type="DirectionalLight" parent="."]
|
||||
transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 100, 0 )
|
||||
|
||||
[node name="Camera" type="Camera" parent="."]
|
||||
transform = Transform( 0.707107, 0.5, -0.5, 0, 0.707107, 0.707107, 0.707107, -0.5, 0.5, -25, 25, 25 )
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="."]
|
||||
anchor_left = 1.0
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
margin_left = -314.0
|
||||
|
||||
[node name="HSeparator2" type="HSeparator" parent="VBoxContainer"]
|
||||
margin_right = 314.0
|
||||
margin_bottom = 4.0
|
||||
|
||||
[node name="Label" type="Label" parent="VBoxContainer"]
|
||||
margin_top = 8.0
|
||||
margin_right = 314.0
|
||||
margin_bottom = 22.0
|
||||
text = "Properties"
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="VBoxContainer"]
|
||||
margin_top = 26.0
|
||||
margin_right = 314.0
|
||||
margin_bottom = 30.0
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer"]
|
||||
margin_top = 34.0
|
||||
margin_right = 314.0
|
||||
margin_bottom = 134.0
|
||||
rect_min_size = Vector2( 0, 100 )
|
||||
size_flags_vertical = 3
|
||||
scroll_horizontal_enabled = false
|
||||
|
||||
[node name="layout_mesh_buttons" type="VBoxContainer" parent="VBoxContainer/ScrollContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_right = 302.0
|
||||
margin_bottom = 168.0
|
||||
rect_min_size = Vector2( 100, 0 )
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="socket_editor" type="PanelContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 138.0
|
||||
margin_right = 314.0
|
||||
margin_bottom = 420.0
|
||||
|
||||
[node name="v" type="VBoxContainer" parent="VBoxContainer/socket_editor"]
|
||||
margin_left = 7.0
|
||||
margin_top = 7.0
|
||||
margin_right = 307.0
|
||||
margin_bottom = 275.0
|
||||
|
||||
[node name="socket_new_element" type="Button" parent="VBoxContainer/socket_editor/v"]
|
||||
unique_name_in_owner = true
|
||||
margin_right = 300.0
|
||||
margin_bottom = 20.0
|
||||
text = "New Element Type"
|
||||
|
||||
[node name="socket_new_element_name" type="LineEdit" parent="VBoxContainer/socket_editor/v"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 24.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 48.0
|
||||
|
||||
[node name="element_type_list" type="ItemList" parent="VBoxContainer/socket_editor/v"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 52.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 112.0
|
||||
rect_min_size = Vector2( 0, 60 )
|
||||
items = [ "Item 0", null, false, "Item 1", null, false, "Item 2", null, false, "Item 3", null, false ]
|
||||
|
||||
[node name="socket_list" type="ItemList" parent="VBoxContainer/socket_editor/v"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 116.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 176.0
|
||||
rect_min_size = Vector2( 0, 60 )
|
||||
items = [ "floor", null, false, "west_wall", null, false, "east_wall", null, false, "north_wall", null, false, "south_wall", null, false, "diagonal_wall", null, false, "diagonal2_wall", null, false ]
|
||||
|
||||
[node name="socket_transform_editor" type="VBoxContainer" parent="VBoxContainer/socket_editor/v"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 180.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 268.0
|
||||
|
||||
[node name="offset_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor"]
|
||||
margin_right = 300.0
|
||||
margin_bottom = 14.0
|
||||
text = "Offset"
|
||||
|
||||
[node name="socket_editor_offset_base" type="HBoxContainer" parent="VBoxContainer/socket_editor/v/socket_transform_editor"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 18.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 42.0
|
||||
|
||||
[node name="x_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_offset_base"]
|
||||
margin_top = 5.0
|
||||
margin_right = 8.0
|
||||
margin_bottom = 19.0
|
||||
text = "X"
|
||||
|
||||
[node name="x_edit" type="LineEdit" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_offset_base"]
|
||||
margin_left = 12.0
|
||||
margin_right = 85.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="y_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_offset_base"]
|
||||
margin_left = 89.0
|
||||
margin_top = 5.0
|
||||
margin_right = 96.0
|
||||
margin_bottom = 19.0
|
||||
text = "Y"
|
||||
|
||||
[node name="y_edit" type="LineEdit" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_offset_base"]
|
||||
margin_left = 100.0
|
||||
margin_right = 174.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="z_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_offset_base"]
|
||||
margin_left = 178.0
|
||||
margin_top = 5.0
|
||||
margin_right = 186.0
|
||||
margin_bottom = 19.0
|
||||
text = "Z"
|
||||
|
||||
[node name="z_edit" type="LineEdit" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_offset_base"]
|
||||
margin_left = 190.0
|
||||
margin_right = 263.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="set" type="Button" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_offset_base"]
|
||||
margin_left = 267.0
|
||||
margin_right = 299.0
|
||||
margin_bottom = 24.0
|
||||
text = "Set"
|
||||
|
||||
[node name="rotation_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor"]
|
||||
margin_top = 46.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 60.0
|
||||
text = "Rotation"
|
||||
|
||||
[node name="socket_editor_rotation_base" type="HBoxContainer" parent="VBoxContainer/socket_editor/v/socket_transform_editor"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 64.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 88.0
|
||||
|
||||
[node name="x_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_rotation_base"]
|
||||
margin_top = 5.0
|
||||
margin_right = 8.0
|
||||
margin_bottom = 19.0
|
||||
text = "X"
|
||||
|
||||
[node name="x_edit" type="LineEdit" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_rotation_base"]
|
||||
margin_left = 12.0
|
||||
margin_right = 85.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="y_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_rotation_base"]
|
||||
margin_left = 89.0
|
||||
margin_top = 5.0
|
||||
margin_right = 96.0
|
||||
margin_bottom = 19.0
|
||||
text = "Y"
|
||||
|
||||
[node name="y_edit" type="LineEdit" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_rotation_base"]
|
||||
margin_left = 100.0
|
||||
margin_right = 174.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="z_label" type="Label" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_rotation_base"]
|
||||
margin_left = 178.0
|
||||
margin_top = 5.0
|
||||
margin_right = 186.0
|
||||
margin_bottom = 19.0
|
||||
text = "Z"
|
||||
|
||||
[node name="z_edit" type="LineEdit" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_rotation_base"]
|
||||
margin_left = 190.0
|
||||
margin_right = 263.0
|
||||
margin_bottom = 24.0
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="set" type="Button" parent="VBoxContainer/socket_editor/v/socket_transform_editor/socket_editor_rotation_base"]
|
||||
margin_left = 267.0
|
||||
margin_right = 299.0
|
||||
margin_bottom = 24.0
|
||||
text = "Set"
|
||||
|
||||
[node name="element_editor" type="PanelContainer" parent="VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 424.0
|
||||
margin_right = 314.0
|
||||
margin_bottom = 691.0
|
||||
|
||||
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/element_editor"]
|
||||
margin_left = 7.0
|
||||
margin_top = 7.0
|
||||
margin_right = 307.0
|
||||
margin_bottom = 260.0
|
||||
|
||||
[node name="element_new_element" type="Button" parent="VBoxContainer/element_editor/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_right = 300.0
|
||||
margin_bottom = 20.0
|
||||
text = "New element"
|
||||
|
||||
[node name="element_new_element_name" type="LineEdit" parent="VBoxContainer/element_editor/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 24.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 48.0
|
||||
|
||||
[node name="element_list" type="ItemList" parent="VBoxContainer/element_editor/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 52.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 97.0
|
||||
rect_min_size = Vector2( 0, 45 )
|
||||
|
||||
[node name="element_type_select" type="OptionButton" parent="VBoxContainer/element_editor/VBoxContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_top = 101.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 121.0
|
||||
|
||||
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/element_editor/VBoxContainer"]
|
||||
margin_top = 125.0
|
||||
margin_right = 300.0
|
||||
margin_bottom = 253.0
|
||||
rect_min_size = Vector2( 300, 128 )
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="element_mesh_select" type="GridContainer" parent="VBoxContainer/element_editor/VBoxContainer/ScrollContainer"]
|
||||
unique_name_in_owner = true
|
||||
margin_right = 300.0
|
||||
margin_bottom = 128.0
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
columns = 2
|
||||
|
||||
[node name="BuildingLayoutEditor" type="BuildingLayoutEditor" parent="."]
|
||||
source = ExtResource( 2 )
|
||||
@@ -3,12 +3,15 @@
|
||||
Import("env")
|
||||
Import("env_modules")
|
||||
|
||||
|
||||
env_stream = env_modules.Clone()
|
||||
|
||||
# Godot source files
|
||||
|
||||
module_obj = []
|
||||
|
||||
SConscript("buildings/SCsub")
|
||||
|
||||
env_stream.add_source_files(module_obj, "*.cpp")
|
||||
env_stream.add_source_files(module_obj, "flecs/*.c")
|
||||
env.modules_sources += module_obj
|
||||
|
||||
16
src/modules/stream/buildings/SCsub
Normal file
16
src/modules/stream/buildings/SCsub
Normal file
@@ -0,0 +1,16 @@
|
||||
Import("env")
|
||||
Import("env_modules")
|
||||
|
||||
#env_modules.stream_building_sources = []
|
||||
#
|
||||
#env_modules.add_source_files(env_modules.stream_building_sources, "*.cpp")
|
||||
#
|
||||
#lib = env_modules.add_library("buildings", env_modules.stream_building_sources)
|
||||
#env_modules.Prepend(LIBS=[lib])
|
||||
|
||||
env.stream_building_sources = []
|
||||
|
||||
env.add_source_files(env.stream_building_sources, "*.cpp")
|
||||
|
||||
lib = env.add_library("buildings", env.stream_building_sources)
|
||||
env.Prepend(LIBS=[lib])
|
||||
659
src/modules/stream/buildings/building_layout_editor.cpp
Normal file
659
src/modules/stream/buildings/building_layout_editor.cpp
Normal file
@@ -0,0 +1,659 @@
|
||||
#undef NDEBUG
|
||||
#include <cassert>
|
||||
#include <main/main.h>
|
||||
#include <core/engine.h>
|
||||
#include <scene/resources/packed_scene.h>
|
||||
#include <scene/3d/mesh_instance.h>
|
||||
#include <scene/gui/box_container.h>
|
||||
#include <scene/gui/texture_button.h>
|
||||
#include <scene/gui/option_button.h>
|
||||
#include <scene/gui/label.h>
|
||||
#include <scene/gui/button.h>
|
||||
#include <scene/gui/menu_button.h>
|
||||
#include <editor/editor_node.h>
|
||||
#include "building_layout_editor.h"
|
||||
|
||||
/* Taken from Godot code editor/editor_plugin.cpp */
|
||||
|
||||
BuildingLayoutEditor::BuildingLayoutEditor()
|
||||
: meshes_ready(false)
|
||||
, current_mode(-1)
|
||||
, current_element_type("")
|
||||
, current_element("")
|
||||
, current_socket(-1)
|
||||
{
|
||||
}
|
||||
|
||||
template <class T> T *get_as_node(const String &path)
|
||||
{
|
||||
Node *scene;
|
||||
if (Engine::get_singleton()->is_editor_hint())
|
||||
scene = EditorNode::get_singleton()->get_edited_scene();
|
||||
else
|
||||
scene = SceneTree::get_singleton()->get_current_scene();
|
||||
assert(scene);
|
||||
Node *node = scene->get_node(NodePath(path));
|
||||
if (!node)
|
||||
print_error("Failed to get " + path);
|
||||
assert(node);
|
||||
T *ret = Object::cast_to<T>(node);
|
||||
if (!ret)
|
||||
print_error("Failed to assign " + path);
|
||||
assert(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Vector<Ref<Texture> >
|
||||
BuildingLayoutEditor::make_mesh_previews(const Vector<Ref<Mesh> > &p_meshes,
|
||||
Vector<Transform> *p_transforms,
|
||||
int p_preview_size)
|
||||
{
|
||||
int size = p_preview_size;
|
||||
|
||||
RID scenario = RID_PRIME(VS::get_singleton()->scenario_create());
|
||||
|
||||
RID viewport = RID_PRIME(VS::get_singleton()->viewport_create());
|
||||
VS::get_singleton()->viewport_set_update_mode(
|
||||
viewport, VS::VIEWPORT_UPDATE_ALWAYS);
|
||||
VS::get_singleton()->viewport_set_vflip(viewport, true);
|
||||
VS::get_singleton()->viewport_set_scenario(viewport, scenario);
|
||||
VS::get_singleton()->viewport_set_size(viewport, size, size);
|
||||
VS::get_singleton()->viewport_set_transparent_background(viewport,
|
||||
true);
|
||||
VS::get_singleton()->viewport_set_active(viewport, true);
|
||||
RID viewport_texture =
|
||||
VS::get_singleton()->viewport_get_texture(viewport);
|
||||
|
||||
RID camera = RID_PRIME(VS::get_singleton()->camera_create());
|
||||
VS::get_singleton()->viewport_attach_camera(viewport, camera);
|
||||
|
||||
RID light = RID_PRIME(VS::get_singleton()->directional_light_create());
|
||||
RID light_instance =
|
||||
VS::get_singleton()->instance_create2(light, scenario);
|
||||
|
||||
RID light2 = VS::get_singleton()->directional_light_create();
|
||||
VS::get_singleton()->light_set_color(light2, Color(0.7, 0.7, 0.7));
|
||||
RID light_instance2 =
|
||||
VS::get_singleton()->instance_create2(light2, scenario);
|
||||
|
||||
Vector<Ref<Texture> > textures;
|
||||
|
||||
for (int i = 0; i < p_meshes.size(); i++) {
|
||||
Ref<Mesh> mesh = p_meshes[i];
|
||||
if (!mesh.is_valid()) {
|
||||
textures.push_back(Ref<Texture>());
|
||||
continue;
|
||||
}
|
||||
|
||||
Transform mesh_xform;
|
||||
if (p_transforms != nullptr) {
|
||||
mesh_xform = (*p_transforms)[i];
|
||||
}
|
||||
|
||||
RID inst = VS::get_singleton()->instance_create2(
|
||||
mesh->get_rid(), scenario);
|
||||
VS::get_singleton()->instance_set_transform(inst, mesh_xform);
|
||||
|
||||
AABB aabb = mesh->get_aabb();
|
||||
Vector3 ofs = aabb.position + aabb.size * 0.5;
|
||||
aabb.position -= ofs;
|
||||
Transform xform;
|
||||
xform.basis = Basis().rotated(Vector3(0, 1, 0), -Math_PI / 6);
|
||||
xform.basis = Basis().rotated(Vector3(1, 0, 0), Math_PI / 6) *
|
||||
xform.basis;
|
||||
AABB rot_aabb = xform.xform(aabb);
|
||||
float m = MAX(rot_aabb.size.x, rot_aabb.size.y) * 0.5;
|
||||
if (m == 0) {
|
||||
textures.push_back(Ref<Texture>());
|
||||
continue;
|
||||
}
|
||||
xform.origin = -xform.basis.xform(ofs); //-ofs*m;
|
||||
xform.origin.z -= rot_aabb.size.z * 2;
|
||||
xform.invert();
|
||||
xform = mesh_xform * xform;
|
||||
|
||||
VS::get_singleton()->camera_set_transform(
|
||||
camera, xform * Transform(Basis(), Vector3(0, 0, 3)));
|
||||
VS::get_singleton()->camera_set_orthogonal(camera, m * 2, 0.01,
|
||||
1000.0);
|
||||
|
||||
VS::get_singleton()->instance_set_transform(
|
||||
light_instance,
|
||||
xform * Transform().looking_at(Vector3(-2, -1, -1),
|
||||
Vector3(0, 1, 0)));
|
||||
VS::get_singleton()->instance_set_transform(
|
||||
light_instance2,
|
||||
xform * Transform().looking_at(Vector3(+1, -1, -2),
|
||||
Vector3(0, 1, 0)));
|
||||
|
||||
Main::iteration();
|
||||
Main::iteration();
|
||||
Ref<Image> img =
|
||||
VS::get_singleton()->texture_get_data(viewport_texture);
|
||||
ERR_CONTINUE(!img.is_valid() || img->empty());
|
||||
Ref<ImageTexture> it(memnew(ImageTexture));
|
||||
it->create_from_image(img);
|
||||
|
||||
VS::get_singleton()->free(inst);
|
||||
|
||||
textures.push_back(it);
|
||||
}
|
||||
|
||||
VS::get_singleton()->free(viewport);
|
||||
VS::get_singleton()->free(light);
|
||||
VS::get_singleton()->free(light_instance);
|
||||
VS::get_singleton()->free(light2);
|
||||
VS::get_singleton()->free(light_instance2);
|
||||
VS::get_singleton()->free(camera);
|
||||
VS::get_singleton()->free(scenario);
|
||||
|
||||
return textures;
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::set_source(const Ref<PackedScene> &src)
|
||||
{
|
||||
source = src;
|
||||
if (is_inside_tree()) {
|
||||
prepare_meshes();
|
||||
meshes_ready = true;
|
||||
update_mesh_buttons();
|
||||
}
|
||||
}
|
||||
|
||||
Ref<PackedScene> BuildingLayoutEditor::get_source() const
|
||||
{
|
||||
return source;
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::_notification(int which)
|
||||
{
|
||||
switch (which) {
|
||||
case NOTIFICATION_READY:
|
||||
connect_signals();
|
||||
if (!meshes_ready) {
|
||||
prepare_meshes();
|
||||
update_mesh_buttons();
|
||||
}
|
||||
select_mode(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::prepare_meshes()
|
||||
{
|
||||
int i;
|
||||
if (!source.is_valid())
|
||||
return;
|
||||
Vector<String> mesh_names;
|
||||
Vector<Ref<Mesh> > preview_meshes;
|
||||
Vector<Ref<Texture> > preview_textures;
|
||||
Node *scene = source->instance();
|
||||
List<Node *> queue;
|
||||
queue.push_back(scene);
|
||||
while (!queue.empty()) {
|
||||
Node *item = queue.front()->get();
|
||||
MeshInstance *mi = Object::cast_to<MeshInstance>(item);
|
||||
if (mi) {
|
||||
mesh_names.push_back(mi->get_name());
|
||||
preview_meshes.push_back(mi->get_mesh());
|
||||
}
|
||||
queue.pop_front();
|
||||
for (i = 0; i < item->get_child_count(); i++)
|
||||
queue.push_back(item->get_child(i));
|
||||
}
|
||||
preview_textures = make_mesh_previews(preview_meshes, nullptr, 64);
|
||||
assert(preview_textures.size() == preview_meshes.size());
|
||||
if (scene)
|
||||
scene->queue_delete();
|
||||
for (i = 0; i < preview_meshes.size(); i++) {
|
||||
struct mesh_data md;
|
||||
md.mesh = preview_meshes[i];
|
||||
md.mesh_name = mesh_names[i];
|
||||
md.preview = preview_textures[i];
|
||||
int poff = mesh_names[i].find_char('_');
|
||||
if (poff < 0)
|
||||
md.category = "unknown";
|
||||
else
|
||||
md.category = mesh_names[i].substr(0, poff);
|
||||
meshes[mesh_names[i]] = md;
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::update_mesh_buttons()
|
||||
{
|
||||
Node *layout_mesh_buttons = get_node(NodePath("%layout_mesh_buttons"));
|
||||
List<String> mlist;
|
||||
meshes.get_key_list(&mlist);
|
||||
HashMap<String, Node *> categories;
|
||||
List<String>::Element *e = mlist.front();
|
||||
while (e) {
|
||||
const struct mesh_data &md = meshes[e->get()];
|
||||
if (!categories.has(md.category)) {
|
||||
VBoxContainer *cat = memnew(VBoxContainer);
|
||||
categories[md.category] = cat;
|
||||
layout_mesh_buttons->add_child(cat);
|
||||
}
|
||||
Label *l = memnew(Label);
|
||||
l->set_text(md.mesh_name);
|
||||
categories[md.category]->add_child(l);
|
||||
TextureButton *b = memnew(TextureButton);
|
||||
b->set_normal_texture(md.preview);
|
||||
b->set_pressed_texture(md.preview);
|
||||
b->set_hover_texture(md.preview);
|
||||
categories[md.category]->add_child(b);
|
||||
e = e->next();
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::_bind_methods()
|
||||
{
|
||||
ClassDB::bind_method(D_METHOD("set_source", "src"),
|
||||
&BuildingLayoutEditor::set_source);
|
||||
ClassDB::bind_method(D_METHOD("get_source"),
|
||||
&BuildingLayoutEditor::get_source);
|
||||
ClassDB::bind_method(D_METHOD("select_mode", "mode"),
|
||||
&BuildingLayoutEditor::select_mode);
|
||||
ClassDB::bind_method(D_METHOD("enter_name", "text"),
|
||||
&BuildingLayoutEditor::enter_name);
|
||||
ClassDB::bind_method(D_METHOD("enter_element_name", "text"),
|
||||
&BuildingLayoutEditor::enter_element_name);
|
||||
ClassDB::bind_method(D_METHOD("select_element_type", "element"),
|
||||
&BuildingLayoutEditor::select_element_type);
|
||||
ClassDB::bind_method(D_METHOD("select_element", "element"),
|
||||
&BuildingLayoutEditor::select_element);
|
||||
ClassDB::bind_method(D_METHOD("select_socket", "socket"),
|
||||
&BuildingLayoutEditor::select_socket);
|
||||
ClassDB::bind_method(D_METHOD("set_socket_offset"),
|
||||
&BuildingLayoutEditor::set_socket_offset);
|
||||
ClassDB::bind_method(D_METHOD("set_socket_rotation"),
|
||||
&BuildingLayoutEditor::set_socket_rotation);
|
||||
ClassDB::bind_method(D_METHOD("menu_control"),
|
||||
&BuildingLayoutEditor::menu_control);
|
||||
ClassDB::bind_method(D_METHOD("mesh_selected", "mesh_idx", "socket"),
|
||||
&BuildingLayoutEditor::mesh_selected);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "source",
|
||||
PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"),
|
||||
"set_source", "get_source");
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::connect_signals()
|
||||
{
|
||||
int i;
|
||||
if (Engine::get_singleton()->is_editor_hint())
|
||||
return;
|
||||
get_as_node<Button>("%socket_new_element")
|
||||
->connect("pressed", this, "enter_name", varray(""));
|
||||
get_as_node<LineEdit>("%socket_new_element_name")
|
||||
->connect("text_entered", this, "enter_name");
|
||||
get_as_node<ItemList>("%element_type_list")
|
||||
->connect("item_selected", this, "select_element_type");
|
||||
get_as_node<ItemList>("%socket_list")
|
||||
->connect("item_selected", this, "select_socket");
|
||||
get_as_node<Button>("%socket_editor_offset_base/set")
|
||||
->connect("pressed", this, "set_socket_offset");
|
||||
get_as_node<Button>("%socket_editor_rotation_base/set")
|
||||
->connect("pressed", this, "set_socket_rotation");
|
||||
get_as_node<ItemList>("%element_list")
|
||||
->connect("item_selected", this, "select_element");
|
||||
|
||||
get_as_node<Button>("%element_new_element")
|
||||
->connect("pressed", this, "enter_element_name", varray(""));
|
||||
get_as_node<LineEdit>("%element_new_element_name")
|
||||
->connect("text_entered", this, "enter_element_name");
|
||||
Node *menu_panel = get_node(NodePath("%menu_panel"));
|
||||
for (i = 0; i < menu_panel->get_child_count(); i++) {
|
||||
Node *m = menu_panel->get_child(i);
|
||||
MenuButton *mb = Object::cast_to<MenuButton>(m);
|
||||
mb->get_popup()->connect("id_pressed", this, "menu_control");
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::select_mode(int mode)
|
||||
{
|
||||
int i;
|
||||
List<String> element_keys;
|
||||
List<String>::Element *e;
|
||||
print_line("set mode: " + itos(mode));
|
||||
if (Engine::get_singleton()->is_editor_hint())
|
||||
return;
|
||||
if (current_mode != mode) {
|
||||
switch (current_mode) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
break;
|
||||
}
|
||||
current_mode = mode;
|
||||
switch (mode) {
|
||||
case 0:
|
||||
get_as_node<Control>("%socket_editor")->hide();
|
||||
get_as_node<Control>("%element_editor")->hide();
|
||||
if (elements.size() == 0)
|
||||
print_error("No elements");
|
||||
break;
|
||||
case 1:
|
||||
get_as_node<Control>("%element_editor")->hide();
|
||||
get_as_node<ItemList>("%element_type_list")->clear();
|
||||
print_line("Restoring UI");
|
||||
element_keys.clear();
|
||||
element_type.get_key_list(&element_keys);
|
||||
e = element_keys.front();
|
||||
while (e) {
|
||||
get_as_node<ItemList>("%element_type_list")
|
||||
->add_item(e->get());
|
||||
print_line("Added item: " + e->get());
|
||||
e = e->next();
|
||||
}
|
||||
get_as_node<ItemList>("%socket_list")->hide();
|
||||
get_as_node<Control>("%socket_editor")->show();
|
||||
get_as_node<LineEdit>("%socket_new_element_name")
|
||||
->hide();
|
||||
get_as_node<ItemList>("%socket_list")->hide();
|
||||
get_as_node<Control>("%socket_transform_editor")->hide();
|
||||
element_keys.clear();
|
||||
break;
|
||||
case 2:
|
||||
if (element_type.size() == 0)
|
||||
print_error("No element types");
|
||||
get_as_node<Control>("%socket_editor")->hide();
|
||||
get_as_node<Control>("%element_editor")->show();
|
||||
get_as_node<LineEdit>("%element_new_element_name")
|
||||
->hide();
|
||||
get_as_node<ItemList>("%element_list")->clear();
|
||||
print_line("Restoring UI");
|
||||
element_keys.clear();
|
||||
elements.get_key_list(&element_keys);
|
||||
e = element_keys.front();
|
||||
while (e) {
|
||||
get_as_node<ItemList>("%element_list")
|
||||
->add_item(e->get());
|
||||
print_line("Added item: " + e->get());
|
||||
e = e->next();
|
||||
}
|
||||
element_keys.clear();
|
||||
element_type.get_key_list(&element_keys);
|
||||
e = element_keys.front();
|
||||
while (e) {
|
||||
get_as_node<OptionButton>(
|
||||
"%element_type_select")
|
||||
->add_item(e->get());
|
||||
print_line("Added item: " + e->get());
|
||||
e = e->next();
|
||||
}
|
||||
get_as_node<ItemList>("%element_list")->select(0);
|
||||
ItemList *sl = get_as_node<ItemList>("%socket_list");
|
||||
Control *mb =
|
||||
get_as_node<Control>("%element_mesh_select");
|
||||
used_socket_count = sl->get_item_count();
|
||||
if (mb->get_child_count() == 0) {
|
||||
for (i = 0; i < used_socket_count; i++) {
|
||||
String socket_name =
|
||||
sl->get_item_text(i);
|
||||
Label *label = memnew(Label);
|
||||
label->set_text(socket_name);
|
||||
OptionButton *ob = memnew(OptionButton);
|
||||
mb->add_child(label);
|
||||
mb->add_child(ob);
|
||||
List<String> mesh_list;
|
||||
meshes.get_key_list(&mesh_list);
|
||||
List<String>::Element *me =
|
||||
mesh_list.front();
|
||||
ob->clear();
|
||||
ob->add_item("");
|
||||
int index = 1;
|
||||
int selected = 0;
|
||||
String selected_mesh;
|
||||
if (elements.has(current_element))
|
||||
selected_mesh =
|
||||
elements[current_element]
|
||||
.mesh_names[i];
|
||||
while (me) {
|
||||
if (selected_mesh == me->get())
|
||||
selected = index;
|
||||
ob->add_item(me->get());
|
||||
ob->set_item_icon(
|
||||
index,
|
||||
meshes[me->get()]
|
||||
.preview);
|
||||
mesh_select_buttons[i] = ob;
|
||||
me = me->next();
|
||||
index++;
|
||||
}
|
||||
ob->select(selected);
|
||||
ob->connect("item_selected", this,
|
||||
"mesh_selected", varray(i));
|
||||
}
|
||||
}
|
||||
select_element(0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::enter_name(const String &text)
|
||||
{
|
||||
bool added = false;
|
||||
if (text == "") {
|
||||
get_as_node<LineEdit>("%socket_new_element_name")->show();
|
||||
get_as_node<LineEdit>("%socket_new_element_name")
|
||||
->grab_click_focus();
|
||||
get_as_node<LineEdit>("%socket_new_element_name")->grab_focus();
|
||||
} else {
|
||||
String key = text.strip_edges();
|
||||
assert(!element_type.has(key));
|
||||
if (!element_type.has(key)) {
|
||||
struct grid_element_type g;
|
||||
g.name = key;
|
||||
element_type[key] = g;
|
||||
get_as_node<ItemList>("%element_type_list")
|
||||
->add_item(key);
|
||||
added = true;
|
||||
}
|
||||
assert(added);
|
||||
get_as_node<LineEdit>("%socket_new_element_name")->set_text("");
|
||||
get_as_node<LineEdit>("%socket_new_element_name")
|
||||
->release_focus();
|
||||
get_as_node<LineEdit>("%socket_new_element_name")->hide();
|
||||
if (added) {
|
||||
get_as_node<ItemList>("%element_type_list")
|
||||
->grab_click_focus();
|
||||
get_as_node<ItemList>("%element_type_list")
|
||||
->grab_focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::enter_element_name(const String &text)
|
||||
{
|
||||
bool added = false;
|
||||
if (text == "") {
|
||||
get_as_node<LineEdit>("%element_new_element_name")->show();
|
||||
get_as_node<LineEdit>("%element_new_element_name")
|
||||
->grab_click_focus();
|
||||
get_as_node<LineEdit>("%element_new_element_name")->grab_focus();
|
||||
} else {
|
||||
String key = text.strip_edges();
|
||||
assert(!elements.has(key));
|
||||
if (!elements.has(key)) {
|
||||
struct grid_element g;
|
||||
g.name = key;
|
||||
elements[key] = g;
|
||||
get_as_node<ItemList>("%element_list")->add_item(key);
|
||||
added = true;
|
||||
}
|
||||
assert(added);
|
||||
get_as_node<LineEdit>("%element_new_element_name")->set_text("");
|
||||
get_as_node<LineEdit>("%element_new_element_name")
|
||||
->release_focus();
|
||||
get_as_node<LineEdit>("%element_new_element_name")->hide();
|
||||
if (added) {
|
||||
get_as_node<ItemList>("%element_list")
|
||||
->grab_click_focus();
|
||||
get_as_node<ItemList>("%element_list")->grab_focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::select_element_type(int element)
|
||||
{
|
||||
String item = get_as_node<ItemList>("%element_type_list")
|
||||
->get_item_text(element);
|
||||
print_line("item: " + item);
|
||||
current_element_type = item;
|
||||
get_as_node<ItemList>("%socket_list")->show();
|
||||
get_as_node<ItemList>("%socket_list")->select(0);
|
||||
// just in case
|
||||
select_socket(0);
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::select_socket(int socket)
|
||||
{
|
||||
current_socket = socket;
|
||||
String item =
|
||||
get_as_node<ItemList>("%socket_list")->get_item_text(socket);
|
||||
get_as_node<Control>("%socket_transform_editor")->show();
|
||||
print_line("socket: " + item);
|
||||
Vector3 f = element_type[current_element_type].sockets[socket].origin;
|
||||
f = Vector3(Math::stepify(f.x, 0.01f), Math::stepify(f.y, 0.01f),
|
||||
Math::stepify(f.z, 0.01f));
|
||||
get_as_node<LineEdit>("%socket_editor_offset_base/x_edit")
|
||||
->set_text(String::num(f.x));
|
||||
get_as_node<LineEdit>("%socket_editor_offset_base/y_edit")
|
||||
->set_text(String::num(f.y));
|
||||
get_as_node<LineEdit>("%socket_editor_offset_base/z_edit")
|
||||
->set_text(String::num(f.z));
|
||||
Vector3 r = element_type[current_element_type]
|
||||
.sockets[socket]
|
||||
.basis.get_rotation_euler() *
|
||||
180.0f / Math_PI;
|
||||
r = Vector3(Math::stepify(r.x, 0.01f), Math::stepify(r.y, 0.01f),
|
||||
Math::stepify(r.z, 0.01f));
|
||||
get_as_node<LineEdit>("%socket_editor_rotation_base/x_edit")
|
||||
->set_text(String::num(r.x));
|
||||
get_as_node<LineEdit>("%socket_editor_rotation_base/y_edit")
|
||||
->set_text(String::num(r.y));
|
||||
get_as_node<LineEdit>("%socket_editor_rotation_base/z_edit")
|
||||
->set_text(String::num(r.z));
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::set_socket_offset()
|
||||
{
|
||||
float x = get_as_node<LineEdit>("%socket_editor_offset_base/x_edit")
|
||||
->get_text()
|
||||
.to_float();
|
||||
x = Math::stepify(x, 0.01f);
|
||||
float y = get_as_node<LineEdit>("%socket_editor_offset_base/y_edit")
|
||||
->get_text()
|
||||
.to_float();
|
||||
y = Math::stepify(y, 0.01f);
|
||||
float z = get_as_node<LineEdit>("%socket_editor_offset_base/z_edit")
|
||||
->get_text()
|
||||
.to_float();
|
||||
z = Math::stepify(z, 0.01f);
|
||||
element_type[current_element_type].sockets[current_socket].origin =
|
||||
Vector3(x, y, z);
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::set_socket_rotation()
|
||||
{
|
||||
float x = Math::stepify(get_as_node<LineEdit>(
|
||||
"%socket_editor_rotation_base/x_edit")
|
||||
->get_text()
|
||||
.to_float(),
|
||||
0.01f) *
|
||||
Math_PI / 180.0f;
|
||||
float y = Math::stepify(get_as_node<LineEdit>(
|
||||
"%socket_editor_rotation_base/y_edit")
|
||||
->get_text()
|
||||
.to_float(),
|
||||
0.01f) *
|
||||
Math_PI / 180.0f;
|
||||
float z = Math::stepify(get_as_node<LineEdit>(
|
||||
"%socket_editor_rotation_base/z_edit")
|
||||
->get_text()
|
||||
.to_float(),
|
||||
0.01f) *
|
||||
Math_PI / 180.0f;
|
||||
Basis basis(Vector3(x, y, z));
|
||||
element_type[current_element_type].sockets[current_socket].basis =
|
||||
basis;
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::menu_control(int id)
|
||||
{
|
||||
print_line("menu_control: " + itos(id));
|
||||
switch (id) {
|
||||
case 100:
|
||||
save_data();
|
||||
break;
|
||||
case 200: // layout mode
|
||||
get_as_node<Control>("%socket_editor")->hide();
|
||||
select_mode(0);
|
||||
break;
|
||||
case 201: // element type editor
|
||||
get_as_node<Control>("%socket_editor")->show();
|
||||
select_mode(1);
|
||||
break;
|
||||
case 202: // element editor
|
||||
get_as_node<Control>("%socket_editor")->hide();
|
||||
select_mode(2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::select_element(int element)
|
||||
{
|
||||
int i, j;
|
||||
print_line("selected element: " + itos(element));
|
||||
String item =
|
||||
get_as_node<ItemList>("%element_list")->get_item_text(element);
|
||||
print_line("selected element: " + item);
|
||||
current_element = item;
|
||||
String type = elements[current_element].type;
|
||||
if (type.length() > 0) {
|
||||
OptionButton *b =
|
||||
get_as_node<OptionButton>("%element_type_select");
|
||||
for (i = 0; i < b->get_item_count(); i++) {
|
||||
if (b->get_item_text(i) == type) {
|
||||
b->select(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
OptionButton *b =
|
||||
get_as_node<OptionButton>("%element_type_select");
|
||||
elements[current_element].type = b->get_item_text(0);
|
||||
}
|
||||
int selected = 0;
|
||||
for (i = 0; i < used_socket_count; i++) {
|
||||
String selected_mesh = elements[current_element].mesh_names[i];
|
||||
selected = 0;
|
||||
for (j = 0; j < mesh_select_buttons[i]->get_item_count(); j++) {
|
||||
String mesh_item =
|
||||
mesh_select_buttons[i]->get_item_text(j);
|
||||
if (mesh_item == selected_mesh) {
|
||||
selected = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
print_line(itos(i) + ": selecting mesh: " + itos(selected));
|
||||
mesh_select_buttons[i]->select(selected);
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::mesh_selected(int mesh_idx, int socket)
|
||||
{
|
||||
OptionButton *ob = mesh_select_buttons[socket];
|
||||
String mesh_name =
|
||||
Object::cast_to<OptionButton>(ob)->get_item_text(mesh_idx);
|
||||
if (mesh_name.length() > 0) {
|
||||
elements[current_element].mesh_names[socket] = mesh_name;
|
||||
} else {
|
||||
elements[current_element].mesh_names[socket] = "";
|
||||
}
|
||||
}
|
||||
|
||||
void BuildingLayoutEditor::save_data()
|
||||
{
|
||||
print_line("save_data");
|
||||
}
|
||||
61
src/modules/stream/buildings/building_layout_editor.h
Normal file
61
src/modules/stream/buildings/building_layout_editor.h
Normal file
@@ -0,0 +1,61 @@
|
||||
#include <scene/main/node.h>
|
||||
#include <scene/resources/packed_scene.h>
|
||||
class Mesh;
|
||||
class OptionButton;
|
||||
class BuildingLayoutEditor : public Node {
|
||||
GDCLASS(BuildingLayoutEditor, Node);
|
||||
|
||||
Ref<PackedScene> source;
|
||||
struct mesh_data {
|
||||
Ref<Mesh> mesh;
|
||||
String mesh_name;
|
||||
String category;
|
||||
Ref<Texture> preview;
|
||||
};
|
||||
HashMap<String, struct mesh_data> meshes;
|
||||
HashMap<int, OptionButton *> mesh_select_buttons;
|
||||
int used_socket_count;
|
||||
#define ELEMENT_SOCKETS 16
|
||||
struct grid_element_type {
|
||||
String name;
|
||||
Transform sockets[ELEMENT_SOCKETS];
|
||||
};
|
||||
struct grid_element {
|
||||
String name;
|
||||
String type;
|
||||
String mesh_names[ELEMENT_SOCKETS];
|
||||
};
|
||||
HashMap<String, struct grid_element_type> element_type;
|
||||
HashMap<String, struct grid_element> elements;
|
||||
bool meshes_ready;
|
||||
int current_mode;
|
||||
String current_element_type;
|
||||
String current_element;
|
||||
int current_socket;
|
||||
|
||||
public:
|
||||
BuildingLayoutEditor();
|
||||
Vector<Ref<Texture> >
|
||||
make_mesh_previews(const Vector<Ref<Mesh> > &p_meshes,
|
||||
Vector<Transform> *p_transforms, int p_preview_size);
|
||||
void set_source(const Ref<PackedScene> &src);
|
||||
Ref<PackedScene> get_source() const;
|
||||
|
||||
protected:
|
||||
void _notification(int which);
|
||||
void prepare_meshes();
|
||||
void update_mesh_buttons();
|
||||
static void _bind_methods();
|
||||
void connect_signals();
|
||||
void select_mode(int mode);
|
||||
void enter_name(const String &text);
|
||||
void enter_element_name(const String &text);
|
||||
void select_element_type(int element);
|
||||
void select_socket(int socket);
|
||||
void set_socket_offset();
|
||||
void set_socket_rotation();
|
||||
void menu_control(int id);
|
||||
void select_element(int element);
|
||||
void mesh_selected(int mesh_idx, int socket);
|
||||
void save_data();
|
||||
};
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "world_editor.h"
|
||||
#include "nav_panel.h"
|
||||
#include "line_metadata_editor.h"
|
||||
#include "buildings/building_layout_editor.h"
|
||||
|
||||
void register_stream_types()
|
||||
{
|
||||
@@ -12,6 +13,7 @@ void register_stream_types()
|
||||
ClassDB::register_class<WorldEditor>();
|
||||
ClassDB::register_class<NavPanel>();
|
||||
ClassDB::register_class<LineMetadataEditor>();
|
||||
ClassDB::register_class<BuildingLayoutEditor>();
|
||||
}
|
||||
|
||||
void unregister_stream_types()
|
||||
|
||||
@@ -703,13 +703,6 @@ void RoadLinesData::update_road_lines_nodes(
|
||||
nidx) == ::lines[r].indices.end());
|
||||
::lines.insert_line_index(k, i + 1, nidx);
|
||||
::lines.insert_line_index(r, j + 1, nidx);
|
||||
#if 0
|
||||
// FIXME: WTF???
|
||||
::lines[k].indices.insert(
|
||||
::lines[k].indices.begin() + i + 1, nidx);
|
||||
::lines[r].indices.insert(
|
||||
::lines[k].indices.begin() + j + 1, nidx);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user