for u in material.uniforms:
ss.sub.append(Statement("uniform", u.name, *u.values[:u.size]))
st.sub.append(ss)
+ elif material.receive_shadows:
+ st.sub.append(Statement("receive_shadows", True))
tech_res.statements.append(st)
+ if material.shadow_method!='NONE':
+ st = Statement("pass", "shadow")
+ st.sub.append(Statement("shader", "_occluder.glsl.shader"))
+ tech_res.statements.append(st)
+
return tech_res
class MaterialExporter:
self.render_mode = material.render_mode
self.technique = material.technique
self.shader = material.shader
+ self.receive_shadows = material.receive_shadows
+ self.cast_shadows = (material.shadow_method!='NONE')
if self.render_mode=='EXTERNAL' and not self.technique:
raise Exception("Invalid configuration on material {}: No technique for external rendering".format(self.name))
self.name = "material_atlas_"+os.path.splitext(self.shader)[0]
else:
self.name = "material_atlas"
+ self.receive_shadows = materials[0].receive_shadows
+ self.cast_shadows = (materials[0].shadow_method!='NONE')
self.materials = materials
self.material_names = [m.name for m in self.materials]
for m in self.materials:
raise Exception("Conflicting render modes in MaterialAtlas constructor")
if self.render_mode=='CUSTOM' and m.shader!=self.shader:
raise Exception("Conflicting shaders in MaterialAtlas constructor")
+ if m.receive_shadows!=self.receive_shadows or m.shadow_method!=materials[0].shadow_method:
+ raise Exception("Conflicting shadow settings in MaterialAtlas constructor")
count = len(self.materials)
size = 1
elif mat.render_mode=='EXTERNAL':
self.layout.prop(mat, "technique")
self.layout.prop(mat, "array_atlas")
+ if mat.render_mode=='BUILTIN':
+ self.layout.prop(mat, "receive_shadows")
if mat.array_atlas:
self.layout.prop(mat, "array_layer")
if mat.render_mode!='EXTERNAL':
("EXTERNAL", "External technique", "Use an externally defined technique")))
bpy.types.Material.technique = bpy.props.StringProperty(name="Custom technique", description="Name of an external technique to use for rendering")
bpy.types.Material.shader = bpy.props.StringProperty(name="Custom shader", description="Name of an external technique to use for rendering")
+ bpy.types.Material.receive_shadows = bpy.props.BoolProperty(name="Receive shadows", description="Receive shadows from a shadow map", default=True)
bpy.types.Material.array_atlas = bpy.props.BoolProperty(name="Texture array atlas", description="The material is stored in a texture array")
bpy.types.Material.array_layer = bpy.props.IntProperty("Texture array layer", description="Layer of the texture array atlas to use")
bpy.types.Material.material_atlas = bpy.props.BoolProperty(name="Material atlas", description="Make this material part of a material atlas")