From 770bf370feae0c456bff3f7ae3c50aaddbcae872 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Wed, 17 Aug 2022 19:09:31 +0200 Subject: [PATCH 01/10] removed unused variable --- world/game.gd | 2 -- 1 file changed, 2 deletions(-) diff --git a/world/game.gd b/world/game.gd index 0fb0553..7f17b5e 100644 --- a/world/game.gd +++ b/world/game.gd @@ -71,7 +71,6 @@ func set_river_path(point): var start_elevation = point.get_elevation() var waypoints = [] var stack = [] - var end stack.append(point.get_index()) var came_from = {} @@ -81,7 +80,6 @@ func set_river_path(point): waypoints.append(current_point_id) start_elevation = terrain.get_point(current_point_id).get_elevation() stack = [] - end = current_point_id if terrain.get_point(current_point_id).get_data("ocean"): break for neighbour in terrain.get_point(current_point_id).points_around(): From 987cb61c1fbe88bfa483fb2deaf42823ff7e7799 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Wed, 17 Aug 2022 20:38:28 +0200 Subject: [PATCH 02/10] add base 3d --- project.godot | 2 +- utils/terrain/Terrain.gd | 1 + world/World.gd | 35 ++++++++++++++++++++++ default_env.tres => world/default_env.tres | 0 world/game.gd | 2 +- world/game.tscn | 26 +++++++++++++--- world/world.tres | 4 +++ 7 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 world/World.gd rename default_env.tres => world/default_env.tres (100%) create mode 100644 world/world.tres diff --git a/project.godot b/project.godot index 5fbb305..2e3eafe 100644 --- a/project.godot +++ b/project.godot @@ -46,4 +46,4 @@ common/enable_pause_aware_picking=true [rendering] -environment/default_environment="res://default_env.tres" +environment/default_environment="res://world/default_env.tres" diff --git a/utils/terrain/Terrain.gd b/utils/terrain/Terrain.gd index 77e46ee..fce7e9a 100644 --- a/utils/terrain/Terrain.gd +++ b/utils/terrain/Terrain.gd @@ -62,6 +62,7 @@ class Triangle: var list_points = [] for edge in edges(): list_points.append(Point.new(_terrain._triangles[edge._idx], _terrain)) + list_points.invert() return list_points func triangles_adjacent(): diff --git a/world/World.gd b/world/World.gd new file mode 100644 index 0000000..d273cb0 --- /dev/null +++ b/world/World.gd @@ -0,0 +1,35 @@ +extends Spatial + +var terrain + +func _ready(): + pass + + +func draw_world(): + var st = SurfaceTool.new() + + st.begin(Mesh.PRIMITIVE_TRIANGLES) + st.add_smooth_group(true) + for triangle in terrain.get_triangles(): + for point in triangle.points(): + st.add_vertex(point.point3d()) + + st.generate_normals() + st.generate_tangents() + st.index() + # Commit to a mesh. + var mesh = st.commit() + + var mi = MeshInstance.new() + mi.mesh = mesh + var material = load("res://world/world.tres") + mi.set_surface_material(0, material) + mi.create_trimesh_collision() + mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON + print(mi) + add_child(mi) + +func _on_Game_world_loaded(game_terrain): + terrain = game_terrain + draw_world() diff --git a/default_env.tres b/world/default_env.tres similarity index 100% rename from default_env.tres rename to world/default_env.tres diff --git a/world/game.gd b/world/game.gd index 7f17b5e..b1afcf0 100644 --- a/world/game.gd +++ b/world/game.gd @@ -1,4 +1,4 @@ -extends Spatial +extends Node signal world_loaded diff --git a/world/game.tscn b/world/game.tscn index 3c60c82..2f32e71 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -1,16 +1,34 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=6 format=2] [ext_resource path="res://ui/ui.tscn" type="PackedScene" id=1] [ext_resource path="res://world/game.gd" type="Script" id=2] +[ext_resource path="res://world/default_env.tres" type="Environment" id=3] +[ext_resource path="res://world/World.gd" type="Script" id=4] -[node name="Game" type="Spatial"] +[sub_resource type="PlaneMesh" id=1] +size = Vector2( 2000, 2000 ) + +[node name="Game" type="Node"] script = ExtResource( 2 ) [node name="UI" parent="." instance=ExtResource( 1 )] -[node name="Map" parent="UI" index="0"] -scale = Vector2( 0.5, 0.5 ) +[node name="World" type="Spatial" parent="."] +script = ExtResource( 4 ) + +[node name="Water" type="MeshInstance" parent="World"] +visible = false +mesh = SubResource( 1 ) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="World"] +environment = ExtResource( 3 ) + +[node name="Camera" type="Camera" parent="World"] +transform = Transform( 1, 0, 0, 0, 0.509837, 0.860271, 0, -0.860271, 0.509837, 0, 5.05008, 66.6125 ) +near = 0.01 +far = 8192.0 [connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"] +[connection signal="world_loaded" from="." to="World" method="_on_Game_world_loaded"] [editable path="UI"] diff --git a/world/world.tres b/world/world.tres new file mode 100644 index 0000000..f8baa3f --- /dev/null +++ b/world/world.tres @@ -0,0 +1,4 @@ +[gd_resource type="SpatialMaterial" format=2] + +[resource] +albedo_color = Color( 0.109804, 0.305882, 0.0745098, 1 ) From 8b7788fe49c036d9676c029c8819ebaeb64432be Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Wed, 17 Aug 2022 21:32:10 +0200 Subject: [PATCH 03/10] add camera --- project.godot | 19 ++++ utils/camera/CamBase.gd | 98 +++++++++++++++++++ utils/camera/CamBase.tscn | 33 +++++++ utils/camera/CameraController.gd | 140 +++++++++++++++++++++++++++ utils/camera/CameraInput.gd | 158 +++++++++++++++++++++++++++++++ utils/camera/SelectionBox.gd | 17 ++++ world/game.tscn | 12 ++- 7 files changed, 472 insertions(+), 5 deletions(-) create mode 100644 utils/camera/CamBase.gd create mode 100644 utils/camera/CamBase.tscn create mode 100644 utils/camera/CameraController.gd create mode 100644 utils/camera/CameraInput.gd create mode 100644 utils/camera/SelectionBox.gd diff --git a/project.godot b/project.godot index 2e3eafe..9f35f31 100644 --- a/project.godot +++ b/project.godot @@ -9,6 +9,11 @@ config_version=4 _global_script_classes=[ { +"base": "Camera", +"class": "CameraController", +"language": "GDScript", +"path": "res://utils/camera/CameraController.gd" +}, { "base": "Reference", "class": "Delaunator", "language": "GDScript", @@ -25,6 +30,7 @@ _global_script_classes=[ { "path": "res://utils/terrain/Terrain.gd" } ] _global_script_class_icons={ +"CameraController": "", "Delaunator": "", "PoissonDiscSampling": "", "Terrain": "" @@ -40,6 +46,19 @@ config/icon="res://icon.png" common/drop_mouse_on_gui_input_disabled=true +[input] + +main_command={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":2,"pressed":false,"doubleclick":false,"script":null) + ] +} +alt_command={ +"deadzone": 0.5, +"events": [ Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"button_mask":0,"position":Vector2( 0, 0 ),"global_position":Vector2( 0, 0 ),"factor":1.0,"button_index":1,"pressed":false,"doubleclick":false,"script":null) + ] +} + [physics] common/enable_pause_aware_picking=true diff --git a/utils/camera/CamBase.gd b/utils/camera/CamBase.gd new file mode 100644 index 0000000..111b695 --- /dev/null +++ b/utils/camera/CamBase.gd @@ -0,0 +1,98 @@ +extends Spatial + +const MOVE_MARGIN = 20 +const MOVE_SPEED = 30 + +const ray_length = 1000 +onready var cam = $Camera + +var team = 0 +var selected_units = [] +onready var selection_box = $SelectionBox +var start_sel_pos = Vector2() + +func _process(delta): + var m_pos = get_viewport().get_mouse_position() +# calc_move(m_pos, delta) + if Input.is_action_just_pressed("main_command"): + move_selected_units(m_pos) + if Input.is_action_just_pressed("alt_command"): + selection_box.start_sel_pos = m_pos + start_sel_pos = m_pos + if Input.is_action_pressed("alt_command"): + selection_box.m_pos = m_pos + selection_box.is_visible = true + else: + selection_box.is_visible = false + if Input.is_action_just_released("alt_command"): + select_units(m_pos) + +func calc_move(m_pos, delta): + var v_size = get_viewport().size + var move_vec = Vector3() + if m_pos.x < MOVE_MARGIN: + move_vec.x -= 1 + if m_pos.y < MOVE_MARGIN: + move_vec.z -= 1 + if m_pos.x > v_size.x - MOVE_MARGIN: + move_vec.x += 1 + if m_pos.y > v_size.y - MOVE_MARGIN: + move_vec.z += 1 + move_vec = move_vec.rotated(Vector3(0, 1, 0), rotation_degrees.y) + global_translate(move_vec * delta * MOVE_SPEED) + +func move_selected_units(m_pos): + var result = raycast_from_mouse(m_pos, 1) + if result: + var unit_index = 0 + for unit in selected_units: + var new_position = result.position + new_position.x = new_position.x + unit_index + unit.move_to(new_position) + unit_index += 1 + +func select_units(m_pos): + var new_selected_units = [] + if m_pos.distance_squared_to(start_sel_pos) < 16: + var u = get_unit_under_mouse(m_pos) + if u != null: + new_selected_units.append(u) + else: + new_selected_units = get_units_in_box(start_sel_pos, m_pos) + + for unit in selected_units: + unit.deselect() + for unit in new_selected_units: + unit.select() + selected_units = new_selected_units + +func get_unit_under_mouse(m_pos): + var result = raycast_from_mouse(m_pos, 3) + if result and result.collider.is_in_group("units"): + return result.collider + +func get_units_in_box(top_left, bot_right): + if top_left.x > bot_right.x: + var tmp = top_left.x + top_left.x = bot_right.x + bot_right.x = tmp + if top_left.y > bot_right.y: + var tmp = top_left.y + top_left.y = bot_right.y + bot_right.y = tmp + var box = Rect2(top_left, bot_right - top_left) + var box_selected_units = [] + for unit in get_tree().get_nodes_in_group("units"): + if box.has_point(cam.unproject_position(unit.global_transform.origin)): + box_selected_units.append(unit) + return box_selected_units + +func raycast_from_mouse(m_pos, collision_mask): + var ray_start = cam.project_ray_origin(m_pos) + var ray_end = ray_start + cam.project_ray_normal(m_pos) * ray_length + var space_state = get_world().direct_space_state + return space_state.intersect_ray(ray_start, ray_end, [], collision_mask) + + +func _on_Camera_camera_moved(new_location): + pass # Replace with function body. diff --git a/utils/camera/CamBase.tscn b/utils/camera/CamBase.tscn new file mode 100644 index 0000000..78190c1 --- /dev/null +++ b/utils/camera/CamBase.tscn @@ -0,0 +1,33 @@ +[gd_scene load_steps=5 format=2] + +[ext_resource path="res://utils/camera/SelectionBox.gd" type="Script" id=1] +[ext_resource path="res://utils/camera/CamBase.gd" type="Script" id=2] +[ext_resource path="res://utils/camera/CameraController.gd" type="Script" id=3] +[ext_resource path="res://utils/camera/CameraInput.gd" type="Script" id=4] + +[node name="CamBase" type="Spatial"] +transform = Transform( 1, 0, 0, 0, 0.34202, 0.939693, 0, -0.939693, 0.34202, 0, 0, 0 ) +script = ExtResource( 2 ) + +[node name="Camera" type="Camera" parent="."] +size = 20.0 +near = 0.01 +far = 8192.0 +script = ExtResource( 3 ) +movement_speed = 70.017 +min_zoom = 51.0 +zoom_sensibility = 2.818 +rotation_sensibility = 1.0 + +[node name="Node" type="Node" parent="Camera"] +script = ExtResource( 4 ) + +[node name="SelectionBox" type="Control" parent="."] +margin_right = 40.0 +margin_bottom = 40.0 +script = ExtResource( 1 ) + +[connection signal="on_change_action" from="Camera/Node" to="Camera" method="change_action"] +[connection signal="on_change_velocity" from="Camera/Node" to="Camera" method="change_velocity"] +[connection signal="on_rotate_view" from="Camera/Node" to="Camera" method="rotate_view"] +[connection signal="on_zoom" from="Camera/Node" to="Camera" method="zoom"] diff --git a/utils/camera/CameraController.gd b/utils/camera/CameraController.gd new file mode 100644 index 0000000..f5c571c --- /dev/null +++ b/utils/camera/CameraController.gd @@ -0,0 +1,140 @@ +extends Camera +class_name CameraController + +signal camera_moved(new_location) + +enum CAMERA_ACTIONS{ + MOVING, + ROTATING_VIEW, +} + +export(float,1,100) var movement_speed = 30 +export(float,0.01,0.99) var movement_damping = 0.74 +export(float,0.01, 3.1415) var max_rotation = 1.2 +export(float,0.01, 3.1415) var min_rotation = 0.5 + +#Value in percentage of screen portion +#A value of 0.3 means that when you place the cursor 30% or less away from an edge it will start pushing the camera +export(float, 0.0,1.0) var edge_size = 0.0 + +#EDIT HERE--->**,***<--- ZOOM MIN AND MAX LIMITS +export(float, 10,100) var min_zoom = 25 +export(float, 10,100) var max_zoom = 100 + +export(float, 1,3) var zoom_sensibility = 2.5 + +export(float, 1,3) var rotation_sensibility = 2.3 +export(float, 1.0, 10.0) var height = 5.0 +var pitch : float +var yaw : float +var current_action = CAMERA_ACTIONS.MOVING +var velocity : Vector2 + +func _ready(): +# Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED) + + pitch = rotation.x + yaw = rotation.y + +# var new_rotation = (max_zoom - fov) * (max_rotation - min_rotation) / max_zoom + min_rotation + transform.basis = Basis(Vector3(1, 0, 0), (min_rotation + max_rotation) / 2.0) + fov = (min_zoom + max_zoom) / 2.0 + +func change_action(action): + current_action = action + match(current_action): +# CAMERA_ACTIONS.MOVING: +# Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED) + CAMERA_ACTIONS.ROTATING_VIEW: + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + +func _process(delta): + + match(current_action): + CAMERA_ACTIONS.MOVING: + #CAMERA MOVEMENT + velocity.x = clamp(velocity.x * movement_damping,-1.0,1.0) + velocity.y = clamp(velocity.y * movement_damping,-1.0,1.0) + + if velocity != Vector2.ZERO: + move(velocity) + + +func change_velocity(_velocity : Vector2): + velocity = _velocity + +func move(_velocity : Vector2): + #Move along cameras X axis + global_transform.origin += global_transform.basis.x * velocity.x * movement_speed * get_process_delta_time() + #Calculate a forward camera direction that is perpendicular to the XZ plane + var forward = global_transform.basis.x.cross(Vector3.UP) + #Move the camera along that forward direction + global_transform.origin += forward * velocity.y * movement_speed * get_process_delta_time() + + var y_offset = 0 + var space_state = get_world().direct_space_state + var result = space_state.intersect_ray(Vector3(global_transform.origin.x, 100, global_transform.origin.z), Vector3(global_transform.origin.x, 0, global_transform.origin.z)) + if result: + y_offset = result.position.y + else: + y_offset = 0 + global_transform.origin.y = max(10 + y_offset * 1.3, 30) + + emit_signal("camera_moved", global_transform.origin) + + +func zoom(direction : float): + #Zooming using fov + var new_fov = fov + (sign(direction) * pow(abs(direction),zoom_sensibility)/100 * get_process_delta_time()) + fov = clamp(new_fov,min_zoom,max_zoom) + + # Linear equation + var slope = (min_rotation - max_rotation) / (max_zoom - min_zoom) + var b = max_rotation - slope * min_zoom + var new_rotation = slope * fov + b + transform.basis = Basis(Vector3(1, 0, 0), new_rotation) + + +func rotate_view(axis : Vector2): + + var pitch_rotation_amount = -axis.y/100 * get_process_delta_time() * rotation_sensibility + var yaw_rotation_amount = -axis.x/100 * get_process_delta_time() * rotation_sensibility + + pitch += pitch_rotation_amount + pitch = clamp(pitch,-PI/2,0) + + yaw += yaw_rotation_amount + + rotation.x = pitch + rotation.y = yaw + +func _on_Map_map_clicked(position): + global_transform.origin.x = position.x + global_transform.origin.z = position.y + + + var y_offset = 0 + var space_state = get_world().direct_space_state + var result = space_state.intersect_ray(Vector3(global_transform.origin.x, 100, global_transform.origin.z), Vector3(global_transform.origin.x, 0, global_transform.origin.z)) + if result: + y_offset = result.position.y + else: + y_offset = 0 + global_transform.origin.y = max(height + y_offset * 1.3, 30) + pass # Replace with function body. + + +func _on_World_character_created(position): + global_transform.origin.x = position.x + global_transform.origin.z = position.y + + + var y_offset = 0 + var space_state = get_world().direct_space_state + var result = space_state.intersect_ray(Vector3(global_transform.origin.x, 100, global_transform.origin.z), Vector3(global_transform.origin.x, 0, global_transform.origin.z)) + if result: + y_offset = result.position.y + else: + y_offset = 0 + global_transform.origin.y = max(height + y_offset * 1.3, 30) + pass # Replace with function body. diff --git a/utils/camera/CameraInput.gd b/utils/camera/CameraInput.gd new file mode 100644 index 0000000..4c0e185 --- /dev/null +++ b/utils/camera/CameraInput.gd @@ -0,0 +1,158 @@ +extends Node + +export(float,0.001,1.0) var screen_edge_size : float = 0.3 +export(float) var mouse_wheel_damping = 0.9 + +#USED TO CALCULATE RAW MOVEMENT WHILE PUSHING AN EDGE +var horizontal : float = 0.0 +var vertical : float = 0.0 + +#USED TO STORE MOUSE WHEEL INERTIA TO ENABLE SMOOTH STOPPING +var mouse_wheel : float = 0.0 + +signal on_change_velocity(velocity) +signal on_rotate_view(relative) +signal on_change_action(new_state) +signal on_zoom(value) + +var current_action + +#TOUCH VARIABLE FOR MOBILE +var touch_count : int = 0 +var swipe_start : Vector2 + +func _ready(): + connect("on_change_action",self,"change_action") + emit_signal("on_change_action",CameraController.CAMERA_ACTIONS.MOVING) + +func change_action(action): + current_action = action + +func toggle_action(): + current_action = 1 - current_action + +func start_swipe(position : Vector2): + swipe_start = position + +func move_swipe(position : Vector2): + if blocked_movement: + return + + var delta = (position - swipe_start)*-1 + var direction_x = sign(delta.x) + var direction_y = sign(delta.y) + + var view_size = get_viewport().get_visible_rect().size - Vector2.ONE + + horizontal = range_lerp(abs(delta.x),0,view_size.x,0.0,1.0) + vertical = range_lerp(abs(delta.y),0,view_size.y,0.0,1.0) + + #Applies direction + horizontal *= direction_x + vertical *= direction_y + +var touches = [ Vector2.ZERO, Vector2.ZERO ] +var start_pinch_distance : float +var last_pinch_distance : float +var pinching : float + +var blocked_movement : bool = false + +func _input(event): + + if OS.get_name() == "Android" or OS.get_name() == "iOS": + #MOBILE############## + if event is InputEventScreenTouch: + #SET TOUCH STARTING POSTIION + touches[event.index] = event.position + if event.pressed: + touch_count += 1 + start_swipe(event.position) + else: + touch_count -= 1 + #RENABLE SWIPE MOVEMENT BECAUSE EVERY TOUCH WAS LIFTED + if blocked_movement and touch_count <= 0: + blocked_movement = false + + #RESET PINCHING VALUE WHEN A NEW TOUCH IS DETECTED OR HAS BEEN LIFTED + pinching = 0.0 + if touch_count == 2: + #STARTED ZOOMING, BLOCK MOVEMENT UNTIL EVERY TOUCH IS LIFTED + blocked_movement = true + start_pinch_distance = (touches[1] - touches[0]).length() + + if event is InputEventScreenDrag: + if touch_count == 2: + #UPDATE TOUCHES POSITIONS + touches[event.index] = event.position + #CALCULATE DISTANCE BETWEEN TOUCHES + var pinch_distance = (touches[1] - touches[0]).length() + var pinch_direction = 1 if pinch_distance > last_pinch_distance else -1 + #CALCULATE PINCH DELTA + pinching = abs(start_pinch_distance - pinch_distance) * pinch_direction + #USE MOUSE WHEEL BUFFER TO ENABLE SMOOTHING + mouse_wheel += pinching * get_process_delta_time() + last_pinch_distance = pinch_distance + else: + if current_action == CameraController.CAMERA_ACTIONS.MOVING: + move_swipe(event.position) + elif current_action == CameraController.CAMERA_ACTIONS.ROTATING_VIEW: + emit_signal("on_rotate_view",event.relative) + + ###############MOBILE + else: + #PC################## + #Camera edge pushing + if event is InputEventMouseMotion: + #ROTATE VIEW + if current_action == CameraController.CAMERA_ACTIONS.ROTATING_VIEW: + emit_signal("on_rotate_view",event.relative) + #Gets screen size + var view_size = get_viewport().get_visible_rect().size - Vector2.ONE + #Get mouse position in percentage values relative to the screen + var delta = (event.position) / view_size + #Convert it to a range between [-1,1] + delta = (delta * 2) - Vector2.ONE + + if current_action == CameraController.CAMERA_ACTIONS.MOVING: + #Store it an buffer to use it on _process + #Calculates delta based on percentage between the edge size and the actual edge + horizontal = max(abs(delta.x) - (1.0 - screen_edge_size),0) + vertical = max(abs(delta.y) - (1.0 - screen_edge_size),0) + #Converts it to an [0.0,1.0] range + horizontal = range_lerp(horizontal,0.0,screen_edge_size,0.0,1.0) + vertical = range_lerp(vertical,0.0,screen_edge_size,0.0,1.0) + #Applies direction + horizontal *= sign(delta.x) + vertical *= sign(delta.y) + elif current_action == CameraController.CAMERA_ACTIONS.ROTATING_VIEW: + horizontal = delta.x + vertical = delta.y + pass + + + if event is InputEventMouseButton: + #WHEEL SCROLL + if event.button_index == BUTTON_WHEEL_UP or event.button_index == BUTTON_WHEEL_DOWN: + if event.pressed and not event.is_echo(): + var direction = (-1 if event.button_index == BUTTON_WHEEL_UP else 0) + (1 if event.button_index == BUTTON_WHEEL_DOWN else 0) + mouse_wheel += direction * get_process_delta_time() * 1000 + ###################PC + +func _process(delta): + + #PC###### + match(current_action): + CameraController.CAMERA_ACTIONS.MOVING: + #RESIDUAL MOVEMENT + if horizontal != 0 or vertical != 0: + emit_signal("on_change_velocity",Vector2(horizontal, vertical)) + + #MOUSE WHEEL + if mouse_wheel != 0: + mouse_wheel = mouse_wheel * mouse_wheel_damping + emit_signal("on_zoom",mouse_wheel) + #######PC + + + diff --git a/utils/camera/SelectionBox.gd b/utils/camera/SelectionBox.gd new file mode 100644 index 0000000..7efffc1 --- /dev/null +++ b/utils/camera/SelectionBox.gd @@ -0,0 +1,17 @@ +extends Control + +var is_visible = false +var m_pos = Vector2() +var start_sel_pos = Vector2() +const sel_box_col = Color(0, 1, 0) +const sel_box_line_width = 3 + +func _draw(): + if is_visible and start_sel_pos != m_pos: + draw_line(start_sel_pos, Vector2(m_pos.x, start_sel_pos.y), sel_box_col, sel_box_line_width) + draw_line(start_sel_pos, Vector2(start_sel_pos.x, m_pos.y), sel_box_col, sel_box_line_width) + draw_line(m_pos, Vector2(m_pos.x, start_sel_pos.y), sel_box_col, sel_box_line_width) + draw_line(m_pos, Vector2(start_sel_pos.x, m_pos.y), sel_box_col, sel_box_line_width) + +func _process(delta): + update() diff --git a/world/game.tscn b/world/game.tscn index 2f32e71..e8339b9 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=6 format=2] +[gd_scene load_steps=7 format=2] [ext_resource path="res://ui/ui.tscn" type="PackedScene" id=1] [ext_resource path="res://world/game.gd" type="Script" id=2] [ext_resource path="res://world/default_env.tres" type="Environment" id=3] [ext_resource path="res://world/World.gd" type="Script" id=4] +[ext_resource path="res://utils/camera/CamBase.tscn" type="PackedScene" id=5] [sub_resource type="PlaneMesh" id=1] size = Vector2( 2000, 2000 ) @@ -13,6 +14,9 @@ script = ExtResource( 2 ) [node name="UI" parent="." instance=ExtResource( 1 )] +[node name="Map" parent="UI" index="0"] +scale = Vector2( 0.25, 0.25 ) + [node name="World" type="Spatial" parent="."] script = ExtResource( 4 ) @@ -23,12 +27,10 @@ mesh = SubResource( 1 ) [node name="WorldEnvironment" type="WorldEnvironment" parent="World"] environment = ExtResource( 3 ) -[node name="Camera" type="Camera" parent="World"] -transform = Transform( 1, 0, 0, 0, 0.509837, 0.860271, 0, -0.860271, 0.509837, 0, 5.05008, 66.6125 ) -near = 0.01 -far = 8192.0 +[node name="CamBase" parent="World" instance=ExtResource( 5 )] [connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"] [connection signal="world_loaded" from="." to="World" method="_on_Game_world_loaded"] [editable path="UI"] +[editable path="World/CamBase"] From 85a5520013c931f2bbe1113dc050e4ea79a1f441 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Wed, 17 Aug 2022 21:47:47 +0200 Subject: [PATCH 04/10] update 3d render --- world/World.gd | 4 ++-- world/game.gd | 2 +- world/game.tscn | 6 +++++- world/world.material | Bin 0 -> 1166 bytes 4 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 world/world.material diff --git a/world/World.gd b/world/World.gd index d273cb0..b1fd2f8 100644 --- a/world/World.gd +++ b/world/World.gd @@ -13,7 +13,7 @@ func draw_world(): st.add_smooth_group(true) for triangle in terrain.get_triangles(): for point in triangle.points(): - st.add_vertex(point.point3d()) + st.add_vertex(point.point3d() * Vector3(1, 24*5, 1)) st.generate_normals() st.generate_tangents() @@ -23,7 +23,7 @@ func draw_world(): var mi = MeshInstance.new() mi.mesh = mesh - var material = load("res://world/world.tres") + var material = load("res://world/world.material") mi.set_surface_material(0, material) mi.create_trimesh_collision() mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON diff --git a/world/game.gd b/world/game.gd index b1afcf0..0c8d105 100644 --- a/world/game.gd +++ b/world/game.gd @@ -121,7 +121,7 @@ func point_find_elevation(point): elevation = min(elevation, 1) - # elevation = elevation * terraces + elevation = round(elevation * terraces) / terraces return elevation func point_is_water(point): diff --git a/world/game.tscn b/world/game.tscn index e8339b9..00c45f4 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -21,7 +21,7 @@ scale = Vector2( 0.25, 0.25 ) script = ExtResource( 4 ) [node name="Water" type="MeshInstance" parent="World"] -visible = false +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 1000, 0, 1000 ) mesh = SubResource( 1 ) [node name="WorldEnvironment" type="WorldEnvironment" parent="World"] @@ -29,6 +29,10 @@ environment = ExtResource( 3 ) [node name="CamBase" parent="World" instance=ExtResource( 5 )] +[node name="DirectionalLight" type="DirectionalLight" parent="World"] +transform = Transform( 1, 0, 0, 0, 0.41636, 0.9092, 0, -0.9092, 0.41636, 0, 1.41623, 0 ) +light_energy = 0.1 + [connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"] [connection signal="world_loaded" from="." to="World" method="_on_Game_world_loaded"] diff --git a/world/world.material b/world/world.material new file mode 100644 index 0000000000000000000000000000000000000000..e4ba4f61e8eed162c40ed316a3053fa7e9d80572 GIT binary patch literal 1166 zcmV;91abRPQ$s@n000005C8yJ3IG6h1ONaiwJ-f(SP5k#0G9EkLjZM~1KIyybx3fE z*T3c;oX6#x*N z2p~)Wg#e8JlmOReO>*%)OL2vgtvJ?c0b_YZ7dnqb^G9*35=WD?&=`Lmi9UNLv^FV~ z`8!EJ?LBOD@=7mCXe_;$O<%hk_9@S6=k?7|+qAG99b&edxFVE6a&bw>5Sw9FbPPI12#~;VdjnhJt zFp<(vJrOB=?<_}S+ey(f3+D0B33*U>`-+)#VL3_rcXhaq2NVPFvd5RWx;D> znqA4(eCNh_aWYjJ%iu2_jBZI%rAma23{*37LZGeV@|>ARH^v9fIcZ4a|*_6 zG^Wq@Nxn@>f?Jg(Td$=yDxeU^#19}D3nE3bizLZ|j*S}`wu6U*6dE*YWFBzj$W{m$ zlFf93n3;i*Wj%akA9CpE?g%OiM3hkAIg%j6j2_V42(ln1kjiqzkkQ?n?mkeUyA@O+ z#~Gf&$c(F#>ZCI9uTxY%p6zBycxNx?TeX^>D3#jGva|VQfj&@e=*iYD3G@9?>I*EKvnwxPmPA}tT{mis-2!Ixe>KXZmEAdA7?14()*^49@H zk|tCVfeYazaUigg3X_#|)Ll>?7@z>sZN1%A#e%jp@8I`L8ryD?+Sj0#NAwXYP(TJD&j4|Si`}1S+w-T?j{GX|u~P`^?4w_+i1OGSQTTenn!XFHh*OPl zC%v%3;URmx)M9wE+md5H8ip!gVHF%FBI{@a)9o?Ed2kS9SlcSaLGZ(!bOXA>db~6g z_E;_?Nd}y=TRu^6js!W`^?(aYb_+`Aqfr|ka3p+8+2i@ZNB55OfH0~8xz*}Ae=M9F z3p_Hf&}B#!Vp*22xW)L!T}%6#xJL literal 0 HcmV?d00001 From d6842dd411443e983f6f26d0e22c4b5a973ebb1f Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Wed, 17 Aug 2022 22:38:03 +0200 Subject: [PATCH 05/10] enhance navigation --- ui/map/cursor/Cursor.gd | 8 ++++++++ ui/map/cursor/cursor.png | Bin 0 -> 7730 bytes ui/map/cursor/cursor.png.import | 35 ++++++++++++++++++++++++++++++++ ui/map/map.gd | 8 ++++++++ ui/map/map.tscn | 8 +++++++- utils/camera/CamBase.tscn | 3 ++- world/World.gd | 3 ++- world/game.tscn | 21 +++++++++++++++++-- 8 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 ui/map/cursor/Cursor.gd create mode 100644 ui/map/cursor/cursor.png create mode 100644 ui/map/cursor/cursor.png.import diff --git a/ui/map/cursor/Cursor.gd b/ui/map/cursor/Cursor.gd new file mode 100644 index 0000000..e4d7547 --- /dev/null +++ b/ui/map/cursor/Cursor.gd @@ -0,0 +1,8 @@ +extends Sprite + +func _on_Camera_camera_moved(new_location): + var map_x = new_location.x + var map_y = new_location.z + position.x = map_x + position.y = map_y + pass # Replace with function body. diff --git a/ui/map/cursor/cursor.png b/ui/map/cursor/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1ce1a61ee7dd1d6d9d7b2c6e606ffd8bc4286c GIT binary patch literal 7730 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 hwD(AVngHVc*;A7$!wsa}^cm#>(AP26F4p`l Date: Wed, 17 Aug 2022 23:05:39 +0200 Subject: [PATCH 06/10] add trees --- .../environment/birchtree/BirchTree_1.glb | Bin 0 -> 96584 bytes .../birchtree/BirchTree_1.glb.import | 1065 +++++++++++++++++ entities/environment/birchtree/Black.material | Bin 0 -> 1684 bytes .../environment/birchtree/DarkGreen.material | Bin 0 -> 1692 bytes entities/environment/birchtree/Green.material | Bin 0 -> 1684 bytes entities/environment/birchtree/White.material | Bin 0 -> 1684 bytes entities/environment/birchtree/birchtree.tscn | 14 + ui/map/map.gd | 2 +- utils/camera/CameraController.gd | 2 +- world/game.gd | 24 +- world/game.tscn | 4 +- 11 files changed, 1107 insertions(+), 4 deletions(-) create mode 100644 entities/environment/birchtree/BirchTree_1.glb create mode 100644 entities/environment/birchtree/BirchTree_1.glb.import create mode 100644 entities/environment/birchtree/Black.material create mode 100644 entities/environment/birchtree/DarkGreen.material create mode 100644 entities/environment/birchtree/Green.material create mode 100644 entities/environment/birchtree/White.material create mode 100644 entities/environment/birchtree/birchtree.tscn diff --git a/entities/environment/birchtree/BirchTree_1.glb b/entities/environment/birchtree/BirchTree_1.glb new file mode 100644 index 0000000000000000000000000000000000000000..b68f5978964b41446639dc501069d639de13a02f GIT binary patch literal 96584 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�i@i1 zse2RPJr3}m2zdVmybgi)FG$@l0R3U;(!=|z{$K7XfcFc)`vTxSS#e9LI)E1_RxWZzCH9dp{ozwd+7f|45EUsG*+>J!e=y{G0O( zp5p}lYUokJ=QzQ-BJ`!9V*tHeDIZwM^MsBr^m1WNE#)dpImytYfW9$wjG@O1Jv8WE zLT42^Y5!NQuawgZuRWks2c1$WPgu$qm2#Y*7x#bV)EEt{Ql<3f@c{? z`Jew+o+|XsU=35sUzPGsp>GCVBPnkadYI6egq|d|IVrDC%F~nb1EoAb=)Xbd z4fdSi6?;>!240{W|E>!5X`i$0g;h!QWX@PM4IUCFOcaIb-m*wv-Ph<)=Yc z2mS{CT^|g(I?!>F^2DHf105~s`9SAN${&MX3UrX5YXlt?Dc4BKhk+i^?>bS?H-K&u z^mCv~1G8i3(!lH(=GRhQ4a~Bk&jURr=q>!NYXrR%DZdChIlt@nKxYPeKCmXw;^e@Z zzm!k%yWR`*Nub9f<)uLP17=LnErE`Nln(K6s`Riw_{>8%X8OQu(-49{sy{ zw^VNayZO6RJ}Z?YOXbB<`L9&&{JZ(GRNgI>xBhM(DwV7LZayoS3j+@d=D$*TqEv1u zm2XPrl~VbpR9-2St4igkQn{N{ZYY)C{ca8@l_&mgE-96xN#$8mIhs^1CY7&A<#aH2 zgL&WY=0Q?PB9*g9RIVYFFG%GV zzng`4cx`y01`6;C#cS>1Z#&OkT%@iEhOkp82;4Eb>3IonXF<36+T#e5v zW!zciSh<|bk)Kz}x${alV ze}y^cuV^N##Wj_ADr#|_3J;kj=P7ekSaOaE6PXn^ReoP-#obq~l-J=_$?quZaCej; zGHb5AtfjFv*U~shR-4nvIw)#$9Td~#wp^mDqr#T!sAw&#%LU4U6?M5_MXbz@8zk$k zu;Y3we2i^4Z{tXX4Hv11m(}NH$<@a7IkoW$c|C5Kyi!?@t5k-{?72=dwZfiLEBs^) zxK^^(iUwS3#cX*aE==}F*@%0jTqJkkmdfub9k_eS$@0eB6nQ&EW3HW|t*jx}Murs) zIjra`Ysv-7ZYi5`x0DOzO}Ke--na?J8_$(Ha&zQC3P&zTp_Vn{u&jk~Gp>bkJDC&r zP}W7^#C1^&khSEZWD$y%T!i9|tOa*lHb>Edo1?fTYtG$}O;R-HCMhaqu3U;NP~pl2 zDgtCKoWG1$xNy88S?0_o$vP{Xxz36nGB>WLEL`Eng)35J9^3}`8>I*LMtMl?&h3{! zSGsf0mE&bTT#T%(!iQ_CKr&B`m$gxNa%~i8GB0kZtee7%>!#=}^XB@>dMdoRo{E7o zKh9K9-`J0 zELYK!%T;WbMQ}T0S&9fQOR-nho7*EBt?12-R_v1X;&#gN6}`B81(o&TP8&^7_TeTd z?-=#t?iuAN`*C^76GoBTNuz8iw zCMgGSla%L-`g3QE#wq%9;}m7GXl}P`j3SyFqqtxc%N>%9R>pFpl~;{oxXVUUl`-5@ z*A6=^Q{i0HLWJ9U!#>NJl`jgm#1_^oQ0SzG*9Idss=|8(rYF)_`__1~f+N1WmMP z+6kiRORY1!(k9W)Fo|B)y23SWD(wnW=^L#(JknxmcZj92S`TQZHKIMB5q+!0!#gd3 z#zO+Vsda*?y`c4iOWH)*3ntPRS|4ad=FvVdkEUq-;E%SP z_JifLDd`I_7BU(h-nI|7oLPDtSXk!yCGWjD%I>1sw@5C?}&p5Q~li zixwwipd>j=$G~BlK*mEsvY3vC#q_H-7Cvi>=vY`p^OJEdt3Y$N~Z4ERUAjkz$H9HevMAT3MgKxuNE&Vl1}23Y{1@|Ebg~$x zkz;f*9HSv*5mX@i=pxuhYmnveTA#+2!!)KF%YYbD*fN;H29c#Okldk5;STLfRzQF9 zh^~M~^o_m>nvoTB6|A7y$ZE(*_R!U^hqfhaAdXz2Yv2lP;#did9cSoDI74H}T4+wr z(zS4wHYDqyF}X_D!ByIxY=qWi7u^WEXjZZwvXJ$3J*=l4$Oh<0uG0;0okoyN5J@i5 zO>mL6A)BEexl1?0UD}Ckg|6fl-3qs8PqGbqlLvGgJfQJp3v?ro=@xiQ2auhRtj}gU zVKzf!2mIA%upKaiz0$4o_%zvI}~U`*auFr|%TXeM$9GLs$j5bU5;$w8<>-qC~bjxHn?%qJhI1s~}w zaumjsjr1sNq-n`v@F8pIVOUFNlOr&fe4B>0id^dxMi6UixDT}Lj%2J(Ymh95MYaTN}dRqQIPVp)yrkj+@iuESE6%D4fk zjX(4T{Gq$ZHP}hM&};C89wK+(09nlLz+#rkxCI%F4eS;e2{kBz(V$oR?b!cX>t+=HJa3%dtd*jsWR-V=XzAN<)#;}KjT zW9cIpOK)pW;I3A~@dRo(2zd+|q3khG_JBNud&HYP1aEekyns|>JbeM<=|$~1oYzLv z=P;UHB2VEWNyVN*D)xxH1f7ICUP8FzhV}+-Y18N%m_|>N*Kmpu_8JI#PF}$?;$W}9 z!3>fN+4PJo88WgrDgOI&$8(6Agi92y@R~Wp}&VzdVcmE^0VyvM@S*R*hl!q z?i!!rz5$NU01nhY0q8l|C&~BJNrexfTk127a)#X#&@`FP{((m4yJzt zs%K{3AT#?+zQPBRi+zP$jOf2W*A2%nFdR3GA8^h1$9}*+cG~y}XN&;$69U*vk^-+u z29^RDn4$lJ40=)a4~nt@`d{d;H(-CE0qd;)fsT3<`vXyIh>lo5&&Ck5u`fi!ZzKoP zFbB(}6U?m#GlIb^qYju}FTwzeu>3m1%z8S;Fda)K2EHR%nSohZK3&JWdJxkwi23Lg z)9QH`#XKyN?!Z7jH*;Wa_K~Eydb=E}BhYgI=EFYd`F-CrDW*lSr z@ffRX6u^2$9aaGAu!eeGjMi(hyjY7x8$sAoKgfdcAZu(C#D>O6RuE6JNTU!&88ulU ztjTKYg|Uuag%!pstd$;&LB>`Vj9Xb1qbOE3wy>hOh0WKC;5@wpD}o)^B)u3;(L1qX z*ohT3O5h;97%PFrSb4n^hUk@9DXh#!=p}Ku-h!3H7OauS#fO02I^&Tq#nx3 zVki@OX&kKAXQi<|>!X*$etHvD4x6x1dPN+no2(+5tejpR%jleyN6tp;6>y9m!zy45 z>!OEXH$9exU@RM^hvF=~H4DYoY@E(AH#2^f+c>94l^A!P3S7Rs|2R5ThD~ z8ar7v+{uEC>R8NZ!>VH&HeRoaWA#?7Dz;)}jG8z{-^6O-CRV|yf#r;StOo95C5><_ zWwd1B*pkiAYvD}29jk@y*j&9XZq`e&x>$-8)9YYSJ%rW45EiG`#5(j)MIK8Qu&Al6QAh^zIo ztRa?VL3%V6(#x=DEW@_y4RD*@mo>n?%+ed-LA?uWgk9Jgy$P<x%Q(54{t9*ArMLOkgkdcx*r}(|Ej0$B-U4n#^H6a1Q&ecgJ7) z0@fWDuyLd}jwF|8Z@fgKNH45UZqQzMgN`6QaX6XDdg4s>Pw#_Z%wm0T78^zS<4|&q z_Qz|q3F(WC$T`{<&(Y_4KYXE2X8mw7(~JRV7}MDRoX&=k!RRoK(7||wmLdbO1d((g zN_w0O!V_dY8-(jw24e_jHkPmp}3NzF~;CAl0?T~5)CG!un5^tN8x_zXN*K&V+|XLYgkTWH0CzevC+7W z9VKJYA}8orJVDEl@mP)=qT}%prN#tg#v(QW7qPs?I1DtFvvIhbNiqcs7>(H!Y|Q%V zld!iQ!6sn@TcJa%c>zJtxe9juZu z6NRyd&BQ%ynLZB}=*`$XY{t6lbFi!4l+D4Wte`O$3mKc)T-?mUjQLpA*v97LHnvb- zgf)#mY!UWh`}BplTkp>nVt=+nUx3^7Q)~gAVvUSMY+@W@iFkmD3 z;T+>GbKzY!#*mm`6m>`}>L{%p!kXGcb_gG`1%`$5jTg+q7i_9=1S7N}^avKAe%fL5 z)rvR{V-d$><0wusp0T6&j3pY!aIx`{9mAKbzIF-=Ya#R$hR|`wNgQk3XD9JKTW%c3 zWyTYB9G|dS+G*Tq)TXDgHtnRH#jYBsXOYvX+BrcT$cknN}YTU)^ zhVHnFy5pkp052FCdw?1{Ngm-DGMzrc>GX>65HB0d@erBgj&UDv8k*xiYL4^96Fgz~ zvM1=vZjxtsn*e);z|I*@@vMQ4r-+UR#$&u^q_D@B!j2m+@i&=3U*ZIsnmosv4j=X$ zeb`as1s*eguow7)Jv3h76XOqig@4!|@)n;O$lfBdJLEOqB7W>O`myWe4c;Ib9B(j# zy5_&GkHpCiRc#-B!7M>3{$ zyf(hzRg#u{!L;lN`HT;V7yFD}?3M8eUm8A+Pw3NGMu6ih1~{&fZ+L+)_6-?( zO1|R@qO1Hb{%3hWo{+u2GuRp=((kxhd1~(3}pY<#epk3OWvA zIrp)gR+<)al%WN+LXLvk2`uXvqg8U0byRW;)HWF99E07*!CFiDSgYuW)*froS{)kV zc&$$eNad*GNafJzc~aYf?jurvM?J@1&C7lCa(p*F8Fd|B-N&y+Mn|Nh z3_A5lhf^=aq8x=;fF9)t(0@Y%M+?0YYv8EFO6qI%Xh#Y6v4mcMHFQ)bJ8475P8vWe zlSYmV?qdeBjZPs=9m~lSvYfo6F^-ue*?ml=OGz`wX&UW5Mw4zB>*#`YNvxwTIZ0bM z+L1Nx;~JWWv>?qLx!lKGWHwE5?+>>9bUBV4)+G&0SC*62#dxPb_gpb0eVjvg4;S9M zL;k~=Ry1)Pnc7BFJ$1`cnZ7>kDz$H?C>dB%s{H2hB(4AP9>#tT@vT= zZ;%rzt#IyIa8fjFBmct#tK_wKnPl^9S-a$K-p{?4x7C%Jl$ zP7r%$1iGeAs+km!VX9c%s(9$>O?O=X$8iPnhn^lC5xRZJNHKQZR@aY^QdWlkr$u!4 z#!mm*UtOJ!o)&EbE;<8;j&jX1mWfl*yZ^&0O8Z!gyC#clv;4Tqf#-5L{VVquog;r) zlO4J%bL1cq)%k(dX-h$u_xcWEuj7cdGTpzV0lk`w&4b@t3+9h-Rm!RqT0s%k?12&pE$aI}!c5lIy@9U)Prh z3q^9_Y;tMiRM!91b7)j)**qvSzYx2RSG=(xN#!iQ*_|YnTMSBP6`pij08cB1`L`E|qX7qWSaosvOtMSm(xn_cM|2&Lb@?hw{;=<-FTVQ^wiaS**H+q4>@I() z^7|eKU9Btc5L+sikSh1tof5h({|=Gq)F!ENvAS21%H269=0vWMD$l*0=p0b}gm~

