// This is the definition for a texture called ExampleTexture.
class ExampleTexture : public Texture
{
public:
// Constructor with any parameters needed and a precedence.
ExampleTexture(double var_1, double var_2, int prec);
// This function determines how the texture affects the object.
// You do not need to call this function it is called within Mirage.
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);
// This function prints out the texture's parameters for debugging.
virtual void print_tex(void) {
printf("ExampleTexture: variable_1 %f, variable_2 %f, Precedence %d. \n",
variable_1, variable_2, precedence);}
private:
// The parameters that the ExampleTexture stores about itself.
double variable_1, variable_2;
};
// Constructor
ExampleTexture::ExampleTexture(double var_1, double var_2, int prec) {
variable_1 = var_1;
variable_2 = var_2;
precedence = prec;
// Texture objects must be deleted at the end of the frame.
mark_for_deletion();
}
// This is the function that actually applies the ExampleTexture.
void ExampleTexture::apply(vector ray_from, vector ray_dir, uint ray_flags,
Material *properties, vector hit_point,
vector hit_normal, RayTracer *engine,
transform tex_transform){
// The ray comes from ray_from and is travelling in direction ray_dir.
// A definition of ray_flags is in constants.h.
// You might want to modify your texture depending on these properties.
// properties is a pointer to the material.
// By modifying this you can change the material at the hit_point.
// hit_point This is where in world space the ray hits the object.
// If you modify this then rays reflected from or transmitted through
// this object could start somewhere else.
// hit_normal This is normal to the surface at hit_point.
// You can modify this to create bumb mapping.
// You can cast rays in your texture using an engine.
// tex_transform is needed for changing from the hit_point,
// in world space, back to where the object was last bound
// before the texture was applied.
// The apply code shows how to do this
vector object_hit;
Matrix::apply(tex_transform[AFT], hit_point, object_hit);
//Usually you will want to modify the texture depending on
// where on the object it hits rather than where the object
// is in space. The hit_point is a point in world space that
// it hits. By defining object_hit as above, and defining the
// texture depending on object_hit rather than the hit_point
// then the texture is defined depending on the position where
// the object was bound before the texture was applied, not the
// final position of the object. This means the texture will remain the
// same on the object no matter where the object is located.
DSTmaterial *dstmat = (DSTmaterial *) properties;
/*properties is a pointer to the Material class. So that you
// can change the material properties you need to define a
// pointer that points to the appropriate subclass of Material.
// This creates a pointer dstmat that points to the DSTmaterial
// subclass. This texture can only be applied to objects whose
// material is a DSTmaterial.
//Then modify the texture properties however you want.
}
.
.
.
// Give the texture to the object.
the_object->texture = new ExampleTexture(1.0, 0.5, 0);