#ifndef material_h #define material_h #include <jgl/colour.h> #include <jgl/image.h> #include <jgl/linearalgebra.h> #include "flags.h" #include "texture.h" #include "collect_alloc.h" class rtl_object; class jImage; class rtl_ray; class rtl_material : public dyn_collectable { public: rtl_material(); rtl_material( const jColour& ); rtl_material( jFlt, jFlt, const jColour&, jFlt, const jColour&, jFlt, jFlt=0.1, jFlt=0.0 ); void texture( rtl_texture* _tex ) { tex = _tex; } const rtl_texture* texture() const { return tex; } rtl_texture* texture() { return tex; } jFlt kA() const { return ka; } jFlt kD() const { return kd; } jFlt kS() const { return ks; } jFlt n() const { return se; } const jColour& kR() const { return kr; } const jColour& kT() const { return kt; } void kA( jFlt _ka ) { ka = _ka; } void kD( jFlt _kd ) { kd = _kd; } void kS( jFlt _ks ) { ks = _ks; } void kR( jFlt _kr ) { kr.togray(_kr); } void kT( jFlt _kt ) { kt.togray(_kt); } void kR( const jColour& _kr ) { kr = _kr; } void kT( const jColour& _kt ) { kt = _kt; } void n( jFlt _se ) { se = _se; } jFlt ior() const { return i_r; } void ior( jFlt _ior ) { i_r = _ior; } const jColour& diffuse() const { return dclr; } const jColour& specular() const { return sclr; } void diffuse( const jColour& _dclr ) { dclr = _dclr; } void specular( const jColour& _sclr ) { sclr = _sclr; } virtual void surface( rtl_ray& ray, const jVec3& pt, jNorm3& N ) { if(tex)tex->texture(this,ray,pt,N); } virtual jColour spawn( rtl_ray&, const jVec3&, const jNorm3& ); enum Type { Whitted, Hall }; virtual Type type() const { return Whitted; } static rtl_material Default; void assume( const rtl_material*, bool texture = true ); void lerp( jFlt, const rtl_material*, const rtl_material* ); void trilerp( jFlt, const rtl_material*, jFlt, const rtl_material*, jFlt, const rtl_material* ); const rtl_flags& flags() const { return f; } rtl_flags& flags() { return f; } protected: jFlt ka,kd,ks,se,i_r; jColour dclr, sclr, kr, kt; void setdefault(); rtl_texture* tex; rtl_flags f; }; class rtl_glass : public rtl_material { public: rtl_glass(); rtl_glass( const jColour& ); void frost( jFlt ); }; #endif