feat: implemented basic primitive tree display
This commit is contained in:
parent
2380819e43
commit
81a4f2c83c
4 changed files with 127 additions and 44 deletions
86
modules/terrain_editor/primitive_layer_list.cpp
Normal file
86
modules/terrain_editor/primitive_layer_list.cpp
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
#include "primitive_layer_list.h"
|
||||
#include "core/object/object.h"
|
||||
#include "scene/gui/tree.h"
|
||||
#include "terrain_editor/macros.h"
|
||||
#include "terrain_editor/terrain_primitive.h"
|
||||
|
||||
void PrimitiveLayerList::_bind_methods() {
|
||||
BIND_HPROPERTY(Variant::OBJECT, terrain, PROPERTY_HINT_NODE_TYPE, "TerrainMeshGenerator");
|
||||
}
|
||||
|
||||
void PrimitiveLayerList::generate_subtree(size_t idx, Ref<TerrainPrimitive> prim, TreeItem *parent) {
|
||||
TreeItem *base{ create_item(get_root()) };
|
||||
base->set_text(0, vformat("%d", idx));
|
||||
base->set_expand_right(0, false);
|
||||
base->set_editable(0, true);
|
||||
base->set_text(1, prim->get_name().is_empty() ? prim->get_class() : prim->get_name());
|
||||
base->set_editable(1, true);
|
||||
base->set_expand_right(1, true);
|
||||
this->subtrees.insert(prim, base);
|
||||
}
|
||||
|
||||
void PrimitiveLayerList::regenerate_tree(Array array) {
|
||||
get_root()->clear_children();
|
||||
this->subtrees.clear();
|
||||
size_t i{ 0 };
|
||||
for (Variant var : array) {
|
||||
Ref<TerrainPrimitive> prim{ var };
|
||||
if (prim.is_valid()) {
|
||||
generate_subtree(i, prim, get_root());
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PrimitiveLayerList::switch_index(size_t from, size_t to) {
|
||||
Array primitives = this->terrain->get_primitives();
|
||||
Ref<TerrainPrimitive> primitive{ primitives.get(from) };
|
||||
primitives.remove_at(from);
|
||||
if (primitives.size() <= to) {
|
||||
primitives.push_back(primitive);
|
||||
} else {
|
||||
primitives.insert(to, primitive);
|
||||
}
|
||||
|
||||
this->terrain->set_primitives(primitives);
|
||||
}
|
||||
|
||||
void PrimitiveLayerList::item_edited() {
|
||||
TreeItem *edited{ get_edited() };
|
||||
switch (get_edited_column()) {
|
||||
default:
|
||||
return;
|
||||
case 0: // index
|
||||
switch_index(edited->get_index(), edited->get_text(0).to_int());
|
||||
return;
|
||||
case 1: // name
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void PrimitiveLayerList::_notification(int what) {
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
switch (what) {
|
||||
default:
|
||||
return;
|
||||
case NOTIFICATION_READY:
|
||||
connect("item_edited", callable_mp(this, &self_type::item_edited));
|
||||
create_item();
|
||||
set_hide_root(true);
|
||||
if (this->terrain) {
|
||||
this->terrain->connect(TerrainMeshGenerator::sig_primitive_list_changed, callable_mp(this, &self_type::regenerate_tree));
|
||||
regenerate_tree(this->terrain->get_primitives());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void PrimitiveLayerList::set_terrain(TerrainMeshGenerator *terrain) {
|
||||
this->terrain = terrain;
|
||||
}
|
||||
|
||||
TerrainMeshGenerator *PrimitiveLayerList::get_terrain() const {
|
||||
return this->terrain;
|
||||
}
|
||||
26
modules/terrain_editor/primitive_layer_list.h
Normal file
26
modules/terrain_editor/primitive_layer_list.h
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
#pragma once
|
||||
|
||||
#include "core/templates/hash_map.h"
|
||||
#include "scene/gui/tree.h"
|
||||
#include "terrain_editor/terrain_mesh_generator.h"
|
||||
#include "terrain_editor/terrain_primitive.h"
|
||||
|
||||
class PrimitiveLayerList : public Tree {
|
||||
GDCLASS(PrimitiveLayerList, Tree);
|
||||
static void _bind_methods();
|
||||
void generate_subtree(size_t idx, Ref<TerrainPrimitive> prim, TreeItem *parent);
|
||||
void regenerate_tree(Array array);
|
||||
void switch_index(size_t from, size_t to);
|
||||
void item_edited();
|
||||
|
||||
protected:
|
||||
void _notification(int what);
|
||||
|
||||
public:
|
||||
void set_terrain(TerrainMeshGenerator *generator);
|
||||
TerrainMeshGenerator *get_terrain() const;
|
||||
|
||||
private:
|
||||
TerrainMeshGenerator *terrain{};
|
||||
HashMap<Ref<TerrainPrimitive>, TreeItem *> subtrees{};
|
||||
};
|
||||
|
|
@ -5,6 +5,7 @@
|
|||
#include "scene/main/scene_tree.h"
|
||||
#include "terrain_editor/edit_history.h"
|
||||
#include "terrain_editor/point_primitive_node.h"
|
||||
#include "terrain_editor/primitive_layer_list.h"
|
||||
#include "terrain_editor/terrain_chunk.h"
|
||||
#include "terrain_editor/terrain_mesh_editor.h"
|
||||
#include "terrain_editor/terrain_mesh_generator.h"
|
||||
|
|
@ -26,6 +27,7 @@ void initialize_terrain_editor_module(ModuleInitializationLevel p_level) {
|
|||
ClassDB::register_class<TerrainChunk>();
|
||||
ClassDB::register_class<EditHistory>();
|
||||
Engine::get_singleton()->add_singleton(Engine::Singleton("EditHistory", (EditHistory::singleton_instance = memnew(EditHistory)), "EditHistory"));
|
||||
ClassDB::register_class<PrimitiveLayerList>();
|
||||
}
|
||||
|
||||
void uninitialize_terrain_editor_module(ModuleInitializationLevel p_level) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue