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)