Advertisement
acegiak

procedural heightmap mesh w/ lods attempt

Mar 2nd, 2023
1,578
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. func make_heightmap(x,y):
  2.     print_debug(str(multiplayer.get_unique_id())+" Generate terrain "+str(x)+","+str(y))
  3.     noise.fractal_octaves = 4
  4.     var meshdata = []
  5.     var expectedNormals = []
  6.     var biomevals = []
  7.     for yy in range(0,(map_size.y/mesh_density)+1):
  8.         for xx in range(0,(map_size.x/mesh_density)+1):
  9.             meshdata.append(getHeight((xx*mesh_density)+x,(mesh_density*yy)+y))
  10.             expectedNormals.append(make_normal(Vector3((xx*mesh_density)+x,getHeight((xx*mesh_density)+x,(yy*mesh_density)+y),(yy*mesh_density)+y)))
  11.             biomevals.append(biome_data((xx*mesh_density)+x,(mesh_density*yy)+y))
  12.     var scaled_data = []
  13.     for yy in range(0,(map_size.y/collision_density)+1):
  14.         for xx in range(0,(map_size.x/collision_density)+1):
  15.             scaled_data.append(getHeight((xx*collision_density)+x,(yy*collision_density)+y))
  16.  
  17.     var staticbody = Tile.new()
  18.     staticbody.x = x
  19.     staticbody.y = y
  20.     staticbody.set_collision_layer_value(1,true)
  21.     staticbody.set_collision_mask_value(2,true)
  22.     staticbody.set_collision_mask_value(3,true)
  23.     staticbody.collision_priority = 25
  24.    
  25.    
  26.     var newMesh = MeshInstance3D.new()
  27.     newMesh.mesh = PlaneMesh.new()
  28.     newMesh.mesh.size.x = map_size.x
  29.     newMesh.mesh.size.y = map_size.y
  30.     newMesh.mesh.subdivide_width = (map_size.x/mesh_density) -1
  31.     newMesh.mesh.subdivide_depth = (map_size.y/mesh_density) -1
  32.     var mesh = ArrayMesh.new()
  33.  
  34. #  
  35.    
  36.     mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, newMesh.mesh.get_mesh_arrays() )
  37.     var mdt = MeshDataTool.new()
  38.     mdt.create_from_surface(mesh, 0)
  39.     for i in range(mdt.get_vertex_count()):
  40.         var vertex = mdt.get_vertex(i)
  41.         vertex.y = meshdata[i]
  42.         mdt.set_vertex(i, vertex)
  43.         var a = 1
  44.         var old = mdt.get_vertex_normal(i)
  45.         mdt.set_vertex_normal(i,expectedNormals[i])
  46.        
  47. #   # Run through vertices one last time to normalize normals and
  48. #   # set color to biome values.
  49.     for i in range(mdt.get_vertex_count()):
  50.         var v = mdt.get_vertex_normal(i).normalized().rotated(Vector3.UP,PI)
  51.         mdt.set_vertex_normal(i, v)
  52.         mdt.set_vertex_color(i, Color(biomevals[i].x,biomevals[i].y,biomevals[i].z,1.0))
  53.        
  54.     mesh.clear_surfaces()
  55.     mdt.commit_to_surface(mesh)
  56.     newMesh.mesh = mesh
  57.    
  58.     var xsize:int = map_size.x/mesh_density
  59.     var ysize:int = map_size.y/mesh_density
  60.     var generated_lods = {}
  61.     for key in lods.keys():
  62.         var decimate:int = lods[key]
  63.         var lod_indexes:Array[int] = []
  64.         for vx in range(xsize/decimate):
  65.             for vy in range(ysize/decimate):
  66.                 lod_indexes.append((vy*(xsize+1)*decimate)+(vx*decimate))
  67.                 lod_indexes.append((vy*(xsize+1)*decimate)+((vx+1)*decimate))
  68.                 lod_indexes.append(((vy+1)*(xsize+1)*decimate)+(vx*decimate))
  69.                
  70.                 lod_indexes.append((vy*(xsize+1)*decimate)+((vx+1)*decimate))
  71.                 lod_indexes.append(((vy+1)*(xsize+1)*decimate)+((vx+1)*decimate))
  72.                 lod_indexes.append(((vy+1)*(xsize+1)*decimate)+(vx*decimate))
  73.  
  74.         generated_lods[key]=PackedInt32Array(lod_indexes)
  75.        
  76.    
  77.     var arrays = mesh.surface_get_arrays(0)
  78.     mesh.clear_surfaces()
  79.     mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES,arrays,[],generated_lods)
  80.     mesh.surface_set_material(0,surface_material)
  81.     mesh.regen_normal_maps()
  82.     newMesh.rotate_y(PI)
  83.  
  84.  
  85.     newMesh.create_trimesh_collision()
  86.     var temp_collision = newMesh.find_children("*","CollisionShape3D",true,false)[0]
  87.     temp_collision.get_parent().remove_child(temp_collision)
  88.     staticbody.add_child(temp_collision)
  89.     temp_collision.rotate_y(PI)
  90.  
  91.  
  92.     newMesh.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_DOUBLE_SIDED
  93.     staticbody.add_child(newMesh)
  94.     newMesh.set_owner(get_tree().edited_scene_root)
  95.     staticbody.global_position = Vector3(x,0,y)
  96.  
  97.     spare_tiles.append(staticbody)
  98.     staticbody.tree_entered.connect(add_objects.bind(staticbody))
  99.     return staticbody
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement