1
0
forked from 0ad/0ad

Corrected the view rectangle for the minimap and added "interactivity" as well (click a point on the minimap, and the camera moves to that spot).

This was SVN commit r2572.
This commit is contained in:
pyrolink 2005-07-31 23:54:19 +00:00
parent a9397e0888
commit 8ae90b6fdb

View File

@ -3,6 +3,7 @@
#include "gui/MiniMap.h"
#include "ps/Game.h"
#include <math.h>
#include "ogl.h"
#include "renderer/Renderer.h"
#include "graphics/TextureEntry.h"
@ -12,6 +13,12 @@
#include "Bound.h"
#include "Model.h"
#define VR_XMOVE (24)
#define VR_YMOVE (24.5)
extern bool mouseButtons[5];
extern int g_mouse_x, g_mouse_y;
bool HasClicked=false;
static unsigned int ScaleColor(unsigned int color,float x)
{
@ -107,52 +114,76 @@ void CMiniMap::Draw()
glEnd();
//================================================================
//INTERACTIVE MINIMAP STARTS
//Get Camera handle
CCamera &g_Camera=*g_Game->GetView()->GetCamera();
//Check for a click
if(mouseButtons[0]==true)
{
HasClicked=true;
}
//Check to see if left button is false (meaning it's been lifted)
if (mouseButtons[0]==false && HasClicked==true)
{
//Is cursor inside Minimap boundaries?
if(g_mouse_x > m_CachedActualSize.left && g_mouse_x < m_CachedActualSize.right
&& g_mouse_y > m_CachedActualSize.top && g_mouse_y < m_CachedActualSize.bottom)
{
CVector3D mm_CurrentPos=g_Camera.m_Orientation.GetTranslation();
//X and Z according to proportion of mouse position and minimap
CVector3D mm_Destination;
mm_Destination.X=(CELL_SIZE*m_MapSize)*
((g_mouse_x-m_CachedActualSize.left)/m_CachedActualSize.GetWidth());
mm_Destination.Y=mm_CurrentPos.Y;
mm_Destination.Z=(CELL_SIZE*m_MapSize)*
((m_CachedActualSize.bottom-g_mouse_y)/m_CachedActualSize.GetHeight());
//Extra constants for compensating for inaccurate conversion
//Decimal multiplied for ratio of constant/zoom so it works on all zooms
mm_Destination.X+=.7*mm_Destination.Y;
mm_Destination.Z-=.7*mm_Destination.Y;
//Move lower left side of frustum to mouse
g_Camera.m_Orientation._14=mm_Destination.X;
g_Camera.m_Orientation._34=mm_Destination.Z;
g_Camera.UpdateFrustum();
}
HasClicked=false;
}
//END OF INTERACTIVE MINIMAP
//====================================================================
// render view rect : John M. Mena
// This sets up and draws the rectangle on the mini-map
// which represents the view of the camera in the world.
// Get a handle to the camera
CCamera &g_Camera=*g_Game->GetView()->GetCamera();
CVector3D pos3D[4];
CVector2D pos2D[4];
// Get the far plane corner coordinates
g_Camera.GetCameraPlanePoints(g_Camera.GetFarPlane(), pos3D);
// transform to the plane coords to world space
CVector3D wPts[4];
for (int i=0;i<4;i++) wPts[i]=g_Camera.m_Orientation.Transform(pos3D[i]);
// TODO: Move this into the constructor
float h=128*HEIGHT_SCALE;
CPlane TerrainPlane;
TerrainPlane.Set( CVector3D( 0.0f, h, 0.0f ),
CVector3D( float(CELL_SIZE*m_MapSize), h, 0.0f ),
CVector3D( 0.0f, h, float(CELL_SIZE*m_MapSize) ) );
TerrainPlane.Normalize();
// END TODO
// now intersect a ray from the camera through each point
CVector3D rayOrigin=g_Camera.m_Orientation.GetTranslation();
CVector3D rayDir=g_Camera.m_Orientation.GetIn();
//Get correct world coordinates based off corner of screen start
//at Bottom Left and going CW
CVector3D hitPt[4];
for (int i=0;i<4;i++) {
CVector3D rayDir=wPts[i]-rayOrigin;
rayDir.Normalize();
hitPt[0]=g_Camera.GetWorldCoordinates(0,g_Renderer.GetHeight());
hitPt[1]=g_Camera.GetWorldCoordinates(g_Renderer.GetWidth(),g_Renderer.GetHeight());
hitPt[2]=g_Camera.GetWorldCoordinates(g_Renderer.GetWidth(),0);
hitPt[3]=g_Camera.GetWorldCoordinates(0,0);
// get intersection point
TerrainPlane.FindRayIntersection( rayOrigin, rayDir, &hitPt[i] );
}
// This is the way the ScEd converts to mini-map space.
// When attempting to use the supplied one for this class, the lines
// would stretch to unknown locations on the screen causing the
// rectangle to distort.
// TODO: Calculate this correctly.
// Currently the rectangle isn't drawing to the proper scale.
float ViewRect[4][2];
for (int i=0;i<4;i++) {
// convert to minimap space
@ -162,20 +193,19 @@ void CMiniMap::Draw()
ViewRect[i][1]=(m_CachedActualSize.GetHeight()*pz/float(CELL_SIZE*m_MapSize));
}
// This is the alternate way that converts to mini-map space.
//for (int i = 0; i < 4; i++)
// pos2D[i] = GetMapSpaceCoords(hitPt[i]);
// END TODO
// Enable Scissoring as to restrict the rectangle
// to only the mini-map below by retrieving the mini-maps
// screen coords.
glScissor((int)m_CachedActualSize.left, 0, (int)m_CachedActualSize.right, (int)m_CachedActualSize.GetHeight());
glEnable(GL_SCISSOR_TEST);
glEnable(GL_LINE_SMOOTH);
glLineWidth(2);
glColor3f(1.0f,0.3f,0.3f);
// Draw the viewing rectangle with the ScEd's conversion algorithm
glBegin(GL_LINE_LOOP);
glVertex2f(x+ViewRect[0][0], y-ViewRect[0][1]);
@ -184,10 +214,13 @@ void CMiniMap::Draw()
glVertex2f(x+ViewRect[3][0], y-ViewRect[3][1]);
glEnd();
glDisable(GL_SCISSOR_TEST);
// Reset everything back to normal
glPointSize(1.0f);
glDisable(GL_LINE_SMOOTH);
glLineWidth(1.0f);
glEnable(GL_TEXTURE_2D);
glDisable(GL_POINT_SMOOTH);