[Add] Added targets to ships.

This commit is contained in:
Rtch90 2017-11-17 20:51:44 +00:00
parent a3693b52aa
commit aff5111f36
9 changed files with 95 additions and 8 deletions

View File

@ -5,6 +5,8 @@
Body::Body(void) {
m_frame = 0;
m_flags = 0;
m_projectedPos = vector3d(0.0f, 0.0f, 0.0f);
m_onscreen = false;
}
/* f == NULL, then absolute position within system. */
@ -12,3 +14,8 @@ vector3d Body::GetPositionRelTo(const Frame* relTo) {
return m_frame->GetPosRelativeToOtherFrame(relTo) + GetPosition();
}
const vector3d& Body::GetProjectedPos(void) const {
assert(IsOnscreen());
return m_projectedPos;
}

View File

@ -26,6 +26,11 @@ public:
unsigned int GetFlags(void) { return m_flags; }
/* Return true if we should apply damage. */
virtual bool OnCollision(Body* b) { return false; }
void SetProjectedPos(const vector3d& projectedPos) { m_projectedPos = projectedPos; }
/* Only valid if IsOnScreen() is true. */
const vector3d& GetProjectedPos() const;
bool IsOnscreen() const { return m_onscreen; }
void SetOnscreen(const bool onscreen) { m_onscreen = onscreen; }
enum { FLAG_CAN_MOVE_FRAME = 1 };
@ -36,5 +41,7 @@ private:
/* Frame of reference. */
Frame* m_frame;
std::string m_label;
bool m_onscreen;
vector3d m_projectedPos;
};

View File

