├── README.md ├── icon.png ├── SelectBox.blend ├── Material.material ├── SelectBox.blend1 ├── textures ├── Cross.png ├── dirt.png ├── sand.png ├── stone.png ├── grass_side.png ├── grass_top.png ├── textures.png ├── water_static.png ├── Cross.png.import ├── dirt.png.import ├── sand.png.import ├── stone.png.import ├── grass_side.png.import ├── grass_top.png.import ├── textures.png.import └── water_static.png.import ├── Block.tscn ├── Chunk.tscn ├── .github └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── .gitignore ├── TextureMaterial.tres ├── Blocks └── Block.gd ├── default_env.tres ├── icon.png.import ├── export_presets.cfg ├── Game.tscn ├── Player.tscn ├── Player.gd ├── project.godot ├── SelectBox.dae ├── Chunk.gd ├── Game.gd ├── Game.gd.orig ├── Chunk.gd.orig ├── LICENSE └── SelectBox.dae.import /README.md: -------------------------------------------------------------------------------- 1 | # Voxelverse 2 | A voxel universe made right in Godot! 3 | 4 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/icon.png -------------------------------------------------------------------------------- /SelectBox.blend: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/SelectBox.blend -------------------------------------------------------------------------------- /Material.material: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/Material.material -------------------------------------------------------------------------------- /SelectBox.blend1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/SelectBox.blend1 -------------------------------------------------------------------------------- /textures/Cross.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/Cross.png -------------------------------------------------------------------------------- /textures/dirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/dirt.png -------------------------------------------------------------------------------- /textures/sand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/sand.png -------------------------------------------------------------------------------- /textures/stone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/stone.png -------------------------------------------------------------------------------- /textures/grass_side.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/grass_side.png -------------------------------------------------------------------------------- /textures/grass_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/grass_top.png -------------------------------------------------------------------------------- /textures/textures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/textures.png -------------------------------------------------------------------------------- /textures/water_static.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orosmatthew/Voxelverse-Old/HEAD/textures/water_static.png -------------------------------------------------------------------------------- /Block.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://Blocks/Block.gd" type="Script" id=1] 4 | 5 | [node name="Block" type="Node"] 6 | script = ExtResource( 1 ) 7 | -------------------------------------------------------------------------------- /Chunk.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=2 format=2] 2 | 3 | [ext_resource path="res://Chunk.gd" type="Script" id=1] 4 | 5 | [node name="Chunk" type="Spatial"] 6 | script = ExtResource( 1 ) 7 | 8 | [node name="Blocks" type="Node" parent="."] 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Description of Feature** 11 | ex: I would like to add spheres 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/godot 3 | # Edit at https://www.gitignore.io/?templates=godot 4 | 5 | ### Godot ### 6 | 7 | # Godot-specific ignores 8 | .import/ 9 | export.cfg 10 | export_presets.cfg 11 | 12 | # Mono-specific ignores 13 | .mono/ 14 | 15 | # End of https://www.gitignore.io/api/godot 16 | -------------------------------------------------------------------------------- /TextureMaterial.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="SpatialMaterial" load_steps=2 format=2] 2 | 3 | [ext_resource path="res://textures/textures.png" type="Texture" id=1] 4 | 5 | [resource] 6 | flags_disable_ambient_light = true 7 | vertex_color_use_as_albedo = true 8 | params_depth_draw_mode = 3 9 | albedo_texture = ExtResource( 1 ) 10 | metallic_specular = 0.0 11 | roughness = 0.0 12 | -------------------------------------------------------------------------------- /Blocks/Block.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var pos = Vector3() 4 | var vertices = [] 5 | var uvs = [] 6 | var type = 0 7 | var collision_vertices = [] 8 | 9 | func _ready(): 10 | pass 11 | 12 | func add_vertice(v): 13 | vertices.append(v) 14 | 15 | func add_uv(u): 16 | uvs.append(u) 17 | 18 | func set_collision_vertices(): 19 | for v in vertices: 20 | collision_vertices.append(v) 21 | -------------------------------------------------------------------------------- /default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | sky_top_color = Color( 0.0470588, 0.454902, 0.976471, 1 ) 5 | sky_horizon_color = Color( 0.556863, 0.823529, 0.909804, 1 ) 6 | sky_curve = 0.25 7 | ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) 8 | ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) 9 | ground_curve = 0.01 10 | 11 | [resource] 12 | background_mode = 2 13 | background_sky = SubResource( 1 ) 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Platform** 11 | ex: Windows, Linux 12 | 13 | **Version** 14 | Version of game 15 | 16 | **Describe the bug** 17 | A clear and concise description of what the bug is. 18 | 19 | **To Reproduce** 20 | Steps to reproduce the behavior: 21 | 22 | **Expected behavior** 23 | A clear and concise description of what you expected to happen. 24 | 25 | **Screenshots** 26 | If applicable, add screenshots to help explain your problem. 27 | -------------------------------------------------------------------------------- /icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/Cross.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/Cross.png-82516bb681c10bc7c09b4bf6738b1098.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/Cross.png" 13 | dest_files=[ "res://.import/Cross.png-82516bb681c10bc7c09b4bf6738b1098.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/dirt.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/dirt.png-8f3447f5703c4d1ffe16a06c7c96ba03.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/dirt.png" 13 | dest_files=[ "res://.import/dirt.png-8f3447f5703c4d1ffe16a06c7c96ba03.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/sand.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/sand.png-24b70f6739d7d235be0702706be5bcec.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/sand.png" 13 | dest_files=[ "res://.import/sand.png-24b70f6739d7d235be0702706be5bcec.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/stone.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/stone.png-8c1f7be2f21757cdaab7a85691789596.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/stone.png" 13 | dest_files=[ "res://.import/stone.png-8c1f7be2f21757cdaab7a85691789596.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/grass_side.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/grass_side.png-a3ad4db282e02fbc977a6dfdf3aadd9c.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/grass_side.png" 13 | dest_files=[ "res://.import/grass_side.png-a3ad4db282e02fbc977a6dfdf3aadd9c.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/grass_top.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/grass_top.png-b88db549ec7bd4843e9e45cf8c6d4dae.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/grass_top.png" 13 | dest_files=[ "res://.import/grass_top.png-b88db549ec7bd4843e9e45cf8c6d4dae.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/textures.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/textures.png-07b545b6f31941e528c3cdcd071ea61a.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/textures.png" 13 | dest_files=[ "res://.import/textures.png-07b545b6f31941e528c3cdcd071ea61a.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=true 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=0 27 | process/fix_alpha_border=false 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=false 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /textures/water_static.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/water_static.png-e339ff7aa66cc330ef85431757ebc3c0.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://textures/water_static.png" 13 | dest_files=[ "res://.import/water_static.png-e339ff7aa66cc330ef85431757ebc3c0.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /export_presets.cfg: -------------------------------------------------------------------------------- 1 | [preset.0] 2 | 3 | name="Windows Desktop" 4 | platform="Windows Desktop" 5 | runnable=true 6 | custom_features="" 7 | export_filter="all_resources" 8 | include_filter="" 9 | exclude_filter="" 10 | export_path="C:/Users/orosm/Desktop/Voxelverse Export/Voxelverse.exe" 11 | patch_list=PoolStringArray( ) 12 | script_export_mode=1 13 | script_encryption_key="" 14 | 15 | [preset.0.options] 16 | 17 | texture_format/bptc=false 18 | texture_format/s3tc=true 19 | texture_format/etc=false 20 | texture_format/etc2=false 21 | texture_format/no_bptc_fallbacks=true 22 | binary_format/64_bits=true 23 | custom_template/release="" 24 | custom_template/debug="" 25 | application/icon="" 26 | application/file_version="v-a0.1" 27 | application/product_version="v-a0.1" 28 | application/company_name="Pixeled" 29 | application/product_name="Voxelverse" 30 | application/file_description="" 31 | application/copyright="" 32 | application/trademarks="" 33 | 34 | [preset.1] 35 | 36 | name="Linux/X11" 37 | platform="Linux/X11" 38 | runnable=true 39 | custom_features="" 40 | export_filter="all_resources" 41 | include_filter="" 42 | exclude_filter="" 43 | export_path="C:/Users/orosm/Desktop/Voxelverse Linux/Voxelverse.x86_64" 44 | patch_list=PoolStringArray( ) 45 | script_export_mode=1 46 | script_encryption_key="" 47 | 48 | [preset.1.options] 49 | 50 | texture_format/bptc=false 51 | texture_format/s3tc=true 52 | texture_format/etc=false 53 | texture_format/etc2=false 54 | texture_format/no_bptc_fallbacks=true 55 | binary_format/64_bits=true 56 | custom_template/release="" 57 | custom_template/debug="" 58 | -------------------------------------------------------------------------------- /Game.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://Game.gd" type="Script" id=1] 4 | [ext_resource path="res://SelectBox.dae" type="PackedScene" id=2] 5 | [ext_resource path="res://Player.tscn" type="PackedScene" id=3] 6 | 7 | [sub_resource type="SphereMesh" id=1] 8 | 9 | [node name="Game" type="Node"] 10 | script = ExtResource( 1 ) 11 | 12 | [node name="Player" parent="." instance=ExtResource( 3 )] 13 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 6.08324, 115.396, 2.13493 ) 14 | 15 | [node name="fps_label" type="Label" parent="."] 16 | margin_left = 12.0 17 | margin_top = 11.0 18 | margin_right = 52.0 19 | margin_bottom = 25.0 20 | 21 | [node name="Chunks" type="Node" parent="."] 22 | 23 | [node name="DirectionalLight" type="DirectionalLight" parent="."] 24 | transform = Transform( 0.707107, 0.409915, -0.576168, 0, 0.814825, 0.579708, 0.707107, -0.409915, 0.576168, 0, 0, 0 ) 25 | light_indirect_energy = 0.0 26 | light_specular = 0.0 27 | shadow_enabled = true 28 | shadow_color = Color( 0.4, 0.4, 0.4, 1 ) 29 | 30 | [node name="DirectionalLight2" type="DirectionalLight" parent="DirectionalLight"] 31 | transform = Transform( 1, -3.27826e-007, 2.98023e-007, -3.57628e-007, -1, -0.000697732, 2.98023e-007, 0.000697672, -1, 0, 0, 0 ) 32 | light_energy = 0.25 33 | light_indirect_energy = 0.0 34 | light_specular = 0.0 35 | shadow_color = Color( 0.501961, 0.501961, 0.501961, 1 ) 36 | shadow_bias = 0.01 37 | shadow_contact = 1.0 38 | 39 | [node name="Physics" type="Node" parent="."] 40 | 41 | [node name="Sphere" type="MeshInstance" parent="."] 42 | transform = Transform( 0.75, 0, 0, 0, 0.75, 0, 0, 0, 0.75, 0, 0, 0 ) 43 | visible = false 44 | mesh = SubResource( 1 ) 45 | material/0 = null 46 | 47 | [node name="SelectBox" parent="." instance=ExtResource( 2 )] 48 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.701176, 13.9285, 1.24364 ) 49 | 50 | [node name="Timer" type="Timer" parent="."] 51 | one_shot = true 52 | -------------------------------------------------------------------------------- /Player.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=5 format=2] 2 | 3 | [ext_resource path="res://Player.gd" type="Script" id=1] 4 | [ext_resource path="res://textures/Cross.png" type="Texture" id=2] 5 | 6 | [sub_resource type="BoxShape" id=1] 7 | extents = Vector3( 0.194353, 0.218192, 0.863867 ) 8 | 9 | [sub_resource type="Environment" id=2] 10 | background_mode = 1 11 | background_color = Color( 0.392157, 0.780392, 0.988235, 1 ) 12 | ambient_light_color = Color( 0.513726, 0.513726, 0.513726, 1 ) 13 | fog_enabled = true 14 | fog_depth_begin = 100.0 15 | fog_depth_end = 150.0 16 | auto_exposure_scale = 0.5 17 | auto_exposure_speed = 1.0 18 | ssao_enabled = true 19 | ssao_radius = 6.3 20 | ssao_intensity = 1.5 21 | ssao_intensity2 = 0.0 22 | ssao_light_affect = 1.0 23 | ssao_color = Color( 0.235294, 0.235294, 0.235294, 1 ) 24 | dof_blur_far_distance = 30.0 25 | dof_blur_far_transition = 10.0 26 | dof_blur_far_amount = 0.05 27 | glow_strength = 0.1 28 | glow_blend_mode = 1 29 | 30 | [node name="Player" type="KinematicBody"] 31 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 6.083, 84.943, 2.135 ) 32 | script = ExtResource( 1 ) 33 | 34 | [node name="CollisionShape" type="CollisionShape" parent="."] 35 | transform = Transform( 1, 0, 0, 0, -4.37114e-008, -1, 0, 1, -4.37114e-008, 0.00604248, -0.752319, -0.0309526 ) 36 | shape = SubResource( 1 ) 37 | 38 | [node name="Camera" type="Camera" parent="."] 39 | transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0152669, 0, -0.00834012 ) 40 | environment = SubResource( 2 ) 41 | fov = 90.0 42 | size = 1.2 43 | far = 199.6 44 | 45 | [node name="RayCast" type="RayCast" parent="Camera"] 46 | enabled = true 47 | cast_to = Vector3( 0, 0, -5 ) 48 | 49 | [node name="OmniLight" type="OmniLight" parent="."] 50 | light_energy = 0.0 51 | light_indirect_energy = 0.0 52 | light_specular = 0.0 53 | omni_range = 7.2 54 | omni_attenuation = 1.31951 55 | 56 | [node name="TweenCameraFov" type="Tween" parent="."] 57 | 58 | [node name="HUD" type="CanvasLayer" parent="."] 59 | layer = -1 60 | 61 | [node name="Cross" type="Sprite" parent="HUD"] 62 | position = Vector2( 640, 360 ) 63 | texture = ExtResource( 2 ) 64 | -------------------------------------------------------------------------------- /Player.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody 2 | 3 | var FRICTION = 0.15 4 | var accel = 5 5 | var WALK_SPEED = 4.25 6 | var SPRINT_SPEED = WALK_SPEED*1.3 7 | var SNEAK_SPEED = WALK_SPEED*0.3 8 | var velo = Vector3(0,0,0) 9 | var velocity = Vector3(0,0,0) 10 | var velocityGoal = Vector3(0,0,0) 11 | var velocityGoalPrev = Vector3(0,0,0) 12 | var mouse_sensitivity = 0.1 13 | var camera_angle_x = 0 14 | var sprint_active = false 15 | 16 | func _ready(): 17 | Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) 18 | var viewportSize = get_viewport().size 19 | get_node("HUD/Cross").position = viewportSize/2.0 20 | 21 | func _physics_process(delta): 22 | if Input.is_action_pressed("sprint") and velo!=Vector3(0,0,0) and sprint_active==false: 23 | sprint_active=true 24 | $TweenCameraFov.interpolate_property($Camera,"fov", 90, 100, 0.1, Tween.TRANS_LINEAR, Tween.EASE_IN) 25 | $TweenCameraFov.start() 26 | elif Input.is_action_just_released("sprint") and sprint_active==true: 27 | sprint_active=false 28 | $TweenCameraFov.interpolate_property($Camera,"fov", 100, 90, 0.1, Tween.TRANS_LINEAR, Tween.EASE_IN) 29 | $TweenCameraFov.start() 30 | if Input.is_action_pressed("sprint"): 31 | accel = SPRINT_SPEED 32 | elif Input.is_action_pressed("sneak"): 33 | accel = SNEAK_SPEED 34 | else: 35 | accel = WALK_SPEED 36 | if not is_on_floor(): 37 | velocity.y-=0.5 38 | velocity.x-=(velocity.x*FRICTION) 39 | velocity.z-=(velocity.z*FRICTION) 40 | velo = Vector3(0,0,0) 41 | var aim = self.get_rotation_degrees() 42 | if Input.is_action_pressed("move_forward"): 43 | velo.z+=-cos(deg2rad(aim.y)) 44 | velo.x+=-sin(deg2rad(aim.y)) 45 | elif Input.is_action_pressed("move_backward"): 46 | velo.z+=cos(deg2rad(aim.y)) 47 | velo.x+=sin(deg2rad(aim.y)) 48 | if Input.is_action_pressed("move_left"): 49 | velo.x+=-cos(deg2rad(aim.y)) 50 | velo.z+=sin(deg2rad(aim.y)) 51 | elif Input.is_action_pressed("move_right"): 52 | velo.x+=cos(deg2rad(aim.y)) 53 | velo.z+=-sin(deg2rad(aim.y)) 54 | velocityGoal=velocityGoal.normalized() 55 | if velo == Vector3(0,0,0): 56 | velocityGoal=Vector3(0,0,0) 57 | if velocityGoalPrev.x*velocityGoal.x<0: 58 | velocityGoal.x=0 59 | if velocityGoalPrev.z*velocityGoal.z<0: 60 | velocityGoal.z=0 61 | 62 | if is_on_floor(): 63 | velocityGoal+=(velo*0.4) 64 | else: 65 | velocityGoal+=(velo*0.2) 66 | 67 | if velocityGoal.x!=0: 68 | var angle = atan2(velocityGoal.z,velocityGoal.x) 69 | velocity.x = cos(angle)*accel 70 | velocity.z = sin(angle)*accel 71 | elif velocityGoal.z!=0: 72 | velocity.x = 0 73 | velocity.z = accel 74 | 75 | velocityGoalPrev = velo 76 | 77 | if Input.is_action_pressed("move_up") and is_on_floor(): 78 | velocity.y=8 79 | 80 | velocity = self.move_and_slide(velocity, Vector3(0,1,0)) 81 | 82 | 83 | func _input(event): 84 | 85 | if event is InputEventMouseMotion: 86 | self.rotate_y(deg2rad(-event.relative.x*mouse_sensitivity)) 87 | var mouse_change_x = -event.relative.y*mouse_sensitivity 88 | if mouse_change_x + camera_angle_x < -90: 89 | mouse_change_x = -90-camera_angle_x 90 | elif mouse_change_x + camera_angle_x > 90: 91 | mouse_change_x = 90-camera_angle_x 92 | get_node("Camera").rotate_x(deg2rad(mouse_change_x)) 93 | camera_angle_x+=mouse_change_x 94 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ ] 12 | _global_script_class_icons={ 13 | 14 | } 15 | 16 | [application] 17 | 18 | config/name="Voxels" 19 | run/main_scene="res://Game.tscn" 20 | config/icon="res://icon.png" 21 | 22 | [debug] 23 | 24 | gdscript/warnings/enable=false 25 | gdscript/warnings/unassigned_variable=false 26 | gdscript/warnings/unassigned_variable_op_assign=false 27 | gdscript/warnings/unused_variable=false 28 | gdscript/warnings/unused_class_variable=false 29 | gdscript/warnings/unused_argument=false 30 | gdscript/warnings/unreachable_code=false 31 | gdscript/warnings/standalone_expression=false 32 | gdscript/warnings/void_assignment=false 33 | gdscript/warnings/narrowing_conversion=false 34 | gdscript/warnings/function_may_yield=false 35 | gdscript/warnings/variable_conflicts_function=false 36 | gdscript/warnings/function_conflicts_variable=false 37 | gdscript/warnings/function_conflicts_constant=false 38 | gdscript/warnings/incompatible_ternary=false 39 | gdscript/warnings/unused_signal=false 40 | gdscript/warnings/return_value_discarded=false 41 | gdscript/warnings/property_used_as_function=false 42 | gdscript/warnings/constant_used_as_function=false 43 | gdscript/warnings/function_used_as_property=false 44 | gdscript/warnings/integer_division=false 45 | gdscript/warnings/deprecated_keyword=false 46 | 47 | [display] 48 | 49 | window/size/width=1280 50 | window/size/height=720 51 | window/size/resizable=false 52 | 53 | [input] 54 | 55 | move_forward={ 56 | "deadzone": 0.5, 57 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":87,"unicode":0,"echo":false,"script":null) 58 | ] 59 | } 60 | move_backward={ 61 | "deadzone": 0.5, 62 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":83,"unicode":0,"echo":false,"script":null) 63 | ] 64 | } 65 | move_left={ 66 | "deadzone": 0.5, 67 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null) 68 | ] 69 | } 70 | move_right={ 71 | "deadzone": 0.5, 72 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":68,"unicode":0,"echo":false,"script":null) 73 | ] 74 | } 75 | move_up={ 76 | "deadzone": 0.5, 77 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":32,"unicode":0,"echo":false,"script":null) 78 | ] 79 | } 80 | move_down={ 81 | "deadzone": 0.5, 82 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777238,"unicode":0,"echo":false,"script":null) 83 | ] 84 | } 85 | save={ 86 | "deadzone": 0.5, 87 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":77,"unicode":0,"echo":false,"script":null) 88 | ] 89 | } 90 | reset={ 91 | "deadzone": 0.5, 92 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":82,"unicode":0,"echo":false,"script":null) 93 | ] 94 | } 95 | sprint={ 96 | "deadzone": 0.5, 97 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777237,"unicode":0,"echo":false,"script":null) 98 | ] 99 | } 100 | sneak={ 101 | "deadzone": 0.5, 102 | "events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":16777238,"unicode":0,"echo":false,"script":null) 103 | ] 104 | } 105 | break={ 106 | "deadzone": 0.5, 107 | "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) 108 | ] 109 | } 110 | place={ 111 | "deadzone": 0.5, 112 | "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) 113 | ] 114 | } 115 | 116 | [rendering] 117 | 118 | environment/default_environment="res://default_env.tres" 119 | -------------------------------------------------------------------------------- /SelectBox.dae: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Blender User 6 | Blender 2.79.0 commit date:2018-03-22, commit time:14:10, hash:f4dc9f9d68b 7 | 8 | 2019-05-24T18:42:15 9 | 2019-05-24T18:42:15 10 | 11 | Z_UP 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 0 0 0 1 21 | 22 | 23 | 0 0 0 1 24 | 25 | 26 | 0 0 0 1 27 | 28 | 29 | 0.5 0.5 0.5 1 30 | 31 | 32 | 50 33 | 34 | 35 | 1 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -49.00001 -48.99996 -51 -49.00001 -50.99996 -51 -51.00001 -50.99996 -51 -51.00001 -48.99996 -51 -49.00001 -48.99996 -49 -49.00001 -50.99996 -49 -51.00001 -50.99996 -49 -51.00001 -48.99996 -49 50.99998 -48.99998 -51 50.99998 -50.99998 -51 50.99998 -48.99999 -49 50.99998 -50.99999 -49 -48.99998 51.00003 -50.99998 -50.99998 51.00003 -50.99998 -48.99998 51.00003 -48.99998 -50.99998 51.00003 -48.99998 -49.00001 -48.99996 50.99998 -49.00001 -50.99996 50.99998 -51.00001 -48.99996 50.99998 -51.00001 -50.99996 50.99998 -51.00001 -48.99996 49 -49.00001 -48.99996 49 -49.00001 -50.99996 49 -51.00001 -50.99996 49 -48.99998 51.00003 50.99999 -50.99998 51.00003 50.99999 -50.99998 51.00003 49.00001 -48.99998 51.00003 49.00001 -48.99998 49.00004 50.99999 -50.99998 49.00004 50.99999 -50.99998 49.00004 49.00001 -48.99998 49.00004 49.00001 -48.99998 49.00004 -48.99998 -50.99998 49.00004 -48.99998 -50.99998 49.00004 -50.99998 -48.99998 49.00004 -50.99998 51 50.99996 -51 51 50.99996 -49 51 48.99997 -49 51 48.99997 -51 48.99999 48.99997 -51 48.99999 48.99997 -49 48.99999 50.99996 -49 48.99999 50.99996 -51 51.00004 48.9999 50.99998 51.00004 50.99989 50.99998 49.00003 50.99989 50.99998 49.00003 48.9999 50.99998 48.99999 -50.99998 -49 48.99999 -48.99998 -49 48.99999 -50.99998 -51 48.99999 -48.99998 -51 50.99997 -48.99999 50.99999 50.99997 -50.99999 50.99999 48.99998 -50.99998 50.99999 48.99998 -48.99998 50.99999 48.99998 -48.99998 49 50.99997 -48.99999 49 50.99997 -50.99999 49 48.99998 -50.99998 49 51.00004 50.99989 49.00001 51.00004 48.9999 49 49.00003 48.9999 49.00001 49.00003 50.99989 49.00001 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 0 0 -1 0 0 1 1 -7.00662e-7 0 0 -1 0 -1 0 0 1 0 0 -1.90736e-6 -1 0 0 0 -1 0 1 0 0 0 -1 -2.72478e-7 -1 0 -1 0 0 -1.40132e-6 -1 0 1 -3.11405e-7 0 0 0 -1 -1 3.11408e-7 0 0 0 1 1 -2.72478e-7 0 0 1.94627e-7 -1 -1 1.94628e-7 0 0 -1.94627e-7 1 0 1 0 1 0 0 2.33551e-7 0 1 -2.33559e-7 0 -1 7.00659e-7 1 0 -7.00659e-7 -1 0 0 0 1 -1.90737e-6 0 -1 2.72478e-7 1 0 -2.72478e-7 -1 0 0 0 1 1 -2.33553e-7 0 0 0 1 -1.90735e-6 0 1 0 0 1 -1 0 0 1 0 0 -1.90737e-6 -1 0 1.90736e-6 1 0 2.72478e-7 1 0 0 -1 -7.00659e-7 0 1 7.00629e-7 -1 0 3.89254e-7 1 0 -3.89255e-7 4.98245e-6 0 1 -1 4.67111e-7 0 1.40132e-6 1 0 1 -7.00666e-7 0 0 0 -1 0 0 -1 -2.72478e-7 -1 0 -1 0 0 -1.40132e-6 -1 0 1 -2.33555e-7 0 -1 2.33554e-7 0 1 -2.33553e-7 0 -1 2.33553e-7 0 0 1 0 1 0 0 0 -1 0 1 0 0 2.33554e-7 0 1 -2.33555e-7 0 -1 3.81471e-6 -3.81473e-6 1 0 0 1 -4.98245e-6 0 -1 0 0 1 -1 0 0 4.9825e-6 0 1 -1.90736e-6 -1 0 1.90737e-6 1 0 2.72478e-7 1 0 0 -1 -7.00631e-7 0 1 7.00655e-7 -1 0 3.89255e-7 1 -1.01207e-6 -3.89254e-7 0 1.55702e-7 1 -1 4.67108e-7 0 0 0 -1 1.40132e-6 1 0 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 |

