[yt-svn] commit/yt: 5 new changesets

commits-noreply at bitbucket.org commits-noreply at bitbucket.org
Thu Nov 20 18:00:20 PST 2014


5 new commits in yt:

https://bitbucket.org/yt_analysis/yt/commits/bc0786a53ad4/
Changeset:   bc0786a53ad4
Branch:      yt
User:        jisuoqing
Date:        2014-11-09 10:53:04+00:00
Summary:     Add Spherical Camera
Affected #:  2 files

diff -r 9153a5a32dce19164cc66f8073a26d460aa74cbe -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 yt/visualization/volume_rendering/api.py
--- a/yt/visualization/volume_rendering/api.py
+++ b/yt/visualization/volume_rendering/api.py
@@ -22,6 +22,7 @@
 
 from .camera import Camera, PerspectiveCamera, StereoPairCamera, \
     off_axis_projection, FisheyeCamera, MosaicFisheyeCamera, \
-    HEALpixCamera, InteractiveCamera, ProjectionCamera
+    HEALpixCamera, InteractiveCamera, ProjectionCamera, \
+    SphericalCamera
 
 from .transfer_function_helper import TransferFunctionHelper

diff -r 9153a5a32dce19164cc66f8073a26d460aa74cbe -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2342,6 +2342,74 @@
 
 data_object_registry["projection_camera"] = ProjectionCamera
 
+class SphericalCamera(Camera):
+    #expand_factor = 1.0
+    def __init__(self, *args, **kwargs):
+    #    self.expand_factor = kwargs.pop('expand_factor', 1.0)
+        Camera.__init__(self, *args, **kwargs)
+
+    def get_sampler_args(self, image):
+
+        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
+        py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=True)[None,:]
+
+        vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
+        vectors[:,:,0] = np.cos(px) * np.cos(py)
+        vectors[:,:,1] = np.sin(px) * np.cos(py)
+        vectors[:,:,2] = np.sin(py)
+
+        vectors = vectors * self.width[0]
+        positions = self.center + vectors * 0
+
+        R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
+        R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
+        uv = np.dot(R1, self.orienter.unit_vectors)
+        uv = np.dot(R2, uv)
+
+        vectors.reshape((self.resolution[0]*self.resolution[1], 3))
+        vectors = np.dot(vectors, uv)
+        vectors.reshape((self.resolution[0], self.resolution[1], 3))
+
+        dummy = np.ones(3, dtype='float64')
+        image.shape = (self.resolution[0]*self.resolution[1],1,4)
+        vectors.shape = (self.resolution[0]*self.resolution[1],1,3)
+        positions.shape = (self.resolution[0]*self.resolution[1],1,3)
+        args = (positions, vectors, self.back_center,
+                (0.0,1.0,0.0,1.0),
+                image, dummy, dummy,
+                np.zeros(3, dtype='float64'),
+                self.transfer_function, self.sub_samples)
+        return args
+
+    def _render(self, double_check, num_threads, image, sampler):
+        pbar = get_pbar("Ray casting", (self.volume.brick_dimensions + 1).prod(axis=-1).sum())
+        total_cells = 0
+        if double_check:
+            for brick in self.volume.bricks:
+                for data in brick.my_data:
+                    if np.any(np.isnan(data)):
+                        raise RuntimeError
+
+        for brick in self.volume.traverse(self.front_center):
+            sampler(brick, num_threads=num_threads)
+            total_cells += np.prod(brick.my_data[0].shape)
+            pbar.update(total_cells)
+
+        pbar.finish()
+        image = self.finalize_image(sampler.aimage)
+        return image
+
+    def finalize_image(self, image):
+        view_pos = self.front_center
+        image.shape = self.resolution[0], self.resolution[1], 4
+        image = self.volume.reduce_tree_images(image, view_pos)
+        if self.transfer_function.grey_opacity is False:
+            image[:,:,3]=1.0
+        image = image[1:-1,1:-1,:]
+        return image
+
+data_object_registry["spherical_camera"] = SphericalCamera
+
 def off_axis_projection(ds, center, normal_vector, width, resolution,
                         field, weight = None, 
                         volume = None, no_ghost = False, interpolated = False,


https://bitbucket.org/yt_analysis/yt/commits/ce2427e6817b/
Changeset:   ce2427e6817b
Branch:      yt
User:        jisuoqing
Date:        2014-11-09 23:24:34+00:00
Summary:     Add StereoSphericalCamera
Affected #:  2 files

diff -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 -r ce2427e6817bf1164d77a631897e1b5bf67c56d1 yt/visualization/volume_rendering/api.py
--- a/yt/visualization/volume_rendering/api.py
+++ b/yt/visualization/volume_rendering/api.py
@@ -23,6 +23,6 @@
 from .camera import Camera, PerspectiveCamera, StereoPairCamera, \
     off_axis_projection, FisheyeCamera, MosaicFisheyeCamera, \
     HEALpixCamera, InteractiveCamera, ProjectionCamera, \
-    SphericalCamera
+    SphericalCamera, StereoSphericalCamera
 
 from .transfer_function_helper import TransferFunctionHelper

diff -r bc0786a53ad4d9590990aa30cc5cbcafbeebb767 -r ce2427e6817bf1164d77a631897e1b5bf67c56d1 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2343,15 +2343,15 @@
 data_object_registry["projection_camera"] = ProjectionCamera
 
 class SphericalCamera(Camera):
-    #expand_factor = 1.0
     def __init__(self, *args, **kwargs):
-    #    self.expand_factor = kwargs.pop('expand_factor', 1.0)
         Camera.__init__(self, *args, **kwargs)
+        if(self.resolution[0]/self.resolution[1] != 2):
+            mylog.info('Warning: It\'s recommended to set the aspect ratio to 2:1')
 
     def get_sampler_args(self, image):
 
-        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
-        py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=True)[None,:]
+        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=False)[:,None]
+        py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[None,:]
 
         vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
         vectors[:,:,0] = np.cos(px) * np.cos(py)
