[Bf-extensions-cvs] [e128281] master: Added DF3 library to allow later volumetric import/export like smoke

Maurice Raybaud noreply at git.blender.org
Wed Feb 18 19:01:19 CET 2015


Commit: e12828164ea9982da1dab67d991c1a3b7eb74d47
Author: Maurice Raybaud
Date:   Fri Feb 6 10:13:14 2015 +0100
Branches: master
https://developer.blender.org/rBAe12828164ea9982da1dab67d991c1a3b7eb74d47

Added DF3 library to allow later volumetric import/export like smoke

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

A	render_povray/df3.py
M	render_povray/render.py

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

diff --git a/render_povray/df3.py b/render_povray/df3.py
new file mode 100644
index 0000000..60b6e72
--- /dev/null
+++ b/render_povray/df3.py
@@ -0,0 +1,389 @@
+################################################################################
+#
+# df3.py
+#
+# Copyright (C) 2005 Mike Kost <contact at povray.tashcorp.net>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+#
+################################################################################
+#
+# Creation functions
+#     __init__(x=1, y=1, z=1) : default constructor
+#     clone(indf3) : make this df3 look like indf3
+#
+# Info functions
+#     sizeX(): returns X dimention
+#     sizeY(): returns Y dimention
+#     sizeZ(): returns Z dimention
+#
+# Scalar functions
+#     mult():
+#     add():
+#     max(): returns highest voxel value in df3
+#     min(): returns lowest voxel value in df3
+#
+# Vector functions
+#
+# Import/Export functions
+#     exportDF3():
+#     importDF3():
+#
+################################################################################
+
+import struct
+import os
+import stat
+import array
+import sys
+
+# -+-+-+- Start df3 Class -+-+-+-
+
+class df3:
+    __version__ = '0.2'
+
+    __arraytype__ = 'f'
+
+    __struct4byte__  = '>I'
+    __struct2byte__  = '>H'
+    __struct2byte3__ = '>HHH'
+    __struct1byte__  = '>B'
+    __array4byte__   = 'I'
+    __array2byte__   = 'H'
+    __array1byte__   = 'B'
+
+    def __init__(self, x=1, y=1, z=1):
+        self.maxX = x
+        self.maxY = y
+        self.maxZ = z
+        self.voxel = self.__create__(x, y, z)
+
+    def clone(self, indf3):
+        self.voxel = array.array(self.__arraytype__)
+        for i in range(indf3.sizeX()*indf3.sizeY()*indf3.sizeZ()):
+            self.voxel[i] = indf3.voxel[i]
+        return self
+
+    #### Info Functions
+
+    def sizeX(self):
+        return self.maxX
+
+    def sizeY(self):
+        return self.maxY
+
+    def sizeZ(self):
+        return self.maxZ
+
+    def size(self):
+        tmp = []
+        tmp.append(self.sizeX())
+        tmp.append(self.sizeY())
+        tmp.append(self.sizeZ())
+        return tmp
+
+    #### Voxel Access Functions
+
+    def get(self, x, y, z):
+        return self.voxel[self.__voxa__(x,y,z)]
+
+    def getB(self, x, y, z):
+        if (x > self.sizeX() or x < 0): return 0
+        if (y > self.sizeX() or y < 0): return 0
+        if (z > self.sizeX() or z < 0): return 0
+
+        return self.voxel[self.__voxa__(x,y,z)]
+
+    def set(self, x, y, z, val):
+        self.voxel[self.__voxa__(x,y,z)] = val
+
+    def setB(self, x, y, z, val):
+        if (x > self.sizeX() or x < 0): return
+        if (y > self.sizeX() or y < 0): return
+        if (z > self.sizeX() or z < 0): return
+
+        self.voxel[self.__voxa__(x,y,z)] = val
+
+    #### Scalar Functions
+
+    def mult(self, val):
+        for i in range(self.sizeX()*self.sizeY()*self.sizeZ()):
+            self.voxel[i] = self.voxel[i] * val
+
+        return self
+
+    def add(self, val):
+        for i in range(self.sizeX()*self.sizeY()*self.sizeZ()):
+            self.voxel[i] = self.voxel[i] + val
+
+        return self
+
+    def max(self):
+        tmp = self.voxel[0]
+
+        for i in range(self.sizeX()*self.sizeY()*self.sizeZ()):
+            if (self.voxel[i] > tmp):
+                tmp = self.voxel[i]
+
+        return tmp
+
+    def min(self):
+        tmp = self.voxel[0]
+
+        for i in range(self.sizeX()*self.sizeY()*self.sizeZ()):
+            if (self.voxel[i] < tmp):
+                tmp = self.voxel[i]
+
+        return tmp
+
+    #### Vector Functions
+
+    def compare(self, indf3):
+        if (self.__samesize__(indf3) == 0): return 0
+
+        if (self.voxel == indf3.voxel):
+            return 1
+
+        return 0
+
+    def multV(self, indf3):
+        if (self.__samesize__(indf3) == 0):
+            print("Cannot multiply voxels - not same size")
+            return
+
+        for i in range(self.sizeX()*self.sizeY()*self.sizeZ()):
+            self.voxel[i] = self.voxel[i]*indf3.voxel[i]
+
+        return self
+
+    def addV(self, indf3):
+        if (self.__samesize__(indf3) == 0):
+            print("Cannot add voxels - not same size")
+            return
+
+        for i in range(self.sizeX()*self.sizeY()*self.sizeZ()):
+            self.voxel[i] = self.voxel[i]+indf3.voxel[i]
+
+        return self
+
+    def convolveV(self, filt):
+        fx = filt.sizeX()
+        fy = filt.sizeY()
+        fz = filt.sizeZ()
+        if (fx % 2 != 1):
+            print("Incompatible filter - must be odd number of X")
+            return self
+        if (fy % 2 != 1):
+            print("Incompatible filter - must be odd number of Y")
+            return self
+        if (fz % 2 != 1):
+            print("Incompatible filter - must be odd number of Z")
+            return self
+
+        fdx = (fx-1)/2
+        fdy = (fy-1)/2
+        fdz = (fz-1)/2
+        flen = fx*fy*fz
+
+        newV = self.__create__(self.sizeX(), self.sizeY(), self.sizeZ());
+
+        for x in range(self.sizeX()):
+            for y in range(self.sizeY()):
+                for z in range(self.sizeZ()):
+                    rip = self.__rip__(x-fdx, x+fdx, y-fdy, y+fdy, z-fdz, z+fdz)
+                    tmp = 0.0
+                    for i in range(flen):
+                        tmp += rip[i]*filt.voxel[i]
+                    newV[self.__voxa__(x,y,z)] = tmp
+
+        self.voxel = newV
+
+        return self
+
+    #### Import/Export Functions
+
+    def exportDF3(self, file, depth=8, rescale=1):
+        x = self.sizeX()
+        y = self.sizeY()
+        z = self.sizeZ()
+
+        try:
+            f = open(file, 'wb');
+        except:
+            print("Could not open " + file + " for write");
+            return
+
+        f.write(struct.pack(self.__struct2byte3__, x, y, z));
+
+        tmp = self.__toInteger__(pow(2,depth)-1, rescale)
+
+        if (depth > 16): # 32-bit
+            for i in range( x*y*z ):
+                f.write(struct.pack(self.__struct4byte__, tmp[i]))
+        elif (depth > 8): # 16-bit
+            for i in range( x*y*z ):
+                f.write(struct.pack(self.__struct2byte__, tmp[i]))
+        else:
+            for i in range( x*y*z ):
+                f.write(struct.pack(self.__struct1byte__, tmp[i]))
+
+    def importDF3(self, file, scale=1):
+        try:
+            f = open(file, 'rb');
+            size = os.stat(file)[stat.ST_SIZE]
+
+        except:
+            print("Could not open " + file + " for read");
+            return []
+
+        (x, y, z) = struct.unpack(self.__struct2byte3__, f.read(6) )
+
+        self.voxel = self.__create__(x, y, z)
+        self.maxX = x
+        self.maxY = y
+        self.maxZ = z
+
+        size = size-6
+        if (size == x*y*z):     format = 8
+        elif (size == 2*x*y*z): format = 16
+        elif (size == 4*x*y*z): format = 32
+
+        if (format == 32):
+            for i in range(x*y*z):
+                self.voxel[i] = float(struct.unpack(self.__struct4byte__, f.read(4) )[0])
+        elif (format == 16):
+            for i in range(x*y*z):
+                self.voxel[i] = float(struct.unpack(self.__struct2byte__, f.read(2) )[0])
+        elif (format == 8):
+            for i in range(x*y*z):
+                self.voxel[i] = float(struct.unpack(self.__struct1byte__, f.read(1) )[0])
+
+        return self
+
+    #### Local classes not intended for user use
+
+    def __rip__(self, minX, maxX, minY, maxY, minZ, maxZ):
+        sizeX = maxX-minX+1
+        sizeY = maxY-minY+1
+        sizeZ = maxZ-minZ+1
+
+        tmpV = self.__create__(sizeX, sizeY, sizeZ)
+
+        for x in range(sizeX):
+            for y in range(sizeY):
+                for z in range(sizeZ):
+                    # Check X
+                    if ((minX + x) < 0):
+                        tmpV[(z*sizeZ+y)*sizeY+x] = 0.0
+                    elif ((minX + x) > self.sizeX()-1):
+                        tmpV[(z*sizeZ+y)*sizeY+x] = 0.0
+                    # Check Y
+                    elif ((minY + y) < 0):
+                        tmpV[(z*sizeZ+y)*sizeY+x] = 0.0
+                    elif ((minY + y) > self.sizeY()-1):
+                        tmpV[(z*sizeZ+y)*sizeY+x] = 0.0
+                    # Check Z
+                    elif ((minZ + z) < 0):
+                        tmpV[(z*sizeZ+y)*sizeY+x] = 0.0
+                    elif ((minZ + z) > self.sizeZ()-1):
+                        tmpV[(z*sizeZ+y)*sizeY+x] = 0.0
+                    else:
+                        tmpV[(z*sizeZ+y)*sizeY+x] = self.get(minX+x,minY+y,minZ+z)
+
+        return tmpV
+
+    def __samesize__(self, indf3):
+        if (self.sizeX() != indf3.sizeX()): return 0
+        if (self.sizeY() != indf3.sizeY()): return 0
+        if (self.sizeZ() != indf3.sizeZ()): return 0
+        return 1
+
+    def __voxa__(self, x, y, z):
+        return ((z*self.sizeY()+y)*self.sizeX()+x)
+
+    def __create__(self, x, y, z, atype='0', init=1):
+        if (atype == '0'):
+            tmp = self.__arraytype__
+        else:
+            tmp = atype
+
+        if (init == 1):
+            if tmp in ('f','d'):
+                voxel = array.array(tmp, [0.0 for i in range(x*y*z)])
+            else:
+                voxel = array.array(tmp, [0 for i in range(x*y*z)])
+        else:
+            voxel = array.array(tmp)
+
+        return voxel
+
+    def __toInteger__(self, scale, rescale=1):
+        if (scale < pow(2,8)): # 8-bit
+            tmp = self.__create__(s

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list