You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
3.1 KiB
GDScript

extends MultiMeshInstance3D
@export_range(1, 126) var shell_count = 64
@export var noise_min: float = 0.4
@export var noise_max: float = 1.0
@export var shell_length: float = .1
@export var shell_distance_attenuation: float = 1.
@export var thickness: float = 3.4
@export var attenuation: float = 1.98
@export var occlusion_bias: float = .04
@export var shell_color: Vector3 = Vector3(0.2, 0.7, 0.2)
@export var density: int = 150
func _generate_mmi(layers: int, mmi: MultiMeshInstance3D, mesh: Mesh, material: Material, cast_shadow: bool):
var mdt = MeshDataTool.new()
if mmi.multimesh == null:
mmi.multimesh = MultiMesh.new()
mmi.multimesh.transform_format = MultiMesh.TRANSFORM_3D
var new_mesh: Mesh = mesh.duplicate(true) as Mesh
#new_mesh = _normals_to_vertex_color(new_mesh, material) # saves normal data as vertex color to be used by the shader (in the orig code)
mmi.multimesh.mesh = new_mesh
mmi.multimesh.instance_count = layers
mmi.multimesh.visible_instance_count = layers
for surface in new_mesh.get_surface_count():
material = ShaderMaterial.new()
material.set_shader(preload("res://grass.gdshader"))
mmi.multimesh.mesh.surface_set_material(surface, material.duplicate(true))
for i in range(layers):
#mmi.multimesh.set_instance_transform(i, Transform3D(Basis(), Vector3(0., .1 * i, 0.)))
mmi.multimesh.set_instance_transform(i, Transform3D(Basis(), Vector3()))
var grey = float(i) / float(layers)
#mmi.multimesh.set_instance_color(i, Color(1., 1., 1., 1.))
var mat = mmi.multimesh.mesh.surface_get_material(0)
if mat is ShaderMaterial:
#print("Setting shader params (", i, ")")
#mat.set_shader_parameter("_ShellIndex", i)
mmi.multimesh.set_instance_custom_data(i, Color(i, 0., 0., 0.)) # passes shell index for each instance
mat.set_shader_parameter("_NoiseMin", noise_min)
mat.set_shader_parameter("_NoiseMax", noise_max)
mat.set_shader_parameter("_ShellLength", shell_length)
mat.set_shader_parameter("_ShellCount", layers)
mat.set_shader_parameter("_ShellDistanceAttenuation", shell_distance_attenuation)
mat.set_shader_parameter("_Thickness", thickness)
mat.set_shader_parameter("_Attenuation", attenuation)
mat.set_shader_parameter("_OcclusionBias", occlusion_bias)
mat.set_shader_parameter("_ShellColor", shell_color)
mat.set_shader_parameter("_Density", density)
mmi.cast_shadow = 1 if cast_shadow else 0
func _ready():
var mat = ShaderMaterial.new()
#var mat2 = StandardMaterial3D.new()
mat.set_shader(preload("res://grass.gdshader"))
self._generate_mmi(self.shell_count, self, self.get_multimesh().mesh, mat, false)
print("===== Shell Texturing =====")
print("Layers: ", self.shell_count)
print("Noise (min): ", self.noise_min)
print("Noise (max): ", self.noise_max)
print("Shell length: ", self.shell_length)
print("Shell count: ", self.shell_count)
print("Shell distance attenuation: ", self.shell_distance_attenuation)
print("Thickness: ", self.thickness)
print("Attenuation: ", self.attenuation)
print("Occlusion bias: ", self.occlusion_bias)
print("Shell color: ", self.shell_color)
print("Density: ", self.density)