|
| 1 | +extends Spatial |
| 2 | + |
| 3 | +var noise: OpenSimplexNoise |
| 4 | + |
| 5 | +onready var planet = $Planet |
| 6 | +onready var org_mesh: Mesh = planet.mesh.duplicate(true) |
| 7 | +onready var spn_seed = $gui/PanelContainer/GridContainer/spn_seed |
| 8 | +onready var spn_water = $gui/PanelContainer/GridContainer/spn_water |
| 9 | +onready var spn_influence = $gui/PanelContainer/GridContainer/spn_influence |
| 10 | + |
| 11 | +# Called when the node enters the scene tree for the first time. |
| 12 | +func _ready(): |
| 13 | + randomize() |
| 14 | + spn_seed.value = randi() |
| 15 | + generate() |
| 16 | + |
| 17 | +func generate(): |
| 18 | + noise = OpenSimplexNoise.new() |
| 19 | + noise.seed = spn_seed.value |
| 20 | + noise.octaves = 4.0 |
| 21 | + noise.period = .3 |
| 22 | + noise.persistence = 0.8 |
| 23 | + |
| 24 | + var surf: MeshDataTool = MeshDataTool.new() |
| 25 | + var array_mesh = ArrayMesh.new() |
| 26 | + array_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, org_mesh.get_mesh_arrays()) |
| 27 | + var result: int = surf.create_from_surface(array_mesh, 0) |
| 28 | + if result != OK: |
| 29 | + print("Error while creating MeshDataTool, exiting. Error: %d" % [result]) |
| 30 | + return |
| 31 | + |
| 32 | + var influence = org_mesh.radius*spn_influence.value/100 |
| 33 | + var water_level = spn_water.value |
| 34 | + |
| 35 | + for i in range(0, surf.get_vertex_count()): |
| 36 | + var v: Vector3 = surf.get_vertex(i) |
| 37 | + |
| 38 | + var value = noise.get_noise_3dv(v) |
| 39 | + if value > water_level: |
| 40 | + v += v.normalized() * value * influence |
| 41 | + else: |
| 42 | + pass #v += v.normalized() * influence |
| 43 | + surf.set_vertex(i, v) |
| 44 | + |
| 45 | + var min_dist = 0.9 #radius-1/radius |
| 46 | + var max_dist = 1.1 #radius+1/radius |
| 47 | + |
| 48 | + for i in range(surf.get_vertex_count()): |
| 49 | + var v = surf.get_vertex(i) |
| 50 | + var dist = v.length() |
| 51 | + var dist_normalized = range_lerp(dist, min_dist, max_dist, 0, 1) # bring dist to 0..1 range |
| 52 | + |
| 53 | + var uv = Vector2(dist_normalized, 0) |
| 54 | + surf.set_vertex_uv(i, uv) |
| 55 | + |
| 56 | + # recalculate face normals (TODO smooth them!) |
| 57 | + for i in range(surf.get_face_count()): |
| 58 | + |
| 59 | + var v1i = surf.get_face_vertex(i,0) |
| 60 | + var v2i = surf.get_face_vertex(i,1) |
| 61 | + var v3i = surf.get_face_vertex(i,2) |
| 62 | + |
| 63 | + var v1 = surf.get_vertex(v1i) |
| 64 | + var v2 = surf.get_vertex(v2i) |
| 65 | + var v3 = surf.get_vertex(v3i) |
| 66 | + |
| 67 | + # calculate normal for this face |
| 68 | + var norm = -(v2 - v1).normalized().cross((v3 - v1).normalized()).normalized() |
| 69 | + |
| 70 | + surf.set_vertex_normal(v1i, norm) |
| 71 | + surf.set_vertex_normal(v2i, norm) |
| 72 | + surf.set_vertex_normal(v3i, norm) |
| 73 | + |
| 74 | + # commit the mesh |
| 75 | + var mmesh = ArrayMesh.new() |
| 76 | + surf.commit_to_surface(mmesh) |
| 77 | + planet.mesh = mmesh |
| 78 | + planet.mesh.surface_set_material(0, org_mesh.surface_get_material(0)) |
| 79 | + |
| 80 | + |
| 81 | +# Called every frame. 'delta' is the elapsed time since the previous frame. |
| 82 | +func _physics_process(delta): |
| 83 | + planet.rotation.y += PI / (360*2) |
| 84 | + |
| 85 | +func _on_btn_generate_pressed(): |
| 86 | + generate() |
0 commit comments