#ifndef REFLECTOR_H_ #define REFLECTOR_H_ #include #include #include "triangleMesh.h" #include "imposter.h" #define RenderTargetResolution 512 #define NormalsRTBitsN 8 #define NormalsRTFormat GL_RGBA8 #define RefractedRayRTBitsN 16 #define RefractedRayRTFormat GL_RGBA16F_ARB typedef enum {ReflectorType, RefractorType} LightInterfaceType; //Parameters for the image-space refraction struct RefractionParams { float index_1; float index_2; float objectScale; void GetLocal1(float* param); void GetLocal2(float* param); void GetLocal3(float* param); }; using namespace std; class Reflector { public: TriangleMesh *reflectorMesh; //impostors vector diffuseImposters; vector reflectiveImposters; //materials Material *SPOCRMaterial; Material *SPOCRefractMaterial; Material *PPCRMaterial; Material *PPCRefractMaterial; Material *BBRMaterial; Material *PhongMaterial; Material *RefractionConstrMaterial; Material *GCRMaterial; LightInterfaceType lightInterfaceType; RefractionParams refractionParams; RenderTarget *normalsRT; RenderTarget *refractedRaysRT; Vex3 clearColor; bool reflectorMeshIsMorpher; public: Reflector(); ~Reflector(); void SetReferenceMesh(TriangleMesh*); void AddImposter(ImposterType, TriangleMesh*); void LinkReflectiveImposterWithReflector(int index, Reflector* reflector); void CreateSPOCRays(int impostor, int numRays, int tess, int numVerts, int row, const Vex3 &color); void UpdateImposters(RenderMode); void UpdateRefractionMaps(RenderMode); void CreateRenderTargets(); void RenderImposters(RenderMode); void RenderHW(RenderMode); //functions used by CG parameter boost function pointers void CGBindImposterFloat(CGparameter*, FloatType, int, bool); void CGBindImposterVerts(CGparameter*, VertexType, int, bool); void CGBindImposterVector(CGparameter*, VectorType, int, bool); void CGBindImposterTex(CGparameter*, RenderTargetType, int, bool); void CGBindImposterMatrix(CGparameter*, MatrixType, int, bool); void CGBindImposterNearFarP(CGparameter*, CGparameter*, int, bool); bool RequestUpdateIfNeeded(ImposterType* newTypes); //float DistortionMagnitude(float gd); //Vex3 Distort(Vex3 phcProjv); }; #endif