Skip to content

Commit eec4f06

Browse files
author
Luke Kliber
authored
Merge pull request #105 from dictoon/master
Fix border rendering
2 parents 05ff463 + 994e6be commit eec4f06

File tree

3 files changed

+51
-30
lines changed

3 files changed

+51
-30
lines changed

project_file_writer.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,7 +1369,7 @@ def __emit_diffuse_btdf(self, material, bsdf_name, scene, layer=None, node=None)
13691369
self.__close_element("bsdf")
13701370

13711371
#------------------------
1372-
# Write Sheen BRDF
1372+
# Write Sheen BRDF
13731373
#------------------------
13741374
def __emit_sheen_brdf(self, material, bsdf_name, scene, layer=None, node=None):
13751375
reflectance = ""
@@ -1615,7 +1615,7 @@ def __emit_glass_bsdf(self, material, bsdf_name, scene, layer=None, node=None):
16151615
1)
16161616

16171617
else:
1618-
1618+
16191619
# check for texture in surface_transmittance_name slot
16201620
if layer.glass_surface_transmittance_use_tex and layer.glass_surface_transmittance_tex != "":
16211621
if util.is_uv_img(bpy.data.textures[layer.glass_surface_transmittance_tex]):
@@ -1682,7 +1682,7 @@ def __emit_glass_bsdf(self, material, bsdf_name, scene, layer=None, node=None):
16821682
if anisotropy not in self._textures_set:
16831683
self._textures_set.add(anisotropy)
16841684
self.__emit_texture(bpy.data.textures[layer.glass_anisotropy_tex], False, scene)
1685-
1685+
16861686
# check for texture in volume_transmittance slot
16871687
if layer.glass_volume_transmittance_use_tex and layer.glass_volume_transmittance_tex != "":
16881688
if util.is_uv_img(bpy.data.textures[layer.glass_volume_transmittance_tex]):
@@ -1704,7 +1704,7 @@ def __emit_glass_bsdf(self, material, bsdf_name, scene, layer=None, node=None):
17041704
if volume_transmittance_distance not in self._textures_set:
17051705
self._textures_set.add(volume_transmittance_distance)
17061706
self.__emit_texture(bpy.data.textures[layer.glass_volume_transmittance_distance_tex], False, scene)
1707-
1707+
17081708
# check for texture in volume_absorption slot
17091709
if layer.glass_volume_absorption_use_tex and layer.glass_volume_absorption_tex != "":
17101710
if util.is_uv_img(bpy.data.textures[layer.glass_volume_absorption_tex]):
@@ -1827,7 +1827,7 @@ def __emit_plastic_brdf(self, material, bsdf_name, scene, layer=None, node=None)
18271827
roughness = layer.plastic_roughness
18281828
diffuse_reflectance = ""
18291829
diffuse_reflectance_multiplier = layer.plastic_diffuse_reflectance_multiplier
1830-
1830+
18311831
# check for texture in specular_reflectance slot
18321832
if layer.plastic_specular_reflectance_tex and layer.plastic_specular_reflectance_tex != "":
18331833
if util.is_uv_img(bpy.data.textures[layer.plastic_specular_reflectance_tex]):
@@ -1991,7 +1991,7 @@ def __emit_specular_btdf(self, material, bsdf_name, scene, layer, node=None):
19911991
transmittance_multiplier = layer.spec_btdf_trans_mult
19921992

19931993
fresnel_multiplier = layer.spec_fresnel_multiplier
1994-
1994+
19951995
if layer.spec_fresnel_multiplier_use_tex and layer.spec_fresnel_multiplier_tex != "":
19961996
if util.is_uv_img(bpy.data.textures[layer.spec_fresnel_multiplier_tex]):
19971997
spec_fresnel_multiplier = layer.spec_fresnel_multiplier_tex + "_inst"
@@ -2607,8 +2607,8 @@ def __emit_frame_element(self, scene):
26072607
self.__emit_parameter("filter", scene.appleseed.pixel_filter)
26082608
self.__emit_parameter("filter_size", scene.appleseed.pixel_filter_size)
26092609
if scene.render.use_border:
2610-
X, Y, endX, endY = self.__get_border_limits(scene, width, height)
2611-
self.__emit_parameter("crop_window", "{0} {1} {2} {3}".format(X, Y, endX, endY))
2610+
min_x, min_y, max_x, max_y = self.__get_border_limits(scene, width, height)
2611+
self.__emit_parameter("crop_window", "{0} {1} {2} {3}".format(min_x, min_y, max_x, max_y))
26122612
self.__close_element("frame")
26132613

26142614
def __get_frame_resolution(self, render):
@@ -2624,11 +2624,11 @@ def __get_frame_aspect_ratio(self, render):
26242624
return xratio / yratio
26252625

26262626
def __get_border_limits(self, scene, width, height):
2627-
X = int(scene.render.border_min_x * width)
2628-
Y = height - int(scene.render.border_max_y * height)
2629-
endX = int(scene.render.border_max_x * width)
2630-
endY = height - int(scene.render.border_min_y * height)
2631-
return X, Y, endX, endY
2627+
min_x = int(scene.render.border_min_x * width)
2628+
max_x = int(scene.render.border_max_x * width)
2629+
min_y = height - int(scene.render.border_max_y * height) - 1
2630+
max_y = height - int(scene.render.border_min_y * height) - 1
2631+
return min_x, min_y, max_x, max_y
26322632

