title: How does UV mapping work with surfacetool in Godot?
body: <p>I'm coding a terrain generator in Godot. I generate the Mesh using SurfaceTool and triangle strips. The geometry works fine — but the UV mapping doesn't, as each triangle repeats the texture instead of the full mesh covering the texture once:
  <a href="https://i.stack.imgur.com/tlHpR.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/tlHpR.png" alt="Without normalization"></a></p>
  
  <p>Normalizing the UV-Coordinates to fit into the 0,0 - 1,1 dimensions is what should work, but doesn't, as it makes only one pair of triangles have the full texture and the rest is blank:
  <a href="https://i.stack.imgur.com/nnaiF.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/nnaiF.png" alt="After normalization/dividing the uv coordinates by the terrain width and depth"></a></p>
  
  <pre><code>extends MeshInstance
  
  export var terrain_width = 16
  export var terrain_depth = 16
  export var terrain_height = 1
  export var terrain_scale = 1
  
  #Noise Generation
  var terrain_noise = OpenSimplexNoise.new()
  
  var terrain_heightmap = ImageTexture.new()
  var terrain_texture = Texture.new()
  var terrain_material = SpatialMaterial.new()
  var terrain_mesh = Mesh.new()
  
  var surfacetool = SurfaceTool.new()
  
  func _ready():
      generate_heightmap()
      generate_mesh()
  
  func generate_heightmap():
      #Setup the noise
      terrain_noise.seed = randi()
      terrain_noise.octaves = 4
      terrain_noise.period = 20.0
      terrain_noise.persistence = 0.8
  
      #Make the texture
      terrain_heightmap.create_from_image(terrain_noise.get_image(terrain_width+1, terrain_depth+1))
      terrain_texture = terrain_heightmap
  
  func generate_mesh():
      #Set the material texture to the heightmap
      terrain_material.albedo_texture = terrain_texture
  
      # This is where the uv-mapping occurs, via the add_uv function
      for z in range(0,terrain_depth):
          surfacetool.begin(Mesh.PRIMITIVE_TRIANGLE_STRIP)
          for x in range(0,terrain_width):
  
              surfacetool.add_uv(Vector2((terrain_width-x)/terrain_width,z/terrain_depth))
              surfacetool.add_vertex(Vector3((terrain_width-x)*terrain_scale, terrain_noise.get_noise_2d(x,z)*terrain_height*terrain_scale, z*terrain_scale))
              surfacetool.add_uv(Vector2((terrain_width-x)/terrain_width,(z+1)/terrain_depth))
              surfacetool.add_vertex(Vector3((terrain_width-x)*terrain_scale, terrain_noise.get_noise_2d(x,z+1)*terrain_height*terrain_scale, (z+1)*terrain_scale))
  
          surfacetool.generate_normals()
          surfacetool.index()
  
          surfacetool.commit(terrain_mesh)
  
      #Set the texture and mesh on the MeshInstance
      self.material_override = terrain_material
      self.set_mesh(terrain_mesh)
      self.set_surface_material(0, terrain_texture)
  </code></pre>
  
  <p>I expect each triangle to cover only the corresponding coordinates in the texture.
  It seems as if each triangle is considered as a separate surface.</p>