From cb52e5bd8da01ab2e7976fcd8bfc34e190265ed5 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 16 Mar 2008 22:36:04 +0000 Subject: r_drawradius --- src/client/view.cc | 2 +- src/core/entity.h | 2 +- src/core/model.cc | 24 ++++++++------ src/core/model.h | 15 ++++++++- src/game/ship.cc | 2 ++ src/game/star.cc | 2 +- src/math/vector3f.cc | 23 ++++++++++++-- src/math/vector3f.h | 6 ++++ src/render/draw.cc | 90 ++++++++++++++++++++++++---------------------------- src/render/render.cc | 4 ++- src/render/render.h | 3 ++ 11 files changed, 107 insertions(+), 66 deletions(-) (limited to 'src') diff --git a/src/client/view.cc b/src/client/view.cc index db7f3a3..466723f 100644 --- a/src/client/view.cc +++ b/src/client/view.cc @@ -70,7 +70,7 @@ void reset() glMateriali(GL_FRONT, GL_SHININESS, 128); // shininess 1-128 gl::disable(GL_LIGHTING); - gl::disable(GL_LIGHT0); + gl::enable(GL_LIGHT0); gl::disable(GL_COLOR_MATERIAL); // culling diff --git a/src/core/entity.h b/src/core/entity.h index 1f47640..323eec7 100644 --- a/src/core/entity.h +++ b/src/core/entity.h @@ -28,7 +28,7 @@ class Entity { public: /// Entity flags - enum Flags {Static=1, Solid=2}; + enum Flags {Static=1, Solid=2, Bright=4}; /// Entity type constants enum Type {Default=0, Dynamic=1, Controlable=2}; diff --git a/src/core/model.cc b/src/core/model.cc index da179e5..88a1040 100644 --- a/src/core/model.cc +++ b/src/core/model.cc @@ -247,6 +247,11 @@ Model::Model(std::string const & name) : ifs.close(); if (model_face.size()) { + if (model_maxbbox.lengthsquared() > model_minbbox.lengthsquared()) { + model_radius = model_maxbbox.length(); + } else { + model_radius = model_minbbox.length(); + } model_valid = true; } con_debug << " maps/" << name << ".map " << model_face.size() << " polygons\n"; @@ -502,18 +507,17 @@ void Model::make_face(math::Plane3f *face, std::vector & planes Face *mf = new Face(face->normal()*-1, color); for (std::vector::iterator it = vl.begin(); it != vl.end(); it++) { mf->add_vertex(*(*it) * model_scale); - } - add_face(mf); - /* - mf->add_vertex(*(*vn) * model_scale); - mf->add_vertex(*(*v0) * model_scale); - mf->add_vertex(*(*vn1) * model_scale); - add_face(mf); + + // bounding box + for (int i=0; i < 3; i++) { + if (model_maxbbox[i] < (*(*it))[i] * model_scale) + model_maxbbox[i] = (*(*it))[i] * model_scale; - vl.pop_back(); + if (model_minbbox[i] > (*(*it))[i] * model_scale) + model_minbbox[i] = (*(*it))[i] * model_scale; + } } - */ - + add_face(mf); if (color) delete color; } else { con_debug << "Unresolved face!\n"; diff --git a/src/core/model.h b/src/core/model.h index 013edcc..00c8a48 100644 --- a/src/core/model.h +++ b/src/core/model.h @@ -88,7 +88,16 @@ public: { return model_name; } + + /// maximum values of the bounding box + inline math::Vector3f const & maxbbox() const { return model_maxbbox; } + /// minimum values of the bounding box + inline math::Vector3f const & minbbox() const { return model_minbbox; } + + /// radius + inline float radius() const { return model_radius; } + /// the Model registry static std::map registry; @@ -114,7 +123,7 @@ public: /// list of Lights std::list model_light; - + private: void make_face(math::Plane3f *face, std::vector & planes); void add_engine(Engine *engine); @@ -123,8 +132,12 @@ private: std::string model_name; + float model_radius; float model_scale; bool model_valid; + + math::Vector3f model_maxbbox; + math::Vector3f model_minbbox; }; } diff --git a/src/game/ship.cc b/src/game/ship.cc index 1dd37bc..b82b7a8 100644 --- a/src/game/ship.cc +++ b/src/game/ship.cc @@ -23,6 +23,8 @@ Ship::Ship(core::Player *owner, ShipModel *shipmodel) : entity_modelname = "ships/" + shipmodel->modelname(); entity_name = shipmodel->name() + ": <" + owner->name() + ">"; ship_shipmodel = shipmodel; + + entity_moduletypeid = ship_enttype; } Ship::~Ship() diff --git a/src/game/star.cc b/src/game/star.cc index 0bb8fb5..1d154fe 100644 --- a/src/game/star.cc +++ b/src/game/star.cc @@ -10,7 +10,7 @@ namespace game { -Star::Star() : core::Entity(core::Entity::Static & core::Entity::Solid) +Star::Star() : core::Entity(core::Entity::Static | core::Entity::Solid | core::Entity::Bright) { entity_shape = core::Entity::Sphere; // a star is a sphere entity_color = math::Color(1,1,1,1); // white diff --git a/src/math/vector3f.cc b/src/math/vector3f.cc index 3f1f4ac..a9e7e00 100644 --- a/src/math/vector3f.cc +++ b/src/math/vector3f.cc @@ -116,7 +116,7 @@ bool Vector3f::operator==(const Vector3f& other) const float Vector3f::lengthsquared() const { - double r = 0; + float r = 0; for (int i=0; i < 3; i++) r += coord[i]*coord[i]; return ((float) r); @@ -124,11 +124,11 @@ float Vector3f::lengthsquared() const float Vector3f::length() const { - double r = 0; + float r = 0; for (int i=0; i < 3; i++) r += coord[i]*coord[i]; - return ((float) sqrt(r)); + return (sqrtf(r)); } void Vector3f::normalize() @@ -171,4 +171,21 @@ float dotproduct(const Vector3f& first, const Vector3f& second) return (r); } +float distance(const Vector3f& first, const Vector3f& second) +{ + float r = 0; + for (int i=0; i < 3; i++) + r += (first[i]-second[i])*(first[i]-second[i]); + + return (sqrtf(r)); +} + +float distancesquared(const Vector3f& first, const Vector3f& second) +{ + float r = 0; + for (int i=0; i < 3; i++) + r += (first[i]-second[i])*(first[i]-second[i]); + return (r); +} + } // namespace math diff --git a/src/math/vector3f.h b/src/math/vector3f.h index 5d1fa41..20e47f2 100644 --- a/src/math/vector3f.h +++ b/src/math/vector3f.h @@ -148,6 +148,12 @@ const Vector3f crossproduct(Vector3f const & first, Vector3f const & second); /// vector dot product float dotproduct(const Vector3f& first, const Vector3f& second); +/// distance between two vectors +float distance(const Vector3f& first, const Vector3f& second); + +/// distance between two vectors squared +float distancesquared(const Vector3f& first, const Vector3f& second); + } // namespace math #endif // __INCLUDED_MATH_VECTOR3F_H__ diff --git a/src/render/draw.cc b/src/render/draw.cc index 1d27631..9e1e5ea 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -6,13 +6,14 @@ #include "core/core.h" #include "core/model.h" +#include "render/render.h" #include "render/draw.h" #include "render/sphere.h" namespace render { -render::Sphere sphere(1); +Sphere sphere(1); math::Vector3f v0(1, -1, 1); math::Vector3f v1(1, 1, 1); @@ -24,6 +25,8 @@ math::Vector3f v5(1, 1, -1); math::Vector3f v6(-1, 1, -1); math::Vector3f v7(-1, -1, -1); +const float drawdistance = 128.0f; +math::Vector3f camera_target; float angle = 0; void draw_model(core::Model *model, core::Entity *entity) @@ -45,6 +48,15 @@ void draw_model(core::Model *model, core::Entity *entity) } gl::end(); } + + if (r_drawradius && r_drawradius->value()) { + sphere.sphere_color = entity->color(); + sphere.sphere_color.a = 0.25f; + sphere.radius = model->radius(); + gl::enable(GL_BLEND); // enable alpha blending again + sphere.draw(); + gl::disable(GL_BLEND); + } } void draw_model_engines(core::Model *model, core::EntityControlable *entity) @@ -63,31 +75,23 @@ void draw_model_engines(core::Model *model, core::EntityControlable *entity) } -void draw_model_lights(math::Vector3f const & eye, math::Vector3f const & target) +void draw_model_lights(core::Model *model, core::Entity *entity) { - glPointSize(10); - gl::begin(gl::Points); - - std::map::iterator it; - for (it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { - core::Model *model = 0; - if ((*it).second->modelname().size()) - model = core::Model::get((*it).second->modelname()); - - if (model) { - for (std::list::iterator lit = model->model_light.begin(); lit != model->model_light.end(); lit++) { - math::Vector3f location = (*it).second->location() + (*lit)->location(); - math::Vector3f d = location-eye; - if ((d.lengthsquared() < 16*16) && (dotproduct(d, eye-target) < 0)) { - gl::color((*lit)->color()); - gl::vertex(location); - } - } + if (model->model_light.size()) { + gl::disable(GL_LIGHTING); + glPointSize(10); + gl::begin(gl::Points); + + for (std::list::iterator lit = model->model_light.begin(); lit != model->model_light.end(); lit++) { + math::Vector3f location = (*lit)->location(); + gl::color((*lit)->color()); + gl::vertex(location); } + + gl::end(); + glPointSize(1); + gl::enable(GL_LIGHTING); } - - gl::end(); - glPointSize(1); } void draw_entity_sphere(core::Entity *entity) @@ -173,8 +177,13 @@ void draw_entity_default(core::Entity *entity) using namespace render; core::Model *model = 0; - if (entity->modelname().size()) + if (entity->modelname().size()) { model = core::Model::get(entity->modelname()); + } + + if (model && math::distancesquared(camera_target, entity->location()) > drawdistance*drawdistance*model->radius()) + return; + gl::push(); gl::translate(entity->location()); @@ -182,9 +191,10 @@ void draw_entity_default(core::Entity *entity) if (model) { draw_model(model, entity); + //draw_model_lights(model, entity); } else { - //gl::disable(GL_LIGHTING); - //gl::disable(GL_LIGHT0); + if ((entity->flags() & core::Entity::Bright) == core::Entity::Bright) + gl::disable(GL_LIGHTING); switch(entity->shape()) { case core::Entity::Sphere: @@ -204,8 +214,8 @@ void draw_entity_default(core::Entity *entity) break; } - //gl::enable(GL_LIGHTING); - //gl::enable(GL_LIGHT0); // disable camera light + if ((entity->flags() & core::Entity::Bright) == core::Entity::Bright) + gl::enable(GL_LIGHTING); } gl::pop(); @@ -222,9 +232,10 @@ void draw_entity_controlable(core::EntityControlable *entity) gl::translate(entity->location()); gl::rotate(entity->direction(), 0.0f, 0.0f, 1.0f ); - if (model) { + if (model ) { draw_model(model, entity); draw_model_engines(model, entity); + //draw_model_lights(model, entity); } // shield rotation @@ -301,6 +312,8 @@ void draw(math::Vector3f const &eye, math::Vector3f const &target, float seconds angle -= 360.0f; } + camera_target = target; + // draw entities using namespace render; @@ -308,7 +321,6 @@ void draw(math::Vector3f const &eye, math::Vector3f const &target, float seconds gl::enable(GL_CULL_FACE); // enable culling gl::enable(GL_COLOR_MATERIAL); // enable color tracking gl::enable(GL_LIGHTING); - gl::enable(GL_LIGHT0); gl::disable(GL_BLEND); // disbable alpha blending for world polys @@ -326,29 +338,11 @@ void draw(math::Vector3f const &eye, math::Vector3f const &target, float seconds } } - gl::disable(GL_LIGHT0); // disable camera light gl::disable(GL_LIGHTING); gl::disable(GL_COLOR_MATERIAL); // disable color tracking gl::disable(GL_CULL_FACE); // disable culling - gl::enable(GL_BLEND); // enable alpha blending again - /* - // DEBUG target lines - gl::push(); - gl::color(0,1, 0, .7); - //gl::translate(target*-1); - gl::begin(gl::Lines); - for (it=core::Entity::registry.begin(); it != core::Entity::registry.end(); it++) { - gl::vertex(eye); - gl::vertex((*it).second->location()); - } - gl::end(); - gl::pop(); - - draw_model_lights(eye, target); // second pass - draw lights - */ - draw_spacegrid(target); // draw the blue spacegrid gl::disable(GL_DEPTH_TEST); // disable depth buffer writing diff --git a/src/render/render.cc b/src/render/render.cc index 76f2373..b5afdf0 100644 --- a/src/render/render.cc +++ b/src/render/render.cc @@ -13,6 +13,8 @@ namespace render { GLuint textures[32]; +core::Cvar *r_drawradius = 0; + void init() { con_print << "Initializing renderer..." << std::endl; @@ -32,7 +34,7 @@ void init() core::application()->shutdown(); } - + r_drawradius = core::Cvar::get("r_drawradius", "0", core::Cvar::Archive); } void shutdown() diff --git a/src/render/render.h b/src/render/render.h index c27b740..7d26a3d 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -8,6 +8,7 @@ #define __INCLUDED_RENDER_H__ #include "GL/gl.h" +#include "core/cvar.h" namespace render { @@ -21,6 +22,8 @@ namespace render { void draw(float elapsed); extern GLuint textures[32]; + + extern core::Cvar *r_drawradius; } #include "render/draw.h" -- cgit v1.2.3