//---------------------------------------------------------------------------- // William Baxter III's Ray Tracer // // Project for Comp 238, Raster Graphics // University of North Carolina at Chapel Hill // // $Id:$ //---------------------------------------------------------------------------- #ifndef WB3RAYTRACER_H #define WB3RAYTRACER_H #include #include class wb3Scene; //---------------------------------------------------------------------------- class wb3RayTracer { public: wb3RayTracer(int screenWidth = 256, int screenHeight = 256); ~wb3RayTracer(); void SetMaxRecursion(int max); int GetMaxRecursion() const; void SetScreenSize(int screenWidth, int screenHeight); void GetScreenSize(int *screenWidth, int *screenHeight) const; void SetNumSamples(int sampSqrt); int GetNumSamples() const; void SetJitter(bool doJitter); bool GetJitter() const; const wb3Scene* GetScene() const; void SetScene(const wb3Scene* pScene); const char* GetOutputFile() const; void SetOutputFile(const char *filename); void Trace(); void Write(const char *filename = 0); protected: const wb3Scene *m_pScene; pngGL2d m_image; int m_iXRes; int m_iYRes; int m_iDepth; int m_iSamples; // sqrt of #samples per pixel bool m_bJitter; char m_pOutputFile[255]; }; //---------------------------------------------------------------------------- inline const wb3Scene* wb3RayTracer::GetScene() const { return m_pScene; } //---------------------------------------------------------------------------- inline void wb3RayTracer::SetScene(const wb3Scene* pScene) { m_pScene = pScene; } //---------------------------------------------------------------------------- inline void wb3RayTracer::SetMaxRecursion(int max) { m_iDepth = max; } //---------------------------------------------------------------------------- inline int wb3RayTracer::GetMaxRecursion() const { return m_iDepth; } //---------------------------------------------------------------------------- inline void wb3RayTracer::SetScreenSize(int screenWidth, int screenHeight) { m_iXRes = screenWidth; m_iYRes = screenHeight; m_image.SetSize(m_iXRes, m_iYRes); } //---------------------------------------------------------------------------- inline void wb3RayTracer::GetScreenSize(int *screenWidth, int *screenHeight) const { *screenWidth = m_iXRes; *screenHeight = m_iYRes; } //---------------------------------------------------------------------------- inline void wb3RayTracer::SetNumSamples(int sampSqrt) { m_iSamples = sampSqrt; } //---------------------------------------------------------------------------- inline int wb3RayTracer::GetNumSamples() const { return m_iSamples; } //---------------------------------------------------------------------------- inline void wb3RayTracer::SetJitter(bool onOff) { m_bJitter = onOff; } //---------------------------------------------------------------------------- inline bool wb3RayTracer::GetJitter() const { return m_bJitter; } //---------------------------------------------------------------------------- inline void wb3RayTracer::Write(const char *filename) { if (filename) m_image.Write(filename); else m_image.Write(m_pOutputFile); } //---------------------------------------------------------------------------- inline const char* wb3RayTracer::GetOutputFile() const { return m_pOutputFile; } inline void wb3RayTracer::SetOutputFile(const char *filename) { strcpy(m_pOutputFile, filename); } //---------------------------------------------------------------------------- #endif