extends Spatial #var camera_mode = -1 onready var vmode = { 2: $"%v_buildings", 3: $"%v_navigation", 5: $"%v_poi", 6: $"%v_road_lines", 7: $"%v_npc", } func change_building_type(index): var item = $"%building_type".get_item_text(index) $WorldEditor.editor_command("change_building_type", [selected_building, item]) func _ready(): for b in [ $"%select_buildings", $"%select_navigation", $"%select_poi", $"%select_road_lines", $"%select_npc", $"%buildings_save", ]: b.connect("pressed", $WorldEditor, "editor_command", [b.name, []]) $WorldEditor.connect("editor_event", self, "editor_event") for k in vmode.keys(): vmode[k].hide() $building_cursor.hide() $"%line_cursor".hide() $"%building_type".connect("item_selected", self, "change_building_type") func editor_event(evname: String, args: Array): print(evname, args) if evname == "mode_change_pre": var mode_prev = args[0] if mode_prev == -1: for k in vmode.keys(): vmode[k].hide() elif vmode.has(mode_prev): vmode[mode_prev].hide() elif evname == "mode_change_post": var mode_next = args[1] if vmode.has(mode_next): vmode[mode_next].show() if mode_next == 2: $WorldEditor.editor_command("get_building_types", []) elif mode_next == 6: $WorldEditor.editor_command("get_lines_list", []) elif evname == "result:get_closest_building": print(evname, args) select_building(args[0], args[3], args[4]) elif evname == "result:get_building_types": print(evname, args) var btypes = args[0] $"%building_type".clear() for k in btypes.keys(): $"%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 elif evname == "line_cursor_motion": pass else: 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 == 1: $WorldEditor.editor_command("checkpoint", []) elif mode == 2: $WorldEditor.editor_command("checkpoint", []) 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 selected_building var selected_building_xform func select_building(xform, id, mid): selected_building = id selected_building_xform = xform print("selected id: ", id) for h in range($"%building_type".get_item_count()): var item = $"%building_type".get_item_text(h) if item == mid: $"%building_type".select(h) break if !$building_cursor.visible: $building_cursor.show() $building_cursor.global_transform.origin = xform.origin func _process(delta): # if Input.is_action_just_pressed("editor_cam1"): # setup_cam1() # if Input.is_action_just_pressed("editor_cam2"): # setup_cam2() # if Input.is_action_just_pressed("editor_cam3"): # setup_cam3() var mode = $"%buildings_edit_mode".selected if mode == 2: $building_rot_cursor.global_transform = selected_building_xform if !$building_rot_cursor.visible: $building_rot_cursor.show() else: if $building_rot_cursor.visible: $building_rot_cursor.hide() # if dragging: # if !Input.is_action_pressed("mouse1"): # dragging = false # drag_delay = 0.2 # else: # 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 # 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 ## var o = selected_building_xform.origin ## 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 dragging = false #var drag_delay = 0.2 var drag_start = Vector3() #func _unhandled_input(event): # var editor_mode = $WorldEditor.get_current_mode() # var camera_mode = $WorldEditor.get_camera_mode() # if camera_mode in [2, 3]: # if event is InputEventMouseMotion: # motion = event.relative #func check_edit_building(): # var mode = $"%buildings_edit_mode".selected # breakpoint # if Input.is_action_just_pressed("mouse1"): # var position = get_viewport().get_mouse_position() ## var proj = get_viewport().get_camera().project_position(position, $cam.global_transform.origin.y + position.y * 0.5) ## print(position, proj) ## proj = get_viewport().get_camera().project_ray_origin(position) ## proj.y = 0 ## proj.x = stepify(proj.x, 100.0) ## proj.z = stepify(proj.z, 100.0) ## var mouse_pos = 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 # 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 func _physics_process(delta): assert($WorldEditor is WorldEditor)