00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022
00023 #ifndef H_SPK_GLQUADRENDERER
00024 #define H_SPK_GLQUADRENDERER
00025
00026 #include "RenderingAPIs/OpenGL/SPK_GLRenderer.h"
00027 #include "RenderingAPIs/OpenGL/SPK_GLExtHandler.h"
00028 #include "Extensions/Renderers/SPK_QuadRendererInterface.h"
00029 #include "Extensions/Renderers/SPK_Oriented3DRendererInterface.h"
00030 #include "Core/SPK_Vector3D.h"
00031 #include "Core/SPK_Particle.h"
00032 #include "Core/SPK_Model.h"
00033
00034 namespace SPK
00035 {
00036 namespace GL
00037 {
00056 class SPK_GL_PREFIX GLQuadRenderer : public GLRenderer,
00057 public QuadRendererInterface,
00058 public Oriented3DRendererInterface,
00059 public GLExtHandler
00060 {
00061 SPK_IMPLEMENT_REGISTERABLE(GLQuadRenderer)
00062
00063 public :
00064
00066
00068
00074 GLQuadRenderer(float scaleX = 1.0f,float scaleY = 1.0f);
00075
00083 static GLQuadRenderer* create(float scaleX = 1.0f,float scaleY = 1.0f);
00084
00086
00088
00089 virtual bool setTexturingMode(TexturingMode mode);
00090
00091 void setTexture(GLuint textureIndex);
00092
00094
00096
00101 GLuint getTexture() const;
00102
00104
00106
00107 virtual void createBuffers(const Group& group);
00108 virtual void destroyBuffers(const Group& group);
00109
00110 virtual void render(const Group& group);
00111
00112 protected :
00113
00114 virtual bool checkBuffers(const Group& group);
00115
00116 private :
00117
00118 mutable float modelView[16];
00119 mutable float invModelView[16];
00120
00121 GLuint textureIndex;
00122
00123
00124 static float* gpuBuffer;
00125 static float* gpuIterator;
00126 static float* textureBuffer;
00127 static float* textureIterator;
00128
00129
00130 static const std::string GPU_BUFFER_NAME;
00131 static const std::string TEXTURE_BUFFER_NAME;
00132
00133 float* createTextureBuffer(const Group& group) const;
00134
00135 void invertModelView() const;
00136
00137 void GLCallColorAndVertex(const Particle& particle) const;
00138 void GLCallTexture2DAtlas(const Particle& particle) const;
00139 void GLCallTexture3D(const Particle& particle) const;
00140
00141 static void (GLQuadRenderer::*renderParticle)(const Particle&) const;
00142
00143 void render2D(const Particle& particle) const;
00144 void render2DRot(const Particle& particle) const;
00145 void render3D(const Particle& particle) const;
00146 void render3DRot(const Particle& particle) const;
00147 void render2DAtlas(const Particle& particle) const;
00148 void render2DAtlasRot(const Particle& particle) const;
00149 };
00150
00151
00152 inline GLQuadRenderer* GLQuadRenderer::create(float scaleX,float scaleY)
00153 {
00154 GLQuadRenderer* obj = new GLQuadRenderer(scaleX,scaleY);
00155 registerObject(obj);
00156 return obj;
00157 }
00158
00159 inline void GLQuadRenderer::setTexture(GLuint textureIndex)
00160 {
00161 this->textureIndex = textureIndex;
00162 }
00163
00164 inline GLuint GLQuadRenderer::getTexture() const
00165 {
00166 return textureIndex;
00167 }
00168
00169 inline void GLQuadRenderer::GLCallColorAndVertex(const Particle& particle) const
00170 {
00171 float x = particle.position().x;
00172 float y = particle.position().y;
00173 float z = particle.position().z;
00174
00175
00176
00177 *(gpuIterator++) = x + quadSide().x + quadUp().x;
00178 *(gpuIterator++) = y + quadSide().y + quadUp().y;
00179 *(gpuIterator++) = z + quadSide().z + quadUp().z;
00180 gpuIterator += 4;
00181
00182
00183 *(gpuIterator++) = x - quadSide().x + quadUp().x;
00184 *(gpuIterator++) = y - quadSide().y + quadUp().y;
00185 *(gpuIterator++) = z - quadSide().z + quadUp().z;
00186 gpuIterator += 4;
00187
00188
00189 *(gpuIterator++) = x - quadSide().x - quadUp().x;
00190 *(gpuIterator++) = y - quadSide().y - quadUp().y;
00191 *(gpuIterator++) = z - quadSide().z - quadUp().z;
00192 gpuIterator += 4;
00193
00194
00195 *(gpuIterator++) = x + quadSide().x - quadUp().x;
00196 *(gpuIterator++) = y + quadSide().y - quadUp().y;
00197 *(gpuIterator++) = z + quadSide().z - quadUp().z;
00198
00199 *(gpuIterator++) = particle.getR();
00200 *(gpuIterator++) = particle.getG();
00201 *(gpuIterator++) = particle.getB();
00202 *(gpuIterator++) = particle.getParamCurrentValue(PARAM_ALPHA);
00203 }
00204
00205 inline void GLQuadRenderer::GLCallTexture2DAtlas(const Particle& particle) const
00206 {
00207 computeAtlasCoordinates(particle);
00208
00209 *(textureIterator++) = textureAtlasU1();
00210 *(textureIterator++) = textureAtlasV0();
00211
00212 *(textureIterator++) = textureAtlasU0();
00213 *(textureIterator++) = textureAtlasV0();
00214
00215 *(textureIterator++) = textureAtlasU0();
00216 *(textureIterator++) = textureAtlasV1();
00217
00218 *(textureIterator++) = textureAtlasU1();
00219 *(textureIterator++) = textureAtlasV1();
00220 }
00221
00222 inline void GLQuadRenderer::GLCallTexture3D(const Particle& particle) const
00223 {
00224 float textureIndex = particle.getParamCurrentValue(PARAM_TEXTURE_INDEX);
00225
00226 *(textureIterator + 2) = textureIndex;
00227 *(textureIterator + 5) = textureIndex;
00228 *(textureIterator + 8) = textureIndex;
00229 *(textureIterator + 11) = textureIndex;
00230 textureIterator += 12;
00231 }
00232
00233 inline void GLQuadRenderer::invertModelView() const
00234 {
00235 float tmp[12];
00236 float src[16];
00237
00238
00239 for (int i = 0; i < 4; ++i)
00240 {
00241 src[i] = modelView[i << 2];
00242 src[i + 4] = modelView[(i << 2) + 1];
00243 src[i + 8] = modelView[(i << 2) + 2];
00244 src[i + 12] = modelView[(i << 2) + 3];
00245 }
00246
00247
00248 tmp[0] = src[10] * src[15];
00249 tmp[1] = src[11] * src[14];
00250 tmp[2] = src[9] * src[15];
00251 tmp[3] = src[11] * src[13];
00252 tmp[4] = src[9] * src[14];
00253 tmp[5] = src[10] * src[13];
00254 tmp[6] = src[8] * src[15];
00255 tmp[7] = src[11] * src[12];
00256 tmp[8] = src[8] * src[14];
00257 tmp[9] = src[10] * src[12];
00258 tmp[10] = src[8] * src[13];
00259 tmp[11] = src[9] * src[12];
00260
00261
00262 invModelView[0] = tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7] - tmp[1] * src[5] - tmp[2] * src[6] - tmp[5] * src[7];
00263 invModelView[1] = tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7] - tmp[0] * src[4] - tmp[7] * src[6] - tmp[8] * src[7];
00264 invModelView[2] = tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7] - tmp[3] * src[4] - tmp[6] * src[5] - tmp[11] * src[7];
00265 invModelView[3] = tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6] - tmp[4] * src[4] - tmp[9] * src[5] - tmp[10] * src[6];
00266 invModelView[4] = tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3] - tmp[0] * src[1] - tmp[3] * src[2] - tmp[4] * src[3];
00267 invModelView[5] = tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3] - tmp[1] * src[0]- tmp[6] * src[2] - tmp[9] * src[3];
00268 invModelView[6] = tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3] - tmp[2] * src[0] - tmp[7] * src[1] - tmp[10] * src[3];
00269 invModelView[7] = tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2] - tmp[5]*src[0] - tmp[8]*src[1] - tmp[11]*src[2];
00270
00271
00272 tmp[0] = src[2] * src[7];
00273 tmp[1] = src[3] * src[6];
00274 tmp[2] = src[1] * src[7];
00275 tmp[3] = src[3] * src[5];
00276 tmp[4] = src[1] * src[6];
00277 tmp[5] = src[2] * src[5];
00278 tmp[6] = src[0] * src[7];
00279 tmp[7] = src[3] * src[4];
00280 tmp[8] = src[0] * src[6];
00281 tmp[9] = src[2] * src[4];
00282 tmp[10] = src[0] * src[5];
00283 tmp[11] = src[1] * src[4];
00284
00285
00286 invModelView[8] = tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15] - tmp[1] * src[13] - tmp[2] * src[14] - tmp[5] * src[15];
00287 invModelView[9] = tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15] - tmp[0] * src[12] - tmp[7] * src[14] - tmp[8] * src[15];
00288 invModelView[10] = tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15] - tmp[3] * src[12] - tmp[6] * src[13] - tmp[11] * src[15];
00289 invModelView[11] = tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14] - tmp[4] * src[12] - tmp[9] * src[13] - tmp[10] * src[14];
00290 invModelView[12] = tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9] - tmp[4] * src[11] - tmp[0] * src[9] - tmp[3] * src[10];
00291 invModelView[13] = tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10] - tmp[6] * src[10] - tmp[9] * src[11] - tmp[1] * src[8];
00292 invModelView[14] = tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8] - tmp[10] * src[11] - tmp[2] * src[8] - tmp[7] * src[9];
00293 invModelView[15] = tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9] - tmp[8] * src[9] - tmp[11] * src[10] - tmp[5] * src[8];
00294
00295
00296 float det = src[0] * invModelView[0] + src[1] * invModelView[1] + src[2] * invModelView[2] + src[3] * invModelView[3];
00297
00298
00299 det = 1 / det;
00300 for (int i = 0; i < 16; ++i)
00301 invModelView[i] *= det;
00302 }
00303 }}
00304
00305 #endif