#include "ormaniparrow_manip.h"
#define ORMANIPARROW__CLASS ORMANIPARROW__CLASSNAME
#define ORMANIPARROW__LABEL "OR - Arrow"
#define ORMANIPARROW__DESC "OR - Arrow Manipulator Description"
ORMANIPARROW__LABEL,
ORMANIPARROW__DESC,
bool ORManipArrow::FBCreate()
{
if( FBManipulator::FBCreate() )
{
DefaultBehavior = true;
ViewerText = "Arrow Manipulator";
mTestState = 0;
mRenderInModelSpace = true;
mActivated = false;
return true;
}
return false;
}
void ORManipArrow::FBDestroy()
{
FBManipulator::FBDestroy();
}
void ORManipArrow::DrawArrow(
FBVector3d lVector )
{
glLoadName(1);
glColor3f( 1.0, 1.0, 0.0 );
glBegin(GL_POLYGON);
glVertex3f( lVector[0], lVector[1]-1, lVector[2] );
glVertex3f( lVector[0]+50.0, lVector[1]-1, lVector[2] );
glVertex3f( lVector[0]+50.0, lVector[1]+1, lVector[2] );
glVertex3f( lVector[0], lVector[1]+1, lVector[2] );
glEnd();
glBegin(GL_POLYGON);
glVertex3f( lVector[0]+50.0, lVector[1]-5, lVector[2] );
glVertex3f( lVector[0]+60.0, lVector[1], lVector[2] );
glVertex3f( lVector[0]+50.0, lVector[1]+5, lVector[2] );
glEnd();
}
void ORManipArrow::ViewExpose()
{
static int lValue = 0;
static int lStep = 1;
static bool lForward = true;
int lSelectedModels = lList.GetCount();
for(
int i=0;
i<lSelectedModels;
i++)
{
if( lList[
i]->
Is(FBModel::TypeInfo) )
{
break;
}
else
{
}
}
if( lSelectedModels == 0 )
{
}
{
mModel->GetVector(lVector);
mActivated = true;
if( mRenderInModelSpace )
{
FBModelRenderBegin(
NULL );
}
DrawArrow( lVector );
glFlush();
if( mRenderInModelSpace )
{
FBModelRenderEnd();
}
}
}
bool ORManipArrow::ViewInput(
int pMouseX,
int pMouseY,
FBInputType pAction,
int pButtonKey,
int pModifier)
{
static bool lMouseButtonPressed = false;
static bool lArrowSelected = false;
static int lPrevMouseX = 0;
if( mActivated && Active )
{
switch( pAction )
{
{
}
break;
{
}
break;
{
}
break;
{
{
lMouseButtonPressed = true;
lArrowSelected = false;
GLuint lSelectionBuf[64];
GLint lViewport[4];
FBCamera* lCamera = (FBCamera*)CurrentCamera;
glGetIntegerv(GL_VIEWPORT,lViewport);
glSelectBuffer(64, lSelectionBuf);
glRenderMode(GL_SELECT);
glInitNames();
glPushName( (GLuint)-1 );
glMatrixMode(GL_PROJECTION);
glPushMatrix();
{
glLoadIdentity();
gluPickMatrix(pMouseX, ((double)lCamera->WindowHeight) - pMouseY, 5.0, 5.0, lViewport);
FBMatrix lCameraProjMatrix;
glMultMatrixd( lCameraProjMatrix );
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
{
FBMatrix lCameraMVMatrix;
glLoadMatrixd( lCameraMVMatrix );
mModel->GetVector( lVector );
DrawArrow( lVector );
}
glPopMatrix();
}
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopName();
glFlush();
lArrowSelected = (glRenderMode(GL_RENDER)!=0);
}
}
break;
{
lMouseButtonPressed = false;
}
break;
{
if( lMouseButtonPressed )
{
if( lArrowSelected )
{
{
mModel->GetVector(lVector);
GLint lViewport[4];
glGetIntegerv(GL_VIEWPORT,lViewport);
if( pMouseX - lPrevMouseX > 0 )
{
lVector[0] += 3;
}
else if( pMouseX - lPrevMouseX < 0 )
{
lVector[0] -= 3;
}
mModel->SetVector(lVector);
}
}
}
}
break;
{
}
break;
{
}
break;
}
}
lPrevMouseX = pMouseX;
return true;
}