mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-02-14 11:50:09 +01:00
Initial input handling refactor for TerrainWorldEditor.
This commit is contained in:
parent
45e5c77395
commit
4201113680
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
#include "terrain_world_editor.h"
|
#include "terrain_world_editor.h"
|
||||||
|
|
||||||
|
#include "editor/editor_plugin.h"
|
||||||
#include "editor/editor_scale.h"
|
#include "editor/editor_scale.h"
|
||||||
#include "editor/editor_settings.h"
|
#include "editor/editor_settings.h"
|
||||||
|
|
||||||
@ -67,32 +68,51 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::forward_spatial_input_event(Came
|
|||||||
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<TerrainLibrary> lib = _world->get_library();
|
||||||
|
|
||||||
|
if (!lib.is_valid()) {
|
||||||
|
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
||||||
|
}
|
||||||
|
|
||||||
Ref<InputEventMouseButton> mb = p_event;
|
Ref<InputEventMouseButton> mb = p_event;
|
||||||
|
|
||||||
if (mb.is_valid()) {
|
if (mb.is_valid()) {
|
||||||
if (mb->is_pressed()) {
|
if (mb->is_pressed()) {
|
||||||
Ref<TerrainLibrary> lib = _world->get_library();
|
|
||||||
|
|
||||||
if (!lib.is_valid())
|
|
||||||
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
|
||||||
|
|
||||||
if (mb->get_button_index() == BUTTON_LEFT) {
|
if (mb->get_button_index() == BUTTON_LEFT) {
|
||||||
return do_input_action(p_camera, Point2(mb->get_position().x, mb->get_position().y), true);
|
_mouse_down = true;
|
||||||
|
|
||||||
|
switch (_tool_mode) {
|
||||||
|
case TOOL_MODE_ADD:
|
||||||
|
case TOOL_MODE_REMOVE:
|
||||||
|
return do_add_remove_action(p_camera, Point2(mb->get_position().x, mb->get_position().y), true);
|
||||||
|
case TOOL_MODE_ISOLEVEL_BRUSH:
|
||||||
|
break;
|
||||||
|
case TOOL_MODE_PAINT_BRUSH:
|
||||||
|
break;
|
||||||
|
case TOOL_MODE_PAINT_PICKER:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EditorPlugin::AFTER_GUI_INPUT_STOP;
|
||||||
} else {
|
} else {
|
||||||
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
//return do_input_action(p_camera, Point2(mb->get_position().x, mb->get_position().y), true);
|
if (mb->get_button_index() == BUTTON_LEFT) {
|
||||||
|
_mouse_down = false;
|
||||||
|
return EditorPlugin::AFTER_GUI_INPUT_STOP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_mouse_down) {
|
||||||
|
return EditorPlugin::AFTER_GUI_INPUT_STOP;
|
||||||
|
}
|
||||||
|
|
||||||
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EditorPlugin::AfterGUIInput TerrainWorldEditor::do_input_action(Camera *p_camera, const Point2 &p_point, bool p_click) {
|
EditorPlugin::AfterGUIInput TerrainWorldEditor::do_add_remove_action(Camera *p_camera, const Point2 &p_point, bool p_click) {
|
||||||
if (!spatial_editor || !_world || !_world->is_inside_world())
|
|
||||||
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
|
||||||
|
|
||||||
Camera *camera = p_camera;
|
Camera *camera = p_camera;
|
||||||
Vector3 from = camera->project_ray_origin(p_point);
|
Vector3 from = camera->project_ray_origin(p_point);
|
||||||
Vector3 to = from + camera->project_ray_normal(p_point) * 10000;
|
Vector3 to = from + camera->project_ray_normal(p_point) * 10000;
|
||||||
@ -111,8 +131,9 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::do_input_action(Camera *p_camera
|
|||||||
|
|
||||||
channel = _channel_type;
|
channel = _channel_type;
|
||||||
|
|
||||||
if (channel == -1)
|
if (channel == -1) {
|
||||||
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
return EditorPlugin::AFTER_GUI_INPUT_PASS;
|
||||||
|
}
|
||||||
|
|
||||||
int isolevel = _add_remove_current_isolevel;
|
int isolevel = _add_remove_current_isolevel;
|
||||||
bool mode_add = false;
|
bool mode_add = false;
|
||||||
@ -120,13 +141,40 @@ EditorPlugin::AfterGUIInput TerrainWorldEditor::do_input_action(Camera *p_camera
|
|||||||
if (_tool_mode == TOOL_MODE_ADD) {
|
if (_tool_mode == TOOL_MODE_ADD) {
|
||||||
selected_terrain = _selected_type + 1;
|
selected_terrain = _selected_type + 1;
|
||||||
mode_add = true;
|
mode_add = true;
|
||||||
|
_undo_redo->create_action("Add terrain voxel.");
|
||||||
} else if (_tool_mode == TOOL_MODE_REMOVE) {
|
} else if (_tool_mode == TOOL_MODE_REMOVE) {
|
||||||
selected_terrain = 0;
|
selected_terrain = 0;
|
||||||
isolevel = 0;
|
isolevel = 0;
|
||||||
mode_add = false;
|
mode_add = false;
|
||||||
|
_undo_redo->create_action("Remove terrain voxel.");
|
||||||
}
|
}
|
||||||
|
|
||||||
_world->set_voxel_with_tool(mode_add, res.position, res.normal, selected_terrain, isolevel);
|
Vector3 pos;
|
||||||
|
|
||||||
|
if (mode_add) {
|
||||||
|
pos = (res.position + (Vector3(0.1, 0.1, 0.1) * res.normal * _world->get_voxel_scale()));
|
||||||
|
} else {
|
||||||
|
pos = (res.position + (Vector3(0.1, 0.1, 0.1) * -res.normal * _world->get_voxel_scale()));
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t prev_terrain = _world->get_voxel_at_world_position(pos, _channel_type);
|
||||||
|
uint8_t prev_isolevel = 0;
|
||||||
|
|
||||||
|
if (_channel_isolevel != -1) {
|
||||||
|
prev_isolevel = _world->get_voxel_at_world_position(pos, _channel_isolevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_channel_isolevel == -1) {
|
||||||
|
_undo_redo->add_do_method(_world, "set_voxel_at_world_position", pos, selected_terrain, _channel_type);
|
||||||
|
_undo_redo->add_undo_method(_world, "set_voxel_at_world_position", pos, prev_terrain, _channel_type);
|
||||||
|
} else {
|
||||||
|
_undo_redo->add_do_method(_world, "set_voxel_at_world_position", pos, selected_terrain, _channel_type, false);
|
||||||
|
_undo_redo->add_do_method(_world, "set_voxel_at_world_position", pos, isolevel, _channel_isolevel);
|
||||||
|
_undo_redo->add_undo_method(_world, "set_voxel_at_world_position", pos, prev_terrain, _channel_type, false);
|
||||||
|
_undo_redo->add_undo_method(_world, "set_voxel_at_world_position", pos, prev_isolevel, _channel_isolevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
_undo_redo->commit_action();
|
||||||
|
|
||||||
return EditorPlugin::AFTER_GUI_INPUT_STOP;
|
return EditorPlugin::AFTER_GUI_INPUT_STOP;
|
||||||
}
|
}
|
||||||
@ -209,6 +257,7 @@ void TerrainWorldEditor::edit(TerrainWorld *p_world) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TerrainWorldEditor::TerrainWorldEditor() {
|
TerrainWorldEditor::TerrainWorldEditor() {
|
||||||
|
_undo_redo = NULL;
|
||||||
_world = NULL;
|
_world = NULL;
|
||||||
_selected_type = 0;
|
_selected_type = 0;
|
||||||
_channel_type = -1;
|
_channel_type = -1;
|
||||||
@ -217,6 +266,8 @@ TerrainWorldEditor::TerrainWorldEditor() {
|
|||||||
_editor = NULL;
|
_editor = NULL;
|
||||||
_tool_mode = TOOL_MODE_ADD;
|
_tool_mode = TOOL_MODE_ADD;
|
||||||
|
|
||||||
|
_mouse_down = false;
|
||||||
|
|
||||||
_isolevel_picker_mode = false;
|
_isolevel_picker_mode = false;
|
||||||
|
|
||||||
_isolevel_brush_channel = -1;
|
_isolevel_brush_channel = -1;
|
||||||
@ -227,12 +278,16 @@ TerrainWorldEditor::TerrainWorldEditor() {
|
|||||||
_isolevel_brush_type = ISOLEVEL_BRUSH_TYPE_ADD;
|
_isolevel_brush_type = ISOLEVEL_BRUSH_TYPE_ADD;
|
||||||
}
|
}
|
||||||
TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
|
TerrainWorldEditor::TerrainWorldEditor(EditorNode *p_editor) {
|
||||||
|
_undo_redo = EditorNode::get_undo_redo();
|
||||||
|
|
||||||
_world = NULL;
|
_world = NULL;
|
||||||
_selected_type = 0;
|
_selected_type = 0;
|
||||||
_channel_type = -1;
|
_channel_type = -1;
|
||||||
_add_remove_current_isolevel = 255;
|
_add_remove_current_isolevel = 255;
|
||||||
_channel_isolevel = -1;
|
_channel_isolevel = -1;
|
||||||
|
|
||||||
|
_mouse_down = false;
|
||||||
|
|
||||||
_isolevel_picker_mode = false;
|
_isolevel_picker_mode = false;
|
||||||
|
|
||||||
_isolevel_brush_channel = -1;
|
_isolevel_brush_channel = -1;
|
||||||
@ -524,12 +579,26 @@ void TerrainWorldEditor::_on_insert_block_at_camera_button_pressed() {
|
|||||||
Vector3 pos = cam->get_transform().origin;
|
Vector3 pos = cam->get_transform().origin;
|
||||||
selected_terrain = _selected_type + 1;
|
selected_terrain = _selected_type + 1;
|
||||||
|
|
||||||
if (_channel_isolevel == -1) {
|
_undo_redo->create_action("Insert terrain voxel at camera.");
|
||||||
_world->set_voxel_at_world_position(pos, selected_terrain, channel);
|
|
||||||
} else {
|
uint8_t prev_terrain = _world->get_voxel_at_world_position(pos, _channel_type);
|
||||||
_world->set_voxel_at_world_position(pos, selected_terrain, channel, false);
|
uint8_t prev_isolevel = 0;
|
||||||
_world->set_voxel_at_world_position(pos, _add_remove_current_isolevel, _channel_isolevel);
|
|
||||||
|
if (_channel_isolevel != -1) {
|
||||||
|
prev_isolevel = _world->get_voxel_at_world_position(pos, _channel_isolevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_channel_isolevel == -1) {
|
||||||
|
_undo_redo->add_do_method(_world, "set_voxel_at_world_position", pos, selected_terrain, channel);
|
||||||
|
_undo_redo->add_undo_method(_world, "set_voxel_at_world_position", pos, prev_terrain, channel);
|
||||||
|
} else {
|
||||||
|
_undo_redo->add_do_method(_world, "set_voxel_at_world_position", pos, selected_terrain, channel, false);
|
||||||
|
_undo_redo->add_do_method(_world, "set_voxel_at_world_position", pos, _add_remove_current_isolevel, _channel_isolevel);
|
||||||
|
_undo_redo->add_undo_method(_world, "set_voxel_at_world_position", pos, prev_terrain, channel, false);
|
||||||
|
_undo_redo->add_undo_method(_world, "set_voxel_at_world_position", pos, prev_isolevel, _channel_isolevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
_undo_redo->commit_action();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TerrainWorldEditor::_on_add_remove_isolevel_slider_value_changed(float value) {
|
void TerrainWorldEditor::_on_add_remove_isolevel_slider_value_changed(float value) {
|
||||||
|
@ -62,7 +62,7 @@ public:
|
|||||||
EditorPlugin::AfterGUIInput forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event);
|
EditorPlugin::AfterGUIInput forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event);
|
||||||
|
|
||||||
void edit(TerrainWorld *p_world);
|
void edit(TerrainWorld *p_world);
|
||||||
EditorPlugin::AfterGUIInput do_input_action(Camera *p_camera, const Point2 &p_point, bool p_click);
|
EditorPlugin::AfterGUIInput do_add_remove_action(Camera *p_camera, const Point2 &p_point, bool p_click);
|
||||||
|
|
||||||
TerrainWorldEditor();
|
TerrainWorldEditor();
|
||||||
TerrainWorldEditor(EditorNode *p_editor);
|
TerrainWorldEditor(EditorNode *p_editor);
|
||||||
@ -82,6 +82,10 @@ protected:
|
|||||||
void _on_isolevel_brush_smoothness_slider_changed(float value);
|
void _on_isolevel_brush_smoothness_slider_changed(float value);
|
||||||
void _on_isolevel_brush_channel_select_sb_changed(int value);
|
void _on_isolevel_brush_channel_select_sb_changed(int value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
UndoRedo *_undo_redo;
|
||||||
|
bool _mouse_down;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//enum BrushType {
|
//enum BrushType {
|
||||||
// BRUSH_TYPE_CIRCLE = 0,
|
// BRUSH_TYPE_CIRCLE = 0,
|
||||||
|
Loading…
Reference in New Issue
Block a user