diff --git a/psychoblend/assembly.py b/psychoblend/assembly.py index aecb954..429450b 100644 --- a/psychoblend/assembly.py +++ b/psychoblend/assembly.py @@ -1,6 +1,6 @@ import bpy -from .util import escape_name, mat2str, needs_def_mb, needs_xform_mb, ExportCancelled +from .util import escape_name, mat2str, color2str, psycolor2str, needs_def_mb, needs_xform_mb, ExportCancelled class Assembly: def __init__(self, render_engine, objects, visible_layers, group_prefix="", translation_offset=(0,0,0)): @@ -180,21 +180,21 @@ class Mesh: # Write vertices and (if it's smooth shaded) normals for ti in range(len(self.time_meshes)): w.write("Vertices [") - w.write(" ".join([("%f" % i) for vert in self.time_meshes[ti].vertices for i in vert.co]), False) + w.write(" ".join(["{:.6} {:.6} {:.6}".format(vert.co[0], vert.co[1], vert.co[2]) for vert in self.time_meshes[ti].vertices]), False) w.write("]\n", False) if self.time_meshes[0].polygons[0].use_smooth and self.ob.data.psychopath.is_subdivision_surface == False: w.write("Normals [") - w.write(" ".join([("%f" % i) for vert in self.time_meshes[ti].vertices for i in vert.normal]), False) + w.write(" ".join(["{:.6} {:.6} {:.6}".format(vert.normal[0], vert.normal[1], vert.normal[2]) for vert in self.time_meshes[ti].vertices]), False) w.write("]\n", False) # Write face vertex counts w.write("FaceVertCounts [") - w.write(" ".join([("%d" % len(p.vertices)) for p in self.time_meshes[0].polygons]), False) + w.write(" ".join(["{}".format(len(p.vertices)) for p in self.time_meshes[0].polygons]), False) w.write("]\n", False) # Write face vertex indices w.write("FaceVertIndices [") - w.write(" ".join([("%d"%v) for p in self.time_meshes[0].polygons for v in p.vertices]), False) + w.write(" ".join(["{}".format(v) for p in self.time_meshes[0].polygons for v in p.vertices]), False) w.write("]\n", False) # MeshSurface/SubdivisionSurface section end @@ -232,14 +232,9 @@ class SphereLamp: w.write("SphereLight $%s {\n" % self.name) w.indent() for col in self.time_col: - if col[0] == 'Rec709': - w.write("Color [rec709, %f %f %f]\n" % (col[1][0], col[1][1], col[1][2])) - elif col[0] == 'Blackbody': - w.write("Color [blackbody, %f %f]\n" % (col[1], col[2])) - elif col[0] == 'ColorTemperature': - w.write("Color [color_temperature, %f %f]\n" % (col[1], col[2])) + w.write(color2str(col[0], col[1]) + "\n") for rad in self.time_rad: - w.write("Radius [%f]\n" % rad) + w.write("Radius [{:.6}]\n".format(rad)) w.unindent() w.write("}\n") @@ -278,14 +273,9 @@ class RectLamp: w.write("RectangleLight $%s {\n" % self.name) w.indent() for col in self.time_col: - if col[0] == 'Rec709': - w.write("Color [rec709, %f %f %f]\n" % (col[1][0], col[1][1], col[1][2])) - elif col[0] == 'Blackbody': - w.write("Color [blackbody, %f %f]\n" % (col[1], col[2])) - elif col[0] == 'ColorTemperature': - w.write("Color [color_temperature, %f %f]\n" % (col[1], col[2])) + w.write(color2str(col[0], col[1]) + "\n") for dim in self.time_dim: - w.write("Dimensions [%f %f]\n" % dim) + w.write("Dimensions [{:.6} {:.6}]\n".format(dim[0], dim[1])) w.unindent() w.write("}\n") @@ -338,57 +328,15 @@ class Material: w.indent() if self.mat.psychopath.surface_shader_type == 'Emit': w.write("Type [Emit]\n") - if self.mat.psychopath.color_type == 'Rec709': - col = self.mat.psychopath.color - w.write("Color [rec709, %f %f %f]\n" % ( - col[0], col[1], col[2], - )) - elif self.mat.psychopath.color_type == 'Blackbody': - w.write("Color [blackbody, %f %f]\n" % ( - self.mat.psychopath.color_blackbody_temp, - 1.0, - )) - elif self.mat.psychopath.color_type == 'ColorTemperature': - w.write("Color [color_temperature, %f %f]\n" % ( - self.mat.psychopath.color_blackbody_temp, - 1.0, - )) + w.write(psycolor2str(self.mat.psychopath) + "\n") elif self.mat.psychopath.surface_shader_type == 'Lambert': w.write("Type [Lambert]\n") - if self.mat.psychopath.color_type == 'Rec709': - col = self.mat.psychopath.color - w.write("Color [rec709, %f %f %f]\n" % ( - col[0], col[1], col[2], - )) - elif self.mat.psychopath.color_type == 'Blackbody': - w.write("Color [blackbody, %f %f]\n" % ( - self.mat.psychopath.color_blackbody_temp, - 1.0, - )) - elif self.mat.psychopath.color_type == 'ColorTemperature': - w.write("Color [color_temperature, %f %f]\n" % ( - self.mat.psychopath.color_blackbody_temp, - 1.0, - )) + w.write(psycolor2str(self.mat.psychopath) + "\n") elif self.mat.psychopath.surface_shader_type == 'GGX': w.write("Type [GGX]\n") - if self.mat.psychopath.color_type == 'Rec709': - col = self.mat.psychopath.color - w.write("Color [rec709, %f %f %f]\n" % ( - col[0], col[1], col[2], - )) - elif self.mat.psychopath.color_type == 'Blackbody': - w.write("Color [blackbody, %f %f]\n" % ( - self.mat.psychopath.color_blackbody_temp, - 1.0, - )) - elif self.mat.psychopath.color_type == 'ColorTemperature': - w.write("Color [color_temperature, %f %f]\n" % ( - self.mat.psychopath.color_blackbody_temp, - 1.0, - )) - w.write("Roughness [%f]\n" % self.mat.psychopath.roughness) - w.write("Fresnel [%f]\n" % self.mat.psychopath.fresnel) + w.write(psycolor2str(self.mat.psychopath) + "\n") + w.write("Roughness [{:.6}]\n".format(self.mat.psychopath.roughness)) + w.write("Fresnel [{:.6}]\n".format(self.mat.psychopath.fresnel)) else: raise "Unsupported surface shader type '%s'" % self.mat.psychopath.surface_shader_type w.unindent() diff --git a/psychoblend/psy_export.py b/psychoblend/psy_export.py index 65a7cc7..744cf0c 100644 --- a/psychoblend/psy_export.py +++ b/psychoblend/psy_export.py @@ -96,7 +96,7 @@ class PsychoExporter: res_y = int(self.scene.render.resolution_y * (self.scene.render.resolution_percentage / 100)) self.w.write('Resolution [%d %d]\n' % (res_x, res_y)) self.w.write("SamplesPerPixel [%d]\n" % self.scene.psychopath.spp) - self.w.write("DicingRate [%f]\n" % self.scene.psychopath.dicing_rate) + self.w.write("DicingRate [{:.6}]\n".format(self.scene.psychopath.dicing_rate)) self.w.write('Seed [%d]\n' % self.fr) # RenderSettings section end diff --git a/psychoblend/util.py b/psychoblend/util.py index e51a430..6a98ced 100644 --- a/psychoblend/util.py +++ b/psychoblend/util.py @@ -11,10 +11,41 @@ def mat2str(m): s = "" for j in range(4): for i in range(4): - s += (" %f" % m[i][j]) + s += " {:.6}".format(m[i][j]) return s[1:] +def color2str(color_type, color_data): + if color_type == 'Rec709': + return "Color [rec709, {:.6} {:.6} {:.6}]".format( + color_data[0], + color_data[1], + color_data[2], + ) + elif color_type == 'Blackbody': + return "Color [blackbody, {:.6} {:.6}]".format( + color_data[0], + color_data[1], + ) + elif color_type == 'ColorTemperature': + return "Color [color_temperature, {:.6} {:.6}]".format( + color_data[0], + color_data[1], + ) + + +def psycolor2str(psymat): + color_type = psymat.color_type + color_data = psymat.color + + if color_type == 'Blackbody' or color_type == 'ColorTemperature': + # TODO: add the brightness multiplier to the Psychoblend material + # settings. Here we're just defaulting it to 1.0. + color_data = [psymat.color_blackbody_temp, 1.0] + + return color2str(color_type, color_data) + + def needs_def_mb(ob): """ Determines if the given object needs to be exported with deformation motion blur or not. diff --git a/psychoblend/world.py b/psychoblend/world.py index c886fa4..7a994ee 100644 --- a/psychoblend/world.py +++ b/psychoblend/world.py @@ -3,7 +3,7 @@ import bpy from math import degrees, tan, atan from mathutils import Vector, Matrix -from .util import escape_name, mat2str, ExportCancelled +from .util import escape_name, color2str, mat2str, ExportCancelled class World: def __init__(self, render_engine, scene, visible_layers, aspect_ratio): @@ -90,16 +90,16 @@ class Camera: w.indent() for fov in self.fovs: - w.write("Fov [%f]\n" % fov) + w.write("Fov [{:.6}]\n".format(fov)) for rad in self.aperture_radii: - w.write("ApertureRadius [%f]\n" % rad) + w.write("ApertureRadius [{:.6}]\n".format(rad)) for dist in self.focal_distances: - w.write("FocalDistance [%f]\n" % dist) + w.write("FocalDistance [{:.6}]\n".format(dist)) for mat in self.xforms: - w.write("Transform [%s]\n" % mat2str(mat)) + w.write("Transform [{}]\n".format(mat2str(mat))) w.unindent() w.write("}\n") @@ -116,7 +116,7 @@ class BackgroundShader: w.write("BackgroundShader {\n") w.indent(); w.write("Type [Color]\n") - w.write("Color [rec709, %f %f %f]\n" % self.color) + w.write("Color [rec709, {:.6} {:.6} {:.6}]\n".format(self.color[0], self.color[1], self.color[2])) w.unindent() w.write("}\n") @@ -147,16 +147,11 @@ class DistantDiskLamp: w.write("DistantDiskLight $%s {\n" % self.name) w.indent() for direc in self.time_dir: - w.write("Direction [%f %f %f]\n" % (direc[0], direc[1], direc[2])) + w.write("Direction [{:.6} {:.6} {:.6}]\n".format(direc[0], direc[1], direc[2])) for col in self.time_col: - if col[0] == 'Rec709': - w.write("Color [rec709, %f %f %f]\n" % (col[1][0], col[1][1], col[1][2])) - elif col[0] == 'Blackbody': - w.write("Color [blackbody, %f %f]\n" % (col[1], col[2])) - elif col[0] == 'ColorTemperature': - w.write("Color [color_temperature, %f %f]\n" % (col[1], col[2])) + w.write(color2str(col[0], col[1]) + "\n") for rad in self.time_rad: - w.write("Radius [%f]\n" % rad) + w.write("Radius [{:.6}]\n".format(rad)) w.unindent() w.write("}\n")