//Extra utilities for SMELT //Chris Xiong, 2016-2020 //License: LGPL v3 //This file contains staging extensions for SMELT, //which will be moved into SMELT once they are mature. #ifndef EXTRASMELTUTILS_H #define EXTRASMELTUTILS_H #include #include #include #include #include #define EPSF 1e-6f class smEntity3D { friend class smEntity3DBuffer; private: std::vector vertices; std::vector indices; public: smEntity3D() { vertices.clear(); indices.clear(); } void addVertices(size_t n, ...); void addIndices(size_t n, ...); smVertex vertex(size_t idx)const; WORD index(size_t idx)const; void setVertex(size_t idx, smVertex v); void setIndex(size_t idx, WORD i); static smEntity3D cube(smvec3d tl, smvec3d br, DWORD color, int faces = 63); }; class smEntity3DBuffer { private: std::vector vertices; std::vector indices; static SMELT *sm; public: smEntity3DBuffer(); ~smEntity3DBuffer() { sm->smRelease(); } void addTransformedEntity(smEntity3D *entity, smMatrix t, smvec3d p); void drawBatch(); }; class smColor { private: float r, g, b, h, s, v, a; void update_rgb(); void update_hsv(); public: smColor(); void clamp(bool hsv); float alpha()const; float red()const; float green()const; float blue()const; float hue()const; float saturation()const; float hslSaturation()const; float value()const; float lightness()const; void setAlpha(float alpha); void setRed(float red); void setGreen(float green); void setBlue(float blue); void setHue(float hue); void setSaturation(float saturation); void setHSLSaturation(float saturation); void setValue(float value); void setLightness(float lightness); smColor lighter(int factor); smColor darker(int factor); uint32_t toHWColor(); static smColor fromHWColor(uint32_t color); }; class smPSEmissionPositionGenerator { public: virtual smvec3d genPos() { return smvec3d(0, 0, 0); } }; class smXLinePSGenerator: public smPSEmissionPositionGenerator { private: smRandomEngine re; double var; public: smXLinePSGenerator(double _var) { re.setSeed(time(nullptr)); var = _var; } smvec3d genPos() { return smvec3d(re.nextDouble(-var, var), 0, 0); } }; class smParticleSystemInfo { public: smvec3d vel, velvar, acc, accvar; smvec3d rotv, rotvvar, rota, rotavar; double lifespan, lifespanvar; int maxcount, emissioncount, ecvar; double emissiondelay, edvar; double initsize, initsizevar; double finalsize, finalsizevar; DWORD initcolor, initcolorvar; DWORD finalcolor, finalcolorvar; SMTEX texture; int blend; }; class smParticle { friend class smParticleSystem; private: static SMELT *sm; smvec3d pos, rot, lookatpos; smvec3d vel, accel, rotv, rota; double lifespan, clifespan; double initsize, finalsize, size; DWORD color, initcolor, finalcolor; smQuad q; bool dead, lookat; public: smParticle(); ~smParticle(); void render(); void update(); }; class smParticleSystem { private: static SMELT *sm; std::vector particles; smParticleSystemInfo psinfo; smvec3d pos, lookatpos; smRandomEngine re; smPSEmissionPositionGenerator *posGenerator; bool active, lookat; double cemdelay, nemdelay; public: smParticleSystem(); ~smParticleSystem(); void setParticleSystemInfo(smParticleSystemInfo _psinfo); void setPos(smvec3d _pos); void setPSEmissionPosGen(smPSEmissionPositionGenerator *_gen); void setPSLookAt(smvec3d at); void unsetPSLookAt(); void startPS(); void stopPS(); void updatePS(); void renderPS(); }; extern smVertex makeVertex(float x, float y, float z, DWORD color, float tx, float ty); #endif // EXTRASMELTUTILS_H