tomwalters@237: // Copyright 2006-2010, Willem van Engen, Thomas Walters tomwalters@116: // tomwalters@116: // AIM-C: A C++ implementation of the Auditory Image Model tomwalters@116: // http://www.acousticscale.org/AIMC tomwalters@116: // tomwalters@116: // Licensed under the Apache License, Version 2.0 (the "License"); tomwalters@116: // you may not use this file except in compliance with the License. tomwalters@116: // You may obtain a copy of the License at tomwalters@116: // tomwalters@116: // http://www.apache.org/licenses/LICENSE-2.0 tomwalters@116: // tomwalters@116: // Unless required by applicable law or agreed to in writing, software tomwalters@116: // distributed under the License is distributed on an "AS IS" BASIS, tomwalters@116: // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. tomwalters@116: // See the License for the specific language governing permissions and tomwalters@116: // limitations under the License. tomwalters@116: tomwalters@116: #ifndef __GRAPHICS_OUTPUT_DEVICE_H__ tomwalters@116: #define __GRAPHICS_OUTPUT_DEVICE_H__ tomwalters@116: tomwalters@116: #include "Support/Parameters.h" tomwalters@116: tom@229: namespace aimc { tom@229: tomwalters@116: /*! tomwalters@116: * \class GraphicsOutputDevice "Output/GraphicsOutputDevice.h" tomwalters@116: * \brief General output device class tomwalters@116: * tomwalters@116: * This class provides basic drawing primitives in a device-independent manner. tomwalters@116: * It is structured like the OpenGL interface. Following is an example drawing tomwalters@116: * five horizontal lines, with the colour changing between red and blue over tomwalters@116: * time. tomwalters@116: * \code tomwalters@116: * GraphicsOutputDevice oOutput = static_cast(new GraphicsOutputDeviceSomething()); tomwalters@116: * unsigned int a=0; tomwalters@116: * ... tomwalters@116: * oOutput->Start(); tomwalters@116: * while ( bIsRunning ) { tomwalters@228: * // Start a drawing operation tomwalters@228: * oOutput->gGrab(); tomwalters@228: * // Draw five horizontal lines tomwalters@228: * for (int y=0; y<5; y++) { tomwalters@228: * // Start a new line tomwalters@228: * oOutput->gBegin(); tomwalters@228: * // Give each line it's own colour tomwalters@228: * oOutput->gColor3f( (a%255)/255, 0, 1-(a%255)/255 ); tomwalters@228: * // Draw the line tomwalters@228: * oOutput->gVertex2f(0, y); tomwalters@228: * oOutput->gVertex2f(1, y); tomwalters@228: * // End the line tomwalters@228: * oOutput->gEnd(); tomwalters@228: * } tomwalters@228: * oOutput->gRelease(); tomwalters@228: * Sleep(1); tomwalters@228: * a++; tomwalters@116: * } tomwalters@116: * oOutput->Stop(); tomwalters@116: * \endcode tomwalters@116: * tomwalters@116: * This class includes some basic overloading definitions to ease the tomwalters@116: * children's implementation. Note that the basic operations that need tomwalters@116: * implementation are glVertex3f(x,y,z) and glColor(r,g,b). tomwalters@116: */ tomwalters@116: class GraphicsOutputDevice { tomwalters@116: public: tom@229: GraphicsOutputDevice(Parameters *pParam); tomwalters@228: virtual ~GraphicsOutputDevice() { }; tomwalters@116: tomwalters@228: /*! \brief Initialize the module, sets up everything to Start(). tomwalters@228: * \return true on success, false on error tomwalters@228: * tomwalters@228: * Initialize() needs to be called before any other function. tomwalters@228: * tomwalters@228: * This method is called in it's form as displayed here by the GraphicsView, tomwalters@228: * but you may want to setup your own Initialize(...) function with tomwalters@228: * different arguments and call it yourself. tomwalters@228: * tomwalters@228: * Thus make sure you do all memory allocations here. They can be cleaned tomwalters@228: * up by the destructor. Because Initialize() may fail, it's not put in tomwalters@228: * the constructor, so it can return a value. tomwalters@228: * tomwalters@228: * \sa Module::Initialize() tomwalters@228: */ tomwalters@237: tomwalters@228: /*! \overload tomwalters@228: * This function reloads the parameters; make sure to have at least the tomwalters@228: * function with maximum parameters called once. tomwalters@228: */ tomwalters@237: virtual bool Initialize(Parameters *global_parameters) { tomwalters@237: global_parameters_ = global_parameters; tomwalters@237: return true; tomwalters@237: }; tomwalters@126: tomwalters@228: /*! \brief Create a new drawing tomwalters@228: * Run this before any other drawing command. tomwalters@228: * \sa glRelease() tomwalters@228: */ tomwalters@228: virtual void gGrab() = 0; tomwalters@116: tomwalters@228: //! \brief Start a new vertex group for drawing a line strip tomwalters@116: virtual void gBeginLineStrip() = 0; tomwalters@116: //! \brief Start a new vertex group for drawing a quad strip tomwalters@116: virtual void gBeginQuadStrip() = 0; tomwalters@116: tomwalters@228: /*! \brief Specify a vertex to draw tomwalters@228: * \param[in] x X-coordinate of the vertex tomwalters@228: * \param[in] y Y-coordinate of the vertex tomwalters@228: * \param[in] z Z-coordinate of the vertex tomwalters@228: * \param[in] r Red component of colour tomwalters@228: * \param[in] g Green component of colour tomwalters@228: * \param[in] b Blue component of colour tomwalters@228: * tomwalters@228: * Currently, only lines are implemented. tomwalters@228: */ tomwalters@116: virtual void gVertex3f(float x, float y, float z, float r, float g, float b); tomwalters@116: tomwalters@228: /*! \overload tomwalters@228: * This will add a vertex with the last specified colour. tomwalters@228: */ tomwalters@116: tomwalters@228: virtual void gVertex3f(float x, float y, float z) = 0; tomwalters@228: /*! \overload tomwalters@228: * This will add a vertex in the 2d-plane with z=0. tomwalters@228: */ tomwalters@116: tomwalters@228: virtual void gVertex2f(float x, float y, float r, float g, float b); tomwalters@116: tomwalters@228: /*! \overload tomwalters@228: * This will add a vertex in the 2d-plane with z=0 with the last tomwalters@116: * specified colour. tomwalters@228: */ tomwalters@228: virtual void gVertex2f(float x, float y); tomwalters@116: tomwalters@228: /*! \brief Sets the current colour tomwalters@228: * \param[in] r Red component tomwalters@228: * \param[in] g Green component tomwalters@228: * \param[in] b Blue component tomwalters@228: */ tomwalters@228: virtual void gColor3f(float r, float g, float b) = 0; tomwalters@116: tomwalters@228: //! \brief End a vertex group tomwalters@116: virtual void gEnd() = 0; tomwalters@116: tomwalters@228: /*! \brief Render a text string tomwalters@228: * \param[in] x X-coordinate of the text's alignment point tomwalters@228: * \param[in] y Y-coordinate of the text's alignment point tomwalters@228: * \param[in] z Z-coordinate of the text's alignment point tomwalters@228: * \param[in] sStr Text to render tomwalters@228: * \param[in] bRotated \c true for vertically rotated text tomwalters@228: * tomwalters@228: * Current alignment is horizontal:left and vertical:bottom tomwalters@228: * \todo Allow multiple alignment points tomwalters@228: */ tomwalters@228: virtual void gText3f(float x, tomwalters@116: float y, tomwalters@116: float z, tomwalters@116: const char *sStr, tomwalters@116: bool bRotated = false) = 0; tomwalters@116: tomwalters@228: /*! \overload tomwalters@228: * This will render a text string in the 2d-plane with z=0. tomwalters@228: */ tomwalters@228: virtual void gText2f(float x, tomwalters@116: float y, tomwalters@116: const char *sStr, tomwalters@116: bool bRight = false); tomwalters@116: tomwalters@228: /*! \brief Finish drawing tomwalters@228: * Call this when a drawing is finished. It also makes sure that the tomwalters@228: * rendering is actually done. tomwalters@228: * \sa glGrab() tomwalters@228: */ tomwalters@228: virtual void gRelease() = 0; tomwalters@116: tomwalters@228: /*! \brief Called when animation starts tomwalters@228: * tomwalters@228: * You may wonder what Start() and Stop() do here. Some implementations tomwalters@228: * may want to behave differently with respect to updating, if an tomwalters@228: * animation is running or not (e.g. updating). tomwalters@228: */ tomwalters@228: virtual void Start() { m_bRunning = true; } tomwalters@116: tomwalters@228: //! \brief Called when animation stops tomwalters@228: virtual void Stop() { m_bRunning = false; } tomwalters@244: tomwalters@244: virtual void Reset(Parameters* global_parameters) = 0; tomwalters@244: tomwalters@116: tomwalters@116: protected: tomwalters@228: //! \brief True when animation is running tomwalters@228: bool m_bRunning; tomwalters@228: //! \brief Parameter store tomwalters@237: Parameters *parameters_; tomwalters@237: Parameters *global_parameters_; tomwalters@116: tomwalters@228: //! \brief Pixel Formats tomwalters@228: enum PixelFormat {AIM_PIX_FMT_RGB24_32, AIM_PIX_FMT_RGB24_24}; tomwalters@116: }; tom@229: } // namespace aimc tomwalters@116: #endif /* __GRAPHICS_OUTPUT_DEVICE__ */