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]) #var nav_active = false #func nav_gui_input(event: InputEvent): # if Input.is_action_just_pressed("mouse1"): # Input.mouse_mode = Input.MOUSE_MODE_CAPTURED # nav_active = true # elif Input.is_action_just_released("mouse1"): # Input.mouse_mode = Input.MOUSE_MODE_VISIBLE # nav_active = false # if nav_active && Input.is_action_pressed("mouse1"): # if event is InputEventMouseMotion: # get_viewport().get_camera().global_transform.origin.x += event.relative.x # get_viewport().get_camera().global_transform.origin.z -= event.relative.y #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") # $"%NavPanel".connect("gui_input", self, "nav_gui_input") #var ignore_events = [ # "mode_change_pre", # "mode_change_post", # "result:get_closest_building", # "result:get_building_types", # "mouse_drag", # "mouse_press", # "mouse_drag_on", # "mouse_drag_off", # "line_cursor_motion", # "button:create_building", # "lines_select_line", # "lines_changed_line" #] 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_building_types": # pass # print(evname, args) # var btypes = args[0] # $"%building_type".clear() # for k in btypes.keys(): # $"%building_type".add_item(k) # if evname == "editor_camera_moved": # var cam = get_viewport().get_camera() # $"%selection_area".global_transform.origin.x = cam.global_transform.origin.x # $"%selection_area".global_transform.origin.z = cam.global_transform.origin.z # elif evname == "edit_update_building": # check_edit_building() # elif evname in ignore_events: # 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) # $WorldEditor.select_building(xform, id, mid) # 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)