@ -21,6 +21,7 @@ void Frame::Init(Frame* parent, const char* label, unsigned int flags) {
m_parent = parent;
m_flags = flags;
m_radius = 0;
m_pos = vector3d(0.0f);
m_dSpaceID = dHashSpaceCreate(0);
if(m_parent) {
m_parent->m_children.push_back(this);

View File

@ -158,17 +158,20 @@ void Player::DrawHUD(const Frame* cam_frame) {
{
for(std::list<Body*>::iterator i = Space::bodies.begin(); i != Space::bodies.end(); ++i) {
Body* b = *i;
if(b == this) continue;
vector3d _pos = b->GetPositionRelTo(cam_frame);
vector3d cam_coord = rot*_pos;
if(cam_coord.z < 0)
if(Gui::Screen::Project(_pos.x, _pos.y, _pos.z, modelMatrix, projMatrix,
viewport, &_pos.x, &_pos.y, &_pos.z)) {
Gui::Screen::RenderLabel(b->GetLabel(), _pos.x, _pos.y);
}
if(cam_coord.z < 0
&& Gui::Screen::Project(_pos.x,_pos.y,_pos.z,modelMatrix,projMatrix,viewport,
&_pos.x, &_pos.y, &_pos.z)) {
b->SetProjectedPos(_pos);
b->SetOnscreen(true);
} else
b->SetOnscreen(false);
}
}
DrawTargetSquare();
GLdouble pos[3];
const float sz = HUD_CROSSHAIR_SIZE;
@ -245,3 +248,27 @@ void Player::DrawHUD(const Frame* cam_frame) {
Gui::Screen::LeaveOrtho();
}
void Player::DrawTargetSquare(void) {
if(GetTarget()) {
glPushAttrib(GL_CURRENT_BIT | GL_LINE_BIT);
glColor3f(0.0f, 1.0f, 0.0f);
glLineWidth(2.0f);
const vector3d& _pos = GetTarget()->GetProjectedPos();
const float x1 = _pos.x - WorldView::PICK_OBJECT_RECT_SIZE * 0.5f;
const float x2 = x1 + WorldView::PICK_OBJECT_RECT_SIZE;
const float y1 = _pos.y - WorldView::PICK_OBJECT_RECT_SIZE * 0.5f;
const float y2 = y1 + WorldView::PICK_OBJECT_RECT_SIZE;
glBegin(GL_LINE_STRIP);
glVertex2f(x1, y1);
glVertex2f(x2, y1);
glVertex2f(x2, y2);
glVertex2f(x1, y2);
glVertex2f(x1, y1);
glEnd();
glPopAttrib();
}
}

View File

@ -12,6 +12,7 @@ public:
vector3d GetExternalViewTranslation(void);
void ApplyExternalViewRotation(void);
private:
void DrawTargetSquare();
float m_mouseCMov[2];
float m_external_view_rotx, m_external_view_roty;
float m_external_view_dist;

View File

@ -10,6 +10,7 @@ Ship::Ship(ShipType::Type shipType) : RigidBody() {
m_wheelTransition = 0;
m_wheelState = 0;
m_dockedWith = 0;
m_target = 0;
m_mesh = 0;
m_shipType = shipType;
m_angThrusters[0] = m_angThrusters[1] = m_angThrusters[2] = 0;
@ -143,12 +144,15 @@ void Ship::RenderLaserfire(void) {
glDisable(GL_LIGHTING);
for(int i = 0; i < ShipType::GUNMOUNT_MAX; i++) {
if(!m_gunState[i]) continue;
glPushAttrib(GL_CURRENT_BIT | GL_LINE_BIT);
glColor3f(1, 0, 0);
glBegin(GL_LINES);
glLineWidth(2.0f);
vector3f pos = stype.gunMount[i].pos;
glVertex3f(pos.x, pos.y, pos.z);
glVertex3fv(&((10000)*stype.gunMount[i].dir)[0]);
glEnd();
glPopAttrib();
}
glEnable(GL_LIGHTING);
}

View File

@ -20,6 +20,8 @@ public:
virtual Object::Type GetType(void) { return Object::SHIP; }
virtual void SetDockedWith(SpaceStation*);
SpaceStation* GetDockedWith(void) { return m_dockedWith; }
void SetTarget(Body* const target) { m_target = target; }
Body* GetTarget(void) const { return m_target; }
virtual void Render(const Frame* camFrame);
void SetMesh(ObjMesh* m);
void SetThrusterState(enum ShipType::Thruster t, float level);
@ -54,5 +56,6 @@ private:
dGeomID m_tempLaserGeom[ShipType::GUNMOUNT_MAX];
LaserObj m_laserCollisionObj;
Body* m_target;
};

View File

@ -5,6 +5,7 @@
#include "space.h"
static const float lightCol[] = { 1, 1, .9, 0 };
const float WorldView::PICK_OBJECT_RECT_SIZE = 20.0f;
#define BG_STAR_MAX 2000
@ -113,3 +114,35 @@ void WorldView::Update(void) {
L3D::player->AITurn();
}
void WorldView::OnMouseDown(Gui::MouseButtonEvent* e) {
if(1 == e->button) {
/* Left click in view => Select target. */
float screenPos[2];
GetPosition(screenPos);
/* Put mouse coords into screen space. */
screenPos[0] += e->x;
screenPos[1] += e->y;
L3D::player->SetTarget(PickBody(screenPos[0], screenPos[1]));
}
}
Body* WorldView::PickBody(const float screenX, const float screenY) const {
Body* selected = 0;
for(std::list<Body*>::iterator i = Space::bodies.begin(); i != Space::bodies.end(); ++i) {
Body* b = *i;
if(b->IsOnscreen()) {
const vector3d& _pos = b->GetProjectedPos();
const float x1 = _pos.x - PICK_OBJECT_RECT_SIZE * 0.5f;
const float x2 = x1 + PICK_OBJECT_RECT_SIZE;
const float y1 = _pos.y - PICK_OBJECT_RECT_SIZE * 0.5f;
const float y2 = y1 + PICK_OBJECT_RECT_SIZE;
if(screenX >= x1 && screenX <= x2 && screenY >= y1 && screenY <= y2) {
selected = b;
break;
}
}
}
return selected;
}

View File

@ -3,16 +3,20 @@
#include "gui.h"
#include "view.h"
class Body;
class WorldView: public View {
public:
WorldView(void);
virtual void Update(void);
virtual void Draw3D(void);
matrix4x4d viewingRotation;
static const float PICK_OBJECT_RECT_SIZE;
private:
void OnClickHyperspace(void);
void OnChangeWheelsState(Gui::MultiStateImageButton* b);
virtual void OnMouseDown(Gui::MouseButtonEvent* e);
Body* PickBody(const float screenX, const float screenY) const;
Gui::ImageButton* m_hyperspaceButton;
GLuint m_bgstarsDlist;
};