from .outfile import open_output
out_file = open_output(out_file)
+ path, base = os.path.split(out_file.filename)
from .export_mesh import MeshExporter
mesh_export = MeshExporter()
setattr(mesh_export, k, v)
if self.separate_mesh:
- path, base = os.path.split(out_file.filename)
base, ext = os.path.splitext(base)
mesh_out = open_output(os.path.join(path, base+".mesh"))
mesh = mesh_export.export(context, mesh_out, objs, progress)
mesh = mesh_export.export(context, out_file, objs, progress)
out_file.end()
+ if self.srgb_colors:
+ self.colormap = linear_to_srgb
+ else:
+ self.colormap = lambda x: x
+
if self.external_tech and obj.technique:
- if obj.inherit_tech and mesh.materials[0].texture_slots:
+ if obj.inherit_tech and (obj.override_material or mesh.materials[0].texture_slots):
out_file.begin("technique")
out_file.begin("inherit", '"{}"'.format(obj.technique))
for slot in mesh.materials[0].texture_slots:
out_file.write("texture", '"diffuse_map"', '"{}"'.format(name))
elif slot.use_map_normal:
out_file.write("texture", '"normal_map"', '"{}"'.format(name))
+ if obj.override_material:
+ mat_name = mesh.materials[0].name+".mat"
+ mat_out = open_output(os.path.join(path, mat_name))
+ self.export_material(mesh.materials[0], mat_out)
+ out_file.write("material", '""', '"{}"'.format(mat_name))
out_file.end()
out_file.end()
else:
out_file.write("technique", '"{}"'.format(obj.technique))
elif self.separate_tech:
- path, base = os.path.split(out_file.filename)
if self.shared_tech and mesh.materials:
tech_name = mesh.materials[0].name+".tech"
else:
def export_technique(self, mesh, out_file):
out_file.begin("pass", '""')
if mesh.materials:
- if self.srgb_colors:
- cm = linear_to_srgb
- else:
- cm = lambda x: x
+ cm = self.colormap
if self.material_tex:
out_file.begin("material")
out_file.end()
out_file.end()
else:
- mat = mesh.materials[0]
out_file.begin("material")
- if any((s and s.use_map_color_diffuse) for s in mat.texture_slots):
- out_file.write("diffuse", 1.0, 1.0, 1.0, 1.0)
- amb = cm(mat.ambient)
- out_file.write("ambient", amb, amb, amb, 1.0)
- else:
- diff = mat.diffuse_color*mat.diffuse_intensity
- out_file.write("diffuse", cm(diff.r), cm(diff.g), cm(diff.b), 1.0)
- amb = diff*mat.ambient
- out_file.write("ambient", cm(amb.r), cm(amb.g), cm(amb.b), 1.0)
- spec = mat.specular_color*mat.specular_intensity
- out_file.write("specular", spec.r, spec.g, spec.b, 1.0)
- out_file.write("shininess", mat.specular_hardness);
+ self.export_material(mesh.materials[0], out_file)
out_file.end()
if self.textures!="NONE":
out_file.end()
out_file.end()
+
+ def export_material(self, mat, out_file):
+ cm = self.colormap
+ if any((s and s.use_map_color_diffuse) for s in mat.texture_slots):
+ out_file.write("diffuse", 1.0, 1.0, 1.0, 1.0)
+ amb = cm(mat.ambient)
+ out_file.write("ambient", amb, amb, amb, 1.0)
+ else:
+ diff = mat.diffuse_color*mat.diffuse_intensity
+ out_file.write("diffuse", cm(diff.r), cm(diff.g), cm(diff.b), 1.0)
+ amb = diff*mat.ambient
+ out_file.write("ambient", cm(amb.r), cm(amb.g), cm(amb.b), 1.0)
+ spec = mat.specular_color*mat.specular_intensity
+ out_file.write("specular", spec.r, spec.g, spec.b, 1.0)
+ out_file.write("shininess", mat.specular_hardness);
Technique::InheritLoader::InheritLoader(Technique &t, Collection &c):
DataFile::CollectionObjectLoader<Technique>(t, &c)
{
+ add("material", &InheritLoader::material);
add("texture", &InheritLoader::texture);
}
-void Technique::InheritLoader::texture(const std::string &slot, const string &name)
+void Technique::InheritLoader::material(const string &pass_tag, const string &name)
+{
+ RenderPass &pass = get_item(obj.passes, pass_tag);
+ const Material &mat = get_collection().get<Material>(name);
+ if(const Material *base_mat = pass.get_material())
+ {
+ for(PassMap::iterator i=obj.passes.begin(); i!=obj.passes.end(); ++i)
+ if(i->second.get_material()==base_mat)
+ i->second.set_material(&mat);
+ }
+ else
+ pass.set_material(&mat);
+}
+
+void Technique::InheritLoader::texture(const string &slot, const string &name)
{
Texture &tex = get_collection().get<Texture>(name);
for(PassMap::iterator i=obj.passes.begin(); i!=obj.passes.end(); ++i)