Octree(const Iter& begin, const Iter& end, unsigned int min) : m_minObjects(min) { WorldPoint p0, p1; CalculateExtents(begin, end, p0, p1); m_p0 = p0; m_p1 = p1; for(Iter iter = begin; iter != end; ++iter) { m_objects.push_back(*iter); } PopulateSubTrees(); }
void CMFCTessView::OnDraw(CDC* pDC) { CMFCTessDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here //some per-drawing init stuff glLoadIdentity(); //setup drawing dimensions, etc CPoint vptorg = m_pDC->GetViewportOrg() ; //note m_pDC, NOT pDC CRect rect ; GetWindowRect( &rect ) ; int dx = rect.Width() ; int dy = rect.Height() ; glViewport( 0, 0, dx, dy ); glMatrixMode( GL_MODELVIEW ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // create bitmaps for the device context font's first 256 glyphs HDC hdc = m_pDC->GetSafeHdc() ; wglUseFontBitmaps(hdc, 0, 256, 1000); glListBase(1000); float R ; if( pDoc->m_ContourList.GetCount() > 0 ) { CalculateExtents() ; // Collect overall figure extents (in meters) R = Radius ; //11/29/03 experiment to eliminate probs w/non-square windows float glleft = -R ; float gltop = +R ; float nearplane = -R ; //rev 07/25/03 float farplane = R ; //rev 07/25/03 float glleft2 = glleft ; float gltop2 = gltop ; float glright2 = ( glleft + 2*R ) ; float glbottom2 = ( gltop - 2*R ) ; //adjust for non-square viewing window float dxdy = (float)dx/(float)dy ; //=1.00 for square window if( dxdy > 1 ) { glOrtho( glleft2*dxdy , glright2*dxdy, glbottom2, gltop2, nearplane, farplane ) ; } else { glOrtho( glleft2 , glright2, glbottom2/dxdy, gltop2/dxdy, nearplane, farplane ) ; } glTranslatef( -m_Center.x, -m_Center.y, -m_Center.z ) ; } else { CString txtstr ; glOrtho( -1.f , 1.f, -1.f, 1.f, -1.f, 1.f ) ; glTranslatef( 0.f, 0.f, 0.f ) ; txtstr = "Nothing to draw" ; glColor3f( 0.f, 0.f, 0.f ) ; glRasterPos3f(0.0F, 0.0F, 0.0F ); glCallLists(txtstr.GetLength(), GL_UNSIGNED_BYTE, txtstr); //clean up & exit glFlush(); glDeleteLists(1000, 256) ; SwapBuffers( m_pDC->GetSafeHdc() ); return ; } glPushMatrix() ; //01/09/05 implement tessellation GLUtesselator *tobj; tobj = gluNewTess(); //added 02/09/05 as part of mem leak fix while( gm_VertexPtrList.GetCount() > 0 ) { GLdouble* pV = (GLdouble*)gm_VertexPtrList.RemoveHead() ; delete[] pV ; pV = NULL ; } gluTessCallback(tobj, GLU_TESS_BEGIN, (void (CALLBACK *) ())beginCallback); gluTessCallback(tobj, GLU_TESS_VERTEX, (void (CALLBACK *) ()) vertexCallback); gluTessCallback(tobj, GLU_TESS_END, (void (CALLBACK *) ())endCallback); gluTessCallback(tobj, GLU_TESS_ERROR,(void (CALLBACK *) ())errorCallback); gluTessCallback(tobj, GLU_TESS_COMBINE, (void (CALLBACK *) ())combineCallback); glShadeModel(GL_SMOOTH); gluTessProperty(tobj, GLU_TESS_WINDING_RULE, m_WindingRule ); //only one polygon, but multiple contours gluTessBeginPolygon(tobj, NULL); POSITION pos = pDoc->m_ContourList.GetHeadPosition() ; while ( pos ) { CContour* pCtr = (CContour*)pDoc->m_ContourList.GetNext( pos ) ; ASSERT( pCtr != NULL && pCtr->m_NumVertex > 0 && pCtr->m_ppVertexArray != NULL ) ; int numcorners = pCtr->m_NumVertex ; gluTessBeginContour(tobj); for( int cnridx = 0; cnridx < numcorners; cnridx++ ) { GLdouble* glvert = pCtr->m_ppVertexArray[cnridx]; gluTessVertex( tobj, glvert, glvert ) ; TRACE( "Draw: Sent vertex(%f,%f,%f,%f,%f,%f)\n", glvert[0],glvert[1],glvert[2],glvert[3],glvert[4],glvert[5] ) ; } gluTessEndContour(tobj); } //end of all contour definitions gluTessEndPolygon(tobj); //clean up & exit glFlush(); glDeleteLists(1000, 256) ; // delete our 256 glyph display lists SwapBuffers( m_pDC->GetSafeHdc() ); gluDeleteTess( tobj ) ; //added 02/09/05 as part of mem leak fix while( gm_VertexPtrList.GetCount() > 0 ) { GLdouble* pV = (GLdouble*)gm_VertexPtrList.RemoveHead() ; delete[] pV ; pV = NULL ; } }