#ifndef jbt_primitive_h #define jbt_primitive_h #include "object.h" class jbt_field; class jbt_distance; class jbt_primitive : public jbt_object { friend class jbt_query; public: ~jbt_primitive(); void setField( jbt_field* ); jbt_field* getField() const { return fld; } void setDistance( jbt_distance* ); jbt_distance* getDistance() const { return dist; } void setR( jFlt _R ) { R = _R, R2 = R*R; computeBound(); } jFlt getR() const { return R; } void setCoefficient( jFlt _C ) { C = _C; } jFlt getCoefficient() const { return C; } void beginQuery( const jVec3& ); protected: jbt_primitive( jFlt ); virtual void precompute() {}; void field( jFlt& ); void normal( jNorm3& ); void uv( jVec2&, jbt_blobtree*, const jMat4& ); virtual jVec2 uvl( const jVec3& ) { return jVec2(0,0); } virtual jVec3 displacement() = 0; int intersectSphere( jFlt, const jRay&, jFlt& a, jFlt& b ) const; int intersectCylinder( jFlt, const jRay&, jFlt& a, jFlt& b ) const; void attribute( jbt_attribute* ) {} void attributes( jbt_diffuse*, jbt_specular*, jbt_scalar*, jbt_scalar*, jbt_scalar* ) {} bool spanCSG( const jVec3&, const jVec3& ) { return false; } void bracket( const jRay&, jbt_brackets& ); void computeBound(); jgl_algebraic* expression( const jMat4& ) const; jFlt R; jBasis disB; jbt_field* fld; jbt_distance* dist; jFlt R2; jFlt C,d; jVec3 D,dD; private: jVec3 remap( const jVec3& ); }; #endif