game/terrain_instance_3d.gd

198 lines
3.5 KiB
GDScript

@tool
class_name TerrainInstance3D extends GeometryInstance3D
var _mesh := ArrayMesh.new()
var _material: ShaderMaterial = (func ():
var material := ShaderMaterial.new()
material.shader = preload("res://terrain_shader.gdshader")
return material).call()
##
##
##
@export
var size: Vector2i = Vector2i.ZERO:
get:
return size
set(value):
self._mesh.clear_surfaces()
var width := value.x
var height := value.y
if (width != 0) and (height != 0):
if (width != size.x) or (height != size.y):
var surface_tool := SurfaceTool.new()
surface_tool.begin(Mesh.PRIMITIVE_TRIANGLES)
var center_x := width / 2.0
var center_y := height / 2.0
for y in height + 1:
for x in width + 1:
surface_tool.set_uv(Vector2(x / float(width), y / float(height)))
surface_tool.set_color(Color(0.0, 0.0, 0.0, 0.0))
surface_tool.set_normal(Vector3.UP)
surface_tool.add_vertex(Vector3(x - center_x, 0.0, y - center_y))
var vert := 0
for y in height:
for x in width:
surface_tool.add_index(vert + width + 2)
surface_tool.add_index(vert + width + 1)
surface_tool.add_index(vert + 1)
surface_tool.add_index(vert + 1)
surface_tool.add_index(vert + width + 1)
surface_tool.add_index(vert + 0)
vert += 1
vert += 1
RenderingServer.instance_set_base(self.get_instance(),
surface_tool.commit(self._mesh).get_rid())
self._material.set_shader_parameter("AREA", Vector2(value))
self._mesh.surface_set_material(0, self._material)
size = value
##
##
##
@export
var layer_1_albedo: Texture2D = null:
get:
return layer_1_albedo
set(value):
self._material.set_shader_parameter("LAYER_1_ALBEDO", value)
layer_1_albedo = value
##
##
##
@export
var layer_1_normal_map: Texture2D = null:
get:
return layer_1_normal_map
set(value):
self._material.set_shader_parameter("LAYER_1_NORMAL_MAP", value)
layer_1_normal_map = value
##
##
##
@export
var layer_2_albedo: Texture2D = null:
get:
return layer_2_albedo
set(value):
self._material.set_shader_parameter("LAYER_2_ALBEDO", value)
layer_2_albedo = value
##
##
##
@export
var layer_2_normal_map: Texture2D = null:
get:
return layer_2_normal_map
set(value):
self._material.set_shader_parameter("LAYER_2_NORMAL_MAP", value)
layer_2_normal_map = value
##
##
##
@export
var layer_3_albedo: Texture2D = null:
get:
return layer_3_albedo
set(value):
self._material.set_shader_parameter("LAYER_3_ALBEDO", value)
layer_3_albedo = value
##
##
##
@export
var layer_3_normal_map: Texture2D = null:
get:
return layer_3_normal_map
set(value):
self._material.set_shader_parameter("LAYER_3_NORMAL_MAP", value)
layer_3_normal_map = value
##
##
##
@export
var layer_4_albedo: Texture2D = null:
get:
return layer_4_albedo
set(value):
self._material.set_shader_parameter("LAYER_4_ALBEDO", value)
layer_4_albedo = value
##
##
##
@export
var layer_4_normal_map: Texture2D = null:
get:
return layer_4_normal_map
set(value):
self._material.set_shader_parameter("LAYER_4_NORMAL_MAP", value)
layer_4_normal_map = value
##
##
##
@export
var terrain_map: Texture2D = null:
get:
return terrain_map
set(value):
self._material.set_shader_parameter("TERRAIN_MAP", value)
terrain_map = value
##
##
##
@export
var max_height := 100.0:
get:
return max_height
set(value):
self._material.set_shader_parameter("MAX_HEIGHT", value)
max_height = max(value, 0.0)
func _init() -> void:
RenderingServer.instance_set_base(self.get_instance(), self._mesh)