/*************************************************************************** File: Renderer.hpp Created: 03/01/2001 Author: Maxim Garber Computer Science Department University of North Carolina - Chapel Hill garber@cs.unc.edu Description: ----------------------------------------------------------------------------. Copyright 2001 Maxim Garber UNC Motion Planning Research Group *****************************************************************************/ #include #include #include #include "tga.hpp" #include "trimodel.hpp" #include #include "Renderer_constants.hpp" /*--------------------------------------------------------------------------- Constants ----------------------------------------------------------------------------*/ #define FILE_NAME_LENGTH 20 #define MAX_NUM_LIGHTS 8 /*--------------------------------------------------------------------------- Types ----------------------------------------------------------------------------*/ struct RenderState{ // texture int _texHeight; int _texWidth; int _texChannels; GLuint _texName; GLubyte* _texture; float _texScaleFactor; // OpenGL texture state parameters std::vector _paramNames; std::vector _paramValues; }; struct LightParams { float Ambient[4], Diffuse[4], Specular[4], Position[4], SpotDirection[3], SpotExponent, SpotCutoff, ConstantAttenuation, LinearAttenuation, QuadraticAttenuation; int IsEnabled; }; struct MaterialParams { float Ambient[4], Diffuse[4], Specular[4], Shininess, Emission[4]; }; typedef std::vector TriBucket; typedef std::vector TriBucketArray; typedef std::vector RenderStateArray; enum RenderMode { TEXTURE_MODE_STANDARD, TEXTURE_MODE_FLAT, COMPUTED_COLOR_MODE }; class Renderer{ public: /*--------------------------------------------------------------------------- Constructors ----------------------------------------------------------------------------*/ Renderer(); ~Renderer(){}; void Initialize(const char* renderFile); /*--------------------------------------------------------------------------- Setting Render State Parameters ----------------------------------------------------------------------------*/ void AddTexture(GLubyte* texture, GLuint Width, GLuint Height, GLuint Channels, float textureScale, int renderState); void AddTexture(const char* textureFile, float textureScale, int renderState); void SetParameter(GLenum paramName, GLuint paramValue, int renderState); void CompileRenderStates(); void SetRenderState(int renderState); void SetRenderMode(RenderMode mode){_mode = mode;} /*--------------------------------------------------------------------------- Setting Lighting and Camera Parameters ----------------------------------------------------------------------------*/ void Lightf(int LightID, int ParamName, float Value); void Lightfv(int LightID, int ParamName, float *Value); void LightModelfv(int ParamName, float *Value); void LightModeli(int ParamName, int Value); void Materialf(int Face, int ParamName, float Value); void Materialfv(int Face, int ParamName, float *Value); void ColorMaterial(int Face, int Mode); void SetCameraPosition(float cameraPosition[3]); void SetDefaultLightingState(); void SetDefaultMaterialState(); void SetEnableState(int i, int value); void Enable(int i) { SetEnableState(i,1); } void Disable(int i) { SetEnableState(i,0); }; /*--------------------------------------------------------------------------- View Matrix for texture calculations ----------------------------------------------------------------------------*/ void SetModelViewMatrix(float *modelview); void SetProjectionMatrix(float *_projection); /*--------------------------------------------------------------------------- Screen Dimensions ----------------------------------------------------------------------------*/ void SetWindowDimensions(int screenWidth, int screenHeight) {_screenHeight = screenHeight; _screenWidth = screenWidth;} /*--------------------------------------------------------------------------- Rendering ----------------------------------------------------------------------------*/ void Begin(); void RenderTriangle(Tri tri); void End(); protected: private: RenderMode _mode; // if true is non-photorealistic // stylized rendering RenderStateArray _pRenderStates; int _numRenderStates; // triangle buckets for sorting by render state TriBucketArray _triangles; /*--------------------------------------------------------------------------- Lights and Material ----------------------------------------------------------------------------*/ LightParams Lights[MAX_NUM_LIGHTS]; int LightingEnabled; // Enable(LIGHTING) float LightModelAmbient[4]; // LightModelfv int LightModelLocalViewer; // LightModelf int LightModelTwoSide; // LightModelf MaterialParams ColorMaterials[2]; // Materialfv: MATERIAL PROPERTIES FOR FRONT (0) AND BACK (1) int ColorMaterialEnabled; // Enable(COLOR_MATERIAL) int ColorMaterialFace; // ColorMaterial: FRONT, BACK, FRONT_AND_BACK int ColorMaterialMode; // ColorMaterial: AMBIENT, DIFFUSE, AMBIENT_AND_DIFFUSE, SPECULAR, EMISSION /*--------------------------------------------------------------------------- Camera ----------------------------------------------------------------------------*/ float _cameraPosition[3]; /*--------------------------------------------------------------------------- Viewport DimensionsCamera ----------------------------------------------------------------------------*/ int _screenWidth; int _screenHeight; /*--------------------------------------------------------------------------- OpenGL Matrices -- used for view dependent texture coords ----------------------------------------------------------------------------*/ float _modelviewMatrix[16]; float _projectionMatrix[16]; /*--------------------------------------------------------------------------- Render State Decision Function ----------------------------------------------------------------------------*/ int _SelectRenderState(Tri Tri); void _CalcLighting(float FinalVertexColor[4], const float p[4], const float n[3], MaterialParams ColorMaterials[2], const int IsBackfacing); void _CalcTextureCoords(float point[3], RenderState* renderState, float texCoords[2]); };