mirror of
https://github.com/Almamu/linux-wallpaperengine.git
synced 2025-07-15 05:42:23 +08:00

+ Added partial parsing of particles + Support for particle emitter parsing + Support for particle initializers parsing + Support for particle controlpoints parsing Signed-off-by: Alexis Maiquez <almamu@almamu.com>
128 lines
3.0 KiB
C++
128 lines
3.0 KiB
C++
#include "particle.h"
|
|
#include "../../../fs/utils.h"
|
|
|
|
#include <irrlicht/irrlicht.h>
|
|
|
|
using namespace wp::core::objects::particles;
|
|
|
|
particle* particle::fromFile (
|
|
const irr::io::path& filename,
|
|
irr::u32 id,
|
|
std::string name,
|
|
const irr::core::vector3df& origin,
|
|
const irr::core::vector3df& scale)
|
|
{
|
|
json data = json::parse (wp::fs::utils::loadFullFile (filename));
|
|
json::const_iterator controlpoint_it = data.find ("controlpoint");
|
|
json::const_iterator starttime_it = data.find ("starttime");
|
|
json::const_iterator maxcount_it = data.find ("maxcount");
|
|
json::const_iterator emitter_it = data.find ("emitter");
|
|
json::const_iterator initializer_it = data.find ("initializer");
|
|
|
|
if (starttime_it == data.end ())
|
|
{
|
|
throw std::runtime_error ("Particles must have start time");
|
|
}
|
|
|
|
if (maxcount_it == data.end ())
|
|
{
|
|
throw std::runtime_error ("Particles must have maximum count");
|
|
}
|
|
|
|
if (emitter_it == data.end ())
|
|
{
|
|
throw std::runtime_error ("Particles must have emitters");
|
|
}
|
|
|
|
if (initializer_it == data.end ())
|
|
{
|
|
throw std::runtime_error ("Particles must have initializers");
|
|
}
|
|
|
|
particle* particle = new class particle (
|
|
*starttime_it,
|
|
*maxcount_it,
|
|
id,
|
|
name,
|
|
origin,
|
|
scale
|
|
);
|
|
|
|
if (controlpoint_it != data.end ())
|
|
{
|
|
json::const_iterator cur = (*controlpoint_it).begin ();
|
|
json::const_iterator end = (*controlpoint_it).end ();
|
|
|
|
for (; cur != end; cur ++)
|
|
{
|
|
particle->insertControlPoint (
|
|
controlpoint::fromJSON (*cur)
|
|
);
|
|
}
|
|
}
|
|
|
|
json::const_iterator cur = (*emitter_it).begin ();
|
|
json::const_iterator end = (*emitter_it).end ();
|
|
|
|
for (; cur != end; cur ++)
|
|
{
|
|
particle->insertEmitter (
|
|
emitter::fromJSON (*cur)
|
|
);
|
|
}
|
|
|
|
cur = (*initializer_it).begin ();
|
|
end = (*initializer_it).end ();
|
|
|
|
for (; cur != end; cur ++)
|
|
{
|
|
particle->insertInitializer (
|
|
initializer::fromJSON (*cur)
|
|
);
|
|
}
|
|
|
|
return particle;
|
|
}
|
|
|
|
particle::particle (
|
|
irr::u32 starttime,
|
|
irr::u32 maxcount,
|
|
irr::u32 id,
|
|
std::string name,
|
|
const irr::core::vector3df& origin,
|
|
const irr::core::vector3df& scale):
|
|
object (true, id, std::move(name), origin, scale, irr::core::vector3df ()),
|
|
m_starttime (starttime),
|
|
m_maxcount (maxcount)
|
|
{
|
|
}
|
|
|
|
std::vector<emitter*>* particle::getEmitters ()
|
|
{
|
|
return &this->m_emitters;
|
|
}
|
|
|
|
std::vector<controlpoint*>* particle::getControlPoints ()
|
|
{
|
|
return &this->m_controlpoints;
|
|
}
|
|
|
|
std::vector<initializer*>* particle::getInitializers ()
|
|
{
|
|
return &this->m_initializers;
|
|
}
|
|
|
|
void particle::insertControlPoint (controlpoint* controlpoint)
|
|
{
|
|
this->m_controlpoints.push_back (controlpoint);
|
|
}
|
|
|
|
void particle::insertEmitter (emitter* emitter)
|
|
{
|
|
this->m_emitters.push_back (emitter);
|
|
}
|
|
|
|
void particle::insertInitializer (initializer* initializer)
|
|
{
|
|
this->m_initializers.push_back (initializer);
|
|
} |