#ifndef jbt_field_h #define jbt_field_h #include <jgl/jgl.h> class jbt_field { public: virtual ~jbt_field(){}; virtual jFlt f( jFlt, jFlt ) const = 0; static jbt_field* Default; virtual jFlt bound() const { return 1; } virtual bool square() const { return false; } virtual jgl_algebraic* expression( jgl_algebraic*, jFlt ) const = 0; protected: jbt_field() : refcnt(0) {}; private: friend class jbt_primitive; friend class jbt_build; int refcnt; }; class jbt_geoff_field : public jbt_field { public: jFlt f( jFlt, jFlt ) const; virtual jgl_algebraic* expression( jgl_algebraic*, jFlt ) const; bool square() const { return true; } static const jFlt A; static const jFlt B; static const jFlt C; static jbt_geoff_field F; }; class jbt_bicubic_field : public jbt_field { public: jbt_bicubic_field( jFlt _b = 0.50 ) : bound(_b) {} jFlt f( jFlt r, jFlt R ) const; virtual jgl_algebraic* expression( jgl_algebraic*, jFlt ) const; private: jFlt bound; }; class jbt_arctan_field : public jbt_field { public: jbt_arctan_field( jFlt _s = 50 ) : stiffness(_s) {} jFlt f( jFlt r, jFlt R ) const; virtual jgl_algebraic* expression( jgl_algebraic*, jFlt ) const; private: jFlt stiffness; }; class jbt_blinn_field : public jbt_field { public: jbt_blinn_field( jFlt _a = -2 ) : a(_a) {} jFlt f( jFlt r, jFlt ) const; jFlt bound() const { return 10; } virtual jgl_algebraic* expression( jgl_algebraic*, jFlt ) const; private: jFlt a; }; class jbt_blanc_field : public jbt_field { public: jbt_blanc_field( jFlt _h = 0 ) : h(_h) {} jFlt f( jFlt r, jFlt R ) const; virtual jgl_algebraic* expression( jgl_algebraic*, jFlt ) const; private: jFlt h; }; class jbt_inversepower_field : public jbt_field { public: jbt_inversepower_field( float _n = 2 ) : n(_n) {}; jFlt f( jFlt, jFlt ) const; jgl_algebraic* expression( jgl_algebraic*, jFlt ) const; private: float n; }; #endif