Building editing update

This commit is contained in:
2024-08-25 02:00:01 +03:00
parent 0daf02795e
commit 7486334c04
3 changed files with 243 additions and 173 deletions

View File

@@ -56,8 +56,85 @@ func editor_event(evname: String, args: Array):
$"%building_type".clear() $"%building_type".clear()
for k in btypes.keys(): for k in btypes.keys():
$"%building_type".add_item(k) $"%building_type".add_item(k)
elif evname == "editor_camera_moved":
$Area.global_transform.origin.x = $Camera.global_transform.origin.x
$Area.global_transform.origin.z = $Camera.global_transform.origin.z
# elif evname == "edit_update_building":
# check_edit_building()
elif evname == "mouse_press":
mouse_press(args[0])
elif evname == "mouse_drag":
mouse_drag(args[0])
elif evname == "mouse_drag_on":
pass
elif evname == "mouse_drag_off":
pass
else: else:
breakpoint breakpoint
func mouse_drag(position):
if $WorldEditor.get_current_mode() != 2:
return
if $WorldEditor.get_camera_mode() != 3:
return
# breakpoint
var camera = get_viewport().get_camera()
var start = camera.project_ray_origin(position)
var normal = camera.project_ray_normal(position)
var end = start + normal * camera.get_zfar()
var space_state = get_world().direct_space_state
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
if result.has("collider"):
var proj = result.position
var mode = $"%buildings_edit_mode".selected
if mode == 1:
# move
print(proj)
var newpos = proj
newpos.x = stepify(newpos.x, 2.0)
newpos.z = stepify(newpos.z, 2.0)
var gen: VoxelGeneratorImgMapper = $VoxelLodTerrain.generator
var hpos = gen.get_height_full(newpos)
newpos.y = hpos
$WorldEditor.editor_command("update_building_transform", [selected_building, Transform(selected_building_xform.basis, newpos)])
selected_building_xform = Transform(selected_building_xform.basis, newpos)
$building_cursor.global_transform.origin = newpos
elif mode == 2:
# rotate
var m = proj
m.y = selected_building_xform.origin.y
var xform = selected_building_xform.looking_at(m, Vector3.UP)
$WorldEditor.editor_command("update_building_transform", [selected_building, xform])
$building_rot_cursor.global_transform = xform
selected_building_xform = xform
func mouse_press(position):
if $WorldEditor.get_current_mode() != 2:
return
if $WorldEditor.get_camera_mode() != 3:
return
# breakpoint
# dragging = true
var camera = get_viewport().get_camera()
var start = camera.project_ray_origin(position)
var normal = camera.project_ray_normal(position)
var end = start + normal * camera.get_zfar()
var space_state = get_world().direct_space_state
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
if result.has("collider"):
var proj = result.position
drag_start = proj
var mode = $"%buildings_edit_mode".selected
if mode == 0:
print("get closest building")
$WorldEditor.editor_command("get_closest_building", [Transform(Basis(), proj)])
elif mode == 2:
var m = proj
m.y = selected_building_xform.origin.y
var xform = selected_building_xform.looking_at(m, Vector3.UP)
$WorldEditor.editor_command("update_building_transform", [selected_building, xform])
$building_rot_cursor.global_transform = xform
selected_building_xform = xform
$WorldEditor.editor_command("buildings_checkpoint", [])
var selected_building var selected_building
var selected_building_xform var selected_building_xform
func select_building(xform, id, mid): func select_building(xform, id, mid):
@@ -73,12 +150,12 @@ func select_building(xform, id, mid):
$building_cursor.show() $building_cursor.show()
$building_cursor.global_transform.origin = xform.origin $building_cursor.global_transform.origin = xform.origin
func _process(delta): func _process(delta):
if Input.is_action_just_pressed("editor_cam1"): # if Input.is_action_just_pressed("editor_cam1"):
setup_cam1() # setup_cam1()
if Input.is_action_just_pressed("editor_cam2"): # if Input.is_action_just_pressed("editor_cam2"):
setup_cam2() # setup_cam2()
if Input.is_action_just_pressed("editor_cam3"): # if Input.is_action_just_pressed("editor_cam3"):
setup_cam3() # setup_cam3()
var mode = $"%buildings_edit_mode".selected var mode = $"%buildings_edit_mode".selected
if mode == 2: if mode == 2:
$building_rot_cursor.global_transform = selected_building_xform $building_rot_cursor.global_transform = selected_building_xform
@@ -87,176 +164,96 @@ func _process(delta):
else: else:
if $building_rot_cursor.visible: if $building_rot_cursor.visible:
$building_rot_cursor.hide() $building_rot_cursor.hide()
if dragging: # if dragging:
if !Input.is_action_pressed("mouse1"): # if !Input.is_action_pressed("mouse1"):
dragging = false # dragging = false
drag_delay = 0.2 # drag_delay = 0.2
else: # else:
var position = get_viewport().get_mouse_position() # var position = get_viewport().get_mouse_position()
var camera = get_viewport().get_camera() # var camera = get_viewport().get_camera()
var start = camera.project_ray_origin(position) # var start = camera.project_ray_origin(position)
var normal = camera.project_ray_normal(position) # var normal = camera.project_ray_normal(position)
var end = start + normal * camera.get_zfar() # var end = start + normal * camera.get_zfar()
var space_state = get_world().direct_space_state # var space_state = get_world().direct_space_state
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true) # var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
if result.has("collider"): # if result.has("collider"):
var proj = result.position # var proj = result.position
if mode == 1: # if mode == 1:
# move # # move
print(proj) # print(proj)
var newpos = proj # var newpos = proj
newpos.x = stepify(newpos.x, 2.0) # newpos.x = stepify(newpos.x, 2.0)
newpos.z = stepify(newpos.z, 2.0) # newpos.z = stepify(newpos.z, 2.0)
var gen: VoxelGeneratorImgMapper = $VoxelLodTerrain.generator # var gen: VoxelGeneratorImgMapper = $VoxelLodTerrain.generator
var hpos = gen.get_height_full(newpos) # var hpos = gen.get_height_full(newpos)
newpos.y = hpos # newpos.y = hpos
$WorldEditor.editor_command("update_building_transform", [selected_building, Transform(selected_building_xform.basis, newpos)]) # $WorldEditor.editor_command("update_building_transform", [selected_building, Transform(selected_building_xform.basis, newpos)])
selected_building_xform = Transform(selected_building_xform.basis, newpos) # selected_building_xform = Transform(selected_building_xform.basis, newpos)
$building_cursor.global_transform.origin = newpos # $building_cursor.global_transform.origin = newpos
elif mode == 2: # elif mode == 2:
# rotate # # rotate
var m = proj
m.y = selected_building_xform.origin.y
var xform = selected_building_xform.looking_at(m, Vector3.UP)
$WorldEditor.editor_command("update_building_transform", [selected_building, xform])
$building_rot_cursor.global_transform = xform
selected_building_xform = xform
# var o = selected_building_xform.origin
# var m = proj # var m = proj
# o.y = 0 # m.y = selected_building_xform.origin.y
# m.y = 0 # var xform = selected_building_xform.looking_at(m, Vector3.UP)
# var d = m - o
# var rot: float = -0.01 * d.x * delta
# var basis: Basis = selected_building_xform.basis
# var pos: Vector3 = selected_building_xform.origin
# var xform = Transform(basis.rotated(Vector3.UP, rot), pos)
# $WorldEditor.editor_command("update_building_transform", [selected_building, xform]) # $WorldEditor.editor_command("update_building_transform", [selected_building, xform])
# $building_rot_cursor.global_transform = xform
# selected_building_xform = xform # selected_building_xform = xform
var motion = Vector2() ## var o = selected_building_xform.origin
var old_mouse_pos = Vector2(-1, -1) ## var m = proj
## o.y = 0
## m.y = 0
## var d = m - o
## var rot: float = -0.01 * d.x * delta
## var basis: Basis = selected_building_xform.basis
## var pos: Vector3 = selected_building_xform.origin
## var xform = Transform(basis.rotated(Vector3.UP, rot), pos)
## $WorldEditor.editor_command("update_building_transform", [selected_building, xform])
## selected_building_xform = xform
## if drag_delay >= 0:
## drag_delay -= delta
#var motion = Vector2()
#var old_mouse_pos = Vector2(-1, -1)
var rotation_y = 0 var rotation_y = 0
var dragging = false #var dragging = false
var drag_delay = 0.2 #var drag_delay = 0.2
var drag_start = Vector3() var drag_start = Vector3()
func _unhandled_input(event): #func _unhandled_input(event):
var editor_mode = $WorldEditor.get_current_mode() # var editor_mode = $WorldEditor.get_current_mode()
var camera_mode = $WorldEditor.get_camera_mode() # var camera_mode = $WorldEditor.get_camera_mode()
if camera_mode in [2, 3]: # if camera_mode in [2, 3]:
if event is InputEventMouseMotion: # if event is InputEventMouseMotion:
motion = event.relative # motion = event.relative
if camera_mode == 3:
match editor_mode: #func check_edit_building():
2: # var mode = $"%buildings_edit_mode".selected
check_edit_building() # breakpoint
func check_edit_building(): # if Input.is_action_just_pressed("mouse1"):
var mode = $"%buildings_edit_mode".selected # var position = get_viewport().get_mouse_position()
if Input.is_action_just_pressed("mouse1"): ## var proj = get_viewport().get_camera().project_position(position, $cam.global_transform.origin.y + position.y * 0.5)
var position = get_viewport().get_mouse_position() ## print(position, proj)
# var proj = get_viewport().get_camera().project_position(position, $cam.global_transform.origin.y + position.y * 0.5) ## proj = get_viewport().get_camera().project_ray_origin(position)
# print(position, proj) ## proj.y = 0
# proj = get_viewport().get_camera().project_ray_origin(position) ## proj.x = stepify(proj.x, 100.0)
# proj.y = 0 ## proj.z = stepify(proj.z, 100.0)
# proj.x = stepify(proj.x, 100.0) ## var mouse_pos = get_viewport().get_mouse_position()
# proj.z = stepify(proj.z, 100.0) #
# var mouse_pos = get_viewport().get_mouse_position() # var camera = get_viewport().get_camera()
var camera = get_viewport().get_camera() # var start = camera.project_ray_origin(position)
var start = camera.project_ray_origin(position) # var normal = camera.project_ray_normal(position)
var normal = camera.project_ray_normal(position) # var end = start + normal * camera.get_zfar()
var end = start + normal * camera.get_zfar() # var space_state = get_world().direct_space_state
var space_state = get_world().direct_space_state # var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true) # if result.has("collider"):
if result.has("collider"): # var proj = result.position
var proj = result.position # if mode == 0:
if mode == 0: # print("get closest building")
print("get closest building") # $WorldEditor.editor_command("get_closest_building", [Transform(Basis(), proj)])
$WorldEditor.editor_command("get_closest_building", [Transform(Basis(), proj)]) # elif mode == 2:
elif mode == 2: # var m = proj
var m = proj # m.y = selected_building_xform.origin.y
m.y = selected_building_xform.origin.y # var xform = selected_building_xform.looking_at(m, Vector3.UP)
var xform = selected_building_xform.looking_at(m, Vector3.UP) # $WorldEditor.editor_command("update_building_transform", [selected_building, xform])
$WorldEditor.editor_command("update_building_transform", [selected_building, xform]) # $building_rot_cursor.global_transform = xform
$building_rot_cursor.global_transform = xform # selected_building_xform = xform
selected_building_xform = xform
elif Input.is_action_pressed("mouse1"):
# Moving/rotating buildings
if mode in [1, 2]:
if ((mode == 1 && drag_delay < 0.0) || mode == 2) && !dragging:
dragging = true
var position = get_viewport().get_mouse_position()
var camera = get_viewport().get_camera()
var start = camera.project_ray_origin(position)
var normal = camera.project_ray_normal(position)
var end = start + normal * camera.get_zfar()
var space_state = get_world().direct_space_state
var result = space_state.intersect_ray(start, end, [], 1 << 15, false, true)
if result.has("collider"):
var proj = result.position
drag_start = proj
if mode == 2:
var m = proj
m.y = selected_building_xform.origin.y
var xform = selected_building_xform.looking_at(m, Vector3.UP)
$WorldEditor.editor_command("update_building_transform", [selected_building, xform])
$building_rot_cursor.global_transform = xform
selected_building_xform = xform
$WorldEditor.editor_command("buildings_checkpoint", [])
else:
drag_delay -= get_process_delta_time()
else:
dragging = false
drag_delay = 0.2
else:
dragging = false
drag_delay = 0.2
func _physics_process(delta): func _physics_process(delta):
assert($WorldEditor is WorldEditor) assert($WorldEditor is WorldEditor)
var editor_mode = $WorldEditor.get_current_mode()
var camera_mode = $WorldEditor.get_camera_mode()
if camera_mode == 1:
var mouse_pos = get_viewport().get_mouse_position()
if old_mouse_pos.x < 0:
old_mouse_pos = mouse_pos
motion = Vector2()
else:
motion = mouse_pos - old_mouse_pos
old_mouse_pos = mouse_pos
var moved = false
match camera_mode:
1:
var xx = Input.get_axis("left", "right")
var zz = Input.get_axis("backward", "forward")
var hh = Input.get_axis("action2", "action")
var h = $Camera.global_transform.origin.y
if abs(zz) > 0.1:
$Camera.global_transform.origin.z -= abs(h) * zz * delta
moved = true
if abs(xx) > 0.1:
$Camera.global_transform.origin.x += abs(h) * xx * delta
moved = true
if abs(hh) > 0.1 && abs(xx) < 0.1 && abs(zz) < 0.1:
$Camera.global_transform.origin.y += 10 * hh * delta
moved = true
2:
var h = $Camera.global_transform.origin.y
var xx = motion.x
$Camera.rotate_y(-xx * 0.005)
var offset = -$Camera.global_transform.basis.z * 10.0 * delta
offset.y = 0
var hh = Input.get_axis("action2", "action")
if abs(hh) > 0.1:
$Camera.global_transform.origin.y += 10 * hh * delta
moved = true
var zz = Input.get_axis("backward", "forward")
if abs(zz) > 0.1:
$Camera.global_transform.origin += zz * abs(h) * offset
moved = true
motion = Vector2()
if moved:
$Area.global_transform.origin.x = $Camera.global_transform.origin.x
$Area.global_transform.origin.z = $Camera.global_transform.origin.z
func setup_cam1():
$WorldEditor.set_camera_mode(1)
func setup_cam2():
$WorldEditor.set_camera_mode(2)
func setup_cam3():
$WorldEditor.set_camera_mode(3)

