Arpan Man Sainju

Members
  • Content count

    1
  • Joined

  • Last visited

Community Reputation

102 Neutral

About Arpan Man Sainju

  • Rank
    Newbie
  1. Opengl Select Problem

    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.