Mercurial > love-experiments
diff src/modules/graphics/opengl/ParticleSystem.cpp @ 1368:ffd3c8f2709f
Make love.math a singleton. Remove code duplication. Add love.math.triangulate.
love::math::Math is now a singleton, so other modules can use it via
love::math::Math::instance.
Removed duplicate implementations of various rng helper functions.
ParticleSystem now uses love::math::Math's RNG.
New function: love.math.triangulate(vertices)
Accepts a table or list of x/y coordinate pairs and returns a table of tables.
The inner tables are the triangles the polygon is composed of.
Works on all *simple* polygons, i.e. a closed chain of vertices that does not
intersect itself. Attempting to triangulate non-simple polygons is undefined
behavior - in the best case it throws an error, in the worst case it returns
an invalid triangulation.
Polygons must be ordered in *clockwise order* with respect to the love
coordinate system. Attempting to triangulate a ccw polygon will throw an
error.
Examples:
triangles = love.math.triangulate(0,0, 1,1, 2,0, 2,2, 0,2)
triangles == {
{1,1, 2,0, 2,2},
{1,1, 2,2, 0,2},
{1,1, 0,2, 0,0},
}
triangles = love.math.triangulate({0,0, 1,1, 2,0, 2,2, 0,2})
-- same as above
triangles = love.math.triangulate(0,2, 2,2, 2,0, 1,1, 0,0)
-- error - polygons is in counterclockwise order
triangles = love.math.triangulate(0,0, 1,3, 2,0, 2,2, 0,2)
-- undefined behavior - polygon intersects itself (because of edge 1,3)
| author | vrld <vrld@vrld.org> |
|---|---|
| date | Wed, 13 Mar 2013 20:48:39 +0100 |
| parents | f1c353a5067d |
| children | f0795108d4c0 |
line wrap: on
line diff
--- a/src/modules/graphics/opengl/ParticleSystem.cpp Wed Mar 13 14:38:58 2013 -0300 +++ b/src/modules/graphics/opengl/ParticleSystem.cpp Wed Mar 13 20:48:39 2013 +0100 @@ -21,11 +21,14 @@ #include "ParticleSystem.h" #include "common/math.h" +#include "modules/math/Math.h" #include "OpenGL.h" #include <cmath> #include <cstdlib> +using love::math::Math; + namespace love { namespace graphics @@ -45,7 +48,7 @@ { float low = inner - (outer/2.0f)*var; float high = inner + (outer/2.0f)*var; - float r = random(); + float r = Math::instance.random(); return low*(1-r)+high*r; } @@ -124,7 +127,7 @@ if (min == max) pLast->life = min; else - pLast->life = random(min, max); + pLast->life = Math::instance.random(min, max); pLast->lifetime = pLast->life; pLast->position[0] = position.getX(); @@ -133,12 +136,12 @@ switch (areaSpreadDistribution) { case DISTRIBUTION_UNIFORM: - pLast->position[0] += random(-areaSpread.getX(), areaSpread.getX()); - pLast->position[1] += random(-areaSpread.getY(), areaSpread.getY()); + pLast->position[0] += Math::instance.random(-areaSpread.getX(), areaSpread.getX()); + pLast->position[1] += Math::instance.random(-areaSpread.getY(), areaSpread.getY()); break; case DISTRIBUTION_NORMAL: - pLast->position[0] += random_normal(areaSpread.getX()); - pLast->position[1] += random_normal(areaSpread.getY()); + pLast->position[0] += Math::instance.randnormal(areaSpread.getX()); + pLast->position[1] += Math::instance.randnormal(areaSpread.getY()); break; case DISTRIBUTION_NONE: default: @@ -147,37 +150,37 @@ min = direction - spread/2.0f; max = direction + spread/2.0f; - pLast->direction = random(min, max); + pLast->direction = Math::instance.random(min, max); pLast->origin = position; min = speedMin; max = speedMax; - float speed = random(min, max); + float speed = Math::instance.random(min, max); pLast->speed = love::Vector(cos(pLast->direction), sin(pLast->direction)); pLast->speed *= speed; min = gravityMin; max = gravityMax; - pLast->gravity = random(min, max); + pLast->gravity = Math::instance.random(min, max); min = radialAccelerationMin; max = radialAccelerationMax; - pLast->radialAcceleration = random(min, max); + pLast->radialAcceleration = Math::instance.random(min, max); min = tangentialAccelerationMin; max = tangentialAccelerationMax; - pLast->tangentialAcceleration = random(min, max); + pLast->tangentialAcceleration = Math::instance.random(min, max); - pLast->sizeOffset = random(sizeVariation); // time offset for size change - pLast->sizeIntervalSize = (1.0f - random(sizeVariation)) - pLast->sizeOffset; + pLast->sizeOffset = Math::instance.random(sizeVariation); // time offset for size change + pLast->sizeIntervalSize = (1.0f - Math::instance.random(sizeVariation)) - pLast->sizeOffset; pLast->size = sizes[(size_t)(pLast->sizeOffset - .5f) * (sizes.size() - 1)]; min = rotationMin; max = rotationMax; pLast->spinStart = calculate_variation(spinStart, spinEnd, spinVariation); pLast->spinEnd = calculate_variation(spinEnd, spinStart, spinVariation); - pLast->rotation = random(min, max); + pLast->rotation = Math::instance.random(min, max); pLast->color = colors[0];