@@ -2382,7 +2382,8 @@
         return args
 
     def _render(self, double_check, num_threads, image, sampler):
-        pbar = get_pbar("Ray casting", (self.volume.brick_dimensions + 1).prod(axis=-1).sum())
+        ncells = sum(b.source_mask.size for b in self.volume.bricks)
+        pbar = get_pbar("Ray casting", ncells)
         total_cells = 0
         if double_check:
             for brick in self.volume.bricks:
@@ -2392,7 +2393,7 @@
 
         for brick in self.volume.traverse(self.front_center):
             sampler(brick, num_threads=num_threads)
-            total_cells += np.prod(brick.my_data[0].shape)
+            total_cells += brick.source_mask.size
             pbar.update(total_cells)
 
         pbar.finish()
@@ -2405,11 +2406,113 @@
         image = self.volume.reduce_tree_images(image, view_pos)
         if self.transfer_function.grey_opacity is False:
             image[:,:,3]=1.0
-        image = image[1:-1,1:-1,:]
         return image
 
 data_object_registry["spherical_camera"] = SphericalCamera
 
+class StereoSphericalCamera(Camera):
+    def __init__(self, *args, **kwargs):
+        self.disparity = kwargs.pop('disparity', 0.)
+        Camera.__init__(self, *args, **kwargs)
+	self.disparity = self.ds.arr(self.disparity, input_units="code_length")
+        self.disparity_s = self.ds.arr(0., input_units="code_length")
+        if(self.resolution[0]/self.resolution[1] != 2):
+            mylog.info('Warning: It\'s recommended to set the aspect ratio to be 2:1')
+        if(self.disparity<=0.):
+            self.disparity = self.width[0]/1000.
+            mylog.info('Warning: Invalid value of disparity; now reset it to %f' % self.disparity)
+
+    def get_sampler_args(self, image):
+
+        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=False)[:,None]
+        py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[None,:]
+
+        vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
+        vectors[:,:,0] = np.cos(px) * np.cos(py)
+        vectors[:,:,1] = np.sin(px) * np.cos(py)
+        vectors[:,:,2] = np.sin(py)
+        vectors2 = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
+        vectors2[:,:,0] = -np.sin(px) * np.ones((1, self.resolution[1]))
+        vectors2[:,:,1] = np.cos(px) * np.ones((1, self.resolution[1]))
+        vectors2[:,:,2] = 0
+
+        positions = self.center + vectors2 * self.disparity_s
+        vectors = vectors * self.width[0]
+
+        R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
+        R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
+        uv = np.dot(R1, self.orienter.unit_vectors)
+        uv = np.dot(R2, uv)
+
+        vectors.reshape((self.resolution[0]*self.resolution[1], 3))
+        vectors = np.dot(vectors, uv)
+        vectors.reshape((self.resolution[0], self.resolution[1], 3))
+
+        dummy = np.ones(3, dtype='float64')
+        image.shape = (self.resolution[0]*self.resolution[1],1,4)
+        vectors.shape = (self.resolution[0]*self.resolution[1],1,3)
+        positions.shape = (self.resolution[0]*self.resolution[1],1,3)
+        args = (positions, vectors, self.back_center,
+                (0.0,1.0,0.0,1.0),
+                image, dummy, dummy,
+                np.zeros(3, dtype='float64'),
+                self.transfer_function, self.sub_samples)
+        return args
+
+    def snapshot(self, fn = None, clip_ratio = None, double_check = False,
+                 num_threads = 0, transparent=False):
+        
+        if num_threads is None:
+            num_threads=get_num_threads()
+
+        self.disparity_s = self.disparity
+        image1 = self.new_image()
+        args1 = self.get_sampler_args(image1)
+        sampler1 = self.get_sampler(args1)
+        self.initialize_source()
+        image1 = self._render(double_check, num_threads,
+                              image1, sampler1, '(Left)')
+
+        self.disparity_s = -self.disparity
+        image2 = self.new_image()
+        args2 = self.get_sampler_args(image2)
+        sampler2 = self.get_sampler(args2)
+        self.initialize_source()
+        image2 = self._render(double_check, num_threads,
+                              image2, sampler2, '(Right)')
+
+        image = np.hstack([image1, image2])
+        image = self.volume.reduce_tree_images(image, self.center)
+        image = ImageArray(image, info = self.get_information())
+        self.save_image(image, fn=fn, clip_ratio=clip_ratio,
+                        transparent=transparent)
+        return image
+
+    def _render(self, double_check, num_threads, image, sampler, msg):
+        ncells = sum(b.source_mask.size for b in self.volume.bricks)
+        pbar = get_pbar("Ray casting "+msg, ncells)
+        total_cells = 0
+        if double_check:
+            for brick in self.volume.bricks:
+                for data in brick.my_data:
+                    if np.any(np.isnan(data)):
+                        raise RuntimeError
+
+        for brick in self.volume.traverse(self.front_center):
+            sampler(brick, num_threads=num_threads)
+            total_cells += brick.source_mask.size 
+            pbar.update(total_cells)
+
+        pbar.finish()
+
+        image = sampler.aimage.copy()
+        image.shape = self.resolution[0], self.resolution[1], 4
+        if self.transfer_function.grey_opacity is False:
+            image[:,:,3]=1.0
+        return image
+
+data_object_registry["stereospherical_camera"] = StereoSphericalCamera
+
 def off_axis_projection(ds, center, normal_vector, width, resolution,
                         field, weight = None, 
                         volume = None, no_ghost = False, interpolated = False,


https://bitbucket.org/yt_analysis/yt/commits/1e45020f5e8c/
Changeset:   1e45020f5e8c
Branch:      yt
User:        jisuoqing
Date:        2014-11-10 03:43:24+00:00
Summary:     Last bug fix
Affected #:  1 file

diff -r ce2427e6817bf1164d77a631897e1b5bf67c56d1 -r 1e45020f5e8c9f02250e2dbcea59e6a9de71d9c5 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2347,11 +2347,12 @@
         Camera.__init__(self, *args, **kwargs)
         if(self.resolution[0]/self.resolution[1] != 2):
             mylog.info('Warning: It\'s recommended to set the aspect ratio to 2:1')
+        self.resolution = np.asarray(self.resolution)+2
 
     def get_sampler_args(self, image):
 
-        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=False)[:,None]
-        py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[None,:]
+        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
+        py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
 
         vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
         vectors[:,:,0] = np.cos(px) * np.cos(py)
