Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2013-10-08 18:48:31 +0000
committerStijn Buys <ingar@osirion.org>2013-10-08 18:48:31 +0000
commitc1b7876160db7860bdb34d877bf55e5f0b833566 (patch)
treeeb4f14ed9d4a1f54734ad5db4948cdea1071467e /src/render
parent655959a2413760560ba5549fd4967e374dd5a9df (diff)
Improved r_bbox and r_slots drawing.
Diffstat (limited to 'src/render')
-rw-r--r--src/render/draw.cc234
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);
}
-*/
}