From 04321706aba0e7e629de5add77f4012b3824e644 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Fri, 26 Aug 2022 00:56:52 +0200 Subject: [PATCH 1/2] refonte du material du terrain --- utils/world_generation/WorldGeneration.gd | 35 +++++++++++----------- world/World3d.gd | 22 ++++++++++++++ world/game.tscn | 5 ++-- world/materials/colors.png | Bin 0 -> 489 bytes world/materials/colors.png.import | 35 ++++++++++++++++++++++ world/world.material | Bin 1168 -> 1319 bytes world/world.tres | 1 + 7 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 world/materials/colors.png create mode 100644 world/materials/colors.png.import diff --git a/utils/world_generation/WorldGeneration.gd b/utils/world_generation/WorldGeneration.gd index d23bcc6..1c410e1 100644 --- a/utils/world_generation/WorldGeneration.gd +++ b/utils/world_generation/WorldGeneration.gd @@ -4,13 +4,13 @@ class_name WorldGeneration export(int) var width = 2048 export(int) var height = 2048 -export(int) var spacing = 20 +export(int) var spacing = 5 export(int, 1, 9) var octaves = 5 export(int, 1, 30) var wavelength = 8 export(int) var border_width = 200 export(int) var terraces = 100 export(int) var terrace_height = 5 -export(float) var mountain_height = 6.0 / 24.0 +export(float) var mountain_height = 10.0 / 24.0 export(int) var river_proba = 200 var rng = RandomNumberGenerator.new() @@ -60,10 +60,12 @@ func init_data(): center.set_elevation(find_elevation(center.point2d())) if center.get_elevation() <= 0.0: center.set_data("water", true) + if center.get_elevation() >= mountain_height: + center.set_data("mountain", true) Global.loading.increment_step() fill_oceans() - remove_holes() + # remove_holes() for center in Global.terrain.get_centers(): center.set_data("coast", is_coast(center.to_point())) @@ -202,17 +204,6 @@ func edge_is_river(edge): return true return false -# func add_trees(): -# rng.randomize() -# var treescene = load("res://entities/environment/birchtree/birchtree.tscn") -# for triangle in Global.terrain.get_triangles(): -# if not triangle.get_data("water"): -# var num = rng.randi_range(0, 5) -# if num == 1: -# var tree = treescene.instance() -# tree.translation = Vector3(triangle.center3d() * Vector3(1, 12*10, 1)) -# add_child(tree) - @@ -231,7 +222,7 @@ func find_elevation(point): var nx = 2 * point.x / width - 1 var ny = 2 * point.y / height - 1 - var radius = range_lerp(elevation, -1, 1, 0.8, 1.0) + var radius = range_lerp(elevation, -1, 1, 0.8, 0.9) var distance = 1 - (1-pow(nx, 2)) * (1-pow(ny,2)) distance = sqrt(pow(nx, 2) + pow(ny, 2)) @@ -289,6 +280,15 @@ func create_mesh(): var factor = Vector3(1, 120, 1) for center in Global.terrain.get_centers(): if not center.get_data("water"): + var top_uv = Vector2(0, 0) + var border_uv = Vector2(1, 0) + if center.get_data("mountain"): + top_uv = Vector2(1, 0.5) + border_uv = Vector2(1, 0.5) + if center.get_data("coast"): + top_uv = Vector2(1, 1) + border_uv = Vector2(1, 1) + for edge in center.borders(): if edge.end_center().get_elevation() < edge.start_center().get_elevation(): var top = edge.start_center().get_elevation() @@ -297,7 +297,7 @@ func create_mesh(): var bottom = edge.end_center().get_elevation() if edge.end_center().get_data("ocean"): bottom = 0.0 - + st.add_uv(border_uv) st.add_vertex(Vector3(edge.start_corner().point3d().x, bottom, edge.start_corner().point3d().z) * factor) st.add_vertex(Vector3(edge.end_corner().point3d().x, top, edge.end_corner().point3d().z) * factor) st.add_vertex(Vector3(edge.start_corner().point3d().x, top, edge.start_corner().point3d().z) * factor) @@ -305,7 +305,7 @@ func create_mesh(): st.add_vertex(Vector3(edge.start_corner().point3d().x, bottom, edge.start_corner().point3d().z) * factor) st.add_vertex(Vector3(edge.end_corner().point3d().x, bottom, edge.end_corner().point3d().z) * factor) st.add_vertex(Vector3(edge.end_corner().point3d().x, top, edge.end_corner().point3d().z) * factor) - + for corner_count in center.corners().size(): var current_corner = center.corners()[corner_count] var next_corner @@ -314,6 +314,7 @@ func create_mesh(): else: next_corner = center.corners()[0] + st.add_uv(Vector2(top_uv)) st.add_vertex(Vector3(current_corner.point2d().x, center.get_elevation(), current_corner.point2d().y) * factor) st.add_vertex(Vector3(next_corner.point2d().x, center.get_elevation(), next_corner.point2d().y) * factor) st.add_vertex(Vector3(center.point2d().x, center.get_elevation(), center.point2d().y) * factor) diff --git a/world/World3d.gd b/world/World3d.gd index dc3c38b..62c90ef 100644 --- a/world/World3d.gd +++ b/world/World3d.gd @@ -1,5 +1,27 @@ extends Spatial +var rng = RandomNumberGenerator.new() + func _ready(): var mi = Global.terrain.get_data("mesh") add_child(mi) + add_trees() + +func add_trees(): + rng.randomize() + var treescene = load("res://entities/environment/birchtree/birchtree.tscn") + var poisson_disc_sampling: PoissonDiscSampling = PoissonDiscSampling.new() + + for center in Global.terrain.get_centers(): + if not center.get_data("water") and not center.get_data("coast") and not center.get_data("mountain"): + var num = rng.randi_range(0,10) + if num == 1: + var points2d = poisson_disc_sampling.generate_points(3, center.polygon(), 2) + for point in points2d: + # print(point) + var tree = treescene.instance() + var scaling = rng.randi_range(0.8, 1.2) + tree.scale = Vector3(scaling, scaling, scaling) + tree.rotate_y(rng.randi_range(0, 2*PI)) + tree.translation = Vector3(point.x, center.get_elevation() * 120, point.y) + add_child(tree) diff --git a/world/game.tscn b/world/game.tscn index 8236374..a05c5a7 100644 --- a/world/game.tscn +++ b/world/game.tscn @@ -1,7 +1,6 @@ -[gd_scene load_steps=12 format=2] +[gd_scene load_steps=11 format=2] [ext_resource path="res://ui/ui.tscn" type="PackedScene" id=1] -[ext_resource path="res://world/default_env.tres" type="Environment" id=3] [ext_resource path="res://world/World3d.gd" type="Script" id=4] [ext_resource path="res://utils/camera/CamBase.tscn" type="PackedScene" id=5] @@ -167,7 +166,6 @@ mesh = SubResource( 1 ) material/0 = SubResource( 3 ) [node name="WorldEnvironment" type="WorldEnvironment" parent="World3d"] -environment = ExtResource( 3 ) [node name="CamBase" parent="World3d" instance=ExtResource( 5 )] @@ -178,6 +176,7 @@ fov = 55.0 depth_threshold = 0.001 depth_multiplier = 999.0 zoom_sensibility = 1.436 +height = 6.596 [node name="DirectionalLight" type="DirectionalLight" parent="World3d"] transform = Transform( 0.971628, 0.168947, -0.16552, 0, 0.699825, 0.714314, 0.236516, -0.694047, 0.67997, 0, 1.41623, 14.8745 ) diff --git a/world/materials/colors.png b/world/materials/colors.png new file mode 100644 index 0000000000000000000000000000000000000000..552593da68a99fc4ff1014f163e8021b2e60d5fc GIT binary patch literal 489 zcmVEX>4Tx04R}tkv&MmKpe$iQ>8^J3U<)qkfAzR5EXIMDionYs1;guFuC*#nlvOW zE{=k0!NHHks)LKOt`4q(Aou~|=;Wm6A|?JWDYS_3;J6>}?mh0_0Yan9G^=YI(DbUA zO2oxXc2x|#B8VaMBLct7EMrcRlJFc~_we!cF2=LG&;2=i)ttoupGZ8*46{nSK|H-# zH8}4RhgnfpiO-40Ou8WPBi9v|-#8Z>7IPWeK{ zWtH<5XRTagt$XqphI0DKGS_JiBY{OML4pVcHIz_B6){?MQY@rsKkng=IDUy-3b{&P z0{s+Iiweph_Zc-=?bidg4#|RME1)6o+{yw(t<_X|`2CnqBztR9^K1r{) zwdfJhw+&oew>4!CxZD8-pA6ZQ9m!8q$mfCgGy0}1FmMa>thv3l_Hp_Eq^Yaq4RCM> zj20++-Q(TC&ffk#)9UXBGL3SLfD+H90000WNkl*7BY4tgGoh)^h{cd zr%I1c0hj=u0Hy$#i$F~gyu0&+?*pe7Zw}Bv>@+vLK z?oKUH6N76_Z^;XBrr=z)c5eDj8*&uX*f;Y8NLR_}Yg+dF?&d=e6g2Iv$I9cV@Y7ExpQT zzbCe&|1u`k8^)NSJWsmdsx5I^c2d;lkVaA+l1R1dxZoy@v^L~AG<-2ZEKf6cva~_k zbx`$_-KCc1X@|d<*;)4l^;0ml-HrHl!QFrO2g6j{1Gsm=OMh5rGd^LMiq_yXhZ{v> z-2H&N18|+O4Iht)&&QKl9M9$XSSXtIGcq79&x5{-8P%3n@olP@RaLBcPKIGIpFJR{zw0=@O5nsdl; zI#_>mxM{9prgf-1crNSKnKRvzgyp7Qj5aZAS#c4;yu9{R%u?5iP>d)v^V(OjhGU`V z&eZf>#ikguj5msY6DXNl@S8d;qLIkm9Yh3138)B+B`Jgq*;*h;vSlYv9(Z!-*fbwM z9Dr`zz_Eqc!DC}#DKfJ^FuM&!Z zd3g+rHrk6;T4Y#4Dn?bzv>%N^FDOpPz=$fA6fG?)F(DTi6QL3iOI^5I9y6LrEGu5u1VW_sDSNStr2YeHh6)NQbEu9ZG=T8I^A#1z7>WC9uku zDZZ!*Y;!7pyYRL(-jk-?J+*6Kf?<3OrtQv!d;7$hus(RxaMDgBfdCmk;SfSj{IbEA z{>fl<4Hm0mB#FIe*%&i4$?JN^&MFkUibtwWe4Dh0*2I2KH1N?L;aMiqm2(!2;pidD z8P-PX78HCC<>tm9Jg^?!=GLe6nlB)pASDTn@5A;6-xxS#FE9=G!wa@(W{D5}0XhvP ze?=t`KJ1o|p@oeMD%SE}P{@sl9>B%M19gS>^iX0!CzN9@@*Tw`kcu9C%Q1u($ znmK}|xB}9j{XH}m0>S>7_E$Cq$~>$EiA6>1Zj}(e+aDb)j%uL_vVyUQRjyqrMDsSGeSp3SB(B)SerK&~QI=t~C;{!gS-^z9dKFk9# zBWqIFokbzA4t4=*P)(?a%^7j6H5U++sUkpW7?fG0ZlN`CDc~2&NW>_@9y}0chw^?K d7=PR(12APnK?D*L-2Il2Dp**RCSY) z^F{*|OUnb#vVmvdLJZUXzt`m!=>xHDp|vIsthfOf_6jq4=!ij0z(J#F;GSBknj{!G z!OGVZhX9cPlmI&8J>?duhpnzq!dJ&zFK8_@hr#!Vt8^5#D|Ix<3$8W2Bksd_g3oHL z+_aPSo7B@*C$sdT1lQ7w+eELsLqF}Bam`-LRJ#p)do@q(?gm`bTQ{o34sZQUs^LjH zc^5dnbn1wAv~pq_>C7M2G`l+mcZc9s)=alt$yAdgk-IY>;O+w411FP`x{U9eOiCg} z?$%S5B>32S;PBXYs*=ZkQ^M(JD0gL!`_|E;{PkO6yM34OR__PlW#YK#VpcnvI&x0b z=I=Tycn2U41v^xoPk9PnR9i~HkD=g2Q4r=g zmu10gW2#*V-<_+*fpIcb8tiYSps98o&gN8UyiVFl!E7}9(vFjP)4cT?us7AN1L9+- zl-K-LbN=Q=gXVAkHq8{gFb&j(PNlh3=1h0oaNLxGFa};A&q}C;<*}#Wb*fZ+Ttc4| zk39upHX0M%nUY?sm;|*eOZaAN@%$i$^sE36nKs#2tmUKxI2O@hzX>!85uL&edF#2 z3b?z1O7uDdwJ&n(>ZCfUOrGA#-Oq2VVG`fryuEhu{FAkE)-5}{KlzXHacN0YRkjLe-(lX*BB7oAU!JT4gMnpuCf~1hfKmtOL zDl={pfKxflg3vHTs){Dr+VAk0ch-&d%4Gwarle_k#D|yXya;AA;t4YmsYzMn^=6Oc zP?mw~5=o3sNdm5AlSF~ZiYiRD`1MEzwJ`w-^t!FvZP_f+R`DI^p4SFv5@ z!zPjte-E_(_(R~64T0|fqUIlS+)IMs4fK-$87MkLs8Z04^7s{4j1$c@^9+%`e5qy<`^QZ&S`YQ}gT-H?O{s(!O@a=g$ i-(k#U7e+xrh*R^9A|OK;o%}SaOQ|1|LVz7oQ$s^%yDuC7 diff --git a/world/world.tres b/world/world.tres index ac212ee..e91e776 100644 --- a/world/world.tres +++ b/world/world.tres @@ -1,4 +1,5 @@ [gd_resource type="SpatialMaterial" format=2] [resource] +params_diffuse_mode = 1 albedo_color = Color( 0.125, 0.5, 0.275, 1 ) -- 2.36.2 From 656f1a2f0b0d330d98d859e026fd6589b0869109 Mon Sep 17 00:00:00 2001 From: Valentin Stark Date: Sat, 27 Aug 2022 16:45:32 +0200 Subject: [PATCH 2/2] =?UTF-8?q?rajout=20d'un=20fichier=20json=20pour=20r?= =?UTF-8?q?=C3=A9pertorier=20les=20mat=C3=A9riaux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE.md | 22 ------------------ utils/world_generation/WorldGeneration.gd | 27 +++++++++++++--------- world/materials/materials.json | 5 ++++ world/{ => materials}/world.material | Bin world/world.tres | 5 ---- 5 files changed, 21 insertions(+), 38 deletions(-) delete mode 100644 LICENSE.md create mode 100644 world/materials/materials.json rename world/{ => materials}/world.material (100%) delete mode 100644 world/world.tres diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index b3e9312..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2021 João Marinheiro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/utils/world_generation/WorldGeneration.gd b/utils/world_generation/WorldGeneration.gd index 1c410e1..f00364b 100644 --- a/utils/world_generation/WorldGeneration.gd +++ b/utils/world_generation/WorldGeneration.gd @@ -4,7 +4,7 @@ class_name WorldGeneration export(int) var width = 2048 export(int) var height = 2048 -export(int) var spacing = 5 +export(int) var spacing = 40 export(int, 1, 9) var octaves = 5 export(int, 1, 30) var wavelength = 8 export(int) var border_width = 200 @@ -71,6 +71,12 @@ func init_data(): center.set_data("coast", is_coast(center.to_point())) # if center.get_data("ocean"): # center.set_elevation(-1.0) + + center.set_data("material", "grass") + if center.get_data("mountain"): + center.set_data("material", "stone") + if center.get_data("coast"): + center.set_data("material", "sand") @@ -236,7 +242,7 @@ func find_elevation(point): elevation = min(elevation, 1) - elevation = round(elevation * terraces) / terraces + elevation = (elevation * terraces) / terraces return elevation @@ -274,20 +280,19 @@ func is_coast(point): func create_mesh(): + var file = File.new() + file.open("res://world/materials/materials.json", File.READ) + var materials = JSON.parse(file.get_as_text()).result + var st = SurfaceTool.new() st.begin(Mesh.PRIMITIVE_TRIANGLES) var factor = Vector3(1, 120, 1) for center in Global.terrain.get_centers(): if not center.get_data("water"): - var top_uv = Vector2(0, 0) - var border_uv = Vector2(1, 0) - if center.get_data("mountain"): - top_uv = Vector2(1, 0.5) - border_uv = Vector2(1, 0.5) - if center.get_data("coast"): - top_uv = Vector2(1, 1) - border_uv = Vector2(1, 1) + var material_id = materials[center.get_data("material")] + var top_uv = Vector2(0, float(material_id) / (materials.size()-1)) + var border_uv = Vector2(1, float(material_id) / (materials.size()-1)) for edge in center.borders(): if edge.end_center().get_elevation() < edge.start_center().get_elevation(): @@ -325,7 +330,7 @@ func create_mesh(): var mi = MeshInstance.new() mi.mesh = st.commit() - var material = load("res://world/world.material") + var material = load("res://world/materials/world.material") mi.set_surface_material(0, material) mi.create_trimesh_collision() mi.cast_shadow = GeometryInstance.SHADOW_CASTING_SETTING_ON diff --git a/world/materials/materials.json b/world/materials/materials.json new file mode 100644 index 0000000..fb6a7f9 --- /dev/null +++ b/world/materials/materials.json @@ -0,0 +1,5 @@ +{ + "grass": 0, + "stone": 1, + "sand": 2 +} diff --git a/world/world.material b/world/materials/world.material similarity index 100% rename from world/world.material rename to world/materials/world.material diff --git a/world/world.tres b/world/world.tres deleted file mode 100644 index e91e776..0000000 --- a/world/world.tres +++ /dev/null @@ -1,5 +0,0 @@ -[gd_resource type="SpatialMaterial" format=2] - -[resource] -params_diffuse_mode = 1 -albedo_color = Color( 0.125, 0.5, 0.275, 1 ) -- 2.36.2