@@ -2406,6 +2407,7 @@
         image = self.volume.reduce_tree_images(image, view_pos)
         if self.transfer_function.grey_opacity is False:
             image[:,:,3]=1.0
+        image = image[1:-1,1:-1,:]
         return image
 
 data_object_registry["spherical_camera"] = SphericalCamera
@@ -2418,14 +2420,15 @@
         self.disparity_s = self.ds.arr(0., input_units="code_length")
         if(self.resolution[0]/self.resolution[1] != 2):
             mylog.info('Warning: It\'s recommended to set the aspect ratio to be 2:1')
+        self.resolution = np.asarray(self.resolution)+2
         if(self.disparity<=0.):
             self.disparity = self.width[0]/1000.
             mylog.info('Warning: Invalid value of disparity; now reset it to %f' % self.disparity)
 
     def get_sampler_args(self, image):
 
-        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=False)[:,None]
-        py = np.linspace(-np.pi/2, np.pi/2., self.resolution[1], endpoint=False)[None,:]
+        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
+        py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
 
         vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
         vectors[:,:,0] = np.cos(px) * np.cos(py)
@@ -2471,7 +2474,7 @@
         sampler1 = self.get_sampler(args1)
         self.initialize_source()
         image1 = self._render(double_check, num_threads,
-                              image1, sampler1, '(Left)')
+                              image1, sampler1, '(Left) ')
 
         self.disparity_s = -self.disparity
         image2 = self.new_image()
