X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=blender%2Fio_mspgl%2Fexport_material.py;h=7f36beeb4016972acf9e72a052fa0c56f79ba010;hb=f2d504006ec97c7d84e8059c48f5a37e005ece5f;hp=9ec0670a96d2190860f7af70e5f7447398c1fc02;hpb=0b82bc99d8b4ade32a4ab97048dbdb6fde628d88;p=libs%2Fgl.git diff --git a/blender/io_mspgl/export_material.py b/blender/io_mspgl/export_material.py index 9ec0670a..7f36beeb 100644 --- a/blender/io_mspgl/export_material.py +++ b/blender/io_mspgl/export_material.py @@ -1,4 +1,33 @@ -import os +def create_shadow_method(tech_res, material, resources, detail): + from .datafile import Statement, Token + + color_prop = next((p for p in material.properties if p.keyword and "color" in p.keyword), None) + + st = Statement("method", "shadow"+detail) + if material.alpha_cutoff>0.0 and color_prop and 'A' in color_prop.tex_channels: + st.sub.append(tech_res.create_reference_statement("shader", resources["occluder{}_masked.shader".format(detail)])) + ss = Statement("texture", "alpha_map") + + from .export_texture import TextureExporter + from .export_texture import SamplerExporter + texture_export = TextureExporter() + sampler_export = SamplerExporter() + + tex_res = resources[texture_export.get_texture_name(color_prop.texture, color_prop.tex_channels)] + ss.sub.append(tech_res.create_reference_statement("texture", tex_res)) + ss.sub.append(tech_res.create_reference_statement("sampler", resources[sampler_export.get_sampler_name(color_prop.texture)])) + st.sub.append(ss) + + ss = Statement("uniforms") + ss.sub.append(Statement("uniform", "alpha_cutoff", material.alpha_cutoff)) + st.sub.append(ss) + else: + st.sub.append(Statement("shader", "occluder{}.glsl.shader".format(detail))) + + if material.face_cull=='BACK': + st.sub.append(Statement("face_cull", Token("CULL_BACK"))) + + return st; def create_technique_resource(material, resources): from .datafile import Resource, Statement, Token @@ -34,6 +63,9 @@ def create_technique_resource(material, resources): ss.sub.append(Statement("uniform", u.name, *u.values[:u.size])) st.sub.append(ss) + if material.face_cull=='BACK': + st.sub.append(Statement("face_cull", Token("CULL_BACK"))) + tech_res.statements.append(st) else: base_method = "blended" if material.blend_type!='NONE' else "" @@ -47,17 +79,14 @@ def create_technique_resource(material, resources): st.sub.append(Statement("receive_shadows", True)) if material.image_based_lighting: st.sub.append(Statement("image_based_lighting", True)) + if material.face_cull=='BACK': + st.sub.append(Statement("face_cull", Token("CULL_BACK"))) tech_res.statements.append(st) if material.cast_shadows: - st = Statement("method", "shadow") - st.sub.append(Statement("shader", "occluder.glsl.shader")) - tech_res.statements.append(st) - - st = Statement("method", "shadow_thsm") - st.sub.append(Statement("shader", "occluder_thsm.glsl.shader")) - tech_res.statements.append(st) + tech_res.statements.append(create_shadow_method(tech_res, material, resources, "")); + tech_res.statements.append(create_shadow_method(tech_res, material, resources, "_thsm")); return tech_res @@ -77,7 +106,7 @@ class MaterialExporter: for p in textured_props: ctx.next_slice(p.texture.image) - tex_name = p.texture.image.name+".tex" + tex_name = texture_export.get_texture_name(p.texture, p.tex_channels) if tex_name not in resources: resources[tex_name] = texture_export.export_texture(p.texture, p.tex_channels) @@ -93,6 +122,12 @@ class MaterialExporter: else: resources[mat_name] = None + if material.cast_shadows and material.alpha_cutoff>0.0: + for detail in ("", "_thsm"): + shader_name = "occluder{}_masked.shader".format(detail) + if shader_name not in resources: + resources[shader_name] = self.export_shader(shader_name, "occluder{}.glsl".format(detail), {"use_alpha_cutoff":True}, resources) + def export_technique(self, material, resources): from .material import Material if type(material)!=Material: @@ -117,14 +152,17 @@ class MaterialExporter: from .export_texture import SamplerExporter sampler_export = SamplerExporter() mat_res.statements.append(mat_res.create_reference_statement("sampler", resources[sampler_export.get_sampler_name(textures[0])])) + if material.alpha_cutoff>0.0: + mat_res.statements.append(Statement("alpha_cutoff", material.alpha_cutoff)) return mat_res def create_property_statement(self, mat_res, prop, resources): from .datafile import Statement if prop.texture: - tex_res = resources[prop.texture.image.name+".tex"] - from .util import basename + from .export_texture import TextureExporter + texture_export = TextureExporter() + tex_res = resources[texture_export.get_texture_name(prop.texture, prop.tex_channels)] return mat_res.create_reference_statement(prop.tex_keyword, tex_res) elif not prop.keyword: return @@ -133,41 +171,13 @@ class MaterialExporter: else: return Statement(prop.keyword, prop.value) + def export_shader(self, name, module, spec_values, resources): + from .datafile import Resource, Statement + shader_res = Resource(name, "shader") -class MaterialAtlasExporter: - def __init__(self): - pass - - def export_technique_resources(self, material_atlas, resources): - from .datafile import Resource, Statement, Token - base_color_name = material_atlas.name+"_base_color.tex" - base_color_res = resources.get(base_color_name) - if not base_color_res: - base_color_res = Resource(base_color_name, "texture") - - base_color_res.statements.append(Statement("type", Token("\\2d"))) - base_color_res.statements.append(Statement("storage", Token('SRGB_ALPHA'), *material_atlas.size)) - base_color_res.statements.append(Statement("raw_data", material_atlas.base_color_data)) - - resources[base_color_name] = base_color_res - - sampler_name = "nearest.samp" - sampler_res = resources.get(sampler_name) - if not sampler_res: - sampler_res = Resource(sampler_name, "sampler") - - sampler_res.statements.append(Statement("filter", Token('NEAREST'))) - - resources[sampler_name] = sampler_res - - mat_name = material_atlas.name+".mat" - if mat_name not in resources: - mat_res = Resource(mat_name, "material") - mat_res.statements.append(Statement("type", Token('pbr'))) - mat_res.statements.append(mat_res.create_reference_statement("base_color_map", base_color_res)) - mat_res.statements.append(mat_res.create_reference_statement("sampler", sampler_res)) - - resources[mat_name] = mat_res + st = Statement("module", module) + for k, v in spec_values.items(): + st.sub.append(Statement("specialize", k, v)) + shader_res.statements.append(st) - def export_technique(self, material_atlas, resources): - return create_technique_resource(material_atlas, resources) + return shader_res