124 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <malloc.h>
 | 
						|
 | 
						|
#include "particlesystem.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * Initializes a particle
 | 
						|
 */
 | 
						|
particle *initParticle(vector3f *pos, vector3f *dir, vector3f *color, float age)
 | 
						|
{
 | 
						|
    particle *p = malloc(sizeof(particle));
 | 
						|
    p->position = pos;
 | 
						|
    p->direction = dir;
 | 
						|
    p->color = color;
 | 
						|
    p->age = age;
 | 
						|
    return p;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Initializes an emitter
 | 
						|
 */
 | 
						|
emitter *initEmitter(vector3f *pos, int pamount)
 | 
						|
{
 | 
						|
    emitter *e = malloc(sizeof(emitter));
 | 
						|
    e->position = pos;
 | 
						|
    e->particles = malloc(sizeof(particle *) * pamount);
 | 
						|
    e->pamount = pamount;
 | 
						|
    return e;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Initializes a particle system
 | 
						|
 */
 | 
						|
particle_system *initParticleSystem(int eamount)
 | 
						|
{
 | 
						|
    particle_system *ps = malloc(sizeof(particle_system));
 | 
						|
    ps->emitters = malloc(sizeof(emitter *) * eamount);
 | 
						|
    ps->eamount = eamount;
 | 
						|
    return ps;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Updates particles
 | 
						|
 */
 | 
						|
int updateParticles(float dt, particle_system *ps, CalculatePositionFunction calculatePosition, CalculateColorFunction calculateColor)
 | 
						|
{
 | 
						|
    emitter *e;
 | 
						|
    particle *p;
 | 
						|
    for (int i = 0; i < ps->eamount; i++)
 | 
						|
    {
 | 
						|
        e = (ps->emitters)[i];
 | 
						|
        for (int j = 0; j < e->pamount; j++)
 | 
						|
        {
 | 
						|
            p = (e->particles)[j];
 | 
						|
            calculatePosition(p, dt);
 | 
						|
            calculateColor(p);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Draws particles
 | 
						|
 */
 | 
						|
int drawParticles(particle_system *particleSystem)
 | 
						|
{
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Initializes a vector
 | 
						|
 * For that it allocates memory that must be freed later
 | 
						|
 */
 | 
						|
vector3f *initVector3f(float x, float y, float z)
 | 
						|
{
 | 
						|
    vector3f *vector = malloc(sizeof(vector3f));
 | 
						|
    vector->x = x;
 | 
						|
    vector->y = y;
 | 
						|
    vector->z = z;
 | 
						|
    return vector;
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Frees a given particle and all corresponding data
 | 
						|
 */
 | 
						|
void freeParticle(particle *p)
 | 
						|
{
 | 
						|
    free(p->position);
 | 
						|
    free(p->direction);
 | 
						|
    free(p->color);
 | 
						|
    free(p);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Frees a given emitter and all corresponding particles
 | 
						|
 */
 | 
						|
void freeEmitter(emitter *e)
 | 
						|
{
 | 
						|
    for (int j = 0; j < e->pamount; j++)
 | 
						|
    {
 | 
						|
        freeParticle((e->particles)[j]);
 | 
						|
    }
 | 
						|
 | 
						|
    free(e);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Frees all emitters within a particle system
 | 
						|
 */
 | 
						|
void freeEmitters(particle_system *ps)
 | 
						|
{
 | 
						|
    for (int i = 0; i < ps->eamount; i++)
 | 
						|
    {
 | 
						|
        freeEmitter((ps->emitters)[i]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Frees all emitters and particles within a particle system
 | 
						|
 */
 | 
						|
void freeParticleSystem(particle_system *ps)
 | 
						|
{
 | 
						|
    freeEmitters(ps);
 | 
						|
    free(ps);
 | 
						|
}
 |