[Bf-extensions-cvs] [8ec82c7] master: Fix Povray 'new' df3 smoke handling.

Bastien Montagne noreply at git.blender.org
Sat Apr 4 00:02:01 CEST 2015


Commit: 8ec82c7a976fc13bdb9dae3c84ac58e13e01a8b9
Author: Bastien Montagne
Date:   Fri Apr 3 23:59:28 2015 +0200
Branches: master
https://developer.blender.org/rBA8ec82c7a976fc13bdb9dae3c84ac58e13e01a8b9

Fix Povray 'new' df3 smoke handling.

The tricky part here is that to read correctly df3 data, we need to have a unit box,
and can only transform it to match Blender's domain's bbox *after* df3 is read.

===================================================================

M	render_povray/render.py

===================================================================

diff --git a/render_povray/render.py b/render_povray/render.py
index e1929c3..428f667 100644
--- a/render_povray/render.py
+++ b/render_povray/render.py
@@ -1472,25 +1472,23 @@ def write_pov(filename, scene=None, info_callback=None):
                         #	        	LuxLog('Binary SMOKE file written: %s' % (smoke_path))
 
         #return big_res[0], big_res[1], big_res[2], channeldata
-       
+
                 mydf3 = df3.df3(big_res[0],big_res[1],big_res[2])
-                for x in range(mydf3.sizeX()):
-                    for y in range(mydf3.sizeY()):
-                        for z in range(mydf3.sizeZ()):
-                            mydf3.set(x, y, z, channeldata[((z*mydf3.sizeY()+y)*mydf3.sizeX()+x)]) 
+                sim_sizeX, sim_sizeY, sim_sizeZ = mydf3.size()
+                for x in range(sim_sizeX):
+                    for y in range(sim_sizeY):
+                        for z in range(sim_sizeZ):
+                            mydf3.set(x, y, z, channeldata[((z * sim_sizeY + y) * sim_sizeX + x)])
 
                 mydf3.exportDF3(smokePath)
                 print('Binary smoke.df3 file written in preview directory')
                 if comments:
                     file.write("\n//--Smoke--\n\n")
 
-                # media container shape = blender domain
-                bbox = smoke_obj.bound_box
-                # Domain is cubic and its dimension is always the biggest
-                dim = [smoke_obj.dimensions.x, smoke_obj.dimensions.y, smoke_obj.dimensions.z]
-                domdim = sorted(dim)[-1]
-                file.write("box{<%.4g,%.4g,%.4g>, <%.4g, %.4g, %.4g>\n"% \
-                            (bbox[0][0], bbox[0][1], bbox[0][2], bbox[6][0], bbox[6][1], bbox[6][2]))
+                # Note: We start with a default unit cube.
+                #       This is mandatory to read correctly df3 data - otherwise we could just directly use bbox
+                #       coordinates from the start, and avoid scale/translate operations at the end...
+                file.write("box{<0,0,0>, <1,1,1>\n")
                 file.write("    pigment{ rgbt 1 }\n")
                 file.write("    hollow\n")
                 file.write("    interior{ //---------------------\n")
@@ -1512,10 +1510,26 @@ def write_pov(filename, scene=None, info_callback=None):
                 file.write("               samples %i // higher = more precise\n" % resolution)
                 file.write("         } // end of media --------------------------\n")
                 file.write("    } // end of interior\n")
-                file.write("scale<%.4g,%.4g,%.4g>\n" % \
-                            (domdim, domdim, domdim))               
-                file.write("translate<%.4g,%.4g,%.4g>\n" % (bbox[0][0], bbox[0][1], bbox[0][2]))
+
+                # START OF TRANSFORMATIONS
+
+                # Size to consider here are bbox dimensions (i.e. still in object space, *before* applying
+                # loc/rot/scale and other transformations (like parent stuff), aka matrix_world).
+                bbox = smoke_obj.bound_box
+                dim = [abs(bbox[6][0] - bbox[0][0]), abs(bbox[6][1] - bbox[0][1]), abs(bbox[6][2] - bbox[0][2])]
+
+                # We scale our cube to get its final size and shapes but still in *object* space (same as Blender's bbox).
+                file.write("scale<%.6g,%.6g,%.6g>\n" % (dim[0], dim[1], dim[2]))
+
+                # We offset our cube such that (0,0,0) coordinate matches Blender's object center.
+                file.write("translate<%.6g,%.6g,%.6g>\n" % (bbox[0][0], bbox[0][1], bbox[0][2]))
+
+                # We apply object's transformations to get final loc/rot/size in world space!
+                # Note: we could combine the two previous transformations with this matrix directly...
                 writeMatrix(global_matrix * smoke_obj.matrix_world)
+
+                # END OF TRANSFORMATIONS
+
                 file.write("}\n")



More information about the Bf-extensions-cvs mailing list