def load(self, shader_name): #TODO props props = self._loader.load(shader_name, 'props.txt') code = self._loader.load(shader_name, 'code.py') w = Vec3Arg('w', self._w) u = Vec3Arg('u', self._u) v = Vec3Arg('v', self._v) distance = FloatArg('distance', self._distance) eye = Vec3Arg('eye', self._eye) lookat = Vec3Arg('lookat', self._lookat) args = [w, u, v, distance, eye, lookat] origin = Vector3(0.0, 0.0, 0.0) direction = Vector3(0.0, 0.0, 0.0) ray = Ray(origin, direction) sample = Sample(0.0, 0.0, 0, 0, 0.0) func_args = [StructArgPtr('ray', ray), StructArgPtr('sample', sample)] self.shader = Shader(code=code, args=args, name='generate_ray', func_args=func_args, is_func=True) codepy = self._loader.load(shader_name, 'codepy.py') self._py_code = compile(codepy, 'codepy.py', 'exec')
def isect_shader(self): origin = Vector3(0.0, 0.0, 0.0) direction = Vector3(0.0, 0.0, 0.0) ray = Ray(origin, direction) hitpoint = HitPoint(0.0, Vector3(0.0, 0.0, 0.0), Vector3(0.0, 0.0, 0.0), 0, 0.0, 0.0) func_args = [ StructArgPtr('ray', ray), StructArgPtr('hitpoint', hitpoint), FloatArg('min_dist', 99999.0) ] args = [] code = "hit_happend = 0\n" for shp_type in self.shp_mgr.shape_types(): code1, args1 = self._get_shape_code(shp_type) args.extend(args1) code += code1 code += "\nreturn hit_happend\n" shader = Shader(code=code, args=args, name='isect_scene', func_args=func_args, is_func=True) return shader
def load(self, shader_name): 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') self.shader = Shader(code=code, args=args)
def isect_b_shader(cls): code = """ temp = ray.origin - sphere.origin r_dir = ray.direction a = dot(r_dir, r_dir) b = dot(temp, r_dir) * 2.0 c = dot(temp, temp) - sphere.radius * sphere.radius disc = b * b - 4.0 * a * c if disc < 0.0: return 0 e = sqrt(disc) denom = 2.0 * a t = (-1.0 * b - e) / denom if t > 0.0005: if t < min_dist: return 1 t = (-1.0 * b + e) / denom if t > 0.0005: if t < min_dist: return 1 return 0 """ args = [] origin = Vector3(0.0, 0.0, 0.0) direction = Vector3(0.0, 0.0, 0.0) ray = Ray(origin, direction) sphere = Sphere(Vector3(0.0, 0.0, 0.0), 0.0, 0) func_args = [ StructArgPtr('ray', ray), StructArgPtr('sphere', sphere), FloatArg('min_dist', 0.0) ] shader = Shader(code=code, args=args, name='isect_b_sphere', func_args=func_args, is_func=True) return shader
def load(self, shader_name): text = self._loader.load(shader_name, 'props.txt') #args = create_args(text) code = self._loader.load(shader_name, 'code.py') sample = Sample(0.0, 0.0, 0, 0, 0.0) func_args = [StructArgPtr('sample', sample)] args = [ IntArg('width', self._width), IntArg('height', self._height), IntArg('pass_number', self._pass_number), FloatArg('pixel_size', self._pixel_size) ] tiles = create_tiles(self._width, self._height, self._nthreads) targs = [StructArg('tile', tile) for tile in tiles] targ = ArgList('tile', targs) args.append(targ) curx_args = [IntArg('curx', 0) for tile in tiles] curx_arg = ArgList('curx', curx_args) args.append(curx_arg) cury_args = [IntArg('cury', tile.y) for tile in tiles] cury_arg = ArgList('cury', cury_args) args.append(cury_arg) endx_args = [IntArg('endx', tile.width) for tile in tiles] endx_arg = ArgList('endx', endx_args) args.append(endx_arg) endy_args = [IntArg('endy', tile.y + tile.height) for tile in tiles] endy_arg = ArgList('endy', endy_args) args.append(endy_arg) self.shader = Shader(code=code, args=args, name='generate_sample', func_args=func_args, is_func=True)
def isect_shader(cls): code = """ temp = ray.origin - sphere.origin r_dir = ray.direction a = dot(r_dir, r_dir) b = dot(temp, r_dir) * 2.0 c = dot(temp, temp) - sphere.radius * sphere.radius disc = b * b - 4.0 * a * c if disc < 0.0: return 0 e = sqrt(disc) denom = 2.0 * a t = (-1.0 * b - e) / denom if t > 0.0005: if t < min_dist: normal = (temp + r_dir * t) * (1.0 / sphere.radius) hit = ray.origin + r_dir * t hitpoint.t = t hitpoint.normal = normal hitpoint.hit = hit hitpoint.mat_idx = sphere.mat_idx hitpoint.u = 0.0 hitpoint.v = 0.0 return 1 t = (-1.0 * b + e) / denom if t > 0.0005: if t < min_dist: normal = (temp + r_dir * t) * (1.0 / sphere.radius) hit = ray.origin + r_dir * t hitpoint.t = t hitpoint.normal = normal hitpoint.hit = hit hitpoint.mat_idx = sphere.mat_idx hitpoint.u = 0.0 hitpoint.v = 0.0 return 1 return 0 """ args = [] origin = Vector3(0.0, 0.0, 0.0) direction = Vector3(0.0, 0.0, 0.0) ray = Ray(origin, direction) hitpoint = HitPoint(0.0, Vector3(0.0, 0.0, 0.0), Vector3(0.0, 0.0, 0.0), 0, 0.0, 0.0) sphere = Sphere(Vector3(0.0, 0.0, 0.0), 0.0, 0) func_args = [ StructArgPtr('ray', ray), StructArgPtr('sphere', sphere), StructArgPtr('hitpoint', hitpoint), FloatArg('min_dist', 0.0) ] shader = Shader(code=code, args=args, name='isect_sphere', func_args=func_args, is_func=True) return shader