Figure 14 shows an object textured with the ChessBoardTexture.
Figure 14: Chess Board Texture: Varying Colour at hit point.
class ChessBoardTexture : public Texture { public: ChessBoardTexture(int prec); virtual void apply(vector ray_from, vector ray_dir, uint ray_flags, Material *properties, vector hit_point, vector hit_normal, RayTracer *engine, transform tex_transform); int even(double x) { if (fmod(x,2) == 0) return 1; else return 0; } // Print the texture's parameters for debugging virtual void print_tex(void) { printf("ChessBoardTexture: precedence = %d\n",precedence); } }; ChessBoardTexture::ChessBoardTexture(int prec) { precedence = prec; // Texture objects must be deleted at the end of the frame. mark_for_deletion(); } void ChessBoardTexture::apply(vector ray_from, vector ray_dir, uint ray_flags, Material *properties, vector hit_point, vector hit_normal, RayTracer *engine, transform tex_transform) { vector object_hit; // so that if you move the object the texture stays in the // same place on the object. Matrix::apply(tex_transform[AFT], hit_point, object_hit); DSTmaterial *dstmat = (DSTmaterial *) properties; double sum = floor(object_hit[0]) + floor(object_hit[1]) + floor(object_hit[2]); if (even(sum)) Vector::assign(dstmat->diffuse,0.0,0.0,0.0); else Vector::assign(dstmat->diffuse,1.0,1.0,1.0); } . . . // Add a Chess Board Rectangle. the_object = bind(stretch(2.999,3.999,1.999,new_cube())); the_object->texture = new ChessBoardTexture(0); LINK(the_scene, PLUS, bind(the_object));