From 5a8b1d413e98abd10b8ca6b1eb5eb91987f39ebf Mon Sep 17 00:00:00 2001
From: Tavian Barnes <tavianator@gmail.com>
Date: Fri, 29 Jul 2011 00:38:18 -0600
Subject: Support rendering image subregions.

This is the first step to supporting distributed renders.
---
 libdimension-python/dimension.pxd |  7 +++++-
 libdimension-python/dimension.pyx | 47 ++++++++++++++++++++++++++++++++++-----
 2 files changed, 47 insertions(+), 7 deletions(-)

(limited to 'libdimension-python')

diff --git a/libdimension-python/dimension.pxd b/libdimension-python/dimension.pxd
index 9bfe5a9..411be3f 100644
--- a/libdimension-python/dimension.pxd
+++ b/libdimension-python/dimension.pxd
@@ -372,10 +372,15 @@ cdef extern from "../libdimension/dimension.h":
     dmnsn_texture *default_texture
     dmnsn_interior *default_interior
 
+    dmnsn_canvas *canvas
+    size_t region_x
+    size_t region_y
+    size_t outer_width
+    size_t outer_height
+
     dmnsn_array *objects
     dmnsn_array *lights
     dmnsn_camera *camera
-    dmnsn_canvas *canvas
 
     dmnsn_quality quality
     unsigned int reclimit
diff --git a/libdimension-python/dimension.pyx b/libdimension-python/dimension.pyx
index 2197edd..baafcd6 100644
--- a/libdimension-python/dimension.pyx
+++ b/libdimension-python/dimension.pyx
@@ -1298,6 +1298,8 @@ cdef class Scene:
 
     self._scene.canvas = canvas._canvas
     DMNSN_INCREF(self._scene.canvas)
+    self.outer_width = self._scene.canvas.width
+    self.outer_height = self._scene.canvas.height
 
     cdef dmnsn_object *o
     for obj in objects:
@@ -1311,14 +1313,35 @@ cdef class Scene:
       DMNSN_INCREF(l)
       dmnsn_array_push(self._scene.lights, &l)
 
-    # Account for image dimensions in the camera
-    camera._camera.trans = dmnsn_matrix_mul(
-      camera._camera.trans,
-      dmnsn_scale_matrix(dmnsn_new_vector(canvas.width/canvas.height, 1.0, 1.0))
-    )
     self._scene.camera = camera._camera
     DMNSN_INCREF(self._scene.camera)
 
+  # Subregion render support
+  property region_x:
+    """The x-coordinate of the subregion in the broader image."""
+    def __get__(self):
+      return self._scene.region_x
+    def __set__(self, x):
+      self._scene.region_x = x
+  property region_y:
+    """The y-coordinate of the subregion in the broader image."""
+    def __get__(self):
+      return self._scene.region_y
+    def __set__(self, y):
+      self._scene.region_y = y
+  property outer_width:
+    """The width of the broader image."""
+    def __get__(self):
+      return self._scene.outer_width
+    def __set__(self, width):
+      self._scene.outer_width = width
+  property outer_height:
+    """The height of the broader image."""
+    def __get__(self):
+      return self._scene.outer_height
+    def __set__(self, height):
+      self._scene.outer_height = height
+
   property default_texture:
     """The default Texture for objects."""
     def __get__(self):
@@ -1400,8 +1423,20 @@ cdef class Scene:
     self.raytrace_async().finish()
   def raytrace_async(self):
     """Render the scene, in the background."""
+    # Account for image dimensions in the camera
+    # Do this here so subregion renders can tell us the broader image size
+    self._scene.camera.trans = dmnsn_matrix_mul(
+      self._scene.camera.trans,
+      dmnsn_scale_matrix(
+        dmnsn_new_vector(
+          self.outer_width/self.outer_height,
+          1.0,
+          1.0
+        )
+      )
+    )
     # Ensure the default texture is complete
-    cdef Texture default = Texture(Black)
+    cdef Texture default = Texture(pigment = Black)
     dmnsn_texture_cascade(default._texture, &self._scene.default_texture)
     return _Progress(dmnsn_raytrace_scene_async(self._scene))
 
-- 
cgit v1.2.3