Пример #1
0
    def test_assign1(self):

        code = """
v2[1] = v1[0]
p1.position[2] = p1.size[0]

        """
        p1 = Point(Vector3(2.2, 4.4, 7.7), Vector2(3.3, 5.5),
                   Vector4(1.1, 2.2, 3.3, 4.4))
        props = {
            'v1': Vector2(8.3, 6.0),
            'v2': Vector3(5.6, 3.3, 2.2),
            'v3': Vector4(4.4, 6.6, 2.2, 9.9),
            'ret': 0.0,
            'p1': p1
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val1 = bs.shader.get_value('v2')
        val2 = bs.shader.get_value('v1')
        self.assertAlmostEqual(val1.y, val2.x, places=5)
        val1 = bs.shader.get_value('p1.position')
        val2 = bs.shader.get_value('p1.size')
        self.assertAlmostEqual(val1.z, val2.x, places=5)
Пример #2
0
def random_ray(ds):
    origin = Vector3(0.0, 0.0, 0.0)
    direction = Vector3(random(), random(), random())
    direction.normalize()
    ray = Ray(origin, direction)
    ray_ds(ds, ray, 'ray1')
    return ray
Пример #3
0
    def test_min(self):

        code = """
ret = min(v1, v2)
ret2 = min(r1, r2)
        """
        v1 = Vector3(0.3, 0.2, 0.4)
        v2 = Vector3(0.1, 0.2, 0.5)
        ret = Vector3(0.0, 0.0, 0.0)
        r1 = 0.3
        r2 = 0.6
        ret2 = 0.0

        props = {'ret':ret, 'v1':v1, 'v2':v2, 'r1':r1, 'r2':r2,
                'ret2':ret2}
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('ret')
        self.assertAlmostEqual(val.x, min(v1.x, v2.x), 5)
        self.assertAlmostEqual(val.y, min(v1.y, v2.y), 5)
        self.assertAlmostEqual(val.z, min(v1.z, v2.z), 5)
        
        val = bs.shader.get_value('ret2')
        self.assertAlmostEqual(val, min(r1, r2), 5)
Пример #4
0
    def test_arith1(self):

        code = """
r1 = a1 + a2
r2 = a1 * a2 
r3 = a4 * (0.5, 0.5)
r4 = a5 / (0.5, 0.5, 0.5)
r5 = (7,7,7,7) + a6 
r6 = a3 / 3
r7 = a7 % 18
        """
        props = {
            'a1': 1.1,
            'a2': 2.2,
            'r1': 1.1,
            'r2': 3.3,
            'a3': 55,
            'a4': Vector2(2.2, 4),
            'a5': Vector3(5, 6, 7),
            'a6': Vector4(3, 4, 5, 6),
            'r3': Vector2(3, 4),
            'r4': Vector3(1, 1, 1),
            'r5': Vector4(11, 1, 1, 1),
            'r6': 88,
            'a7': 789,
            'r7': 1
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('r1')
        self.assertAlmostEqual(val, 2.2 + 1.1, places=5)
        val = bs.shader.get_value('r2')
        self.assertAlmostEqual(val, 1.1 * 2.2, places=5)
        val = bs.shader.get_value('r3')
        self.assertAlmostEqual(val.x, 2.2 * 0.5, places=5)
        self.assertAlmostEqual(val.y, 4.0 * 0.5, places=5)
        val = bs.shader.get_value('r4')
        self.assertAlmostEqual(val.x, 5 * 2.0, places=5)
        self.assertAlmostEqual(val.y, 6 * 2.0, places=5)
        self.assertAlmostEqual(val.z, 7 * 2.0, places=5)
        val = bs.shader.get_value('r5')
        self.assertAlmostEqual(val.x, 7 + 3.0, places=5)
        self.assertAlmostEqual(val.y, 7 + 4.0, places=5)
        self.assertAlmostEqual(val.z, 7 + 5.0, places=5)
        self.assertAlmostEqual(val.w, 7 + 6.0, places=5)
        val = bs.shader.get_value('r6')
        self.assertEqual(val, 55 // 3)
        val = bs.shader.get_value('r7')
        self.assertEqual(val, 789 % 18)
Пример #5
0
    def _calc_sun_position(self):

        t1 = 0.170 * sin(4 * pi * (self._jd - 80) / 373.0)
        t2 = -0.129 * sin(2 * pi * (self._jd - 8) / 355.0)
        t3 = (self._sm - self._longitude) / 15.0

        solar_time = self._time_of_day + t1 + t2 + t3

        solar_declination = 0.4093 * sin(2 * pi * (self._jd - 81) / 368.0)

        solar_altitude = asin(
            sin(radians(self._latitude)) * sin(solar_declination) -
            cos(radians(self._latitude)) * cos(solar_declination) *
            cos(pi * solar_time / 12.0))

        self._theta_sun = theta_sun = pi / 2.0 - solar_altitude

        opp = -cos(solar_declination) * sin(pi * solar_time / 12.0)
        adj = -cos(radians(self._latitude)) * sin(solar_declination) + sin(
            radians(self._latitude)) * cos(solar_declination) * cos(
                pi * solar_time / 12.0)

        solar_azimuth = atan2(opp, adj)

        self._phi_sun = phi_sun = -solar_azimuth

        self._dir_to_sun = Vector3(
            cos(phi_sun) * sin(theta_sun),
            sin(phi_sun) * sin(theta_sun), cos(theta_sun))
Пример #6
0
    def math_fun_test(self, fun, py_fun):
        num = random()
        nums = (random(), random())

        line1 = "ret = %s(%f)\n" % (fun, num)
        line2 = "ret2 = %s((%f, %f))\n" % (fun, nums[0], nums[1])
        code = line1 + line2

        props = {
            'ret': 1.1,
            'ret2': Vector2(2.2, 4),
            'ret3': Vector3(5, 6, 7),
            'ret4': Vector4(11, 1, 1, 1)
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        val = bs.shader.get_value('ret')
        self.assertAlmostEqual(val, py_fun(num), places=3)
        val = bs.shader.get_value('ret2')
        self.assertAlmostEqual(val.x, py_fun(nums[0]), places=3)
        self.assertAlmostEqual(val.y, py_fun(nums[1]), places=3)
Пример #7
0
    def test_pow(self):
        code = """
ret = pow(1.4, 4.4)
ret2 = pow((1.1, 1.25), (2.1, 3.1))
ret3 = pow((1.3, 1.7, 1.8), (1.11, 2.11, 1.45))
ret4 = pow((1.9, 1.15, 2.11, 2.22), (1.77, 2.21, 2.5, 2.71))
        """
        props = {
            'ret': 1.1,
            'ret2': Vector2(2.2, 4),
            'ret3': Vector3(5, 6, 7),
            'ret4': Vector4(11, 1, 1, 1)
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('ret')
        self.assertAlmostEqual(val, pow(1.4, 4.4), places=3)
        val = bs.shader.get_value('ret2')
        self.assertAlmostEqual(val.x, pow(1.1, 2.1), places=3)
        self.assertAlmostEqual(val.y, pow(1.25, 3.1), places=3)
        val = bs.shader.get_value('ret3')
        self.assertAlmostEqual(val.x, pow(1.3, 1.11), places=3)
        self.assertAlmostEqual(val.y, pow(1.7, 2.11), places=3)
        self.assertAlmostEqual(val.z, pow(1.8, 1.45), places=3)
        val = bs.shader.get_value('ret4')
        self.assertAlmostEqual(val.x, pow(1.9, 1.77), places=3)
        self.assertAlmostEqual(val.y, pow(1.15, 2.21), places=3)
        self.assertAlmostEqual(val.z, pow(2.11, 2.5), places=3)
        self.assertAlmostEqual(val.w, pow(2.22, 2.71), places=3)
Пример #8
0
    def test_arith2(self):

        code = """
r1 = a1 + 5
r2 = 4 * a2

r3 = 8 * a4
r4 = a5 * 1.1

r5 = a6 * 0.5

        """
        props = {
            'a1': 1.1,
            'a2': 2.2,
            'r1': 1.1,
            'r2': 3.3,
            'a3': 55,
            'a4': Vector2(2.2, 4),
            'a5': Vector3(5, 6, 7),
            'a6': Vector4(3, 4, 5, 6),
            'r3': Vector2(3, 4),
            'r4': Vector3(1, 1, 1),
            'r5': Vector4(11, 1, 1, 1)
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('r1')
        self.assertAlmostEqual(val, 1.1 + 5, places=5)
        val = bs.shader.get_value('r2')
        self.assertAlmostEqual(val, 4 * 2.2, places=5)
        val = bs.shader.get_value('r3')
        self.assertAlmostEqual(val.x, 8 * 2.2, places=5)
        self.assertAlmostEqual(val.y, 8 * 4.0, places=5)
        val = bs.shader.get_value('r4')
        self.assertAlmostEqual(val.x, 1.1 * 5, places=5)
        self.assertAlmostEqual(val.y, 1.1 * 6, places=5)
        self.assertAlmostEqual(val.z, 1.1 * 7, places=5)
        val = bs.shader.get_value('r5')
        self.assertAlmostEqual(val.x, 0.5 * 3, places=5)
        self.assertAlmostEqual(val.y, 0.5 * 4, places=5)
        self.assertAlmostEqual(val.z, 0.5 * 5, places=5)
        self.assertAlmostEqual(val.w, 0.5 * 6, places=5)
Пример #9
0
    def test_isect1(self):
        direction = Vector3(-1.0, -1.0, -1.0)
        direction.normalize()
        ray = Ray(Vector3(5.0, 5.0, 5.0), direction)
        sphere = Sphere(Vector3(0.0, 0.0, 0.0), 2)

        runtime = Runtime()
        assembler = create_assembler()
        sphere.isect_asm([runtime], "ray_sphere_intersection")
        mc = assembler.assemble(self.asm_code())
        ds = runtime.load("test", mc)

        self.intersect(ray, sphere, runtime, ds)
        for i in range(100):
            r = self.random_ray()
            s = self.random_sphere()
            self.intersect(r, s, runtime, ds)
Пример #10
0
    def test_arith1(self):

        code = """
ret = dot(v1, v2)
        """
        v1 = Vector3(0.3, 0.2, 0.4)
        v2 = Vector3(0.1, 0.2, 0.5)
        props = {'ret':0.0, 'v1':v1, 'v2':v2}
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('ret')
        val2 = v1.dot(v2)
        self.assertAlmostEqual(val, val2, 4)
Пример #11
0
    def test_assign1(self):

        code = """
shadepoint.light_intensity = spectrum(0.25)

sample = sample_hemisphere()
sample = (0.6, 0.4, 0.8)
#w = hitpoint.normal 

w = (2.3, 2.5, 8.8)
w = normalize(w)
tv = (0.0034, 1.0, 0.0071)
v = cross(tv, w)
v = normalize(v)
u = cross(v, w)
ndir = u * sample[0] + v * sample[1] + w * sample[2]
shadepoint.wi = normalize(ndir)

shadepoint.pdf = dot(w, shadepoint.wi) * 0.318309886

        """
        props = {}
        col_mgr = ColorManager(spectral=True)
        brdf = SurfaceShader(code, props, col_mgr=col_mgr)
        mat = Material(bsdf=brdf)
        mgr = MaterialManager()
        mgr.add('blue_velvet', mat)
        runtime = Runtime()
        runtime2 = Runtime()
        runtimes = [runtime, runtime2]

        #bs.prepare([runtime])
        shader = mgr.prepare_bsdf('brdf', runtimes)
        #print (bs.shader._code)

        #bs.execute()
        sh = ShadePoint()
        code = """
hp = Hitpoint()
sp = Shadepoint()
brdf(hp, sp, 0)
spec = sp.light_intensity
wi = sp.wi
pdf = sp.pdf
        """
        wi = Vector3(2, 2, 2)
        spec = col_mgr.black()
        props = {'spec': spec, 'wi': wi, 'pdf': 0.0}
        bs = BasicShader(code, props, col_mgr=col_mgr)
        bs.prepare(runtimes, shaders=[shader])
        print (bs.shader._code)

        bs.execute()

        print(bs.shader.get_value('spec'))
        print(bs.shader.get_value('wi'))
        print(bs.shader.get_value('pdf'))
        print(next_direction())
Пример #12
0
    def test_assign1(self):

        code = """
m1 = 77
a = m1
m1 = -45
b = m1
m1 = 3.4
c = m1
m1 = -8.8
d = m1
m1 = (-8, 5.1)
e = m1
m1 = (-1, 2.25, 7)
f = m1
m1 = (8, -2.33, -7, 1)
k = m1
        """
        props = {
            'aa': 333,
            'a': 111,
            'b': 250,
            'c': 4.4,
            'd': 1.1,
            'e': Vector2(2.3, 6.0),
            'f': Vector3(5.6, 3.3, 2.2),
            'k': Vector4(4.4, 6.6, 2.2, 9.9)
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        val = bs.shader.get_value('a')
        self.assertEqual(77, val)
        val = bs.shader.get_value('b')
        self.assertEqual(-45, val)
        val = bs.shader.get_value('c')
        self.assertAlmostEqual(val, 3.4, places=5)
        val = bs.shader.get_value('d')
        self.assertAlmostEqual(val, -8.8, places=5)

        val = bs.shader.get_value('e')
        self.assertAlmostEqual(val.x, -8.0, places=5)
        self.assertAlmostEqual(val.y, 5.1, places=5)

        val = bs.shader.get_value('f')
        self.assertAlmostEqual(val.x, -1.0, places=5)
        self.assertAlmostEqual(val.y, 2.25, places=5)
        self.assertAlmostEqual(val.z, 7.0, places=5)

        val = bs.shader.get_value('k')
        self.assertAlmostEqual(val.x, 8.0, places=5)
        self.assertAlmostEqual(val.y, -2.33, places=5)
        self.assertAlmostEqual(val.z, -7.0, places=5)
        self.assertAlmostEqual(val.w, 1.0, places=5)
Пример #13
0
def gen_vectors():
    v0 = Vector3(random() * 3, random() * 3, random() * 3)
    v1 = Vector3(random() * 3, random() * 3, random() * 3)
    v2 = Vector3(random(), random(), random())
    origin = Vector3(0, 0, 0)
    direction = Vector3(random(), random(), random())
    direction.normalize()

    v0 = Vector3(2.2, 4.4, 6.6)
    v1 = Vector3(1.1, 1.1, 1.1)
    v2 = Vector3(5.1, -1.1, 5.1)

    origin = Vector3(0.0, 0.0, 0.0)
    direction = Vector3(3.0, 3.0,
                        3.02)  #3.00 -- precission problem investigate
    direction.normalize()

    return (v0, v1, v2, origin, direction)
Пример #14
0
    def test_arith1(self):

        code = """
ret = cross(v1, v2)
        """
        v1 = Vector3(0.32, 0.27, 0.45)
        v2 = Vector3(0.111, 0.22, 0.533)
        ret = Vector3(0.1, 0.2, 0.5)
        props = {'ret':ret, 'v1':v1, 'v2':v2}
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('ret')
        val2 = v1.cross(v2)
        self.assertAlmostEqual(val.x, val2.x, 4)
        self.assertAlmostEqual(val.y, val2.y, 4)
        self.assertAlmostEqual(val.z, val2.z, 4)
Пример #15
0
def next_direction():
    w = Vector3(2.3, 2.5, 8.8)
    w.normalize()

    #w = hitpoint.normal
    tv = Vector3(0.0034, 1.0, 0.0071)
    v = tv.cross(w)
    v.normalize()
    u = v.cross(w)

    pu = 0.6
    pv = 0.4
    pw = 0.8

    ndir = u * pu + v * pv + w * pw 
    ndir.normalize()

    pdf = w.dot(ndir) * 0.318309886

    return ndir, pdf
Пример #16
0
    def test_isect_b(self):
        point = Vector3(0.0, 0.0, 55.92)
        e1 = Vector3(55.28, 0.0, 0.0)
        e2 = Vector3(0.0, 54.88, 0.0)
        normal = Vector3(0.0, 0.0, -1.0)
        rectangle = Rectangle(point, e1, e2, normal)

        origin = Vector3(3.0, 2.5, 0.0)
        direction = Vector3(0.0, 0.1, 0.88)
        direction.normalize()
        ray = Ray(origin, direction)

        runtime = Runtime()
        rectangle.isect_asm_b([runtime], "ray_rectangle_intersection")

        assembler = create_assembler()
        mc = assembler.assemble(self.asm_code_bool())
        ds = runtime.load("test", mc)

        Ray.populate_ds(ds, ray, 'ray1')
        Rectangle.populate_ds(ds, rectangle, 'rec1')

        runtime.run("test")
        hp = rectangle.isect(ray)

        if hp is False: self.assertFalse(ds["ret"] != 0)
        if ds["ret"] == 0: self.assertFalse(hp)
Пример #17
0
    def test_const1(self):
        pass

        code = """
a = 555
b = -36
c = 2.3
d = -9.8
e = (2.3, 5)
f = (2.2, 4.77, -2.66)
k = (-1.23, 1.44, 9, 7.7)
        """

        props = {
            'a': 111,
            'b': 250,
            'c': 4.4,
            'd': 1.1,
            'e': Vector2(2.3, 6.0),
            'f': Vector3(5.6, 3.3, 2.2),
            'k': Vector4(4.4, 6.6, 2.2, 9.9)
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('a')
        val2 = bs.shader.get_value('b')
        val3 = bs.shader.get_value('c')
        val4 = bs.shader.get_value('d')
        self.assertEqual(555, val)
        self.assertEqual(-36, val2)
        self.assertAlmostEqual(val3, 2.3, places=5)
        self.assertAlmostEqual(val4, -9.8, places=5)

        val5 = bs.shader.get_value('e')
        self.assertAlmostEqual(val5.x, 2.3, places=5)
        self.assertAlmostEqual(val5.y, 5.0, places=5)

        val6 = bs.shader.get_value('f')
        self.assertAlmostEqual(val6.x, 2.2, places=5)
        self.assertAlmostEqual(val6.y, 4.77, places=5)
        self.assertAlmostEqual(val6.z, -2.66, places=5)

        val7 = bs.shader.get_value('k')
        self.assertAlmostEqual(val7.x, -1.23, places=5)
        self.assertAlmostEqual(val7.y, 1.44, places=5)
        self.assertAlmostEqual(val7.z, 9.0, places=5)
        self.assertAlmostEqual(val7.w, 7.7, places=5)
Пример #18
0
    def test_arith1(self):

        code = """
r1 = a1 + a3 * 8.0
r4 = a5 - 0.2 * (8, 8, 8)

        """
        props = {'a1':1.1, 'a2':2.2, 'r1':1.1, 'r2':3.3,
                'a3':55, 'a4':Vector2(2.2, 4), 'a5':Vector3(5,6,7),
                'a6':Vector4(3,4,5,6), 'r3':Vector2(3,4), 'r4':Vector3(1,1,1),
                'r5':Vector4(11,1,1,1), 'r6':88, 'a7':789, 'r7':1}
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        val = bs.shader.get_value('r1')
        self.assertAlmostEqual(val, 1.1 + 55 * 8.0, places=4)
        val = bs.shader.get_value('r4')
        self.assertAlmostEqual(val.x, 5 - 0.2 * 8, places=4)
        self.assertAlmostEqual(val.y, 6 - 0.2 * 8, places=4)
        self.assertAlmostEqual(val.z, 7 - 0.2 * 8, places=4)
Пример #19
0
    def test_assign2(self):
        register_user_type(Point)
        p1 = Point(33, 77, 99, 3.5, Vector3(2.2, 4.4, 7.7), Vector2(3.3, 5.5),
                   Vector4(1.1, 2.2, 3.3, 4.4))
        code = """
idx = p1.idx
p1.x = 55
pp = 555
p1.y = pp
g = 4.8
p1.radius = g
g = (4,5,6)
p1.position = g
p1.size = (6,7)
p1.pp = (8,1,3,4)

        """
        props = {'p1': p1, 'idx': 44}
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        val = bs.shader.get_value('idx')
        self.assertEqual(33, val)
        val = bs.shader.get_value('p1.x')
        self.assertEqual(55, val)
        val = bs.shader.get_value('p1.y')
        self.assertEqual(555, val)
        val = bs.shader.get_value('p1.radius')
        self.assertAlmostEqual(val, 4.8, places=5)
        val = bs.shader.get_value('p1.position')
        self.assertAlmostEqual(val.x, 4.0, places=5)
        self.assertAlmostEqual(val.y, 5.0, places=5)
        self.assertAlmostEqual(val.z, 6.0, places=5)
        val = bs.shader.get_value('p1.size')
        self.assertAlmostEqual(val.x, 6.0, places=5)
        self.assertAlmostEqual(val.y, 7.0, places=5)
        val = bs.shader.get_value('p1.pp')
        self.assertAlmostEqual(val.x, 8.0, places=5)
        self.assertAlmostEqual(val.y, 1.0, places=5)
        self.assertAlmostEqual(val.z, 3.0, places=5)
        self.assertAlmostEqual(val.w, 4.0, places=5)
Пример #20
0
    def test_float1(self):
        v = Vector2(1, 1)
        v2 = Vector2(1, 1)
        v3 = Vector3(1, 1, 1)
        v4 = Vector4(1, 1, 1, 1)

        code = """
ret = float2(5,6)
ret2 = float2(aa, bb)
ret3 = float3(8,9.5,3)
temp = (8,9,1,2)
ret4 = float4(temp[1],5.3,6, aa)
        """
        props = {
            'aa': 3.4,
            'bb': 77,
            'ret': v,
            'ret2': v2,
            'ret3': v3,
            'ret4': v4
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('ret')
        self.assertAlmostEqual(val.x, 5.0, places=5)
        self.assertAlmostEqual(val.y, 6.0, places=5)
        val = bs.shader.get_value('ret2')
        self.assertAlmostEqual(val.x, 3.4, places=5)
        self.assertAlmostEqual(val.y, 77.0, places=5)
        val = bs.shader.get_value('ret3')
        self.assertAlmostEqual(val.x, 8.0, places=5)
        self.assertAlmostEqual(val.y, 9.5, places=5)
        self.assertAlmostEqual(val.z, 3.0, places=5)
        val = bs.shader.get_value('ret4')
        self.assertAlmostEqual(val.x, 9.0, places=5)
        self.assertAlmostEqual(val.y, 5.3, places=5)
        self.assertAlmostEqual(val.z, 6.0, places=5)
        self.assertAlmostEqual(val.w, 3.4, places=5)
Пример #21
0
    def get_sky_spectrum(self, direction):
        d = direction
        if d.y < 0.0:
            return self._col_mgr.black()
        if d.y < 0.001:
            d = Vector3(d.x, 0.001, d.z)
            d.normalize()

        theta = acos(d.y)
        phi = atan2(d.x, d.z)
        if phi < 0.0:
            phi = phi + 2 * pi

        gamma = self._angle_beetween(theta, phi, self._theta_sun,
                                     self._phi_sun)
        x = self._perez_function(self._perez_x, theta, gamma, self._zenith_x)
        y = self._perez_function(self._perez_y, theta, gamma, self._zenith_y)
        Y = self._perez_function(self._perez_Y, theta, gamma, self._zenith_Y)
        spec = self._col_mgr.chromacity_to_spectrum(x, y)
        spec = spec * (Y / self._col_mgr.Y(spec))
        return spec
Пример #22
0
    def test_rgb_to_spec2(self):

        code = """
spec1 = rgb_to_spectrum(vec)

        """
        vec = Vector3(0.2, 0.3, 0.2)
        col_mgr = ColorManager(spectral=True)
        rgb = col_mgr.black()
        props = {'spec1': rgb, 'vec': vec}
        bs = BasicShader(code, props, col_mgr=col_mgr)

        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        val = bs.shader.get_value('spec1')
        val2 = col_mgr.create_spectrum((0.2, 0.3, 0.2), illum=False)
        for i in range(len(val2.samples)):
            self.assertAlmostEqual(val.samples[i], val2.samples[i], places=5)
Пример #23
0
    def test_atanr2(self):
        code = """
ret = atanr2(1.4, 4.4)
ret2 = atanr2((1.1, 1.25), (2.1, 3.1))
        """
        props = {
            'ret': 1.1,
            'ret2': Vector2(2.2, 4),
            'ret3': Vector3(5, 6, 7),
            'ret4': Vector4(11, 1, 1, 1)
        }
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()
        val = bs.shader.get_value('ret')
        self.assertAlmostEqual(val, math.atan2(1.4, 1.0 / 4.4), places=3)
        val = bs.shader.get_value('ret2')
        self.assertAlmostEqual(val.x, math.atan2(1.1, 1.0 / 2.1), places=3)
        self.assertAlmostEqual(val.y, math.atan2(1.25, 1.0 / 3.1), places=3)
Пример #24
0
    def test_sampled_spec_to_rgb(self):

        code = """
vec = spectrum_to_rgb(spec1)
        """
        col_mgr = ColorManager(spectral=True)
        rgb = col_mgr.create_spectrum((0.2, 0.3, 0.2))

        vec = Vector3(0.0, 0.0, 0.0)
        props = {'spec1': rgb, 'vec': vec}
        bs = BasicShader(code, props, col_mgr=col_mgr)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        val = bs.shader.get_value('vec')
        val2 = col_mgr.to_RGB(rgb)
        self.assertAlmostEqual(val.x, val2.r, places=5)
        self.assertAlmostEqual(val.y, val2.g, places=5)
        self.assertAlmostEqual(val.z, val2.b, places=5)
Пример #25
0
    def test_lum1(self):
        code = """
ret1 = luminance(v1)
ret2 = luminance(v2)
        """
        v1 = Vector3(0.2, 0.3, 0.4)
        v2 = Vector4(0.4, 0.1, 0.2, 0.5)
        props = {'v1': v1, 'v2': v2, 'ret1': 0.0, 'ret2': 0.0}
        bs = BasicShader(code, props)
        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        lum1 = v1.x * 0.2126 + v1.y * 0.7152 + v1.z * 0.0722
        lum2 = bs.shader.get_value('ret1')
        lum3 = v2.x * 0.2126 + v2.y * 0.7152 + v2.z * 0.0722
        lum4 = bs.shader.get_value('ret2')

        self.assertAlmostEqual(lum1, lum2, places=5)
        self.assertAlmostEqual(lum3, lum4, places=5)
Пример #26
0
    def test_rgb_to_spec(self):

        code = """
spec1 = rgb_to_spectrum(vec)

        """
        rgb = RGBSpectrum(0.0, 0.0, 0.0)
        vec = Vector3(0.2, 0.3, 0.2)
        props = {'spec1': rgb, 'vec': vec}
        col_mgr = ColorManager(spectral=False)
        bs = BasicShader(code, props, col_mgr=col_mgr)

        runtime = Runtime()
        bs.prepare([runtime])
        #print (bs.shader._code)

        bs.execute()

        val = bs.shader.get_value('spec1')
        self.assertAlmostEqual(vec.x, val.r, places=5)
        self.assertAlmostEqual(vec.y, val.g, places=5)
        self.assertAlmostEqual(vec.z, val.b, places=5)
Пример #27
0
def fetch_triangle(mesh, index):
    v0, v1, v2 = mesh.get_indices(index)
    p0 = mesh.get_point(v0)
    p0 = Vector3(p0[0], p0[1], p0[2])
    p1 = mesh.get_point(v1)
    p1 = Vector3(p1[0], p1[1], p1[2])
    p2 = mesh.get_point(v2)
    p2 = Vector3(p2[0], p2[1], p2[2])
    if mesh.has_normals():
        n0 = mesh.get_normal(v0)
        n0 = Vector3(n0[0], n0[1], n0[2])
        n1 = mesh.get_normal(v1)
        n1 = Vector3(n1[0], n1[1], n1[2])
        n2 = mesh.get_normal(v2)
        n2 = Vector3(n2[0], n2[1], n2[2])
    else:
        n0 = n1 = n2 = None
    if mesh.has_uv():
        uv0 = mesh.get_uv(v0)
        uv1 = mesh.get_uv(v1)
        uv2 = mesh.get_uv(v2)
        tu0 = uv0[0]
        tv0 = uv0[1]
        tu1 = uv1[0]
        tv1 = uv1[1]
        tu2 = uv2[0]
        tv2 = uv2[1]
    else:
        tu0 = tv0 = tu1 = tv1 = tu2 = tv2 = None
    tri = Triangle(p0,
                   p1,
                   p2,
                   mesh.material_idx,
                   n0=n0,
                   n1=n1,
                   n2=n2,
                   tu0=tu0,
                   tv0=tv0,
                   tu1=tu1,
                   tv1=tv1,
                   tu2=tu2,
                   tv2=tv2)
    #tri = Triangle(p0, p1, p2, mesh.material_idx, n0=n0, n1=n1, n2=n2)
    return tri
Пример #28
0
    def test_isect1(self):
        point = Vector3(0.0, 0.0, 55.92)
        e1 = Vector3(55.28, 0.0, 0.0)
        e2 = Vector3(0.0, 54.88, 0.0)
        normal = Vector3(0.0, 0.0, -1.0)
        rectangle = Rectangle(point, e1, e2, normal)

        origin = Vector3(3.0, 2.5, 0.0)
        direction = Vector3(0.0, 0.1, 0.88)
        direction.normalize()
        ray = Ray(origin, direction)

        runtime = Runtime()
        rectangle.isect_asm([runtime], "ray_rectangle_intersection")

        assembler = create_assembler()
        mc = assembler.assemble(self.asm_code())
        ds = runtime.load("test", mc)

        self.intersect(ray, rectangle, runtime, ds)
Пример #29
0
def create_triangle(v0,
                    v1,
                    v2,
                    n0=None,
                    n1=None,
                    n2=None,
                    uv0=None,
                    uv1=None,
                    uv2=None):

    p0 = Vector3(v0[0], v0[1], v0[2])
    p1 = Vector3(v1[0], v1[1], v1[2])
    p2 = Vector3(v2[0], v2[1], v2[2])
    if n0 is not None:
        n0 = Vector3(n0[0], n0[1], n0[2])
        n1 = Vector3(n1[0], n1[1], n1[2])
        n2 = Vector3(n2[0], n2[1], n2[2])
    if uv0 is not None:
        tu0, tv0 = uv0
        tu1, tv1 = uv1
        tu2, tv2 = uv2
    else:
        tu0 = tv0 = tu1 = tv1 = tu2 = tv2 = None

    t = Triangle(p0,
                 p1,
                 p2,
                 n0=n0,
                 n1=n1,
                 n2=n2,
                 tu0=tu0,
                 tv0=tv0,
                 tu1=tu1,
                 tv1=tv1,
                 tu2=tu2,
                 tv2=tv2)
    return t
Пример #30
0
from renmas3.base import Vector3
from renmas3.shapes import ShapeManager, Triangle

v0 = Vector3(2.2, 4.4, 6.6)
v1 = Vector3(1.1, 1.1, 1.1)
v2 = Vector3(5.1, -1.1, 5.1)

t = Triangle(v0, v1, v2)
t2 = Triangle(v0, v1, v2)

mgr = ShapeManager()
mgr.add('t1', t)
mgr.add('t2', t2)

print(mgr.address_info(t))

for s in mgr:
    print (s)