Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/client')
-rw-r--r--src/client/targets.cc33
-rw-r--r--src/client/targets.h3
2 files changed, 24 insertions, 12 deletions
diff --git a/src/client/targets.cc b/src/client/targets.cc
index 6809939..8a7f402 100644
--- a/src/client/targets.cc
+++ b/src/client/targets.cc
@@ -39,6 +39,7 @@ unsigned int current_target_id = 0;
unsigned int current_hover = 0;
const core::Entity *current_target = 0;
+math::Vector3f cursor_aim;
bool is_valid_map_target(const core::Entity *entity)
{
@@ -295,6 +296,11 @@ void shutdown()
core::Func::remove("target_center");
}
+const math::Vector3f & aim()
+{
+ return cursor_aim;
+}
+
// render targets and sounds (in world coordinates)
void frame()
{
@@ -327,14 +333,9 @@ void frame()
y = (float)(input::mouse_position_y() - render::State::height() / 2) / (float)render::State::height() / render::State::aspect();
}
- Vector3f cursor = render::Camera::eye() + render::Camera::axis().forward() * (render::FRUSTUMFRONT + 0.001);
- cursor -= render::Camera::axis().left() * x;
- cursor -= render::Camera::axis().up() * y;
-
- // set aim
- if (core::localcontrol()) {
- core::localcontrol()->set_target_aim(cursor);
- }
+ cursor_aim.assign(render::Camera::eye() + render::Camera::axis().forward() * (render::FRUSTUMFRONT + 0.001));
+ cursor_aim -= render::Camera::axis().left() * x;
+ cursor_aim -= render::Camera::axis().up() * y;
//math::Vector3f center = render::Camera::eye() + (render::Camera::axis().forward() * (render::FRUSTUMFRONT + 0.001f));
for (core::Zone::Content::iterator it = zone->content().begin(); it != zone->content().end(); it++) {
@@ -359,7 +360,7 @@ void frame()
if (math::dotproduct(render::Camera::axis().forward(), v) > 0.75) {
// calculate the distance from entity location to the line [eye - cursor]
- float d = math::Vector3f::length(math::crossproduct((cursor - render::Camera::eye()) , (render::Camera::eye() - entity->location()))) / math::Vector3f::length(cursor - render::Camera::eye());
+ float d = math::Vector3f::length(math::crossproduct((cursor_aim - render::Camera::eye()) , (render::Camera::eye() - entity->location()))) / math::Vector3f::length(cursor_aim - render::Camera::eye());
float r = entity->radius() * 0.5f;
@@ -372,7 +373,7 @@ void frame()
// if the cursor-beam hits the entity sphere
if (d < r) {
- float myz = math::distance(cursor, entity->location());
+ float myz = math::distance(cursor_aim, entity->location());
if (z < 0 || myz < z) {
current_hover = entity->id();
z = myz;
@@ -384,13 +385,21 @@ void frame()
}
}
+ float d = 64.0f; // default aim distance
+
if (!current_target) {
current_target_id = 0;
} else {
current_target_id = current_target->id();
-
-
+ d = math::distance(render::Camera::eye(), current_target->location());
+ }
+ cursor_aim = render::Camera::eye() + (cursor_aim - render::Camera::eye()) / math::distance(render::Camera::eye(), cursor_aim) * d;
+
+ // set aim
+ if (core::localcontrol()) {
+ core::localcontrol()->set_target_aim(cursor_aim);
}
+
}
}
diff --git a/src/client/targets.h b/src/client/targets.h
index e66ff97..ed681c3 100644
--- a/src/client/targets.h
+++ b/src/client/targets.h
@@ -48,6 +48,9 @@ void set_target(unsigned int id);
/// target a specific entity
void set_target(const core::Entity *entity);
+/// return current cursor aim location in world space
+const math::Vector3f &cursor_aim();
+
}
}