diff options
-rw-r--r-- | src/core/cvar.cc | 37 | ||||
-rw-r--r-- | src/core/cvar.h | 96 | ||||
-rw-r--r-- | src/core/entity.cc | 72 | ||||
-rw-r--r-- | src/core/entity.h | 139 | ||||
-rw-r--r-- | src/core/gameconnection.cc | 2 | ||||
-rw-r--r-- | src/core/netserver.cc | 2 | ||||
-rw-r--r-- | src/core/parser.cc | 2 | ||||
-rw-r--r-- | src/game/base/jumppoint.cc | 10 | ||||
-rw-r--r-- | src/game/base/navpoint.cc | 6 | ||||
-rw-r--r-- | src/game/base/planet.cc | 4 | ||||
-rw-r--r-- | src/game/base/racetrack.cc | 6 | ||||
-rw-r--r-- | src/game/base/ship.cc | 182 | ||||
-rw-r--r-- | src/game/base/star.cc | 6 | ||||
-rw-r--r-- | src/game/example/example.cc | 10 | ||||
-rw-r--r-- | src/game/example/spectator.cc | 18 | ||||
-rw-r--r-- | src/game/intro/convoy.cc | 6 | ||||
-rw-r--r-- | src/model/asefile.cc | 2 | ||||
-rw-r--r-- | src/model/mapfile.cc | 80 | ||||
-rw-r--r-- | src/model/mapfile.h | 4 | ||||
-rw-r--r-- | src/model/triangle.cc | 24 | ||||
-rw-r--r-- | src/model/triangle.h | 172 | ||||
-rw-r--r-- | src/render/camera.cc | 4 | ||||
-rw-r--r-- | src/render/draw.cc | 41 | ||||
-rw-r--r-- | src/render/render.cc | 9 | ||||
-rw-r--r-- | src/render/render.h | 2 |
25 files changed, 523 insertions, 413 deletions
diff --git a/src/core/cvar.cc b/src/core/cvar.cc index 2a9fd67..1732d1a 100644 --- a/src/core/cvar.cc +++ b/src/core/cvar.cc @@ -36,19 +36,18 @@ Cvar *Cvar::net_framerate = 0; Cvar::Registry Cvar::cvar_registry; -Cvar::Cvar(const char *name, const unsigned int flags) : cvar_name(), cvar_info(), cvar_str() +Cvar::Cvar(const char* name, const unsigned int flags) : cvar_name(name), cvar_info(), cvar_str() { cvar_flags = flags; - cvar_name.assign(name); } -void Cvar::set_info(const char *info) +void Cvar::set_info(const char* info) { if (info) cvar_info.assign(info); } -Cvar & Cvar::operator=(const std::string &other) +Cvar & Cvar::operator=(const std::string& other) { cvar_str = other; std::stringstream s(cvar_str); @@ -57,13 +56,13 @@ Cvar & Cvar::operator=(const std::string &other) return (*this); } -Cvar & Cvar::operator=(const char *other) +Cvar & Cvar::operator=(const char* other) { std::string value(other); return (this->operator=(value)); } -Cvar & Cvar::operator=(float other) +Cvar & Cvar::operator=(const float other) { std::stringstream s; s << other; @@ -72,13 +71,10 @@ Cvar & Cvar::operator=(float other) return (*this); } -Cvar* Cvar::get(const char *name, const char *value, const unsigned int flags) +Cvar* Cvar::get(const char* name, const char* value, const unsigned int flags) { Cvar *c = find(name); - if (c) { - //con_debug << "get " << name << " already exist with value " << cvar->str() << std::endl; - } else { - //con_debug << "get " << name << " " << value << std::endl; + if (!c) { c = new Cvar(name, flags); cvar_registry[c->name()] = c; (*c) = value; @@ -87,13 +83,10 @@ Cvar* Cvar::get(const char *name, const char *value, const unsigned int flags) return c; } -Cvar* Cvar::get(const char *name, float value, const unsigned int flags) +Cvar* Cvar::get(const char* name, const float value, const unsigned int flags) { Cvar *c = find(name); - if (c) { - //con_debug << "get " << name << " already exist with value " << cvar->str() << std::endl; - } else { - //con_debug << "get " << name << " " << value << std::endl; + if (!c) { c = new Cvar(name, flags); cvar_registry[c->name()] = c; (*c) = value; @@ -102,7 +95,7 @@ Cvar* Cvar::get(const char *name, float value, const unsigned int flags) return c; } -Cvar* Cvar::set(const char *name, const char *value, const unsigned int flags) +Cvar* Cvar::set(const char* name, const char* value, const unsigned int flags) { Cvar *c = find(name); if (!c) { @@ -116,7 +109,7 @@ Cvar* Cvar::set(const char *name, const char *value, const unsigned int flags) return c; } -Cvar* Cvar::set(const char *name, float value, unsigned int flags) +Cvar* Cvar::set(const char* name, const float value, const unsigned int flags) { Cvar *c = find(name); if (!c) { @@ -130,7 +123,7 @@ Cvar* Cvar::set(const char *name, float value, unsigned int flags) return c; } -void Cvar::unset(std::string const &name) +void Cvar::unset(const std::string& name) { Cvar *c = find(name); if (c) { @@ -140,12 +133,12 @@ void Cvar::unset(std::string const &name) } } -void Cvar::unset(const char *name) +void Cvar::unset(const char* name) { unset(std::string(name)); } -Cvar *Cvar::find(std::string const &name) +Cvar *Cvar::find(const std::string& name) { Registry::iterator it = cvar_registry.find(name); if (it == cvar_registry.end()) @@ -154,7 +147,7 @@ Cvar *Cvar::find(std::string const &name) return (*it).second; } -Cvar *Cvar::find(const char *name) +Cvar *Cvar::find(const char* name) { std::string s(name); return(find(s)); diff --git a/src/core/cvar.h b/src/core/cvar.h index 8861f2a..4c3d942 100644 --- a/src/core/cvar.h +++ b/src/core/cvar.h @@ -13,12 +13,16 @@ namespace core { -/// a variable encapsulation class +/** + * @brief a client variable encapsulation class + * values f client variables can be set through the command console interface + */ class Cvar { public: - /// Cvar flags /** + * @brief Cvar flags + * * Archive a cvar with this flag will be saved to the configuration file * ReadOnly the value of cvar with this flag can not be altered from the commandline * Game a cvar with this flag is only valid when a game is loaded @@ -27,86 +31,90 @@ public: enum Flags {Archive=1, ReadOnly=2, Game=4, Info=8}; /// create a new variable - Cvar(const char *name, const unsigned int flags = 0); + Cvar(const char* name, const unsigned int flags = 0); /*----- inspectors ------------------------------------------------ */ /// returns the name of the variable - inline std::string const &name() { return cvar_name; } + inline const std::string& name() const { return cvar_name; } /// returns the info of the variable - inline std::string const &info() { return cvar_info; } + inline const std::string& info() const { return cvar_info; } /// returns the flags of the variable - inline unsigned int flags() const { return cvar_flags; } + inline const unsigned int flags() const { return cvar_flags; } /// returns the float value of the variable - inline float value() const { return cvar_value; } + inline const float value() const { return cvar_value; } /// returns the string value of the variable - inline const std::string &str() const { return cvar_str; } + inline const std::string& str() const { return cvar_str; } /*----- mutators -------------------------------------------------- */ /// set the info string - void set_info(const char *); + void set_info(const char* info); /// char * assignment operator - Cvar &operator=(const char *other); + Cvar &operator=(const char* other); /// std::string assignment operator - Cvar &operator=(const std::string &other); + Cvar &operator=(const std::string& other); /// float assignment operator - Cvar &operator=(float other); + Cvar &operator=(const float other); /* ---- Static functions for the Cvar registry -------------------- */ /// type definition for the Cvar registry typedef std::map<std::string, Cvar*> Registry; - /// get a cvar value from the registry - /** If the a cvar with the given name already exists in the registry, - * its value will not be changed. If the cvar does not exist, - * it will be created - */ - static Cvar *get(const char *name, const char *value, const unsigned int flags=0); - - /// get a cvar value from the registry - /** If the a cvar with the given name already exists in the registry, - * its value will not be changed. If the cvar does not exist, - * it will be created - */ - static Cvar *get(const char *name, float value, const unsigned int flags=0); - - /// set a cvar value - /** If the a cvar with the given name already exists in the registry, - * its value will be replaced - */ - static Cvar *set(const char *name, const char *value, const unsigned int flags=0); - - /// set a cvar value - /** If the a cvar with the given name already exists in the registry, - * its value will be replaced - */ - static Cvar *set(const char *name, float value, const unsigned int flags=0); + /** + * @brief get a cvar value from the registry + * If the a cvar with the given name already exists in the registry, + * its value will not be changed. If the cvar does not exist, + * it will be created + */ + static Cvar* get(const char* name, const char* value, const unsigned int flags=0); - /// delete a cvar from the registry - static void unset(const char *name); + /** + * @brief get a cvar value from the registry + * If the a cvar with the given name already exists in the registry, + * its value will not be changed. If the cvar does not exist, + * it will be created + */ + static Cvar* get(const char* name, const float value, const unsigned int flags=0); - /// delete a cvar from the registry - static void unset(std::string const &name); + /** + * @brief set a cvar value + * If the a cvar with the given name already exists in the registry, + * its value will be replaced + */ + static Cvar* set(const char* name, const char* value, const unsigned int flags=0); + + /** + * @brief set a cvar value + * If the a cvar with the given name already exists in the registry, + * its value will be replaced + */ + static Cvar* set(const char* name, float value, const unsigned int flags=0); /// search for a named cvar, returns 0 if not found - static Cvar *find(std::string const &name); + static Cvar* find(const std::string& name); /// search for a named cvar, returns 0 if not found - static Cvar *find(const char *name); + static Cvar* find(const char* name); + + /// delete a cvar from the registry + static void unset(const char* name); + + /// delete a cvar from the registry + static void unset(const std::string& name); /// list the cvar registry static void list(); - /// the Cvar registry + /// the cvar registry static inline Registry & registry() { return cvar_registry; } static Cvar *sv_dedicated; // dedicated server diff --git a/src/core/entity.cc b/src/core/entity.cc index 2b3c482..0ead5f4 100644 --- a/src/core/entity.cc +++ b/src/core/entity.cc @@ -87,7 +87,7 @@ void Entity::list() /* ---- class Entity ----------------------------------------------- */ -Entity::Entity(unsigned int flags) : +Entity::Entity(const unsigned int flags) : entity_location(0.0f, 0.0f, 0.0f), entity_color(1.0f, 1.0f, 1.0f, 1.0f), entity_color_second(1.0f, 1.0f, 1.0f, 1.0f) @@ -186,7 +186,7 @@ void Entity::set_zone(Zone *zone) entity_zone->add(this); } -void Entity::set_label(char const *label) +void Entity::set_label(const char *label) { entity_label.assign(label); aux::to_label(entity_label); @@ -198,7 +198,7 @@ void Entity::set_label(const std::string &label) aux::to_label(entity_label); } -void Entity::set_name(char const *name) +void Entity::set_name(const char *name) { entity_name.assign(name); aux::strip_quotes(entity_name); @@ -210,34 +210,6 @@ void Entity::set_name(const std::string &name) aux::strip_quotes(entity_name); } -void Entity::set_visible(bool visible) -{ - if (visible) - show(); - else - hide(); -} - -void Entity::show() -{ - entity_visible = false; -} - -void Entity::hide() -{ - entity_visible = false; -} - -void Entity::set_flag(Flags flag) -{ - entity_flags |= flag; -} - -void Entity::unset_flag(Flags flag) -{ - entity_flags &= ~flag; -} - void Entity::set_model(model::Model *model) { entity_model = model; @@ -408,9 +380,9 @@ EntityDynamic::~EntityDynamic() void EntityDynamic::set_state(int state) { - if (entity_state != state) { + if (this->state() != state) { entity_state = state; - entity_dirty = true; + set_dirty(); } } @@ -422,9 +394,9 @@ void EntityDynamic::frame(float seconds) if (entity_speed == 0) return; - entity_location += entity_axis.forward() * entity_speed * seconds; + get_location() += axis().forward() * entity_speed * seconds; - entity_dirty = true; + set_dirty(); } void EntityDynamic::serialize_server_create(std::ostream & os) const @@ -465,9 +437,9 @@ void EntityDynamic::serialize_server_update(std::ostream & os) const os << (visible() ? 1 : 0 ) << " "; if (visible()) { os << std::setprecision(8) - << entity_location << " " - << entity_axis.forward() << " " - << entity_axis.left() << " " + << location() << " " + << axis().forward() << " " + << axis().left() << " " << roundf(entity_speed * 100.0f) << " " << entity_state << " "; @@ -482,12 +454,12 @@ void EntityDynamic::receive_server_update(std::istream &is) unsigned int o = 0; is >> o; // visibility if (o) { - entity_visible = true; - is >> entity_location; + set_visible(); + is >> get_location(); // axis up vector is the crossproduct of forward and left - is >> entity_axis[0]; - is >> entity_axis[1]; - entity_axis[2] = math::crossproduct(entity_axis.forward(), entity_axis.left()); + is >> get_axis()[0]; + is >> get_axis()[1]; + get_axis()[2] = math::crossproduct(axis().forward(), axis().left()); is >> entity_speed; entity_speed /= 100.0f; is >> entity_state; @@ -498,7 +470,7 @@ void EntityDynamic::receive_server_update(std::istream &is) entity_timer = 0; } } else { - entity_visible = false; + set_visible(false); } } @@ -632,7 +604,7 @@ void EntityControlable::set_thrust(float thrust) if (thrust != target_thrust) { target_thrust = thrust; - entity_dirty = true; + set_dirty(); } } @@ -643,7 +615,7 @@ void EntityControlable::set_direction(float direction) if (target_direction != direction) { target_direction = direction; - entity_dirty = true; + set_dirty(); } } @@ -654,7 +626,7 @@ void EntityControlable::set_pitch(float pitch) if (target_pitch != pitch) { target_pitch = pitch; - entity_dirty = true; + set_dirty(); } } @@ -665,7 +637,7 @@ void EntityControlable::set_roll(float roll) if (target_roll != roll) { target_roll = roll; - entity_dirty = true; + set_dirty(); } } @@ -676,7 +648,7 @@ void EntityControlable::set_strafe(float strafe) if (target_strafe != strafe) { target_strafe = strafe; - entity_dirty = true; + set_dirty(); } } @@ -687,7 +659,7 @@ void EntityControlable::set_afterburner(float afterburner) if (target_afterburner != afterburner) { target_afterburner = afterburner; - entity_dirty = true; + set_dirty(); } } diff --git a/src/core/entity.h b/src/core/entity.h index 41c56b4..3002219 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -54,7 +54,7 @@ public: typedef std::list<MenuDescription *> Menus; /// create a new entity and add it to the registry - Entity(unsigned int flags = 0); + Entity(const unsigned int flags = 0); /// create an entity from stream data Entity(std::istream & is); @@ -65,25 +65,25 @@ public: /*----- inspectors ------------------------------------------------ */ /// entity id - inline unsigned int id() const { return entity_id; } + inline const unsigned int id() const { return entity_id; } /// module type id - inline unsigned int moduletype() const { return entity_moduletypeid; } + inline const unsigned int moduletype() const { return entity_moduletypeid; } /// core type id virtual inline const unsigned int type() const { return Default; } /// entity flags - inline unsigned int flags() const { return entity_flags; } + inline const unsigned int flags() const { return entity_flags; } /// returns true of a flag is set - inline bool flag_is_set(const Flags flag) const { return ((entity_flags & (unsigned int)flag) == (unsigned int)flag); } + inline const bool flag_is_set(const Flags flag) const { return ((entity_flags & (unsigned int)flag) == (unsigned int)flag); } /// entity label (can not contain double quotes ") - inline std::string const & label() { return entity_label; } + inline const std::string& label() const { return entity_label; } /// entity name (can not contain double qoutes ") - inline std::string const & name() { return entity_name; } + inline const std::string & name() const { return entity_name; } /// pointer to the model, is used client-side inline model::Model * model() { return entity_model; } @@ -134,7 +134,10 @@ public: inline Extension *extension(size_t type) const { return entity_extension[type]; } /// find a menu - MenuDescription *find_menu(std::string const &label); + MenuDescription *find_menu(const std::string &label); + + + /* ---- mutators -------------------------------------------------- */ /// assign entity color inline void set_color(const math::Color &color) { entity_color.assign(color); } @@ -142,27 +145,8 @@ public: /// assign entity secondary color inline void set_color_second(const math::Color &color) { entity_color_second.assign(color); } -/*----- serializers ----------------------------------------------- */ - - /// serialize the entity to a stream - virtual void serialize_server_create(std::ostream & os) const; - - /// serialize a client-to-server update on a stream - virtual void serialize_client_update(std::ostream & os) const; - - /// serialize a server-to-client update on a stream - virtual void serialize_server_update(std::ostream & os) const; - -/*----- mutators -------------------------------------------------- */ - - /// receive a client-to-server update from a stream - virtual void receive_client_update(std::istream &is); - - /// receive a server-to-client create from a stream - virtual void receive_server_create(std::istream &is); - - /// receive a server-to-client update from a stream - virtual void receive_server_update(std::istream &is); + /// set dirty flag + inline void set_dirty(const bool dirty = true) { entity_dirty = dirty; } /// mark the entity as destroyed virtual void die(); @@ -173,33 +157,31 @@ public: */ virtual void frame(float seconds); - /// called when the entity received a docking request - virtual void dock(core::Entity *entity); - - /// set dirty flag - inline void set_dirty() { entity_dirty = true; } - - /// set the zone the entity is currently in /** + * @brief set the zone the entity is currently in + * * this fuction removes the entity from its previous zone * and removes it to the new one, if it is not 0 */ virtual void set_zone(Zone *zone); /// set the label - void set_label(char const *label); + void set_label(const char *label); /// set the label void set_label(const std::string &label); /// set the name - void set_name(char const *name); + void set_name(const char *name); /// set the name void set_name(const std::string &name); /// set visibility - void set_visible(bool visible = true); + inline void set_visible(const bool visible = true) { entity_visible = visible; } + + /// set as server-side entity + inline void set_serverside(const bool serverside = true) { entity_serverside = serverside; } /// set the model name and load the model void set_modelname(const std:: string &model); @@ -207,17 +189,19 @@ public: /// set the model void set_model(model::Model *model); - /// show the entity, make it visible - virtual void show(); + /// set entity radius + inline void set_radius(const float radius) { entity_radius = radius; } - /// hide the entity, make it invisible - virtual void hide(); + /* ---- actors ---------------------------------------------------- */ - /// set a flag - void set_flag(Flags flag); + /// called when the entity received a docking request + virtual void dock(core::Entity *entity); + + /// set flags + inline void set_flag(Flags flag) { entity_flags |= flag; } - /// unset a flag - void unset_flag(Flags flag); + /// unset flags + inline void unset_flag(Flags flag) { entity_flags &= ~flag; } /// add an entity menu void add_menu(MenuDescription *menu); @@ -228,8 +212,6 @@ public: /// clear all update flags virtual void clear_updates(); -/*----- actors ---------------------------------------------------- */ - /** * @brief mutable reference to the location */ @@ -251,7 +233,30 @@ public: inline math::Color& get_color_second() { return entity_color_second; } -/*----- static ---------------------------------------------------- */ + /* ---- deserializers -------------------------------------- */ + + /// receive a client-to-server update from a stream + virtual void receive_client_update(std::istream &is); + + /// receive a server-to-client create from a stream + virtual void receive_server_create(std::istream &is); + + /// receive a server-to-client update from a stream + virtual void receive_server_update(std::istream &is); + + /* ---- serializers ---------------------------------------- */ + + /// serialize the entity to a stream + virtual void serialize_server_create(std::ostream & os) const; + + /// serialize a client-to-server update on a stream + virtual void serialize_client_update(std::ostream & os) const; + + /// serialize a server-to-client update on a stream + virtual void serialize_server_update(std::ostream & os) const; + + + /* ---- static --------------------------------------------- */ /// type definition for the entity registry typedef std::map<unsigned int, Entity*> Registry; @@ -275,41 +280,43 @@ public: /// speed of the entity float entity_speed; - float entity_radius; Shape entity_shape; unsigned int entity_moduletypeid; - bool entity_dirty; bool entity_created; bool entity_destroyed; /// timestamp when entity data was received from the server float entity_servertimestamp; -protected: - // the zone the entity belongs to - Zone *entity_zone; - // the previous zone the entity belonged too - Zone *entity_oldzone; +private: + + unsigned int entity_id; + unsigned int entity_flags; + bool entity_dirty; bool entity_visible; bool entity_serverside; math::Vector3f entity_location; math::Axis entity_axis; + + float entity_radius; + math::Color entity_color; math::Color entity_color_second; -private: - unsigned int entity_id; - unsigned int entity_flags; - std::string entity_name; std::string entity_label; - - model::Model *entity_model; std::string entity_modelname; + model::Model* entity_model; + + // the zone the entity belongs to + Zone* entity_zone; + // the previous zone the entity belonged too + Zone* entity_oldzone; + Menus entity_menus; Extension* entity_extension[4]; @@ -326,7 +333,7 @@ class EntityDynamic : public Entity { public: /// create a dynamic entity - EntityDynamic(unsigned int flags = 0); + EntityDynamic(const unsigned int flags = 0); /// create a dynamic entity from stream data EntityDynamic(std::istream & is); @@ -387,7 +394,7 @@ class EntityControlable : public EntityDynamic friend class Player; public: /// create a controlable entity - EntityControlable(Player *owner, unsigned int flags = 0); + EntityControlable(Player *owner, const unsigned int flags = 0); /// create a controlable entity from stream data EntityControlable(std::istream & is); @@ -490,7 +497,7 @@ private: class EntityGlobe : public Entity { public: - EntityGlobe(unsigned int flags = 0); + EntityGlobe(const unsigned int flags = 0); EntityGlobe(std::istream & is); virtual ~EntityGlobe(); diff --git a/src/core/gameconnection.cc b/src/core/gameconnection.cc index 3384418..65126e3 100644 --- a/src/core/gameconnection.cc +++ b/src/core/gameconnection.cc @@ -178,7 +178,7 @@ void GameConnection::frame(unsigned long timestamp) if(localcontrol() && localcontrol()->dirty()) { connection_network->send_clientupdate(localcontrol()); - localcontrol()->entity_dirty = false; + localcontrol()->set_dirty(false); } diff --git a/src/core/netserver.cc b/src/core/netserver.cc index 7416d9f..83bbd6e 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -736,7 +736,7 @@ void NetServer::parse_incoming_message(NetClient *client, const std::string & me return; } - entitycontrolable->entity_dirty = true; + entitycontrolable->set_dirty(true); entitycontrolable->receive_client_update(msgstream); } return; diff --git a/src/core/parser.cc b/src/core/parser.cc index fcca2e1..84590a2 100644 --- a/src/core/parser.cc +++ b/src/core/parser.cc @@ -78,7 +78,7 @@ bool Parser::got_entity_key(filesystem::IniFile &inifile, core::Entity *entity) return true; } else if (inifile.got_key_angle("radius", f)) { - entity->entity_radius = f; + entity->set_radius(f); return true; } else if (inifile.got_key_vector3f("location", v)) { diff --git a/src/game/base/jumppoint.cc b/src/game/base/jumppoint.cc index e489055..9017f1c 100644 --- a/src/game/base/jumppoint.cc +++ b/src/game/base/jumppoint.cc @@ -15,13 +15,13 @@ namespace game JumpPoint::JumpPoint() : core::EntityDynamic(core::Entity::Bright) { entity_shape = core::Entity::Diamond; - entity_color.assign(0.0f, 0.8f, 0.8f, 1.0f); - entity_color_second.assign(0.6f, 1.0f); - entity_radius = 0.25f; + get_color().assign(0.0f, 0.8f, 0.8f, 1.0f); + get_color_second().assign(0.6f, 1.0f); + set_radius(0.25f); entity_moduletypeid = jumppoint_enttype; jumppoint_target = 0; - entity_serverside = false; + set_serverside(false); } JumpPoint::~JumpPoint() @@ -78,8 +78,8 @@ JumpGate::JumpGate() : JumpPoint() { unset_flag(core::Entity::Bright); set_flag(core::Entity::ShowOnMap); + set_radius(1.0f); - entity_radius = 1.0f; entity_moduletypeid = jumpgate_enttype; entity_state = core::Entity::NoPower; } diff --git a/src/game/base/navpoint.cc b/src/game/base/navpoint.cc index 5dc35b2..7b48ee7 100644 --- a/src/game/base/navpoint.cc +++ b/src/game/base/navpoint.cc @@ -14,9 +14,9 @@ NavPoint::NavPoint() : core::Entity(core::Entity::Static | core::Entity::Bright) { //set_flag(core::Entity::ShowOnMap); entity_shape = core::Entity::Diamond; - entity_color.assign(1.0f, 1.0f); - entity_color_second.assign(0.6f, 1.0f); - entity_radius = 0.25f; + get_color().assign(1.0f, 1.0f); + get_color_second().assign(0.6f, 1.0f); + set_radius(0.25f); entity_moduletypeid = navpoint_enttype; } diff --git a/src/game/base/planet.cc b/src/game/base/planet.cc index 60885b1..b1ac976 100644 --- a/src/game/base/planet.cc +++ b/src/game/base/planet.cc @@ -14,8 +14,8 @@ Planet::Planet() : core::EntityGlobe(core::Entity::Static | core::Entity::Solid) { set_flag(core::Entity::ShowOnMap); - entity_color = math::Color(1,1,1,1); // white - entity_radius = 64; // 64 game units + get_color().assign(1.0f, 1.0f); // white + set_radius(64.0f); // 64 game units entity_moduletypeid = planet_enttype; diff --git a/src/game/base/racetrack.cc b/src/game/base/racetrack.cc index f54a24b..3d1cb69 100644 --- a/src/game/base/racetrack.cc +++ b/src/game/base/racetrack.cc @@ -20,8 +20,8 @@ CheckPoint::CheckPoint(RaceTrack *parent) set_state(core::Entity::NoPower); parent_track = parent; if (parent) { - entity_color = parent->color(); - entity_color_second = parent->color_second(); + get_color().assign(parent->color()); + get_color_second().assign(parent->color_second()); set_zone(parent->zone()); parent->add_checkpoint(this); } else { @@ -142,7 +142,7 @@ void RaceTrack::frame(float seconds) if (track_racestart + 1.0f <= core::server()->time()) { entity_timer -= 1.0f; - entity_dirty = true; + set_dirty(); if (entity_timer > 0) { std::stringstream msgstr; diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc index 03fe3de..8bc7799 100644 --- a/src/game/base/ship.cc +++ b/src/game/base/ship.cc @@ -36,8 +36,8 @@ Ship::Ship(core::Player *owner, ShipModel *shipmodel) : entity_moduletypeid = ship_enttype; - entity_color = owner->color(); - entity_color_second = owner->color_second(); + get_color().assign(owner->color()); + get_color_second().assign(owner->color_second()); ship_shipmodel = shipmodel; ship_jumpdrive = shipmodel->shipmodel_jumpdrive; @@ -88,10 +88,9 @@ void Ship::func_impulse() entity_timer = 3; } ship_impulsedrive_timer = core::server()->time(); - entity_dirty = true; } - entity_dirty = true; + set_dirty(); } void Ship::initiate_jump(JumpPoint *depart) @@ -114,7 +113,7 @@ void Ship::initiate_jump(JumpPoint *depart) } ship_jumpdrive_timer = core::server()->time(); - entity_dirty = true; + set_dirty(); } void Ship::func_jump(std::string const &args) @@ -149,8 +148,8 @@ void Ship::func_jump(std::string const &args) ship_jumpdrive_timer = 0; entity_timer = 0; - entity_state = core::Entity::Jump; - entity_dirty = true; + set_state(core::Entity::Jump); + set_dirty(); return; } else { @@ -244,11 +243,16 @@ void Ship::frame(float seconds) float actual_thrust = 0; #ifndef HAVE_BULLET - const float direction_change_speed = 2; + const float direction_reaction = 2.0f; // direction controls reaction time factor + const float thrust_reaction = 0.5f; // thrust control reaction time factor + const float strafe_reaction = 1.5f; + const float afterburner_reaction = 1.0f; // a fterburner control reaction time + + float cosangle; // cosine of an angle float angle; // angle in radians math::Vector3f n; // normal of a plane - math::Axis target_axis(entity_axis); // target axis + math::Axis target_axis(axis()); // target axis #endif entity_movement = 0; @@ -256,7 +260,7 @@ void Ship::frame(float seconds) // speed might be set to 0 on this update if (entity_speed != 0.0f) - entity_dirty = true; + set_dirty(); if (entity_state == core::Entity::Docked) { @@ -280,11 +284,11 @@ void Ship::frame(float seconds) set_state(core::Entity::Jump); entity_speed = Game::g_impulsespeed->value(); if (ship_jumpdepart->moduletype() == jumpgate_enttype) { - entity_axis.assign(ship_jumpdepart->target()->axis()); - entity_location.assign(ship_jumpdepart->target()->location()); + get_axis().assign(ship_jumpdepart->target()->axis()); + get_location().assign(ship_jumpdepart->target()->location()); //entity_location += entity_axis.forward() * radius(); } else { - entity_location.assign(ship_jumpdepart->target()->location() + location() - ship_jumpdepart->location()); + get_location().assign(ship_jumpdepart->target()->location() + location() - ship_jumpdepart->location()); } set_zone(ship_jumpdepart->target()->zone()); owner()->send("^BJumping to the " + ship_jumpdepart->target()->zone()->name()); @@ -294,11 +298,11 @@ void Ship::frame(float seconds) ship_jumpdrive_timer = 0; entity_timer = 0; - entity_dirty = true; + set_dirty(); return; } else { ship_jumpdrive_timer = core::server()->time(); - entity_dirty = true; + set_dirty(); } } @@ -323,7 +327,7 @@ void Ship::frame(float seconds) // FIXME 5 second cooldown entity_state = core::Entity::Normal; - entity_dirty = true; + set_dirty(); if (owner() && owner()->view() && owner()->control() == (EntityControlable*) this) owner()->set_view(0); @@ -332,30 +336,38 @@ void Ship::frame(float seconds) } else if (entity_state == core::Entity::ImpulseInitiate) { - if (ship_impulsedrive_timer + 1.0f <= core::server()->time()) { - entity_timer -= 1.0f; + // cancel impulse drive if afterburner goes reverse + if (target_afterburner < 0.0f) { + set_state(core::Entity::Normal); + set_dirty(); + entity_timer = 0; + } else { - if (entity_timer <= 0) { - actual_maxspeed = Game::g_impulsespeed->value(); - actual_acceleration = Game::g_impulseacceleration->value(); - entity_state = core::Entity::Impulse; - entity_timer = 0; - entity_dirty = true; - } else { - ship_impulsedrive_timer = core::server()->time(); - entity_dirty = true; + if (ship_impulsedrive_timer + 1.0f <= core::server()->time()) { + entity_timer -= 1.0f; + + if (entity_timer <= 0) { + actual_maxspeed = Game::g_impulsespeed->value(); + actual_acceleration = Game::g_impulseacceleration->value(); + entity_state = core::Entity::Impulse; + entity_timer = 0; + set_dirty(); + } else { + ship_impulsedrive_timer = core::server()->time(); + set_dirty(); + } } + + // clamp input values + target_thrust = 0.0f; + math::clamp(target_pitch, -1.0f, 1.0f); + math::clamp(target_roll, -1.0f, 1.0f); + math::clamp(target_direction, -1.0f, 1.0f); + math::clamp(target_afterburner, -1.0f, 1.0f); + + actual_turnspeed *= 0.5; } - // clamp input values - target_thrust = 0.0f; - math::clamp(target_pitch, -1.0f, 1.0f); - math::clamp(target_roll, -1.0f, 1.0f); - math::clamp(target_direction, -1.0f, 1.0f); - math::clamp(target_afterburner, -1.0f, 1.0f); - - actual_turnspeed *= 0.5; - } else if (entity_state == core::Entity::Impulse) { // clamp input values @@ -365,9 +377,18 @@ void Ship::frame(float seconds) math::clamp(target_direction, -1.0f, 1.0f); target_afterburner = 0.0f; - actual_maxspeed = Game::g_impulsespeed->value(); - actual_acceleration = Game::g_impulseacceleration->value(); - actual_turnspeed *= 0.5; + // cancel impulse drive if afterburner goes reverse + if (target_afterburner < 0.0f) { + set_state(core::Entity::Normal); + set_dirty(); + entity_timer = 0; + target_thrust = 1.0f; + target_thrust = 1.0f; + } else { + actual_maxspeed = Game::g_impulsespeed->value(); + actual_acceleration = Game::g_impulseacceleration->value(); + actual_turnspeed *= 0.5; + } } else if (entity_state == core::Entity::Normal) { @@ -395,28 +416,30 @@ void Ship::frame(float seconds) entity_thrust = 0; } - // update afterburner + // update afterburner control target if (current_target_afterburner < target_afterburner) { - current_target_afterburner += 2.0f * seconds; + current_target_afterburner += afterburner_reaction * seconds; if (current_target_afterburner > target_afterburner) current_target_afterburner = target_afterburner; + } else if (current_target_afterburner > target_afterburner) { - current_target_afterburner -= 2.0f * seconds; + current_target_afterburner -= afterburner_reaction * seconds; if (current_target_afterburner < target_afterburner) current_target_afterburner = target_afterburner; } - // update thrust + // update thrust control target if (current_target_afterburner < 0.0f) { target_thrust = 0; } if (entity_thrust < target_thrust) { - entity_thrust += seconds * 0.5f; + entity_thrust += thrust_reaction * seconds; if (entity_thrust > target_thrust) entity_thrust = target_thrust; + } else if (entity_thrust > target_thrust) { - entity_thrust -= seconds * 0.5f; + entity_thrust -= thrust_reaction * seconds; if (entity_thrust < target_thrust) entity_thrust = target_thrust; } @@ -426,17 +449,28 @@ void Ship::frame(float seconds) actual_thrust = 1.0f; } + + // update strafe control target + if (current_target_strafe < target_strafe) { + current_target_strafe += strafe_reaction * seconds; + if (current_target_strafe > target_strafe) + current_target_strafe = target_strafe; + } else if (current_target_strafe > target_strafe) { + current_target_strafe -= strafe_reaction * seconds; + if (current_target_strafe < target_strafe) + current_target_strafe = target_strafe; + } #ifndef HAVE_BULLET /* -- original frame --------------------------------------- */ - // update roll + // update roll control target if (current_target_roll < target_roll) { - current_target_roll += direction_change_speed * seconds; + current_target_roll += direction_reaction * seconds; if (current_target_roll > target_roll) current_target_roll = target_roll; } else if (current_target_roll > target_roll) { - current_target_roll -= direction_change_speed * seconds; + current_target_roll -= direction_reaction * seconds; if (current_target_roll < target_roll) current_target_roll = target_roll; } @@ -444,19 +478,19 @@ void Ship::frame(float seconds) if (fabs(current_target_roll) > MIN_DELTA) { float roll_offset = seconds * current_target_roll; - entity_axis.change_roll(actual_turnspeed * roll_offset); + get_axis().change_roll(actual_turnspeed * roll_offset); } else { current_target_roll = 0.0f; } - // update target_axis direction + // update direction control target if (current_target_direction < target_direction) { - current_target_direction += direction_change_speed * seconds; + current_target_direction += direction_reaction * seconds; if (current_target_direction > target_direction) { current_target_direction = target_direction; } } else if (current_target_direction > target_direction) { - current_target_direction -= direction_change_speed * seconds; + current_target_direction -= direction_reaction * seconds; if (current_target_direction < target_direction) { current_target_direction = target_direction; } @@ -469,12 +503,13 @@ void Ship::frame(float seconds) current_target_direction = 0.0f; } + // update pitch control target if (current_target_pitch < target_pitch) { - current_target_pitch += direction_change_speed * seconds; + current_target_pitch += direction_reaction * seconds; if (current_target_pitch > target_pitch) current_target_pitch = target_pitch; } else if (current_target_pitch > target_pitch) { - current_target_pitch -= direction_change_speed * seconds; + current_target_pitch -= direction_reaction * seconds; if (current_target_pitch < target_pitch) current_target_pitch = target_pitch; } @@ -486,45 +521,36 @@ void Ship::frame(float seconds) current_target_pitch = 0.0f; } - n.assign(math::crossproduct(entity_axis.forward(), target_axis.forward())); + // update axis + n.assign(math::crossproduct(axis().forward(), target_axis.forward())); if (!(n.length() < MIN_DELTA)) { n.normalize(); - cosangle = math::dotproduct(entity_axis.forward(), target_axis.forward()); + cosangle = math::dotproduct(axis().forward(), target_axis.forward()); angle = acos(cosangle) * seconds; // * 180.0f / M_PI; if (angle > MIN_DELTA) - entity_axis.rotate(n, -angle); + get_axis().rotate(n, -angle); } // update speed - if (entity_speed < actual_thrust * actual_maxspeed) { + const float max = actual_thrust * actual_maxspeed; + if (entity_speed < max) { entity_speed += actual_acceleration * seconds; - if (entity_speed > actual_thrust * actual_maxspeed) { - entity_speed = actual_thrust * actual_maxspeed; + if (entity_speed > max) { + entity_speed = max; } - } else if(entity_speed > actual_thrust * actual_maxspeed) { + } else if(entity_speed > max) { entity_speed -= actual_acceleration * seconds; - if (entity_speed < actual_thrust * actual_maxspeed) { - entity_speed = actual_thrust * actual_maxspeed; + if (entity_speed < max) { + entity_speed = max; } } - // update strafe - if (current_target_strafe < target_strafe) { - current_target_strafe += 2.0f * seconds; - if (current_target_strafe > target_strafe) - current_target_strafe = target_strafe; - } else if (current_target_strafe > target_strafe) { - current_target_strafe -= 2.0f * seconds; - if (current_target_strafe < target_strafe) - current_target_strafe = target_strafe; - } - if (fabs(current_target_strafe) > MIN_DELTA) { - entity_location += entity_axis.left() * (current_target_strafe * 0.15f * actual_maxspeed) * seconds; + get_location() += axis().left() * (current_target_strafe * 0.15f * actual_maxspeed) * seconds; } - if (entity_speed) { - entity_location += entity_axis.forward() * entity_speed * seconds; + if (fabs(speed()) > MIN_DELTA) { + get_location() += axis().forward() * speed() * seconds; } #else /* #ifndef HAVE_BULLET */ @@ -559,7 +585,7 @@ void Ship::frame(float seconds) entity_movement = math::max(entity_movement, fabs(current_target_strafe)); if ((entity_movement > 0)|| (entity_speed > 0)) { - entity_dirty = true; + set_dirty(); } } diff --git a/src/game/base/star.cc b/src/game/base/star.cc index fa5dc32..ba3ccba 100644 --- a/src/game/base/star.cc +++ b/src/game/base/star.cc @@ -14,9 +14,9 @@ Star::Star() : core::EntityGlobe(core::Entity::Static | core::Entity::Solid | co { set_flag(core::Entity::ShowOnMap); - entity_color.assign(1,1,1,1); - entity_color_second.assign(1,1,1,1); - entity_radius = 96; // 96 game units + get_color().assign(1.0f, 1.0f); + get_color_second().assign(1.0f, 1.0f); + set_radius(96.0f); entity_moduletypeid = star_enttype; } diff --git a/src/game/example/example.cc b/src/game/example/example.cc index 9d4c1ed..f368556 100644 --- a/src/game/example/example.cc +++ b/src/game/example/example.cc @@ -43,9 +43,9 @@ Example::Example() : core::Module("The Osirion Project Example", true) cube->set_label("cube"); cube->set_name("The Red Cube"); cube->entity_shape = core::Entity::Cube; // set the shape to cube - cube->get_location().assign(16, -8, 0); // set location + cube->get_location().assign(16, -8, 0); // set location cube->get_color().assign(1, 0, 0); // set RGB color red - cube->entity_radius = 0.25f; // set radius, in game units + cube->set_radius(0.25f); // set radius, in game units cube->set_zone(zone); // add the entity to the zone core::Entity *sphere = new core::Entity(); // a new entity @@ -54,7 +54,7 @@ Example::Example() : core::Module("The Osirion Project Example", true) sphere->entity_shape = core::Entity::Sphere; // set the shape to sphere sphere->get_location().assign(16, 0, 0); // set location sphere->get_color().assign(0, 1, 0); // set RGB color green - sphere->entity_radius = 0.25f; // set radius, in game units + cube->set_radius(0.25f); // set radius, in game units sphere->set_zone(zone); // add the entity to the zone core::Entity *diamond = new core::Entity(); // a new entity @@ -63,7 +63,7 @@ Example::Example() : core::Module("The Osirion Project Example", true) diamond->entity_shape = core::Entity::Diamond; // set the shape to cube diamond->get_location().assign(16, 8, 0); // set location diamond->get_color().assign(0, 0, 1); // set RGB color blue - diamond->entity_radius = 0.25f; // set radius, in game units + cube->set_radius(0.25f); // set radius, in game units diamond->set_zone(zone); // add the entity to the zone core::Entity *axis = new core::Entity(); // a new entity @@ -73,7 +73,7 @@ Example::Example() : core::Module("The Osirion Project Example", true) axis->get_location().assign(0, 0, 0); // set location axis->get_color().assign(1); // set greyscale color white axis->get_color_second().assign(0.5f, 0.0f, 0.5f); // set RGB secondary color - axis->entity_radius = 0.25f; // set radius, in game units + cube->set_radius(0.25f); // set radius, in game units axis->set_zone(zone); // add the entity to the zone } diff --git a/src/game/example/spectator.cc b/src/game/example/spectator.cc index a2c4353..5fad0f1 100644 --- a/src/game/example/spectator.cc +++ b/src/game/example/spectator.cc @@ -15,11 +15,11 @@ Spectator::Spectator(core::Player *owner) : core::EntityControlable(owner) { // default properties entity_shape = core::Entity::Diamond; - entity_radius = 0.25f; + set_radius(0.25f); // the spectator gets player color - entity_color.assign(owner->color()); - entity_color_second.assign(owner->color_second()); + get_color().assign(owner->color()); + get_color_second().assign(owner->color_second()); // set dirty flag set_dirty(); @@ -40,9 +40,9 @@ void Spectator::frame(float elapsed) // rotate according to input float rotation = g_spectatorrotation->value() * elapsed; - entity_axis.change_direction(target_direction * rotation); - entity_axis.change_pitch(target_pitch * rotation); - entity_axis.change_roll(target_roll * rotation); + get_axis().change_direction(target_direction * rotation); + get_axis().change_pitch(target_pitch * rotation); + get_axis().change_roll(target_roll * rotation); // assign speed from thruster float maxspeed = g_spectatorspeed->value(); @@ -50,13 +50,13 @@ void Spectator::frame(float elapsed) // assign new location if (entity_speed) - entity_location += entity_axis.forward() * entity_speed * elapsed; + get_location() += axis().forward() * entity_speed * elapsed; if (target_afterburner) - entity_location += entity_axis.forward() * maxspeed * target_afterburner * elapsed; + get_location() += axis().forward() * maxspeed * target_afterburner * elapsed; if (target_strafe) - entity_location += entity_axis.left() * maxspeed * target_strafe * elapsed; + get_location() += axis().left() * maxspeed * target_strafe * elapsed; // set dirty flag set_dirty(); diff --git a/src/game/intro/convoy.cc b/src/game/intro/convoy.cc index 9e13ae5..a0cc27c 100644 --- a/src/game/intro/convoy.cc +++ b/src/game/intro/convoy.cc @@ -27,7 +27,7 @@ Member::~Member() void Member::frame(float seconds) { - entity_location += axis().forward() * speed() * thrust() * seconds; + get_location() += axis().forward() * speed() * thrust() * seconds; } /* ---- class Convoy ----------------------------------------------- */ @@ -38,8 +38,8 @@ Convoy::Convoy(core::Zone *zone) : core::EntityDynamic() set_label("convoy"); set_name("Convoy"); - entity_speed = 1; - entity_serverside = true; + entity_speed = 1.0f; + set_serverside(); } Convoy::~Convoy() diff --git a/src/model/asefile.cc b/src/model/asefile.cc index a9e57d4..664a3f7 100644 --- a/src/model/asefile.cc +++ b/src/model/asefile.cc @@ -467,7 +467,7 @@ Model * ASEFile::load(const std::string &name) model->add_group(group); con_debug << " " << asefile.name() << " " << asefile.ase_vertexlist.size() << " vertices " << - model->model_tris_count << "/" << model->model_tris_detail_count << " faces/detail" << std::endl; + model->model_tris_count << "/" << model->model_tris_detail_count << " tris/detail" << std::endl; return model; } diff --git a/src/model/mapfile.cc b/src/model/mapfile.cc index c4f0b7b..54f6d78 100644 --- a/src/model/mapfile.cc +++ b/src/model/mapfile.cc @@ -142,13 +142,14 @@ inline bool spawnflag_isset(unsigned int spawnflags, unsigned int flag) return ((spawnflags & flag) == flag); } -MapFile::MapFile() : map_center(0,0,0) +MapFile::MapFile() : map_center(0.0f, 0.0f, 0.0f) { mapfile_name.clear(); map_brushes = 0; map_faces = 0; map_faces_detail = 0; + in_patchdef = false; warning_q2brush = false; } @@ -205,6 +206,49 @@ bool MapFile::got_classend(const char * classnamelabel) const return (last_read_was_classend && (classname_current.compare(classnamelabel) == 0)); } +bool MapFile::read_patchdef() +{ + char data[1024]; + memset(data, 0, sizeof(data)); + size_t count = 0; + + // first line: texture name + if (!mapfile_ifs.getline(data, 1023)) + return false; + else + line_number++; + + // second line: "( a b c d e )" + if (!mapfile_ifs.getline(data, 1023)) + return false; + else + line_number++; + + // third line: "(" + if (!mapfile_ifs.getline(data, 1023)) + return false; + else + line_number++; + + while (mapfile_ifs.getline(data, 1023)) { + line_number++; + + std::istringstream linestream(data); + std::string firstword; + + if (linestream >> firstword) { + if (firstword.compare(")") == 0) { + //con_debug << " patchDef2 with " << count << " lines" << std::endl; + return true; + } else { + count ++; + } + } + } + + return false; +} + bool MapFile::getline() { using math::Vector3f; @@ -236,9 +280,20 @@ bool MapFile::getline() } else if (firstword == "{") { parse_level++; + + if ((parse_level == 3) && (in_patchdef)) { + if (!read_patchdef()) { + con_warn << name() << " error reading patchDef2 at line " << line_number << std::endl; + } + } } else if (firstword == "}") { - if ((parse_level == 2) && (planes.size())) { + + if ((parse_level == 3) && (in_patchdef)) { + // end-of-patchdef + in_patchdef = false; + + } else if ((parse_level == 2) && (planes.size())) { // end-of-brush // for every face @@ -265,7 +320,7 @@ bool MapFile::getline() } else if (parse_level == 1) { - if (firstword == "\"classname\"") { + if (firstword.compare("\"classname\"") == 0) { classname_current.clear(); if (linestream >> classname_current) { @@ -295,7 +350,7 @@ bool MapFile::getline() } else if (parse_level == 2) { - if (firstword == "(") { + if (firstword.compare("(") == 0) { // brush plane Vector3f p1, p2, p3; @@ -352,6 +407,9 @@ bool MapFile::getline() planes.push_back(face); value_current.clear(); + + } else if (firstword.compare("patchDef2") == 0) { + in_patchdef = true; } } } @@ -635,7 +693,7 @@ void MapFile::make_brushface(Face *face) vl.pop_back(); } } else { - con_debug << "Unresolved face!\n"; + con_warn << name() << " unresolved face at line " << line() << std::endl; } // clean up the vertex list @@ -845,7 +903,7 @@ void MapFile::load_fragmentgroup(Model *model, const FragmentGroup::Type class_t if (primitives->quads().size()) { Fragment *fragment = new Fragment(Fragment::Quads, primitives->material()); - // add structural triangles to the fragment + // add structural quads to the fragment for (Primitives::Quads::iterator quad_it = primitives->quads().begin(); quad_it != primitives->quads().end(); quad_it++) { Quad *quad = (*quad_it); if (!quad->detail()) { @@ -859,7 +917,7 @@ void MapFile::load_fragmentgroup(Model *model, const FragmentGroup::Type class_t } } - // add detail triangles to the fragment + // add detail quads to the fragment for (Primitives::Quads::iterator quad_it = primitives->quads().begin(); quad_it != primitives->quads().end(); quad_it++) { Quad *quad = (*quad_it); if (quad->detail()) { @@ -943,7 +1001,8 @@ Model * MapFile::load(std::string const &name) // worldspawn attributes if (mapfile.got_key("name")) { - con_debug << " model name '" << name << "'" << std::endl; + //con_debug << " model name '" << name << "'" << std::endl; + continue; } else if (mapfile.got_key_int("enginesound", u)) { model->model_enginesound = u; @@ -1403,7 +1462,10 @@ Model * MapFile::load(std::string const &name) } con_debug << " " << mapfile.name() << " " << mapfile.map_brushes << " brushes " << - mapfile.map_faces << "/" << mapfile.map_faces_detail << " faces/detail " << std::endl; + model->model_tris_count << "/" << model->model_tris_detail_count << " tris/detail " << + model->model_quad_count << "/" << model->model_quad_detail_count << " quads/detail" << + std::endl; + if (mapfile.warning_q2brush) con_warn << " quake2 style brushes detected" << std::endl; diff --git a/src/model/mapfile.h b/src/model/mapfile.h index fd6bf48..0cf66a5 100644 --- a/src/model/mapfile.h +++ b/src/model/mapfile.h @@ -45,6 +45,8 @@ private: /// parse one line, returns false on end-of-file bool getline(); + + bool read_patchdef(); /// current classname inline std::string classname() const @@ -182,6 +184,8 @@ private: Materials map_materials; bool warning_q2brush; + + bool in_patchdef; }; } diff --git a/src/model/triangle.cc b/src/model/triangle.cc index 90d52b7..40c34a3 100644 --- a/src/model/triangle.cc +++ b/src/model/triangle.cc @@ -10,23 +10,23 @@ namespace model { Triangle::Triangle(const math::Vector3f &v0, const math::Vector3f &v1, const math::Vector3f &v2) : - triangle_v0(v0), - triangle_v1(v1), - triangle_v2(v2) + triangle_v0(v0), + triangle_v1(v1), + triangle_v2(v2) { - triangle_detail = false; + triangle_detail = false; } Triangle::Triangle(const math::Vector3f &v0,const math::Vector3f &v1, const math::Vector3f &v2, const math::Vector3f &normal, const bool detail) : - triangle_v0(v0), - triangle_n0(normal), - triangle_v1(v1), - triangle_n1(normal), - triangle_v2(v2), - triangle_n2(normal), - triangle_normal(normal) + triangle_v0(v0), + triangle_n0(normal), + triangle_v1(v1), + triangle_n1(normal), + triangle_v2(v2), + triangle_n2(normal), + triangle_normal(normal) { - triangle_detail = detail; + triangle_detail = detail; } Triangle::~Triangle() diff --git a/src/model/triangle.h b/src/model/triangle.h index f2a741a..8e8d1e2 100644 --- a/src/model/triangle.h +++ b/src/model/triangle.h @@ -17,102 +17,92 @@ namespace model class Triangle { public: - /** - * @brief a new triangle with 3 vertices - * this constructor is used by the ASE reader sets the detail flag to false - */ - Triangle(const math::Vector3f &v0, const math::Vector3f &v1, const math::Vector3f &v2); - - /** - * @brief a new triangle with 3 vertices - * this constructor is used by the MAP reader and assigns the face normal to every vertex normal - */ - Triangle(const math::Vector3f &v0,const math::Vector3f &v1, const math::Vector3f &v2, const math::Vector3f &normal, const bool detail = false); - - /// delete triangle - ~Triangle(); - - /// triangle vertex 0 - inline math::Vector3f & v0() - { - return triangle_v0; - } - - /// triangle vertex 0 normal - inline math::Vector3f & n0() - { - return triangle_n0; - } - - /// triangle vertex 0 texture coordinates - inline math::Vector2f & t0() - { - return triangle_t0; - } - - /// triangle vertex 1 - inline math::Vector3f & v1() - { - return triangle_v1; - } - - /// triangle vertex 1 normal - inline math::Vector3f & n1() - { - return triangle_n1; - } - - /// triangle vertex 1 texture coordinates - inline math::Vector2f & t1() - { - return triangle_t1; - } - - /// triangle vertex 2 - inline math::Vector3f & v2() - { - return triangle_v2; - } - - /// triangle vertex 2 normal - inline math::Vector3f & n2() - { - return triangle_n2; - } - - /// triangle vertex 2 texture coordinates - inline math::Vector2f & t2() - { - return triangle_t2; - } - - /// indidcates if this triangle was generated from a detail brush - inline bool detail() const - { - return triangle_detail; - } - - /// face normal - inline math::Vector3f &normal() { - return triangle_normal; - } + /** + * @brief a new triangle with 3 vertices + * this constructor is used by the ASE reader sets the detail flag to false + */ + Triangle(const math::Vector3f &v0, const math::Vector3f &v1, const math::Vector3f &v2); + + /** + * @brief a new triangle with 3 vertices + * this constructor is used by the MAP reader and assigns the face normal to every vertex normal + */ + Triangle(const math::Vector3f &v0,const math::Vector3f &v1, const math::Vector3f &v2, const math::Vector3f &normal, const bool detail = false); + + /// delete triangle + ~Triangle(); + + /// triangle vertex 0 + inline math::Vector3f & v0() { + return triangle_v0; + } + + /// triangle vertex 0 normal + inline math::Vector3f & n0() { + return triangle_n0; + } + + /// triangle vertex 0 texture coordinates + inline math::Vector2f & t0() { + return triangle_t0; + } + + /// triangle vertex 1 + inline math::Vector3f & v1() { + return triangle_v1; + } + + /// triangle vertex 1 normal + inline math::Vector3f & n1() { + return triangle_n1; + } + + /// triangle vertex 1 texture coordinates + inline math::Vector2f & t1() { + return triangle_t1; + } + + /// triangle vertex 2 + inline math::Vector3f & v2() { + return triangle_v2; + } + + /// triangle vertex 2 normal + inline math::Vector3f & n2() { + return triangle_n2; + } + + /// triangle vertex 2 texture coordinates + inline math::Vector2f & t2() { + return triangle_t2; + } + + /// indidcates if this triangle was generated from a detail brush + inline bool detail() const { + return triangle_detail; + } + + /// face normal + inline math::Vector3f &normal() { + return triangle_normal; + } private: - math::Vector3f triangle_v0; - math::Vector3f triangle_n0; - math::Vector2f triangle_t0; + math::Vector3f triangle_v0; + math::Vector3f triangle_n0; + math::Vector2f triangle_t0; - math::Vector3f triangle_v1; - math::Vector3f triangle_n1; - math::Vector2f triangle_t1; + math::Vector3f triangle_v1; + math::Vector3f triangle_n1; + math::Vector2f triangle_t1; - math::Vector3f triangle_v2; - math::Vector3f triangle_n2; - math::Vector2f triangle_t2; - - math::Vector3f triangle_normal; - bool triangle_detail; + math::Vector3f triangle_v2; + math::Vector3f triangle_n2; + math::Vector2f triangle_t2; + + math::Vector3f triangle_normal; + bool triangle_detail; }; } diff --git a/src/render/camera.cc b/src/render/camera.cc index ba82ea6..54c4547 100644 --- a/src/render/camera.cc +++ b/src/render/camera.cc @@ -59,7 +59,7 @@ void Camera::init() target_direction = 0.0f; distance = 0.4f; - camera_zoom = 1.0f; + camera_zoom = 2.0f; camera_mode = Overview; camera_previous_mode = Track; @@ -290,7 +290,7 @@ void Camera::frame(float seconds) if (core::localcontrol()->model()) { camera_target -= camera_axis.forward() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->maxbbox().x); - camera_target += camera_axis.up() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->maxbbox().z); + camera_target += camera_axis.up() * math::max(FRUSTUMFRONT / WORLDSCALE, core::localcontrol()->model()->maxbbox().z * 2.0f); } else { camera_target -= camera_axis.forward() * math::max (FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + core::localcontrol()->radius()); camera_target += camera_axis.up() * math::max (FRUSTUMFRONT / WORLDSCALE, FRUSTUMFRONT / WORLDSCALE + core::localcontrol()->radius()); diff --git a/src/render/draw.cc b/src/render/draw.cc index 1884125..e9123cd 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -837,6 +837,7 @@ void draw_model_bbox(model::Model *model) gl::vertex(model->model_maxbbox.x, model->model_minbbox.y, model->model_minbbox.z); gl::end(); + // body gl::begin(gl::Lines); gl::vertex(model->model_maxbbox.x, model->model_maxbbox.y, model->model_maxbbox.z); gl::vertex(model->model_maxbbox.x, model->model_maxbbox.y, model->model_minbbox.z); @@ -846,6 +847,43 @@ void draw_model_bbox(model::Model *model) gl::vertex(model->model_minbbox.x, model->model_minbbox.y, model->model_minbbox.z); gl::vertex(model->model_maxbbox.x, model->model_minbbox.y, model->model_maxbbox.z); gl::vertex(model->model_maxbbox.x, model->model_minbbox.y, model->model_minbbox.z); + + gl::end(); +} + + +// draw entity axis +void draw_model_axis(const core::Entity *entity) +{ + // axis + const float r = entity->radius() * 1.5f; + + gl::begin(gl::Lines); + + gl::color(entity->color()); + + gl::vertex(-r, 0.0f, 0.0f); + gl::vertex(r, 0.0f, 0.0f); + + gl::vertex(0.0f, -r, 0.0f); + gl::vertex(0.0f, r, 0.0f); + + gl::vertex(0.0f, 0.0f, -r); + gl::vertex(0.0f, 0.0f, r); + + const math::Axis worldaxis(entity->axis().transpose()); + + gl::color(1.0f, 0.0f, 0.0f); + + gl::vertex(worldaxis.forward() * -1 * r); + gl::vertex(worldaxis.forward() * r); + + gl::vertex(worldaxis.left() * -1 * r); + gl::vertex(worldaxis.left() * r); + + gl::vertex(worldaxis.up() * -1 * r); + gl::vertex(worldaxis.up() * r); + gl::end(); } @@ -866,6 +904,9 @@ void draw_pass_model_fragments() draw_model_bbox(entity->model()); } + if (r_axis->value()) { + draw_model_axis(entity); + } gl::pop(); } } diff --git a/src/render/render.cc b/src/render/render.cc index 27204f6..4ad2d84 100644 --- a/src/render/render.cc +++ b/src/render/render.cc @@ -26,6 +26,7 @@ namespace render { +core::Cvar *r_axis = 0; core::Cvar *r_bbox = 0; core::Cvar *r_grid = 0; core::Cvar *r_particles = 0; @@ -74,11 +75,14 @@ void init(int width, int height) r_normals->set_info("[bool] render face normals"); r_normalize = core::Cvar::get("r_normalize", "0", core::Cvar::Archive); - r_normalize->set_info("[bool] use GL_NORMALIZE instead of GL_RESCALE_NORMAL"); + r_normalize->set_info("[bool] use GL_NORMALIZE instead of GL_RESCALE_NORMAL (recommended off)"); r_grid = core::Cvar::get("r_grid", "0", core::Cvar::Archive); r_grid->set_info("[bool] render the space grid"); + r_axis = core::Cvar::get("r_axis", "0", core::Cvar::Archive); + r_axis->set_info("[bool] render entity axis"); + r_bbox = core::Cvar::get("r_bbox", "0", core::Cvar::Archive); r_bbox->set_info("[bool] render model bounding box"); @@ -99,9 +103,10 @@ void init(int width, int height) // hardware generate mipmaps r_mipmap = core::Cvar::get("r_mipmap", "1", core::Cvar::Archive); - r_mipmap->set_info("[bool] use hardware generated mipmaps"); + r_mipmap->set_info("[bool] use hardware generated mipmaps (recommended on)"); if (!State::has_generate_mipmaps()) { con_print << " no hardware generated mipmap support" << std::endl; + (*r_mipmap) = 0.0f; } Camera::init(); diff --git a/src/render/render.h b/src/render/render.h index c397c78..765e0f9 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -36,6 +36,8 @@ namespace render { /// resize viewport void resize(int width, int height); + /// render entity axis + extern core::Cvar *r_axis; /// render model bounding boxes extern core::Cvar *r_bbox; /// render the spacegrid |