I have choosen javascript because I never used it before. So lets try :) Files ----- I splittet up the raytracer into different files: math.js Much faster replacement for sylvester.src.js. obj_ellipsoid.js Ellipsoid Object class obj_obj_elliptic_cylinder.js Elliptic Cylinder Object class obj_mesh.js Mesh Object class. Prepeares data from read_obj.js to fit in my object world obj_sphere.js Sphere class obj_disk.js Disk class octree.js Octree implementation. It behaves like normal scene object classes but contains multiple sub objects csg.js Classes to for boolean operations on objects. Sadly not working right now :(. It also behaves like materials.js Classes for material, textures and bumpmaps lights.js Classes for lights scene.js Scene description class. A scene consists of objects and lights raytracer.js The raytracer itself Module A1 - Basic Features -------------------------- Is working Module B1 - Reflection and Refraction ------------------------------------- The recursive ray tracing is working, but somehow I combine the computed colors wrong?!? The formula L = 0.5E + 0.5(Ls+Lt) darkens the computed "phong" color E Reflection works, but i've got still problem with refraction :( Update 1: I fixed it during working on Exercise 3 Module B2 - Anti-aliasing ------------------------- Works, but quite slow :( I tried to parallelize it with async.js and parallel.js but with no luck so far. Module B3 - Quadrics -------------------- Done Module B4 - Boolean Operations ------------------------------ To finish... Module C1 - Stereoscopic Rendering ---------------------------------- It should work, but I did not test it with anaglyph glasses Module C2 - Texture mapping and bump mapping -------------------------------------------- I don't know exactly how to implement mip mapping since I have problems to determine the LOD if a ray hits an object. The different mip levels are actually generated, but I fixed the LOD to 1 for the earth and to 2 for the moon. Done in materials.js and raytracer.js Module C3 - Triangle Meshes --------------------------- Done. The implementation is mainly done in src/obj_mesh.js and read_obj.js I already use an Octree for this part, so octree.js is also used. Module D1 - Octree ------------------ I've got two termination criteria: 1. A maximum depth (defaults to 10, but the user can change it) 2. A minimum number of objects per node (defaults to 8). If there are less than this threshold, the tree node is no longer subdivided. Module D2 - Area lights ----------------------- Well, I don't know exactly how to solve this problem. I tried Path Tracing with the known problems that it is slow and noisy. The 2nd try looks not that bad. I create the area light from 50 points distributed randomly over the area light. each of these point lights have got a intensity of 1/50. So if a point on an object is receives the rays of all 50 point lights, it looks like one point light. If there are just a few of these point lights receiving the object, it gets darkened at these positions (eg. the border of shadows). This way the shadows become a smooth look. The more of these random point lights I use the more smoothly it looks. So it is some kind of Monte-Carlo integration, where I define random sample points. I sum up the values of these sample points and divide it by its count.