def test_array(self): p = SuperPoint(3.0, 4.0) arr = ObjArray(p) arr.append(p) arr.append(p) p = SuperPoint(7.0, 9.0) arr.append(p) code = """ index = 2 temp = arr[index] p1 = temp.x temp.y = 12.34 """ arg = ArrayArg('arr', arr) arg1 = FloatArg('p1', 4.4) shader = Shader(code=code, args=[arg, arg1]) shader.compile() shader.prepare([Runtime()]) shader.execute() val = shader.get_value('p1') self.assertAlmostEqual(val, 7.0) obj = arr[2] self.assertAlmostEqual(obj.y, 12.34, 6)
def prepare_shaders(self, runtimes): for l in self._lights: l.prepare(runtimes) ptrs = [] for l in self._lights: p = l.shader.get_ptrs() ptrs.append(p) args = [] for i in range(len(runtimes)): pa = PtrsArray() for v in ptrs: pa.append(v[i]) args.append(ArrayArg('lgt_ptrs', pa)) aal = self.rad_shader._get_arg('lgt_ptrs') aal.resize(args) self.rad_shader.prepare(runtimes) self.nlights_shader.prepare(runtimes) self.env_shader.prepare(runtimes) ##### emission shader ptrs = [] for l in self._lights: if isinstance(l, AreaLight): p = l.emission_shader.get_ptrs() ptrs.append(p) args = [] for i in range(len(runtimes)): pa = PtrsArray() for v in ptrs: pa.append(v[i]) args.append(ArrayArg('lgt_ptrs', pa)) aal = self.emission_shader._get_arg('lgt_ptrs') aal.resize(args) self.emission_shader.prepare(runtimes) self.update_light_ids()
def _pointer_args(self, shader_name, arg_name, runtimes): ptrs = [] for m in self._materials: shader = getattr(m, shader_name) p = shader.get_ptrs() ptrs.append(p) args = [] for i in range(len(runtimes)): pa = PtrsArray() for v in ptrs: pa.append(v[i]) args.append(ArrayArg(arg_name, pa)) return args
def _mtl_pdf(self, color_mgr): code = """ ptr_func = mtl_pdf_ptrs[mat_idx] __material_pdf(hitpoint, shadepoint, ptr_func) """ pdf_ptrs = ArrayArg('mtl_pdf_ptrs', PtrsArray()) al = ArgList('mtl_pdf_ptrs', [pdf_ptrs]) func_args = self._func_args(color_mgr.zero()) args = [al] self.pdf_shader = Shader(code=code, args=args, name='material_pdf', func_args=func_args, is_func=True)
def _lgt_radiance(self, color_mgr): code = """ ptr_func = lgt_ptrs[mat_idx] __light_radiance(hitpoint, shadepoint, ptr_func) """ lgt_ptrs = ArrayArg('lgt_ptrs', PtrsArray()) al = ArgList('lgt_ptrs', [lgt_ptrs]) func_args = self._func_args(color_mgr.zero()) args = [al] self.rad_shader = Shader(code=code, args=args, name='light_radiance', func_args=func_args, is_func=True)
def _get_visibility_code(self, shape_type): num_objects = 'num_vobjects_%s' % id(shape_type) obj_array_name = 'obj_varray_%s' % id(shape_type) isect_object = 'ray_object_isect_b_%s' % id(shape_type) code = """ i = 0 while i < %s: shape_object = %s[i] ret = %s(ray, shape_object, distance) if ret == 1: return 0 i = i + 1 """ % (num_objects, obj_array_name, isect_object) darr = self.shp_mgr._shape_arrays[shape_type] nobj = IntArg(num_objects, len(darr)) arr_arg = ArrayArg(obj_array_name, darr) return code, [nobj, arr_arg]
def load(self, shader_name, color_mgr): text = self._loader.load(shader_name, 'props.txt') args = [] if text is not None: args = parse_args(text) code = self._loader.load(shader_name, 'code.py') if code is None: raise ValueError("Integrator %s code is missing!" % shader_name) #array of shadepoints for debuging purpose sp = ShadePoint.factory(color_mgr.zero()) arr = ObjArray(sp) for i in range(10): arr.append(sp) arg = ArrayArg('path_array', arr) args.append(arg) hdr_buffer = StructArg('hdr_buffer', ImagePRGBA(1, 1)) args.append(hdr_buffer) self.shader = Shader(code=code, args=args) self._color_mgr = color_mgr
def _get_shape_code(self, shape_type): num_objects = 'num_objects_%s' % id(shape_type) obj_array_name = 'obj_array_%s' % id(shape_type) isect_object = 'ray_object_isect_%s' % id(shape_type) code = """ i = 0 while i < %s: shape_object = %s[i] ret = %s(ray, shape_object, hitpoint, min_dist) if ret == 1: hit_happend = 1 if hitpoint.t < min_dist: min_dist = hitpoint.t i = i + 1 """ % (num_objects, obj_array_name, isect_object) darr = self.shp_mgr._shape_arrays[shape_type] nobj = IntArg(num_objects, len(darr)) arr_arg = ArrayArg(obj_array_name, darr) return code, [nobj, arr_arg]
def _lgt_emission(self, color_mgr): code = """ if light_id < 0: shadepoint.light_intensity = Spectrum(0.0) shadepoint.light_pdf = 1.0 else: ptr_func = lgt_ptrs[light_id] __light_emission(hitpoint, shadepoint, ptr_func) """ lgt_ptrs = ArrayArg('lgt_ptrs', PtrsArray()) al = ArgList('lgt_ptrs', [lgt_ptrs]) spec = color_mgr.zero() func_args = [ StructArgPtr('hitpoint', HitPoint.factory()), StructArgPtr('shadepoint', ShadePoint.factory(spec)), IntArg('light_id', -1) ] args = [al] self.emission_shader = Shader(code=code, args=args, name='light_emission', func_args=func_args, is_func=True)