Advertisement
acegiak

heightmap tile builder

Mar 2nd, 2023
1,450
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.  
  18.     var staticbody = Tile.new()
  19.     staticbody.x = x
  20.     staticbody.y = y
  21.     staticbody.set_collision_layer_value(1,true)
  22.     staticbody.set_collision_mask_value(2,true)
  23.     staticbody.set_collision_mask_value(3,true)
  24.     staticbody.collision_priority = 25
  25.  
  26.    
  27.    
  28.     var newMesh = MeshInstance3D.new()
  29.     newMesh.mesh = PlaneMesh.new()
  30.     newMesh.mesh.size.x = map_size.x
  31.     newMesh.mesh.size.y = map_size.y
  32.     newMesh.mesh.subdivide_width = (map_size.x/mesh_density) -1
  33.     newMesh.mesh.subdivide_depth = (map_size.y/mesh_density) -1
  34.     var mesh = ArrayMesh.new()
  35. #  
  36.     var xsize:int = map_size.x/mesh_density
  37.     var ysize:int = map_size.y/mesh_density
  38.    
  39.     var generated_lods = {}
  40.    
  41.     for key in lods.keys():
  42.         var decimate:int = lods[key]
  43.         var lod_indexes:Array[int] = []
  44.         for vx in range(xsize/decimate):
  45.             for vy in range(ysize/decimate):
  46.                 lod_indexes.append((vy*(xsize+1)*decimate)+(vx*decimate))
  47.                 lod_indexes.append((vy*(xsize+1)*decimate)+((vx+1)*decimate))
  48.                 lod_indexes.append(((vy+1)*(xsize+1)*decimate)+(vx*decimate))
  49.                
  50.                 lod_indexes.append((vy*(xsize+1)*decimate)+((vx+1)*decimate))
  51.                 lod_indexes.append(((vy+1)*(xsize+1)*decimate)+((vx+1)*decimate))
  52.                 lod_indexes.append(((vy+1)*(xsize+1)*decimate)+(vx*decimate))
  53.  
  54.         generated_lods[key]=PackedInt32Array(lod_indexes)
  55.        
  56.     mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, newMesh.mesh.get_mesh_arrays() ,[],generated_lods)
  57.     var mdt = MeshDataTool.new()
  58.     mdt.create_from_surface(mesh, 0)
  59.     for i in range(mdt.get_vertex_count()):
  60.         var vertex = mdt.get_vertex(i)
  61.         vertex.y = meshdata[i]
  62.         mdt.set_vertex(i, vertex)
  63.         var a = 1
  64.         var old = mdt.get_vertex_normal(i)
  65.         mdt.set_vertex_normal(i,expectedNormals[i])
  66.        
  67. #   # Run through vertices one last time to normalize normals and
  68. #   # set color to biome.
  69.     for i in range(mdt.get_vertex_count()):
  70.         var v = mdt.get_vertex_normal(i).normalized().rotated(Vector3.UP,PI)
  71.         mdt.set_vertex_normal(i, v)
  72.         mdt.set_vertex_color(i, Color(biomevals[i].x,biomevals[i].y,biomevals[i].z,1.0))
  73.        
  74.     mesh.clear_surfaces()
  75.     mdt.commit_to_surface(mesh)
  76.     newMesh.mesh = mesh
  77.     mesh.surface_set_material(0,surface_material)
  78.     mesh.regen_normal_maps()
  79.     newMesh.rotate_y(PI)
  80.  
  81.  
  82.    
  83.     newMesh.create_trimesh_collision()
  84.     var temp_collision = newMesh.find_children("*","CollisionShape3D",true,false)[0]
  85.     temp_collision.get_parent().remove_child(temp_collision)
  86.     staticbody.add_child(temp_collision)
  87.     temp_collision.rotate_y(PI)
  88.  
  89.  
  90.     newMesh.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_DOUBLE_SIDED
  91.     staticbody.add_child(newMesh)
  92.     newMesh.set_owner(get_tree().edited_scene_root)
  93.     staticbody.global_position = Vector3(x,0,y)
  94.     #call_deferred("add_child",staticbody)
  95.     spare_tiles.append(staticbody)
  96.     staticbody.tree_entered.connect(add_objects.bind(staticbody))
  97.     return staticbody
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement