material-maker/addons/material_maker/engine/gen_convolution.gd
RodZill4 ff191538f6 Added group creation and refactoring.
Moved handling of the "global" definitions of shaders into main shader generation code.
Added group creation (does not create inputs yet, and remotes should be cleaned).
updated all preview meshes (to fix problems with depth).
2019-09-29 10:07:32 +02:00

64 lines
2.4 KiB
GDScript

tool
extends MMGenBase
class_name MMGenConvolution
var convolution_params : Dictionary = {}
func get_type():
return "shader"
func get_type_name():
if convolution_params.has("name"):
return convolution_params.name
return .get_type_name()
func get_parameter_defs():
return [ { name="size", type="size", first=4, last=11, default=4 } ]
func get_input_defs():
return [ { name="in", type=convolution_params.input_type } ]
func get_output_defs():
return [ { type=convolution_params.output_type } ]
func set_convolution_params(data: Dictionary):
convolution_params = data
func _get_shader_code(uv : String, output_index : int, context : MMGenContext):
var genname = "o"+str(get_instance_id())
var epsilon = 1.0/pow(2, 4+parameters.size)
var types = { "rgba": { type="vec4", init="vec4(0.0)" }, "rgb": { type="vec3", init="vec3(0.0)" }, "f": { type="float", init="0.0" } }
var rv = { globals=[], defs="", code="", textures={} }
var source = get_source(0)
if source == null:
return rv
var variant_index = context.get_variant(self, uv)
if variant_index == -1:
variant_index = context.get_variant(self, uv)
rv.code += "%s %s_%d = %s;\n" % [ types[convolution_params.output_type].type, genname, variant_index, types[convolution_params.output_type].init ]
for dy in range(-convolution_params.y, convolution_params.y+1):
for dx in range(-convolution_params.x, convolution_params.x+1):
var coef = convolution_params.matrix[dy+convolution_params.y][dx+convolution_params.x]
if typeof(coef) == TYPE_INT:
coef = float(coef)
if typeof(coef) == TYPE_REAL:
coef = Vector3(coef, coef, coef)
if typeof(coef) == TYPE_ARRAY:
coef = Vector3(coef[0], coef[1], coef[2])
var coef_str = "vec3(%.9f,%.9f,%.9f)" % [ coef.x, coef.y, coef.z ]
var uv_str = "((%s)+vec2(%.9f,%.9f))" % [ uv, dx*epsilon, dy*epsilon ]
var src_code = source.generator.get_shader_code(uv_str, source.output_index, context)
while src_code is GDScriptFunctionState:
src_code = yield(src_code, "completed")
rv.defs += src_code.defs
rv.code += src_code.code
rv.code += "%s_%d += %s*%s;\n" % [ genname, variant_index, coef_str, src_code[convolution_params.input_type] ]
for t in src_code.textures.keys():
rv.textures[t] = src_code.textures[t]
rv.rgb = "%s_%d" % [ genname, variant_index ]
return rv
func _serialize(data):
data.convolution_params = convolution_params
return data