1 0 3 0 0 0 28 1 25 1 29 1 61 2 52 2 57 2 5 3 2 3 1 3 6 4 3 4 2 4 10 5 9 5 8 5 50 6 11 6 48 6 39 7 51 7 40 7 51 0 9 0 50 0 12 8 15 8 14 8 33 4 13 4 34 4 34 0 12 0 35 0 0 9 50 9 1 9 18 1 17 1 16 1 22 3 19 3 23 3 59 10 17 10 22 10 23 4 18 4 20 4 6 4 20 4 7 4 4 5 22 5 5 5 5 3 23 3 6 3 7 8 21 8 4 8 26 8 24 8 27 8 29 4 26 4 30 4 26 11 33 11 30 11 31 12 47 12 28 12 21 13 28 13 16 13 20 14 31 14 21 14 18 15 30 15 20 15 16 16 29 16 18 16 0 17 32 17 4 17 3 18 35 18 0 18 7 19 34 19 3 19 4 20 33 20 7 20 15 21 27 21 14 21 14 22 31 22 32 22 33 3 31 3 30 3 39 5 37 5 38 5 42 8 36 8 43 8 43 0 39 0 40 0 60 5 44 5 61 5 32 23 42 23 14 23 12 24 40 24 35 24 14 25 43 25 12 25 35 26 41 26 32 26 47 1 45 1 46 1 28 27 46 27 24 27 63 8 45 8 60 8 62 28 57 28 56 28 4 29 51 29 0 29 1 30 48 30 5 30 5 31 49 31 4 31 8 32 38 32 10 32 51 4 41 4 40 4 49 33 38 33 41 33 54 34 52 34 55 34 58 6 54 6 59 6 57 5 53 5 58 5 17 35 55 35 16 35 48 36 56 36 49 36 10 37 58 37 11 37 11 38 59 38 48 38 49 39 57 39 10 39 56 0 22 0 21 0 55 40 21 40 16 40 41 41 61 41 62 41 42 42 60 42 37 42 41 43 63 43 42 43 37 44 61 44 38 44 55 45 44 45 47 45 62 46 55 46 47 46 63 0 31 0 27 0 24 47 63 47 27 47 1 0 2 0 3 0 28 1 24 1 25 1 61 48 44 48 52 48 5 3 6 3 2 3 6 4 7 4 3 4 10 5 11 5 9 5 50 3 9 3 11 3 39 49 8 49 51 49 51 0 8 0 9 0 12 8 13 8 15 8 33 4 15 4 13 4 34 0 13 0 12 0 0 50 51 50 50 50 18 1 19 1 17 1 22 3 17 3 19 3 59 51 54 51 17 51 23 4 19 4 18 4 6 4 23 4 20 4 4 5 21 5 22 5 5 3 22 3 23 3 7 8 20 8 21 8 26 8 25 8 24 8 29 4 25 4 26 4 26 52 15 52 33 52 31 53 62 53 47 53 21 54 31 54 28 54 20 14 30 14 31 14 18 55 29 55 30 55 16 16 28 16 29 16 0 56 35 56 32 56 3 18 34 18 35 18 7 57 33 57 34 57 4 20 32 20 33 20 15 58 26 58 27 58 14 59 27 59 31 59 33 60 32 60 31 60 39 5 36 5 37 5 42 8 37 8 36 8 43 0 36 0 39 0 60 61 45 61 44 61 32 62 41 62 42 62 12 63 43 63 40 63 14 25 42 25 43 25 35 26 40 26 41 26 47 64 44 64 45 64 28 65 47 65 46 65 63 8 46 8 45 8 62 66 61 66 57 66 4 29 49 29 51 29 1 30 50 30 48 30 5 67 48 67 49 67 8 56 39 56 38 56 51 68 49 68 41 68 49 69 10 69 38 69 54 1 53 1 52 1 58 6 53 6 54 6 57 5 52 5 53 5 17 67 54 67 55 67 48 36 59 36 56 36 10 37 57 37 58 37 11 70 58 70 59 70 49 71 56 71 57 71 56 9 59 9 22 9 55 72 56 72 21 72 41 73 38 73 61 73 42 74 63 74 60 74 41 75 62 75 63 75 37 76 60 76 61 76 55 77 52 77 44 77 62 78 56 78 55 78 63 79 62 79 31 79 24 80 46 80 63 80

