-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathrender-dragon
executable file
·336 lines (300 loc) · 21.8 KB
/
render-dragon
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
#!/usr/bin/env python
from __future__ import division
import sys
import subprocess
import os.path
from geode import *
from geode.value import parser
from mitsuba import *
from fractal_helper import *
# Fine front:
# ./dragon.py --type dragon --level 17 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0.025 --closed 0 --closed-base 1 --z-scale 0.5 --sharp-corners 0 --colorize 1 --instance 1 --border-crease 1 --ground 1 --settle-step 0.01 --mitsuba-dir gen-fine --origin=-49.412825379531753,208.92850880962186,78.324132111435546 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 0,-0.9999999984957032,5.4850649339629963e-05,0 --border-layers 8
# ./render-dragon --gui 1 --samples 512 --data gen-fine --width 1280 --height 960 --color-seed 194514
# Gold
# ./dragon.py --type dragon --level 17 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0.025 --closed 0 --closed-base 1 --z-scale 0.5 --sharp-corners 0 --colorize 1 --instance 1 --border-crease 1 --ground 1 --settle-step 0.01 --mitsuba-dir gen-gold --origin=-49.412825379531753,208.92850880962186,78.324132111435546 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 0,-0.9999999984957032,5.4850649339629963e-05,0 --border-layers 8 --two-ring 1
# ./render-dragon --gui 1 --samples 512 --data gen-gold --width 1280 --height 960 --multicolor 0 --integrator erpt --depth 20
# Simple:
# for i in `seq 0 5`; do ./dragon.py --console 1 --smooth $i --mitsuba-dir gen-simple-$i --type dragon --level 5 --corner-shift 0.05 --size 150 --thickness 0.1 --closed 0 --closed-base 1 --z-scale 0.5 --sharp-corners 0 --colorize 0 --instance 1 --border-crease 1 --border-layers 1 --flip 1 --ground 1 --settle-step 0.01 --origin=-6.6614485991588577,214.62817962567379,78.913429143861407 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 0,-0.9999999984957032,5.4850649339629963e-05,0; done
# for i in `seq 0 5`; do ./render-dragon --data gen-simple-$i --samples 512 --simple-color .8,0,0 --facets 1 -o dragon-simple-$i.exr; done
# Fine down/side:
# ./dragon.py --type dragon --level 13 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0.2 --closed 0 --closed-base 1 --z-scale 0.5 --sharp-corners 0 --colorize 1 --instance 1 --border-crease 1 --ground 1 --settle-step 0.01 --mitsuba-dir gen-side-fine --origin=-39.679084283641487,-239.85430391769961,75.543129644474547 --target 5.2339400073202738,-10.984723621310748,11.128750338448013 --rotation=-0.09978530235048004,0.080263531268720989,0.62102958705347577,-0.77325475167456148
# ./render-dragon --gui 1 --view down --data gen-side-fine --width 1280 --height 960 --color-seed 194514 --samples 512 &
# ./render-dragon --gui 1 --view side --data gen-side-fine --width 1280 --height 960 --color-seed 194514 --samples 512 &
# Canopy:
# ./dragon.py --type dragon --level 14 --scale-level 14 --smooth 2 --corner-shift 0.05 --size 150 --thickness 0.17999999999999999 --closed 0 --closed-base 1 --z-scale 0.5 --sharp-corners 0 --colorize 0 --instance 1 --border-crease 1 --flip 1 --ground 0 --settle-step 0.01 --mitsuba-dir gen-canopy --origin 15.937630749436821,-10.55833672257492,60.718947647935565 --target 18.266964477314549,-10.578622900392148,71.818862427738665 --rotation 1,0,0,0
# ./render-dragon --view canopy --data gen-canopy-fine --samples 512 --width 1280 --height 960 --gui 1
# Fine canopy
# ./dragon.py --type dragon --level 14 --scale-level 14 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0.17999999999999999 --closed 0 --closed-base 1 --z-scale 0.5 --sharp-corners 0 --colorize 0 --instance 1 --border-crease 1 --flip 1 --ground 0 --settle-step 0.01 --mitsuba-dir gen-canopy-fine --origin 15.937630749436821,-10.55833672257492,60.718947647935565 --target 18.266964477314549,-10.578622900392148,71.818862427738665 --rotation 1,0,0,0
# Fine terdragon front:
# ./dragon.py --type terdragon --level 10 --smooth 5 --colorize 1 --ground 1 --mitsuba-dir gen-terdragon-front --origin=-49.412825379531753,208.92850880962186,78.324132111435546 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 1.7855807963205805e-11,1,0,0 --thickness .05 --border-layers 8
# ./render-dragon --gui 1 --view front --data gen-terdragon-front --samples 512 --width 1280 --height 960 --color-seed 20002
# Fine terdragon side/down:
# ./dragon.py --type terdragon --level 8 --smooth 5 --thickness 0.29999999999999999 --colorize 1 --border-layers 8 --ground 1 --mitsuba-dir gen-terdragon-side --origin=-70.331627112440813,164.23717989126743,65.999483565575716 --target 0.57691794482902314,-7.4761573866077597,26.788706998314769 --rotation=-0.74593201261051922,0.62282714395871686,0.13974285587294705,-0.19011500609767951
# ./render-dragon --view terdragon-side --data gen-terdragon-side --samples 512 --width 1280 --height 960 --color-seed 20002
# ./render-dragon --view terdragon-down --data gen-terdragon-side --samples 512 --width 1280 --height 960 --color-seed 20002
# Koch:
# ./dragon.py --type koch --level 6 --smooth 5 --colorize 1 --border-layers 8 --ground 1 --mitsuba-dir gen-koch --origin=-46.082316229740172,179.20323643974311,73.74081360141966 --target=-0.47139844334676173,-7.465299519683386,26.072048830404896 --rotation=-1.7884692144788661e-08,0.95116086597988436,0.30869565437238849,-2.1036733629381521e-08 --thickness .01
# ./render-dragon --view koch-front --data gen-koch --samples 512 --color-seed 184853 --width 1280 --height 960 -o koch-front.exr
# Koch side:
# ./dragon.py --type koch --level 6 --smooth 5 --colorize 1 --border-layers 8 --ground 1 --mitsuba-dir gen-koch-side --origin 0.22170089213766708,123.93437270853076,180.33272525228978 --target=-6.5876712447798162,-17.224156513626859,44.43756566063562 --rotation=1,0,0,0 --thickness .01
# ./render-dragon --view koch-side --data gen-koch-side --samples 512 --color-seed 184853 --width 1280 --height 960 -o koch-side.exr
# Gosper front:
# ./dragon.py --type gosper --level 5 --scale-level 4 --smooth 4 --corner-shift 0.01 --thickness 0.3 --colorize 1 --border-layers 8 --ground 1 --origin=-37.548031375625783,174.33524984605464,94.06447355517362 --target 2.9977420980846889,-0.88814677571724876,21.815315250732041 --rotation=-5.4497675157361205e-09,-0.61958769628079802,0.78492744035194328,-5.7771780692661481e-09 --mitsuba-dir gen-gosper-front --console 1
# ./render-dragon --view gosper-front --data gen-gosper-front --samples 512 --color-seed 184811 --width 1280 --height 960
# ./render-dragon --view gosper-other --data gen-gosper-front --samples 512 --color-seed 184811 --width 1280 --height 960
# Gosper back:
# ./dragon.py --type gosper --level 5 --scale-level 4 --smooth 4 --corner-shift 0.01 --thickness 0.3 --colorize 1 --border-layers 8 --ground 1 --origin=-37.548031375625783,174.33524984605464,94.06447355517362 --target 2.9977420980846889,-0.88814677571724876,21.815315250732041 --rotation 4.9634164601974635e-09,-0.9374474864151201,-0.3481267157429479,-1.0434993813479565e-08 --mitsuba-dir gen-gosper-back --console 1
# ./render-dragon --view gosper-back --data gen-gosper-back --samples 512 --color-seed 184811 --width 1280 --height 960
# Gosper side:
# ./dragon.py --type gosper --level 5 --scale-level 4 --smooth 4 --corner-shift 0.01 --thickness 0.29999999999999999 --colorize 1 --border-layers 8 --ground 1 --mitsuba-dir gen-gosper-side --origin 106.14852758526946,184.76928051872716,86.739813112730673 --target=-1.8413109040436795,8.757791108450121,17.952745587243811 --rotation 0.88225156371353819,-0.40498582943483014,0.019493838923558819,0.23924599584114714
# ./render-dragon --view gosper-side --data gen-gosper-side --samples 512 --color-seed 184811 --width 1280 --height 960
# Dragon for comparison
# ./dragon.py --type dragon --level 10 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0 --closed 0 --closed-base 1 --z-scale 0.56995792501637821 --sharp-corners 1 --colorize 0 --instance 0 --border-crease 1 --ground 1 --settle-step 0.01 --origin=-49.412825379531753,208.92850880962186,78.324132111435546 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 0,-0.9999999984957032,5.4850649339629963e-05,0 --border-layers 8 --extra-mesh henry-thin-level11.stl --mitsuba-dir gen-dragon-compare-thin-sharp
# ./dragon.py --type dragon --level 10 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0 --closed 0 --closed-base 1 --z-scale 0.56995792501637821 --sharp-corners 0 --colorize 0 --instance 0 --border-crease 1 --ground 1 --settle-step 0.01 --origin=-49.412825379531753,208.92850880962186,78.324132111435546 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 0,-0.9999999984957032,5.4850649339629963e-05,0 --border-layers 8 --extra-mesh henry-thin-level11.stl --mitsuba-dir gen-dragon-compare-thin-round
# ./dragon.py --type dragon --level 10 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0.2 --closed 0 --closed-base 1 --z-scale 0.56995792501637821 --sharp-corners 0 --colorize 0 --instance 0 --border-crease 1 --ground 1 --settle-step 0.01 --origin=-49.412825379531753,208.92850880962186,78.324132111435546 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 0,-0.9999999984957032,5.4850649339629963e-05,0 --border-layers 8 --mitsuba-dir gen-dragon-compare-exp-round
# ./dragon.py --type dragon --level 10 --smooth 5 --corner-shift 0.05 --size 150 --thickness 0.7 --thickness-alpha 1 --closed 0 --closed-base 1 --z-scale 0.56995792501637821 --sharp-corners 0 --colorize 0 --instance 0 --border-crease 1 --ground 1 --settle-step 0.01 --origin=-49.412825379531753,208.92850880962186,78.324132111435546 --target 1.8198107879612146,-9.5738105894434717,53.519032449873805 --rotation 0,-0.9999999984957032,5.4850649339629963e-05,0 --border-layers 8 --mitsuba-dir gen-dragon-compare-const-round
# ./render-dragon --gui 1 --samples 512 --data gen-dragon-compare-thin-sharp --width 1280 --height 960 --two-sided 1 --simple-color .8,0,0 --extra 0
# ./render-dragon --gui 1 --samples 512 --data gen-dragon-compare-thin-round --width 1280 --height 960 --two-sided 1 --simple-color .8,0,0 --extra 0
# ./render-dragon --gui 1 --samples 512 --data gen-dragon-compare-exp-round --width 1280 --height 960 --two-sided 0 --simple-color .8,0,0 --extra 0
# ./render-dragon --gui 1 --samples 512 --data gen-dragon-compare-const-round --width 1280 --height 960 --two-sided 0 --simple-color .8,0,0 --extra 0
# ./render-dragon --gui 1 --samples 512 --data gen-dragon-compare-const-round --width 1280 --height 960 --two-sided 1 --simple-color .8,0,0 --extra 1
# Sierpinski thickness comparison
# ./dragon.py --type sierpinski --level 8 --smooth 4 --thickness 0.075 --thickness-alpha 1 --z-scale 0.6 --instance 0 --border-layers 8 --ground 1 --min-dot-override=-8.32499 --mitsuba-dir gen-sierpinski-const --origin 49.790814279239328,37.745462112076865,110.31450473396978 --target 46.830878243261445,33.319459198501335,103.8336842821352 --rotation 0.88684068551546047,-0.45487067454112651,-0.081278951500180857,0 --console 1
# ./dragon.py --type sierpinski --level 8 --smooth 4 --thickness 0.075 --thickness-alpha -1 --z-scale 0.6 --instance 0 --border-layers 8 --ground 1 --min-dot-override=-8.32499 --mitsuba-dir gen-sierpinski-exp --origin 49.790814279239328,37.745462112076865,110.31450473396978 --target 46.830878243261445,33.319459198501335,103.8336842821352 --rotation 0.88684068551546047,-0.45487067454112651,-0.081278951500180857,0 --console 1
# ./dragon.py --type sierpinski --level 8 --smooth 4 --thickness 0 --thickness-alpha -1 --z-scale 0.6 --instance 0 --border-layers 8 --ground 1 --min-dot-override=-8.32499 --mitsuba-dir gen-sierpinski-thin --origin 49.790814279239328,37.745462112076865,110.31450473396978 --target 46.830878243261445,33.319459198501335,103.8336842821352 --rotation 0.88684068551546047,-0.45487067454112651,-0.081278951500180857,0 --console 1
# ./render-dragon --gui 1 --samples 512 --data gen-sierpinski-const --width 1280 --height 960 --two-sided 0 --simple-color .8,0,0 --view sierpinski-thick
# ./render-dragon --gui 1 --samples 512 --data gen-sierpinski-exp --width 1280 --height 960 --two-sided 0 --simple-color .8,0,0 --view sierpinski-thick
# ./render-dragon --gui 1 --samples 512 --data gen-sierpinski-thin --width 1280 --height 960 --two-sided 1 --simple-color .8,0,0 --view sierpinski-thick
# Define properties
props = PropManager()
sun_direction = props.add('sun_direction',(.1,.1,1))
width = props.add('width',640).set_help('width of the rendered image')
height = props.add('height',480).set_help('height of the rendered image')
view = props.add('view','front').set_allowed('front down side canopy terdragon-side terdragon-down koch-front koch-side gosper-front gosper-back gosper-side gosper-other sierpinski-thick custom'.split())
origin = props.add('origin','160.64605078933045,3.4348049364373598,-16.681267849938735').set_help('custom view')
target = props.add('target','154.06255051957712,3.1859855253969869,-16.190753540914127').set_help('custom view')
norender = props.add('norender',False).set_abbrev('n')
samples = props.add('samples',128).set_help('# of samples/pixel, render time is about linear in this')
skyres = props.add('sky_resolution',512).set_help('resolution of sky environment map')
output = props.add('output','').set_abbrev('o')
multicolor = props.add('multicolor',True).set_help('use different colors for each patch')
simple_color = props.add('simple_color',zeros(3)).set_help('use the given color for all patches')
color_seed = props.add('color_seed',1618).set_help('random seed used for patch color generation')
options = props.add('mitsuba','').set_help('options to pass to Mitsuba')
gui = props.add('gui',False).set_help('run mtsgui')
data = props.add('data','gen').set_help('data directory')
facets = props.add('facets',False).set_help('use triangle normals')
depth = props.add('depth',10).set_help('maximum reflection depth')
two_stage = props.add('two_stage',False).set_help('use two stage pssmlt')
integrator_type = props.add('integrator','path').set_allowed('pssmlt erpt path direct'.split())
sun_only = props.add('sun_only',False)
sphere_sun = props.add('sphere_sun',False)
sun_scale = props.add('sun_scale',0.)
tile_size = props.add('tile_size',1000).set_help('base size of a tile in tiled mode')
tile_overlap = props.add('tile_overlap',10).set_help('half overlap of adjacent tiles')
tile_id = props.add('tile',-1).set_help('which tile to render')
mask = props.add('mask','').set_help('render only pixels specified by the mask')
two_sided = props.add('two_sided',False).set_help('render both sides of the surface')
extra = props.add('extra',False).set_help('render extra mesh')
parser.parse(props,'Render a developed fractal curve.',positional=[view])
# View
fov = 60.
up = 0,0,1
def pullback(fraction):
global origin
origin += fraction*(asarray(origin)-target)
if view()=='front':
origin = -49.412825379531753,208.92850880962186,78.324132111435546+5
target = 1.8198107879612146,-9.5738105894434717,53.519032449873805+5
pullback(.1)
elif view()=='down':
origin = -35.099345315100472,-112.56477679297062,151.73361854587179
target = -0.4743525601077685,-11.413973723185453,0.44285274279076814
pullback(.2)
elif view()=='side':
origin = -39.679084283641487,-239.85430391769961,75.543129644474547
target = 5.2339400073202738,-10.984723621310748,11.128750338448013
shift = projected_orthogonal_to_unit_direction(asarray(target)-origin,(0,0,1))
shift = 10*normalized(Rotation.from_angle_axis(pi/2,(0,0,1))*shift)
origin += shift
target += shift
pullback(.1)
elif view()=='canopy':
origin = 15.937630749436821,-10.55833672257492,60.718947647935565
target = 18.266964477314549,-10.578622900392148,71.818862427738665
elif view()=='terdragon-side':
origin = -70.331627112440813,164.23717989126743,65.999483565575716
target = 0.57691794482902314,-7.4761573866077597,26.788706998314769
pullback(.2)
elif view()=='terdragon-down':
origin = -49.519740925552036,111.48691471496269,157.32456439198199
target = -6.34304308356056,9.1542087044817428,7.7826856731907048
pullback(.2)
elif view()=='koch-front':
origin = -46.082316229740172,179.20323643974311,73.74081360141966
target = -0.47139844334676173,-7.465299519683386,26.072048830404896
pullback(.15)
elif view()=='koch-side':
origin = 0.22170089213766708,123.93437270853076,180.33272525228978
target = -6.5876712447798162,-17.224156513626859,44.43756566063562
pullback(.2)
origin = target+Rotation.from_angle_axis(-10*pi/180,(0,0,1))*(origin-target)
elif view()=='gosper-front':
origin = -37.548031375625783,174.33524984605464,94.06447355517362
target = 2.9977420980846889,-0.88814677571724876,21.815315250732041
pullback(.2)
elif view()=='gosper-back':
origin = -37.548031375625783,174.33524984605464,94.06447355517362
target = 2.9977420980846889,-0.88814677571724876,21.815315250732041
pullback(.2)
sun_direction.set(normalized(normalized(origin-target)+(0,0,.25)))
elif view()=='gosper-side':
origin = 106.14852758526946,184.76928051872716,86.739813112730673
target = -1.8413109040436795,8.757791108450121,17.952745587243811
pullback(.2)
elif view()=='gosper-other':
origin = -128.8615749233883,-80.825171896664514,131.82615051315565
target = 4.2833936284253209,-10.03950863326339,21.144571304972139
pullback(.3)
elif view()=='sierpinski-thick':
origin = 49.790814279239328,37.745462112076865,110.31450473396978
target = 46.830878243261445,33.319459198501335,103.8336842821352
pullback(1.5)
elif view()=='custom':
origin = origin()
target = target()
else:
raise RuntimeError('unknown view %s'%view())
origin = asarray(origin)
target = asarray(target)
# Count representatives
reps = int(open(data()+'/count').read())
# Generate colors
if multicolor:
random.seed(color_seed())
colors = wheel_color(random.uniform(0,1,size=max(1,reps)))
if any(simple_color()):
colors[:] = simple_color()
# Rotate y to z
ytoz = Rotation.from_rotated_vector((0,1,0),(0,0,1))
# Sun details
sun_closer_factor = 1e-4
sun_distance = sun_closer_factor * 1.496e11
sun_radius = sun_closer_factor * 6.955e8
# Tile details
if tile_id()>=0:
image_shape = array([width(),height()])
tiles = (image_shape+tile_size()-1)//tile_size()
tile = array([tile_id()//tiles[1],tile_id()%tiles[1]])
assert all(0<=tile) and all(tile<tiles)
tile_start = maximum(0,tile_size()*tile-tile_overlap())
tile_end = minimum(image_shape,tile_size()*(tile+1)+tile_overlap())
tile_size = tile_end-tile_start
else:
tile_start = tile_size = zeros(2)
# Construct sampler
samp = sampler('independent' if integrator_type()=='pssmlt' else 'ldsampler',
fields(sampleCount=samples()))
if mask():
samp = sampler('masked',fields(maskImage=mask()),samp)
# bsdf helpers
def twosided(name,inner):
if two_sided():
return bsdf(name,'twosided',inner)
return inner
inner_suffix = '-inner' if two_sided() else ''
def one_bsdf(i):
return select(multicolor(),
twosided('bsdf-%d'%i,
bsdf('bsdf-%d'%i+inner_suffix,'diffuse',
rgb('reflectance',colors[i]))),
ref('mono'))
# Generate scene
scene_file = data()+'/dragon%s.xml'%('-%d'%tile_id() if tile_id()>=0 else '')
open(scene_file,'w').write(scene_version('0.4.1',
{'pssmlt':
integrator('pssmlt',
fields(maxDepth=depth(),twoStage=two_stage())),
'erpt':
integrator('erpt',
fields(maxDepth=depth(),manifoldPerturbation=True,lensPerturbation=False,multiChainPerturbation=False,causticPerturbation=False,
chainLength=200,directSamples=128,numChains=4.,probFactor=120.)),
'path':
integrator('path',
fields(maxDepth=depth())),
'direct':
integrator('direct',
fields(maxDepth=100,rrDepth=5,luminaireSamples=1,bsdfSamples=1))
}[integrator_type()],
sensor('perspective',
fields(nearClip=0.1, farClip=30000., fov=fov),
transform('toWorld',
lookAt(origin=origin,target=target,up=up)),
film('hdrfilm',
fields(width=width(),height=height(),banner=False),
skipif(tile_id()<0,
fields(cropOffsetX=tile_start[0],cropOffsetY=tile_start[1],cropWidth=tile_size[0],cropHeight=tile_size[1])),
rfilter('gaussian')),
samp),
skipif(sun_only() and sphere_sun(),
emitter('sky' if sphere_sun() else 'sunsky',
fields(stretch=1.1,sunRadiusScale=sun_scale(),
scale=(.1 if view()=='sierpinski-thick' else 1.)),
vector('sunDirection',sun_direction()),
transform('toWorld',rotate(ytoz)))),
skipif(not sphere_sun(),
shape('sphere',
fields(radius=sun_scale()*sun_radius),
point('center',sun_distance*normalized(sun_direction())),
emitter('area',
fields(samplingWeight=10.),
rgb('radiance',0.00327988/max(1e-20,sun_scale())*array([6419653., 5444225., 4617994.5]))))),
skipif(view()!='canopy',
emitter('point',
point('position',origin-.01*(target-origin)),
spectrum('intensity',5.))),
# Ground
skipif(view()=='canopy',
shape('disk',
transform('toWorld',scale(100000*ones(3))),
twosided('ground',
select(1,
bsdf('ground'+inner_suffix,'plastic',
rgb('diffuseReflectance',.1*ones(3))),
bsdf('ground'+inner_suffix,'conductor',
fields(material='Au')))))),
# Gold
twosided('mono',
select(1,
bsdf('mono'+inner_suffix,'conductor',
fields(material='Au')),
bsdf('mono'+inner_suffix,'roughconductor',
fields(material='Au',alpha=.01)))),
select(extra(),
# Extra mesh
shape('obj',
fields(filename='extra.obj',maxSmoothAngle=30.),
one_bsdf(0)),
select(reps==0,
shape('obj',
fields(filename='single.obj',maxSmoothAngle=30.),
one_bsdf(0)),
concat((
# Shape groups
concat((shapegroup('group-%d'%i,
shape('obj',
fields(filename='rep-%d.obj'%i,faceNormals=facets()),
one_bsdf(i))
) for i in xrange(reps))),
# Instances
concat((include('instances-%d.xml'%i) for i in xrange(reps)))))))))
# Run mitsuba
if not norender():
if not output():
output.set(view()+'.exr')
if gui():
cmd = ['mtsgui']+options().split()+[scene_file]
else:
cmd = ['mitsuba','-o',output()]+options().split()+[scene_file]
print ' '.join(cmd)
subprocess.call(cmd)