aboutsummaryrefslogtreecommitdiff
path: root/visualization/extrasmeltutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'visualization/extrasmeltutils.cpp')
-rw-r--r--visualization/extrasmeltutils.cpp657
1 files changed, 392 insertions, 265 deletions
diff --git a/visualization/extrasmeltutils.cpp b/visualization/extrasmeltutils.cpp
index 2d0a807..ec9f021 100644
--- a/visualization/extrasmeltutils.cpp
+++ b/visualization/extrasmeltutils.cpp
@@ -3,367 +3,494 @@
#include <algorithm>
#include <smcolor.hpp>
#include "extrasmeltutils.hpp"
-SMELT* smEntity3DBuffer::sm=nullptr;
-SMELT* smParticle::sm=nullptr;
-SMELT* smParticleSystem::sm=nullptr;
-smVertex makeVertex(float x,float y,float z,DWORD color,float tx,float ty)
-{smVertex v;v.x=x;v.y=y;v.z=z;v.col=color;v.tx=tx;v.ty=ty;return v;}
-void smEntity3D::addVertices(size_t n,...)
-{
- va_list vl;va_start(vl,n);
- for(int i=0;i<n;++i)
- {
- smVertex v=va_arg(vl,smVertex);
- vertices.push_back(v);
- }
- va_end(vl);
-}
-void smEntity3D::addIndices(size_t n,...)
-{
- va_list vl;va_start(vl,n);
- for(int i=0;i<n;++i)
- {
- int idx=va_arg(vl,int);
- indices.push_back((WORD)idx);
- }
- va_end(vl);
+SMELT *smEntity3DBuffer::sm = nullptr;
+SMELT *smParticle::sm = nullptr;
+SMELT *smParticleSystem::sm = nullptr;
+smVertex makeVertex(float x, float y, float z, DWORD color, float tx, float ty)
+{
+ smVertex v;
+ v.x = x;
+ v.y = y;
+ v.z = z;
+ v.col = color;
+ v.tx = tx;
+ v.ty = ty;
+ return v;
+}
+void smEntity3D::addVertices(size_t n, ...)
+{
+ va_list vl;
+ va_start(vl, n);
+ for (int i = 0; i < n; ++i)
+ {
+ smVertex v = va_arg(vl, smVertex);
+ vertices.push_back(v);
+ }
+ va_end(vl);
+}
+void smEntity3D::addIndices(size_t n, ...)
+{
+ va_list vl;
+ va_start(vl, n);
+ for (int i = 0; i < n; ++i)
+ {
+ int idx = va_arg(vl, int);
+ indices.push_back((WORD)idx);
+ }
+ va_end(vl);
}
smVertex smEntity3D::vertex(size_t idx)const
{
- if(idx>0&&idx<vertices.size())return vertices[idx];
- return smVertex();
+ if (idx > 0 && idx < vertices.size())
+ return vertices[idx];
+ return smVertex();
}
WORD smEntity3D::index(size_t idx)const
{
- if(idx>0&&idx<indices.size())return indices[idx];
- return 0;
+ if (idx > 0 && idx < indices.size())
+ return indices[idx];
+ return 0;
}
-void smEntity3D::setVertex(size_t idx,smVertex v)
+void smEntity3D::setVertex(size_t idx, smVertex v)
{
- if(idx>0&&idx<vertices.size())vertices[idx]=v;
+ if (idx > 0 && idx < vertices.size())
+ vertices[idx] = v;
}
-void smEntity3D::setIndex(size_t idx,WORD i)
+void smEntity3D::setIndex(size_t idx, WORD i)
{
- if(idx>0&&idx<indices.size())indices[idx]=i;
+ if (idx > 0 && idx < indices.size())
+ indices[idx] = i;
}
-smEntity3D smEntity3D::cube(smvec3d a,smvec3d b,DWORD color,int faces)
-{
- smEntity3D ret;
- ret.addVertices(8,
- makeVertex(a.x,a.y,a.z,color,0,0),makeVertex(b.x,a.y,a.z,color,0,0),
- makeVertex(b.x,b.y,a.z,color,0,0),makeVertex(a.x,b.y,a.z,color,0,0),
- makeVertex(a.x,a.y,b.z,color,0,0),makeVertex(b.x,a.y,b.z,color,0,0),
- makeVertex(b.x,b.y,b.z,color,0,0),makeVertex(a.x,b.y,b.z,color,0,0));
- if(faces&0x1)//a.z
- ret.addIndices(6, 0,1,3, 1,2,3);
- if(faces&0x2)//b.z
- ret.addIndices(6, 4,5,7, 5,6,7);
- if(faces&0x4)//a.x
- ret.addIndices(6, 0,3,7, 0,4,7);
- if(faces&0x8)//b.x
- ret.addIndices(6, 1,2,6, 1,5,6);
- if(faces&0x10)//a.y
- ret.addIndices(6, 0,1,4, 1,4,5);
- if(faces&0x20)//b.y
- ret.addIndices(6, 2,3,7, 2,6,7);
- return ret;
+smEntity3D smEntity3D::cube(smvec3d a, smvec3d b, DWORD color, int faces)
+{
+ smEntity3D ret;
+ ret.addVertices(8,
+ makeVertex(a.x, a.y, a.z, color, 0, 0), makeVertex(b.x, a.y, a.z, color, 0, 0),
+ makeVertex(b.x, b.y, a.z, color, 0, 0), makeVertex(a.x, b.y, a.z, color, 0, 0),
+ makeVertex(a.x, a.y, b.z, color, 0, 0), makeVertex(b.x, a.y, b.z, color, 0, 0),
+ makeVertex(b.x, b.y, b.z, color, 0, 0), makeVertex(a.x, b.y, b.z, color, 0, 0));
+ if (faces & 0x1) //a.z
+ ret.addIndices(6, 0, 1, 3, 1, 2, 3);
+ if (faces & 0x2) //b.z
+ ret.addIndices(6, 4, 5, 7, 5, 6, 7);
+ if (faces & 0x4) //a.x
+ ret.addIndices(6, 0, 3, 7, 0, 4, 7);
+ if (faces & 0x8) //b.x
+ ret.addIndices(6, 1, 2, 6, 1, 5, 6);
+ if (faces & 0x10) //a.y
+ ret.addIndices(6, 0, 1, 4, 1, 4, 5);
+ if (faces & 0x20) //b.y
+ ret.addIndices(6, 2, 3, 7, 2, 6, 7);
+ return ret;
}
smEntity3DBuffer::smEntity3DBuffer()
{
- sm=smGetInterface(SMELT_APILEVEL);
- vertices.clear();indices.clear();
+ sm = smGetInterface(SMELT_APILEVEL);
+ vertices.clear();
+ indices.clear();
}
-void smEntity3DBuffer::addTransformedEntity(smEntity3D *entity,smMatrix t,smvec3d p)
+void smEntity3DBuffer::addTransformedEntity(smEntity3D *entity, smMatrix t, smvec3d p)
{
- if(entity->vertices.size()+vertices.size()>4000)drawBatch();
- for(unsigned i=0;i<entity->indices.size();++i)
- indices.push_back(entity->indices[i]+vertices.size());
- for(unsigned i=0;i<entity->vertices.size();++i)
- {
- smvec3d tp=smvec3d(entity->vertices[i].x,entity->vertices[i].y,entity->vertices[i].z);
- tp=t*tp;tp=tp+p;vertices.push_back(makeVertex(tp.x,tp.y,tp.z,entity->vertices[i].col,entity->vertices[i].tx,entity->vertices[i].ty));
- }
+ if (entity->vertices.size() + vertices.size() > 4000)
+ drawBatch();
+ for (unsigned i = 0; i < entity->indices.size(); ++i)
+ indices.push_back(entity->indices[i] + vertices.size());
+ for (unsigned i = 0; i < entity->vertices.size(); ++i)
+ {
+ smvec3d tp = smvec3d(entity->vertices[i].x, entity->vertices[i].y, entity->vertices[i].z);
+ tp = t * tp;
+ tp = tp + p;
+ vertices.push_back(makeVertex(tp.x, tp.y, tp.z, entity->vertices[i].col, entity->vertices[i].tx, entity->vertices[i].ty));
+ }
}
void smEntity3DBuffer::drawBatch()
{
- if(!vertices.size())return;
- sm->smDrawCustomIndexedVertices(&vertices[0],&indices[0],vertices.size(),indices.size(),BLEND_ALPHABLEND,0);
- vertices.clear();indices.clear();
+ if (!vertices.size())
+ return;
+ sm->smDrawCustomIndexedVertices(&vertices[0], &indices[0], vertices.size(), indices.size(), BLEND_ALPHABLEND, 0);
+ vertices.clear();
+ indices.clear();
}
smParticle::smParticle()
-{sm=smGetInterface(SMELT_APILEVEL);dead=false;clifespan=0;}
-smParticle::~smParticle(){sm->smRelease();}
+{
+ sm = smGetInterface(SMELT_APILEVEL);
+ dead = false;
+ clifespan = 0;
+}
+smParticle::~smParticle()
+{
+ sm->smRelease();
+}
void smParticle::render()
-{sm->smRenderQuad(&q);}
+{
+ sm->smRenderQuad(&q);
+}
void smParticle::update()
{
- clifespan+=sm->smGetDelta();if(clifespan>lifespan){dead=true;return;}
- vel=vel+accel;pos=pos+vel;rotv=rotv+rota;rot=rot+rotv;
- size=clifespan/lifespan*(finalsize-initsize)+initsize;
- smColorRGBA fc(finalcolor),ic(initcolor),cc;
- cc.a=clifespan/lifespan*(fc.a-ic.a)+ic.a;
- cc.r=clifespan/lifespan*(fc.r-ic.r)+ic.r;
- cc.g=clifespan/lifespan*(fc.g-ic.g)+ic.g;
- cc.b=clifespan/lifespan*(fc.b-ic.b)+ic.b;
- color=cc.getHWColor();
- for(int i=0;i<4;++i)q.v[i].col=color;
- smMatrix m;m.loadIdentity();
- if(lookat)m.lookat(pos,lookatpos,smvec3d(0,0,1));else
- {m.rotate(rot.x,1,0,0);m.rotate(rot.y,0,1,0);m.rotate(rot.z,0,0,1);}
- smvec3d v0=m*smvec3d(-size,-size,0),v1=m*smvec3d(size,-size,0);
- smvec3d v2=m*smvec3d(size,size,0),v3=m*smvec3d(-size,size,0);
- q.v[0].x=v0.x+pos.x;q.v[0].y=v0.y+pos.y;q.v[0].z=v0.z+pos.z;
- q.v[1].x=v1.x+pos.x;q.v[1].y=v1.y+pos.y;q.v[1].z=v1.z+pos.z;
- q.v[2].x=v2.x+pos.x;q.v[2].y=v2.y+pos.y;q.v[2].z=v2.z+pos.z;
- q.v[3].x=v3.x+pos.x;q.v[3].y=v3.y+pos.y;q.v[3].z=v3.z+pos.z;
+ clifespan += sm->smGetDelta();
+ if (clifespan > lifespan)
+ {
+ dead = true;
+ return;
+ }
+ vel = vel + accel;
+ pos = pos + vel;
+ rotv = rotv + rota;
+ rot = rot + rotv;
+ size = clifespan / lifespan * (finalsize - initsize) + initsize;
+ smColorRGBA fc(finalcolor), ic(initcolor), cc;
+ cc.a = clifespan / lifespan * (fc.a - ic.a) + ic.a;
+ cc.r = clifespan / lifespan * (fc.r - ic.r) + ic.r;
+ cc.g = clifespan / lifespan * (fc.g - ic.g) + ic.g;
+ cc.b = clifespan / lifespan * (fc.b - ic.b) + ic.b;
+ color = cc.getHWColor();
+ for (int i = 0; i < 4; ++i)
+ q.v[i].col = color;
+ smMatrix m;
+ m.loadIdentity();
+ if (lookat)
+ m.lookat(pos, lookatpos, smvec3d(0, 0, 1));
+ else
+ {
+ m.rotate(rot.x, 1, 0, 0);
+ m.rotate(rot.y, 0, 1, 0);
+ m.rotate(rot.z, 0, 0, 1);
+ }
+ smvec3d v0 = m * smvec3d(-size, -size, 0), v1 = m * smvec3d(size, -size, 0);
+ smvec3d v2 = m * smvec3d(size, size, 0), v3 = m * smvec3d(-size, size, 0);
+ q.v[0].x = v0.x + pos.x;
+ q.v[0].y = v0.y + pos.y;
+ q.v[0].z = v0.z + pos.z;
+ q.v[1].x = v1.x + pos.x;
+ q.v[1].y = v1.y + pos.y;
+ q.v[1].z = v1.z + pos.z;
+ q.v[2].x = v2.x + pos.x;
+ q.v[2].y = v2.y + pos.y;
+ q.v[2].z = v2.z + pos.z;
+ q.v[3].x = v3.x + pos.x;
+ q.v[3].y = v3.y + pos.y;
+ q.v[3].z = v3.z + pos.z;
}
smParticleSystem::smParticleSystem()
-{sm=smGetInterface(SMELT_APILEVEL);particles.clear();posGenerator=nullptr;active=false;}
+{
+ sm = smGetInterface(SMELT_APILEVEL);
+ particles.clear();
+ posGenerator = nullptr;
+ active = false;
+}
smParticleSystem::~smParticleSystem()
-{for(unsigned i=0;i<particles.size();++i)delete particles[i];particles.clear();}
+{
+ for (unsigned i = 0; i < particles.size(); ++i)
+ delete particles[i];
+ particles.clear();
+}
void smParticleSystem::setParticleSystemInfo(smParticleSystemInfo _psinfo)
-{psinfo=_psinfo;}
-void smParticleSystem::setPos(smvec3d _pos){pos=_pos;}
+{
+ psinfo = _psinfo;
+}
+void smParticleSystem::setPos(smvec3d _pos)
+{
+ pos = _pos;
+}
void smParticleSystem::setPSEmissionPosGen(smPSEmissionPositionGenerator *_gen)
-{posGenerator=_gen;}
-void smParticleSystem::setPSLookAt(smvec3d at){lookat=true;lookatpos=at;}
-void smParticleSystem::unsetPSLookAt(){lookat=false;}
+{
+ posGenerator = _gen;
+}
+void smParticleSystem::setPSLookAt(smvec3d at)
+{
+ lookat = true;
+ lookatpos = at;
+}
+void smParticleSystem::unsetPSLookAt()
+{
+ lookat = false;
+}
void smParticleSystem::startPS()
-{active=true;nemdelay=0;re.setSeed(time(nullptr));}
+{
+ active = true;
+ nemdelay = 0;
+ re.setSeed(time(nullptr));
+}
void smParticleSystem::stopPS()
-{active=false;}
+{
+ active = false;
+}
void smParticleSystem::updatePS()
{
- cemdelay+=sm->smGetDelta();
- if(active&&cemdelay>nemdelay&&(int)particles.size()<psinfo.maxcount)
- {
- int ec=re.nextInt(psinfo.emissioncount-psinfo.ecvar,psinfo.emissioncount+psinfo.ecvar);
- for(int i=0;i<ec;++i)
- {
- smParticle *p=new smParticle();
- p->pos=pos+(posGenerator?posGenerator->genPos():smvec3d(0,0,0));
- p->vel=smvec3d(
- re.nextDouble(psinfo.vel.x-psinfo.velvar.x,psinfo.vel.x+psinfo.velvar.x),
- re.nextDouble(psinfo.vel.y-psinfo.velvar.y,psinfo.vel.y+psinfo.velvar.y),
- re.nextDouble(psinfo.vel.z-psinfo.velvar.z,psinfo.vel.z+psinfo.velvar.z));
- p->accel=smvec3d(
- re.nextDouble(psinfo.acc.x-psinfo.accvar.x,psinfo.acc.x+psinfo.accvar.x),
- re.nextDouble(psinfo.acc.y-psinfo.accvar.y,psinfo.acc.y+psinfo.accvar.y),
- re.nextDouble(psinfo.acc.z-psinfo.accvar.z,psinfo.acc.z+psinfo.accvar.z));
- p->rotv=smvec3d(
- re.nextDouble(psinfo.rotv.x-psinfo.rotvvar.x,psinfo.rotv.x+psinfo.rotvvar.x),
- re.nextDouble(psinfo.rotv.y-psinfo.rotvvar.y,psinfo.rotv.y+psinfo.rotvvar.y),
- re.nextDouble(psinfo.rotv.z-psinfo.rotvvar.z,psinfo.rotv.z+psinfo.rotvvar.z));
- p->rota=smvec3d(
- re.nextDouble(psinfo.rota.x-psinfo.rotavar.x,psinfo.rota.x+psinfo.rotavar.x),
- re.nextDouble(psinfo.rota.y-psinfo.rotavar.y,psinfo.rota.y+psinfo.rotavar.y),
- re.nextDouble(psinfo.rota.z-psinfo.rotavar.z,psinfo.rota.z+psinfo.rotavar.z));
- p->rot=smvec3d(0,0,0);if(lookat)p->lookat=true,p->lookatpos=lookatpos;else p->lookat=false;
- p->lifespan=re.nextDouble(psinfo.lifespan-psinfo.lifespanvar,psinfo.lifespan+psinfo.lifespanvar);
- p->initsize=re.nextDouble(psinfo.initsize-psinfo.initsizevar,psinfo.initsize+psinfo.initsizevar);
- p->finalsize=re.nextDouble(psinfo.finalsize-psinfo.finalsizevar,psinfo.finalsize+psinfo.finalsizevar);
- p->size=p->initsize;
- p->initcolor=ARGB(
- re.nextInt(GETA(psinfo.initcolor)-GETA(psinfo.initcolorvar),GETA(psinfo.initcolor)+GETA(psinfo.initcolorvar)),
- re.nextInt(GETR(psinfo.initcolor)-GETR(psinfo.initcolorvar),GETR(psinfo.initcolor)+GETR(psinfo.initcolorvar)),
- re.nextInt(GETG(psinfo.initcolor)-GETG(psinfo.initcolorvar),GETG(psinfo.initcolor)+GETG(psinfo.initcolorvar)),
- re.nextInt(GETB(psinfo.initcolor)-GETB(psinfo.initcolorvar),GETB(psinfo.initcolor)+GETB(psinfo.initcolorvar)));
- p->finalcolor=ARGB(
- re.nextInt(GETA(psinfo.finalcolor)-GETA(psinfo.finalcolorvar),GETA(psinfo.finalcolor)+GETA(psinfo.finalcolorvar)),
- re.nextInt(GETR(psinfo.finalcolor)-GETR(psinfo.finalcolorvar),GETR(psinfo.finalcolor)+GETR(psinfo.finalcolorvar)),
- re.nextInt(GETG(psinfo.finalcolor)-GETG(psinfo.finalcolorvar),GETG(psinfo.finalcolor)+GETG(psinfo.finalcolorvar)),
- re.nextInt(GETB(psinfo.finalcolor)-GETB(psinfo.finalcolorvar),GETB(psinfo.finalcolor)+GETB(psinfo.finalcolorvar)));
- p->color=p->initcolor;p->q.tex=psinfo.texture;p->q.blend=psinfo.blend;
- p->q.v[0].tx=p->q.v[3].tx=0;p->q.v[0].ty=p->q.v[1].ty=0;
- p->q.v[1].tx=p->q.v[2].tx=1;p->q.v[2].ty=p->q.v[3].ty=1;
- particles.push_back(p);
- }
- cemdelay=0;
- nemdelay=re.nextDouble(psinfo.emissiondelay-psinfo.edvar,psinfo.emissiondelay+psinfo.edvar);
- }
- for(unsigned i=0,j;i<particles.size()&&!particles[i]->dead;++i)
- {
- particles[i]->update();
- if(particles[i]->dead)
- {
- for(j=particles.size()-1;j>i&&particles[j]->dead;--j);
- std::swap(particles[i],particles[j]);
- }
- }
- while(!particles.empty()&&particles.back()->dead)
- {delete particles.back();particles.back()=nullptr;particles.pop_back();}
+ cemdelay += sm->smGetDelta();
+ if (active && cemdelay > nemdelay && (int)particles.size() < psinfo.maxcount)
+ {
+ int ec = re.nextInt(psinfo.emissioncount - psinfo.ecvar, psinfo.emissioncount + psinfo.ecvar);
+ for (int i = 0; i < ec; ++i)
+ {
+ smParticle *p = new smParticle();
+ p->pos = pos + (posGenerator ? posGenerator->genPos() : smvec3d(0, 0, 0));
+ p->vel = smvec3d(
+ re.nextDouble(psinfo.vel.x - psinfo.velvar.x, psinfo.vel.x + psinfo.velvar.x),
+ re.nextDouble(psinfo.vel.y - psinfo.velvar.y, psinfo.vel.y + psinfo.velvar.y),
+ re.nextDouble(psinfo.vel.z - psinfo.velvar.z, psinfo.vel.z + psinfo.velvar.z));
+ p->accel = smvec3d(
+ re.nextDouble(psinfo.acc.x - psinfo.accvar.x, psinfo.acc.x + psinfo.accvar.x),
+ re.nextDouble(psinfo.acc.y - psinfo.accvar.y, psinfo.acc.y + psinfo.accvar.y),
+ re.nextDouble(psinfo.acc.z - psinfo.accvar.z, psinfo.acc.z + psinfo.accvar.z));
+ p->rotv = smvec3d(
+ re.nextDouble(psinfo.rotv.x - psinfo.rotvvar.x, psinfo.rotv.x + psinfo.rotvvar.x),
+ re.nextDouble(psinfo.rotv.y - psinfo.rotvvar.y, psinfo.rotv.y + psinfo.rotvvar.y),
+ re.nextDouble(psinfo.rotv.z - psinfo.rotvvar.z, psinfo.rotv.z + psinfo.rotvvar.z));
+ p->rota = smvec3d(
+ re.nextDouble(psinfo.rota.x - psinfo.rotavar.x, psinfo.rota.x + psinfo.rotavar.x),
+ re.nextDouble(psinfo.rota.y - psinfo.rotavar.y, psinfo.rota.y + psinfo.rotavar.y),
+ re.nextDouble(psinfo.rota.z - psinfo.rotavar.z, psinfo.rota.z + psinfo.rotavar.z));
+ p->rot = smvec3d(0, 0, 0);
+ if (lookat)
+ p->lookat = true, p->lookatpos = lookatpos;
+ else p->lookat = false;
+ p->lifespan = re.nextDouble(psinfo.lifespan - psinfo.lifespanvar, psinfo.lifespan + psinfo.lifespanvar);
+ p->initsize = re.nextDouble(psinfo.initsize - psinfo.initsizevar, psinfo.initsize + psinfo.initsizevar);
+ p->finalsize = re.nextDouble(psinfo.finalsize - psinfo.finalsizevar, psinfo.finalsize + psinfo.finalsizevar);
+ p->size = p->initsize;
+ p->initcolor = ARGB(
+ re.nextInt(GETA(psinfo.initcolor) - GETA(psinfo.initcolorvar), GETA(psinfo.initcolor) + GETA(psinfo.initcolorvar)),
+ re.nextInt(GETR(psinfo.initcolor) - GETR(psinfo.initcolorvar), GETR(psinfo.initcolor) + GETR(psinfo.initcolorvar)),
+ re.nextInt(GETG(psinfo.initcolor) - GETG(psinfo.initcolorvar), GETG(psinfo.initcolor) + GETG(psinfo.initcolorvar)),
+ re.nextInt(GETB(psinfo.initcolor) - GETB(psinfo.initcolorvar), GETB(psinfo.initcolor) + GETB(psinfo.initcolorvar)));
+ p->finalcolor = ARGB(
+ re.nextInt(GETA(psinfo.finalcolor) - GETA(psinfo.finalcolorvar), GETA(psinfo.finalcolor) + GETA(psinfo.finalcolorvar)),
+ re.nextInt(GETR(psinfo.finalcolor) - GETR(psinfo.finalcolorvar), GETR(psinfo.finalcolor) + GETR(psinfo.finalcolorvar)),
+ re.nextInt(GETG(psinfo.finalcolor) - GETG(psinfo.finalcolorvar), GETG(psinfo.finalcolor) + GETG(psinfo.finalcolorvar)),
+ re.nextInt(GETB(psinfo.finalcolor) - GETB(psinfo.finalcolorvar), GETB(psinfo.finalcolor) + GETB(psinfo.finalcolorvar)));
+ p->color = p->initcolor;
+ p->q.tex = psinfo.texture;
+ p->q.blend = psinfo.blend;
+ p->q.v[0].tx = p->q.v[3].tx = 0;
+ p->q.v[0].ty = p->q.v[1].ty = 0;
+ p->q.v[1].tx = p->q.v[2].tx = 1;
+ p->q.v[2].ty = p->q.v[3].ty = 1;
+ particles.push_back(p);
+ }
+ cemdelay = 0;
+ nemdelay = re.nextDouble(psinfo.emissiondelay - psinfo.edvar, psinfo.emissiondelay + psinfo.edvar);
+ }
+ for (unsigned i = 0, j; i < particles.size() && !particles[i]->dead; ++i)
+ {
+ particles[i]->update();
+ if (particles[i]->dead)
+ {
+ for (j = particles.size() - 1; j > i && particles[j]->dead; --j);
+ std::swap(particles[i], particles[j]);
+ }
+ }
+ while (!particles.empty() && particles.back()->dead)
+ {
+ delete particles.back();
+ particles.back() = nullptr;
+ particles.pop_back();
+ }
}
void smParticleSystem::renderPS()
-{for(unsigned i=0;i<particles.size();++i)particles[i]->render();}
+{
+ for (unsigned i = 0; i < particles.size(); ++i)
+ particles[i]->render();
+}
smColor::smColor()
-{r=g=b=h=s=v=a=0;}
+{
+ r = g = b = h = s = v = a = 0;
+}
void smColor::update_rgb()
{
- auto f=[this](float n){
- float k=fmodf(n+6.0f*this->h,6.0f);
- return this->v-this->v*this->s*max(0.0f,min(1.0f,min(k,4.0f-k)));
- };
- r=f(5);
- g=f(3);
- b=f(1);
+ auto f = [this](float n)
+ {
+ float k = fmodf(n + 6.0f * this->h, 6.0f);
+ return this->v - this->v * this->s * max(0.0f, min(1.0f, min(k, 4.0f - k)));
+ };
+ r = f(5);
+ g = f(3);
+ b = f(1);
}
void smColor::update_hsv()
{
- v=max(r,max(g,b));
- float vm=min(r,min(g,b));
- float chroma=v-vm;
- if(v-vm<EPSF)h=0;
- else if(v-r<EPSF)h=(0.0f+(g-b)/chroma)/6.0f;
- else if(v-g<EPSF)h=(2.0f+(b-r)/chroma)/6.0f;
- else if(v-b<EPSF)h=(4.0f+(r-g)/chroma)/6.0f;
- if(v<EPSF)s=0;else s=chroma/v;
+ v = max(r, max(g, b));
+ float vm = min(r, min(g, b));
+ float chroma = v - vm;
+ if (v - vm < EPSF)
+ h = 0;
+ else if (v - r < EPSF)
+ h = (0.0f + (g - b) / chroma) / 6.0f;
+ else if (v - g < EPSF)
+ h = (2.0f + (b - r) / chroma) / 6.0f;
+ else if (v - b < EPSF)
+ h = (4.0f + (r - g) / chroma) / 6.0f;
+ if (v < EPSF)
+ s = 0;
+ else s = chroma / v;
}
void smColor::clamp(bool hsv)
{
- if(hsv)
- {
- h=min(1.0f,max(0.0f,h));
- s=min(1.0f,max(0.0f,s));
- v=min(1.0f,max(0.0f,v));
- update_rgb();
- }
- else
- {
- r=min(1.0f,max(0.0f,r));
- g=min(1.0f,max(0.0f,g));
- b=min(1.0f,max(0.0f,b));
- update_hsv();
- }
+ if (hsv)
+ {
+ h = min(1.0f, max(0.0f, h));
+ s = min(1.0f, max(0.0f, s));
+ v = min(1.0f, max(0.0f, v));
+ update_rgb();
+ }
+ else
+ {
+ r = min(1.0f, max(0.0f, r));
+ g = min(1.0f, max(0.0f, g));
+ b = min(1.0f, max(0.0f, b));
+ update_hsv();
+ }
}
float smColor::alpha()const
-{return a;}
+{
+ return a;
+}
float smColor::red()const
-{return r;}
+{
+ return r;
+}
float smColor::green()const
-{return g;}
+{
+ return g;
+}
float smColor::blue()const
-{return b;}
+{
+ return b;
+}
float smColor::hue()const
-{return h;}
+{
+ return h;
+}
float smColor::saturation()const
-{return s;}
+{
+ return s;
+}
float smColor::hslSaturation()const
{
- float l=lightness();
- if(fabsf(l)<EPSF||fabsf(l-1)<EPSF)return 0;
- return (v-l)/min(l,1-l);
+ float l = lightness();
+ if (fabsf(l) < EPSF || fabsf(l - 1) < EPSF)
+ return 0;
+ return (v - l) / min(l, 1 - l);
}
float smColor::value()const
-{return v;}
+{
+ return v;
+}
float smColor::lightness()const
-{return v-v*s/2;}
+{
+ return v - v * s / 2;
+}
void smColor::setAlpha(float alpha)
-{a=alpha;}
+{
+ a = alpha;
+}
void smColor::setRed(float red)
{
- if(fabsf(r-red)>EPSF)
- {
- r=red;
- update_hsv();
- }
+ if (fabsf(r - red) > EPSF)
+ {
+ r = red;
+ update_hsv();
+ }
}
void smColor::setGreen(float green)
{
- if(fabsf(g-green)>EPSF)
- {
- g=green;
- update_hsv();
- }
+ if (fabsf(g - green) > EPSF)
+ {
+ g = green;
+ update_hsv();
+ }
}
void smColor::setBlue(float blue)
{
- if(fabsf(b-blue)>EPSF)
- {
- b=blue;
- update_hsv();
- }
+ if (fabsf(b - blue) > EPSF)
+ {
+ b = blue;
+ update_hsv();
+ }
}
void smColor::setHue(float hue)
{
- if(fabsf(h-hue)>EPSF)
- {
- h=hue;
- update_rgb();
- }
+ if (fabsf(h - hue) > EPSF)
+ {
+ h = hue;
+ update_rgb();
+ }
}
void smColor::setSaturation(float saturation)
{
- if(fabsf(s-saturation)>EPSF)
- {
- s=saturation;
- update_rgb();
- }
+ if (fabsf(s - saturation) > EPSF)
+ {
+ s = saturation;
+ update_rgb();
+ }
}
void smColor::setHSLSaturation(float saturation)
{
- float ss=hslSaturation();
- float l=lightness();
- if(fabsf(ss-saturation)>EPSF)
- {
- ss=saturation;
- v=l+ss*min(l,1-l);
- if(v<EPSF)s=0;
- else s=2-2*l/v;
- update_rgb();
- }
+ float ss = hslSaturation();
+ float l = lightness();
+ if (fabsf(ss - saturation) > EPSF)
+ {
+ ss = saturation;
+ v = l + ss * min(l, 1 - l);
+ if (v < EPSF)
+ s = 0;
+ else s = 2 - 2 * l / v;
+ update_rgb();
+ }
}
void smColor::setValue(float value)
{
- if(fabsf(v-value)>EPSF)
- {
- v=value;
- update_rgb();
- }
+ if (fabsf(v - value) > EPSF)
+ {
+ v = value;
+ update_rgb();
+ }
}
void smColor::setLightness(float lightness)
{
- float ss=hslSaturation();
- float l=this->lightness();
- if(fabsf(l-lightness)>EPSF)
- {
- l=lightness;
- v=l+ss*min(l,1-l);
- if(v<EPSF)s=0;
- else s=2-2*l/v;
- update_rgb();
- }
+ float ss = hslSaturation();
+ float l = this->lightness();
+ if (fabsf(l - lightness) > EPSF)
+ {
+ l = lightness;
+ v = l + ss * min(l, 1 - l);
+ if (v < EPSF)
+ s = 0;
+ else s = 2 - 2 * l / v;
+ update_rgb();
+ }
}
smColor smColor::lighter(int factor)
{
- smColor ret(*this);
- ret.setValue(v*(factor/100.0f));
- ret.clamp(true);
- return ret;
+ smColor ret(*this);
+ ret.setValue(v * (factor / 100.0f));
+ ret.clamp(true);
+ return ret;
}
smColor smColor::darker(int factor)
{
- smColor ret(*this);
- ret.setValue(factor?(v/(factor/100.0f)):1.);
- ret.clamp(true);
- return ret;
+ smColor ret(*this);
+ ret.setValue(factor ? (v / (factor / 100.0f)) : 1.);
+ ret.clamp(true);
+ return ret;
}
uint32_t smColor::toHWColor()
{
- return RGBA(r*255,g*255,b*255,a*255);
+ return RGBA(r * 255, g * 255, b * 255, a * 255);
}
smColor smColor::fromHWColor(uint32_t color)
{
- smColor ret;
- ret.r=GETR(color)/255.0f;
- ret.g=GETG(color)/255.0f;
- ret.b=GETB(color)/255.0f;
- ret.a=GETA(color)/255.0f;
- ret.update_hsv();
- return ret;
+ smColor ret;
+ ret.r = GETR(color) / 255.0f;
+ ret.g = GETG(color) / 255.0f;
+ ret.b = GETB(color) / 255.0f;
+ ret.a = GETA(color) / 255.0f;
+ ret.update_hsv();
+ return ret;
}