77 |
78 |
79 |
80 |
81 | 82 | 83 | 84 | 85 | 0.009999995 0 0 0 0 0.01 0 0 0 0 0.01 0 0 0 0 1 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
-------------------------------------------------------------------------------- /Chunk.gd: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | var chunk_pos = Vector3(0,0,0) 4 | var noise = OpenSimplexNoise.new() 5 | onready var game = get_tree().get_root().get_node("Game") 6 | #var mat = SpatialMaterial.new() 7 | var mesh_node 8 | var chunk_mesh 9 | var block_class 10 | var static_node 11 | var temp_dict_2 = {} 12 | var block_dict = {} 13 | var blocks = {} 14 | var count = 0 15 | var texture_atlas_size = Vector2(8,8) 16 | var mat = load("res://TextureMaterial.tres") 17 | 18 | var adjacent_blocks = { 19 | Side.front : Vector3(0,0,1), 20 | Side.back : Vector3(0,0,-1), 21 | Side.right : Vector3(1,0,0), 22 | Side.left : Vector3(-1,0,0), 23 | Side.top : Vector3(0,1,0), 24 | Side.bottom : Vector3(0,-1,0), 25 | } 26 | 27 | var block_types = {0:{Side.top:Vector2(0,0),Side.bottom:Vector2(2,0),Side.left:Vector2(1,0), 28 | Side.right:Vector2(1,0),Side.front:Vector2(1,0),Side.back:Vector2(1,0)}, 29 | 1:{Side.top:Vector2(3,0),Side.bottom:Vector2(3,0),Side.left:Vector2(3,0), 30 | Side.right:Vector2(3,0),Side.front:Vector2(3,0),Side.back:Vector2(3,0)}, 31 | 2:{Side.top:Vector2(4,0),Side.bottom:Vector2(4,0),Side.left:Vector2(4,0), 32 | Side.right:Vector2(4,0),Side.front:Vector2(4,0),Side.back:Vector2(4,0)}, 33 | 3:{Side.top:Vector2(5,0),Side.bottom:Vector2(5,0),Side.left:Vector2(5,0), 34 | Side.right:Vector2(5,0),Side.front:Vector2(5,0),Side.back:Vector2(5,0)},} 35 | 36 | 37 | enum Side { 38 | front, 39 | back, 40 | right, 41 | left, 42 | top, 43 | bottom 44 | } 45 | 46 | func _ready(): 47 | pass 48 | 49 | func get_texture_atlas_uvs(size,pos): 50 | var offset = Vector2(pos.x/size.x,pos.y/size.y) 51 | var bottom_right = Vector2(offset.x+(1/size.x),offset.y+(1/size.y)) 52 | var top_left = Vector2(offset.x,offset.y) 53 | var top_right = Vector2(offset.x+(1/size.x),offset.y) 54 | var bottom_left = Vector2(offset.x,offset.y+(1/size.y)) 55 | return [top_left, top_right, bottom_left, bottom_right] 56 | 57 | 58 | func get_cube_uvs(orient,type): 59 | var uv_array = [] 60 | 61 | if orient==Side.front: 62 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.front]) 63 | uv_array = [ 64 | coordinates[0], 65 | coordinates[3], 66 | coordinates[2], 67 | 68 | coordinates[1], 69 | coordinates[3], 70 | coordinates[0], 71 | ] 72 | if orient==Side.back: 73 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.back]) 74 | uv_array = [ 75 | coordinates[0], 76 | coordinates[1], 77 | coordinates[3], 78 | 79 | coordinates[0], 80 | coordinates[3], 81 | coordinates[2], 82 | ] 83 | if orient==Side.right: 84 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.right]) 85 | uv_array = [ 86 | coordinates[0], 87 | coordinates[1], 88 | coordinates[3], 89 | 90 | coordinates[3], 91 | coordinates[2], 92 | coordinates[0], 93 | ] 94 | if orient==Side.left: 95 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.left]) 96 | uv_array = [ 97 | coordinates[2], 98 | coordinates[1], 99 | coordinates[3], 100 | 101 | coordinates[2], 102 | coordinates[0], 103 | coordinates[1], 104 | ] 105 | if orient==Side.top: 106 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.top]) 107 | uv_array = [ 108 | coordinates[3], 109 | coordinates[0], 110 | coordinates[1], 111 | 112 | coordinates[3], 113 | coordinates[2], 114 | coordinates[0], 115 | ] 116 | if orient==Side.bottom: 117 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.bottom]) 118 | uv_array = [ 119 | coordinates[2], 120 | coordinates[0], 121 | coordinates[1], 122 | 123 | coordinates[2], 124 | coordinates[1], 125 | coordinates[3], 126 | ] 127 | 128 | return uv_array 129 | 130 | 131 | func get_cube_vertices(orient): 132 | 133 | var vertice_array = [] 134 | 135 | if orient==Side.front: 136 | vertice_array = [ 137 | Vector3(0,1,1), 138 | Vector3(1,0,1), 139 | Vector3(0,0,1), 140 | 141 | Vector3(1,1,1), 142 | Vector3(1,0,1), 143 | Vector3(0,1,1), 144 | ] 145 | elif orient==Side.back: 146 | vertice_array = [ 147 | Vector3(1,1,0), 148 | Vector3(0,1,0), 149 | Vector3(0,0,0), 150 | 151 | Vector3(1,1,0), 152 | Vector3(0,0,0), 153 | Vector3(1,0,0), 154 | ] 155 | elif orient==Side.right: 156 | vertice_array = [ 157 | Vector3(1,1,1), 158 | Vector3(1,1,0), 159 | Vector3(1,0,0), 160 | 161 | Vector3(1,0,0), 162 | Vector3(1,0,1), 163 | Vector3(1,1,1), 164 | ] 165 | elif orient==Side.left: 166 | vertice_array = [ 167 | Vector3(0,0,0), 168 | Vector3(0,1,1), 169 | Vector3(0,0,1), 170 | 171 | Vector3(0,0,0), 172 | Vector3(0,1,0), 173 | Vector3(0,1,1), 174 | ] 175 | elif orient==Side.top: 176 | vertice_array = [ 177 | Vector3(1,1,1), 178 | Vector3(0,1,0), 179 | Vector3(1,1,0), 180 | 181 | Vector3(1,1,1), 182 | Vector3(0,1,1), 183 | Vector3(0,1,0), 184 | ] 185 | elif orient==Side.bottom: 186 | vertice_array = [ 187 | Vector3(1,0,1), 188 | Vector3(1,0,0), 189 | Vector3(0,0,0), 190 | 191 | Vector3(1,0,1), 192 | Vector3(0,0,0), 193 | Vector3(0,0,1), 194 | ] 195 | return vertice_array 196 | 197 | 198 | func update_chunk(update_blocks=null): 199 | 200 | if update_blocks==null: 201 | update_blocks = block_dict.keys() 202 | for block in update_blocks: 203 | if not block in block_dict: 204 | continue 205 | block_dict[block]["a"] = [] 206 | var x = block.x 207 | var y = block.y 208 | var z = block.z 209 | for s in adjacent_blocks: 210 | if not block_dict.has((adjacent_blocks[s]+block)): 211 | block_dict[block]["a"].append(s) 212 | 213 | render_chunk() 214 | gen_chunk_collision() 215 | display_chunk() 216 | 217 | 218 | func display_chunk(): 219 | 220 | add_child(chunk_mesh) 221 | 222 | 223 | func render_chunk(): 224 | if chunk_mesh!=null: 225 | chunk_mesh.free() 226 | var mesh_instance = MeshInstance.new() 227 | var surface_tool = SurfaceTool.new() 228 | 229 | surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES) 230 | 231 | for b in block_dict: 232 | var block = block_dict[b] 233 | var vertices = [] 234 | var uvs = [] 235 | 236 | for a in block["a"]: 237 | vertices += get_cube_vertices(a) 238 | uvs += get_cube_uvs(a,block["t"]) 239 | 240 | for i in vertices.size(): 241 | surface_tool.add_uv(uvs[i]) 242 | surface_tool.add_vertex(vertices[i]+b) 243 | 244 | surface_tool.generate_normals() 245 | surface_tool.set_material(mat) 246 | var m = surface_tool.commit() 247 | mesh_instance.set_mesh(m); 248 | mesh_instance.set_name("mesh") 249 | chunk_mesh = mesh_instance 250 | 251 | 252 | func gen_chunk_collision(): 253 | if static_node!=null: 254 | static_node.free() 255 | var collision_verts = [] 256 | 257 | for b in block_dict: 258 | var vertices = [] 259 | for a in block_dict[b]["a"]: 260 | vertices+=get_cube_vertices(a) 261 | for v in vertices: 262 | collision_verts.append(v+b) 263 | if len(collision_verts)==0: 264 | return 265 | 266 | var static_body = StaticBody.new() 267 | static_body.set_name("StaticBody") 268 | add_child(static_body) 269 | static_node=static_body 270 | var collision_shape = CollisionShape.new() 271 | static_body.add_child(collision_shape) 272 | var concave_polygon_shape = ConcavePolygonShape.new() 273 | concave_polygon_shape.set_faces(collision_verts) 274 | 275 | collision_shape.set_shape(concave_polygon_shape) 276 | 277 | 278 | func place_block(block_vect,type): 279 | block_dict[block_vect] = {"t":1} 280 | var update_blocks = [block_vect] 281 | for s in adjacent_blocks: 282 | update_blocks.append(block_vect+adjacent_blocks[s]) 283 | update_chunk(update_blocks) 284 | 285 | func remove_block(block_vect): 286 | block_dict.erase(block_vect) 287 | var update_blocks = [block_vect] 288 | for s in adjacent_blocks: 289 | update_blocks.append(block_vect+adjacent_blocks[s]) 290 | update_chunk(update_blocks) 291 | var start_time = OS.get_ticks_msec() 292 | func generate_chunk(gen_seed): 293 | var start_time = OS.get_ticks_msec() 294 | var list = [] 295 | var n = 0 296 | 297 | noise.seed = gen_seed 298 | noise.octaves = 3 299 | noise.period = 25 300 | noise.persistence = 0.3 301 | 302 | for i in range(8): 303 | for j in range(8): 304 | for k in range(8): 305 | n = noise.get_noise_3d((i+(chunk_pos[0]*8)),(j+(chunk_pos[1]*8)),(k+(chunk_pos[2]*8))) 306 | n/=2 307 | n+=0.5 308 | #0.955 309 | var thresh = pow(0.955,(j+(chunk_pos[1]*8))) 310 | if n < thresh: 311 | if (j+(chunk_pos[1]*8))<14: 312 | block_dict[Vector3(i,j,k)] = {"t":2} 313 | else: 314 | block_dict[Vector3(i,j,k)] = {"t":0} 315 | elif (j+(chunk_pos[1]*8))<12: 316 | block_dict[Vector3(i,j,k)] = {"t":3} 317 | 318 | 319 | update_chunk() 320 | #print("Elapsed time: ", OS.get_ticks_msec() - start_time) 321 | 322 | 323 | -------------------------------------------------------------------------------- /Game.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var thread_chunking = Thread.new() 4 | var thread_chunk_manager = Thread.new() 5 | var generation_seed = 0 6 | var player_chunk = Vector3(0,0,0) 7 | var chunk_dict = {} 8 | var exit_loop = false 9 | var chunk_queue = [] 10 | var gen_queue = [] 11 | var player_pos = Vector3(0,0,0) 12 | var player_block_pos = Vector3(0,0,0) 13 | var player_chunk_pos = Vector3(0,0,0) 14 | var chunk_manager_init = false 15 | var chunk_queue_mutex = Mutex.new() 16 | var delete_list_mutex = Mutex.new() 17 | var chunk_dict_mutex = Mutex.new() 18 | 19 | 20 | onready var chunk_mutex = Mutex.new() 21 | onready var player_raycast = get_node("Player/Camera/RayCast") 22 | 23 | func _ready(): 24 | randomize() 25 | generation_seed = randi() 26 | thread_chunking.start(self,"chunking",null) 27 | thread_chunk_manager.start(self,"chunk_manager",null) 28 | 29 | 30 | func chunking(a): 31 | while true: 32 | var r = chunk_queue_mutex.try_lock() 33 | if r!=ERR_BUSY: 34 | if len(chunk_queue)>0: 35 | var c = chunk_queue[0] 36 | chunk_queue.remove(0) 37 | chunk_queue_mutex.unlock() 38 | var chunk = place_chunk(c) 39 | 40 | if chunk!=null: 41 | call_deferred("done_chunk_loading",chunk) 42 | 43 | else: 44 | chunk_queue_mutex.unlock() 45 | OS.delay_msec(500) 46 | 47 | func done_chunk_loading(chunk): 48 | get_node("Chunks").add_child(chunk) 49 | chunk_dict_mutex.lock() 50 | chunk_dict[chunk.chunk_pos] = chunk 51 | chunk_dict_mutex.unlock() 52 | chunk.global_transform[3][0] = chunk.chunk_pos[0]*8 53 | chunk.global_transform[3][1] = chunk.chunk_pos[1]*8 54 | chunk.global_transform[3][2] = chunk.chunk_pos[2]*8 55 | 56 | func _process(delta): 57 | 58 | get_node("fps_label").set_text(str(Engine.get_frames_per_second())) 59 | player_pos = get_node("Player").global_transform[3] 60 | player_chunk = Vector3(floor(player_pos[0]/8.0),floor(player_pos[1]/8.0),floor(player_pos[2]/8.0)) 61 | player_block_pos = Vector3(floor(player_pos[0]),floor(player_pos[1]),floor(player_pos[2])) 62 | player_chunk_pos = Vector3(int(player_block_pos.x)%8, 63 | int(player_block_pos.y)%8, 64 | int(player_block_pos.z)%8) 65 | 66 | var block_exist = false 67 | var break_block_pos = Vector3(0,0,0) 68 | var place_block_pos = Vector3(0,0,0) 69 | if player_raycast.get_collider()!=null: 70 | block_exist = true 71 | var raycast_pos = player_raycast.get_collision_point() 72 | var raycast_norm = player_raycast.get_collision_normal() 73 | raycast_pos+=Vector3(-0.5,-0.5,-0.5) 74 | if abs(raycast_norm.x)==1: 75 | break_block_pos.z = int(round(raycast_pos.z)) 76 | place_block_pos.z = int(round(raycast_pos.z)) 77 | break_block_pos.y = int(round(raycast_pos.y)) 78 | place_block_pos.y = int(round(raycast_pos.y)) 79 | if raycast_norm.x>0: 80 | break_block_pos.x = int(floor(raycast_pos.x)) 81 | place_block_pos.x = int(floor(raycast_pos.x))+1 82 | else: 83 | break_block_pos.x = int(ceil(raycast_pos.x)) 84 | place_block_pos.x = int(ceil(raycast_pos.x))-1 85 | if abs(raycast_norm.y)==1: 86 | break_block_pos.z = int(round(raycast_pos.z)) 87 | place_block_pos.z = int(round(raycast_pos.z)) 88 | break_block_pos.x = int(round(raycast_pos.x)) 89 | place_block_pos.x = int(round(raycast_pos.x)) 90 | if raycast_norm.y>0: 91 | break_block_pos.y = int(floor(raycast_pos.y)) 92 | place_block_pos.y = int(floor(raycast_pos.y))+1 93 | else: 94 | break_block_pos.y = int(ceil(raycast_pos.y)) 95 | place_block_pos.y = int(ceil(raycast_pos.y))-1 96 | if abs(raycast_norm.z)==1: 97 | break_block_pos.x = int(round(raycast_pos.x)) 98 | place_block_pos.x = int(round(raycast_pos.x)) 99 | break_block_pos.y = int(round(raycast_pos.y)) 100 | place_block_pos.y = int(round(raycast_pos.y)) 101 | if raycast_norm.z>0: 102 | break_block_pos.z = int(floor(raycast_pos.z)) 103 | place_block_pos.z = int(floor(raycast_pos.z))+1 104 | else: 105 | break_block_pos.z = int(ceil(raycast_pos.z)) 106 | place_block_pos.z = int(ceil(raycast_pos.z))-1 107 | 108 | 109 | var break_block_chunk = Vector3(floor(break_block_pos[0]/8.0),floor((break_block_pos[1])/8.0),floor(break_block_pos[2]/8.0)) 110 | var break_block_block_pos = Vector3(floor(break_block_pos[0]),floor(break_block_pos[1]),floor(break_block_pos[2])) 111 | var break_block_chunk_pos = Vector3(int(break_block_block_pos.x)%8, 112 | int(break_block_block_pos.y)%8, 113 | int(break_block_block_pos.z)%8) 114 | if break_block_chunk_pos.x<0: 115 | break_block_chunk_pos.x=8+break_block_chunk_pos.x 116 | if break_block_chunk_pos.y<0: 117 | break_block_chunk_pos.y=8+break_block_chunk_pos.y 118 | if break_block_chunk_pos.z<0: 119 | break_block_chunk_pos.z=8+break_block_chunk_pos.z 120 | 121 | var place_block_chunk = Vector3(floor(place_block_pos[0]/8.0),floor((place_block_pos[1])/8.0),floor(place_block_pos[2]/8.0)) 122 | var place_block_block_pos = Vector3(floor(place_block_pos[0]),floor(place_block_pos[1]),floor(place_block_pos[2])) 123 | var place_block_chunk_pos = Vector3(int(place_block_block_pos.x)%8, 124 | int(place_block_block_pos.y)%8, 125 | int(place_block_block_pos.z)%8) 126 | if place_block_chunk_pos.x<0: 127 | place_block_chunk_pos.x=8+place_block_chunk_pos.x 128 | if place_block_chunk_pos.y<0: 129 | place_block_chunk_pos.y=8+place_block_chunk_pos.y 130 | if place_block_chunk_pos.z<0: 131 | place_block_chunk_pos.z=8+place_block_chunk_pos.z 132 | 133 | if block_exist: 134 | get_node("SelectBox").show() 135 | get_node("SelectBox").transform[3] = break_block_pos+Vector3(0.5,0.5,0.5) 136 | else: 137 | get_node("SelectBox").hide() 138 | 139 | 140 | if Input.is_action_just_pressed("break"): 141 | if block_exist: 142 | chunk_dict_mutex.lock() 143 | chunk_dict[break_block_chunk].remove_block(break_block_chunk_pos) 144 | chunk_dict_mutex.unlock() 145 | if Input.is_action_just_pressed("place"): 146 | if block_exist: 147 | chunk_dict_mutex.lock() 148 | chunk_dict[place_block_chunk].place_block(place_block_chunk_pos,1) 149 | chunk_dict_mutex.unlock() 150 | 151 | 152 | 153 | 154 | func place_chunk(c): 155 | chunk_dict_mutex.lock() 156 | if not c in chunk_dict: 157 | chunk_dict_mutex.unlock() 158 | var chunk = load("res://Chunk.tscn").instance() 159 | chunk.chunk_pos = c 160 | chunk.set_name(str(c.x)+" "+str(c.y)+" "+str(c.z)) 161 | chunk.generate_chunk(generation_seed) 162 | return chunk 163 | else: 164 | chunk_dict_mutex.unlock() 165 | 166 | var exit = false 167 | var copied = false 168 | var chunk_list_copy = [] 169 | var chunk_list = [] 170 | var prev_player_chunk = Vector3(0,0,0) 171 | var vert_count = 0 172 | var vert_num = 8 173 | var dir = 0 174 | var count = 0 175 | var num = 1 176 | var twice = false 177 | var chunk_on = Vector3(0,0,0) 178 | var count_chunks = 0 179 | var chunk_num = pow(32,2)#32 180 | var done = false 181 | var init_chunk = false 182 | var delete_list = [] 183 | var change_queue = false 184 | var change_delete_list = false 185 | var prev_chunk_list = chunk_list 186 | 187 | func chunk_manager(a): 188 | 189 | while true: 190 | if done == false: 191 | while(count_chunks= 3: 257 | break 258 | chunk_dict_mutex.unlock() 259 | delete_list_mutex.unlock() 260 | 261 | if done==true: 262 | OS.delay_msec(100) 263 | 264 | if done==true and change_queue == false and change_delete_list == true: 265 | var r = chunk_queue_mutex.try_lock() 266 | if r != ERR_BUSY: 267 | chunk_queue = [] 268 | for c in chunk_list: 269 | chunk_queue.append(c) 270 | 271 | chunk_queue_mutex.unlock() 272 | change_queue = true 273 | if done==true and change_delete_list == false: 274 | var r = delete_list_mutex.try_lock() 275 | if r != ERR_BUSY: 276 | for c in prev_chunk_list: 277 | if not c in chunk_list: 278 | if not c in delete_list: 279 | delete_list.append(c) 280 | for c in chunk_list: 281 | if c in delete_list: 282 | delete_list.erase(c) 283 | delete_list_mutex.unlock() 284 | change_delete_list = true 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | -------------------------------------------------------------------------------- /Game.gd.orig: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var thread_chunking = Thread.new() 4 | var thread_chunk_manager = Thread.new() 5 | var generation_seed = 0 6 | var player_chunk = Vector3(0,0,0) 7 | var chunk_dict = {} 8 | var exit_loop = false 9 | var chunk_queue = [] 10 | var gen_queue = [] 11 | var player_pos = Vector3(0,0,0) 12 | var player_block_pos = Vector3(0,0,0) 13 | var player_chunk_pos = Vector3(0,0,0) 14 | var chunk_manager_init = false 15 | var chunk_queue_mutex = Mutex.new() 16 | var delete_list_mutex = Mutex.new() 17 | var chunk_dict_mutex = Mutex.new() 18 | 19 | 20 | onready var chunk_mutex = Mutex.new() 21 | onready var player_raycast = get_node("Player/Camera/RayCast") 22 | 23 | func _ready(): 24 | randomize() 25 | generation_seed = randi() 26 | thread_chunking.start(self,"chunking",null) 27 | thread_chunk_manager.start(self,"chunk_manager",null) 28 | 29 | 30 | func chunking(a): 31 | while true: 32 | var r = chunk_queue_mutex.try_lock() 33 | if r!=ERR_BUSY: 34 | if len(chunk_queue)>0: 35 | var c = chunk_queue[0] 36 | chunk_queue.remove(0) 37 | chunk_queue_mutex.unlock() 38 | var chunk = place_chunk(c) 39 | 40 | if chunk!=null: 41 | call_deferred("done_chunk_loading",chunk) 42 | 43 | else: 44 | chunk_queue_mutex.unlock() 45 | OS.delay_msec(500) 46 | 47 | func done_chunk_loading(chunk): 48 | get_node("Chunks").add_child(chunk) 49 | chunk_dict_mutex.lock() 50 | chunk_dict[chunk.chunk_pos] = chunk 51 | chunk_dict_mutex.unlock() 52 | chunk.global_transform[3][0] = chunk.chunk_pos[0]*8 53 | chunk.global_transform[3][1] = chunk.chunk_pos[1]*8 54 | chunk.global_transform[3][2] = chunk.chunk_pos[2]*8 55 | 56 | func _process(delta): 57 | 58 | get_node("fps_label").set_text(str(Engine.get_frames_per_second())) 59 | player_pos = get_node("Player").global_transform[3] 60 | player_chunk = Vector3(floor(player_pos[0]/8.0),floor(player_pos[1]/8.0),floor(player_pos[2]/8.0)) 61 | player_block_pos = Vector3(floor(player_pos[0]),floor(player_pos[1]),floor(player_pos[2])) 62 | player_chunk_pos = Vector3(int(player_block_pos.x)%8, 63 | int(player_block_pos.y)%8, 64 | int(player_block_pos.z)%8) 65 | 66 | var block_exist = false 67 | var break_block_pos = Vector3(0,0,0) 68 | var place_block_pos = Vector3(0,0,0) 69 | if player_raycast.get_collider()!=null: 70 | block_exist = true 71 | var raycast_pos = player_raycast.get_collision_point() 72 | var raycast_norm = player_raycast.get_collision_normal() 73 | raycast_pos+=Vector3(-0.5,-0.5,-0.5) 74 | if abs(raycast_norm.x)==1: 75 | break_block_pos.z = int(round(raycast_pos.z)) 76 | place_block_pos.z = int(round(raycast_pos.z)) 77 | break_block_pos.y = int(round(raycast_pos.y)) 78 | place_block_pos.y = int(round(raycast_pos.y)) 79 | if raycast_norm.x>0: 80 | break_block_pos.x = int(floor(raycast_pos.x)) 81 | place_block_pos.x = int(floor(raycast_pos.x))+1 82 | else: 83 | break_block_pos.x = int(ceil(raycast_pos.x)) 84 | place_block_pos.x = int(ceil(raycast_pos.x))-1 85 | if abs(raycast_norm.y)==1: 86 | break_block_pos.z = int(round(raycast_pos.z)) 87 | place_block_pos.z = int(round(raycast_pos.z)) 88 | break_block_pos.x = int(round(raycast_pos.x)) 89 | place_block_pos.x = int(round(raycast_pos.x)) 90 | if raycast_norm.y>0: 91 | break_block_pos.y = int(floor(raycast_pos.y)) 92 | place_block_pos.y = int(floor(raycast_pos.y))+1 93 | else: 94 | break_block_pos.y = int(ceil(raycast_pos.y)) 95 | place_block_pos.y = int(ceil(raycast_pos.y))-1 96 | if abs(raycast_norm.z)==1: 97 | break_block_pos.x = int(round(raycast_pos.x)) 98 | place_block_pos.x = int(round(raycast_pos.x)) 99 | break_block_pos.y = int(round(raycast_pos.y)) 100 | place_block_pos.y = int(round(raycast_pos.y)) 101 | if raycast_norm.z>0: 102 | break_block_pos.z = int(floor(raycast_pos.z)) 103 | place_block_pos.z = int(floor(raycast_pos.z))+1 104 | else: 105 | break_block_pos.z = int(ceil(raycast_pos.z)) 106 | place_block_pos.z = int(ceil(raycast_pos.z))-1 107 | 108 | 109 | var break_block_chunk = Vector3(floor(break_block_pos[0]/8.0),floor((break_block_pos[1])/8.0),floor(break_block_pos[2]/8.0)) 110 | var break_block_block_pos = Vector3(floor(break_block_pos[0]),floor(break_block_pos[1]),floor(break_block_pos[2])) 111 | var break_block_chunk_pos = Vector3(int(break_block_block_pos.x)%8, 112 | int(break_block_block_pos.y)%8, 113 | int(break_block_block_pos.z)%8) 114 | if break_block_chunk_pos.x<0: 115 | break_block_chunk_pos.x=8+break_block_chunk_pos.x 116 | if break_block_chunk_pos.y<0: 117 | break_block_chunk_pos.y=8+break_block_chunk_pos.y 118 | if break_block_chunk_pos.z<0: 119 | break_block_chunk_pos.z=8+break_block_chunk_pos.z 120 | 121 | var place_block_chunk = Vector3(floor(place_block_pos[0]/8.0),floor((place_block_pos[1])/8.0),floor(place_block_pos[2]/8.0)) 122 | var place_block_block_pos = Vector3(floor(place_block_pos[0]),floor(place_block_pos[1]),floor(place_block_pos[2])) 123 | var place_block_chunk_pos = Vector3(int(place_block_block_pos.x)%8, 124 | int(place_block_block_pos.y)%8, 125 | int(place_block_block_pos.z)%8) 126 | if place_block_chunk_pos.x<0: 127 | place_block_chunk_pos.x=8+place_block_chunk_pos.x 128 | if place_block_chunk_pos.y<0: 129 | place_block_chunk_pos.y=8+place_block_chunk_pos.y 130 | if place_block_chunk_pos.z<0: 131 | place_block_chunk_pos.z=8+place_block_chunk_pos.z 132 | 133 | if block_exist: 134 | get_node("SelectBox").show() 135 | get_node("SelectBox").transform[3] = break_block_pos+Vector3(0.5,0.5,0.5) 136 | else: 137 | get_node("SelectBox").hide() 138 | 139 | 140 | if Input.is_action_just_pressed("break"): 141 | if block_exist: 142 | chunk_dict_mutex.lock() 143 | chunk_dict[break_block_chunk].remove_block(break_block_chunk_pos) 144 | chunk_dict_mutex.unlock() 145 | if Input.is_action_just_pressed("place"): 146 | if block_exist: 147 | chunk_dict_mutex.lock() 148 | chunk_dict[place_block_chunk].place_block(place_block_chunk_pos,1) 149 | chunk_dict_mutex.unlock() 150 | 151 | 152 | 153 | 154 | func place_chunk(c): 155 | chunk_dict_mutex.lock() 156 | if not c in chunk_dict: 157 | chunk_dict_mutex.unlock() 158 | var chunk = load("res://Chunk.tscn").instance() 159 | chunk.chunk_pos = c 160 | chunk.set_name(str(c.x)+" "+str(c.y)+" "+str(c.z)) 161 | chunk.generate_chunk(generation_seed) 162 | return chunk 163 | else: 164 | chunk_dict_mutex.unlock() 165 | 166 | var exit = false 167 | var copied = false 168 | var chunk_list_copy = [] 169 | var chunk_list = [] 170 | var prev_player_chunk = Vector3(0,0,0) 171 | var vert_count = 0 172 | var vert_num = 8 173 | var dir = 0 174 | var count = 0 175 | var num = 1 176 | var twice = false 177 | var chunk_on = Vector3(0,0,0) 178 | var count_chunks = 0 179 | var chunk_num = pow(32,2)#32 180 | var done = false 181 | var init_chunk = false 182 | var delete_list = [] 183 | var change_queue = false 184 | var change_delete_list = false 185 | var prev_chunk_list = chunk_list 186 | 187 | func chunk_manager(a): 188 | 189 | while true: 190 | if done == false: 191 | while(count_chunks= 3: 257 | break 258 | chunk_dict_mutex.unlock() 259 | delete_list_mutex.unlock() 260 | 261 | if done==true: 262 | OS.delay_msec(100) 263 | 264 | if done==true and change_queue == false and change_delete_list == true: 265 | var r = chunk_queue_mutex.try_lock() 266 | if r != ERR_BUSY: 267 | chunk_queue = [] 268 | for c in chunk_list: 269 | chunk_queue.append(c) 270 | 271 | chunk_queue_mutex.unlock() 272 | change_queue = true 273 | if done==true and change_delete_list == false: 274 | var r = delete_list_mutex.try_lock() 275 | if r != ERR_BUSY: 276 | for c in prev_chunk_list: 277 | if not c in chunk_list: 278 | if not c in delete_list: 279 | delete_list.append(c) 280 | for c in chunk_list: 281 | if c in delete_list: 282 | delete_list.erase(c) 283 | delete_list_mutex.unlock() 284 | change_delete_list = true 285 | 286 | 287 | 288 | 289 | 290 | <<<<<<< HEAD 291 | ======= 292 | if not thread_chunking.is_active(): 293 | if len(chunk_queue)>0: 294 | var c = chunk_queue[0] 295 | chunk_queue.remove(0) 296 | 297 | place_chunk(c) 298 | 299 | >>>>>>> 91b5b4f380c84bf63acef11e85649dc003041b31 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | -------------------------------------------------------------------------------- /Chunk.gd.orig: -------------------------------------------------------------------------------- 1 | extends Spatial 2 | 3 | var chunk_pos = Vector3(0,0,0) 4 | var noise = OpenSimplexNoise.new() 5 | onready var game = get_tree().get_root().get_node("Game") 6 | #var mat = SpatialMaterial.new() 7 | var mesh_node 8 | var chunk_mesh 9 | var block_class 10 | var static_node 11 | var temp_dict_2 = {} 12 | var block_dict = {} 13 | var blocks = {} 14 | var count = 0 15 | var texture_atlas_size = Vector2(8,8) 16 | var mat = load("res://TextureMaterial.tres") 17 | 18 | var adjacent_blocks = { 19 | Side.front : Vector3(0,0,1), 20 | Side.back : Vector3(0,0,-1), 21 | Side.right : Vector3(1,0,0), 22 | Side.left : Vector3(-1,0,0), 23 | Side.top : Vector3(0,1,0), 24 | Side.bottom : Vector3(0,-1,0), 25 | } 26 | 27 | var block_types = {0:{Side.top:Vector2(0,0),Side.bottom:Vector2(2,0),Side.left:Vector2(1,0), 28 | Side.right:Vector2(1,0),Side.front:Vector2(1,0),Side.back:Vector2(1,0)}, 29 | 1:{Side.top:Vector2(3,0),Side.bottom:Vector2(3,0),Side.left:Vector2(3,0), 30 | Side.right:Vector2(3,0),Side.front:Vector2(3,0),Side.back:Vector2(3,0)}, 31 | 2:{Side.top:Vector2(4,0),Side.bottom:Vector2(4,0),Side.left:Vector2(4,0), 32 | Side.right:Vector2(4,0),Side.front:Vector2(4,0),Side.back:Vector2(4,0)}, 33 | 3:{Side.top:Vector2(5,0),Side.bottom:Vector2(5,0),Side.left:Vector2(5,0), 34 | Side.right:Vector2(5,0),Side.front:Vector2(5,0),Side.back:Vector2(5,0)},} 35 | 36 | 37 | enum Side { 38 | front, 39 | back, 40 | right, 41 | left, 42 | top, 43 | bottom 44 | } 45 | 46 | func _ready(): 47 | pass 48 | 49 | func get_texture_atlas_uvs(size,pos): 50 | var offset = Vector2(pos.x/size.x,pos.y/size.y) 51 | var bottom_right = Vector2(offset.x+(1/size.x),offset.y+(1/size.y)) 52 | var top_left = Vector2(offset.x,offset.y) 53 | var top_right = Vector2(offset.x+(1/size.x),offset.y) 54 | var bottom_left = Vector2(offset.x,offset.y+(1/size.y)) 55 | return [top_left, top_right, bottom_left, bottom_right] 56 | 57 | 58 | func get_cube_uvs(orient,type): 59 | var uv_array = [] 60 | 61 | if orient==Side.front: 62 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.front]) 63 | uv_array = [ 64 | coordinates[0], 65 | coordinates[3], 66 | coordinates[2], 67 | 68 | coordinates[1], 69 | coordinates[3], 70 | coordinates[0], 71 | ] 72 | if orient==Side.back: 73 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.back]) 74 | uv_array = [ 75 | coordinates[0], 76 | coordinates[1], 77 | coordinates[3], 78 | 79 | coordinates[0], 80 | coordinates[3], 81 | coordinates[2], 82 | ] 83 | if orient==Side.right: 84 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.right]) 85 | uv_array = [ 86 | coordinates[0], 87 | coordinates[1], 88 | coordinates[3], 89 | 90 | coordinates[3], 91 | coordinates[2], 92 | coordinates[0], 93 | ] 94 | if orient==Side.left: 95 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.left]) 96 | uv_array = [ 97 | coordinates[2], 98 | coordinates[1], 99 | coordinates[3], 100 | 101 | coordinates[2], 102 | coordinates[0], 103 | coordinates[1], 104 | ] 105 | if orient==Side.top: 106 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.top]) 107 | uv_array = [ 108 | coordinates[3], 109 | coordinates[0], 110 | coordinates[1], 111 | 112 | coordinates[3], 113 | coordinates[2], 114 | coordinates[0], 115 | ] 116 | if orient==Side.bottom: 117 | var coordinates = get_texture_atlas_uvs(texture_atlas_size,block_types[type][Side.bottom]) 118 | uv_array = [ 119 | coordinates[2], 120 | coordinates[0], 121 | coordinates[1], 122 | 123 | coordinates[2], 124 | coordinates[1], 125 | coordinates[3], 126 | ] 127 | 128 | return uv_array 129 | 130 | 131 | func get_cube_vertices(orient): 132 | 133 | var vertice_array = [] 134 | 135 | if orient==Side.front: 136 | vertice_array = [ 137 | Vector3(0,1,1), 138 | Vector3(1,0,1), 139 | Vector3(0,0,1), 140 | 141 | Vector3(1,1,1), 142 | Vector3(1,0,1), 143 | Vector3(0,1,1), 144 | ] 145 | elif orient==Side.back: 146 | vertice_array = [ 147 | Vector3(1,1,0), 148 | Vector3(0,1,0), 149 | Vector3(0,0,0), 150 | 151 | Vector3(1,1,0), 152 | Vector3(0,0,0), 153 | Vector3(1,0,0), 154 | ] 155 | elif orient==Side.right: 156 | vertice_array = [ 157 | Vector3(1,1,1), 158 | Vector3(1,1,0), 159 | Vector3(1,0,0), 160 | 161 | Vector3(1,0,0), 162 | Vector3(1,0,1), 163 | Vector3(1,1,1), 164 | ] 165 | elif orient==Side.left: 166 | vertice_array = [ 167 | Vector3(0,0,0), 168 | Vector3(0,1,1), 169 | Vector3(0,0,1), 170 | 171 | Vector3(0,0,0), 172 | Vector3(0,1,0), 173 | Vector3(0,1,1), 174 | ] 175 | elif orient==Side.top: 176 | vertice_array = [ 177 | Vector3(1,1,1), 178 | Vector3(0,1,0), 179 | Vector3(1,1,0), 180 | 181 | Vector3(1,1,1), 182 | Vector3(0,1,1), 183 | Vector3(0,1,0), 184 | ] 185 | elif orient==Side.bottom: 186 | vertice_array = [ 187 | Vector3(1,0,1), 188 | Vector3(1,0,0), 189 | Vector3(0,0,0), 190 | 191 | Vector3(1,0,1), 192 | Vector3(0,0,0), 193 | Vector3(0,0,1), 194 | ] 195 | return vertice_array 196 | 197 | 198 | func update_chunk(update_blocks=null): 199 | 200 | if update_blocks==null: 201 | update_blocks = block_dict.keys() 202 | for block in update_blocks: 203 | if not block in block_dict: 204 | continue 205 | block_dict[block]["a"] = [] 206 | var x = block.x 207 | var y = block.y 208 | var z = block.z 209 | for s in adjacent_blocks: 210 | if not block_dict.has((adjacent_blocks[s]+block)): 211 | block_dict[block]["a"].append(s) 212 | 213 | render_chunk() 214 | gen_chunk_collision() 215 | display_chunk() 216 | 217 | 218 | func display_chunk(): 219 | 220 | add_child(chunk_mesh) 221 | 222 | 223 | func render_chunk(): 224 | if chunk_mesh!=null: 225 | chunk_mesh.free() 226 | var mesh_instance = MeshInstance.new() 227 | var surface_tool = SurfaceTool.new() 228 | 229 | surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES) 230 | 231 | for b in block_dict: 232 | var block = block_dict[b] 233 | var vertices = [] 234 | var uvs = [] 235 | 236 | for a in block["a"]: 237 | vertices += get_cube_vertices(a) 238 | uvs += get_cube_uvs(a,block["t"]) 239 | 240 | for i in vertices.size(): 241 | surface_tool.add_uv(uvs[i]) 242 | surface_tool.add_vertex(vertices[i]+b) 243 | 244 | surface_tool.generate_normals() 245 | surface_tool.set_material(mat) 246 | var m = surface_tool.commit() 247 | mesh_instance.set_mesh(m); 248 | mesh_instance.set_name("mesh") 249 | chunk_mesh = mesh_instance 250 | 251 | 252 | func gen_chunk_collision(): 253 | if static_node!=null: 254 | static_node.free() 255 | var collision_verts = [] 256 | 257 | for b in block_dict: 258 | var vertices = [] 259 | for a in block_dict[b]["a"]: 260 | vertices+=get_cube_vertices(a) 261 | for v in vertices: 262 | collision_verts.append(v+b) 263 | if len(collision_verts)==0: 264 | return 265 | 266 | var static_body = StaticBody.new() 267 | static_body.set_name("StaticBody") 268 | add_child(static_body) 269 | static_node=static_body 270 | var collision_shape = CollisionShape.new() 271 | static_body.add_child(collision_shape) 272 | var concave_polygon_shape = ConcavePolygonShape.new() 273 | concave_polygon_shape.set_faces(collision_verts) 274 | 275 | collision_shape.set_shape(concave_polygon_shape) 276 | 277 | 278 | func place_block(block_vect,type): 279 | block_dict[block_vect] = {"t":1} 280 | var update_blocks = [block_vect] 281 | for s in adjacent_blocks: 282 | update_blocks.append(block_vect+adjacent_blocks[s]) 283 | update_chunk(update_blocks) 284 | 285 | func remove_block(block_vect): 286 | block_dict.erase(block_vect) 287 | <<<<<<< HEAD 288 | var update_blocks = [block_vect] 289 | for s in adjacent_blocks: 290 | update_blocks.append(block_vect+adjacent_blocks[s]) 291 | update_chunk(update_blocks) 292 | 293 | func generate_chunk(gen_seed): 294 | ======= 295 | var x = block_vect.x 296 | var y = block_vect.y 297 | var z = block_vect.z 298 | var adj_name_list = {"top":Vector3(x,y+1,z),"bottom":Vector3(x,y-1,z), 299 | "front":Vector3(x,y,z+1),"back":Vector3(x,y,z-1), 300 | "right":Vector3(x+1,y,z),"left":Vector3(x-1,y,z)} 301 | 302 | var order_list = [] 303 | for a in adj_name_list: 304 | if adj_name_list[a] in block_dict: 305 | order_list.append([adj_name_list[a],block_dict[adj_name_list[a]]["type"]]) 306 | 307 | 308 | var vertices = [] 309 | var uvs = [] 310 | var temp_dict = {} 311 | 312 | var adj_check_list = {} 313 | 314 | for order in order_list: 315 | x = order[0][0] 316 | y = order[0][1] 317 | z = order[0][2] 318 | var t = order[1] 319 | temp_dict[Vector3(x,y,z)] = {"type":t} 320 | 321 | var adj_chunk_list = {"top":false,"bottom":false, 322 | "front":false,"back":false, 323 | "right":false,"left":false} 324 | var adj_chunk_pos = {"top":Vector3(chunk_pos.x,chunk_pos.y+1,chunk_pos.z),"bottom":Vector3(chunk_pos.x,chunk_pos.y-1,chunk_pos.z), 325 | "front":Vector3(chunk_pos.x,chunk_pos.y,chunk_pos.z+1),"back":Vector3(chunk_pos.x,chunk_pos.y,chunk_pos.z-1), 326 | "right":Vector3(chunk_pos.x+1,chunk_pos.y,chunk_pos.z),"left":Vector3(chunk_pos.x-1,chunk_pos.y,chunk_pos.z)} 327 | 328 | var adj_chunk_checklist = [] 329 | 330 | for b in temp_dict: 331 | temp_dict[b]["vertices"] = [] 332 | temp_dict[b]["uvs"] = [] 333 | x = b.x 334 | y = b.y 335 | z = b.z 336 | var t = temp_dict[b]["type"] 337 | adj_name_list = {"top":Vector3(x,y+1,z),"bottom":Vector3(x,y-1,z), 338 | "front":Vector3(x,y,z+1),"back":Vector3(x,y,z-1), 339 | "right":Vector3(x+1,y,z),"left":Vector3(x-1,y,z)} 340 | 341 | for n in adj_name_list: 342 | if not adj_name_list[n] in block_dict: 343 | var return_stuff = get_face(n,x,y,z,t) 344 | temp_dict[b]['vertices'].append(return_stuff[0]) 345 | temp_dict[b]['uvs'].append(return_stuff[1]) 346 | 347 | for b in temp_dict: 348 | block_dict[Vector3(b[0],b[1],b[2])] = temp_dict[b] 349 | if mesh_node!=null: 350 | mesh_node.queue_free() 351 | 352 | render_chunk() 353 | 354 | 355 | for b in block_dict: 356 | block_dict[b].collision_vertices = block_dict[b].vertices 357 | 358 | if static_node!=null: 359 | static_node.queue_free() 360 | gen_chunk_collision() 361 | 362 | func generate_chunk(a,gen_seed): 363 | >>>>>>> 91b5b4f380c84bf63acef11e85649dc003041b31 364 | var start_time = OS.get_ticks_msec() 365 | var list = [] 366 | var n = 0 367 | 368 | noise.seed = gen_seed 369 | noise.octaves = 3 370 | noise.period = 25 371 | noise.persistence = 0.3 372 | 373 | for i in range(8): 374 | for j in range(8): 375 | for k in range(8): 376 | n = noise.get_noise_3d((i+(chunk_pos[0]*8)),(j+(chunk_pos[1]*8)),(k+(chunk_pos[2]*8))) 377 | n/=2 378 | n+=0.5 379 | #0.955 380 | var thresh = pow(0.955,(j+(chunk_pos[1]*8))) 381 | if n < thresh: 382 | if (j+(chunk_pos[1]*8))<14: 383 | block_dict[Vector3(i,j,k)] = {"t":2} 384 | else: 385 | block_dict[Vector3(i,j,k)] = {"t":0} 386 | elif (j+(chunk_pos[1]*8))<12: 387 | block_dict[Vector3(i,j,k)] = {"t":3} 388 | 389 | 390 | <<<<<<< HEAD 391 | update_chunk() 392 | #print("Elapsed time: ", OS.get_ticks_msec() - start_time) 393 | ======= 394 | for b in block_dict: 395 | block_dict[b]["collision_vertices"] = block_dict[b]["vertices"] 396 | 397 | render_chunk() 398 | gen_chunk_collision() 399 | print("Elapsed time: ", OS.get_ticks_msec() - start_time) 400 | >>>>>>> 91b5b4f380c84bf63acef11e85649dc003041b31 401 | 402 | 403 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /SelectBox.dae.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="scene" 4 | type="PackedScene" 5 | path="res://.import/SelectBox.dae-addd438a4a907c355da72cdd945a0c27.scn" 6 | 7 | [deps] 8 | 9 | source_file="res://SelectBox.dae" 10 | dest_files=[ "res://.import/SelectBox.dae-addd438a4a907c355da72cdd945a0c27.scn" ] 11 | 12 | [params] 13 | 14 | nodes/root_type="Spatial" 15 | nodes/root_name="Scene Root" 16 | nodes/root_scale=1.0 17 | nodes/custom_script="" 18 | nodes/storage=0 19 | materials/location=1 20 | materials/storage=1 21 | materials/keep_on_reimport=true 22 | meshes/compress=true 23 | meshes/ensure_tangents=true 24 | meshes/storage=0 25 | meshes/light_baking=0 26 | meshes/lightmap_texel_size=0.1 27 | external_files/store_in_subdir=false 28 | animation/import=true 29 | animation/fps=15 30 | animation/filter_script="" 31 | animation/storage=false 32 | animation/keep_custom_tracks=false 33 | animation/optimizer/enabled=true 34 | animation/optimizer/max_linear_error=0.05 35 | animation/optimizer/max_angular_error=0.01 36 | animation/optimizer/max_angle=22 37 | animation/optimizer/remove_unused_tracks=true 38 | animation/clips/amount=0 39 | animation/clip_1/name="" 40 | animation/clip_1/start_frame=0 41 | animation/clip_1/end_frame=0 42 | animation/clip_1/loops=false 43 | animation/clip_2/name="" 44 | animation/clip_2/start_frame=0 45 | animation/clip_2/end_frame=0 46 | animation/clip_2/loops=false 47 | animation/clip_3/name="" 48 | animation/clip_3/start_frame=0 49 | animation/clip_3/end_frame=0 50 | animation/clip_3/loops=false 51 | animation/clip_4/name="" 52 | animation/clip_4/start_frame=0 53 | animation/clip_4/end_frame=0 54 | animation/clip_4/loops=false 55 | animation/clip_5/name="" 56 | animation/clip_5/start_frame=0 57 | animation/clip_5/end_frame=0 58 | animation/clip_5/loops=false 59 | animation/clip_6/name="" 60 | animation/clip_6/start_frame=0 61 | animation/clip_6/end_frame=0 62 | animation/clip_6/loops=false 63 | animation/clip_7/name="" 64 | animation/clip_7/start_frame=0 65 | animation/clip_7/end_frame=0 66 | animation/clip_7/loops=false 67 | animation/clip_8/name="" 68 | animation/clip_8/start_frame=0 69 | animation/clip_8/end_frame=0 70 | animation/clip_8/loops=false 71 | animation/clip_9/name="" 72 | animation/clip_9/start_frame=0 73 | animation/clip_9/end_frame=0 74 | animation/clip_9/loops=false 75 | animation/clip_10/name="" 76 | animation/clip_10/start_frame=0 77 | animation/clip_10/end_frame=0 78 | animation/clip_10/loops=false 79 | animation/clip_11/name="" 80 | animation/clip_11/start_frame=0 81 | animation/clip_11/end_frame=0 82 | animation/clip_11/loops=false 83 | animation/clip_12/name="" 84 | animation/clip_12/start_frame=0 85 | animation/clip_12/end_frame=0 86 | animation/clip_12/loops=false 87 | animation/clip_13/name="" 88 | animation/clip_13/start_frame=0 89 | animation/clip_13/end_frame=0 90 | animation/clip_13/loops=false 91 | animation/clip_14/name="" 92 | animation/clip_14/start_frame=0 93 | animation/clip_14/end_frame=0 94 | animation/clip_14/loops=false 95 | animation/clip_15/name="" 96 | animation/clip_15/start_frame=0 97 | animation/clip_15/end_frame=0 98 | animation/clip_15/loops=false 99 | animation/clip_16/name="" 100 | animation/clip_16/start_frame=0 101 | animation/clip_16/end_frame=0 102 | animation/clip_16/loops=false 103 | animation/clip_17/name="" 104 | animation/clip_17/start_frame=0 105 | animation/clip_17/end_frame=0 106 | animation/clip_17/loops=false 107 | animation/clip_18/name="" 108 | animation/clip_18/start_frame=0 109 | animation/clip_18/end_frame=0 110 | animation/clip_18/loops=false 111 | animation/clip_19/name="" 112 | animation/clip_19/start_frame=0 113 | animation/clip_19/end_frame=0 114 | animation/clip_19/loops=false 115 | animation/clip_20/name="" 116 | animation/clip_20/start_frame=0 117 | animation/clip_20/end_frame=0 118 | animation/clip_20/loops=false 119 | animation/clip_21/name="" 120 | animation/clip_21/start_frame=0 121 | animation/clip_21/end_frame=0 122 | animation/clip_21/loops=false 123 | animation/clip_22/name="" 124 | animation/clip_22/start_frame=0 125 | animation/clip_22/end_frame=0 126 | animation/clip_22/loops=false 127 | animation/clip_23/name="" 128 | animation/clip_23/start_frame=0 129 | animation/clip_23/end_frame=0 130 | animation/clip_23/loops=false 131 | animation/clip_24/name="" 132 | animation/clip_24/start_frame=0 133 | animation/clip_24/end_frame=0 134 | animation/clip_24/loops=false 135 | animation/clip_25/name="" 136 | animation/clip_25/start_frame=0 137 | animation/clip_25/end_frame=0 138 | animation/clip_25/loops=false 139 | animation/clip_26/name="" 140 | animation/clip_26/start_frame=0 141 | animation/clip_26/end_frame=0 142 | animation/clip_26/loops=false 143 | animation/clip_27/name="" 144 | animation/clip_27/start_frame=0 145 | animation/clip_27/end_frame=0 146 | animation/clip_27/loops=false 147 | animation/clip_28/name="" 148 | animation/clip_28/start_frame=0 149 | animation/clip_28/end_frame=0 150 | animation/clip_28/loops=false 151 | animation/clip_29/name="" 152 | animation/clip_29/start_frame=0 153 | animation/clip_29/end_frame=0 154 | animation/clip_29/loops=false 155 | animation/clip_30/name="" 156 | animation/clip_30/start_frame=0 157 | animation/clip_30/end_frame=0 158 | animation/clip_30/loops=false 159 | animation/clip_31/name="" 160 | animation/clip_31/start_frame=0 161 | animation/clip_31/end_frame=0 162 | animation/clip_31/loops=false 163 | animation/clip_32/name="" 164 | animation/clip_32/start_frame=0 165 | animation/clip_32/end_frame=0 166 | animation/clip_32/loops=false 167 | animation/clip_33/name="" 168 | animation/clip_33/start_frame=0 169 | animation/clip_33/end_frame=0 170 | animation/clip_33/loops=false 171 | animation/clip_34/name="" 172 | animation/clip_34/start_frame=0 173 | animation/clip_34/end_frame=0 174 | animation/clip_34/loops=false 175 | animation/clip_35/name="" 176 | animation/clip_35/start_frame=0 177 | animation/clip_35/end_frame=0 178 | animation/clip_35/loops=false 179 | animation/clip_36/name="" 180 | animation/clip_36/start_frame=0 181 | animation/clip_36/end_frame=0 182 | animation/clip_36/loops=false 183 | animation/clip_37/name="" 184 | animation/clip_37/start_frame=0 185 | animation/clip_37/end_frame=0 186 | animation/clip_37/loops=false 187 | animation/clip_38/name="" 188 | animation/clip_38/start_frame=0 189 | animation/clip_38/end_frame=0 190 | animation/clip_38/loops=false 191 | animation/clip_39/name="" 192 | animation/clip_39/start_frame=0 193 | animation/clip_39/end_frame=0 194 | animation/clip_39/loops=false 195 | animation/clip_40/name="" 196 | animation/clip_40/start_frame=0 197 | animation/clip_40/end_frame=0 198 | animation/clip_40/loops=false 199 | animation/clip_41/name="" 200 | animation/clip_41/start_frame=0 201 | animation/clip_41/end_frame=0 202 | animation/clip_41/loops=false 203 | animation/clip_42/name="" 204 | animation/clip_42/start_frame=0 205 | animation/clip_42/end_frame=0 206 | animation/clip_42/loops=false 207 | animation/clip_43/name="" 208 | animation/clip_43/start_frame=0 209 | animation/clip_43/end_frame=0 210 | animation/clip_43/loops=false 211 | animation/clip_44/name="" 212 | animation/clip_44/start_frame=0 213 | animation/clip_44/end_frame=0 214 | animation/clip_44/loops=false 215 | animation/clip_45/name="" 216 | animation/clip_45/start_frame=0 217 | animation/clip_45/end_frame=0 218 | animation/clip_45/loops=false 219 | animation/clip_46/name="" 220 | animation/clip_46/start_frame=0 221 | animation/clip_46/end_frame=0 222 | animation/clip_46/loops=false 223 | animation/clip_47/name="" 224 | animation/clip_47/start_frame=0 225 | animation/clip_47/end_frame=0 226 | animation/clip_47/loops=false 227 | animation/clip_48/name="" 228 | animation/clip_48/start_frame=0 229 | animation/clip_48/end_frame=0 230 | animation/clip_48/loops=false 231 | animation/clip_49/name="" 232 | animation/clip_49/start_frame=0 233 | animation/clip_49/end_frame=0 234 | animation/clip_49/loops=false 235 | animation/clip_50/name="" 236 | animation/clip_50/start_frame=0 237 | animation/clip_50/end_frame=0 238 | animation/clip_50/loops=false 239 | animation/clip_51/name="" 240 | animation/clip_51/start_frame=0 241 | animation/clip_51/end_frame=0 242 | animation/clip_51/loops=false 243 | animation/clip_52/name="" 244 | animation/clip_52/start_frame=0 245 | animation/clip_52/end_frame=0 246 | animation/clip_52/loops=false 247 | animation/clip_53/name="" 248 | animation/clip_53/start_frame=0 249 | animation/clip_53/end_frame=0 250 | animation/clip_53/loops=false 251 | animation/clip_54/name="" 252 | animation/clip_54/start_frame=0 253 | animation/clip_54/end_frame=0 254 | animation/clip_54/loops=false 255 | animation/clip_55/name="" 256 | animation/clip_55/start_frame=0 257 | animation/clip_55/end_frame=0 258 | animation/clip_55/loops=false 259 | animation/clip_56/name="" 260 | animation/clip_56/start_frame=0 261 | animation/clip_56/end_frame=0 262 | animation/clip_56/loops=false 263 | animation/clip_57/name="" 264 | animation/clip_57/start_frame=0 265 | animation/clip_57/end_frame=0 266 | animation/clip_57/loops=false 267 | animation/clip_58/name="" 268 | animation/clip_58/start_frame=0 269 | animation/clip_58/end_frame=0 270 | animation/clip_58/loops=false 271 | animation/clip_59/name="" 272 | animation/clip_59/start_frame=0 273 | animation/clip_59/end_frame=0 274 | animation/clip_59/loops=false 275 | animation/clip_60/name="" 276 | animation/clip_60/start_frame=0 277 | animation/clip_60/end_frame=0 278 | animation/clip_60/loops=false 279 | animation/clip_61/name="" 280 | animation/clip_61/start_frame=0 281 | animation/clip_61/end_frame=0 282 | animation/clip_61/loops=false 283 | animation/clip_62/name="" 284 | animation/clip_62/start_frame=0 285 | animation/clip_62/end_frame=0 286 | animation/clip_62/loops=false 287 | animation/clip_63/name="" 288 | animation/clip_63/start_frame=0 289 | animation/clip_63/end_frame=0 290 | animation/clip_63/loops=false 291 | animation/clip_64/name="" 292 | animation/clip_64/start_frame=0 293 | animation/clip_64/end_frame=0 294 | animation/clip_64/loops=false 295 | animation/clip_65/name="" 296 | animation/clip_65/start_frame=0 297 | animation/clip_65/end_frame=0 298 | animation/clip_65/loops=false 299 | animation/clip_66/name="" 300 | animation/clip_66/start_frame=0 301 | animation/clip_66/end_frame=0 302 | animation/clip_66/loops=false 303 | animation/clip_67/name="" 304 | animation/clip_67/start_frame=0 305 | animation/clip_67/end_frame=0 306 | animation/clip_67/loops=false 307 | animation/clip_68/name="" 308 | animation/clip_68/start_frame=0 309 | animation/clip_68/end_frame=0 310 | animation/clip_68/loops=false 311 | animation/clip_69/name="" 312 | animation/clip_69/start_frame=0 313 | animation/clip_69/end_frame=0 314 | animation/clip_69/loops=false 315 | animation/clip_70/name="" 316 | animation/clip_70/start_frame=0 317 | animation/clip_70/end_frame=0 318 | animation/clip_70/loops=false 319 | animation/clip_71/name="" 320 | animation/clip_71/start_frame=0 321 | animation/clip_71/end_frame=0 322 | animation/clip_71/loops=false 323 | animation/clip_72/name="" 324 | animation/clip_72/start_frame=0 325 | animation/clip_72/end_frame=0 326 | animation/clip_72/loops=false 327 | animation/clip_73/name="" 328 | animation/clip_73/start_frame=0 329 | animation/clip_73/end_frame=0 330 | animation/clip_73/loops=false 331 | animation/clip_74/name="" 332 | animation/clip_74/start_frame=0 333 | animation/clip_74/end_frame=0 334 | animation/clip_74/loops=false 335 | animation/clip_75/name="" 336 | animation/clip_75/start_frame=0 337 | animation/clip_75/end_frame=0 338 | animation/clip_75/loops=false 339 | animation/clip_76/name="" 340 | animation/clip_76/start_frame=0 341 | animation/clip_76/end_frame=0 342 | animation/clip_76/loops=false 343 | animation/clip_77/name="" 344 | animation/clip_77/start_frame=0 345 | animation/clip_77/end_frame=0 346 | animation/clip_77/loops=false 347 | animation/clip_78/name="" 348 | animation/clip_78/start_frame=0 349 | animation/clip_78/end_frame=0 350 | animation/clip_78/loops=false 351 | animation/clip_79/name="" 352 | animation/clip_79/start_frame=0 353 | animation/clip_79/end_frame=0 354 | animation/clip_79/loops=false 355 | animation/clip_80/name="" 356 | animation/clip_80/start_frame=0 357 | animation/clip_80/end_frame=0 358 | animation/clip_80/loops=false 359 | animation/clip_81/name="" 360 | animation/clip_81/start_frame=0 361 | animation/clip_81/end_frame=0 362 | animation/clip_81/loops=false 363 | animation/clip_82/name="" 364 | animation/clip_82/start_frame=0 365 | animation/clip_82/end_frame=0 366 | animation/clip_82/loops=false 367 | animation/clip_83/name="" 368 | animation/clip_83/start_frame=0 369 | animation/clip_83/end_frame=0 370 | animation/clip_83/loops=false 371 | animation/clip_84/name="" 372 | animation/clip_84/start_frame=0 373 | animation/clip_84/end_frame=0 374 | animation/clip_84/loops=false 375 | animation/clip_85/name="" 376 | animation/clip_85/start_frame=0 377 | animation/clip_85/end_frame=0 378 | animation/clip_85/loops=false 379 | animation/clip_86/name="" 380 | animation/clip_86/start_frame=0 381 | animation/clip_86/end_frame=0 382 | animation/clip_86/loops=false 383 | animation/clip_87/name="" 384 | animation/clip_87/start_frame=0 385 | animation/clip_87/end_frame=0 386 | animation/clip_87/loops=false 387 | animation/clip_88/name="" 388 | animation/clip_88/start_frame=0 389 | animation/clip_88/end_frame=0 390 | animation/clip_88/loops=false 391 | animation/clip_89/name="" 392 | animation/clip_89/start_frame=0 393 | animation/clip_89/end_frame=0 394 | animation/clip_89/loops=false 395 | animation/clip_90/name="" 396 | animation/clip_90/start_frame=0 397 | animation/clip_90/end_frame=0 398 | animation/clip_90/loops=false 399 | animation/clip_91/name="" 400 | animation/clip_91/start_frame=0 401 | animation/clip_91/end_frame=0 402 | animation/clip_91/loops=false 403 | animation/clip_92/name="" 404 | animation/clip_92/start_frame=0 405 | animation/clip_92/end_frame=0 406 | animation/clip_92/loops=false 407 | animation/clip_93/name="" 408 | animation/clip_93/start_frame=0 409 | animation/clip_93/end_frame=0 410 | animation/clip_93/loops=false 411 | animation/clip_94/name="" 412 | animation/clip_94/start_frame=0 413 | animation/clip_94/end_frame=0 414 | animation/clip_94/loops=false 415 | animation/clip_95/name="" 416 | animation/clip_95/start_frame=0 417 | animation/clip_95/end_frame=0 418 | animation/clip_95/loops=false 419 | animation/clip_96/name="" 420 | animation/clip_96/start_frame=0 421 | animation/clip_96/end_frame=0 422 | animation/clip_96/loops=false 423 | animation/clip_97/name="" 424 | animation/clip_97/start_frame=0 425 | animation/clip_97/end_frame=0 426 | animation/clip_97/loops=false 427 | animation/clip_98/name="" 428 | animation/clip_98/start_frame=0 429 | animation/clip_98/end_frame=0 430 | animation/clip_98/loops=false 431 | animation/clip_99/name="" 432 | animation/clip_99/start_frame=0 433 | animation/clip_99/end_frame=0 434 | animation/clip_99/loops=false 435 | animation/clip_100/name="" 436 | animation/clip_100/start_frame=0 437 | animation/clip_100/end_frame=0 438 | animation/clip_100/loops=false 439 | animation/clip_101/name="" 440 | animation/clip_101/start_frame=0 441 | animation/clip_101/end_frame=0 442 | animation/clip_101/loops=false 443 | animation/clip_102/name="" 444 | animation/clip_102/start_frame=0 445 | animation/clip_102/end_frame=0 446 | animation/clip_102/loops=false 447 | animation/clip_103/name="" 448 | animation/clip_103/start_frame=0 449 | animation/clip_103/end_frame=0 450 | animation/clip_103/loops=false 451 | animation/clip_104/name="" 452 | animation/clip_104/start_frame=0 453 | animation/clip_104/end_frame=0 454 | animation/clip_104/loops=false 455 | animation/clip_105/name="" 456 | animation/clip_105/start_frame=0 457 | animation/clip_105/end_frame=0 458 | animation/clip_105/loops=false 459 | animation/clip_106/name="" 460 | animation/clip_106/start_frame=0 461 | animation/clip_106/end_frame=0 462 | animation/clip_106/loops=false 463 | animation/clip_107/name="" 464 | animation/clip_107/start_frame=0 465 | animation/clip_107/end_frame=0 466 | animation/clip_107/loops=false 467 | animation/clip_108/name="" 468 | animation/clip_108/start_frame=0 469 | animation/clip_108/end_frame=0 470 | animation/clip_108/loops=false 471 | animation/clip_109/name="" 472 | animation/clip_109/start_frame=0 473 | animation/clip_109/end_frame=0 474 | animation/clip_109/loops=false 475 | animation/clip_110/name="" 476 | animation/clip_110/start_frame=0 477 | animation/clip_110/end_frame=0 478 | animation/clip_110/loops=false 479 | animation/clip_111/name="" 480 | animation/clip_111/start_frame=0 481 | animation/clip_111/end_frame=0 482 | animation/clip_111/loops=false 483 | animation/clip_112/name="" 484 | animation/clip_112/start_frame=0 485 | animation/clip_112/end_frame=0 486 | animation/clip_112/loops=false 487 | animation/clip_113/name="" 488 | animation/clip_113/start_frame=0 489 | animation/clip_113/end_frame=0 490 | animation/clip_113/loops=false 491 | animation/clip_114/name="" 492 | animation/clip_114/start_frame=0 493 | animation/clip_114/end_frame=0 494 | animation/clip_114/loops=false 495 | animation/clip_115/name="" 496 | animation/clip_115/start_frame=0 497 | animation/clip_115/end_frame=0 498 | animation/clip_115/loops=false 499 | animation/clip_116/name="" 500 | animation/clip_116/start_frame=0 501 | animation/clip_116/end_frame=0 502 | animation/clip_116/loops=false 503 | animation/clip_117/name="" 504 | animation/clip_117/start_frame=0 505 | animation/clip_117/end_frame=0 506 | animation/clip_117/loops=false 507 | animation/clip_118/name="" 508 | animation/clip_118/start_frame=0 509 | animation/clip_118/end_frame=0 510 | animation/clip_118/loops=false 511 | animation/clip_119/name="" 512 | animation/clip_119/start_frame=0 513 | animation/clip_119/end_frame=0 514 | animation/clip_119/loops=false 515 | animation/clip_120/name="" 516 | animation/clip_120/start_frame=0 517 | animation/clip_120/end_frame=0 518 | animation/clip_120/loops=false 519 | animation/clip_121/name="" 520 | animation/clip_121/start_frame=0 521 | animation/clip_121/end_frame=0 522 | animation/clip_121/loops=false 523 | animation/clip_122/name="" 524 | animation/clip_122/start_frame=0 525 | animation/clip_122/end_frame=0 526 | animation/clip_122/loops=false 527 | animation/clip_123/name="" 528 | animation/clip_123/start_frame=0 529 | animation/clip_123/end_frame=0 530 | animation/clip_123/loops=false 531 | animation/clip_124/name="" 532 | animation/clip_124/start_frame=0 533 | animation/clip_124/end_frame=0 534 | animation/clip_124/loops=false 535 | animation/clip_125/name="" 536 | animation/clip_125/start_frame=0 537 | animation/clip_125/end_frame=0 538 | animation/clip_125/loops=false 539 | animation/clip_126/name="" 540 | animation/clip_126/start_frame=0 541 | animation/clip_126/end_frame=0 542 | animation/clip_126/loops=false 543 | animation/clip_127/name="" 544 | animation/clip_127/start_frame=0 545 | animation/clip_127/end_frame=0 546 | animation/clip_127/loops=false 547 | animation/clip_128/name="" 548 | animation/clip_128/start_frame=0 549 | animation/clip_128/end_frame=0 550 | animation/clip_128/loops=false 551 | animation/clip_129/name="" 552 | animation/clip_129/start_frame=0 553 | animation/clip_129/end_frame=0 554 | animation/clip_129/loops=false 555 | animation/clip_130/name="" 556 | animation/clip_130/start_frame=0 557 | animation/clip_130/end_frame=0 558 | animation/clip_130/loops=false 559 | animation/clip_131/name="" 560 | animation/clip_131/start_frame=0 561 | animation/clip_131/end_frame=0 562 | animation/clip_131/loops=false 563 | animation/clip_132/name="" 564 | animation/clip_132/start_frame=0 565 | animation/clip_132/end_frame=0 566 | animation/clip_132/loops=false 567 | animation/clip_133/name="" 568 | animation/clip_133/start_frame=0 569 | animation/clip_133/end_frame=0 570 | animation/clip_133/loops=false 571 | animation/clip_134/name="" 572 | animation/clip_134/start_frame=0 573 | animation/clip_134/end_frame=0 574 | animation/clip_134/loops=false 575 | animation/clip_135/name="" 576 | animation/clip_135/start_frame=0 577 | animation/clip_135/end_frame=0 578 | animation/clip_135/loops=false 579 | animation/clip_136/name="" 580 | animation/clip_136/start_frame=0 581 | animation/clip_136/end_frame=0 582 | animation/clip_136/loops=false 583 | animation/clip_137/name="" 584 | animation/clip_137/start_frame=0 585 | animation/clip_137/end_frame=0 586 | animation/clip_137/loops=false 587 | animation/clip_138/name="" 588 | animation/clip_138/start_frame=0 589 | animation/clip_138/end_frame=0 590 | animation/clip_138/loops=false 591 | animation/clip_139/name="" 592 | animation/clip_139/start_frame=0 593 | animation/clip_139/end_frame=0 594 | animation/clip_139/loops=false 595 | animation/clip_140/name="" 596 | animation/clip_140/start_frame=0 597 | animation/clip_140/end_frame=0 598 | animation/clip_140/loops=false 599 | animation/clip_141/name="" 600 | animation/clip_141/start_frame=0 601 | animation/clip_141/end_frame=0 602 | animation/clip_141/loops=false 603 | animation/clip_142/name="" 604 | animation/clip_142/start_frame=0 605 | animation/clip_142/end_frame=0 606 | animation/clip_142/loops=false 607 | animation/clip_143/name="" 608 | animation/clip_143/start_frame=0 609 | animation/clip_143/end_frame=0 610 | animation/clip_143/loops=false 611 | animation/clip_144/name="" 612 | animation/clip_144/start_frame=0 613 | animation/clip_144/end_frame=0 614 | animation/clip_144/loops=false 615 | animation/clip_145/name="" 616 | animation/clip_145/start_frame=0 617 | animation/clip_145/end_frame=0 618 | animation/clip_145/loops=false 619 | animation/clip_146/name="" 620 | animation/clip_146/start_frame=0 621 | animation/clip_146/end_frame=0 622 | animation/clip_146/loops=false 623 | animation/clip_147/name="" 624 | animation/clip_147/start_frame=0 625 | animation/clip_147/end_frame=0 626 | animation/clip_147/loops=false 627 | animation/clip_148/name="" 628 | animation/clip_148/start_frame=0 629 | animation/clip_148/end_frame=0 630 | animation/clip_148/loops=false 631 | animation/clip_149/name="" 632 | animation/clip_149/start_frame=0 633 | animation/clip_149/end_frame=0 634 | animation/clip_149/loops=false 635 | animation/clip_150/name="" 636 | animation/clip_150/start_frame=0 637 | animation/clip_150/end_frame=0 638 | animation/clip_150/loops=false 639 | animation/clip_151/name="" 640 | animation/clip_151/start_frame=0 641 | animation/clip_151/end_frame=0 642 | animation/clip_151/loops=false 643 | animation/clip_152/name="" 644 | animation/clip_152/start_frame=0 645 | animation/clip_152/end_frame=0 646 | animation/clip_152/loops=false 647 | animation/clip_153/name="" 648 | animation/clip_153/start_frame=0 649 | animation/clip_153/end_frame=0 650 | animation/clip_153/loops=false 651 | animation/clip_154/name="" 652 | animation/clip_154/start_frame=0 653 | animation/clip_154/end_frame=0 654 | animation/clip_154/loops=false 655 | animation/clip_155/name="" 656 | animation/clip_155/start_frame=0 657 | animation/clip_155/end_frame=0 658 | animation/clip_155/loops=false 659 | animation/clip_156/name="" 660 | animation/clip_156/start_frame=0 661 | animation/clip_156/end_frame=0 662 | animation/clip_156/loops=false 663 | animation/clip_157/name="" 664 | animation/clip_157/start_frame=0 665 | animation/clip_157/end_frame=0 666 | animation/clip_157/loops=false 667 | animation/clip_158/name="" 668 | animation/clip_158/start_frame=0 669 | animation/clip_158/end_frame=0 670 | animation/clip_158/loops=false 671 | animation/clip_159/name="" 672 | animation/clip_159/start_frame=0 673 | animation/clip_159/end_frame=0 674 | animation/clip_159/loops=false 675 | animation/clip_160/name="" 676 | animation/clip_160/start_frame=0 677 | animation/clip_160/end_frame=0 678 | animation/clip_160/loops=false 679 | animation/clip_161/name="" 680 | animation/clip_161/start_frame=0 681 | animation/clip_161/end_frame=0 682 | animation/clip_161/loops=false 683 | animation/clip_162/name="" 684 | animation/clip_162/start_frame=0 685 | animation/clip_162/end_frame=0 686 | animation/clip_162/loops=false 687 | animation/clip_163/name="" 688 | animation/clip_163/start_frame=0 689 | animation/clip_163/end_frame=0 690 | animation/clip_163/loops=false 691 | animation/clip_164/name="" 692 | animation/clip_164/start_frame=0 693 | animation/clip_164/end_frame=0 694 | animation/clip_164/loops=false 695 | animation/clip_165/name="" 696 | animation/clip_165/start_frame=0 697 | animation/clip_165/end_frame=0 698 | animation/clip_165/loops=false 699 | animation/clip_166/name="" 700 | animation/clip_166/start_frame=0 701 | animation/clip_166/end_frame=0 702 | animation/clip_166/loops=false 703 | animation/clip_167/name="" 704 | animation/clip_167/start_frame=0 705 | animation/clip_167/end_frame=0 706 | animation/clip_167/loops=false 707 | animation/clip_168/name="" 708 | animation/clip_168/start_frame=0 709 | animation/clip_168/end_frame=0 710 | animation/clip_168/loops=false 711 | animation/clip_169/name="" 712 | animation/clip_169/start_frame=0 713 | animation/clip_169/end_frame=0 714 | animation/clip_169/loops=false 715 | animation/clip_170/name="" 716 | animation/clip_170/start_frame=0 717 | animation/clip_170/end_frame=0 718 | animation/clip_170/loops=false 719 | animation/clip_171/name="" 720 | animation/clip_171/start_frame=0 721 | animation/clip_171/end_frame=0 722 | animation/clip_171/loops=false 723 | animation/clip_172/name="" 724 | animation/clip_172/start_frame=0 725 | animation/clip_172/end_frame=0 726 | animation/clip_172/loops=false 727 | animation/clip_173/name="" 728 | animation/clip_173/start_frame=0 729 | animation/clip_173/end_frame=0 730 | animation/clip_173/loops=false 731 | animation/clip_174/name="" 732 | animation/clip_174/start_frame=0 733 | animation/clip_174/end_frame=0 734 | animation/clip_174/loops=false 735 | animation/clip_175/name="" 736 | animation/clip_175/start_frame=0 737 | animation/clip_175/end_frame=0 738 | animation/clip_175/loops=false 739 | animation/clip_176/name="" 740 | animation/clip_176/start_frame=0 741 | animation/clip_176/end_frame=0 742 | animation/clip_176/loops=false 743 | animation/clip_177/name="" 744 | animation/clip_177/start_frame=0 745 | animation/clip_177/end_frame=0 746 | animation/clip_177/loops=false 747 | animation/clip_178/name="" 748 | animation/clip_178/start_frame=0 749 | animation/clip_178/end_frame=0 750 | animation/clip_178/loops=false 751 | animation/clip_179/name="" 752 | animation/clip_179/start_frame=0 753 | animation/clip_179/end_frame=0 754 | animation/clip_179/loops=false 755 | animation/clip_180/name="" 756 | animation/clip_180/start_frame=0 757 | animation/clip_180/end_frame=0 758 | animation/clip_180/loops=false 759 | animation/clip_181/name="" 760 | animation/clip_181/start_frame=0 761 | animation/clip_181/end_frame=0 762 | animation/clip_181/loops=false 763 | animation/clip_182/name="" 764 | animation/clip_182/start_frame=0 765 | animation/clip_182/end_frame=0 766 | animation/clip_182/loops=false 767 | animation/clip_183/name="" 768 | animation/clip_183/start_frame=0 769 | animation/clip_183/end_frame=0 770 | animation/clip_183/loops=false 771 | animation/clip_184/name="" 772 | animation/clip_184/start_frame=0 773 | animation/clip_184/end_frame=0 774 | animation/clip_184/loops=false 775 | animation/clip_185/name="" 776 | animation/clip_185/start_frame=0 777 | animation/clip_185/end_frame=0 778 | animation/clip_185/loops=false 779 | animation/clip_186/name="" 780 | animation/clip_186/start_frame=0 781 | animation/clip_186/end_frame=0 782 | animation/clip_186/loops=false 783 | animation/clip_187/name="" 784 | animation/clip_187/start_frame=0 785 | animation/clip_187/end_frame=0 786 | animation/clip_187/loops=false 787 | animation/clip_188/name="" 788 | animation/clip_188/start_frame=0 789 | animation/clip_188/end_frame=0 790 | animation/clip_188/loops=false 791 | animation/clip_189/name="" 792 | animation/clip_189/start_frame=0 793 | animation/clip_189/end_frame=0 794 | animation/clip_189/loops=false 795 | animation/clip_190/name="" 796 | animation/clip_190/start_frame=0 797 | animation/clip_190/end_frame=0 798 | animation/clip_190/loops=false 799 | animation/clip_191/name="" 800 | animation/clip_191/start_frame=0 801 | animation/clip_191/end_frame=0 802 | animation/clip_191/loops=false 803 | animation/clip_192/name="" 804 | animation/clip_192/start_frame=0 805 | animation/clip_192/end_frame=0 806 | animation/clip_192/loops=false 807 | animation/clip_193/name="" 808 | animation/clip_193/start_frame=0 809 | animation/clip_193/end_frame=0 810 | animation/clip_193/loops=false 811 | animation/clip_194/name="" 812 | animation/clip_194/start_frame=0 813 | animation/clip_194/end_frame=0 814 | animation/clip_194/loops=false 815 | animation/clip_195/name="" 816 | animation/clip_195/start_frame=0 817 | animation/clip_195/end_frame=0 818 | animation/clip_195/loops=false 819 | animation/clip_196/name="" 820 | animation/clip_196/start_frame=0 821 | animation/clip_196/end_frame=0 822 | animation/clip_196/loops=false 823 | animation/clip_197/name="" 824 | animation/clip_197/start_frame=0 825 | animation/clip_197/end_frame=0 826 | animation/clip_197/loops=false 827 | animation/clip_198/name="" 828 | animation/clip_198/start_frame=0 829 | animation/clip_198/end_frame=0 830 | animation/clip_198/loops=false 831 | animation/clip_199/name="" 832 | animation/clip_199/start_frame=0 833 | animation/clip_199/end_frame=0 834 | animation/clip_199/loops=false 835 | animation/clip_200/name="" 836 | animation/clip_200/start_frame=0 837 | animation/clip_200/end_frame=0 838 | animation/clip_200/loops=false 839 | animation/clip_201/name="" 840 | animation/clip_201/start_frame=0 841 | animation/clip_201/end_frame=0 842 | animation/clip_201/loops=false 843 | animation/clip_202/name="" 844 | animation/clip_202/start_frame=0 845 | animation/clip_202/end_frame=0 846 | animation/clip_202/loops=false 847 | animation/clip_203/name="" 848 | animation/clip_203/start_frame=0 849 | animation/clip_203/end_frame=0 850 | animation/clip_203/loops=false 851 | animation/clip_204/name="" 852 | animation/clip_204/start_frame=0 853 | animation/clip_204/end_frame=0 854 | animation/clip_204/loops=false 855 | animation/clip_205/name="" 856 | animation/clip_205/start_frame=0 857 | animation/clip_205/end_frame=0 858 | animation/clip_205/loops=false 859 | animation/clip_206/name="" 860 | animation/clip_206/start_frame=0 861 | animation/clip_206/end_frame=0 862 | animation/clip_206/loops=false 863 | animation/clip_207/name="" 864 | animation/clip_207/start_frame=0 865 | animation/clip_207/end_frame=0 866 | animation/clip_207/loops=false 867 | animation/clip_208/name="" 868 | animation/clip_208/start_frame=0 869 | animation/clip_208/end_frame=0 870 | animation/clip_208/loops=false 871 | animation/clip_209/name="" 872 | animation/clip_209/start_frame=0 873 | animation/clip_209/end_frame=0 874 | animation/clip_209/loops=false 875 | animation/clip_210/name="" 876 | animation/clip_210/start_frame=0 877 | animation/clip_210/end_frame=0 878 | animation/clip_210/loops=false 879 | animation/clip_211/name="" 880 | animation/clip_211/start_frame=0 881 | animation/clip_211/end_frame=0 882 | animation/clip_211/loops=false 883 | animation/clip_212/name="" 884 | animation/clip_212/start_frame=0 885 | animation/clip_212/end_frame=0 886 | animation/clip_212/loops=false 887 | animation/clip_213/name="" 888 | animation/clip_213/start_frame=0 889 | animation/clip_213/end_frame=0 890 | animation/clip_213/loops=false 891 | animation/clip_214/name="" 892 | animation/clip_214/start_frame=0 893 | animation/clip_214/end_frame=0 894 | animation/clip_214/loops=false 895 | animation/clip_215/name="" 896 | animation/clip_215/start_frame=0 897 | animation/clip_215/end_frame=0 898 | animation/clip_215/loops=false 899 | animation/clip_216/name="" 900 | animation/clip_216/start_frame=0 901 | animation/clip_216/end_frame=0 902 | animation/clip_216/loops=false 903 | animation/clip_217/name="" 904 | animation/clip_217/start_frame=0 905 | animation/clip_217/end_frame=0 906 | animation/clip_217/loops=false 907 | animation/clip_218/name="" 908 | animation/clip_218/start_frame=0 909 | animation/clip_218/end_frame=0 910 | animation/clip_218/loops=false 911 | animation/clip_219/name="" 912 | animation/clip_219/start_frame=0 913 | animation/clip_219/end_frame=0 914 | animation/clip_219/loops=false 915 | animation/clip_220/name="" 916 | animation/clip_220/start_frame=0 917 | animation/clip_220/end_frame=0 918 | animation/clip_220/loops=false 919 | animation/clip_221/name="" 920 | animation/clip_221/start_frame=0 921 | animation/clip_221/end_frame=0 922 | animation/clip_221/loops=false 923 | animation/clip_222/name="" 924 | animation/clip_222/start_frame=0 925 | animation/clip_222/end_frame=0 926 | animation/clip_222/loops=false 927 | animation/clip_223/name="" 928 | animation/clip_223/start_frame=0 929 | animation/clip_223/end_frame=0 930 | animation/clip_223/loops=false 931 | animation/clip_224/name="" 932 | animation/clip_224/start_frame=0 933 | animation/clip_224/end_frame=0 934 | animation/clip_224/loops=false 935 | animation/clip_225/name="" 936 | animation/clip_225/start_frame=0 937 | animation/clip_225/end_frame=0 938 | animation/clip_225/loops=false 939 | animation/clip_226/name="" 940 | animation/clip_226/start_frame=0 941 | animation/clip_226/end_frame=0 942 | animation/clip_226/loops=false 943 | animation/clip_227/name="" 944 | animation/clip_227/start_frame=0 945 | animation/clip_227/end_frame=0 946 | animation/clip_227/loops=false 947 | animation/clip_228/name="" 948 | animation/clip_228/start_frame=0 949 | animation/clip_228/end_frame=0 950 | animation/clip_228/loops=false 951 | animation/clip_229/name="" 952 | animation/clip_229/start_frame=0 953 | animation/clip_229/end_frame=0 954 | animation/clip_229/loops=false 955 | animation/clip_230/name="" 956 | animation/clip_230/start_frame=0 957 | animation/clip_230/end_frame=0 958 | animation/clip_230/loops=false 959 | animation/clip_231/name="" 960 | animation/clip_231/start_frame=0 961 | animation/clip_231/end_frame=0 962 | animation/clip_231/loops=false 963 | animation/clip_232/name="" 964 | animation/clip_232/start_frame=0 965 | animation/clip_232/end_frame=0 966 | animation/clip_232/loops=false 967 | animation/clip_233/name="" 968 | animation/clip_233/start_frame=0 969 | animation/clip_233/end_frame=0 970 | animation/clip_233/loops=false 971 | animation/clip_234/name="" 972 | animation/clip_234/start_frame=0 973 | animation/clip_234/end_frame=0 974 | animation/clip_234/loops=false 975 | animation/clip_235/name="" 976 | animation/clip_235/start_frame=0 977 | animation/clip_235/end_frame=0 978 | animation/clip_235/loops=false 979 | animation/clip_236/name="" 980 | animation/clip_236/start_frame=0 981 | animation/clip_236/end_frame=0 982 | animation/clip_236/loops=false 983 | animation/clip_237/name="" 984 | animation/clip_237/start_frame=0 985 | animation/clip_237/end_frame=0 986 | animation/clip_237/loops=false 987 | animation/clip_238/name="" 988 | animation/clip_238/start_frame=0 989 | animation/clip_238/end_frame=0 990 | animation/clip_238/loops=false 991 | animation/clip_239/name="" 992 | animation/clip_239/start_frame=0 993 | animation/clip_239/end_frame=0 994 | animation/clip_239/loops=false 995 | animation/clip_240/name="" 996 | animation/clip_240/start_frame=0 997 | animation/clip_240/end_frame=0 998 | animation/clip_240/loops=false 999 | animation/clip_241/name="" 1000 | animation/clip_241/start_frame=0 1001 | animation/clip_241/end_frame=0 1002 | animation/clip_241/loops=false 1003 | animation/clip_242/name="" 1004 | animation/clip_242/start_frame=0 1005 | animation/clip_242/end_frame=0 1006 | animation/clip_242/loops=false 1007 | animation/clip_243/name="" 1008 | animation/clip_243/start_frame=0 1009 | animation/clip_243/end_frame=0 1010 | animation/clip_243/loops=false 1011 | animation/clip_244/name="" 1012 | animation/clip_244/start_frame=0 1013 | animation/clip_244/end_frame=0 1014 | animation/clip_244/loops=false 1015 | animation/clip_245/name="" 1016 | animation/clip_245/start_frame=0 1017 | animation/clip_245/end_frame=0 1018 | animation/clip_245/loops=false 1019 | animation/clip_246/name="" 1020 | animation/clip_246/start_frame=0 1021 | animation/clip_246/end_frame=0 1022 | animation/clip_246/loops=false 1023 | animation/clip_247/name="" 1024 | animation/clip_247/start_frame=0 1025 | animation/clip_247/end_frame=0 1026 | animation/clip_247/loops=false 1027 | animation/clip_248/name="" 1028 | animation/clip_248/start_frame=0 1029 | animation/clip_248/end_frame=0 1030 | animation/clip_248/loops=false 1031 | animation/clip_249/name="" 1032 | animation/clip_249/start_frame=0 1033 | animation/clip_249/end_frame=0 1034 | animation/clip_249/loops=false 1035 | animation/clip_250/name="" 1036 | animation/clip_250/start_frame=0 1037 | animation/clip_250/end_frame=0 1038 | animation/clip_250/loops=false 1039 | animation/clip_251/name="" 1040 | animation/clip_251/start_frame=0 1041 | animation/clip_251/end_frame=0 1042 | animation/clip_251/loops=false 1043 | animation/clip_252/name="" 1044 | animation/clip_252/start_frame=0 1045 | animation/clip_252/end_frame=0 1046 | animation/clip_252/loops=false 1047 | animation/clip_253/name="" 1048 | animation/clip_253/start_frame=0 1049 | animation/clip_253/end_frame=0 1050 | animation/clip_253/loops=false 1051 | animation/clip_254/name="" 1052 | animation/clip_254/start_frame=0 1053 | animation/clip_254/end_frame=0 1054 | animation/clip_254/loops=false 1055 | animation/clip_255/name="" 1056 | animation/clip_255/start_frame=0 1057 | animation/clip_255/end_frame=0 1058 | animation/clip_255/loops=false 1059 | animation/clip_256/name="" 1060 | animation/clip_256/start_frame=0 1061 | animation/clip_256/end_frame=0 1062 | animation/clip_256/loops=false 1063 | --------------------------------------------------------------------------------