Sign in to follow this  
Arpan Man Sainju

Opengl Select Problem

Recommended Posts

I have been facing a problem regarding selecting the space in negative z direction with glulookat function. my code works fine for selecting a space providing two digonal points in the workspace if either one has positive z value but if both of the z value is negative the code fails.

Collapse | Copy Code
void COpenGLBaseView::Select(float x1,float y1, float z1,float x2,float y2,float z2)
{
if(x1 > x2)
{
Swap(x1,x2);
}
if(y1 > y2)
{
Swap(y1,y2);
}
if(z1 > z2)
{
Swap(z1,z2);
}
GLint hits, view[4];
/* This choose the buffer where store the values for the selection data */
glSelectBuffer(m_BucketSize, m_aBucket);
/* This retrieve info about the viewport */
glGetIntegerv(GL_VIEWPORT, view);
/* Switching in selecton mode */
glRenderMode(GL_SELECT);
/* Clearing the name's stack
This stack contains all the info about the objects */
glInitNames();
/* Now fill the stack with one element (or glLoadName will generate an error) */
glPushName(0);
/* Now modify the vieving volume, restricting selection area around the cursor */
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
/*restrict the draw to an area around the cursor */
//gluPickMatrix(X+XRange * 0.5, Y+YRange * 0.5, XRange, YRange, view);
gluPickMatrix(m_cx * 0.5, m_cy * 0.5,m_cx, m_cy, view);

glOrtho(x1,x2,y1,y2,z1,z2);
/* Draw the objects onto the screen*/
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//gluLookAt(0.0,0.0,z2+z1, 0.0 , 0.0 ,z1,0.0,1.0,0.0);

if(z1<0 && z2<0)
{
gluLookAt(0.0,0.0,-(z1+z2), 0.0 , 0.0 ,-(z1+z2),0.0,1.0,z1); // I want value to work for this condition.
}
else
{
gluLookAt(0.0,0.0,z1+z2, 0.0 , 0.0 ,z1,0.0,1.0,0.0);
}

//gluLookAt(0.0,0.0,z1+z2, 0.0 , 0.0 ,z1-1,0.0,1.0,0.0);
/* draw only the names in the stack, and fill the array*/
m_pContour->RenderSelection();
/* Do you remeber? We do pushMatrix in PROJECTION mode */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
/* get number of objects drawed in that area and return to render mode */
hits = glRenderMode(GL_RENDER);
glMatrixMode(GL_MODELVIEW);
/*if(hits > 0)
{
int selIndex = buff[3];
return selIndex;
}
return -1;*/

/*
For each hit in the buffer are allocated 4 bytes:
1. Number of hits selected (always one,
beacuse when we draw each object
we use glLoadName, so we replace the
prevous name in the stack)
2. Min Z
3. Max Z
4. Name of the hit (glLoadName)
*/
// return hits;
int SelectedNum = hits;
if(SelectedNum > 0)
{
for(int i = 0;i < SelectedNum; ++i)
{
m_SelectedParticles.push_back(m_aBucket[i * 4 + 3]);
if(TM_SELECT_REGION_DIRECT)
{
m_SelectedParticlesToSeeParticleFlow.insert(m_aBucket[i * 4 + 3]);
}
}
}
if(TM_SELECT_REGION_DIRECT)
{
m_SelectedParticles.clear();
set<int>::iterator it;
for(it= m_SelectedParticlesToSeeParticleFlow.begin(); it!= m_SelectedParticlesToSeeParticleFlow.end(); it++)
{
m_SelectedParticles.push_back(*it);
}
}
glLoadIdentity();
SetupViewingTransform();
Invalidate(false);
}
//************** End Selection in 3D**********************//
bool COpenGLBaseView::CompareFramewithTrackValue(int trackValue,bool checkStepForward)
{
if(checkStepForward)
{
if(trackValue<frameNumber)
{
return true;
}
}
else
{
if(trackValue>initialframeNumber)
{
return true;
}
}

return false;
}

could any one please help.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this