@@ -2509,6 +2512,7 @@
         image.shape = self.resolution[0], self.resolution[1], 4
         if self.transfer_function.grey_opacity is False:
             image[:,:,3]=1.0
+        image = image[1:-1,1:-1,:]
         return image
 
 data_object_registry["stereospherical_camera"] = StereoSphericalCamera


https://bitbucket.org/yt_analysis/yt/commits/dd2edccd0fb2/
Changeset:   dd2edccd0fb2
Branch:      yt
User:        jisuoqing
Date:        2014-11-10 04:21:31+00:00
Summary:     Minor format fix
Affected #:  1 file

diff -r 1e45020f5e8c9f02250e2dbcea59e6a9de71d9c5 -r dd2edccd0fb218b4d6bba19e23e4f29a0d18ade9 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2347,26 +2347,24 @@
         Camera.__init__(self, *args, **kwargs)
         if(self.resolution[0]/self.resolution[1] != 2):
             mylog.info('Warning: It\'s recommended to set the aspect ratio to 2:1')
-        self.resolution = np.asarray(self.resolution)+2
+        self.resolution = np.asarray(self.resolution) + 2
 
     def get_sampler_args(self, image):
-
         px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
         py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
-
-        vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
+        
+        vectors = np.zeros((self.resolution[0], self.resolution[1], 3),
+                           dtype='float64', order='C')
         vectors[:,:,0] = np.cos(px) * np.cos(py)
         vectors[:,:,1] = np.sin(px) * np.cos(py)
         vectors[:,:,2] = np.sin(py)
 
         vectors = vectors * self.width[0]
         positions = self.center + vectors * 0
-
         R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
         R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
         uv = np.dot(R1, self.orienter.unit_vectors)
         uv = np.dot(R2, uv)
-
         vectors.reshape((self.resolution[0]*self.resolution[1], 3))
         vectors = np.dot(vectors, uv)
         vectors.reshape((self.resolution[0], self.resolution[1], 3))