c 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 literal 0 HcmV?d00001 diff --git a/entities/environment/birchtree/BirchTree_1.glb.import b/entities/environment/birchtree/BirchTree_1.glb.import new file mode 100644 index 0000000..17529cc --- /dev/null +++ b/entities/environment/birchtree/BirchTree_1.glb.import @@ -0,0 +1,1065 @@ +[remap] + +importer="scene" +type="PackedScene" +path="res://.import/BirchTree_1.glb-0ed9b9af0bf80854878b8f5051793fa4.scn" + +[deps] + +source_file="res://entities/environment/birchtree/BirchTree_1.glb" +dest_files=[ "res://.import/BirchTree_1.glb-0ed9b9af0bf80854878b8f5051793fa4.scn" ] + +[params] + +nodes/root_type="Spatial" +nodes/root_name="Scene Root" +nodes/root_scale=1.0 +nodes/custom_script="" +nodes/storage=0 +nodes/use_legacy_names=false +materials/location=1 +materials/storage=1 +materials/keep_on_reimport=true +meshes/octahedral_compression=true +meshes/compress=4286 +meshes/ensure_tangents=true +meshes/storage=0 +meshes/light_baking=0 +meshes/lightmap_texel_size=0.1 +skins/use_named_skins=true +external_files/store_in_subdir=false +animation/import=true +animation/fps=15 +animation/filter_script="" +animation/storage=false +animation/keep_custom_tracks=false +animation/optimizer/enabled=true +animation/optimizer/max_linear_error=0.05 +animation/optimizer/max_angular_error=0.01 +animation/optimizer/max_angle=22 +animation/optimizer/remove_unused_tracks=true +animation/clips/amount=0 +animation/clip_1/name="" +animation/clip_1/start_frame=0 +animation/clip_1/end_frame=0 +animation/clip_1/loops=false +animation/clip_2/name="" +animation/clip_2/start_frame=0 +animation/clip_2/end_frame=0 +animation/clip_2/loops=false +animation/clip_3/name="" +animation/clip_3/start_frame=0 +animation/clip_3/end_frame=0 +animation/clip_3/loops=false +animation/clip_4/name="" +animation/clip_4/start_frame=0 +animation/clip_4/end_frame=0 +animation/clip_4/loops=false +animation/clip_5/name="" +animation/clip_5/start_frame=0 +animation/clip_5/end_frame=0 +animation/clip_5/loops=false +animation/clip_6/name="" +animation/clip_6/start_frame=0 +animation/clip_6/end_frame=0 +animation/clip_6/loops=false +animation/clip_7/name="" +animation/clip_7/start_frame=0 +animation/clip_7/end_frame=0 +animation/clip_7/loops=false +animation/clip_8/name="" +animation/clip_8/start_frame=0 +animation/clip_8/end_frame=0 +animation/clip_8/loops=false +animation/clip_9/name="" +animation/clip_9/start_frame=0 +animation/clip_9/end_frame=0 +animation/clip_9/loops=false +animation/clip_10/name="" +animation/clip_10/start_frame=0 +animation/clip_10/end_frame=0 +animation/clip_10/loops=false +animation/clip_11/name="" +animation/clip_11/start_frame=0 +animation/clip_11/end_frame=0 +animation/clip_11/loops=false +animation/clip_12/name="" +animation/clip_12/start_frame=0 +animation/clip_12/end_frame=0 +animation/clip_12/loops=false +animation/clip_13/name="" +animation/clip_13/start_frame=0 +animation/clip_13/end_frame=0 +animation/clip_13/loops=false +animation/clip_14/name="" +animation/clip_14/start_frame=0 +animation/clip_14/end_frame=0 +animation/clip_14/loops=false +animation/clip_15/name="" +animation/clip_15/start_frame=0 +animation/clip_15/end_frame=0 +animation/clip_15/loops=false +animation/clip_16/name="" +animation/clip_16/start_frame=0 +animation/clip_16/end_frame=0 +animation/clip_16/loops=false +animation/clip_17/name="" +animation/clip_17/start_frame=0 +animation/clip_17/end_frame=0 +animation/clip_17/loops=false +animation/clip_18/name="" +animation/clip_18/start_frame=0 +animation/clip_18/end_frame=0 +animation/clip_18/loops=false +animation/clip_19/name="" +animation/clip_19/start_frame=0 +animation/clip_19/end_frame=0 +animation/clip_19/loops=false +animation/clip_20/name="" +animation/clip_20/start_frame=0 +animation/clip_20/end_frame=0 +animation/clip_20/loops=false +animation/clip_21/name="" +animation/clip_21/start_frame=0 +animation/clip_21/end_frame=0 +animation/clip_21/loops=false +animation/clip_22/name="" +animation/clip_22/start_frame=0 +animation/clip_22/end_frame=0 +animation/clip_22/loops=false +animation/clip_23/name="" +animation/clip_23/start_frame=0 +animation/clip_23/end_frame=0 +animation/clip_23/loops=false +animation/clip_24/name="" +animation/clip_24/start_frame=0 +animation/clip_24/end_frame=0 +animation/clip_24/loops=false +animation/clip_25/name="" +animation/clip_25/start_frame=0 +animation/clip_25/end_frame=0 +animation/clip_25/loops=false +animation/clip_26/name="" +animation/clip_26/start_frame=0 +animation/clip_26/end_frame=0 +animation/clip_26/loops=false +animation/clip_27/name="" +animation/clip_27/start_frame=0 +animation/clip_27/end_frame=0 +animation/clip_27/loops=false +animation/clip_28/name="" +animation/clip_28/start_frame=0 +animation/clip_28/end_frame=0 +animation/clip_28/loops=false +animation/clip_29/name="" +animation/clip_29/start_frame=0 +animation/clip_29/end_frame=0 +animation/clip_29/loops=false +animation/clip_30/name="" +animation/clip_30/start_frame=0 +animation/clip_30/end_frame=0 +animation/clip_30/loops=false +animation/clip_31/name="" +animation/clip_31/start_frame=0 +animation/clip_31/end_frame=0 +animation/clip_31/loops=false +animation/clip_32/name="" +animation/clip_32/start_frame=0 +animation/clip_32/end_frame=0 +animation/clip_32/loops=false +animation/clip_33/name="" +animation/clip_33/start_frame=0 +animation/clip_33/end_frame=0 +animation/clip_33/loops=false +animation/clip_34/name="" +animation/clip_34/start_frame=0 +animation/clip_34/end_frame=0 +animation/clip_34/loops=false +animation/clip_35/name="" +animation/clip_35/start_frame=0 +animation/clip_35/end_frame=0 +animation/clip_35/loops=false +animation/clip_36/name="" +animation/clip_36/start_frame=0 +animation/clip_36/end_frame=0 +animation/clip_36/loops=false +animation/clip_37/name="" +animation/clip_37/start_frame=0 +animation/clip_37/end_frame=0 +animation/clip_37/loops=false +animation/clip_38/name="" +animation/clip_38/start_frame=0 +animation/clip_38/end_frame=0 +animation/clip_38/loops=false +animation/clip_39/name="" +animation/clip_39/start_frame=0 +animation/clip_39/end_frame=0 +animation/clip_39/loops=false +animation/clip_40/name="" +animation/clip_40/start_frame=0 +animation/clip_40/end_frame=0 +animation/clip_40/loops=false +animation/clip_41/name="" +animation/clip_41/start_frame=0 +animation/clip_41/end_frame=0 +animation/clip_41/loops=false +animation/clip_42/name="" +animation/clip_42/start_frame=0 +animation/clip_42/end_frame=0 +animation/clip_42/loops=false +animation/clip_43/name="" +animation/clip_43/start_frame=0 +animation/clip_43/end_frame=0 +animation/clip_43/loops=false +animation/clip_44/name="" +animation/clip_44/start_frame=0 +animation/clip_44/end_frame=0 +animation/clip_44/loops=false +animation/clip_45/name="" +animation/clip_45/start_frame=0 +animation/clip_45/end_frame=0 +animation/clip_45/loops=false +animation/clip_46/name="" +animation/clip_46/start_frame=0 +animation/clip_46/end_frame=0 +animation/clip_46/loops=false +animation/clip_47/name="" +animation/clip_47/start_frame=0 +animation/clip_47/end_frame=0 +animation/clip_47/loops=false +animation/clip_48/name="" +animation/clip_48/start_frame=0 +animation/clip_48/end_frame=0 +animation/clip_48/loops=false +animation/clip_49/name="" +animation/clip_49/start_frame=0 +animation/clip_49/end_frame=0 +animation/clip_49/loops=false +animation/clip_50/name="" +animation/clip_50/start_frame=0 +animation/clip_50/end_frame=0 +animation/clip_50/loops=false +animation/clip_51/name="" +animation/clip_51/start_frame=0 +animation/clip_51/end_frame=0 +animation/clip_51/loops=false +animation/clip_52/name="" +animation/clip_52/start_frame=0 +animation/clip_52/end_frame=0 +animation/clip_52/loops=false +animation/clip_53/name="" +animation/clip_53/start_frame=0 +animation/clip_53/end_frame=0 +animation/clip_53/loops=false +animation/clip_54/name="" +animation/clip_54/start_frame=0 +animation/clip_54/end_frame=0 +animation/clip_54/loops=false +animation/clip_55/name="" +animation/clip_55/start_frame=0 +animation/clip_55/end_frame=0 +animation/clip_55/loops=false +animation/clip_56/name="" +animation/clip_56/start_frame=0 +animation/clip_56/end_frame=0 +animation/clip_56/loops=false +animation/clip_57/name="" +animation/clip_57/start_frame=0 +animation/clip_57/end_frame=0 +animation/clip_57/loops=false +animation/clip_58/name="" +animation/clip_58/start_frame=0 +animation/clip_58/end_frame=0 +animation/clip_58/loops=false +animation/clip_59/name="" +animation/clip_59/start_frame=0 +animation/clip_59/end_frame=0 +animation/clip_59/loops=false +animation/clip_60/name="" +animation/clip_60/start_frame=0 +animation/clip_60/end_frame=0 +animation/clip_60/loops=false +animation/clip_61/name="" +animation/clip_61/start_frame=0 +animation/clip_61/end_frame=0 +animation/clip_61/loops=false +animation/clip_62/name="" +animation/clip_62/start_frame=0 +animation/clip_62/end_frame=0 +animation/clip_62/loops=false +animation/clip_63/name="" +animation/clip_63/start_frame=0 +animation/clip_63/end_frame=0 +animation/clip_63/loops=false +animation/clip_64/name="" +animation/clip_64/start_frame=0 +animation/clip_64/end_frame=0 +animation/clip_64/loops=false +animation/clip_65/name="" +animation/clip_65/start_frame=0 +animation/clip_65/end_frame=0 +animation/clip_65/loops=false +animation/clip_66/name="" +animation/clip_66/start_frame=0 +animation/clip_66/end_frame=0 +animation/clip_66/loops=false +animation/clip_67/name="" +animation/clip_67/start_frame=0 +animation/clip_67/end_frame=0 +animation/clip_67/loops=false +animation/clip_68/name="" +animation/clip_68/start_frame=0 +animation/clip_68/end_frame=0 +animation/clip_68/loops=false +animation/clip_69/name="" +animation/clip_69/start_frame=0 +animation/clip_69/end_frame=0 +animation/clip_69/loops=false +animation/clip_70/name="" +animation/clip_70/start_frame=0 +animation/clip_70/end_frame=0 +animation/clip_70/loops=false +animation/clip_71/name="" +animation/clip_71/start_frame=0 +animation/clip_71/end_frame=0 +animation/clip_71/loops=false +animation/clip_72/name="" +animation/clip_72/start_frame=0 +animation/clip_72/end_frame=0 +animation/clip_72/loops=false +animation/clip_73/name="" +animation/clip_73/start_frame=0 +animation/clip_73/end_frame=0 +animation/clip_73/loops=false +animation/clip_74/name="" +animation/clip_74/start_frame=0 +animation/clip_74/end_frame=0 +animation/clip_74/loops=false +animation/clip_75/name="" +animation/clip_75/start_frame=0 +animation/clip_75/end_frame=0 +animation/clip_75/loops=false +animation/clip_76/name="" +animation/clip_76/start_frame=0 +animation/clip_76/end_frame=0 +animation/clip_76/loops=false +animation/clip_77/name="" +animation/clip_77/start_frame=0 +animation/clip_77/end_frame=0 +animation/clip_77/loops=false +animation/clip_78/name="" +animation/clip_78/start_frame=0 +animation/clip_78/end_frame=0 +animation/clip_78/loops=false +animation/clip_79/name="" +animation/clip_79/start_frame=0 +animation/clip_79/end_frame=0 +animation/clip_79/loops=false +animation/clip_80/name="" +animation/clip_80/start_frame=0 +animation/clip_80/end_frame=0 +animation/clip_80/loops=false +animation/clip_81/name="" +animation/clip_81/start_frame=0 +animation/clip_81/end_frame=0 +animation/clip_81/loops=false +animation/clip_82/name="" +animation/clip_82/start_frame=0 +animation/clip_82/end_frame=0 +animation/clip_82/loops=false +animation/clip_83/name="" +animation/clip_83/start_frame=0 +animation/clip_83/end_frame=0 +animation/clip_83/loops=false +animation/clip_84/name="" +animation/clip_84/start_frame=0 +animation/clip_84/end_frame=0 +animation/clip_84/loops=false +animation/clip_85/name="" +animation/clip_85/start_frame=0 +animation/clip_85/end_frame=0 +animation/clip_85/loops=false +animation/clip_86/name="" +animation/clip_86/start_frame=0 +animation/clip_86/end_frame=0 +animation/clip_86/loops=false +animation/clip_87/name="" +animation/clip_87/start_frame=0 +animation/clip_87/end_frame=0 +animation/clip_87/loops=false +animation/clip_88/name="" +animation/clip_88/start_frame=0 +animation/clip_88/end_frame=0 +animation/clip_88/loops=false +animation/clip_89/name="" +animation/clip_89/start_frame=0 +animation/clip_89/end_frame=0 +animation/clip_89/loops=false +animation/clip_90/name="" +animation/clip_90/start_frame=0 +animation/clip_90/end_frame=0 +animation/clip_90/loops=false +animation/clip_91/name="" +animation/clip_91/start_frame=0 +animation/clip_91/end_frame=0 +animation/clip_91/loops=false +animation/clip_92/name="" +animation/clip_92/start_frame=0 +animation/clip_92/end_frame=0 +animation/clip_92/loops=false +animation/clip_93/name="" +animation/clip_93/start_frame=0 +animation/clip_93/end_frame=0 +animation/clip_93/loops=false +animation/clip_94/name="" +animation/clip_94/start_frame=0 +animation/clip_94/end_frame=0 +animation/clip_94/loops=false +animation/clip_95/name="" +animation/clip_95/start_frame=0 +animation/clip_95/end_frame=0 +animation/clip_95/loops=false +animation/clip_96/name="" +animation/clip_96/start_frame=0 +animation/clip_96/end_frame=0 +animation/clip_96/loops=false +animation/clip_97/name="" +animation/clip_97/start_frame=0 +animation/clip_97/end_frame=0 +animation/clip_97/loops=false +animation/clip_98/name="" +animation/clip_98/start_frame=0 +animation/clip_98/end_frame=0 +animation/clip_98/loops=false +animation/clip_99/name="" +animation/clip_99/start_frame=0 +animation/clip_99/end_frame=0 +animation/clip_99/loops=false +animation/clip_100/name="" +animation/clip_100/start_frame=0 +animation/clip_100/end_frame=0 +animation/clip_100/loops=false +animation/clip_101/name="" +animation/clip_101/start_frame=0 +animation/clip_101/end_frame=0 +animation/clip_101/loops=false +animation/clip_102/name="" +animation/clip_102/start_frame=0 +animation/clip_102/end_frame=0 +animation/clip_102/loops=false +animation/clip_103/name="" +animation/clip_103/start_frame=0 +animation/clip_103/end_frame=0 +animation/clip_103/loops=false +animation/clip_104/name="" +animation/clip_104/start_frame=0 +animation/clip_104/end_frame=0 +animation/clip_104/loops=false +animation/clip_105/name="" +animation/clip_105/start_frame=0 +animation/clip_105/end_frame=0 +animation/clip_105/loops=false +animation/clip_106/name="" +animation/clip_106/start_frame=0 +animation/clip_106/end_frame=0 +animation/clip_106/loops=false +animation/clip_107/name="" +animation/clip_107/start_frame=0 +animation/clip_107/end_frame=0 +animation/clip_107/loops=false +animation/clip_108/name="" +animation/clip_108/start_frame=0 +animation/clip_108/end_frame=0 +animation/clip_108/loops=false +animation/clip_109/name="" +animation/clip_109/start_frame=0 +animation/clip_109/end_frame=0 +animation/clip_109/loops=false +animation/clip_110/name="" +animation/clip_110/start_frame=0 +animation/clip_110/end_frame=0 +animation/clip_110/loops=false +animation/clip_111/name="" +animation/clip_111/start_frame=0 +animation/clip_111/end_frame=0 +animation/clip_111/loops=false +animation/clip_112/name="" +animation/clip_112/start_frame=0 +animation/clip_112/end_frame=0 +animation/clip_112/loops=false +animation/clip_113/name="" +animation/clip_113/start_frame=0 +animation/clip_113/end_frame=0 +animation/clip_113/loops=false +animation/clip_114/name="" +animation/clip_114/start_frame=0 +animation/clip_114/end_frame=0 +animation/clip_114/loops=false +animation/clip_115/name="" +animation/clip_115/start_frame=0 +animation/clip_115/end_frame=0 +animation/clip_115/loops=false +animation/clip_116/name="" +animation/clip_116/start_frame=0 +animation/clip_116/end_frame=0 +animation/clip_116/loops=false +animation/clip_117/name="" +animation/clip_117/start_frame=0 +animation/clip_117/end_frame=0 +animation/clip_117/loops=false +animation/clip_118/name="" +animation/clip_118/start_frame=0 +animation/clip_118/end_frame=0 +animation/clip_118/loops=false +animation/clip_119/name="" +animation/clip_119/start_frame=0 +animation/clip_119/end_frame=0 +animation/clip_119/loops=false +animation/clip_120/name="" +animation/clip_120/start_frame=0 +animation/clip_120/end_frame=0 +animation/clip_120/loops=false +animation/clip_121/name="" +animation/clip_121/start_frame=0 +animation/clip_121/end_frame=0 +animation/clip_121/loops=false +animation/clip_122/name="" +animation/clip_122/start_frame=0 +animation/clip_122/end_frame=0 +animation/clip_122/loops=false +animation/clip_123/name="" +animation/clip_123/start_frame=0 +animation/clip_123/end_frame=0 +animation/clip_123/loops=false +animation/clip_124/name="" +animation/clip_124/start_frame=0 +animation/clip_124/end_frame=0 +animation/clip_124/loops=false +animation/clip_125/name="" +animation/clip_125/start_frame=0 +animation/clip_125/end_frame=0 +animation/clip_125/loops=false +animation/clip_126/name="" +animation/clip_126/start_frame=0 +animation/clip_126/end_frame=0 +animation/clip_126/loops=false +animation/clip_127/name="" +animation/clip_127/start_frame=0 +animation/clip_127/end_frame=0 +animation/clip_127/loops=false +animation/clip_128/name="" +animation/clip_128/start_frame=0 +animation/clip_128/end_frame=0 +animation/clip_128/loops=false +animation/clip_129/name="" +animation/clip_129/start_frame=0 +animation/clip_129/end_frame=0 +animation/clip_129/loops=false +animation/clip_130/name="" +animation/clip_130/start_frame=0 +animation/clip_130/end_frame=0 +animation/clip_130/loops=false +animation/clip_131/name="" +animation/clip_131/start_frame=0 +animation/clip_131/end_frame=0 +animation/clip_131/loops=false +animation/clip_132/name="" +animation/clip_132/start_frame=0 +animation/clip_132/end_frame=0 +animation/clip_132/loops=false +animation/clip_133/name="" +animation/clip_133/start_frame=0 +animation/clip_133/end_frame=0 +animation/clip_133/loops=false +animation/clip_134/name="" +animation/clip_134/start_frame=0 +animation/clip_134/end_frame=0 +animation/clip_134/loops=false +animation/clip_135/name="" +animation/clip_135/start_frame=0 +animation/clip_135/end_frame=0 +animation/clip_135/loops=false +animation/clip_136/name="" +animation/clip_136/start_frame=0 +animation/clip_136/end_frame=0 +animation/clip_136/loops=false +animation/clip_137/name="" +animation/clip_137/start_frame=0 +animation/clip_137/end_frame=0 +animation/clip_137/loops=false +animation/clip_138/name="" +animation/clip_138/start_frame=0 +animation/clip_138/end_frame=0 +animation/clip_138/loops=false +animation/clip_139/name="" +animation/clip_139/start_frame=0 +animation/clip_139/end_frame=0 +animation/clip_139/loops=false +animation/clip_140/name="" +animation/clip_140/start_frame=0 +animation/clip_140/end_frame=0 +animation/clip_140/loops=false +animation/clip_141/name="" +animation/clip_141/start_frame=0 +animation/clip_141/end_frame=0 +animation/clip_141/loops=false +animation/clip_142/name="" +animation/clip_142/start_frame=0 +animation/clip_142/end_frame=0 +animation/clip_142/loops=false +animation/clip_143/name="" +animation/clip_143/start_frame=0 +animation/clip_143/end_frame=0 +animation/clip_143/loops=false +animation/clip_144/name="" +animation/clip_144/start_frame=0 +animation/clip_144/end_frame=0 +animation/clip_144/loops=false +animation/clip_145/name="" +animation/clip_145/start_frame=0 +animation/clip_145/end_frame=0 +animation/clip_145/loops=false +animation/clip_146/name="" +animation/clip_146/start_frame=0 +animation/clip_146/end_frame=0 +animation/clip_146/loops=false +animation/clip_147/name="" +animation/clip_147/start_frame=0 +animation/clip_147/end_frame=0 +animation/clip_147/loops=false +animation/clip_148/name="" +animation/clip_148/start_frame=0 +animation/clip_148/end_frame=0 +animation/clip_148/loops=false +animation/clip_149/name="" +animation/clip_149/start_frame=0 +animation/clip_149/end_frame=0 +animation/clip_149/loops=false +animation/clip_150/name="" +animation/clip_150/start_frame=0 +animation/clip_150/end_frame=0 +animation/clip_150/loops=false +animation/clip_151/name="" +animation/clip_151/start_frame=0 +animation/clip_151/end_frame=0 +animation/clip_151/loops=false +animation/clip_152/name="" +animation/clip_152/start_frame=0 +animation/clip_152/end_frame=0 +animation/clip_152/loops=false +animation/clip_153/name="" +animation/clip_153/start_frame=0 +animation/clip_153/end_frame=0 +animation/clip_153/loops=false +animation/clip_154/name="" +animation/clip_154/start_frame=0 +animation/clip_154/end_frame=0 +animation/clip_154/loops=false +animation/clip_155/name="" +animation/clip_155/start_frame=0 +animation/clip_155/end_frame=0 +animation/clip_155/loops=false +animation/clip_156/name="" +animation/clip_156/start_frame=0 +animation/clip_156/end_frame=0 +animation/clip_156/loops=false +animation/clip_157/name="" +animation/clip_157/start_frame=0 +animation/clip_157/end_frame=0 +animation/clip_157/loops=false +animation/clip_158/name="" +animation/clip_158/start_frame=0 +animation/clip_158/end_frame=0 +animation/clip_158/loops=false +animation/clip_159/name="" +animation/clip_159/start_frame=0 +animation/clip_159/end_frame=0 +animation/clip_159/loops=false +animation/clip_160/name="" +animation/clip_160/start_frame=0 +animation/clip_160/end_frame=0 +animation/clip_160/loops=false +animation/clip_161/name="" +animation/clip_161/start_frame=0 +animation/clip_161/end_frame=0 +animation/clip_161/loops=false +animation/clip_162/name="" +animation/clip_162/start_frame=0 +animation/clip_162/end_frame=0 +animation/clip_162/loops=false +animation/clip_163/name="" +animation/clip_163/start_frame=0 +animation/clip_163/end_frame=0 +animation/clip_163/loops=false +animation/clip_164/name="" +animation/clip_164/start_frame=0 +animation/clip_164/end_frame=0 +animation/clip_164/loops=false +animation/clip_165/name="" +animation/clip_165/start_frame=0 +animation/clip_165/end_frame=0 +animation/clip_165/loops=false +animation/clip_166/name="" +animation/clip_166/start_frame=0 +animation/clip_166/end_frame=0 +animation/clip_166/loops=false +animation/clip_167/name="" +animation/clip_167/start_frame=0 +animation/clip_167/end_frame=0 +animation/clip_167/loops=false +animation/clip_168/name="" +animation/clip_168/start_frame=0 +animation/clip_168/end_frame=0 +animation/clip_168/loops=false +animation/clip_169/name="" +animation/clip_169/start_frame=0 +animation/clip_169/end_frame=0 +animation/clip_169/loops=false +animation/clip_170/name="" +animation/clip_170/start_frame=0 +animation/clip_170/end_frame=0 +animation/clip_170/loops=false +animation/clip_171/name="" +animation/clip_171/start_frame=0 +animation/clip_171/end_frame=0 +animation/clip_171/loops=false +animation/clip_172/name="" +animation/clip_172/start_frame=0 +animation/clip_172/end_frame=0 +animation/clip_172/loops=false +animation/clip_173/name="" +animation/clip_173/start_frame=0 +animation/clip_173/end_frame=0 +animation/clip_173/loops=false +animation/clip_174/name="" +animation/clip_174/start_frame=0 +animation/clip_174/end_frame=0 +animation/clip_174/loops=false +animation/clip_175/name="" +animation/clip_175/start_frame=0 +animation/clip_175/end_frame=0 +animation/clip_175/loops=false +animation/clip_176/name="" +animation/clip_176/start_frame=0 +animation/clip_176/end_frame=0 +animation/clip_176/loops=false +animation/clip_177/name="" +animation/clip_177/start_frame=0 +animation/clip_177/end_frame=0 +animation/clip_177/loops=false +animation/clip_178/name="" +animation/clip_178/start_frame=0 +animation/clip_178/end_frame=0 +animation/clip_178/loops=false +animation/clip_179/name="" +animation/clip_179/start_frame=0 +animation/clip_179/end_frame=0 +animation/clip_179/loops=false +animation/clip_180/name="" +animation/clip_180/start_frame=0 +animation/clip_180/end_frame=0 +animation/clip_180/loops=false +animation/clip_181/name="" +animation/clip_181/start_frame=0 +animation/clip_181/end_frame=0 +animation/clip_181/loops=false +animation/clip_182/name="" +animation/clip_182/start_frame=0 +animation/clip_182/end_frame=0 +animation/clip_182/loops=false +animation/clip_183/name="" +animation/clip_183/start_frame=0 +animation/clip_183/end_frame=0 +animation/clip_183/loops=false +animation/clip_184/name="" +animation/clip_184/start_frame=0 +animation/clip_184/end_frame=0 +animation/clip_184/loops=false +animation/clip_185/name="" +animation/clip_185/start_frame=0 +animation/clip_185/end_frame=0 +animation/clip_185/loops=false +animation/clip_186/name="" +animation/clip_186/start_frame=0 +animation/clip_186/end_frame=0 +animation/clip_186/loops=false +animation/clip_187/name="" +animation/clip_187/start_frame=0 +animation/clip_187/end_frame=0 +animation/clip_187/loops=false +animation/clip_188/name="" +animation/clip_188/start_frame=0 +animation/clip_188/end_frame=0 +animation/clip_188/loops=false +animation/clip_189/name="" +animation/clip_189/start_frame=0 +animation/clip_189/end_frame=0 +animation/clip_189/loops=false +animation/clip_190/name="" +animation/clip_190/start_frame=0 +animation/clip_190/end_frame=0 +animation/clip_190/loops=false +animation/clip_191/name="" +animation/clip_191/start_frame=0 +animation/clip_191/end_frame=0 +animation/clip_191/loops=false +animation/clip_192/name="" +animation/clip_192/start_frame=0 +animation/clip_192/end_frame=0 +animation/clip_192/loops=false +animation/clip_193/name="" +animation/clip_193/start_frame=0 +animation/clip_193/end_frame=0 +animation/clip_193/loops=false +animation/clip_194/name="" +animation/clip_194/start_frame=0 +animation/clip_194/end_frame=0 +animation/clip_194/loops=false +animation/clip_195/name="" +animation/clip_195/start_frame=0 +animation/clip_195/end_frame=0 +animation/clip_195/loops=false +animation/clip_196/name="" +animation/clip_196/start_frame=0 +animation/clip_196/end_frame=0 +animation/clip_196/loops=false +animation/clip_197/name="" +animation/clip_197/start_frame=0 +animation/clip_197/end_frame=0 +animation/clip_197/loops=false +animation/clip_198/name="" +animation/clip_198/start_frame=0 +animation/clip_198/end_frame=0 +animation/clip_198/loops=false +animation/clip_199/name="" +animation/clip_199/start_frame=0 +animation/clip_199/end_frame=0 +animation/clip_199/loops=false +animation/clip_200/name="" +animation/clip_200/start_frame=0 +animation/clip_200/end_frame=0 +animation/clip_200/loops=false +animation/clip_201/name="" +animation/clip_201/start_frame=0 +animation/clip_201/end_frame=0 +animation/clip_201/loops=false +animation/clip_202/name="" +animation/clip_202/start_frame=0 +animation/clip_202/end_frame=0 +animation/clip_202/loops=false +animation/clip_203/name="" +animation/clip_203/start_frame=0 +animation/clip_203/end_frame=0 +animation/clip_203/loops=false +animation/clip_204/name="" +animation/clip_204/start_frame=0 +animation/clip_204/end_frame=0 +animation/clip_204/loops=false +animation/clip_205/name="" +animation/clip_205/start_frame=0 +animation/clip_205/end_frame=0 +animation/clip_205/loops=false +animation/clip_206/name="" +animation/clip_206/start_frame=0 +animation/clip_206/end_frame=0 +animation/clip_206/loops=false +animation/clip_207/name="" +animation/clip_207/start_frame=0 +animation/clip_207/end_frame=0 +animation/clip_207/loops=false +animation/clip_208/name="" +animation/clip_208/start_frame=0 +animation/clip_208/end_frame=0 +animation/clip_208/loops=false +animation/clip_209/name="" +animation/clip_209/start_frame=0 +animation/clip_209/end_frame=0 +animation/clip_209/loops=false +animation/clip_210/name="" +animation/clip_210/start_frame=0 +animation/clip_210/end_frame=0 +animation/clip_210/loops=false +animation/clip_211/name="" +animation/clip_211/start_frame=0 +animation/clip_211/end_frame=0 +animation/clip_211/loops=false +animation/clip_212/name="" +animation/clip_212/start_frame=0 +animation/clip_212/end_frame=0 +animation/clip_212/loops=false +animation/clip_213/name="" +animation/clip_213/start_frame=0 +animation/clip_213/end_frame=0 +animation/clip_213/loops=false +animation/clip_214/name="" +animation/clip_214/start_frame=0 +animation/clip_214/end_frame=0 +animation/clip_214/loops=false +animation/clip_215/name="" +animation/clip_215/start_frame=0 +animation/clip_215/end_frame=0 +animation/clip_215/loops=false +animation/clip_216/name="" +animation/clip_216/start_frame=0 +animation/clip_216/end_frame=0 +animation/clip_216/loops=false +animation/clip_217/name="" +animation/clip_217/start_frame=0 +animation/clip_217/end_frame=0 +animation/clip_217/loops=false +animation/clip_218/name="" +animation/clip_218/start_frame=0 +animation/clip_218/end_frame=0 +animation/clip_218/loops=false +animation/clip_219/name="" +animation/clip_219/start_frame=0 +animation/clip_219/end_frame=0 +animation/clip_219/loops=false +animation/clip_220/name="" +animation/clip_220/start_frame=0 +animation/clip_220/end_frame=0 +animation/clip_220/loops=false +animation/clip_221/name="" +animation/clip_221/start_frame=0 +animation/clip_221/end_frame=0 +animation/clip_221/loops=false +animation/clip_222/name="" +animation/clip_222/start_frame=0 +animation/clip_222/end_frame=0 +animation/clip_222/loops=false +animation/clip_223/name="" +animation/clip_223/start_frame=0 +animation/clip_223/end_frame=0 +animation/clip_223/loops=false +animation/clip_224/name="" +animation/clip_224/start_frame=0 +animation/clip_224/end_frame=0 +animation/clip_224/loops=false +animation/clip_225/name="" +animation/clip_225/start_frame=0 +animation/clip_225/end_frame=0 +animation/clip_225/loops=false +animation/clip_226/name="" +animation/clip_226/start_frame=0 +animation/clip_226/end_frame=0 +animation/clip_226/loops=false +animation/clip_227/name="" +animation/clip_227/start_frame=0 +animation/clip_227/end_frame=0 +animation/clip_227/loops=false +animation/clip_228/name="" +animation/clip_228/start_frame=0 +animation/clip_228/end_frame=0 +animation/clip_228/loops=false +animation/clip_229/name="" +animation/clip_229/start_frame=0 +animation/clip_229/end_frame=0 +animation/clip_229/loops=false +animation/clip_230/name="" +animation/clip_230/start_frame=0 +animation/clip_230/end_frame=0 +animation/clip_230/loops=false +animation/clip_231/name="" +animation/clip_231/start_frame=0 +animation/clip_231/end_frame=0 +animation/clip_231/loops=false +animation/clip_232/name="" +animation/clip_232/start_frame=0 +animation/clip_232/end_frame=0 +animation/clip_232/loops=false +animation/clip_233/name="" +animation/clip_233/start_frame=0 +animation/clip_233/end_frame=0 +animation/clip_233/loops=false +animation/clip_234/name="" +animation/clip_234/start_frame=0 +animation/clip_234/end_frame=0 +animation/clip_234/loops=false +animation/clip_235/name="" +animation/clip_235/start_frame=0 +animation/clip_235/end_frame=0 +animation/clip_235/loops=false +animation/clip_236/name="" +animation/clip_236/start_frame=0 +animation/clip_236/end_frame=0 +animation/clip_236/loops=false +animation/clip_237/name="" +animation/clip_237/start_frame=0 +animation/clip_237/end_frame=0 +animation/clip_237/loops=false +animation/clip_238/name="" +animation/clip_238/start_frame=0 +animation/clip_238/end_frame=0 +animation/clip_238/loops=false +animation/clip_239/name="" +animation/clip_239/start_frame=0 +animation/clip_239/end_frame=0 +animation/clip_239/loops=false +animation/clip_240/name="" +animation/clip_240/start_frame=0 +animation/clip_240/end_frame=0 +animation/clip_240/loops=false +animation/clip_241/name="" +animation/clip_241/start_frame=0 +animation/clip_241/end_frame=0 +animation/clip_241/loops=false +animation/clip_242/name="" +animation/clip_242/start_frame=0 +animation/clip_242/end_frame=0 +animation/clip_242/loops=false +animation/clip_243/name="" +animation/clip_243/start_frame=0 +animation/clip_243/end_frame=0 +animation/clip_243/loops=false +animation/clip_244/name="" +animation/clip_244/start_frame=0 +animation/clip_244/end_frame=0 +animation/clip_244/loops=false +animation/clip_245/name="" +animation/clip_245/start_frame=0 +animation/clip_245/end_frame=0 +animation/clip_245/loops=false +animation/clip_246/name="" +animation/clip_246/start_frame=0 +animation/clip_246/end_frame=0 +animation/clip_246/loops=false +animation/clip_247/name="" +animation/clip_247/start_frame=0 +animation/clip_247/end_frame=0 +animation/clip_247/loops=false +animation/clip_248/name="" +animation/clip_248/start_frame=0 +animation/clip_248/end_frame=0 +animation/clip_248/loops=false +animation/clip_249/name="" +animation/clip_249/start_frame=0 +animation/clip_249/end_frame=0 +animation/clip_249/loops=false +animation/clip_250/name="" +animation/clip_250/start_frame=0 +animation/clip_250/end_frame=0 +animation/clip_250/loops=false +animation/clip_251/name="" +animation/clip_251/start_frame=0 +animation/clip_251/end_frame=0 +animation/clip_251/loops=false +animation/clip_252/name="" +animation/clip_252/start_frame=0 +animation/clip_252/end_frame=0 +animation/clip_252/loops=false +animation/clip_253/name="" +animation/clip_253/start_frame=0 +animation/clip_253/end_frame=0 +animation/clip_253/loops=false +animation/clip_254/name="" +animation/clip_254/start_frame=0 +animation/clip_254/end_frame=0 +animation/clip_254/loops=false +animation/clip_255/name="" +animation/clip_255/start_frame=0 +animation/clip_255/end_frame=0 +animation/clip_255/loops=false +animation/clip_256/name="" +animation/clip_256/start_frame=0 +animation/clip_256/end_frame=0 +animation/clip_256/loops=false diff --git a/entities/environment/birchtree/Black.material b/entities/environment/birchtree/Black.material new file mode 100644 index 0000000000000000000000000000000000000000..3769ec956be03219a858cbcea8ac421138cb1c29 GIT binary patch literal 1684 zcmbtV$&M5;3=O;3_ho?L#EAnfMw~dzNO0yd^8t}NadkzLN=i<88BSdIZ|qccdgDe( zQOeKGi(@;^`NjDUHGVgEzQsf4Cp<2C$PWBZ$Vfah@_*kcFMq>>FvU3;)IJ*UI!B!h z22_u>bpbjoUJwS0qmE{4&sb_a%#zLoA@#uKS-r35JfTi4*tnE^ zVh=_*9&hwPv}o0<3N4T_uC#ZvHoGuWFRCU)ZL!a-&X}@#S#jB0HmJQC5>C59n3e*f}f&|%)Zi1lmI1~P1SK-#JUi(CN$_4>vN^8(^{8c>QO^C zbsUG`3|j;k(wtD6NX(I$j5_dX%i%2#x?~&mj`tqpVWN+u<*1PKU{^x0qjqWVSz^Yy zfG%n4nnqT2(PCLJ;;Bb7_dtU}@;EB^0KpEZ#A`&^)(_z84LD@O5-bl`ybGw8&gQn% z$jGvnrS*=^`)LFkca?-3Xf6?Zu2b-+9&Ge8ic590kxO`d-vXPulp?8ztQ@0SB3No~ z6XwkMPHK6ZQz7lXzim1T?jL)}zJ;z6#fvgFcu1TqnFMV~VY!KIif_E#0YFL11)^nf9& z>kXx2r1_K!w~_c~ZbsEwu3)+M`(Dasgbjho`_5YqwDXlh+R1$JWlXJjBT{Udgt>Gi z5jQtjyxBpdyHHkJ;-7`17&-!U^vBJYXFA9zS(I6D4wx*kgXKKsbnO&V!Z literal 0 HcmV?d00001 diff --git a/entities/environment/birchtree/DarkGreen.material b/entities/environment/birchtree/DarkGreen.material new file mode 100644 index 0000000000000000000000000000000000000000..919631adf6026f54d527eca7e66aa1e10765021e GIT binary patch literal 1692 zcmbtV$&M5;3=O;3_ib2CoTtT{fWyoIB)D)HPMjil#nlx}Dk(YXWjG=J27ZOV;7hPm z)#>UUZj=e63>kM-*?E%pYR}zVNMll z7b6patsV3!)5Fede|;Ic^`GaZvC9yy;Pi*MPFE>%qqxu+N4eSe{{V z)}vlplbT#31Itd9);n6~rU7W!RT6SWbAs4$oq|JkW22u@SgNNRIfut}4X~+=F_5~+ z$|0&bg1PoKVNRS6b(L*eOyHcYvbSqNuY;5;r=VOQd7W&$3+k!?@6qLZLSa5@JP!Ay zNK#>$V2=sTpoKxAk1Zd=2CvaeWtr@LUpEDkc#v(2EV-;40#yN0LGLpP-o}t9bf*Qr zE^sKK^ngCA>kXx2#QBs9x0d)PZbrpgu3*0RyI#s>gf&5xcAYmIXzL1vw3GSb^^jWe zMx;>J5mW9+B5rQ5c(a8_ccCuFxTiYUqB_{7Iygf$LPk{5jXDY|+j6_oHFv1NVI?Qy zYo5S!f5?h_v2qyWsjvEraD}a6#eFC7k5cD&yy3x}_uXW|oxvuHk$)DJf^Qj^Of6MS zBE-oDpp%dMgH{eC?~2GTc}RnJ`{&2ur=PzL WfA4+er{Vk2E5|-=)7rCh|%E literal 0 HcmV?d00001 diff --git a/entities/environment/birchtree/Green.material b/entities/environment/birchtree/Green.material new file mode 100644 index 0000000000000000000000000000000000000000..d00aea80f03ae290b3c360eb2f02995ed5640264 GIT binary patch literal 1684 zcmbtVxsnty3^jLg-}gd9M8FhVL z9}Re&qfQ0`s$1K-038-D2!ln^J-J9OpQ>wY6>ybx4=Jg8EHxfxNoRtPdSLUc4k|iN zs8b6zE@hwCgAtC~8+{NhTJ@+x3#5!I?cJ=+F3i+}stHkB>~pI#rmP-TTsG;W3t1=k z6}PCCk-TNkT<;+Osk?Pa<5p+~^Nq9Mr)VRyuXGb7K#68k^`b6fU5Hr|8gz^Gxzg5Y ztxGWVsG*xWj>B+J=EzJ&9r(26@RkQ%vWi7m$Y?FBdfY-u`C$z)T5bupg|#d92IcF4fbGT*Bk~7TDCK6iMA= z^kX7Jvb;_X_{>mZfNsVEmnStlFsgW9wZ0{U`KD9&eX!110` zNh+)mJY#}0Xl0P-W5>sEF=z}@S+=-8)J=sX9^|?zOD>H^AQK^1^gg2yT#A`ue_G+| z0>>&!4;Zq#-cUM5noqfK8;O7BW>l@^3YL4n@1<-;*btb!@4V$eJ6|cJoy-?+$JB~9 zBE_ajm`g_zadU&kn;k^D3-u+&1J&UU)!{DH;TfteWQ$6=QBQH@I&N3G;SM!AtmI^T z%`*h<4@FTfRtaM|4Q99qSJ)~U?mL^cLsUy>7 zLY#c$pYWzzcm3Cwh2h^Xg1i>OEwh-FrKMKSj~Y3MyeA^Rsk*{e0oPf#kdnH?QsrTubS4O?1vby>>3}X0 z>QsY`E7>QuV1(o5Rv$!*R^1<e;Y}bs=U=XwWS;=Sri~ zT9;tvQA0Cx9Ea`ty47P@5V;Kws_&#l^f1*x!>u zk_syXkD1^A9T+6~*zhr23>t$}mM!jgbu&N`4|2^QOD>H^AQK@E=nGi5w|y3yxBpdyHHzV+)*9xP#y159UoAQkP(%1qn6^@HQcUr#T}}5Sjoxw znr8^yABv(}tP;j_8ccT)F0oZI+;=knD0PO%TOQnb-%Tdm8C-Ul_-E-ThK7O3%#o=x zAx^&5F5~NF)Ae6n6o!Al2=ZD8x6EQzmX=yQ+iT 0: + # var num = rng.randi_range(0, 20) + # if num == 2: + # var tree = treescene.instance() + # tree.translation = Vector3(points[i].x, points_data[i].elevation * terrace_height, points[i].y) + + # add_child(tree) diff --git a/world/game.tscn b/world/game.tscn index c142434..30a9446 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -38,14 +38,16 @@ environment = ExtResource( 3 ) [node name="CamBase" parent="World" instance=ExtResource( 5 )] [node name="Camera" parent="World/CamBase" index="0"] +transform = Transform( 1, 0, 0, 0, 0.910272, -0.41401, 0, 0.41401, 0.910272, 0, -1.90735e-06, 6.618 ) movement_speed = 48.076 min_zoom = 10.0 zoom_sensibility = 1.436 rotation_sensibility = 3.0 [node name="DirectionalLight" type="DirectionalLight" parent="World"] -transform = Transform( 1, 0, 0, 0, 0.41636, 0.9092, 0, -0.9092, 0.41636, 0, 1.41623, 0 ) +transform = Transform( 1, 0, 0, 0, 0.512597, 0.858629, 0, -0.858629, 0.512597, 0, 1.41623, 0 ) light_energy = 0.1 +shadow_enabled = true [connection signal="world_loaded" from="." to="UI/Map" method="_on_Game_world_loaded"] [connection signal="world_loaded" from="." to="World" method="_on_Game_world_loaded"] From a6c9f527b6598434b280873b568fd0562a6ffa64 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Wed, 17 Aug 2022 23:49:37 +0200 Subject: [PATCH 07/10] changes to rivers --- world/World.gd | 52 +++++++++++++++++++++++++++++--------------------- world/game.gd | 5 +++-- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/world/World.gd b/world/World.gd index cf9299f..e4ab1d1 100644 --- a/world/World.gd +++ b/world/World.gd @@ -7,28 +7,36 @@ func _ready(): func draw_world(): - var st = SurfaceTool.new() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - st.add_smooth_group(true) - for triangle in terrain.get_triangles(): - for point in triangle.points(): - st.add_vertex(point.point3d() * Vector3(1, 24*5, 1)) - - st.generate_normals() - # st.generate_tangents() - st.index() - # Commit to a mesh. - var mesh = st.commit() - - var mi = MeshInstance.new() - mi.mesh = mesh - var material = load("res://world/world.material") - mi.set_surface_material(0, material) - mi.create_trimesh_collision() - mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON - print(mi) - add_child(mi) + for i in range(0, 1, 1): + print(i) + var st = SurfaceTool.new() + + st.begin(Mesh.PRIMITIVE_TRIANGLES) + st.add_smooth_group(true) + for triangle in terrain.get_triangles(): + for point in triangle.points(): + var factor = Vector3(1, 24*5, 1) + if point.get_data("river") and i == 0: + factor.y -= 0 + if i == 1: + factor.y -= 2.0 + st.add_vertex(point.point3d() * factor) + + st.generate_normals() + # st.generate_tangents() + st.index() + # Commit to a mesh. + var mesh = st.commit() + + var mi = MeshInstance.new() + mi.mesh = mesh + if i == 0: + var material = load("res://world/world.material") + mi.set_surface_material(0, material) + mi.create_trimesh_collision() + mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON + print(mi) + add_child(mi) func _on_Game_world_loaded(game_terrain): terrain = game_terrain diff --git a/world/game.gd b/world/game.gd index 18e5f19..44adba1 100644 --- a/world/game.gd +++ b/world/game.gd @@ -4,14 +4,14 @@ signal world_loaded export(int) var width = 2000 export(int) var height = 2000 -export(int) var spacing = 20 +export(int) var spacing = 5 export(int, 1, 9) var octaves = 5 export(int, 1, 30) var wavelength = 8 export(int) var border_width = 200 export(int) var terraces = 24 export(int) var terrace_height = 5 export(float) var mountain_height = 6.0 / 24.0 -export(int) var river_proba = 100 +export(int) var river_proba = 200 var rng = RandomNumberGenerator.new() var noise = OpenSimplexNoise.new() @@ -100,6 +100,7 @@ func set_river_path(point): path.append(point.get_index()) for index in path: terrain.get_point(index).set_data("river", true) + terrain.get_point(index).set_data("water", true) # Point From 17f74d9b1331c7ed9d80c0a796f62166d8068fc1 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Wed, 17 Aug 2022 23:58:47 +0200 Subject: [PATCH 08/10] merge from main --- world/game.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/world/game.gd b/world/game.gd index 6f1e6aa..5a59c44 100644 --- a/world/game.gd +++ b/world/game.gd @@ -36,6 +36,7 @@ func _ready(): if terrain.is_created() or terrain.is_loaded(): init_data() + add_trees() emit_signal("world_loaded", terrain) else: Global.print_debug("Pas de terrain, pas de construction ...") From 117ef363002df5bac178d7414b2a66fd6c62bab9 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Thu, 18 Aug 2022 00:49:04 +0200 Subject: [PATCH 09/10] terraces --- utils/Global.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/Global.gd b/utils/Global.gd index 6ce19df..59cc6a7 100644 --- a/utils/Global.gd +++ b/utils/Global.gd @@ -1,6 +1,7 @@ extends Node var debug = true +var terrain # Debuging messages func print_debug(message): From efccecdb2ccf8d6d346e0b8d73945ce12c351581 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Thu, 18 Aug 2022 00:49:13 +0200 Subject: [PATCH 10/10] terraces --- world/World.gd | 59 +++++++++++++++++++++++++------------------------- world/game.gd | 6 ++--- 2 files changed, 32 insertions(+), 33 deletions(-) diff --git a/world/World.gd b/world/World.gd index e4ab1d1..a3f2520 100644 --- a/world/World.gd +++ b/world/World.gd @@ -7,36 +7,35 @@ func _ready(): func draw_world(): - for i in range(0, 1, 1): - print(i) - var st = SurfaceTool.new() - - st.begin(Mesh.PRIMITIVE_TRIANGLES) - st.add_smooth_group(true) - for triangle in terrain.get_triangles(): - for point in triangle.points(): - var factor = Vector3(1, 24*5, 1) - if point.get_data("river") and i == 0: - factor.y -= 0 - if i == 1: - factor.y -= 2.0 - st.add_vertex(point.point3d() * factor) - - st.generate_normals() - # st.generate_tangents() - st.index() - # Commit to a mesh. - var mesh = st.commit() - - var mi = MeshInstance.new() - mi.mesh = mesh - if i == 0: - var material = load("res://world/world.material") - mi.set_surface_material(0, material) - mi.create_trimesh_collision() - mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON - print(mi) - add_child(mi) + # for i in range(0, 1, 1): + # print(i) + var st = SurfaceTool.new() + + st.begin(Mesh.PRIMITIVE_TRIANGLES) + st.add_smooth_group(true) + for triangle in terrain.get_triangles(): + for point in triangle.points(): + var factor = Vector3(1, 24*5, 1) + # if point.get_data("river") and i == 0: + # factor.y -= 0 + # if i == 1: + # factor.y -= 2.0 + st.add_vertex(point.point3d() * factor) + + st.generate_normals() + # st.generate_tangents() + st.index() + # Commit to a mesh. + var mesh = st.commit() + + var mi = MeshInstance.new() + mi.mesh = mesh + var material = load("res://world/world.material") + mi.set_surface_material(0, material) + mi.create_trimesh_collision() + mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON + print(mi) + add_child(mi) func _on_Game_world_loaded(game_terrain): terrain = game_terrain diff --git a/world/game.gd b/world/game.gd index 5a59c44..5492cf2 100644 --- a/world/game.gd +++ b/world/game.gd @@ -24,7 +24,7 @@ func _ready(): noise.octaves = octaves # terrain = Terrain.new(width,height,spacing,false) - var terrain_name="bonjour" + var terrain_name="bonjourazeazea" terrain = Terrain.new() print(terrain.list()) @@ -48,7 +48,7 @@ func init_data(): point.set_elevation(point_find_elevation(point.point2d())) point.set_data("water", point_is_water(point)) point.set_data("mountain", point_is_mountain(point)) - point.set_data("river", point_is_river(point)) + # point.set_data("river", point_is_river(point)) fill_oceans() @@ -141,7 +141,7 @@ func point_find_elevation(point): elevation = min(elevation, 1) - # elevation = round(elevation * terraces) / terraces + elevation = round(elevation * terraces) / terraces return elevation func point_is_water(point):