def test_call(self): code = """ tmp = p1 + p2 + p3 p4.x = 55.99 return tmp """ p1 = FloatArg('p1', 2.0) p2 = IntArg('p2', 0) p3 = FloatArg('p3', 0.0) p4 = StructArgPtr('p4', TestPoint(4.4, 5.5)) shader = Shader(code=code, args=[], name='adding', func_args=[p1, p2, p3, p4], is_func=True) shader.compile() shader.prepare(self.runtimes) code2 = """ p1 = 44 p2 = 7 point = TestPoint() rez = adding(55.4, p1, p2, point) rez2 = point.x """ rez = FloatArg('rez', 11.33) rez2 = FloatArg('rez2', 1.0) shader2 = Shader(code=code2, args=[rez, rez2]) shader2.compile([shader]) shader2.prepare(self.runtimes) shader2.execute() rez = shader2.get_value('rez') rez2 = shader2.get_value('rez2') self.assertAlmostEqual(rez, 55.4 + 44 + 7, places=5) self.assertAlmostEqual(rez2, 55.99, places=5)
def test_float(self): code = """ temp = 5 p1 = float(temp) p2 = float(88) p3 = float() p4 = float(6.6) """ p1 = FloatArg('p1', 333.3) p2 = FloatArg('p2', 333.3) p3 = FloatArg('p3', 333.3) p4 = FloatArg('p4', 333.3) shader = Shader(code=code, args=[p1, p2, p3, p4]) shader.compile() shader.prepare([Runtime()]) shader.execute() p = shader.get_value('p1') self.assertAlmostEqual(p, 5.0) p = shader.get_value('p2') self.assertAlmostEqual(p, 88.0) p = shader.get_value('p3') self.assertAlmostEqual(p, 0.0) p = shader.get_value('p4') self.assertAlmostEqual(p, 6.6, places=6)
def test_arithmetic(self): code = """ a1 = 33 a2 = 22 p1 = a1 + a2 a1 = 22.3 a2 = 11.1 p2 = a1 + a2 a1 = 44 a2 = -2.36 p3 = a1 * a2 a1 = (2.3, 4) a2 = 5 p4 = a1 * a2 a1 = (3, 4, 6.6) a2 = (7, 4.3, 2.6) p5 = a1 - a2 a1 = (1, 4.1, 5.5, 9.9) a2 = (0.22, 3.3, 2.6, 6.6) p6 = a1 / a2 """ p1 = IntArg('p1', 33) p2 = FloatArg('p2', 55.5) p3 = FloatArg('p3', 55.5) p4 = Vec2Arg('p4', Vector2(0.0, 0.0)) p5 = Vec3Arg('p5', Vector3(0.0, 0.0, 0.0)) p6 = Vec4Arg('p6', Vector4(0.0, 0.0, 0.0, 0.0)) shader = Shader(code=code, args=[p1, p2, p3, p4, p5, p6]) shader.compile() shader.prepare([Runtime()]) shader.execute() rez = shader.get_value('p1') self.assertEqual(rez, 33 + 22) rez = shader.get_value('p2') self.assertAlmostEqual(rez, 22.3 + 11.1, places=5) rez = shader.get_value('p3') self.assertAlmostEqual(rez, 44 * -2.36, places=5) rez = shader.get_value('p4') self.assertAlmostEqual(rez.x, 5 * 2.3, places=5) self.assertAlmostEqual(rez.y, 5 * 4, places=5) rez = shader.get_value('p5') self.assertAlmostEqual(rez.x, 3 - 7.0, places=5) self.assertAlmostEqual(rez.y, 4 - 4.3, places=5) self.assertAlmostEqual(rez.z, 6.6 - 2.6, places=5) rez = shader.get_value('p6') self.assertAlmostEqual(rez.x, 1 / 0.22, places=5) self.assertAlmostEqual(rez.y, 4.1 / 3.3, places=5) self.assertAlmostEqual(rez.z, 5.5 / 2.6, places=5) self.assertAlmostEqual(rez.w, 9.9 / 6.6, places=5)
def test_array(self): p = SuperPoint(3.0, 4.0) arr = Array(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)
def test_sampled_lum(self): mgr = SampledManager() shader = lum_sampled_shader(mgr) shader.compile() runtime = Runtime() shader.prepare([runtime]) code = """ rez = lumminance(r1) """ vals = [(450, 0.13), (480, 0.45), (620, 0.58)] samples = create_samples(vals, 32, 400, 700) sam_spec = SampledSpectrum(samples) s = SampledArg('r1', sam_spec) rez = FloatArg('rez', 0.0) shader2 = Shader(code=code, args=[rez, s]) shader2.compile([shader]) shader2.prepare([runtime]) shader2.execute() val = shader2.get_value('rez') lum = mgr.lumminance(sam_spec) self.assertAlmostEqual(lum, val)
def sampled_to_vec_shader(col_mgr): code = """ x = cie_x * spec y = cie_y * spec z = cie_z * spec X = sum_samples(x) * scale Y = sum_samples(y) * scale Z = sum_samples(z) * scale r = 3.240479 * X - 1.537150 * Y - 0.498535 * Z g = -0.969256 * X + 1.875991 * Y + 0.041556 * Z b = 0.055648 * X - 0.204043 * Y + 1.057311 * Z return float3(r, g, b) """ spec = col_mgr.zero() spec_arg = SampledArgPtr('spec', 0, spec) scale = float(col_mgr.end - col_mgr.start) / (col_mgr.yint * col_mgr.nsamples) p1 = FloatArg('scale', scale) cie_x = SampledArg('cie_x', col_mgr._cie_x) cie_y = SampledArg('cie_y', col_mgr._cie_y) cie_z = SampledArg('cie_z', col_mgr._cie_z) shader = Shader(code=code, args=[p1, cie_x, cie_y, cie_z], name='spectrum_to_vec', func_args=[spec_arg], is_func=True) return shader
def test_con(self): code = """ a = 33 if a: p1 = 22 b = 22 if b > 15: p2 = 1.1 tmp = 4.4 tmp2 = 1.2 if tmp > tmp2: p3 = 2.2 tmp = 5.5 if tmp2 < tmp: p4 = 1.5 """ p1 = IntArg('p1', 55) p2 = FloatArg('p2', 4.4) p3 = FloatArg('p3', 9.4) p4 = FloatArg('p4', 2.4) shader = Shader(code=code, args=[p1, p2, p3, p4]) shader.compile() shader.prepare([Runtime()]) shader.execute() p = shader.get_value('p1') self.assertEqual(p, 22) p = shader.get_value('p2') self.assertAlmostEqual(p, 1.1) p = shader.get_value('p3') self.assertAlmostEqual(p, 2.2) p = shader.get_value('p4') self.assertAlmostEqual(p, 1.5)
def test_struct(self): code = """ a1 = MyPoint() tmp = 66 a1.x = tmp p1 = a1.x tmp = 4.4 a1.y = tmp p2 = a1.y tmp = (6, 7) a1.k = tmp p3 = a1.k tmp = (3, 4, 6) a1.m = tmp p4 = a1.m tmp = (2, 4, 6, 7) a1.p = tmp p5 = a1.p """ #p1 = IntArg('p1', 44) #TODO implicit conversion int to float p1 = IntArg('p1', 44) p2 = FloatArg('p2', 2.2) p3 = Vec2Arg('p3', Vector2(5.5, 7.7)) p4 = Vec3Arg('p4', Vector3(2.2, 2.2, 4.4)) p5 = Vec4Arg('p5', Vector4(8.8, 5.5, 3.3, 1.1)) shader = Shader(code=code, args=[p1, p2, p3, p4, p5]) shader.compile() shader.prepare([Runtime()]) shader.execute() v = shader.get_value('p1') self.assertEqual(v, 66) v = shader.get_value('p2') self.assertAlmostEqual(v, 4.4, places=6) v = shader.get_value('p3') self.assertAlmostEqual(v.x, 6.0, places=6) self.assertAlmostEqual(v.y, 7.0, places=6) v = shader.get_value('p4') self.assertAlmostEqual(v.x, 3.0, places=6) self.assertAlmostEqual(v.y, 4.0, places=6) self.assertAlmostEqual(v.z, 6.0, places=6) v = shader.get_value('p5') self.assertAlmostEqual(v.x, 2.0, places=6) self.assertAlmostEqual(v.y, 4.0, places=6) self.assertAlmostEqual(v.z, 6.0, places=6) self.assertAlmostEqual(v.w, 7.0, places=6)
def test_dot_fun(self): code = """ p3 = dot(p1, p2) """ v1 = Vector3(2.5, 1.8, 2.9) v2 = Vector3(2.2, 1.1, 5.22) p1 = Vec3Arg('p1', v1) p2 = Vec3Arg('p2', v2) p3 = FloatArg('p3', 2.2) shader = Shader(code=code, args=[p1, p2, p3]) shader.compile() shader.prepare([Runtime()]) shader.execute() rez = v1.dot(v2) p = shader.get_value('p3') self.assertAlmostEqual(rez, p)
def test_rgb_lum(self): shader = lum_rgb_shader() shader.compile() runtime = Runtime() shader.prepare([runtime]) code = """ rez = lumminance(r1) """ s = RGBArg('r1', RGBSpectrum(0.2, 0.3, 0.4)) rez = FloatArg('rez', 0.0) shader2 = Shader(code=code, args=[rez, s]) shader2.compile([shader]) shader2.prepare([runtime]) shader2.execute() lum = 0.2 * 0.212671 + 0.3 * 0.715160 + 0.4 * 0.072169 val = shader2.get_value('rez') self.assertAlmostEqual(lum, val)
def lum_sampled_shader(col_mgr): code = """ y = cie_y * spec y_sum = sum_samples(y) return y_sum * scale """ spec = col_mgr.zero() spec_arg = SampledArgPtr('spec', 0, spec) scale = (col_mgr.end - col_mgr.start) / (col_mgr.yint * col_mgr.nsamples) p1 = FloatArg('scale', scale) cie_y = SampledArg('cie_y', col_mgr._cie_y) shader = Shader(code=code, args=[p1, cie_y], name='lumminance', func_args=[spec_arg], is_func=True) return shader
def test_assign(self): code = """ k = 55 p1 = k m = (4, 7) p2 = m h = (3.13, 8, 9) p3 = h t = (6.6, 2.2, 9, 1) p4 = t r = 3.3 p5 = r """ p1 = IntArg('p1', 33) p2 = Vec2Arg('p2', Vector2(9, 22)) p3 = Vec3Arg('p3', Vector3(1, 4.4, 29)) p4 = Vec4Arg('p4', Vector4(2, 3, 1.1, 2)) p5 = FloatArg('p5', 87.33) shader = Shader(code=code, args=[p1, p2, p3, p4, p5]) shader.compile() shader.prepare([Runtime()]) shader.execute() self.assertEqual(shader.get_value('p1'), 55) v = shader.get_value('p2') self.assertAlmostEqual(v.x, 4.0) self.assertAlmostEqual(v.y, 7.0) v = shader.get_value('p3') self.assertAlmostEqual(v.x, 3.13, places=6) self.assertAlmostEqual(v.y, 8.0) self.assertAlmostEqual(v.z, 9.0) v = shader.get_value('p4') self.assertAlmostEqual(v.x, 6.6, places=6) self.assertAlmostEqual(v.y, 2.2) self.assertAlmostEqual(v.z, 9.0) self.assertAlmostEqual(v.w, 1.0) v = shader.get_value('p5') self.assertAlmostEqual(v, 3.3)