def test_serialization(self): print("\nSpotLight serialization", end="") light = SpotLight(Vector3d(0)) dict = json.loads(repr(light)) splight = dict["SpotLight"] self.assertEqual(splight["Location"], json.loads(repr(Vector3d(0)))) self.assertEqual(splight["Color"], json.loads(repr(Color(0xffffff)))) self.assertEqual(splight["Intensity"], 1) self.assertEqual(splight["State"], True)
def test_tangent(self): print("\nTanget ray", end = "") sphere = Sphere(Vector3d(0,0,30), 10) ray = Ray(Vector3d(10,0,0),Vector3d(0,0,1)) intersection = IntersectionRecord() hitted = sphere.hitRay(intersection,ray) self.assertEqual(hitted, True) self.assertEqual(intersection.distance, 30) self.assertEqual(intersection.intersection, Vector3d(10,0,30)) self.assertEqual(intersection.normal, Vector3d(1,0,0))
def test_simple_constructor(self): print("\nSimple constructor", end = "") cm = ColorMaterial(Color(0x00ff00)) self.assertEqual(cm.color, Color(0x00ff00)) self.assertEqual(cm.ambient, Vector3d(1,1,1)) self.assertEqual(cm.diffuse, Vector3d(1,1,1)) self.assertEqual(cm.specular, Vector3d(1,1,1)) self.assertEqual(cm.shinines, 1) self.assertEqual(cm.reflection, 0) self.assertEqual(cm.refraction, 0)
def test_ray_box_intersection(self): print("\nRay Box Intersection", end="") min_corner = Vector3d(-1) max_corner = Vector3d(1) box = BoundingBox(min_corner, max_corner) ray = Ray(Vector3d(0, 0, -3), Vector3d(0, 0, 1)) intersection = RayBoxIntersectionRecord() rayBoxIntersection(ray, box, intersection) self.assertEqual(2, intersection.tmin) self.assertEqual(4, intersection.tmax)
def test_no_intersection(self): print("\nNo intersections", end = "") sphere = Sphere(Vector3d(0,0,30), 10) ray = Ray(Vector3d(0,0,0),Vector3d(0,0,-1)) intersection = IntersectionRecord() hitted = sphere.hitRay(intersection,ray) self.assertEqual(hitted, False) ray = Ray(Vector3d(10.0001,0,0),Vector3d(0,0,1)) hitted = sphere.hitRay(intersection,ray) self.assertEqual(hitted, False)
def test_containing_point(self): print("\nContaining point", end="") bb = bbox(Vector3d(0), Vector3d(5)) self.assertTrue(bb.contains(Vector3d(0))) self.assertTrue(bb.contains(Vector3d(5))) self.assertTrue(bb.contains(Vector3d(3))) self.assertTrue(bb.contains(Vector3d(3, 0, 0))) self.assertTrue(bb.contains(Vector3d(0, 3, 0))) self.assertTrue(bb.contains(Vector3d(0, 0, 3))) self.assertFalse(bb.contains(Vector3d(-1))) self.assertFalse(bb.contains(Vector3d(6)))
def test_adding_point(self): print("\nAdd point", end="") bb = bbox() bb.addPoint(Vector3d(1)) self.assertFalse(bb.isValid()) bb.addPoint(Vector3d(0)) self.assertTrue(bb.isValid()) bb.addPoint(Vector3d(0.5)) self.assertEqual(bb.min, Vector3d(0)) self.assertEqual(bb.max, Vector3d(1))
def test_properties(self): print("\nProperties", end="") bb = bbox() self.assertEqual(bb.min, Vector3d(2147483647)) self.assertEqual(bb.max, Vector3d(-2147483648)) self.assertEqual(bb.center, Vector3d(-0.5)) with self.assertRaises(AttributeError): bb.min = Vector3d(0) with self.assertRaises(AttributeError): bb.max = Vector3d(0) with self.assertRaises(AttributeError): bb.center = Vector3d(0) bb = bbox(Vector3d(0, 1, 2), Vector3d(4, 6, 8)) self.assertEqual(bb.deltaX, 4) self.assertEqual(bb.deltaY, 5) self.assertEqual(bb.deltaZ, 6) with self.assertRaises(AttributeError): bb.deltaX = 0 with self.assertRaises(AttributeError): bb.deltaY = 0 with self.assertRaises(AttributeError): bb.deltaZ = 0
def test_simple_example(self): print("\nSimple example", end="") scene = Scene("example") self.assertEqual(scene.name, "example") ruby_material = ColorMaterial(Color(255, 0, 0), Vector3d(0.1745, 0.01175, 0.01175), Vector3d(0.61424, 0.04136, 0.04136), Vector3d(0.727811, 0.626959, 0.626959), 76.8) sphere = Sphere(Vector3d(0, 0, 0), 10) object = RenderableObject(sphere, ruby_material) light = SpotLight(Vector3d(10, 10, 10)) camera = Camera(Vector3d(0, 0, -10), Vector3d(0, 0, 0), Vector3d(0, 1, 0), 60, 4 / 3, 1) scene.addObject(object) self.assertEqual(scene.objCnt, 1) scene.clearObjects() self.assertEqual(scene.objCnt, 0) scene.addLight(light) self.assertEqual(scene.lightCnt, 1) self.assertTrue(light.state) scene.setOnOffLight(0, False) self.assertFalse(light.state) scene.clearLights() self.assertEqual(scene.lightCnt, 0) scene.addCamera(camera) self.assertEqual(scene.camCnt, 1) scene.clearCameras() self.assertEqual(scene.camCnt, 0)
def test_two_intersections(self): print("\nRay intersects Sphere (two intersections)", end = "") sphere = Sphere(Vector3d(0,0,30), 10) ray = Ray(Vector3d(0,0,0),Vector3d(0,0,1)) intersection = IntersectionRecord() hitted = sphere.hitRay(intersection,ray) self.assertEqual(hitted, True) self.assertEqual(intersection.distance, 20) self.assertEqual(intersection.intersection, Vector3d(0,0,20)) self.assertEqual(intersection.normal, Vector3d(0,0,-1)) intersection = IntersectionRecord() sphere = Sphere(Vector3d(0,0,0), 1) x = 1/math.sqrt(2) ray = Ray(Vector3d(x,0,-5),Vector3d(0,0,1)) hitted = sphere.hitRay(intersection,ray) self.assertEqual(hitted, True) self.assertEqual(intersection.distance, 5-x) self.assertEqual(round(intersection.intersection.x,12), round(x,12)) self.assertEqual(intersection.intersection.y, 0) self.assertEqual(round(intersection.intersection.z,12), round(-x,12)) self.assertEqual(round(intersection.normal.x,12), round(x,12)) self.assertEqual(intersection.normal.y, 0) self.assertEqual(round(intersection.normal.z,12), round(-x,12))
def test_properties(self): print("\nProperties", end="") light = SpotLight(Vector3d(1)) light.location = Vector3d(1, 2, 3) self.assertEqual(light.location, Vector3d(1, 2, 3)) light.color = Color(0xff00ff) self.assertEqual(light.color, Color(0xff00ff)) light.intensity = 23 self.assertEqual(light.intensity, 23) light.state = False self.assertEqual(light.state, False)
def test_get_direction(self): print("\nGet direction", end = "") camera = Camera(Vector3d(0,0,0), Vector3d(0,0,1), Vector3d(0,1,0), 60, 4/3, 1) width, height = 800, 600 u, v = 400, 300 actual = camera.direction(u/width,v/height) expected = Vector3d(0,0,1) self.assertEqual(actual, expected) temp = camera.direction(0,v/height) self.assertTrue(temp.y == 0) self.assertTrue(temp.x != 0) temp = camera.direction(u/width,0) self.assertTrue(temp.y != 0) self.assertTrue(temp.x == 0)
def test_get_functions(self): print("\nSpotLight direction at point", end="") light = SpotLight(Vector3d(0)) self.assertEqual(light.direction(Vector3d(1, 0, 0)), Vector3d(1, 0, 0)) self.assertEqual(light.direction(Vector3d(0, 1, 0)), Vector3d(0, 1, 0)) self.assertEqual(light.direction(Vector3d(0, 0, 1)), Vector3d(0, 0, 1))
def test_normalization_in_constructor(self): print("\nConstructor with normalization", end="") ray = Ray(Vector3d(0, 0, 0), Vector3d(0, 0, 111)) self.assertEqual(ray.origin, Vector3d(0, 0, 0)) self.assertEqual(ray.direction, Vector3d(0, 0, 1)) ray = Ray(Vector3d(0, 0, 0), Vector3d(1, 1, 1)) self.assertEqual(ray.origin, Vector3d(0, 0, 0)) x = 1 / math.sqrt(3) self.assertEqual(ray.direction, Vector3d(x, x, x))
def test_color_get_functions(self): print("\nColorMaterial get color functions", end = "") ruby_material = ColorMaterial(Color(255, 0, 0) , Vector3d(0.1745, 0.01175, 0.01175) , Vector3d(0.61424, 0.04136, 0.04136) , Vector3d(0.727811, 0.626959, 0.626959) , 76.8) light = SpotLight(Vector3d(2,0,0)) light1 = SpotLight(Vector3d(4,0,0)) self.assertEqual( ruby_material.primitiveColor(), Color(255,0,0) * Vector3d(0.1745, 0.01175, 0.01175)) self.assertEqual( ruby_material.lightInfluence(Vector3d(0),Vector3d(1,0,0),light), Color(255,0,0) * Vector3d(0.61424, 0.04136, 0.04136))
def test_merge(self): print("\nMerge of boxes", end="") bb1 = bbox(Vector3d(0), Vector3d(1)) bb2 = bbox(Vector3d(0.5), Vector3d(1.5)) bb1.merge(bb2) self.assertEqual(bb1.min, Vector3d(0)) self.assertEqual(bb1.max, Vector3d(1.5))
def test_constructor_with_two_parameters(self): print("\nMinMax constructor", end="") bb = bbox(Vector3d(0), Vector3d(1)) self.assertEqual(bb.min, Vector3d(0)) self.assertEqual(bb.max, Vector3d(1)) self.assertTrue(bb.isValid()) bb = bbox(Vector3d(1), Vector3d(0)) self.assertFalse(bb.isValid())
def test_serialization(self): print("\nCamera serialization", end = "") camera = Camera(Vector3d(0,0,0), Vector3d(0,0,1), Vector3d(0,1,0), 60, 4/3, 1) dict = json.loads(repr(camera)) cam = dict["Camera"] self.assertEqual(cam["Location"], json.loads(repr(Vector3d(0,0,0)))) self.assertEqual(cam["LookAt"], json.loads(repr(Vector3d(0,0,1)))) self.assertEqual(cam["Up"], json.loads(repr(Vector3d(0,1,0)))) self.assertEqual(cam["FoV"], 60) self.assertEqual(cam["Aspect"], round(4/3,6)) self.assertEqual(cam["FocusDistance"], 1)
def create_scene_sample(camera_cnt=1, obj_cnt=1, light_cnt=1): scene = Scene("example") for i in range(camera_cnt): scene.addCamera( Camera(Vector3d(2 * i + 1, 3 * i + 1, 4 * i + 1), Vector3d(0, 0, 0), Vector3d(0, 1, 0), 60, 4 / 3, 1), True) ruby_material = ColorMaterial(Color(255, 0, 0), Vector3d(0.1745, 0.01175, 0.01175), Vector3d(0.61424, 0.04136, 0.04136), Vector3d(0.727811, 0.626959, 0.626959), 76.8) for i in range(obj_cnt): scene.addObject( RenderableObject(Sphere(Vector3d(i * 10), i * 5), ruby_material)) for i in range(light_cnt): scene.addLight(SpotLight(Vector3d(-i * 2, i * 4, i * 5))) return scene
def test_full_constructor(self): print("\nFull constructor", end = "") ruby_material = ColorMaterial(Color(255, 0, 0) , Vector3d(0.1745, 0.01175, 0.01175) , Vector3d(0.61424, 0.04136, 0.04136) , Vector3d(0.727811, 0.626959, 0.626959) , 76.8) self.assertEqual(ruby_material.color, Color(0xff0000)) self.assertEqual(ruby_material.ambient, Vector3d(0.1745, 0.01175, 0.01175)) self.assertEqual(ruby_material.diffuse, Vector3d(0.61424, 0.04136, 0.04136)) self.assertEqual(ruby_material.specular, Vector3d(0.727811, 0.626959, 0.626959)) self.assertEqual(ruby_material.shinines, 76.8) self.assertEqual(ruby_material.reflection, 0) self.assertEqual(ruby_material.refraction, 0)
def test_simple_1000_spheres(self): scene = Scene("example") ruby_material = ColorMaterial(Color(255, 0, 0), Vector3d(0.1745, 0.01175, 0.01175), Vector3d(0.61424, 0.04136, 0.04136), Vector3d(0.727811, 0.626959, 0.626959), 76.8) x0 = -15 y0 = -15 for i in range(1000): x = x0 + i % 30 y = y0 + i // 30 z = 0 r = 0.5 scene.addObject( RenderableObject(Sphere(Vector3d(x, y, z), r), ruby_material)) scene.addLight(SpotLight(Vector3d(10, 10, -10))) scene.addCamera( Camera(Vector3d(0, 0, -25), Vector3d(0, 0, 0), Vector3d(0, 1, 0), 60, 4 / 3, 1)) image = Image(scene.frameWidth, scene.frameHeight) frames_cnt = 30 start = time.time() for i in range(frames_cnt): scene.getFrame(image) elapsed = time.time() - start print( "\n1000 spheres frames per second : Time = {}s, Frames = {}, FPS = {}" .format(round(elapsed, 4), frames_cnt, round(frames_cnt / elapsed, 4)), end="")
def test_serialization(self): print("\nColorMaterial serialization", end = "") ruby_material = ColorMaterial(Color(255, 0, 0) , Vector3d(0.1745, 0.01175, 0.01175) , Vector3d(0.61424, 0.04136, 0.04136) , Vector3d(0.727811, 0.626959, 0.626959) , 76.8) dict = json.loads(repr(ruby_material)) mat = dict["ColorMaterial"] self.assertEqual(mat["Color"], json.loads(repr(Color(255,0,0)))) self.assertEqual(mat["Ambient"], json.loads(repr(Vector3d(0.1745, 0.01175, 0.01175)))) self.assertEqual(mat["Diffuse"], json.loads(repr(Vector3d(0.61424, 0.04136, 0.04136)))) self.assertEqual(mat["Specular"], json.loads(repr(Vector3d(0.727811, 0.626959, 0.626959)))) self.assertEqual(mat["Shinines"], 76.8) self.assertEqual(mat["Reflection"], 0) self.assertEqual(mat["Refraction"], 0)
def test_deserialization(self): print("\nColorMaterial deserialization", end = "") ruby_material = ColorMaterial(Color(255, 0, 0) , Vector3d(0.1745, 0.01175, 0.01175) , Vector3d(0.61424, 0.04136, 0.04136) , Vector3d(0.727811, 0.626959, 0.626959) , 76.8) dict = json.loads(repr(ruby_material)) material = ColorMaterial.fromDict(dict) self.assertEqual(material.color, Color(255,0,0)) self.assertEqual(material.ambient, Vector3d(0.1745, 0.01175, 0.01175)) self.assertEqual(material.diffuse, Vector3d(0.61424, 0.04136, 0.04136)) self.assertEqual(material.specular, Vector3d(0.727811, 0.626959, 0.626959)) self.assertEqual(material.shinines, 76.8) self.assertEqual(material.reflection, 0) self.assertEqual(material.refraction, 0)
def test_ray_intersect_box(self): print("\nRay Intersect Box", end="") min_corner = Vector3d(-1) max_corner = Vector3d(1) box = BoundingBox(min_corner, max_corner) ray = Ray(Vector3d(0, 0, -3), Vector3d(0, 0, 1)) self.assertTrue(rayIntersectBox(ray, box)) ray.direction = (max_corner - ray.origin).normalized() self.assertTrue(rayIntersectBox(ray, box)) ray.direction = (min_corner - ray.origin).normalized() self.assertTrue(rayIntersectBox(ray, box)) near_front_right_top_corner = Vector3d(1 + 1e-10, 1, -1) near_front_bottom_corner = Vector3d(-1 - 1e-10, -1, -1) ray.direction = (near_front_right_top_corner - ray.origin).normalized() self.assertFalse(rayIntersectBox(ray, box)) ray.direction = (near_front_bottom_corner - ray.origin).normalized() self.assertFalse(rayIntersectBox(ray, box))
def test_constructor(self): print("\nConstructor", end = "") camera = Camera(Vector3d(0,0,0), Vector3d(0,0,1), Vector3d(0,1,0), 60, 4/3, 1) self.assertEqual(camera.location, Vector3d(0,0,0))
def test_properties(self): print("\nProperties", end = "") ruby_material = ColorMaterial(Color(255, 0, 0) , Vector3d(0.1745, 0.01175, 0.01175) , Vector3d(0.61424, 0.04136, 0.04136) , Vector3d(0.727811, 0.626959, 0.626959) , 76.8) self.assertEqual(ruby_material.color, Color(0xff0000)) self.assertEqual(ruby_material.ambient, Vector3d(0.1745, 0.01175, 0.01175)) self.assertEqual(ruby_material.diffuse, Vector3d(0.61424, 0.04136, 0.04136)) self.assertEqual(ruby_material.specular, Vector3d(0.727811, 0.626959, 0.626959)) self.assertEqual(ruby_material.shinines, 76.8) self.assertEqual(ruby_material.reflection, 0) self.assertEqual(ruby_material.refraction, 0) ruby_material.color = Color(0x00ff00) self.assertEqual(ruby_material.color, Color(0x00ff00)) ruby_material.ambient = Vector3d(0,0,0) self.assertEqual(ruby_material.ambient, Vector3d(0,0,0)) self.assertEqual(ruby_material.acolor(), Color(0)) ruby_material.diffuse = Vector3d(0,0,0) self.assertEqual(ruby_material.diffuse, Vector3d(0,0,0)) self.assertEqual(ruby_material.dcolor(), Color(0)) ruby_material.specular = Vector3d(0,0,0) self.assertEqual(ruby_material.specular, Vector3d(0,0,0)) self.assertEqual(ruby_material.scolor(), Color(0)) ruby_material.shinines = 0 self.assertEqual(ruby_material.shinines, 0) ruby_material.reflection= 1 self.assertEqual(ruby_material.reflection, 1) ruby_material.refraction = 1 self.assertEqual(ruby_material.refraction, 1)
def test_with_default(self): print("\nDefault constructor", end = "") sphere = Sphere(Vector3d(0,0,0), 10) self.assertEqual(sphere.center, Vector3d(0,0,0)) self.assertEqual(sphere.radius, 10)
def test_constructor(self): print("\nDefault constructor", end="") ray = Ray(Vector3d(0, 0, 0), Vector3d(0, 0, 1)) self.assertEqual(ray.origin, Vector3d(0, 0, 0)) self.assertEqual(ray.direction, Vector3d(0, 0, 1))
def test_full_constructor(self): print("\nFull constructor", end = "") sphere = Sphere(Vector3d(0,0,0), 10) self.assertEqual(sphere.center, Vector3d(0,0,0)) self.assertEqual(sphere.radius, 10)
def test(name="example"): width = 640 height = 480 scene = Scene(name, width, height) ruby_material = ColorMaterial(Color(255, 0, 0), Vector3d(0.1745, 0.01175, 0.01175), Vector3d(0.61424, 0.04136, 0.04136), Vector3d(0.727811, 0.626959, 0.626959), 76.8) scene.addObject(RenderableObject(Sphere(Vector3d(0), 2), ruby_material)) #scene.addObject(RenderableObject(Sphere(Vector3d(4,4,-4), 1), ruby_material)) #scene.addLight(SpotLight(Vector3d(10,10,10))) scene.addLight(SpotLight(Vector3d(5, 6, -6))) scene.addCamera( Camera(Vector3d(0, 7, 7), Vector3d(0, 0, 0), Vector3d(0, -1, 1).normalized(), 75, width * 1.0 / height, 2), True) scene.addCamera( Camera(Vector3d(0, 10, 0), Vector3d(0, 0, 0), Vector3d(0, 0, 1), 75, width * 1.0 / height, 2), False) scene.addCamera( Camera(Vector3d(10, 0, 0), Vector3d(0, 0, 0), Vector3d(0, -1, 0), 75, width * 1.0 / height, 2), False) scene.addCamera( Camera(Vector3d(0, 0, 10), Vector3d(0, 0, 0), Vector3d(0, -1, 0), 75, width * 1.0 / height, 2), False) with open(name + '.json', 'w') as f: json.dump(json.loads(repr(scene)), f) dump_scene_image(scene)