diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/render/draw.cc | 234 |
1 files changed, 79 insertions, 155 deletions
diff --git a/src/render/draw.cc b/src/render/draw.cc index 87c25e2..50d02a7 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -210,7 +210,39 @@ void draw_pass_sky() Stats::quads += 6; } +/* ---- Draw a wireframe box --------------------------------------- */ +void draw_box(const math::Vector3f & minbox, const math::Vector3f & maxbox) +{ + // top + gl::begin(gl::LineLoop); + gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); + gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); + gl::vertex(minbox.x(), minbox.y(), maxbox.z()); + gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); + gl::end(); + + // bottom + gl::begin(gl::LineLoop); + gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); + gl::vertex(minbox.x(), maxbox.y(), minbox.z()); + gl::vertex(minbox.x(), minbox.y(), minbox.z()); + gl::vertex(maxbox.x(), minbox.y(), minbox.z()); + gl::end(); + + // body + gl::begin(gl::Lines); + gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); + gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); + gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); + gl::vertex(minbox.x(), maxbox.y(), minbox.z()); + gl::vertex(minbox.x(), minbox.y(), maxbox.z()); + gl::vertex(minbox.x(), minbox.y(), minbox.z()); + gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); + gl::vertex(maxbox.x(), minbox.y(), minbox.z()); + gl::end(); +} + /* ---- Globes ----------------------------------------------------- */ void draw_sphere(const math::Color & color, float radius) @@ -721,40 +753,6 @@ void draw_model_fragments(model::Model *model, State::reset(); } -// draw bounding box -void draw_model_bbox(model::Model *model) -{ - // top - gl::begin(gl::LineLoop); - gl::vertex(model->box().max().x(), model->box().max().y(), model->box().max().z()); - gl::vertex(model->box().min().x(), model->box().max().y(), model->box().max().z()); - gl::vertex(model->box().min().x(), model->box().min().y(), model->box().max().z()); - gl::vertex(model->box().max().x(), model->box().min().y(), model->box().max().z()); - gl::end(); - - // bottom - gl::begin(gl::LineLoop); - gl::vertex(model->box().max().x(), model->box().max().y(), model->box().min().z()); - gl::vertex(model->box().min().x(), model->box().max().y(), model->box().min().z()); - gl::vertex(model->box().min().x(), model->box().min().y(), model->box().min().z()); - gl::vertex(model->box().max().x(), model->box().min().y(), model->box().min().z()); - gl::end(); - - // body - gl::begin(gl::Lines); - gl::vertex(model->box().max().x(), model->box().max().y(), model->box().max().z()); - gl::vertex(model->box().max().x(), model->box().max().y(), model->box().min().z()); - gl::vertex(model->box().min().x(), model->box().max().y(), model->box().max().z()); - gl::vertex(model->box().min().x(), model->box().max().y(), model->box().min().z()); - gl::vertex(model->box().min().x(), model->box().min().y(), model->box().max().z()); - gl::vertex(model->box().min().x(), model->box().min().y(), model->box().min().z()); - gl::vertex(model->box().max().x(), model->box().min().y(), model->box().max().z()); - gl::vertex(model->box().max().x(), model->box().min().y(), model->box().min().z()); - - gl::end(); -} - - // draw entity axis void draw_model_axis(const core::Entity *entity) { @@ -829,8 +827,13 @@ void draw_pass_model_fragments() } if (r_bbox->value()) { + gl::disable(GL_DEPTH_TEST); + gl::color(entity->color().r * 0.5f, entity->color().g * 0.5f, entity->color().b * 0.5f, 0.25f); + draw_box(entity->model()->box().min(), entity->model()->box().max()); + + gl::enable(GL_DEPTH_TEST); gl::color(entity->color()); - draw_model_bbox(entity->model()); + draw_box(entity->model()->box().min(), entity->model()->box().max()); } if (r_axis->value()) { @@ -1316,13 +1319,12 @@ void draw_slots(const core::Entity *entity) if (!entity->model()) { return; } - gl::disable(GL_DEPTH_TEST); - - //const float modelscale = entity->radius() / entity->model()->radius(); - // draw docks if (entity->model()->docks().size()) { - gl::color(0, 1.0f, 1.0f, 1.0f); + + // draw docks: pass 1 - background with GL_DEPTH_TEST disabled + gl::disable(GL_DEPTH_TEST); + gl::color(0.0f, 0.5f, 0.5f, 0.25f); for (model::Model::Docks::iterator dit = entity->model()->docks().begin(); dit != entity->model()->docks().end(); dit++) { model::Dock *dock = (*dit); @@ -1334,38 +1336,32 @@ void draw_slots(const core::Entity *entity) minbox[i] -= 0.025; } - // top - gl::begin(gl::LineLoop); - gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), minbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); - gl::end(); + draw_box(minbox, maxbox); + } + + // draw docks: pass 2 - highlight with GL_DEPTH_TEST enabled + gl::enable(GL_DEPTH_TEST); + gl::color(0.0f, 1.0f, 1.0f, 1.0f); + + for (model::Model::Docks::iterator dit = entity->model()->docks().begin(); dit != entity->model()->docks().end(); dit++) { + model::Dock *dock = (*dit); + math::Vector3f maxbox(dock->location()); + math::Vector3f minbox(dock->location()); - // bottom - gl::begin(gl::LineLoop); - gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), minbox.y(), minbox.z()); - gl::vertex(maxbox.x(), minbox.y(), minbox.z()); - gl::end(); + for (size_t i = 0; i < 3; i++) { + maxbox[i] += 0.025; + minbox[i] -= 0.025; + } - gl::begin(gl::Lines); - gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), minbox.y(), maxbox.z()); - gl::vertex(minbox.x(), minbox.y(), minbox.z()); - gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), minbox.y(), minbox.z()); - gl::end(); + draw_box(minbox, maxbox); } } - // draw weapon slots if (entity->slots()) { - gl::color(1.0f, 0.0f, 0.0f); + + // draw weapon slots: pass 1 - background with GL_DEPTH_TEST disabled + gl::disable(GL_DEPTH_TEST); + gl::color(0.5f, 0.0f, 0.0f, 0.25f); for(core::Slots::iterator it = entity->slots()->begin(); it != entity->slots()->end(); ++it) { core::Slot *slot = (*it); @@ -1378,101 +1374,29 @@ void draw_slots(const core::Entity *entity) minbox[i] -= 0.025; } - // top - gl::begin(gl::LineLoop); - gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), minbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); - gl::end(); - - // bottom - gl::begin(gl::LineLoop); - gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), minbox.y(), minbox.z()); - gl::vertex(maxbox.x(), minbox.y(), minbox.z()); - gl::end(); - - gl::begin(gl::Lines); - gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), minbox.y(), maxbox.z()); - gl::vertex(minbox.x(), minbox.y(), minbox.z()); - gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), minbox.y(), minbox.z()); - gl::end(); + draw_box(minbox, maxbox); } - } - - gl::enable(GL_DEPTH_TEST); -} -/* -// draw HUD target world space geometry, like dock indicators -void draw_target(const core::Entity *entity) -{ - model::Model *model = entity->model(); - if (!model) - return; - - if (!model->docks().size()) - return; - - float d = math::distance(core::localcontrol()->location(), entity->location()) - entity->radius() - core::localcontrol()->radius(); - if (d > core::range::fxdistance) - return; - const float modelscale = entity->radius() / entity->model()->radius(); - - gl::enable(GL_DEPTH_TEST); - gl::push(); - gl::translate(entity->location()); - gl::multmatrix(entity->axis()); - - gl::color(0, 1.0f, 1.0f, 1.0f); + + // draw weapon slots: pass 2 - highlight with GL_DEPTH_TEST enabled + gl::enable(GL_DEPTH_TEST); + gl::color(1.0f, 0.0f, 0.0f); + + for(core::Slots::iterator it = entity->slots()->begin(); it != entity->slots()->end(); ++it) { + core::Slot *slot = (*it); + + math::Vector3f maxbox(slot->location()); + math::Vector3f minbox(slot->location()); - for (model::Model::Docks::iterator dit = model->docks().begin(); dit != model->docks().end(); dit++) { - model::Dock *dock = (*dit); - math::Vector3f maxbox(dock->location() * modelscale); - math::Vector3f minbox(dock->location() * modelscale); + for (size_t i = 0; i < 3; i++) { + maxbox[i] += 0.025; + minbox[i] -= 0.025; + } - for (size_t i = 0; i < 3; i++) { - maxbox[i] += 0.025; - minbox[i] -= 0.025; + draw_box(minbox, maxbox); } - - // top - gl::begin(gl::LineLoop); - gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), minbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); - gl::end(); - - // bottom - gl::begin(gl::LineLoop); - gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), minbox.y(), minbox.z()); - gl::vertex(maxbox.x(), minbox.y(), minbox.z()); - gl::end(); - - gl::begin(gl::Lines); - gl::vertex(maxbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), maxbox.y(), maxbox.z()); - gl::vertex(minbox.x(), maxbox.y(), minbox.z()); - gl::vertex(minbox.x(), minbox.y(), maxbox.z()); - gl::vertex(minbox.x(), minbox.y(), minbox.z()); - gl::vertex(maxbox.x(), minbox.y(), maxbox.z()); - gl::vertex(maxbox.x(), minbox.y(), minbox.z()); - gl::end(); } - gl::pop(); - gl::disable(GL_DEPTH_TEST); + gl::enable(GL_DEPTH_TEST); } -*/ } |