def register_shadepoint_class(spectrum): spec_arg = arg_from_value('dummy_name', spectrum) register_struct(ShadePoint, 'ShadePoint', fields=[ ('wo', Vec3Arg), ('wi', Vec3Arg), ('light_intensity', type(spec_arg)), ('light_position', Vec3Arg), ('material_reflectance', type(spec_arg)), ('pdf', FloatArg), ('light_normal', Vec3Arg), ('light_pdf', FloatArg), ('material_emission', type(spec_arg)), ('specular_bounce', IntArg)], factory=lambda: ShadePoint.factory(spectrum))
p0X = self.origin.x - self.radius - epsilon p0Y = self.origin.y - self.radius - epsilon p0Z = self.origin.z - self.radius - epsilon p1X = self.origin.x + self.radius + epsilon p1Y = self.origin.y + self.radius + epsilon p1Z = self.origin.z + self.radius + epsilon p0 = Vector3(p0X, p0Y, p0Z) p1 = Vector3(p1X, p1Y, p1Z) return BBox(p0, p1) def output(self, directory, relative_name): typ = 'type = Sphere\n' radius = 'radius = %f\n' % self.radius o = self.origin origin = 'origin = %f, %f, %f\n' % (o.x, o.y, o.z) return typ + radius + origin @classmethod def factory(cls): return Sphere(Vector3(0.0, 0.0, 0.0), 0.0, 0) register_struct(Sphere, 'Sphere', fields=[('origin', Vec3Arg), ('radius', FloatArg), ('mat_idx', IntArg), ('light_id', IntArg)], factory=Sphere.factory)
from tdasm import Runtime from sdl import Shader, StructArgPtr, StructArg, ArgList, register_struct,\ IntArg, FloatArg from .sample import Sample class Tile2D: def __init__(self, x, y, width, height): self.x = x self.y = y self.width = width self.height = height register_struct(Tile2D, 'Tile2D', fields=[('x', IntArg), ('y', IntArg), ('width', IntArg), ('height', IntArg)], factory=lambda: Tile2D(0, 0, 1, 1)) def create_tiles(width, height, nthreads): hp = int(float(height) / nthreads) + 1 lst_tiles = [] for k in range(0, height, hp): nh = hp if k > height - hp: nh = height - k lst_tiles.append(Tile2D(0, k, width, nh)) return lst_tiles
p0 = Vector3(p0X, p0Y, p0Z) p1 = Vector3(p1X, p1Y, p1Z) return BBox(p0, p1) def output(self, directory, relative_name): e1 = self.edge_a e2 = self.edge_b n = self.normal typ = 'type = Rectangle\n' p = 'p = %f, %f, %f\n' % (self.point.x, self.point.y, self.point.z) e1 = 'edge_a = %f, %f, %f\n' % (e1.x, e1.y, e1.z) e2 = 'edge_b = %f, %f, %f\n' % (e2.x, e2.y, e2.z) normal = 'normal = %f, %f, %f\n' % (n.x, n.y, n.z) return typ + p + e1 + e2 + normal @classmethod def factory(cls): return Rectangle(Vector3(0.0, 0.0, 0.0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, 0.0, 1.0), Vector3(0.0, 1.0, 0.0), 0) register_struct(Rectangle, 'Rectangle', fields=[('point', Vec3Arg), ('edge_a', Vec3Arg), ('edge_b', Vec3Arg), ('normal', Vec3Arg), ('edge_a_squared', FloatArg), ('edge_b_squared', FloatArg), ('mat_idx', IntArg), ('light_id', IntArg)], factory=Rectangle.factory)
p1Z = max(p.z, p.z + ea.z, p.z + eb.z, p.z + ea.z + eb.z) + epsilon p0 = Vector3(p0X, p0Y, p0Z) p1 = Vector3(p1X, p1Y, p1Z) return BBox(p0, p1) def output(self, directory, relative_name): e1 = self.edge_a e2 = self.edge_b n = self.normal typ = 'type = Rectangle\n' p = 'p = %f, %f, %f\n' % (self.point.x, self.point.y, self.point.z) e1 = 'edge_a = %f, %f, %f\n' % (e1.x, e1.y, e1.z) e2 = 'edge_b = %f, %f, %f\n' % (e2.x, e2.y, e2.z) normal = 'normal = %f, %f, %f\n' % (n.x, n.y, n.z) return typ + p + e1 + e2 + normal @classmethod def factory(cls): return Rectangle(Vector3(0.0, 0.0, 0.0), Vector3(1.0, 0.0, 0.0), Vector3(0.0, 0.0, 1.0), Vector3(0.0, 1.0, 0.0), 0) register_struct(Rectangle, 'Rectangle', fields=[('point', Vec3Arg), ('edge_a', Vec3Arg), ('edge_b', Vec3Arg), ('normal', Vec3Arg), ('edge_a_squared', FloatArg), ('edge_b_squared', FloatArg), ('mat_idx', IntArg), ('light_id', IntArg)], factory=Rectangle.factory)
class Sample: __slots__ = ['x', 'y', 'px', 'py', 'ix', 'iy', 'weight'] def __init__(self, x, y, px, py, ix, iy, weight): self.x = x self.y = y self.px = px self.py = py self.ix = ix self.iy = iy self.weight = weight def __repr__(self): return 'x=%f y=%f px=%f py=%f ix=%i iy=%i weight=%f' % ( self.x, self.y, self.px, self.py, self.ix, self.iy, self.weight) @classmethod def factory(cls): return Sample(0.0, 0.0, 0.0, 0.0, 0, 0, 0.0) register_struct(Sample, 'Sample', fields=[('x', FloatArg), ('y', FloatArg), ('px', FloatArg), ('py', FloatArg), ('ix', IntArg), ('iy', IntArg), ('weight', FloatArg)], factory=lambda: Sample(0.0, 0.0, 0.0, 0.0, 0, 0, 0.0))
from sdl import register_struct, IntArg, FloatArg class Sample: __slots__ = ['x', 'y', 'px', 'py', 'ix', 'iy', 'weight'] def __init__(self, x, y, px, py, ix, iy, weight): self.x = x self.y = y self.px = px self.py = py self.ix = ix self.iy = iy self.weight = weight def __repr__(self): return 'x=%f y=%f px=%f py=%f ix=%i iy=%i weight=%f' % (self.x, self.y, self.px, self.py, self.ix, self.iy, self.weight) @classmethod def factory(cls): return Sample(0.0, 0.0, 0.0, 0.0, 0, 0, 0.0) register_struct(Sample, 'Sample', fields=[('x', FloatArg), ('y', FloatArg), ('px', FloatArg), ('py', FloatArg), ('ix', IntArg), ('iy', IntArg), ('weight', FloatArg)], factory=lambda: Sample(0.0, 0.0, 0.0, 0.0, 0, 0, 0.0))
from sdl import Vector3, IntArg, FloatArg, Vec3Arg, register_struct class HitPoint: __slots__ = ['t', 'hit', 'normal', 'mat_idx', 'u', 'v', 'light_id'] def __init__(self, t=0.0, hit=None, normal=None, mat_idx=0, u=0.0, v=0.0, light_id=-1): self.t = t self.hit = hit self.normal = normal self.mat_idx = mat_idx self.u = u self.v = v self.light_id = light_id @classmethod def factory(cls): return HitPoint(0.0, Vector3(0.0, 0.0, 0.0), Vector3(0.0, 0.0, 0.0), 0, 0.0, 0.0, -1) register_struct(HitPoint, 'HitPoint', fields=[('t', FloatArg), ('hit', Vec3Arg), ('normal', Vec3Arg), ('mat_idx', IntArg), ('u', FloatArg), ('v', FloatArg), ('light_id', IntArg)], factory=lambda: HitPoint.factory())
epsilon = 0.001 p0X = self.origin.x - self.radius - epsilon p0Y = self.origin.y - self.radius - epsilon p0Z = self.origin.z - self.radius - epsilon p1X = self.origin.x + self.radius + epsilon p1Y = self.origin.y + self.radius + epsilon p1Z = self.origin.z + self.radius + epsilon p0 = Vector3(p0X, p0Y, p0Z) p1 = Vector3(p1X, p1Y, p1Z) return BBox(p0, p1) def output(self, directory, relative_name): typ = 'type = Sphere\n' radius = 'radius = %f\n' % self.radius o = self.origin origin = 'origin = %f, %f, %f\n' % (o.x, o.y, o.z) return typ + radius + origin @classmethod def factory(cls): return Sphere(Vector3(0.0, 0.0, 0.0), 0.0, 0) register_struct(Sphere, 'Sphere', fields=[('origin', Vec3Arg), ('radius', FloatArg), ('mat_idx', IntArg), ('light_id', IntArg)], factory=Sphere.factory)
args = [] func_args = [StructArgPtr('ray', Ray.factory()), StructArgPtr('triangle', FlatTriangle.factory()), FloatArg('min_dist', 0.0)] shader = Shader(code=code, args=args, name=shader_name, func_args=func_args, is_func=True) isect_shader = DependencyShader(shader, [tri_isect]) return isect_shader def output(self, directory, relative_name): typ = 'type = Triangle\n' p0 = 'p0 = %f, %f, %f\n' % (self.p0.x, self.p0.y, self.p0.z) p1 = 'p1 = %f, %f, %f\n' % (self.p1.x, self.p1.y, self.p1.z) p2 = 'p2 = %f, %f, %f\n' % (self.p2.x, self.p2.y, self.p2.z) return typ + p0 + p1 + p2 @classmethod def factory(cls): triangle = FlatTriangle(Vector3(1.0, 0.0, 0.0), Vector3(0.0, 1.0, 0.0), Vector3(0.0, 0.0, 1.0), 0) return triangle register_struct(FlatTriangle, 'FlatTriangle', fields=[('p0', Vec3Arg), ('p1', Vec3Arg), ('p2', Vec3Arg), ('normal', Vec3Arg), ('mat_idx', IntArg), ('light_id', IntArg)], factory=FlatTriangle.factory)