feat: implemented adding primitive with UI

This commit is contained in:
Sara Gerretsen 2025-12-08 15:33:02 +01:00
parent 670cfa1779
commit b6e8ca9225
8 changed files with 120 additions and 31 deletions

View file

@ -0,0 +1,31 @@
#include "add_primitive_button.h"
#include "terrain_editor/edit_history.h"
#include "terrain_editor/terrain_mesh_generator.h"
void AddPrimitiveButton::_bind_methods() {
BIND_HPROPERTY(Variant::OBJECT, primitive_blueprint, PROPERTY_HINT_RESOURCE_TYPE, "TerrainPrimitive");
BIND_HPROPERTY(Variant::OBJECT, terrain, PROPERTY_HINT_NODE_TYPE, "TerrainMeshGenerator");
}
void AddPrimitiveButton::pressed() {
if (this->terrain) {
Ref<TerrainPrimitive> copy{ this->primitive_blueprint->duplicate(true) };
EditHistory::get_singleton()->push_action(callable_mp(this->terrain, &TerrainMeshGenerator::add_primitive).bind(copy), callable_mp(this->terrain, &TerrainMeshGenerator::remove_primitive).bind(copy));
}
}
void AddPrimitiveButton::set_primitive_blueprint(Ref<TerrainPrimitive> blueprint) {
this->primitive_blueprint = blueprint;
}
Ref<TerrainPrimitive> AddPrimitiveButton::get_primitive_blueprint() const {
return this->primitive_blueprint;
}
void AddPrimitiveButton::set_terrain(TerrainMeshGenerator *terrain) {
this->terrain = terrain;
}
TerrainMeshGenerator *AddPrimitiveButton::get_terrain() const {
return this->terrain;
}

View file

@ -0,0 +1,21 @@
#pragma once
#include "scene/gui/button.h"
#include "terrain_editor/terrain_mesh_generator.h"
#include "terrain_editor/terrain_primitive.h"
class AddPrimitiveButton : public Button {
GDCLASS(AddPrimitiveButton, Button);
static void _bind_methods();
void pressed() override;
public:
void set_primitive_blueprint(Ref<TerrainPrimitive> primitive);
Ref<TerrainPrimitive> get_primitive_blueprint() const;
void set_terrain(TerrainMeshGenerator *terrain);
TerrainMeshGenerator *get_terrain() const;
private:
Ref<TerrainPrimitive> primitive_blueprint{};
TerrainMeshGenerator *terrain{ nullptr };
};

View file

@ -2,7 +2,7 @@
#include "core/config/engine.h"
#include "core/object/class_db.h"
#include "scene/main/scene_tree.h"
#include "terrain_editor/add_primitive_button.h"
#include "terrain_editor/edit_history.h"
#include "terrain_editor/point_primitive_node.h"
#include "terrain_editor/primitive_layer_list.h"
@ -28,6 +28,7 @@ void initialize_terrain_editor_module(ModuleInitializationLevel p_level) {
ClassDB::register_class<EditHistory>();
Engine::get_singleton()->add_singleton(Engine::Singleton("EditHistory", (EditHistory::singleton_instance = memnew(EditHistory)), "EditHistory"));
ClassDB::register_class<PrimitiveLayerList>();
ClassDB::register_class<AddPrimitiveButton>();
}
void uninitialize_terrain_editor_module(ModuleInitializationLevel p_level) {

View file

@ -258,6 +258,21 @@ void TerrainMeshGenerator::push_task(Rect2 area, Ref<ArrayMesh> mesh, size_t poi
this->input_lock.unlock();
}
void TerrainMeshGenerator::add_primitive(Ref<TerrainPrimitive> primitive) {
Array list = get_primitives();
list.push_front(primitive);
set_primitives(list);
}
void TerrainMeshGenerator::remove_primitive(Ref<TerrainPrimitive> primitive) {
Array list = get_primitives();
int idx{ list.find(primitive) };
if (idx >= 0 && idx < list.size()) {
list.remove_at(idx);
}
set_primitives(list);
}
void TerrainMeshGenerator::set_primitives(Array primitives) {
// synchronise primitives
for (Variant var : this->primitives_buffer) {

View file

@ -37,6 +37,8 @@ protected:
public:
void push_task(Rect2 area, Ref<ArrayMesh> mesh, size_t side_points, Callable callback = Callable());
void add_primitive(Ref<TerrainPrimitive> primitive);
void remove_primitive(Ref<TerrainPrimitive> primitive);
void set_primitives(Array array);
Array get_primitives() const;
void set_vertex_color_gradient(Ref<Gradient> gradient);