Пример #1
0
    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)
Пример #2
0
    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()
Пример #3
0
    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
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
    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]
Пример #7
0
    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
Пример #8
0
    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]
Пример #9
0
    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)