diff options
-rw-r--r-- | src/game/base/ship.cc | 7 | ||||
-rw-r--r-- | src/model/engine.cc | 7 | ||||
-rw-r--r-- | src/model/engine.h | 29 | ||||
-rw-r--r-- | src/model/flare.cc | 1 | ||||
-rw-r--r-- | src/model/flare.h | 6 | ||||
-rw-r--r-- | src/model/map.cc | 36 | ||||
-rw-r--r-- | src/render/Makefile.am | 9 | ||||
-rw-r--r-- | src/render/draw.cc | 114 | ||||
-rw-r--r-- | src/render/particles.cc | 144 | ||||
-rw-r--r-- | src/render/particles.h | 73 | ||||
-rw-r--r-- | src/render/renderext.cc | 32 | ||||
-rw-r--r-- | src/render/renderext.h | 20 | ||||
-rw-r--r-- | src/render/tgafile.cc | 2 |
13 files changed, 376 insertions, 104 deletions
diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc index 214d234..5473581 100644 --- a/src/game/base/ship.cc +++ b/src/game/base/ship.cc @@ -60,7 +60,12 @@ void Ship::reset() } void Ship::func_impulse() { - if ((entity_eventstate == core::Entity::Impulse) || (entity_eventstate == core::Entity::ImpulseInitiate)) { + if (entity_eventstate == core::Entity::Impulse) { + entity_eventstate = core::Entity::Normal; + target_thrust = 1.0f; + entity_thrust = 1.0f; + + } else if (entity_eventstate == core::Entity::ImpulseInitiate) { entity_eventstate = core::Entity::Normal; } else if (entity_eventstate != core::Entity::Normal) { diff --git a/src/model/engine.cc b/src/model/engine.cc index 97011d9..959f2ce 100644 --- a/src/model/engine.cc +++ b/src/model/engine.cc @@ -11,17 +11,12 @@ namespace model { -/* ---------- core::Engine ------------------------------------------ */ +/* ---- class Engine ----------------------------------------------- */ Engine::Engine() : engine_location() { engine_radius = 1.0f; - engine_flare = 0; - render_texture = 0; - - engine_notrail = false; - engine_noflare = false; } Engine::Engine(math::Vector3f const & location) : diff --git a/src/model/engine.h b/src/model/engine.h index 724c060..68f16e5 100644 --- a/src/model/engine.h +++ b/src/model/engine.h @@ -31,36 +31,9 @@ public: { return engine_radius; } - - inline unsigned int flare() const - { - return engine_flare; - } - - inline unsigned int texture() const - { - return render_texture; - } - - inline bool noflare() const - { - return engine_noflare; - } - - inline bool notrail() const - { - return engine_notrail; - } - + math::Vector3f engine_location; float engine_radius; - unsigned int engine_flare; - - - bool engine_noflare; - bool engine_notrail; - - unsigned int render_texture; }; } diff --git a/src/model/flare.cc b/src/model/flare.cc index 0669a49..5491dd2 100644 --- a/src/model/flare.cc +++ b/src/model/flare.cc @@ -12,6 +12,7 @@ namespace model Flare::Flare() : Light() { flare_angle = 0; + flare_engine = false; } Flare::~Flare() diff --git a/src/model/flare.h b/src/model/flare.h index 6f96d8c..6affe55 100644 --- a/src/model/flare.h +++ b/src/model/flare.h @@ -24,7 +24,13 @@ public: return flare_angle; } + inline bool engine() const + { + return flare_engine; + } + float flare_angle; + bool flare_engine; }; } diff --git a/src/model/map.cc b/src/model/map.cc index 6f3ff9e..1767743 100644 --- a/src/model/map.cc +++ b/src/model/map.cc @@ -822,6 +822,10 @@ Model * Map::load(std::string const &name) continue; } else if (mapfile.got_key_color("enginecolor", model->model_enginecolor) ==0) { continue; + + } else if (mapfile.got_key()) { + con_warn "unknown key " << mapfile.classname() << ":" << mapfile.key() << std::endl; + } } else if (mapfile.got_classend("func_group")) { @@ -856,6 +860,9 @@ Model * Map::load(std::string const &name) } else if (mapfile.got_key_float("light", light->light_radius)) { light->light_radius /= 100.0f; + } else if (mapfile.got_key_float("radius", light->light_radius)) { + light->light_radius /= 100.0f; + } else if (mapfile.got_key_float("frequency", light->light_frequency)) { continue; @@ -868,6 +875,9 @@ Model * Map::load(std::string const &name) } else if (mapfile.got_key_int("flare", light->light_flare)) { continue; + } else if (mapfile.got_key()) { + con_warn "unknown key " << mapfile.classname() << ":" << mapfile.key() << std::endl; + } } else if (mapfile.got_classname("trigger_dock")) { @@ -886,7 +896,13 @@ Model * Map::load(std::string const &name) } else if (mapfile.got_key_float("radius", dock->dock_radius)) { dock->dock_radius /= 100.0f; continue; - + + } else if (mapfile.got_key("angle")) { + continue; + + } else if (mapfile.got_key()) { + con_warn "unknown key " << mapfile.classname() << ":" << mapfile.key() << std::endl; + } } else if (mapfile.got_classname("target_flare")) { @@ -908,6 +924,7 @@ Model * Map::load(std::string const &name) } else if (mapfile.got_key_int("spawnflags", u)) { flare->light_strobe = spawnflag_isset(u, 1); flare->light_entity = spawnflag_isset(u, 2); + flare->flare_engine = spawnflag_isset(u, 4); } else if (mapfile.got_key_float("radius", flare->light_radius)) { flare->light_radius /= 100.0f; @@ -923,11 +940,13 @@ Model * Map::load(std::string const &name) } else if (mapfile.got_key_int("flare", flare->light_flare)) { continue; - + } else if (mapfile.got_key_float("angle", flare->flare_angle)) { flare->flare_angle = math::degrees360f(flare->flare_angle); continue; + } else if (mapfile.got_key()) { + con_warn "unknown key " << mapfile.classname() << ":" << mapfile.key() << std::endl; } } else if (mapfile.got_classname("target_engine")) { @@ -945,15 +964,14 @@ Model * Map::load(std::string const &name) } else if (mapfile.got_key_float("radius", engine->engine_radius)) { engine->engine_radius /= 100.0f; continue; - - } else if (mapfile.got_key_int("flare", engine->engine_flare)) { - continue; - - } else if (mapfile.got_key_int("spawnflags", u)) { - engine->engine_noflare = spawnflag_isset(u, 1); - engine->engine_notrail = spawnflag_isset(u, 2); + + } else if (mapfile.got_key("angle")) { continue; + + } else if (mapfile.got_key()) { + con_warn "unknown key " << mapfile.classname() << ":" << mapfile.key() << std::endl; } + } } diff --git a/src/render/Makefile.am b/src/render/Makefile.am index 4054490..9fd8f50 100644 --- a/src/render/Makefile.am +++ b/src/render/Makefile.am @@ -10,7 +10,8 @@ endif librender_la_LDFLAGS = -avoid-version -no-undefined @GL_LIBS@ librender_la_LIBADD = $(top_builddir)/src/math/libmath.la librender_la_SOURCES = camera.cc draw.cc dust.cc gl.cc image.cc jpgfile.cc \ - pngfile.cc render.cc renderext.cc screenshot.cc state.cc text.cc textures.cc \ - tgafile.cc -noinst_HEADERS = camera.h draw.h dust.h gl.h image.h jpgfile.h pngfile.h \ - render.h renderext.h screenshot.h state.h text.h textures.h tgafile.h + particles.cc pngfile.cc render.cc renderext.cc screenshot.cc state.cc text.cc \ + textures.cc tgafile.cc +noinst_HEADERS = camera.h draw.h dust.h gl.h image.h jpgfile.h particles.h \ + pngfile.h render.h renderext.h screenshot.h state.h text.h \ + textures.h tgafile.h diff --git a/src/render/draw.cc b/src/render/draw.cc index 4f58f3d..a700d14 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -225,8 +225,19 @@ void draw_globe(core::EntityGlobe *globe) glLightfv(GL_LIGHT1, GL_POSITION, fake_light); } } + gl::push(); gl::translate(location); + gl::multmatrix(globe->axis()); + + if (globe->rotationspeed()) { + float angle = math::degrees360f(core::application()->time() * globe->rotationspeed()); + gl::rotate(angle, math::Vector3f::Zaxis()); + } + + draw_sphere(globe->color(), radius); + gl::pop(); + if(flag_is_set(globe->flags(), core::Entity::Bright)) { @@ -234,19 +245,16 @@ void draw_globe(core::EntityGlobe *globe) v.normalize(); float a = dotproduct(v, Camera::axis().forward()); if (a > 0.1f) { - // FIXME a corona is actually just a giant flare + // FIXME a corona is actually just a giant flare if (!globe->render_texture) { gl::enable(GL_TEXTURE_2D); } Textures::bind("bitmaps/fx/corona"); - + /* if (ext_render(globe)->distance() <= farplane) { gl::depthmask(GL_FALSE); - } - - //glDisableClientState(GL_VERTEX_ARRAY); - //glDisableClientState(GL_TEXTURE_COORD_ARRAY); - //glDisableClientState(GL_NORMAL_ARRAY); + }*/ + gl::disable(GL_DEPTH_TEST); math::Color color(globe->color()); color.a = a - 0.1f; @@ -256,42 +264,30 @@ void draw_globe(core::EntityGlobe *globe) gl::begin(gl::Quads); glTexCoord2f(0,1); - gl::vertex((Camera::axis().up() - Camera::axis().left()) * radius * 4.0f); + gl::vertex(location+ (Camera::axis().up() - Camera::axis().left()) * radius * 4.0f); glTexCoord2f(0,0); - gl::vertex((Camera::axis().up() + Camera::axis().left()) * radius * 4.0f); + gl::vertex(location+ (Camera::axis().up() + Camera::axis().left()) * radius * 4.0f); glTexCoord2f(1,0); - gl::vertex((Camera::axis().up() * -1 + Camera::axis().left()) * radius * 4.0f); + gl::vertex(location+ (Camera::axis().up() * -1 + Camera::axis().left()) * radius * 4.0f); glTexCoord2f(1,1); - gl::vertex((Camera::axis().up() * -1 - Camera::axis().left()) * radius * 4.0f); + gl::vertex(location+ (Camera::axis().up() * -1 - Camera::axis().left()) * radius * 4.0f); gl::end(); Stats::quads++; - - //glEnableClientState(GL_VERTEX_ARRAY); - //glEnableClientState(GL_TEXTURE_COORD_ARRAY); - //glEnableClientState(GL_NORMAL_ARRAY); gl::disable(GL_BLEND); + /* if (ext_render(globe)->distance() <= farplane) { gl::depthmask(GL_TRUE); - } + }*/ if (!globe->render_texture) { gl::disable(GL_TEXTURE_2D); } - } - } - - gl::multmatrix(globe->axis()); - - if (globe->rotationspeed()) { - float angle = math::degrees360f(core::application()->time() * globe->rotationspeed()); - gl::rotate(angle, math::Vector3f::Zaxis()); + gl::enable(GL_DEPTH_TEST); + } } - draw_sphere(globe->color(), radius); - - gl::pop(); if (ext_render(globe)->distance() > farplane) { @@ -713,28 +709,29 @@ void draw_pass_model_fragments() void draw_pass_model_fx(float elapsed) { - const size_t count = 8; // number of engine trail particles + //const size_t count = 8; // number of engine trail particles float t = 0.0f; - float u = 0.0f; + //float u = 0.0f; float a = 0.0f; float light_size = 0.0f; - float engine_size = 0.0f; - float trail_size = 0.0f; + //float engine_size = 0.0f; + //float trail_size = 0.0f; bool power = true; + float thrust; - math::Vector3f quad[4]; + //math::Vector3f quad[4]; math::Vector3f location; math::Vector3f offset; math::Color color; model::Light *light; model::Flare *flare; - model::Engine *engine; + //model::Engine *engine; math::Axis flare_axis; - size_t circle_texture = Textures::load("bitmaps/fx/circle01"); + //size_t circle_texture = Textures::load("bitmaps/fx/circle01"); size_t current_texture = Textures::bind("bitmaps/fx/flare00"); gl::enable(GL_TEXTURE_2D); @@ -744,6 +741,7 @@ void draw_pass_model_fx(float elapsed) core::Entity *entity = (*it); power = true; + if ((entity->type() == core::Entity::Dynamic) && (static_cast<core::EntityDynamic *>(entity)->eventstate() == core::Entity::NoPower)) { power = false; @@ -794,13 +792,24 @@ void draw_pass_model_fx(float elapsed) // draw flares for (model::Model::Flares::iterator flit = entity->model()->flares().begin(); flit != entity->model()->flares().end(); flit++) { flare = (*flit); - + + // engine flares + thrust = 1.0f; + if (flare->engine() && ( entity->type() == core::Entity::Controlable)) { + core::EntityControlable *ec = static_cast<core::EntityControlable *>(entity); + if ((ec->eventstate() == core::Entity::ImpulseInitiate) || (ec->eventstate() == core::Entity::Impulse)) { + thrust = 1.0f; + } else { + thrust = ec->thrust(); + } + } + // strobe frequency t = 1.0f; if (flare->strobe()) t = (core::application()->time() + ext_render(entity)->fuzz() - flare->offset()) * flare->frequency(); - if ((!flare->strobe()) || (( t - floorf(t)) <= flare->time())) { + if ((thrust > 0 ) && ((!flare->strobe()) || (( t - floorf(t)) <= flare->time()))) { flare_axis.assign(entity->axis()); if (flare->angle()) flare_axis.change_direction(flare->angle()); @@ -819,10 +828,19 @@ void draw_pass_model_fx(float elapsed) } else { color.assign(flare->color()); } - + a = dotproduct(flare_axis.forward(), Camera::axis().forward()); if (a < -0.1f) { - color.a = -a - 0.1f; + a = -a - 0.1f; + if (flare->entity()) { + color.assign(entity->color()); + } else if (flare->engine()) { + color.assign(entity->model()->enginecolor()); + a *= thrust; + } else { + color.assign(flare->color()); + } + color.a = a; gl::color(color); glTexCoord2f(0,1); @@ -840,6 +858,7 @@ void draw_pass_model_fx(float elapsed) } } +/* // draw model engines for Controlable entities if ((entity->type() == core::Entity::Controlable) && entity->model()->engines().size()) { core::EntityControlable *ec = static_cast<core::EntityControlable *>(entity); @@ -936,10 +955,27 @@ void draw_pass_model_fx(float elapsed) } } } - } + */ + + // draw particles + if (ext_render(entity)->particles().size()) { + gl::end(); + gl::disable(GL_CULL_FACE); + + for (RenderExt::Particles::iterator it = ext_render(entity)->particles().begin(); it != ext_render(entity)->particles().end(); it++) { + ParticleStream *particles = (*it); + particles->draw(); + } + + gl::enable(GL_CULL_FACE); + current_texture = Textures::bind("bitmaps/fx/flare00"); + gl::begin(gl::Quads); + } + } } gl::end(); + gl::disable(GL_TEXTURE_2D); } diff --git a/src/render/particles.cc b/src/render/particles.cc new file mode 100644 index 0000000..94a3a07 --- /dev/null +++ b/src/render/particles.cc @@ -0,0 +1,144 @@ +/* + render/particles.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#include "render/particles.h" +#include "render/camera.h" +#include "render/gl.h" +#include "render/draw.h" +#include "render/textures.h" + +#include "core/application.h" +namespace render { + +/* ---- class Particle --------------------------------------------- */ + +Particle::Particle(const math::Vector3f &location, float time) : particle_location(location) +{ + particle_time = time; +} + +Particle::Particle(const math::Vector3f &location, const math::Vector3f &up, const math::Vector3f &left, float time) : particle_location(location), particle_up(up), particle_left(left) +{ + particle_time = time; +} + +/* ---- class ParticleStream --------------------------------------- */ + +ParticleStream::ParticleStream(const math::Vector3f &location, const math::Color &color, float radius, size_t texture, core::EntityControlable *entity, bool oriented) : particles_location(location), particles_color(color) +{ + particles_texture = texture; + particles_entity = entity; + if (!entity) { + particles_oriented = false; + } else { + particles_oriented = oriented; + } + + particles_radius = radius; + + particles_timeout = 1.5f; // a particles lives for 3 seconds + particles_eject = 0.02f; // a particle is ejected every 0.2 seconds + + particles_last_eject = 0; // timestamp of the last eject +} + +ParticleStream::~ParticleStream() +{ + for (Particles::iterator it = particles_stream.begin(); it != particles_stream.end(); it++) { + delete (*it); + } + particles_stream.clear(); +} + +void ParticleStream::draw() { + float now = core::application()->time(); + + // remove dead particles + Particles::iterator it = particles_stream.begin(); + while ((it != particles_stream.end()) && ((*it)->time() + particles_timeout <= now)) { + delete (*it); + particles_stream.erase(it); + it = particles_stream.begin(); + } + + // add new particles + if (particles_last_eject + particles_eject <= now) { + if (particles_entity) { + float u = 0; + if ((particles_entity->eventstate() == core::Entity::ImpulseInitiate ) || (particles_entity->eventstate() == core::Entity::Impulse)) { + u = 1.0f; + } else if(particles_entity->eventstate() == core::Entity::Normal) { + u = particles_entity->thrust(); + } + if (u > 0.0f) { + math::Vector3f l(particles_entity->location() + (particles_entity->axis() * location())); + Particle *p = 0; + if (particles_oriented) { + p = new Particle(l, particles_entity->axis().up(), particles_entity->axis().left(), now); + } else { + p = new Particle(l, now); + } + particles_stream.push_back(p); + } + } else { + particles_stream.push_back(new Particle(location(), now)); + } + particles_last_eject = now; + } + + math::Vector3f quad[4]; + + if (particles_stream.size()) { + Textures::bind(particles_texture); + gl::begin(gl::Quads); + + for (Particles::reverse_iterator rit = particles_stream.rbegin(); rit != particles_stream.rend(); rit++) { + Particle *particle = (*rit); + + if (particles_oriented) { + quad[0].assign(particle->up() - particle->left()); + quad[1].assign(particle->up() + particle->left()); + quad[2].assign(particle->up() * -1 + particle->left()); + quad[3].assign(particle->up() * -1 - particle->left()); + } else { + quad[0].assign(Camera::axis().up() - Camera::axis().left()); + quad[1].assign(Camera::axis().up() + Camera::axis().left()); + quad[2].assign(Camera::axis().up() * -1 + Camera::axis().left()); + quad[3].assign(Camera::axis().up() * -1 - Camera::axis().left()); + } + + float t = now - particle->time(); + float f = 0; + + if (t < particles_timeout * 0.1f) { + f = t / (0.1f * particles_timeout); + } else { + t = t - particles_timeout * 0.1f; + f = t / (0.9f * particles_timeout); + f = 1.0 - f; + } + + f *= f; + float radius = particles_radius * f; + particles_color.a = f; + gl::color(particles_color); + + glTexCoord2f(0,1); + gl::vertex(particle->location() + quad[0] * radius); + glTexCoord2f(0,0); + gl::vertex(particle->location() + quad[1] * radius); + glTexCoord2f(1,0); + gl::vertex(particle->location() + quad[2] * radius); + glTexCoord2f(1,1); + gl::vertex(particle->location() + quad[3] * radius); + Stats::quads++; + } + + gl::end(); + } +} + +} // namespace render diff --git a/src/render/particles.h b/src/render/particles.h new file mode 100644 index 0000000..400971c --- /dev/null +++ b/src/render/particles.h @@ -0,0 +1,73 @@ +/* + render/particles.h + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2 +*/ + +#ifndef __INCLUDED_RENDER_PARTICLES_H__ +#define __INCLUDED_RENDER_PARTICLES_H__ + +#include <deque> + +#include "math/color.h" +#include "math/vector3f.h" +#include "core/entity.h" + +namespace render { + +class Particle { +public: + Particle(const math::Vector3f &location, float time); + Particle(const math::Vector3f &location, const math::Vector3f &up, const math::Vector3f &left, float time); + + inline const math::Vector3f &location() const { return particle_location; } + + inline const math::Vector3f &up() const { return particle_up; } + + inline const math::Vector3f &left() const { return particle_left; } + + inline const float time() const { return particle_time; } + +protected: + math::Vector3f particle_location; + math::Vector3f particle_up; + math::Vector3f particle_left; + + float particle_time; +}; + + +class ParticleStream { +public: + ParticleStream(const math::Vector3f &location, const math::Color &color, float radius, size_t texture, core::EntityControlable *entity = 0, bool oriented = false); + ~ParticleStream(); + + void draw(); + + inline const size_t texture() const { return particles_texture; } + + inline const math::Vector3f &location() const { return particles_location; } + +protected: + typedef std::deque<Particle *> Particles; + + math::Vector3f particles_location; + math::Color particles_color; + size_t particles_texture; + bool particles_oriented; + + float particles_radius; + float particles_timeout; + float particles_eject; + + float particles_last_eject; + + core::EntityControlable *particles_entity; + + Particles particles_stream; +}; + + +} // namespace render + +#endif // __INCLUDED_RENDER_PARTICLES_H__ diff --git a/src/render/renderext.cc b/src/render/renderext.cc index ffe462f..5b6f3b4 100644 --- a/src/render/renderext.cc +++ b/src/render/renderext.cc @@ -23,10 +23,16 @@ RenderExt::RenderExt(core::Entity *entity) : core::Extension(core::Extension::Re state_detailvisible = false; state_fuzz = math::randomf(); - state_engine_trail_offset = 0; + //state_engine_trail_offset = 0; using namespace model; + if (!entity->model() && entity->modelname().size()) { + entity->set_modelname(entity->modelname()); + if (!entity->model()) + entity->set_modelname(""); + } + if (entity->model()) { model::Model *model = entity->model(); @@ -39,17 +45,20 @@ RenderExt::RenderExt(core::Entity *entity) : core::Extension(core::Extension::Re light->render_texture = Textures::load(flarename.str()); } - for(Model::Engines::iterator eit = model->engines().begin(); eit != model->engines().end(); eit++) { - Engine *engine = (*eit); + if ((entity->type() == core::Entity::Controlable) && entity->model()->engines().size()) { - if (!engine->flare()) engine->engine_flare = 1; + size_t trail_texure = Textures::load("bitmaps/fx/circle00"); - // load engine texture - std::stringstream flarename; - flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << engine->flare(); - engine->render_texture = Textures::load(flarename.str()); + for(Model::Engines::iterator eit = model->engines().begin(); eit != model->engines().end(); eit++) { + Engine *engine = (*eit); + + // add trail particles + math::Color c; + ParticleStream *p = new ParticleStream(engine->location(), c, 0.0625 * engine->radius(), trail_texure, static_cast<core::EntityControlable *>(entity), true); + state_particles.push_back(p); + } } - + for (Model::Flares::iterator flit = model->flares().begin(); flit != model->flares().end(); flit++) { Flare *flare = (*flit); @@ -58,6 +67,7 @@ RenderExt::RenderExt(core::Entity *entity) : core::Extension(core::Extension::Re flarename << "bitmaps/fx/flare" << std::setfill('0') << std::setw(2) << flare->flare(); flare->render_texture = Textures::load(flarename.str()); } + } else if (entity->type() == core::Entity::Globe) { core::EntityGlobe *globe = static_cast<core::EntityGlobe *>(entity); @@ -74,6 +84,10 @@ RenderExt::RenderExt(core::Entity *entity) : core::Extension(core::Extension::Re RenderExt::~RenderExt() { + for (Particles::iterator it = state_particles.begin(); it != state_particles.end(); it++) { + delete (*it); + } + state_particles.clear(); } void RenderExt::frame(float elapsed) diff --git a/src/render/renderext.h b/src/render/renderext.h index eafa707..eb2ae67 100644 --- a/src/render/renderext.h +++ b/src/render/renderext.h @@ -7,7 +7,10 @@ #ifndef __INCLUDED_RENDER_RENDEREXT_H__ #define __INCLUDED_RENDER_RENDEREXT_H__ +#include <list> + #include "core/extension.h" +#include "render/particles.h" namespace render { @@ -18,6 +21,8 @@ public: RenderExt(core::Entity *entity); ~RenderExt(); + typedef std::list<ParticleStream *> Particles; + virtual void frame(float elapsed); inline bool visible() const { return state_visible; } @@ -28,15 +33,16 @@ public: /// distance to the camera inline float distance() const { return state_distance; } - // FIXME - float state_engine_trail_offset; - + /// particles + inline Particles &particles() { return state_particles; } private: - bool state_visible; - bool state_detailvisible; + bool state_visible; + bool state_detailvisible; - float state_fuzz; - float state_distance; + float state_fuzz; + float state_distance; + + Particles state_particles; }; } // namespace render diff --git a/src/render/tgafile.cc b/src/render/tgafile.cc index 5a27648..c4e6b56 100644 --- a/src/render/tgafile.cc +++ b/src/render/tgafile.cc @@ -298,7 +298,7 @@ void TGA::save(const char *filename, Image & image) } else { - // compressed block and pixel data is identical + // compressed block and pixel data are identical if (memcmp(block_data, pixel_data, image.channels()) == 0) { block_length++; |