mirror of
https://github.com/Relintai/voxelman.git
synced 2025-01-12 15:01:09 +01:00
Initial implementation for the voxel world editor.
This commit is contained in:
parent
37517c2e18
commit
98707674a4
@ -32,16 +32,109 @@ SOFTWARE.
|
|||||||
#include "core/math/geometry.h"
|
#include "core/math/geometry.h"
|
||||||
#include "core/os/keyboard.h"
|
#include "core/os/keyboard.h"
|
||||||
|
|
||||||
|
#include "voxel_chunk.h"
|
||||||
|
|
||||||
bool VoxelWorldEditor::forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event) {
|
bool VoxelWorldEditor::forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event) {
|
||||||
|
if (!_world && !_world->get_editable()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<InputEventMouseButton> mb = p_event;
|
||||||
|
|
||||||
|
if (mb.is_valid()) {
|
||||||
|
|
||||||
|
if (mb->is_pressed()) {
|
||||||
|
Ref<VoxelmanLibrary> lib = _world->get_library();
|
||||||
|
|
||||||
|
if (!lib.is_valid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (mb->get_button_index() == BUTTON_LEFT) {
|
||||||
|
return do_input_action(p_camera, Point2(mb->get_position().x, mb->get_position().y), true, _seletced_type);
|
||||||
|
} else if (mb->get_button_index() == BUTTON_RIGHT) {
|
||||||
|
return do_input_action(p_camera, Point2(mb->get_position().x, mb->get_position().y), true, 0);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//return do_input_action(p_camera, Point2(mb->get_position().x, mb->get_position().y), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VoxelWorldEditor::do_input_action(Camera *p_camera, const Point2 &p_point, bool p_click, int selected_voxel) {
|
||||||
|
|
||||||
|
if (!spatial_editor)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Camera *camera = p_camera;
|
||||||
|
Vector3 from = camera->project_ray_origin(p_point);
|
||||||
|
Vector3 to = from + camera->project_ray_normal(p_point) * 10000;
|
||||||
|
Transform local_xform = _world->get_global_transform().affine_inverse();
|
||||||
|
|
||||||
|
from = local_xform.xform(from);
|
||||||
|
to = local_xform.xform(to);
|
||||||
|
|
||||||
|
PhysicsDirectSpaceState *ss = _world->get_world()->get_direct_space_state();
|
||||||
|
PhysicsDirectSpaceState::RayResult res;
|
||||||
|
|
||||||
|
if (ss->intersect_ray(from, to, res)) {
|
||||||
|
Vector3 pos = res.position;
|
||||||
|
|
||||||
|
//_world->set_voxel(pos, data[]);
|
||||||
|
//Ref<VoxelChunk> chunk = _world->get_or_spawn_chunk_at_world_pos(pos);
|
||||||
|
|
||||||
|
int x = (pos.x - _world->get_chunk_size_x()) / _world->get_chunk_size_x() / _world->get_voxel_scale();
|
||||||
|
int y = (pos.y - _world->get_chunk_size_y()) / _world->get_chunk_size_y() / _world->get_voxel_scale();
|
||||||
|
int z = (pos.z - _world->get_chunk_size_z()) / _world->get_chunk_size_z() / _world->get_voxel_scale();
|
||||||
|
|
||||||
|
Ref<VoxelChunk> chunk = _world->get_chunk(x, y, z);
|
||||||
|
|
||||||
|
if (!chunk.is_valid()) {
|
||||||
|
chunk = _world->create_chunk(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
int bx = static_cast<int>((pos.x - _world->get_chunk_size_x()) / _world->get_voxel_scale()) % _world->get_chunk_size_x();
|
||||||
|
int by = static_cast<int>((pos.y - _world->get_chunk_size_y()) / _world->get_voxel_scale()) % _world->get_chunk_size_y();
|
||||||
|
int bz = static_cast<int>((pos.z - _world->get_chunk_size_z()) / _world->get_voxel_scale()) % _world->get_chunk_size_z();
|
||||||
|
|
||||||
|
if (bx < 0)
|
||||||
|
bx += _world->get_chunk_size_x();
|
||||||
|
|
||||||
|
if (by < 0)
|
||||||
|
by += _world->get_chunk_size_y();
|
||||||
|
|
||||||
|
if (bz < 0)
|
||||||
|
bz += _world->get_chunk_size_z();
|
||||||
|
|
||||||
|
chunk->set_voxel(selected_voxel, bx, by, bz, 0);
|
||||||
|
|
||||||
|
chunk->build();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VoxelWorldEditor::edit(VoxelWorld *p_world) {
|
void VoxelWorldEditor::edit(VoxelWorld *p_world) {
|
||||||
|
_world = p_world;
|
||||||
|
|
||||||
|
spatial_editor = Object::cast_to<SpatialEditorPlugin>(_editor->get_editor_plugin_screen());
|
||||||
}
|
}
|
||||||
|
|
||||||
VoxelWorldEditor::VoxelWorldEditor() {
|
VoxelWorldEditor::VoxelWorldEditor() {
|
||||||
|
_world = NULL;
|
||||||
|
_seletced_type = 1;
|
||||||
|
_editor = NULL;
|
||||||
}
|
}
|
||||||
VoxelWorldEditor::VoxelWorldEditor(EditorNode *p_editor) {
|
VoxelWorldEditor::VoxelWorldEditor(EditorNode *p_editor) {
|
||||||
|
_world = NULL;
|
||||||
|
_seletced_type = 1;
|
||||||
|
_editor = p_editor;
|
||||||
|
|
||||||
spatial_editor_hb = memnew(HBoxContainer);
|
spatial_editor_hb = memnew(HBoxContainer);
|
||||||
spatial_editor_hb->set_h_size_flags(SIZE_EXPAND_FILL);
|
spatial_editor_hb->set_h_size_flags(SIZE_EXPAND_FILL);
|
||||||
spatial_editor_hb->set_alignment(BoxContainer::ALIGN_END);
|
spatial_editor_hb->set_alignment(BoxContainer::ALIGN_END);
|
||||||
|
@ -36,6 +36,7 @@ public:
|
|||||||
bool forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event);
|
bool forward_spatial_input_event(Camera *p_camera, const Ref<InputEvent> &p_event);
|
||||||
|
|
||||||
void edit(VoxelWorld *p_world);
|
void edit(VoxelWorld *p_world);
|
||||||
|
bool do_input_action(Camera *p_camera, const Point2 &p_point, bool p_click, int selected_voxel);
|
||||||
|
|
||||||
VoxelWorldEditor();
|
VoxelWorldEditor();
|
||||||
VoxelWorldEditor(EditorNode *p_editor);
|
VoxelWorldEditor(EditorNode *p_editor);
|
||||||
@ -49,6 +50,9 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
VoxelWorld *_world;
|
VoxelWorld *_world;
|
||||||
|
int _seletced_type;
|
||||||
|
SpatialEditorPlugin *spatial_editor;
|
||||||
|
EditorNode *_editor;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VoxelWorldEditorPlugin : public EditorPlugin {
|
class VoxelWorldEditorPlugin : public EditorPlugin {
|
||||||
|
Loading…
Reference in New Issue
Block a user