@@ -2416,37 +2414,37 @@
     def __init__(self, *args, **kwargs):
         self.disparity = kwargs.pop('disparity', 0.)
         Camera.__init__(self, *args, **kwargs)
-	self.disparity = self.ds.arr(self.disparity, input_units="code_length")
+        self.disparity = self.ds.arr(self.disparity, input_units="code_length")
         self.disparity_s = self.ds.arr(0., input_units="code_length")
         if(self.resolution[0]/self.resolution[1] != 2):
             mylog.info('Warning: It\'s recommended to set the aspect ratio to be 2:1')
-        self.resolution = np.asarray(self.resolution)+2
+        self.resolution = np.asarray(self.resolution) + 2
         if(self.disparity<=0.):
             self.disparity = self.width[0]/1000.
-            mylog.info('Warning: Invalid value of disparity; now reset it to %f' % self.disparity)
+            mylog.info('Warning: Invalid value of disparity; ' \
+                       'now reset it to %f' % self.disparity)
 
     def get_sampler_args(self, image):
-
         px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
         py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
 
-        vectors = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
+        vectors = np.zeros((self.resolution[0], self.resolution[1], 3),
+                           dtype='float64', order='C')
         vectors[:,:,0] = np.cos(px) * np.cos(py)
         vectors[:,:,1] = np.sin(px) * np.cos(py)
         vectors[:,:,2] = np.sin(py)
-        vectors2 = np.zeros((self.resolution[0], self.resolution[1], 3), dtype='float64', order='C')
+        vectors2 = np.zeros((self.resolution[0], self.resolution[1], 3), 
+                            dtype='float64', order='C')
         vectors2[:,:,0] = -np.sin(px) * np.ones((1, self.resolution[1]))
         vectors2[:,:,1] = np.cos(px) * np.ones((1, self.resolution[1]))
         vectors2[:,:,2] = 0
 
         positions = self.center + vectors2 * self.disparity_s
         vectors = vectors * self.width[0]
-
         R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
         R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
         uv = np.dot(R1, self.orienter.unit_vectors)
         uv = np.dot(R2, uv)
-
         vectors.reshape((self.resolution[0]*self.resolution[1], 3))
         vectors = np.dot(vectors, uv)
         vectors.reshape((self.resolution[0], self.resolution[1], 3))