26332633
# ----------------------------------------------------------------------------------------------
26342634
# Configurations.
@@ -2707,7 +2707,7 @@ def __emit_common_configuration_parameters(self, scene, type):
27072707
self.__emit_parameter("ibl_env_samples", scene.appleseed.ibl_env_samples)
27082708
if not scene.appleseed.max_diffuse_bounces_unlimited:
27092709
self.__emit_parameter("max_diffuse_bounces", scene.appleseed.max_diffuse_bounces)
2710-
if not scene.appleseed.max_glossy_bounces_unlimited:
2710+
if not scene.appleseed.max_glossy_bounces_unlimited:
27112711
self.__emit_parameter("max_glossy_bounces", scene.appleseed.max_glossy_bounces)
27122712
if not scene.appleseed.max_specular_bounces_unlimited:
27132713
self.__emit_parameter("max_specular_bounces", scene.appleseed.max_specular_bounces)

render.py

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,16 @@ def __render_project_file(self, scene, project_filepath):
172172
(width, height) = util.get_render_resolution(scene)
173173

174174
# Compute render window.
175-
x0, y0, x1, y1 = 0, 0, width, height
176175
if scene.render.use_border:
177-
x0 = int(scene.render.border_min_x * width)
178-
x1 = int(scene.render.border_max_x * width)
179-
y0 = height - int(scene.render.border_min_y * height)
180-
y1 = height - int(scene.render.border_max_y * height)
176+
min_x = int(scene.render.border_min_x * width)
177+
min_y = height - int(scene.render.border_max_y * height)
178+
max_x = int(scene.render.border_max_x * width) - 1
179+
max_y = height - int(scene.render.border_min_y * height) - 1
180+
else:
181+
min_x = 0
182+
min_y = 0
183+
max_x = width - 1
184+
max_y = height - 1
181185

182186
# Launch appleseed.cli.
183187
cmd = (appleseed_exe,
@@ -186,7 +190,7 @@ def __render_project_file(self, scene, project_filepath):
186190
'--threads', str(scene.appleseed.threads),
187191
'--message-verbosity', 'warning',
188192
'--resolution', str(width), str(height),
189-
'--window', str(x0), str(y0), str(x1), str(y1))
193+
'--window', str(min_x), str(min_y), str(max_x), str(max_y))
190194
process = subprocess.Popen(cmd, cwd=as_bin_path, env=os.environ.copy(), stdout=subprocess.PIPE)
191195

192196
self.update_stats("", "appleseed: Rendering")
@@ -230,19 +234,36 @@ def __render_project_file(self, scene, project_filepath):
230234
if False:
231235
print("Received tile: x={0} y={1} w={2} h={3} c={4}".format(tile_x, tile_y, tile_w, tile_h, tile_c))
232236

233-
# Convert tile data to the format expected by Blender.
237+
# Ignore tiles completely outside the render window.
238+
if tile_x > max_x or tile_x + tile_w - 1 < min_x:
239+
continue
240+
if tile_y > max_y or tile_y + tile_h - 1 < min_y:
241+
continue
242+
243+
# Image-space coordinates of the intersection between the tile and the render window.
244+
x0 = max(tile_x, min_x)
245+
y0 = max(tile_y, min_y)
246+
x1 = min(tile_x + tile_w - 1, max_x)
247+
y1 = min(tile_y + tile_h - 1, max_y)
248+
249+
# Number of rows and columns to skip in the input tile.
250+
skip_x = x0 - tile_x
251+
skip_y = y0 - tile_y
252+
take_x = x1 - x0 + 1
253+
take_y = y1 - y0 + 1
254+
255+
# Extract relevant tile data and convert them to the format expected by Blender.
234256
floats = array.array('f')
235257
floats.fromstring(tile_data)
236258
pix = []
237-
for y in range(tile_h - 1, -1, -1):
238-
stride = tile_w * 4
239-
start_index = y * stride
240-
end_index = start_index + stride
241-
pix.extend(floats[i:i + 4] for i in range(start_index, end_index, 4))
259+
for y in range(take_y - 1, -1, -1):
260+
start_pix = (skip_y + y) * tile_w + skip_x
261+
end_pix = start_pix + take_x
262+
pix.extend(floats[p*4:p*4+4] for p in range(start_pix, end_pix))
242263

243264
# Update image.
244-
result = self.begin_result(tile_x, height - tile_y - tile_h, tile_w, tile_h)
245-
layer = result.layers[0] if bpy.app.version < (2, 74, 4) else result.layers[0].passes[0]
265+
result = self.begin_result(x0 - min_x, max_y - (y0 + take_y - 1), take_x, take_y)
266+
layer = result.layers[0].passes[0]
246267
layer.rect = pix
247268
self.end_result(result)
248269

scripts/make-package.bat

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
set zipcmd=%~dp0\tools\7z\7z.exe
44

55
pushd %~dp0\..\..
6-
%zipcmd% a -r -x!scripts -xr!.* -x!__pycache__ -x!README.md blenderseed-x.x.x-yyyy.zip blenderseed
6+
%zipcmd% a -r -x!scripts -xr!.* -x!__pycache__ -x!README.md blenderseed-x.x.x.zip blenderseed
77
popd
88

9-
move ..\..\blenderseed-x.x.x-yyyy.zip .
9+
move ..\..\blenderseed-x.x.x.zip .
1010

1111
pause

0 commit comments

Comments
 (0)