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_SFMLQUADRENDERER
00024 #define H_SPK_SFMLQUADRENDERER
00025
00026 #include "RenderingAPIs/SFML/SPK_SFMLRenderer.h"
00027 #include "Extensions/Renderers/SPK_QuadRendererInterface.h"
00028 #include "Extensions/Renderers/SPK_Oriented2DRendererInterface.h"
00029
00030 namespace SPK
00031 {
00032 namespace SFML
00033 {
00059 class SPK_SFML_PREFIX SFMLQuadRenderer : public SFMLRenderer,
00060 public QuadRendererInterface,
00061 public Oriented2DRendererInterface
00062 {
00063 SPK_IMPLEMENT_REGISTERABLE(SFMLQuadRenderer)
00064
00065 public :
00066
00068
00070
00077 SFMLQuadRenderer(sf::Image* image = NULL,float scaleX = 1.0f,float scaleY = 1.0f);
00078
00087 static SFMLQuadRenderer* create(sf::Image* image = NULL,float scaleX = 1.0f,float scaleY = 1.0f);
00088
00090
00092
00097 void setImage(sf::Image* image);
00098
00099 virtual bool setTexturingMode(TexturingMode mode);
00100
00102
00104
00109 sf::Image* getImage() const;
00110
00112
00114
00115 virtual void createBuffers(const Group& group);
00116 virtual void destroyBuffers(const Group& group);
00117
00118 protected :
00119
00120 virtual bool checkBuffers(const Group& group);
00121
00122 private :
00123
00124 sf::Image* image;
00125
00126
00127 static float* gpuBuffer;
00128 static float* gpuIterator;
00129 static float* textureBuffer;
00130 static float* textureIterator;
00131
00132
00133 static const std::string GPU_BUFFER_NAME;
00134 static const std::string TEXTURE_BUFFER_NAME;
00135
00136 float* createTextureBuffer(const Group& group) const;
00137
00138 void innerRender(const Group& group);
00139
00140 void GLCallColorAndVertex(const Particle& particle) const;
00141 void GLCallTexture2DAtlas(const Particle& particle) const;
00142
00143 static void (SFMLQuadRenderer::*renderParticle)(const Particle&) const;
00144
00145 void renderVA(const Particle& particle) const;
00146 void renderRotVA(const Particle& particle) const;
00147 void renderAtlasVA(const Particle& particle) const;
00148 void renderAtlasRotVA(const Particle& particle) const;
00149 };
00150
00151
00152 inline SFMLQuadRenderer* SFMLQuadRenderer::create(sf::Image* image,float scaleX,float scaleY)
00153 {
00154 SFMLQuadRenderer* obj = new SFMLQuadRenderer(image,scaleX,scaleY);
00155 registerObject(obj);
00156 return obj;
00157 }
00158
00159 inline void SFMLQuadRenderer::setImage(sf::Image* image)
00160 {
00161 this->image = image;
00162 texturingMode = (image == NULL ? TEXTURE_NONE : TEXTURE_2D);
00163 }
00164
00165 inline bool SFMLQuadRenderer::setTexturingMode(TexturingMode mode)
00166 {
00167 if (mode == TEXTURE_3D)
00168 return false;
00169
00170 texturingMode = mode;
00171 return true;
00172 }
00173
00174 inline sf::Image* SFMLQuadRenderer::getImage() const
00175 {
00176 return image;
00177 }
00178
00179 inline void SFMLQuadRenderer::GLCallColorAndVertex(const Particle& particle) const
00180 {
00181 float x = particle.position().x;
00182 float y = particle.position().y;
00183 float deltaY = -particle.position().z * getZFactor();
00184
00185 *(gpuIterator++) = x + quadSide().x + quadUp().x;
00186 *(gpuIterator++) = y + quadSide().y + quadUp().y + deltaY;
00187
00188 gpuIterator += 4;
00189
00190 *(gpuIterator++) = x - quadSide().x + quadUp().x;
00191 *(gpuIterator++) = y - quadSide().y + quadUp().y + deltaY;
00192
00193 gpuIterator += 4;
00194
00195 *(gpuIterator++) = x - quadSide().x - quadUp().x;
00196 *(gpuIterator++) = y - quadSide().y - quadUp().y + deltaY;
00197
00198 gpuIterator += 4;
00199
00200 *(gpuIterator++) = x + quadSide().x - quadUp().x;
00201 *(gpuIterator++) = y + quadSide().y - quadUp().y + deltaY;
00202
00203 *(gpuIterator++) = particle.getR();
00204 *(gpuIterator++) = particle.getG();
00205 *(gpuIterator++) = particle.getB();
00206 *(gpuIterator++) = particle.getParamCurrentValue(PARAM_ALPHA);
00207 }
00208
00209 inline void SFMLQuadRenderer::GLCallTexture2DAtlas(const Particle& particle) const
00210 {
00211 computeAtlasCoordinates(particle);
00212
00213 *(textureIterator++) = textureAtlasU1();
00214 *(textureIterator++) = textureAtlasV0();
00215
00216 *(textureIterator++) = textureAtlasU0();
00217 *(textureIterator++) = textureAtlasV0();
00218
00219 *(textureIterator++) = textureAtlasU0();
00220 *(textureIterator++) = textureAtlasV1();
00221
00222 *(textureIterator++) = textureAtlasU1();
00223 *(textureIterator++) = textureAtlasV1();
00224 }
00225 }}
00226
00227 #endif