https://bitbucket.org/yt_analysis/yt/commits/7e6c439c67ca/
Changeset:   7e6c439c67ca
Branch:      yt
User:        ngoldbaum
Date:        2014-11-21 02:00:08+00:00
Summary:     Merged in jisuoqing/yt (pull request #1299)

SphericalCamera and StereoSphericalCamera for VR are added
Affected #:  2 files

diff -r 1c1f9efebc9a743122f81eaf1e6f12dadad7a87c -r 7e6c439c67cae08f7430f2b5a03896e6d6d0a512 yt/visualization/volume_rendering/api.py
--- a/yt/visualization/volume_rendering/api.py
+++ b/yt/visualization/volume_rendering/api.py
@@ -22,6 +22,7 @@
 
 from .camera import Camera, PerspectiveCamera, StereoPairCamera, \
     off_axis_projection, FisheyeCamera, MosaicFisheyeCamera, \
-    HEALpixCamera, InteractiveCamera, ProjectionCamera
+    HEALpixCamera, InteractiveCamera, ProjectionCamera, \
+    SphericalCamera, StereoSphericalCamera
 
 from .transfer_function_helper import TransferFunctionHelper

diff -r 1c1f9efebc9a743122f81eaf1e6f12dadad7a87c -r 7e6c439c67cae08f7430f2b5a03896e6d6d0a512 yt/visualization/volume_rendering/camera.py
--- a/yt/visualization/volume_rendering/camera.py
+++ b/yt/visualization/volume_rendering/camera.py
@@ -2342,6 +2342,179 @@
 
 data_object_registry["projection_camera"] = ProjectionCamera
 
+class SphericalCamera(Camera):
+    def __init__(self, *args, **kwargs):
+        Camera.__init__(self, *args, **kwargs)
+        if(self.resolution[0]/self.resolution[1] != 2):
+            mylog.info('Warning: It\'s recommended to set the aspect ratio to 2:1')
+        self.resolution = np.asarray(self.resolution) + 2
+
+    def get_sampler_args(self, image):
+        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
+        py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
+        
+        vectors = np.zeros((self.resolution[0], self.resolution[1], 3),
+                           dtype='float64', order='C')
+        vectors[:,:,0] = np.cos(px) * np.cos(py)
+        vectors[:,:,1] = np.sin(px) * np.cos(py)
+        vectors[:,:,2] = np.sin(py)
+
+        vectors = vectors * self.width[0]
+        positions = self.center + vectors * 0
+        R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
+        R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
+        uv = np.dot(R1, self.orienter.unit_vectors)
+        uv = np.dot(R2, uv)
+        vectors.reshape((self.resolution[0]*self.resolution[1], 3))
+        vectors = np.dot(vectors, uv)
+        vectors.reshape((self.resolution[0], self.resolution[1], 3))
+
+        dummy = np.ones(3, dtype='float64')
+        image.shape = (self.resolution[0]*self.resolution[1],1,4)
+        vectors.shape = (self.resolution[0]*self.resolution[1],1,3)
+        positions.shape = (self.resolution[0]*self.resolution[1],1,3)
+        args = (positions, vectors, self.back_center,
+                (0.0,1.0,0.0,1.0),
+                image, dummy, dummy,
+                np.zeros(3, dtype='float64'),
+                self.transfer_function, self.sub_samples)
+        return args
+
+    def _render(self, double_check, num_threads, image, sampler):
+        ncells = sum(b.source_mask.size for b in self.volume.bricks)
+        pbar = get_pbar("Ray casting", ncells)
+        total_cells = 0
+        if double_check:
+            for brick in self.volume.bricks:
+                for data in brick.my_data:
+                    if np.any(np.isnan(data)):
+                        raise RuntimeError
+
+        for brick in self.volume.traverse(self.front_center):
+            sampler(brick, num_threads=num_threads)
+            total_cells += brick.source_mask.size
+            pbar.update(total_cells)
+
+        pbar.finish()
+        image = self.finalize_image(sampler.aimage)
+        return image
+
+    def finalize_image(self, image):
+        view_pos = self.front_center
+        image.shape = self.resolution[0], self.resolution[1], 4
+        image = self.volume.reduce_tree_images(image, view_pos)
+        if self.transfer_function.grey_opacity is False:
+            image[:,:,3]=1.0
+        image = image[1:-1,1:-1,:]
+        return image
+
+data_object_registry["spherical_camera"] = SphericalCamera
+
+class StereoSphericalCamera(Camera):
+    def __init__(self, *args, **kwargs):
+        self.disparity = kwargs.pop('disparity', 0.)
+        Camera.__init__(self, *args, **kwargs)
+        self.disparity = self.ds.arr(self.disparity, input_units="code_length")
+        self.disparity_s = self.ds.arr(0., input_units="code_length")
+        if(self.resolution[0]/self.resolution[1] != 2):
+            mylog.info('Warning: It\'s recommended to set the aspect ratio to be 2:1')
+        self.resolution = np.asarray(self.resolution) + 2
+        if(self.disparity<=0.):
+            self.disparity = self.width[0]/1000.
+            mylog.info('Warning: Invalid value of disparity; ' \
+                       'now reset it to %f' % self.disparity)
+
+    def get_sampler_args(self, image):
+        px = np.linspace(-np.pi, np.pi, self.resolution[0], endpoint=True)[:,None]
+        py = np.linspace(-np.pi/2., np.pi/2., self.resolution[1], endpoint=True)[None,:]
+
+        vectors = np.zeros((self.resolution[0], self.resolution[1], 3),
+                           dtype='float64', order='C')
+        vectors[:,:,0] = np.cos(px) * np.cos(py)
+        vectors[:,:,1] = np.sin(px) * np.cos(py)
+        vectors[:,:,2] = np.sin(py)
+        vectors2 = np.zeros((self.resolution[0], self.resolution[1], 3), 
+                            dtype='float64', order='C')
+        vectors2[:,:,0] = -np.sin(px) * np.ones((1, self.resolution[1]))
+        vectors2[:,:,1] = np.cos(px) * np.ones((1, self.resolution[1]))
+        vectors2[:,:,2] = 0
+
+        positions = self.center + vectors2 * self.disparity_s
+        vectors = vectors * self.width[0]
+        R1 = get_rotation_matrix(0.5*np.pi, [1,0,0])
+        R2 = get_rotation_matrix(0.5*np.pi, [0,0,1])
+        uv = np.dot(R1, self.orienter.unit_vectors)
+        uv = np.dot(R2, uv)
+        vectors.reshape((self.resolution[0]*self.resolution[1], 3))
+        vectors = np.dot(vectors, uv)
+        vectors.reshape((self.resolution[0], self.resolution[1], 3))
+
+        dummy = np.ones(3, dtype='float64')
+        image.shape = (self.resolution[0]*self.resolution[1],1,4)
+        vectors.shape = (self.resolution[0]*self.resolution[1],1,3)
+        positions.shape = (self.resolution[0]*self.resolution[1],1,3)
+        args = (positions, vectors, self.back_center,
+                (0.0,1.0,0.0,1.0),
+                image, dummy, dummy,
+                np.zeros(3, dtype='float64'),
+                self.transfer_function, self.sub_samples)
+        return args
+
+    def snapshot(self, fn = None, clip_ratio = None, double_check = False,
+                 num_threads = 0, transparent=False):
+        
+        if num_threads is None:
+            num_threads=get_num_threads()
+
+        self.disparity_s = self.disparity
+        image1 = self.new_image()
+        args1 = self.get_sampler_args(image1)
+        sampler1 = self.get_sampler(args1)
+        self.initialize_source()
+        image1 = self._render(double_check, num_threads,
+                              image1, sampler1, '(Left) ')
+
+        self.disparity_s = -self.disparity
+        image2 = self.new_image()
+        args2 = self.get_sampler_args(image2)
+        sampler2 = self.get_sampler(args2)
+        self.initialize_source()
+        image2 = self._render(double_check, num_threads,
+                              image2, sampler2, '(Right)')
+
+        image = np.hstack([image1, image2])
+        image = self.volume.reduce_tree_images(image, self.center)
+        image = ImageArray(image, info = self.get_information())
+        self.save_image(image, fn=fn, clip_ratio=clip_ratio,
+                        transparent=transparent)
+        return image
+
+    def _render(self, double_check, num_threads, image, sampler, msg):
+        ncells = sum(b.source_mask.size for b in self.volume.bricks)
+        pbar = get_pbar("Ray casting "+msg, ncells)
+        total_cells = 0
+        if double_check:
+            for brick in self.volume.bricks:
+                for data in brick.my_data:
+                    if np.any(np.isnan(data)):
+                        raise RuntimeError
+
+        for brick in self.volume.traverse(self.front_center):
+            sampler(brick, num_threads=num_threads)
+            total_cells += brick.source_mask.size 
+            pbar.update(total_cells)
+
+        pbar.finish()
+
+        image = sampler.aimage.copy()
+        image.shape = self.resolution[0], self.resolution[1], 4
+        if self.transfer_function.grey_opacity is False:
+            image[:,:,3]=1.0
+        image = image[1:-1,1:-1,:]
+        return image
+
+data_object_registry["stereospherical_camera"] = StereoSphericalCamera
+
 def off_axis_projection(ds, center, normal_vector, width, resolution,
                         field, weight = None, 
                         volume = None, no_ghost = False, interpolated = False,

Repository URL: https://bitbucket.org/yt_analysis/yt/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.



More information about the yt-svn mailing list