View File

@@ -18,6 +18,8 @@ WorldEditor::WorldEditor()
, current_camera_mode(-1) , current_camera_mode(-1)
, motion(Vector2()) , motion(Vector2())
, old_mouse_pos(Vector2(-1, -1)) , old_mouse_pos(Vector2(-1, -1))
, dragging(false)
, drag_delay(0.2f)
{ {
if (!InputMap::get_singleton()->has_action("left")) if (!InputMap::get_singleton()->has_action("left"))
InputMap::get_singleton()->add_action("left"); InputMap::get_singleton()->add_action("left");
@@ -31,6 +33,14 @@ WorldEditor::WorldEditor()
InputMap::get_singleton()->add_action("action"); InputMap::get_singleton()->add_action("action");
if (!InputMap::get_singleton()->has_action("action2")) if (!InputMap::get_singleton()->has_action("action2"))
InputMap::get_singleton()->add_action("action2"); InputMap::get_singleton()->add_action("action2");
if (!InputMap::get_singleton()->has_action("editor_cam1"))
InputMap::get_singleton()->add_action("editor_cam1");
if (!InputMap::get_singleton()->has_action("editor_cam2"))
InputMap::get_singleton()->add_action("editor_cam2");
if (!InputMap::get_singleton()->has_action("editor_cam3"))
InputMap::get_singleton()->add_action("editor_cam3");
if (!InputMap::get_singleton()->has_action("mouse1"))
InputMap::get_singleton()->add_action("mouse1");
} }
WorldEditor::~WorldEditor() WorldEditor::~WorldEditor()
@@ -245,8 +255,10 @@ void WorldEditor::_notification(int which)
} }
} }
set_process_unhandled_input(true); set_process_unhandled_input(true);
set_physics_process(true);
} break; } break;
case NOTIFICATION_EXIT_TREE: case NOTIFICATION_EXIT_TREE:
set_physics_process(false);
set_process_unhandled_input(false); set_process_unhandled_input(false);
break; break;
case NOTIFICATION_PHYSICS_PROCESS: { case NOTIFICATION_PHYSICS_PROCESS: {
@@ -256,6 +268,29 @@ void WorldEditor::_notification(int which)
if (!cam) if (!cam)
return; return;
float delta = get_physics_process_delta_time(); float delta = get_physics_process_delta_time();
if (Input::get_singleton()->is_action_just_pressed(
"editor_cam1"))
set_camera_mode(1);
if (Input::get_singleton()->is_action_just_pressed(
"editor_cam2"))
set_camera_mode(2);
if (Input::get_singleton()->is_action_just_pressed(
"editor_cam3"))
set_camera_mode(3);
if (dragging) {
if (!Input::get_singleton()->is_action_pressed(
"mouse1")) {
dragging = false;
drag_delay = 0.2f;
Array args;
Vector2 position =
get_viewport()->get_mouse_position();
args.push_back(position);
emit_signal("editor_event", "mouse_drag_off",
args);
}
} else {
}
Transform cam_xform = cam->get_global_transform(); Transform cam_xform = cam->get_global_transform();
if (current_camera_mode == 1) { if (current_camera_mode == 1) {
Vector2 mouse_pos = Vector2 mouse_pos =
@@ -288,14 +323,50 @@ void WorldEditor::_notification(int which)
cam_xform.origin.y += 10.0f * hh * delta; cam_xform.origin.y += 10.0f * hh * delta;
moved = true; moved = true;
} }
if (moved) {
cam->set_global_transform(cam_xform);
Array move_args;
move_args.push_back(cam_xform);
emit_signal("editor_event",
"editor_camera_moved", move_args);
}
} }
if (!dragging && drag_delay >= 0.0f)
drag_delay -= delta;
} break; } break;
} }
} }
void WorldEditor::_unhandled_input(const Ref<InputEvent> &event) void WorldEditor::_unhandled_input(const Ref<InputEvent> &event)
{ {
print_line("unhandled_input: " + event->as_text()); if (current_camera_mode != 1) {
Ref<InputEventMouseMotion> motionevt = event;
if (motionevt.is_valid())
motion = motionevt->get_relative();
}
if (Input::get_singleton()->is_action_just_pressed("mouse1")) {
Array args;
Vector2 position = get_viewport()->get_mouse_position();
args.push_back(position);
emit_signal("editor_event", "mouse_press", args);
} else if (Input::get_singleton()->is_action_pressed("mouse1")) {
if (dragging) {
Array args;
Vector2 position = get_viewport()->get_mouse_position();
args.push_back(position);
emit_signal("editor_event", "mouse_drag", args);
} else {
if (drag_delay < 0.0f && !dragging) {
dragging = true;
Array args;
Vector2 position =
get_viewport()->get_mouse_position();
args.push_back(position);
emit_signal("editor_event", "mouse_drag_on",
args);
}
}
}
} }
void WorldEditor::world_exited() void WorldEditor::world_exited()

View File

@@ -30,6 +30,8 @@ private:
int current_camera_mode; int current_camera_mode;
Vector2 motion; Vector2 motion;
Vector2 old_mouse_pos; Vector2 old_mouse_pos;
bool dragging;
float drag_delay;
public: public:
WorldEditor(); WorldEditor();