annotate src/Modules/Output/Graphics/Devices/GraphicsOutputDevice.h @ 229:ddf35dd82d63

- A few changes to get graphics working. In progress.
author tom@acousticscale.org
date Sat, 16 Oct 2010 22:27:03 +0000
parents 82e0dc3dfd16
children af02b6addf7a
rev   line source
tomwalters@227 1 // Copyright 2006, Willem van Engen
tomwalters@116 2 //
tomwalters@116 3 // AIM-C: A C++ implementation of the Auditory Image Model
tomwalters@116 4 // http://www.acousticscale.org/AIMC
tomwalters@116 5 //
tomwalters@116 6 // Licensed under the Apache License, Version 2.0 (the "License");
tomwalters@116 7 // you may not use this file except in compliance with the License.
tomwalters@116 8 // You may obtain a copy of the License at
tomwalters@116 9 //
tomwalters@116 10 // http://www.apache.org/licenses/LICENSE-2.0
tomwalters@116 11 //
tomwalters@116 12 // Unless required by applicable law or agreed to in writing, software
tomwalters@116 13 // distributed under the License is distributed on an "AS IS" BASIS,
tomwalters@116 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tomwalters@116 15 // See the License for the specific language governing permissions and
tomwalters@116 16 // limitations under the License.
tomwalters@116 17
tomwalters@116 18 #ifndef __GRAPHICS_OUTPUT_DEVICE_H__
tomwalters@116 19 #define __GRAPHICS_OUTPUT_DEVICE_H__
tomwalters@116 20
tomwalters@116 21 #include "Support/Parameters.h"
tomwalters@116 22
tom@229 23 namespace aimc {
tom@229 24
tomwalters@116 25 /*!
tomwalters@116 26 * \class GraphicsOutputDevice "Output/GraphicsOutputDevice.h"
tomwalters@116 27 * \brief General output device class
tomwalters@116 28 *
tomwalters@116 29 * This class provides basic drawing primitives in a device-independent manner.
tomwalters@116 30 * It is structured like the OpenGL interface. Following is an example drawing
tomwalters@116 31 * five horizontal lines, with the colour changing between red and blue over
tomwalters@116 32 * time.
tomwalters@116 33 * \code
tomwalters@116 34 * GraphicsOutputDevice oOutput = static_cast<GraphicsOutputDevice>(new GraphicsOutputDeviceSomething());
tomwalters@116 35 * unsigned int a=0;
tomwalters@116 36 * ...
tomwalters@116 37 * oOutput->Start();
tomwalters@116 38 * while ( bIsRunning ) {
tomwalters@228 39 * // Start a drawing operation
tomwalters@228 40 * oOutput->gGrab();
tomwalters@228 41 * // Draw five horizontal lines
tomwalters@228 42 * for (int y=0; y<5; y++) {
tomwalters@228 43 * // Start a new line
tomwalters@228 44 * oOutput->gBegin();
tomwalters@228 45 * // Give each line it's own colour
tomwalters@228 46 * oOutput->gColor3f( (a%255)/255, 0, 1-(a%255)/255 );
tomwalters@228 47 * // Draw the line
tomwalters@228 48 * oOutput->gVertex2f(0, y);
tomwalters@228 49 * oOutput->gVertex2f(1, y);
tomwalters@228 50 * // End the line
tomwalters@228 51 * oOutput->gEnd();
tomwalters@228 52 * }
tomwalters@228 53 * oOutput->gRelease();
tomwalters@228 54 * Sleep(1);
tomwalters@228 55 * a++;
tomwalters@116 56 * }
tomwalters@116 57 * oOutput->Stop();
tomwalters@116 58 * \endcode
tomwalters@116 59 *
tomwalters@116 60 * This class includes some basic overloading definitions to ease the
tomwalters@116 61 * children's implementation. Note that the basic operations that need
tomwalters@116 62 * implementation are glVertex3f(x,y,z) and glColor(r,g,b).
tomwalters@116 63 */
tomwalters@116 64 class GraphicsOutputDevice {
tomwalters@116 65 public:
tom@229 66 GraphicsOutputDevice(Parameters *pParam);
tomwalters@228 67 virtual ~GraphicsOutputDevice() { };
tomwalters@116 68
tomwalters@228 69 /*! \brief Initialize the module, sets up everything to Start().
tomwalters@228 70 * \return true on success, false on error
tomwalters@228 71 *
tomwalters@228 72 * Initialize() needs to be called before any other function.
tomwalters@228 73 *
tomwalters@228 74 * This method is called in it's form as displayed here by the GraphicsView,
tomwalters@228 75 * but you may want to setup your own Initialize(...) function with
tomwalters@228 76 * different arguments and call it yourself.
tomwalters@228 77 *
tomwalters@228 78 * Thus make sure you do all memory allocations here. They can be cleaned
tomwalters@228 79 * up by the destructor. Because Initialize() may fail, it's not put in
tomwalters@228 80 * the constructor, so it can return a value.
tomwalters@228 81 *
tomwalters@228 82 * \sa Module::Initialize()
tomwalters@228 83 */
tomwalters@228 84 virtual bool Initialize(unsigned int iVerticesMax) { return true; };
tomwalters@228 85 /*! \overload
tomwalters@228 86 * This function reloads the parameters; make sure to have at least the
tomwalters@228 87 * function with maximum parameters called once.
tomwalters@228 88 */
tomwalters@228 89 virtual bool Initialize() { return true; };
tomwalters@126 90
tomwalters@228 91 /*! \brief Create a new drawing
tomwalters@228 92 * Run this before any other drawing command.
tomwalters@228 93 * \sa glRelease()
tomwalters@228 94 */
tomwalters@228 95 virtual void gGrab() = 0;
tomwalters@116 96
tomwalters@228 97 //! \brief Start a new vertex group for drawing a line strip
tomwalters@116 98 virtual void gBeginLineStrip() = 0;
tomwalters@116 99 //! \brief Start a new vertex group for drawing a quad strip
tomwalters@116 100 virtual void gBeginQuadStrip() = 0;
tomwalters@116 101
tomwalters@228 102 /*! \brief Specify a vertex to draw
tomwalters@228 103 * \param[in] x X-coordinate of the vertex
tomwalters@228 104 * \param[in] y Y-coordinate of the vertex
tomwalters@228 105 * \param[in] z Z-coordinate of the vertex
tomwalters@228 106 * \param[in] r Red component of colour
tomwalters@228 107 * \param[in] g Green component of colour
tomwalters@228 108 * \param[in] b Blue component of colour
tomwalters@228 109 *
tomwalters@228 110 * Currently, only lines are implemented.
tomwalters@228 111 */
tomwalters@116 112 virtual void gVertex3f(float x, float y, float z, float r, float g, float b);
tomwalters@116 113
tomwalters@228 114 /*! \overload
tomwalters@228 115 * This will add a vertex with the last specified colour.
tomwalters@228 116 */
tomwalters@116 117
tomwalters@228 118 virtual void gVertex3f(float x, float y, float z) = 0;
tomwalters@228 119 /*! \overload
tomwalters@228 120 * This will add a vertex in the 2d-plane with z=0.
tomwalters@228 121 */
tomwalters@116 122
tomwalters@228 123 virtual void gVertex2f(float x, float y, float r, float g, float b);
tomwalters@116 124
tomwalters@228 125 /*! \overload
tomwalters@228 126 * This will add a vertex in the 2d-plane with z=0 with the last
tomwalters@116 127 * specified colour.
tomwalters@228 128 */
tomwalters@228 129 virtual void gVertex2f(float x, float y);
tomwalters@116 130
tomwalters@228 131 /*! \brief Sets the current colour
tomwalters@228 132 * \param[in] r Red component
tomwalters@228 133 * \param[in] g Green component
tomwalters@228 134 * \param[in] b Blue component
tomwalters@228 135 */
tomwalters@228 136 virtual void gColor3f(float r, float g, float b) = 0;
tomwalters@116 137
tomwalters@228 138 //! \brief End a vertex group
tomwalters@116 139 virtual void gEnd() = 0;
tomwalters@116 140
tomwalters@228 141 /*! \brief Render a text string
tomwalters@228 142 * \param[in] x X-coordinate of the text's alignment point
tomwalters@228 143 * \param[in] y Y-coordinate of the text's alignment point
tomwalters@228 144 * \param[in] z Z-coordinate of the text's alignment point
tomwalters@228 145 * \param[in] sStr Text to render
tomwalters@228 146 * \param[in] bRotated \c true for vertically rotated text
tomwalters@228 147 *
tomwalters@228 148 * Current alignment is horizontal:left and vertical:bottom
tomwalters@228 149 * \todo Allow multiple alignment points
tomwalters@228 150 */
tomwalters@228 151 virtual void gText3f(float x,
tomwalters@116 152 float y,
tomwalters@116 153 float z,
tomwalters@116 154 const char *sStr,
tomwalters@116 155 bool bRotated = false) = 0;
tomwalters@116 156
tomwalters@228 157 /*! \overload
tomwalters@228 158 * This will render a text string in the 2d-plane with z=0.
tomwalters@228 159 */
tomwalters@228 160 virtual void gText2f(float x,
tomwalters@116 161 float y,
tomwalters@116 162 const char *sStr,
tomwalters@116 163 bool bRight = false);
tomwalters@116 164
tomwalters@228 165 /*! \brief Finish drawing
tomwalters@228 166 * Call this when a drawing is finished. It also makes sure that the
tomwalters@228 167 * rendering is actually done.
tomwalters@228 168 * \sa glGrab()
tomwalters@228 169 */
tomwalters@228 170 virtual void gRelease() = 0;
tomwalters@116 171
tomwalters@228 172 /*! \brief Called when animation starts
tomwalters@228 173 *
tomwalters@228 174 * You may wonder what Start() and Stop() do here. Some implementations
tomwalters@228 175 * may want to behave differently with respect to updating, if an
tomwalters@228 176 * animation is running or not (e.g. updating).
tomwalters@228 177 */
tomwalters@228 178 virtual void Start() { m_bRunning = true; }
tomwalters@116 179
tomwalters@228 180 //! \brief Called when animation stops
tomwalters@228 181 virtual void Stop() { m_bRunning = false; }
tomwalters@116 182
tomwalters@116 183 protected:
tomwalters@228 184 //! \brief True when animation is running
tomwalters@228 185 bool m_bRunning;
tomwalters@228 186 //! \brief Parameter store
tom@229 187 Parameters *m_pParam;
tomwalters@116 188
tomwalters@228 189 //! \brief Pixel Formats
tomwalters@228 190 enum PixelFormat {AIM_PIX_FMT_RGB24_32, AIM_PIX_FMT_RGB24_24};
tomwalters@116 191 };
tom@229 192 } // namespace aimc
tomwalters@116 193 #endif /* __GRAPHICS_OUTPUT_DEVICE__ */