commit 3d97573449792602c63041ed6bc313d8cf937e9e Author: Marc Gilleron Date: Wed Apr 27 01:55:07 2016 +0200 Added project diff --git a/Simplex.gd b/Simplex.gd new file mode 100644 index 0000000..78612e0 --- /dev/null +++ b/Simplex.gd @@ -0,0 +1,247 @@ +#Copyright (c) 2015 OvermindDL1 +# +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: +# +#The above copyright notice and this permission notice shall be included in all +#copies or substantial portions of the Software. +# +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +#SOFTWARE. +# +#OvermindDL1 would love to receive updates, fixes, and more to this code, +#though it is not required: https://github.com/OvermindDL1/Godot-Helpers + +## Testing only +#extends SceneTree + +#const F2 = 0.5 * (sqrt(3.0) - 1.0) +#const G2 = (3.0 - sqrt(3.0)) / 6.0 +#const G2o = G2*2.0 - 1.0 +#const F3 = (1.0 / 3.0) +#const G3 = (1.0 / 6.0) +#const F2 = 0.3660254037844385965883020617184229195117950439453125 +#const G2 = 0.2113248654051871344705659794271923601627349853515625 +#const G2o = -0.577350269189625731058868041145615279674530029296875 +#const F3 = 0.333333333333333314829616256247390992939472198486328125 +#const G3 = 0.1666666666666666574148081281236954964697360992431640625 +const F2 = 0.36602540378443860 +const G2 = 0.21132486540518714 +const G2o = -0.577350269189626 +const F3 = 0.33333333333333333 +const G3 = 0.16666666666666666 + +const GRAD3 = [ + 1,1,0, -1,1,0, 1,-1,0, -1,-1,0, + 1,0,1, -1,0,1, 1,0,-1, -1,0,-1, + 0,1,1, 0,-1,1, 0,1,-1, 0,-1,-1, + 1,0,-1, -1,0,-1, 0,-1,1, 0,1,1, + ] + +const GRAD4 = [ + 0,1,1,1, 0,1,1,-1, 0,1,-1,1, 0,1,-1,-1, + 0,-1,1,1, 0,-1,1,-1, 0,-1,-1,1, 0,-1,-1,-1, + 1,0,1,1, 1,0,1,-1, 1,0,-1,1, 1,0,-1,-1, + -1,0,1,1, -1,0,1,-1, -1,0,-1,1, -1,0,-1,-1, + 1,1,0,1, 1,1,0,-1, 1,-1,0,1, 1,-1,0,-1, + -1,1,0,1, -1,1,0,-1, -1,-1,0,1, -1,-1,0,-1, + 1,1,1,0, 1,1,-1,0, 1,-1,1,0, 1,-1,-1,0, + -1,1,1,0, -1,1,-1,0, -1,-1,1,0, -1,-1,-1,0, + ] + +const PERM = [ + 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, + 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, + 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, + 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, + 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, + 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, + 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, + 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, + 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, + 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, + 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, + 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, + 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, + 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, + 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, + 141, 128, 195, 78, 66, 215, 61, 156, 180, 151, 160, 137, 91, 90, 15, 131, + 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, + 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, + 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, + 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, + 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, + 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, + 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, + 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, + 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, + 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, + 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, + 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, + 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, + 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, + 05, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, + 180, + ] + +static func simplex2(c0, c1): + var s = (c0+c1) * 0.36602540378443860 + var a0 = floor(c0+s) + var a1 = floor(c1+s) + var t = (a0+a1) * 0.21132486540518714 + + var n0 = 0.0 + var n1 = 0.0 + var n2 = 0.0 + + var p00 = c0-(a0-t) + var p01 = 0.0 + var p02 = 0.0 + var p10 = c1-(a1-t) + var p11 = 0.0 + var p12 = 0.0 + + # Current gdscript casts false to 0 and true to 1 + var b0 = int(p00 > p10) + var b1 = int(p00 <= p10) + + p01 = p00 - b0 + 0.21132486540518714 + p11 = p10 - b1 + 0.21132486540518714 + p02 = p00 + -0.577350269189626 + p12 = p10 + -0.577350269189626 + + var A0 = int(a0)&255 + var A1 = int(a1)&255 + var g0 = (PERM[A0 + PERM[A1]] % 12) * 3 + var g1 = (PERM[A0 + b0 + PERM[A1 + b1]] % 12) * 3 + var g2 = (PERM[A0 + 1 + PERM[A1 + 1]] % 12) * 3 + + var f0 = 0.5 - p00*p00 - p10*p10 + var f1 = 0.5 - p01*p01 - p11*p11 + var f2 = 0.5 - p02*p02 - p12*p12 + + if f0 > 0: + #n0 = f0*f0*f0*f0 * (GRAD3[g0]*p00 + GRAD3[g0]*p10) + n0 = f0*f0*f0*f0 * (GRAD3[g0]*p00 + GRAD3[g0 + 1]*p10) + if f1 > 0: + #n1 = f1*f1*f1*f1 * (GRAD3[g1 + 1]*p01 + GRAD3[g1 + 1]*p11) + n1 = f1*f1*f1*f1 * (GRAD3[g1]*p01 + GRAD3[g1 + 1]*p11) + if f2 > 0: + #n2 = f2*f2*f2*f2 * (GRAD3[g2 + 2]*p02 + GRAD3[g2 + 2]*p12) + n2 = f2*f2*f2*f2 * (GRAD3[g2]*p02 + GRAD3[g2 + 1]*p12) + + return (n0 + n1 + n2) * 70.0 + + +static func simplex3(c0, c1, c2): + var s = (c0+c1+c2) * 0.33333333333333333 + var a0 = floor(c0+s) + var a1 = floor(c1+s) + var a2 = floor(c2+s) + var t = (a0+a1+a2) * 0.16666666666666666 + + var n00 = 0 + var n01 = 0 + var n02 = 0 + var n10 = 0 + var n11 = 0 + var n12 = 0 + + var p00 = c0-(a0-t) + var p01 = c1-(a1-t) + var p02 = c2-(a2-t) + + if p00 >= p01: + if p01 >= p02: + n00 = 1 + n10 = 1 + n11 = 1 + elif p00 >= p02: + n00 = 1 + n10 = 1 + n12 = 1 + else: + n02 = 1 + n10 = 1 + n12 = 1 + else: + if p01 < p02: + n02 = 1 + n11 = 1 + n12 = 1 + elif p00 < p02: + n01 = 1 + n11 = 1 + n12 = 1 + else: + n01 = 1 + n10 = 1 + n11 = 1 + + var p10 = p00 - 1.0 + 0.5 + var p20 = p00 - n10 + 0.33333333333333333 + var p30 = p00 - n00 + 0.16666666666666666 + var p11 = p01 - 1.0 + 0.5 + var p21 = p01 - n11 + 0.33333333333333333 + var p31 = p01 - n01 + 0.16666666666666666 + var p12 = p02 - 1.0 + 0.5 + var p22 = p02 - n12 + 0.33333333333333333 + var p32 = p02 - n02 + 0.16666666666666666 + + var A0 = int(a0)&255 + var A1 = int(a1)&255 + var A2 = int(a2)&255 + var g0 = (PERM[A0 + PERM[A2]] % 12) * 3 + var g1 = (PERM[A0 + n00 + PERM[A1 + n01 + PERM[n02 + A2]]] % 12) * 3 + var g2 = (PERM[A0 + n10 + PERM[A1 + n11 + PERM[n12 + A2]]] % 12) * 3 + var g3 = (PERM[A0 + 1 + PERM[A1 + 1 + PERM[A2 + 1]]] % 12) * 3 + + var f0 = 0.6 - p00*p00 - p01*p01 - p02*p02 + var f1 = 0.6 - p10*p10 - p11*p11 - p12*p12 + var f2 = 0.6 - p20*p20 - p21*p21 - p22*p22 + var f3 = 0.6 - p30*p30 - p31*p31 - p32*p32 + + var n0 = 0.0 + var n1 = 0.0 + var n2 = 0.0 + var n3 = 0.0 + if f0 > 0: + n0 = f0*f0*f0*f0 * (p00*GRAD3[g0] + p01*GRAD3[g0+1] + p02*GRAD3[g0+2]) + if f1 > 0: + n1 = f1*f1*f1*f1 * (p10*GRAD3[g1] + p11*GRAD3[g1+1] + p12*GRAD3[g1+2]) + if f2 > 0: + n2 = f2*f2*f2*f2 * (p20*GRAD3[g2] + p21*GRAD3[g2+1] + p22*GRAD3[g2+2]) + if f3 > 0: + n3 = f3*f3*f3*f3 * (p30*GRAD3[g3] + p31*GRAD3[g3+1] + p32*GRAD3[g3+2]) + + return (n0 + n1 + n2 + n3) * 32.0 + + +## Testing only +#func _init(): +# var c = 1000000 +# print("Preloading data into active memory") +# for a in range(c/100): +# simplex2(c, c) +# +# print("Testing simplex2...") +# var t = OS.get_unix_time() +# for a in range(c): +# simplex2(c, c) +# print ("Testing of simplex2 with "+str(c)+" iterations took "+str(OS.get_unix_time()-t)+" seconds.") +# +# print("Testing simplex3...") +# t = OS.get_unix_time() +# for a in range(c): +# simplex3(c, c, c) +# print ("Testing of simplex3 with "+str(c)+" iterations took "+str(OS.get_unix_time()-t)+" seconds.") +# quit() diff --git a/block.gd b/block.gd new file mode 100644 index 0000000..d97801f --- /dev/null +++ b/block.gd @@ -0,0 +1,53 @@ + +extends MeshInstance + + +var voxel_map = null + +var _normal_material = null +var _spawn_material = null +var _normal_pos = Vector3(0,0,0) +var _anim_time = 0 + + +func _ready(): + pass + + +func spawn(): +# _spawn_material = FixedMaterial.new() +# _spawn_material.set_texture(FixedMaterial.PARAM_DIFFUSE, voxel_map.material.get_texture(FixedMaterial.PARAM_DIFFUSE)) +# _spawn_material.set_parameter(FixedMaterial.PARAM_DIFFUSE, Color(1,1,1,0.5)) +# _spawn_material.set_flag(FixedMaterial.FLAG_USE_ALPHA, true) + #_spawn_material.set_blend_mode(Material.BLEND_MODE_MIX) + #set_material_override(_spawn_material) + #set_material_override(voxel_map.material) + _normal_pos = get_translation() + set_process(true) + + +func _process(delta): + _anim_time += delta + var k = _anim_time + if k < 1.0: + var pos = _normal_pos + pos.y -= (1-k)*(1-k) * 64.0 + set_translation(pos) + else: + set_translation(_normal_pos) + set_process(false) + +# var color = _spawn_material.get_parameter(FixedMaterial.PARAM_DIFFUSE) +# if color.a < 1.0: +# color.a += (0.1*delta) +# if color.a >= 1.0: +# set_material_override(voxel_map.material) +# set_process(false) +# _spawn_material = null +# else: +# color.r = color.a +# color.g = color.a +# color.b = color.a +# _spawn_material.set_parameter(FixedMaterial.PARAM_DIFFUSE, color) + + diff --git a/block.tscn b/block.tscn new file mode 100644 index 0000000..a6f8d60 --- /dev/null +++ b/block.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=2 format=1] + +[ext_resource path="res://block.gd" type="Script" id=1] + +[node name="Block" type="MeshInstance"] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +layers = 1 +geometry/visible = true +geometry/material_override = null +geometry/cast_shadow = true +geometry/receive_shadows = true +geometry/range_begin = 0.0 +geometry/range_end = 0.0 +geometry/extra_cull_margin = 0.0 +geometry/billboard = false +geometry/billboard_y = false +geometry/depth_scale = false +geometry/visible_in_all_rooms = false +geometry/use_baked_light = false +geometry/baked_light_tex_id = 0 +mesh/mesh = null +mesh/skeleton = NodePath("..") +script/script = ExtResource( 1 ) + + diff --git a/chunk.gd b/chunk.gd new file mode 100644 index 0000000..e23cfef --- /dev/null +++ b/chunk.gd @@ -0,0 +1,14 @@ + +extends Node + + +var chunk_position = Vector2(0,0) +var voxel_map = null + +var _blocks = [] + + +func _ready(): + pass + + diff --git a/chunk.tscn b/chunk.tscn new file mode 100644 index 0000000..d27a0dd --- /dev/null +++ b/chunk.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=2 format=1] + +[ext_resource path="res://chunk.gd" type="Script" id=1] + +[node name="Node" type="Node"] + +script/script = ExtResource( 1 ) + + diff --git a/debug_camera.gd b/debug_camera.gd new file mode 100644 index 0000000..e5e9508 --- /dev/null +++ b/debug_camera.gd @@ -0,0 +1,80 @@ + +extends Camera + + +export var sensitivity = 0.4 +export var min_angle = -90 +export var max_angle = 90 +export var speed = 10.0 +export var capture_mouse = true + +var _yaw = 0 +var _pitch = 0 +var _forward = Vector3(0,0,0) + + +func _ready(): + if capture_mouse: + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + set_process(true) + set_process_input(true) + +func _process(delta): + var motor = Vector3(0,0,0) + + var forward = get_transform().basis * Vector3(0,0,-1) + var right = get_transform().basis * Vector3(1,0,0) + var up = Vector3(0,1,0) + + if abs(forward.y) < 1.0: + _forward = Vector3(forward.x, 0, forward.z).normalized() + + if Input.is_key_pressed(KEY_Z): + motor += _forward + if Input.is_key_pressed(KEY_S): + motor -= _forward + if Input.is_key_pressed(KEY_Q): + motor -= right + if Input.is_key_pressed(KEY_D): + motor += right + if Input.is_key_pressed(KEY_SPACE): + motor += up + if Input.is_key_pressed(KEY_SHIFT): + motor -= up + + set_translation(get_translation() + motor * (delta * speed)) + + +func _input(event): + if event.type == InputEvent.MOUSE_BUTTON: + if event.pressed and Input.get_mouse_mode() != Input.MOUSE_MODE_CAPTURED: + if capture_mouse: + # Capture the mouse + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + + elif event.type == InputEvent.MOUSE_MOTION: + if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED || not capture_mouse: + # Get mouse delta + var motion = event.relative_pos + + # Add to rotations + _yaw -= motion.x * sensitivity + _pitch += motion.y * sensitivity + + # Clamp pitch + var e = 0.001 + if _pitch > max_angle-e: + _pitch = max_angle-e + elif _pitch < min_angle+e: + _pitch = min_angle+e + + # Apply rotations + set_rotation(Vector3(0, deg2rad(_yaw), 0)) + rotate_x(deg2rad(_pitch)) + + elif event.type == InputEvent.KEY: + if event.pressed and event.scancode == KEY_ESCAPE: + # Get the mouse back + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + + diff --git a/engine.cfg b/engine.cfg new file mode 100644 index 0000000..da91eb7 --- /dev/null +++ b/engine.cfg @@ -0,0 +1,19 @@ +[application] + +name="SurfaceTool" +main_scene="res://new_scene.tscn" +target_fps=60 +icon="res://icon.png" + +[debug] + +print_fps=false + +[rasterizer] + +shadow_filter=3 +trilinear_mipmap_filter=true + +[render] + +default_clear_color=#ff2e2e2e diff --git a/export.cfg b/export.cfg new file mode 100644 index 0000000..158cdf4 --- /dev/null +++ b/export.cfg @@ -0,0 +1,276 @@ +[convert_images] + +action="none" +compress_quality=0.7 +formats="png" +shrink=1.0 + +[convert_samples] + +action="none" +max_hz=44100 +trim=false + +[convert_scenes] + +convert_text_scenes=true + +[export_filter] + +filter="" +filter_exclude="" +type="resources" + +[platform:Android] + +apk_expansion/SALT="" +apk_expansion/enable=false +apk_expansion/public_key="" +architecture/arm=true +architecture/x86=false +command_line/extra_args="" +custom_package/debug="" +custom_package/release="" +keystore/release="" +keystore/release_password="" +keystore/release_user="" +one_click_deploy/clear_previous_install=true +package/icon="" +package/name="" +package/signed=true +package/unique_name="org.godotengine.$genname" +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false +screen/immersive_mode=true +screen/orientation=0 +screen/support_large=true +screen/support_normal=true +screen/support_small=true +screen/support_xlarge=true +screen/use_32_bits_view=true +user_permissions/0="" +user_permissions/1="" +user_permissions/10="" +user_permissions/11="" +user_permissions/12="" +user_permissions/13="" +user_permissions/14="" +user_permissions/15="" +user_permissions/16="" +user_permissions/17="" +user_permissions/18="" +user_permissions/19="" +user_permissions/2="" +user_permissions/3="" +user_permissions/4="" +user_permissions/5="" +user_permissions/6="" +user_permissions/7="" +user_permissions/8="" +user_permissions/9="" +version/code=1 +version/name="1.0" + +[platform:BlackBerry 10] + +package/category="core.games" +package/custom_template="" +package/description="Game made with Godot Engine" +package/icon="" +package/name="" +package/unique_name="com.godot.noname" +release/author="Cert. Name" +release/author_id="Cert. ID" +version/code=1 +version/name="1.0" + +[platform:HTML5] + +browser/enable_run=false +custom_package/debug="" +custom_package/release="" +html/controls_enabled=true +html/font_family="arial,sans-serif" +html/head_include="" +html/style_include="" +html/title="" +options/memory_size=3 + +[platform:Linux X11] + +binary/64_bits=true +custom_binary/debug="" +custom_binary/release="" +resources/bundle_dependencies_(for_optical_disc)=false +resources/pack_mode=1 + +[platform:Mac OSX] + +application/64_bits=false +application/copyright="" +application/icon="" +application/identifier="com.godot.macgame" +application/info="This Game is Nice" +application/name="" +application/short_version="1.0" +application/signature="godotmacgame" +application/version="1.0" +custom_package/debug="" +custom_package/release="" +display/high_res=false + +[platform:Windows Desktop] + +binary/64_bits=true +custom_binary/debug="" +custom_binary/release="" +resources/bundle_dependencies_(for_optical_disc)=false +resources/pack_mode=0 + +[script] + +action="compile" +encrypt_key="" diff --git a/generator.gd b/generator.gd new file mode 100644 index 0000000..b679784 --- /dev/null +++ b/generator.gd @@ -0,0 +1,715 @@ + +extends Node + +const BLOCK_SIZE = 16 + +const SIDE_LEFT = 0 +const SIDE_RIGHT = 1 +const SIDE_BOTTOM = 2 +const SIDE_TOP = 3 +const SIDE_BACK = 4 +const SIDE_FRONT = 5 + +const SORT_TIME = 1 +const TILE_SIZE = 16 + +export(Material) var material = null +export(Material) var transparent_material = null +var min_y = -2 +var max_y = 2 +var view_radius = 8 + +var _side_normals = [ + Vector3(-1,0,0), + Vector3(1,0,0), + Vector3(0,-1,0), + Vector3(0,1,0), + Vector3(0,0,-1), + Vector3(0,0,1) +] + +var _blocks = {} +var _generating_blocks = {} +#var _chunks = {} + +var _pending_blocks = [] +var _thread = Thread.new() +var _time_before_sort = SORT_TIME +var _camera = null +var _voxel_types = [] +var _priority_positions = [] +var _outer_positions = [] +var _precalc_neighboring = [] + + +class Block: + var voxel_map = null + var voxels = [] + var pos = Vector3(0,0,0) + var mesh = null + var node = null + var gen_time = 0 + var has_generated = false + var has_structures = false + var need_update = false + + func _init(): + pass + #voxels = create_voxel_grid(BLOCK_SIZE+2,BLOCK_SIZE+2,BLOCK_SIZE+2) + + static func create_voxel_grid(sx,sy,sz): + var grid = [] + grid.resize(sz) + for z in range(0, sz): + var plane = [] + plane.resize(sy) + grid[z] = plane + for y in range(0, sy): + var line = [] + #var line = IntArray() + line.resize(sx) + plane[y] = line + for x in range(0, sx): + line[x] = 0 + return grid + + func is_generated(): + return has_generated and has_structures + + func is_surrounded(): + var blocks = voxel_map._blocks + var ngb = voxel_map._precalc_neighboring + for v in ngb: + if not blocks.has(pos + v): + return false + return false + + func get_ground_y(x,z): + var types = voxel_map._voxel_types + for y in range(BLOCK_SIZE-1, 0, -1): + if not types[voxels[z][y][x]].is_transparent: + return y + return 0 + + func local_to_map(vpos): + return vpos + pos * BLOCK_SIZE + + +class BlockRequest: + const TYPE_GENERATE = 0 + const TYPE_UPDATE = 0 + + var type = 0 + var block_pos = Vector3(0,0,0) + + func _init(pos, type=TYPE_GENERATE): + self.block_pos = pos + self.type = type + + +#class Chunk: +# var heightmap = [] +# +# func _init(): +# heightmap.resize(BLOCK_SIZE+2) +# for y in range(0, heightmap.size()): +# var line = [] +# line.resize(BLOCK_SIZE+2) +# heightmap[y] = line +# for x in range(0, line.size()): +# line[x] = 0 + + +class VoxelType: + const GEOM_EMPTY = 0 + const GEOM_CUBE = 1 + const GEOM_XQUAD = 2 + const GEOM_MODEL = 3 + const GEOM_LIQUID = 4 + + var id = 0 + var name = "default" + var cube_side_uv4 = [] + var is_transparent = false + var geom_type = GEOM_CUBE + + # Mesh that will always be included in the voxel + var model_vertices = [] + var model_uv = [] + # Parts of the mesh that will appear only if connected sides are transparent + var model_side_vertices = [] + var model_side_uv = [] + var model_normals = [] + + func _init(id, name): + self.id = id + self.name = name + cube_side_uv4.resize(6) + set_all_atlas_pos(Vector2(0,0)) + + func set_side_atlas_pos(side, pos): + var s = 1.0 / 4.0 + # Apply a tiny padding to avoid tiling artefacts + var e = 0.001 + cube_side_uv4[side] = [ + s * (pos + Vector2(e,e)), + s * (pos + Vector2(1-e,e)), + s * (pos + Vector2(e,1-e)), + s * (pos + Vector2(1-e,1-e)) + ] + return self + + func set_all_atlas_pos(pos): + for i in range(0, 6): + set_side_atlas_pos(i, pos) + return self + + func set_tbs_atlas_pos(top_pos, bottom_pos, sides_pos): + set_side_atlas_pos(SIDE_LEFT, sides_pos) + set_side_atlas_pos(SIDE_RIGHT, sides_pos) + set_side_atlas_pos(SIDE_FRONT, sides_pos) + set_side_atlas_pos(SIDE_BACK, sides_pos) + set_side_atlas_pos(SIDE_TOP, top_pos) + set_side_atlas_pos(SIDE_BOTTOM, bottom_pos) + return self + + func set_geom(g): + geom_type = g + return self + + func set_transparent(trans): + is_transparent = trans + return self + + func compile(): + if geom_type == GEOM_CUBE: + model_side_vertices = _make_cube_vertex_offsets() + model_side_uv = _make_cube_side_uv6(cube_side_uv4) + + elif geom_type == GEOM_LIQUID: + model_side_vertices = _make_cube_vertex_offsets(15.0 / 16.0) + model_side_uv = _make_cube_side_uv6(cube_side_uv4) + + elif geom_type == GEOM_XQUAD: + var uv = cube_side_uv4 + model_uv = [ + uv[0][2], + uv[0][0], + uv[0][1], + uv[0][2], + uv[0][1], + uv[0][3], + + uv[0][3], + uv[0][2], + uv[0][1], + uv[0][2], + uv[0][0], + uv[0][1] + ] + model_vertices = [ + Vector3(0,0,0), + Vector3(0,1,0), + Vector3(1,1,1), + Vector3(0,0,0), + Vector3(1,1,1), + Vector3(1,0,1), + + Vector3(1,0,0), + Vector3(0,0,1), + Vector3(1,1,0), + Vector3(0,0,1), + Vector3(0,1,1), + Vector3(1,1,0) + ] + model_normals = [ + Vector3(-0.7, 0.0, 0.7), + Vector3(-0.7, 0.0, 0.7), + Vector3(-0.7, 0.0, 0.7), + Vector3(-0.7, 0.0, 0.7), + Vector3(-0.7, 0.0, 0.7), + Vector3(-0.7, 0.0, 0.7), + + Vector3(0.7, 0.0, 0.7), + Vector3(0.7, 0.0, 0.7), + Vector3(0.7, 0.0, 0.7), + Vector3(0.7, 0.0, 0.7), + Vector3(0.7, 0.0, 0.7), + Vector3(0.7, 0.0, 0.7) + ] + + else: + print("Unknown voxel geometry type") + + + static func _make_cube_vertex_offsets(sy=1): + var a = [ + [ + # LEFT + Vector3(0,0,0), + Vector3(0,sy,0), + Vector3(0,sy,1), + Vector3(0,0,0), + Vector3(0,sy,1), + Vector3(0,0,1), + ], + [ + # RIGHT + Vector3(1,0,0), + Vector3(1,sy,1), + Vector3(1,sy,0), + Vector3(1,0,0), + Vector3(1,0,1), + Vector3(1,sy,1) + ], + [ + # BOTTOM + Vector3(0,0,0), + Vector3(1,0,1), + Vector3(1,0,0), + Vector3(0,0,0), + Vector3(0,0,1), + Vector3(1,0,1) + ], + [ + # TOP + Vector3(0,sy,0), + Vector3(1,sy,0), + Vector3(1,sy,1), + Vector3(0,sy,0), + Vector3(1,sy,1), + Vector3(0,sy,1) + ], + [ + # BACK + Vector3(0,0,0), + Vector3(1,0,0), + Vector3(1,sy,0), + Vector3(0,0,0), + Vector3(1,sy,0), + Vector3(0,sy,0), + ], + [ + # FRONT + Vector3(1,0,1), + Vector3(0,0,1), + Vector3(1,sy,1), + Vector3(0,0,1), + Vector3(0,sy,1), + Vector3(1,sy,1) + ] + ] + return a + + static func _make_cube_side_uv6(sides_uv4): + var uvs = sides_uv4 + var uv6 = [ + [ + uvs[SIDE_LEFT][2], + uvs[SIDE_LEFT][0], + uvs[SIDE_LEFT][1], + uvs[SIDE_LEFT][2], + uvs[SIDE_LEFT][1], + uvs[SIDE_LEFT][3] + ], + [ + uvs[SIDE_RIGHT][2], + uvs[SIDE_RIGHT][1], + uvs[SIDE_RIGHT][0], + uvs[SIDE_RIGHT][2], + uvs[SIDE_RIGHT][3], + uvs[SIDE_RIGHT][1] + ], + [ + uvs[SIDE_BOTTOM][0], + uvs[SIDE_BOTTOM][3], + uvs[SIDE_BOTTOM][1], + uvs[SIDE_BOTTOM][0], + uvs[SIDE_BOTTOM][2], + uvs[SIDE_BOTTOM][3] + ], + [ + uvs[SIDE_TOP][0], + uvs[SIDE_TOP][1], + uvs[SIDE_TOP][3], + uvs[SIDE_TOP][0], + uvs[SIDE_TOP][3], + uvs[SIDE_TOP][2] + ], + [ + uvs[SIDE_BACK][2], + uvs[SIDE_BACK][3], + uvs[SIDE_BACK][1], + uvs[SIDE_BACK][2], + uvs[SIDE_BACK][1], + uvs[SIDE_BACK][0] + ], + [ + uvs[SIDE_FRONT][3], + uvs[SIDE_FRONT][2], + uvs[SIDE_FRONT][1], + uvs[SIDE_FRONT][2], + uvs[SIDE_FRONT][0], + uvs[SIDE_FRONT][1] + ], + ] + return uv6 + + +func _ready(): + _camera = get_parent().get_node("Camera") + + _load_voxel_types() + _precalculate_priority_positions() + _precalculate_neighboring() + _update_pending_blocks() + + set_process(true) + + +func _precalculate_neighboring(): + for z in range(-1, 2): + for y in range(-1, 2): + for x in range(-1, 2): + if x != 0 and y != 0 and z != 0: + _precalc_neighboring.append(Vector3(x,y,z)) + + +func add_voxel_type(id, name): + var vt = VoxelType.new(id, name) + if id >= _voxel_types.size(): + _voxel_types.resize(id+1) + _voxel_types[id] = vt + return vt + + +func _load_voxel_types(): + add_voxel_type(0, "air") \ + .set_geom(VoxelType.GEOM_EMPTY) \ + .set_transparent(true) + + add_voxel_type(1, "grassy_dirt") \ + .set_tbs_atlas_pos(Vector2(0,0), Vector2(1,0), Vector2(0,1)) + + add_voxel_type(2, "bush") \ + .set_all_atlas_pos(Vector2(1,1)) \ + .set_geom(VoxelType.GEOM_XQUAD) \ + .set_transparent(true) + + add_voxel_type(3, "log") \ + .set_tbs_atlas_pos(Vector2(3,0), Vector2(3,0), Vector2(2,0)) + + add_voxel_type(4, "dirt") \ + .set_all_atlas_pos(Vector2(1,0)) + + add_voxel_type(5, "water") \ + .set_all_atlas_pos(Vector2(2,1)) \ + .set_transparent(true) \ + .set_geom(VoxelType.GEOM_LIQUID) + + for vt in _voxel_types: + vt.compile() + + +func _precalculate_priority_positions(): + _priority_positions.clear() + for z in range(-view_radius, view_radius): + for x in range(-view_radius, view_radius): + for y in range(min_y, max_y): + _priority_positions.append(Vector3(x,y,z)) + _priority_positions.sort_custom(self, "_compare_priority_positions") + + +func _compare_priority_positions(a, b): + return a.length_squared() > b.length_squared() + + +func set_voxel(pos, id): + # This function only works if the block exists and is surrounded + + var bpos = Vector3(floor(pos.x/BLOCK_SIZE), floor(pos.y/BLOCK_SIZE), floor(pos.z/BLOCK_SIZE)) + var block = _blocks[bpos] + var rx = pos.x%BLOCK_SIZE + var ry = pos.y%BLOCK_SIZE + var rz = pos.z%BLOCK_SIZE + block.voxels[rz+1][ry+1][rx+1] = id + block.need_update = true + + # TODO The following is not needed if the meshing process could just take copies with neighboring + + if rx == 0: + var nblock = _blocks[bpos-Vector3(1,0,0)] + nblock.voxels[BLOCK_SIZE+1][ry+1][rx+1] = id + nblock.need_update = true + elif rx == BLOCK_SIZE-1: + var nblock = _blocks[bpos+Vector3(1,0,0)] + nblock.voxels[0][ry+1][rx+1] = id + nblock.need_update = true + + if ry == 0: + var nblock = _blocks[bpos-Vector3(0,1,0)] + nblock.voxels[rx+1][BLOCK_SIZE+1][rx+1] = id + nblock.need_update = true + elif ry == BLOCK_SIZE-1: + var nblock = _blocks[bpos+Vector3(0,1,0)] + nblock.voxels[rx+1][0][rx+1] = id + nblock.need_update = true + + if rz == 0: + var nblock = _blocks[bpos-Vector3(0,0,1)] + nblock.voxels[rz+1][ry+1][BLOCK_SIZE+1] = id + nblock.need_update = true + elif rz == BLOCK_SIZE-1: + var nblock = _blocks[bpos+Vector3(0,0,1)] + nblock.voxels[rx+1][ry+1][0] = id + nblock.need_update = true + + +func _update_pending_blocks(): + # Using pre-sorted relative vectors is faster than sorting the list directly + var camera_block_pos = _camera.get_translation() / BLOCK_SIZE + camera_block_pos.x = floor(camera_block_pos.x) + camera_block_pos.y = 0#floor(camera_block_pos.y) + camera_block_pos.z = floor(camera_block_pos.z) + _pending_blocks.clear() + for rpos in _priority_positions: + var pos = rpos + camera_block_pos + if pos.y >= min_y and pos.y < max_y and not _generating_blocks.has(pos): + if not _blocks.has(pos): + _pending_blocks.append(pos) +# else: +# var block = _blocks[pos] +# if block.need_update: +# # TODO update mesh +# elif not block.has_structures and block.is_surrounded(): +# # TODO generate structures + + +func _process(delta): + + # TODO Immerge blocks that are too far away + + if _time_before_sort > 0: + _time_before_sort -= delta + if _time_before_sort <= 0: + _time_before_sort = SORT_TIME + _update_pending_blocks() + + if _pending_blocks.size() != 0: + if not _thread.is_active(): + + # Closer blocks are loaded first + var pos = _pending_blocks[_pending_blocks.size()-1] + _pending_blocks.pop_back() + _thread.start(self, "generate_block_thread", BlockRequest.new(pos, BlockRequest.TYPE_GENERATE)) + _generating_blocks[pos] = true + + # Visible blocks are loaded first +# var hbs = Vector3(0.5, 0.5, 0.5) * BLOCK_SIZE +# for i in range(_pending_blocks.size()-1, 0, -1): +# var pos = _pending_blocks[i] +# var wpos = pos*BLOCK_SIZE + hbs +# if not _camera.is_position_behind(wpos): +# _pending_blocks[i] = _pending_blocks[_pending_blocks.size()-1] +# _pending_blocks.pop_back() +# _thread.start(self, "generate_block_thread", pos) +# break + + +func generate_block_thread(request): + if request.type == BlockRequest.TYPE_GENERATE: + var block = generate_block(request.block_pos) + # Call the main thread to wait + call_deferred("thread_finished") + return block + else: + print("Unknown request type " + str(request.type)) + + +func thread_finished(): + var block = _thread.wait_to_finish() + _generating_blocks.erase(block.pos) + spawn_block(block) + + +func generate_block(pos): + var time_before = OS.get_ticks_msec() + + #var time_before = OS.get_ticks_msec() + var voxels = Block.create_voxel_grid(BLOCK_SIZE+2, BLOCK_SIZE+2, BLOCK_SIZE+2) + #print("Create: " + str(OS.get_ticks_msec() - time_before) + "ms") + + #time_before = OS.get_ticks_msec() + var empty = generate_random(voxels, pos * BLOCK_SIZE) + #print("Generate: " + str(OS.get_ticks_msec() - time_before) + "ms") + + var mesh = null + if empty: + voxels = null + else: + #time_before = OS.get_ticks_msec() + var st_solid = SurfaceTool.new() + var st_transparent = SurfaceTool.new() + + st_solid.begin(Mesh.PRIMITIVE_TRIANGLES) + st_transparent.begin(Mesh.PRIMITIVE_TRIANGLES) + + st_solid.set_material(material) + st_transparent.set_material(transparent_material) + + make_mesh(voxels, st_solid, st_transparent) + #st.index() + + mesh = st_solid.commit() + st_transparent.commit(mesh) + + #print("Bake: " + str(OS.get_ticks_msec() - time_before) + "ms") + + var block = Block.new() + block.voxel_map = self + block.voxels = voxels + block.pos = pos + block.mesh = mesh + block.gen_time = OS.get_ticks_msec() - time_before + + return block + + +func spawn_block(block): + if block.mesh != null: + var mesh_instance = preload("res://block.tscn").instance() + mesh_instance.set_mesh(block.mesh) + mesh_instance.set_translation(block.pos * BLOCK_SIZE) + mesh_instance.voxel_map = self + add_child(mesh_instance) + block.node = mesh_instance + mesh_instance.spawn() + _blocks[block.pos] = block + print("Gen time: " + str(block.gen_time) + " (empty=" + str(block.mesh == null) + ")") + + +func generate_random(cubes, offset): + var ox = offset.x + var oy = offset.y + var oz = offset.z + var empty = true + var ns1 = 0.01 + var ns2 = 0.05 + + var dirt = 1 + if oy < 0: + dirt = 4 + + var air = 0 + if oy < 0: + air = 5 + + var bs = cubes.size() + + for z in range(0, bs): + for x in range(0, bs): + #var h = 8.0*(cos((ox+x)/8.0) + sin((oz+z)/8.0)) + 8 - oy + var n1 = preload("Simplex.gd").simplex2(ns1*(ox+x), ns1*(oz+z)) + var n2 = preload("Simplex.gd").simplex2(ns2*(ox+x+100.0), ns2*(oz+z)) + var h = 16.0*n1 + 4.0*n2 + 8 - oy + if h >= 0: + if h < bs: + empty = false + for y in range(0, h): + cubes[z][y][x] = dirt + for y in range(h, bs): + cubes[z][y][x] = air + if oy == -BLOCK_SIZE: + cubes[z][bs-1][x] = 0 + if oy >= 0 and randf() < 0.2: + cubes[z][h][x] = 2 +# if randf() < 0.01: +# var th = h+1+randi()%8 +# if th > bs: +# th = bs +# for y in range(h, th): +# cubes[z][y][x] = 3 + else: + empty = false + for y in range(0, bs): + cubes[z][y][x] = 1 + else: + for y in range(0, bs): + cubes[z][y][x] = air + + return empty + + +func _is_face_visible(vt, other_vt): + return other_vt.id == 0 or (other_vt.is_transparent and other_vt != vt) + + +func make_mesh(cubes, st_solid, st_transparent): + + for z in range(1, cubes.size()-1): + var plane = cubes[z] + for y in range(1, plane.size()-1): + var line = plane[y] + for x in range(1, line.size()-1): + var voxel_id = line[x] + if voxel_id != 0: + var voxel_type = _voxel_types[voxel_id] + + var st = st_solid + if voxel_type.is_transparent: + st = st_transparent + + var ppos = Vector3(x,y,z) + var pos = ppos-Vector3(1,1,1) + + # Side faces + if voxel_type.model_side_vertices.size() != 0: + for side in range(0,6): + var npos = ppos + _side_normals[side] + if _is_face_visible(voxel_type, _voxel_types[cubes[npos.z][npos.y][npos.x]]): + st.add_normal(_side_normals[side]) + var uvs = voxel_type.model_side_uv[side] + var vertices = voxel_type.model_side_vertices[side] + for vi in range(0,vertices.size()): + st.add_uv(uvs[vi]) + st.add_vertex(pos + vertices[vi]) + + if voxel_type.geom_type == VoxelType.GEOM_XQUAD: + pos.x += rand_range(-0.15, 0.15) + pos.z += rand_range(-0.15, 0.15) + + # Model faces + if voxel_type.model_vertices.size() != 0: + var vertices = voxel_type.model_vertices + var uvs = voxel_type.model_uv + var normals = voxel_type.model_normals + for vi in range(0, vertices.size()): + st.add_uv(uvs[vi]) + st.add_normal(normals[vi]) + st.add_vertex(pos + vertices[vi]) + +# elif voxel_type.geom_type == VoxelType.GEOM_XQUAD: +# var pos = Vector3(x,y,z)-Vector3(1,1,1) +# pos.x += rand_range(-0.15, 0.15) +# pos.z += rand_range(-0.15, 0.15) +# var uvs = voxel_type.cube_side_uv4[0] +# +# st.add_normal(Vector3(-0.7,0,0.7)) +# st.add_uv(uvs[2]); st.add_vertex(pos) +# st.add_uv(uvs[0]); st.add_vertex(pos+Vector3(0,1,0)) +# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,1)) +# st.add_uv(uvs[2]); st.add_vertex(pos) +# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,1)) +# st.add_uv(uvs[3]); st.add_vertex(pos+Vector3(1,0,1)) +# +# st.add_normal(Vector3(0.7,0,0.7)) +# st.add_uv(uvs[3]); st.add_vertex(pos+Vector3(1,0,0)) +# st.add_uv(uvs[2]); st.add_vertex(pos+Vector3(0,0,1)) +# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,0)) +# st.add_uv(uvs[2]); st.add_vertex(pos+Vector3(0,0,1)) +# st.add_uv(uvs[0]); st.add_vertex(pos+Vector3(0,1,1)) +# st.add_uv(uvs[1]); st.add_vertex(pos+Vector3(1,1,0)) + + + + diff --git a/gpu_generator.gd b/gpu_generator.gd new file mode 100644 index 0000000..ee878a0 --- /dev/null +++ b/gpu_generator.gd @@ -0,0 +1,8 @@ + +extends Camera2D + + +func _ready(): + #var image = get_parent().get_screen_capture() + pass + diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..c019ef6 Binary files /dev/null and b/icon.png differ diff --git a/icon.png.flags b/icon.png.flags new file mode 100644 index 0000000..5130fd1 --- /dev/null +++ b/icon.png.flags @@ -0,0 +1 @@ +gen_mipmaps=false diff --git a/new_scene.tscn b/new_scene.tscn new file mode 100644 index 0000000..972da4a --- /dev/null +++ b/new_scene.tscn @@ -0,0 +1,408 @@ +[gd_scene load_steps=10 format=1] + +[ext_resource path="res://debug_camera.gd" type="Script" id=1] +[ext_resource path="res://generator.gd" type="Script" id=2] +[ext_resource path="res://terrain.png" type="Texture" id=3] +[ext_resource path="res://block.gd" type="Script" id=4] + +[sub_resource type="FixedMaterial" id=1] + +flags/visible = true +flags/double_sided = false +flags/invert_faces = false +flags/unshaded = false +flags/on_top = false +flags/lightmap_on_uv2 = true +flags/colarray_is_srgb = true +params/blend_mode = 0 +params/depth_draw = 1 +params/line_width = 0.0 +fixed_flags/use_alpha = false +fixed_flags/use_color_array = false +fixed_flags/use_point_size = false +fixed_flags/discard_alpha = false +fixed_flags/use_xy_normalmap = false +params/diffuse = Color( 1, 1, 1, 1 ) +params/specular = Color( 0, 0, 0, 1 ) +params/emission = Color( 0, 0, 0, 1 ) +params/specular_exp = 40 +params/detail_mix = 1.0 +params/normal_depth = 1 +params/shader = 0 +params/shader_param = 0.5 +params/glow = 0 +params/point_size = 1.0 +uv_xform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +textures/diffuse = ExtResource( 3 ) +textures/diffuse_tc = 0 +textures/detail_tc = 0 +textures/specular_tc = 0 +textures/emission_tc = 0 +textures/specular_exp_tc = 0 +textures/glow_tc = 0 +textures/normal_tc = 0 +textures/shade_param_tc = 0 + +[sub_resource type="FixedMaterial" id=2] + +flags/visible = true +flags/double_sided = true +flags/invert_faces = false +flags/unshaded = false +flags/on_top = false +flags/lightmap_on_uv2 = true +flags/colarray_is_srgb = true +params/blend_mode = 0 +params/depth_draw = 2 +params/line_width = 0.0 +fixed_flags/use_alpha = true +fixed_flags/use_color_array = false +fixed_flags/use_point_size = false +fixed_flags/discard_alpha = false +fixed_flags/use_xy_normalmap = false +params/diffuse = Color( 1, 1, 1, 1 ) +params/specular = Color( 0, 0, 0, 1 ) +params/emission = Color( 0, 0, 0, 1 ) +params/specular_exp = 40 +params/detail_mix = 1.0 +params/normal_depth = 1 +params/shader = 0 +params/shader_param = 0.5 +params/glow = 0 +params/point_size = 1.0 +uv_xform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +textures/diffuse = ExtResource( 3 ) +textures/diffuse_tc = 0 +textures/detail_tc = 0 +textures/specular_tc = 0 +textures/emission_tc = 0 +textures/specular_exp_tc = 0 +textures/glow_tc = 0 +textures/normal_tc = 0 +textures/shade_param_tc = 0 + +[sub_resource type="FixedMaterial" id=3] + +flags/visible = true +flags/double_sided = false +flags/invert_faces = false +flags/unshaded = false +flags/on_top = false +flags/lightmap_on_uv2 = true +flags/colarray_is_srgb = true +params/blend_mode = 0 +params/depth_draw = 1 +params/line_width = 1.0 +fixed_flags/use_alpha = false +fixed_flags/use_color_array = false +fixed_flags/use_point_size = false +fixed_flags/discard_alpha = false +fixed_flags/use_xy_normalmap = false +params/diffuse = Color( 1, 1, 1, 1 ) +params/specular = Color( 0, 0, 0, 1 ) +params/emission = Color( 0, 0, 0, 1 ) +params/specular_exp = 40 +params/detail_mix = 1.0 +params/normal_depth = 1 +params/shader = 0 +params/shader_param = 0.5 +params/glow = 0 +params/point_size = 1.0 +uv_xform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +textures/diffuse_tc = 0 +textures/detail_tc = 0 +textures/specular_tc = 0 +textures/emission_tc = 0 +textures/specular_exp_tc = 0 +textures/glow_tc = 0 +textures/normal_tc = 0 +textures/shade_param_tc = 0 + +[sub_resource type="Environment" id=4] + +ambient_light/enabled = true +ambient_light/color = Color( 0.378906, 0.378906, 0.378906, 1 ) +ambient_light/energy = 1.0 +fxaa/enabled = false +background/mode = 2 +background/color = Color( 0.539063, 0.525474, 0.414825, 1 ) +background/energy = 1.0 +background/scale = 1.0 +background/glow = 0.0 +background/canvas_max_layer = null +glow/enabled = true +glow/blur_passes = 1 +glow/blur_scale = 1 +glow/blur_strength = 1 +glow/blur_blend_mode = null +glow/bloom = 0.0 +glow/bloom_treshold = 0.5 +dof_blur/enabled = false +dof_blur/blur_passes = 2 +dof_blur/begin = 0.0 +dof_blur/range = 10.0 +hdr/enabled = false +hdr/tonemapper = 0 +hdr/exposure = 0.4 +hdr/white = 1.0 +hdr/glow_treshold = 0.95 +hdr/glow_scale = 0.2 +hdr/min_luminance = 0.4 +hdr/max_luminance = 8.0 +hdr/exposure_adj_speed = 0.5 +fog/enabled = true +fog/begin = 0.01 +fog/begin_color = Color( 0, 0, 0, 1 ) +fog/end_color = Color( 0.537255, 0.521569, 0.411765, 1 ) +fog/attenuation = 0.707107 +fog/bg = true +bcs/enabled = false +bcs/brightness = 1.0 +bcs/contrast = 1.0 +bcs/saturation = 1.0 +srgb/enabled = false + +[sub_resource type="Animation" id=5] + +length = 1.0 +loop = false +step = 0.1 +tracks/0/type = "value" +tracks/0/path = NodePath(".") +tracks/0/interp = 1 +tracks/0/keys = { "cont":true, "times":FloatArray( ), "transitions":FloatArray( ), "values":[ ] } + +[node name="Node" type="Node"] + +[node name="Camera" type="Camera" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +transform/local = Transform( 0.815509, -0.351713, 0.459612, 0, 0.794154, 0.607717, -0.578744, -0.495599, 0.64764, 18.1809, 22.9505, 25.3826 ) +projection = 0 +fov = 80.0 +near = 0.1 +far = 200.0 +keep_aspect = 1 +current = true +visible_layers = 1048575 +environment = null +h_offset = 0.0 +v_offset = 0.0 +script/script = ExtResource( 1 ) +sensitivity = 0.4 +min_angle = -90 +max_angle = 90 +speed = 10.0 +capture_mouse = true + +[node name="Particles" type="Particles" parent="Camera"] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +layers = 1 +geometry/visible = true +geometry/material_override = null +geometry/cast_shadow = false +geometry/receive_shadows = true +geometry/range_begin = 0.0 +geometry/range_end = 0.0 +geometry/extra_cull_margin = 0.0 +geometry/billboard = false +geometry/billboard_y = false +geometry/depth_scale = false +geometry/visible_in_all_rooms = false +geometry/use_baked_light = false +geometry/baked_light_tex_id = 0 +material = null +amount = 256 +emitting = true +visibility = AABB( -4, -4, -4, 8, 8, 8 ) +emission_extents = Vector3( 32, 32, 32 ) +emission_base_velocity = Vector3( 0, 0, 0 ) +emission_points = Vector3Array( ) +gravity_normal = Vector3( 0, -1, 0 ) +local_coords = false +emit_timeout = 0.0 +vars/lifetime = 5.0 +vars/spread = 0.2 +vars/gravity = 0.0 +vars/linear_vel = 0.2 +vars/angular_vel = 0.0 +vars/linear_accel = 0.0 +vars/radial_accel = 0.0 +vars/tan_accel = 0.0 +vars/damping = 0.0 +vars/initial_size = 0.05 +vars/final_size = 0.05 +vars/initial_angle = 0.0 +vars/height_from_velocity = false +vars/height = 1.0 +vars/height_speed_scale = 0.0 +rand/lifetime = 0.0 +rand/spread = 0.0 +rand/gravity = 0.0 +rand/linear_vel = 0.0 +rand/angular_vel = 0.0 +rand/linear_accel = 0.0 +rand/radial_accel = 0.0 +rand/tan_accel = 0.0 +rand/damping = 0.0 +rand/initial_size = 0.0 +rand/final_size = 0.0 +rand/initial_angle = 0.0 +rand/height = 0.0 +rand/height_speed_scale = 0.0 +color_phases/count = 0 +phase_0/pos = 0.0 +phase_0/color = Color( 0, 0, 0, 1 ) +phase_1/pos = 1.0 +phase_1/color = Color( 0, 0, 0, 1 ) +phase_2/pos = 1.0 +phase_2/color = Color( 0, 0, 0, 1 ) +phase_3/pos = 1.0 +phase_3/color = Color( 0, 0, 0, 1 ) + +[node name="TestCube" type="TestCube" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -3.63175, 0, 0 ) +layers = 1 +geometry/visible = true +geometry/material_override = null +geometry/cast_shadow = true +geometry/receive_shadows = true +geometry/range_begin = 0.0 +geometry/range_end = 0.0 +geometry/extra_cull_margin = 0.0 +geometry/billboard = false +geometry/billboard_y = false +geometry/depth_scale = false +geometry/visible_in_all_rooms = false +geometry/use_baked_light = false +geometry/baked_light_tex_id = 0 + +[node name="TestCube1" type="TestCube" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -3.63175, 0, 2.12836 ) +layers = 1 +geometry/visible = true +geometry/material_override = null +geometry/cast_shadow = true +geometry/receive_shadows = true +geometry/range_begin = 0.0 +geometry/range_end = 0.0 +geometry/extra_cull_margin = 0.0 +geometry/billboard = false +geometry/billboard_y = false +geometry/depth_scale = false +geometry/visible_in_all_rooms = false +geometry/use_baked_light = false +geometry/baked_light_tex_id = 0 + +[node name="TestCube2" type="TestCube" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -1.39143, 0, 0 ) +layers = 1 +geometry/visible = true +geometry/material_override = null +geometry/cast_shadow = true +geometry/receive_shadows = true +geometry/range_begin = 0.0 +geometry/range_end = 0.0 +geometry/extra_cull_margin = 0.0 +geometry/billboard = false +geometry/billboard_y = false +geometry/depth_scale = false +geometry/visible_in_all_rooms = false +geometry/use_baked_light = false +geometry/baked_light_tex_id = 0 + +[node name="TestCube3" type="TestCube" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +transform/local = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -3.63175, 2.18131, 0 ) +layers = 1 +geometry/visible = true +geometry/material_override = null +geometry/cast_shadow = true +geometry/receive_shadows = true +geometry/range_begin = 0.0 +geometry/range_end = 0.0 +geometry/extra_cull_margin = 0.0 +geometry/billboard = false +geometry/billboard_y = false +geometry/depth_scale = false +geometry/visible_in_all_rooms = false +geometry/use_baked_light = false +geometry/baked_light_tex_id = 0 + +[node name="VoxelMap" type="Node" parent="."] + +script/script = ExtResource( 2 ) +material = SubResource( 1 ) +transparent_material = SubResource( 2 ) + +[node name="Block" type="MeshInstance" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +visibility/visible = false +layers = 1 +geometry/visible = true +geometry/material_override = SubResource( 3 ) +geometry/cast_shadow = true +geometry/receive_shadows = true +geometry/range_begin = 0.0 +geometry/range_end = 0.0 +geometry/extra_cull_margin = 0.0 +geometry/billboard = false +geometry/billboard_y = false +geometry/depth_scale = false +geometry/visible_in_all_rooms = false +geometry/use_baked_light = false +geometry/baked_light_tex_id = 0 +mesh/mesh = null +mesh/skeleton = NodePath("..") +script/script = ExtResource( 4 ) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +environment = SubResource( 4 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] + +playback/process_mode = 1 +playback/default_blend_time = 0.0 +root/root = NodePath("..") +anims/NewAnim = SubResource( 5 ) +playback/active = true +playback/speed = 1.0 +blend_times = [ ] +autoplay = "" + +[node name="DirectionalLight" type="DirectionalLight" parent="."] + +_import_transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ) +transform/local = Transform( 0.817159, -0.383981, 0.429895, 4.66628e-006, 0.745816, 0.666152, -0.576412, -0.54435, 0.609452, 1.36405, 1.98931, 7.37862 ) +layers = 1 +params/enabled = true +params/editor_only = false +params/bake_mode = 0 +params/energy = 1.0 +colors/diffuse = Color( 1, 1, 1, 1 ) +colors/specular = Color( 1, 1, 1, 1 ) +shadow/shadow = true +shadow/darkening = 0.0 +shadow/z_offset = 0.05 +shadow/z_slope_scale = 0.0 +shadow/esm_multiplier = 60.0 +shadow/blur_passes = 1.0 +projector = null +operator = 0 +shadow/mode = 0 +shadow/max_distance = 100.0 +shadow/split_weight = 0.5 +shadow/zoffset_scale = 2.0 + + diff --git a/shader_gen.tscn b/shader_gen.tscn new file mode 100644 index 0000000..f064e27 --- /dev/null +++ b/shader_gen.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=5 format=1] + +[ext_resource path="res://gpu_generator.gd" type="Script" id=1] +[ext_resource path="res://icon.png" type="Texture" id=2] + +[sub_resource type="CanvasItemShader" id=4] + +_code = { "fragment":"vec2 pos = floor(UV * 64.0);\nfloat a = fract(sin(dot(pos ,vec2(12.9898,78.233))) * 438.5453);\nvec4 col = vec4(a, a, a, 1.0);\n\nCOLOR = col;\n", "fragment_ofs":0, "light":"", "light_ofs":0, "vertex":"", "vertex_ofs":0 } + +[sub_resource type="CanvasItemMaterial" id=5] + +shader/shader = SubResource( 4 ) +shader/shading_mode = 0 + +[node name="ShaderGen" type="Node"] + +[node name="Viewport" type="Viewport" parent="."] + +rect = Rect2( 0, 0, 0, 0 ) +own_world = false +world = null +transparent_bg = false +render_target/enabled = true +render_target/v_flip = false +render_target/clear_on_new_frame = true +render_target/filter = false +render_target/gen_mipmaps = false +render_target/update_mode = 2 +audio_listener/enable_2d = false +audio_listener/enable_3d = false +physics/object_picking = false +gui/disable_input = false + +[node name="Camera2D" type="Camera2D" parent="."] + +anchor_mode = 0 +rotating = false +current = false +zoom = Vector2( 1, 1 ) +limit/left = -10000000 +limit/top = -10000000 +limit/right = 10000000 +limit/bottom = 10000000 +drag_margin/h_enabled = true +drag_margin/v_enabled = true +smoothing/enable = false +smoothing/speed = 5.0 +drag_margin/left = 0.2 +drag_margin/top = 0.2 +drag_margin/right = 0.2 +drag_margin/bottom = 0.2 +script/script = ExtResource( 1 ) + +[node name="Polygon2D" type="Polygon2D" parent="."] + +material/material = SubResource( 5 ) +polygon = Vector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) +uv = Vector2Array( 0, 0, 64, 0, 64, 64, 0, 64 ) +color = Color( 1, 1, 1, 1 ) +offset = Vector2( 0, 0 ) +texture/texture = ExtResource( 2 ) +texture/offset = Vector2( 0, 0 ) +texture/scale = Vector2( 1, 1 ) +texture/rotation = 0.0 +invert/enable = false +invert/border = 100.0 + + diff --git a/terrain.png b/terrain.png new file mode 100644 index 0000000..0c67b92 Binary files /dev/null and b/terrain.png differ diff --git a/terrain.png.flags b/terrain.png.flags new file mode 100644 index 0000000..226e8a3 --- /dev/null +++ b/terrain.png.flags @@ -0,0 +1,2 @@ +filter=false +gen_mipmaps=false