Esempio n. 1
0
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))
Esempio n. 2
0
        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)
Esempio n. 3
0
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

Esempio n. 4
0
        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)
Esempio n. 5
0
        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)
Esempio n. 6
0

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))
Esempio n. 7
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))
Esempio n. 8
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())
Esempio n. 9
0
        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)
Esempio n. 10
0
        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)