Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/model/tags.h')
-rw-r--r--src/model/tags.h503
1 files changed, 503 insertions, 0 deletions
diff --git a/src/model/tags.h b/src/model/tags.h
new file mode 100644
index 0000000..0c97910
--- /dev/null
+++ b/src/model/tags.h
@@ -0,0 +1,503 @@
+/*
+ model/classes.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_MODEL_TAGS_H__
+#define __INCLUDED_MODEL_TAGS_H__
+
+#include "math/axis.h"
+#include "math/color.h"
+#include "math/vector3f.h"
+
+namespace model
+{
+
+/* ---- globals ---------------------------------------------------- */
+
+// FIXME this should end up in material.h
+/**
+ * @brief
+ * culling parameter values
+ * Culling is a paremeter used by flares and particles to indicate
+ * with side of the polygons should be culled during rendering
+ */
+enum Cull { CullNone = 0, CullBack = 1, CullFront = 2 };
+
+/* ---- class Tag -------------------------------------------------- */
+
+/**
+ * @brief a location tag
+ * A location tag provides an anchor point for model extenions
+ * like lights, flares and sounds.
+ */
+
+class Tag
+{
+public:
+ /**
+ * @brief default constructor
+ */
+ inline Tag() : tag_location() {
+ }
+
+ /**
+ * @brief copy constructor
+ */
+ inline Tag(const Tag& other) : tag_location(other.location()) {
+ }
+
+ /**
+ * @brief constructor with location
+ * @param location location of this part within the parent model
+ */
+ inline Tag(const math::Vector3f& location) : tag_location(location) {
+ }
+
+ /* ---- inspectors ----------------------------------------- */
+
+ /**
+ * @brief location of this part within the parent model
+ */
+ inline const math::Vector3f& location() const {
+ return tag_location;
+ }
+
+ /* ---- mutators ------------------------------------------- */
+ /**
+ * @brief set the location within the parent model
+ */
+ inline void set_location(const math::Vector3f& location) {
+ tag_location.assign(location);
+ }
+
+ /**
+ * @brief set the location within the parent model
+ */
+ inline void set_location(const float x, const float y, const float z) {
+ tag_location.assign(x, y, z);
+ }
+
+ /* ---- actors --------------------------------------------- */
+
+ /**
+ * @brief mutable reference to the location of this part within the parent model
+ */
+ inline math::Vector3f& get_location() {
+ return tag_location;
+ }
+
+private:
+ math::Vector3f tag_location;
+};
+
+/* ---- class Light ------------------------------------------------ */
+
+/**
+ * @brief an exterior light
+ * a tag used to attach exterior lights
+ */
+class Light : public Tag
+{
+public:
+ /**
+ * @brief default constructor
+ */
+ Light();
+
+ /**
+ * @brief copy constructor
+ */
+ Light(const Light& other);
+
+ /**
+ * @brief destructor
+ */
+ ~Light();
+
+ /* ---- inspectors ----------------------------------------- */
+
+ /// light color
+ inline const math::Color& color() const {
+ return light_color;
+ };
+
+ /// true if this is a strobe light
+ inline bool strobe() const {
+ return light_strobe;
+ }
+
+ /// true if this light has entity color
+ inline bool entity() const {
+ return light_entity;
+ }
+
+ /// true if this light has engine activation
+ inline bool engine() const {
+ return light_engine;
+ }
+
+ /// size of the light, default is 1.0f
+ inline float radius() const {
+ return light_radius;
+ }
+
+ /// strobe time offset, in seconds
+ inline float offset() const {
+ return light_offset;
+ }
+
+ /// strobe frequency in strobes per second, default is 1.0f
+ inline float frequency() const {
+ return light_frequency;
+ }
+
+ /// fraction a strobe light will be on, default is 0.5f
+ inline float time() const {
+ return light_time;
+ }
+
+ /// flare texture number
+ inline unsigned int flare() const {
+ return light_flare;
+ }
+
+ /// render texture id
+ inline size_t texture() const {
+ return light_texture;
+ }
+ /* ---- mutators ------------------------------------------- */
+
+ /**
+ * @brief set strobe color on or off
+ */
+ inline void set_strobe(const bool strobe) {
+ light_strobe = strobe;
+ }
+
+ /**
+ * @brief set entity color on or off
+ */
+ inline void set_entity(const bool entity) {
+ light_entity = entity;
+ }
+
+ /**
+ * @brief set engine activation on or off
+ */
+ inline void set_engine(const bool engine) {
+ light_engine = engine;
+ }
+
+ /**
+ * @brief set the light radius
+ */
+ inline void set_radius(const float radius) {
+ light_radius = radius;
+ }
+
+ /**
+ * @brief set the light strobe frequency, in strobes per second
+ */
+ inline void set_frequency(const float frequency) {
+ light_frequency = frequency;
+ }
+
+ /**
+ * @brief set the light on time, from 0.0 (always off) to 1.0 (always on)
+ */
+ inline void set_time(const float time) {
+ light_radius = time;
+ }
+
+ /**
+ * @brief set the light strobe time offset, in seconds
+ */
+ inline void set_offset(const float offset) {
+ light_offset = offset;
+ }
+
+ /**
+ * @brief set the flare texture number
+ */
+ inline void set_flare(unsigned int flare) {
+ light_flare = flare;
+ }
+
+ /**
+ * @brief set the render texture id
+ */
+ inline void set_texture(size_t texture) {
+ light_texture = texture;
+ }
+
+ /**
+ * @brief mutable reference to the color
+ */
+ inline math::Color& get_color() {
+ return light_color;
+ }
+
+private:
+ bool light_strobe;
+ bool light_engine;
+ bool light_entity;
+
+ unsigned int light_flare;
+
+ float light_radius;
+ float light_frequency;
+ float light_offset;
+ float light_time;
+
+ math::Color light_color;
+
+ size_t light_texture;
+};
+
+/* ---- class Flare ------------------------------------------------ */
+
+/**
+ * @brief a directional light
+ */
+class Flare : public Light
+{
+public:
+ Flare();
+
+ /**
+ * @brief copy constructor
+ */
+ Flare(const Flare& other);
+
+ ~Flare();
+
+ /* ---- inspectors ----------------------------------------- */
+
+ inline const math::Axis &axis() const {
+ return flare_axis;
+ }
+
+ inline Cull cull() const {
+ return flare_cull;
+ }
+
+ /* ---- mutators ------------------------------------------- */
+
+ inline void set_cull(const Cull cull) {
+ flare_cull = cull;
+ }
+
+ /* ---- actors --------------------------------------------- */
+
+ /**
+ * @brief mutable reference to the axis
+ */
+ inline math::Axis& get_axis() {
+ return flare_axis;
+ }
+
+private:
+ Cull flare_cull;
+ math::Axis flare_axis;
+};
+
+/* ---- class Particles -------------------------------------------- */
+
+/// a particle system
+class Particles : public Tag
+{
+public:
+ Particles();
+
+ Particles(const math::Vector3f & location);
+
+ ~Particles();
+
+ inline const math::Axis &axis() const {
+ return particles_axis;
+ }
+
+ inline const std::string& script() const {
+ return particles_script;
+ }
+
+ inline bool entity() const {
+ return particles_entity;
+ }
+
+ inline bool engine() const {
+ return particles_engine;
+ }
+
+ inline float radius() const {
+ return particles_radius;
+ }
+
+ inline Cull cull() const {
+ return particles_cull;
+ }
+
+ /* ---- mutators ------------------------------------------- */
+
+ /**
+ * @brief set entity color on or off
+ */
+ inline void set_entity(const bool entity) {
+ particles_entity = entity;
+ }
+
+ /**
+ * @brief set engine activation on or off
+ */
+ inline void set_engine(const bool engine) {
+ particles_engine = engine;
+ }
+
+ inline void set_radius(const float radius) {
+ particles_radius = radius;
+ }
+
+ inline void set_cull(const Cull cull) {
+ particles_cull = cull;
+ }
+
+ inline void set_script(const std::string& script) {
+ particles_script.assign(script);
+ }
+
+ /* ---- actors --------------------------------------------- */
+
+ /**
+ * @brief mutable reference to the axis
+ */
+ inline math::Axis& get_axis() {
+ return particles_axis;
+ }
+
+private:
+ bool particles_entity;
+ bool particles_engine;
+
+ Cull particles_cull;
+
+ float particles_radius;
+
+ math::Axis particles_axis;
+ std::string particles_script;
+};
+
+/* ---- class Dock ------------------------------------------------- */
+
+/// a docking location tag
+class Dock : public Tag
+{
+public:
+ Dock();
+
+ /**
+ * @brief copy constructor
+ */
+ Dock(const Dock& other);
+
+ ~Dock();
+
+ /// dock radius, default is 0.01f
+ inline float radius() const {
+ return dock_radius;
+ }
+
+ /// set dock radius
+ inline void set_radius(const float radius) {
+ dock_radius = radius;
+ }
+
+private:
+ float dock_radius;
+};
+
+/* ---- class Sound ------------------------------------------------ */
+
+/**
+ * @brief a sound location tag
+ */
+class Sound : public Tag
+{
+public:
+ Sound();
+
+ Sound(const Sound& other);
+
+ ~Sound();
+
+ /// name of the sound sample
+ inline const std::string& name() const {
+ return sound_name;
+ }
+
+ inline void set_name(const std::string& name) {
+ sound_name.assign(name);
+ }
+private:
+ std::string sound_name;
+};
+
+/* ---- class SubModel --------------------------------------------- */
+
+/**
+ * @brief a submodel tag
+ */
+class SubModel : public Tag
+{
+public:
+ SubModel();
+
+ SubModel(const SubModel& other);
+
+ ~SubModel();
+
+ inline const std::string& name() const {
+ return submodel_name;
+ }
+
+ inline const math::Axis& axis() const {
+ return submodel_axis;
+ }
+
+ inline float scale() const {
+ return submodel_scale;
+ }
+
+
+ inline void set_scale(const float scale) {
+ submodel_scale = scale;
+ }
+
+ inline void set_name(const std::string& name) {
+ submodel_name.assign(name);
+ }
+
+ inline void set_axis(const math::Axis& axis) {
+ submodel_axis.assign(axis);
+ }
+
+ /* ---- actors --------------------------------------------- */
+
+ /**
+ * @brief mutable reference to the axis
+ */
+ inline math::Axis& get_axis() {
+ return submodel_axis;
+ }
+
+private:
+ float submodel_scale;
+ std::string submodel_name;
+ math::Axis submodel_axis;
+};
+
+}
+
+#endif // __INCLUDED_MODEL_PARTS_H__
+