00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00023
00024 #ifndef SPK_IRRQUADRENDERER
00025 #define SPK_IRRQUADRENDERER
00026
00027 #include "RenderingAPIs/Irrlicht/SPK_IRRRenderer.h"
00028 #include "Extensions/Renderers/SPK_QuadRendererInterface.h"
00029 #include "Extensions/Renderers/SPK_Oriented3DRendererInterface.h"
00030
00031 namespace SPK
00032 {
00033 namespace IRR
00034 {
00054 class SPK_IRR_PREFIX IRRQuadRenderer : public IRRRenderer,
00055 public QuadRendererInterface,
00056 public Oriented3DRendererInterface
00057 {
00058 SPK_IMPLEMENT_REGISTERABLE(IRRQuadRenderer)
00059
00060 public :
00061
00063
00065
00072 IRRQuadRenderer(irr::IrrlichtDevice* d,float scaleX = 1.0f,float scaleY = 1.0f);
00073
00082 static IRRQuadRenderer* create(irr::IrrlichtDevice* d,float scaleX = 1.0f,float scaleY = 1.0f);
00083
00085
00087
00095 void setTexture(irr::video::ITexture* texture);
00096
00104 void setAtlasDimensions(irr::core::dimension2du dim);
00105 using QuadRendererInterface::setAtlasDimensions;
00106
00108
00110
00115 irr::video::ITexture* getTexture() const;
00116
00121 irr::video::SMaterialLayer& getMaterialLayer();
00122
00127 const irr::video::SMaterialLayer& getMaterialLayer() const;
00128
00133 irr::core::dimension2du getAtlasDimensions() const;
00134
00136
00138
00139 virtual void render(const Group& group);
00140
00141 void createBuffers(const Group& group);
00142
00143 private :
00144
00145 static const size_t NB_INDICES_PER_QUAD = 6;
00146 static const size_t NB_VERTICES_PER_QUAD = 4;
00147
00148
00149 static const std::string IRR_BUFFER_NAME;
00150
00151 virtual const std::string& getBufferName() const;
00152
00153 void FillBufferColorAndVertex(const Particle& particle) const;
00154 void FillBufferTextureAtlas(const Particle& particle) const;
00155
00156 static void (IRRQuadRenderer::*renderParticle)(const Particle&) const;
00157
00158 void renderBasic(const Particle& particle) const;
00159 void renderRot(const Particle& particle) const;
00160 void renderAtlas(const Particle& particle) const;
00161 void renderAtlasRot(const Particle& particle) const;
00162 };
00163
00164
00165 inline IRRQuadRenderer* IRRQuadRenderer::create(irr::IrrlichtDevice* d,float scaleX,float scaleY)
00166 {
00167 IRRQuadRenderer* obj = new IRRQuadRenderer(d,scaleX,scaleY);
00168 registerObject(obj);
00169 return obj;
00170 }
00171
00172 inline void IRRQuadRenderer::setTexture(irr::video::ITexture* texture)
00173 {
00174 material.TextureLayer[0].Texture = texture;
00175 }
00176
00177 inline void IRRQuadRenderer::setAtlasDimensions(irr::core::dimension2du dim)
00178 {
00179 setAtlasDimensions(dim.Width,dim.Height);
00180 }
00181
00182 inline irr::video::ITexture* IRRQuadRenderer::getTexture() const
00183 {
00184 return material.TextureLayer[0].Texture;
00185 }
00186
00187 inline irr::video::SMaterialLayer& IRRQuadRenderer::getMaterialLayer()
00188 {
00189 return material.TextureLayer[0];
00190 }
00191
00192 inline const irr::video::SMaterialLayer& IRRQuadRenderer::getMaterialLayer() const
00193 {
00194 return material.TextureLayer[0];
00195 }
00196
00197 inline irr::core::dimension2du IRRQuadRenderer::getAtlasDimensions() const
00198 {
00199 return irr::core::dimension2du(textureAtlasNbX,textureAtlasNbY);
00200 }
00201
00202 inline const std::string& IRRQuadRenderer::getBufferName() const
00203 {
00204 return IRR_BUFFER_NAME;
00205 }
00206
00207 inline void IRRQuadRenderer::FillBufferColorAndVertex(const Particle& particle) const
00208 {
00209 size_t offset = particle.getIndex() << 2;
00210
00211 float x = particle.position().x;
00212 float y = particle.position().y;
00213 float z = particle.position().z;
00214
00215 irr::video::SColor color(spk2irr(
00216 particle.getParamCurrentValue(PARAM_ALPHA),
00217 particle.getR(),
00218 particle.getG(),
00219 particle.getB()));
00220
00221
00222
00223
00224 currentBuffer->getVertexBuffer()[offset].Pos.set(
00225 x + quadSide().x + quadUp().x,
00226 y + quadSide().y + quadUp().y,
00227 z + quadSide().z + quadUp().z);
00228 currentBuffer->getVertexBuffer()[offset].Color = color;
00229
00230
00231 currentBuffer->getVertexBuffer()[++offset].Pos.set(
00232 x - quadSide().x + quadUp().x,
00233 y - quadSide().y + quadUp().y,
00234 z - quadSide().z + quadUp().z);
00235 currentBuffer->getVertexBuffer()[offset].Color = color;
00236
00237
00238 currentBuffer->getVertexBuffer()[++offset].Pos.set(
00239 x - quadSide().x - quadUp().x,
00240 y - quadSide().y - quadUp().y,
00241 z - quadSide().z - quadUp().z);
00242 currentBuffer->getVertexBuffer()[offset].Color = color;
00243
00244
00245 currentBuffer->getVertexBuffer()[++offset].Pos.set(
00246 x + quadSide().x - quadUp().x,
00247 y + quadSide().y - quadUp().y,
00248 z + quadSide().z - quadUp().z);
00249 currentBuffer->getVertexBuffer()[offset].Color = color;
00250 }
00251
00252 inline void IRRQuadRenderer::FillBufferTextureAtlas(const Particle& particle) const
00253 {
00254 size_t offset = particle.getIndex() << 2;
00255 computeAtlasCoordinates(particle);
00256 currentBuffer->getVertexBuffer()[offset].TCoords.set(textureAtlasU0(),textureAtlasV0());
00257 currentBuffer->getVertexBuffer()[++offset].TCoords.set(textureAtlasU1(),textureAtlasV0());
00258 currentBuffer->getVertexBuffer()[++offset].TCoords.set(textureAtlasU1(),textureAtlasV1());
00259 currentBuffer->getVertexBuffer()[++offset].TCoords.set(textureAtlasU0(),textureAtlasV1());
00260 }
00261 }}
00262
00263 #endif