The clipping you are seeing is probably due to osg's computation of the near and far clipping planes. You'll need to implement computeBound so osg knows about your object. Have a look in ShapeDrawable.cpp
2009/8/10 Andrew Thompson <andyb1...@yahoo.co.uk>: > Hi Chris, > > Thanks for the heads up, I was digging around and found the > drawImplementation method in Drawable myself so decided to give it a go. > However I've had less than spectacular results! > > My first test was to take the code from ShapeDrawable that draws a box. Here > it is for completeness sake > > > Code: > > > void drawImplementation(osg::RenderInfo & renderInfo) const > { > // evaluate hints > bool createBody = true; > bool createTop = true; > bool createBottom = true; > > float dx = 3; > float dy = 3; > float dz = 3; > > glColor3ub(60,60,60); > glPushMatrix(); > > glTranslatef(10,10,10); > > glBegin(GL_QUADS); > > if (createBody) { > // -ve y plane > glNormal3f(0.0f,-1.0f,0.0f); > > glTexCoord2f(0.0f,1.0f); > glVertex3f(-dx,-dy,dz); > > glTexCoord2f(0.0f,0.0f); > glVertex3f(-dx,-dy,-dz); > > glTexCoord2f(1.0f,0.0f); > glVertex3f(dx,-dy,-dz); > > glTexCoord2f(1.0f,1.0f); > glVertex3f(dx,-dy,dz); > > // +ve y plane > glNormal3f(0.0f,1.0f,0.0f); > > glTexCoord2f(0.0f,1.0f); > glVertex3f(dx,dy,dz); > > glTexCoord2f(0.0f,0.0f); > glVertex3f(dx,dy,-dz); > > glTexCoord2f(1.0f,0.0f); > glVertex3f(-dx,dy,-dz); > > glTexCoord2f(1.0f,1.0f); > glVertex3f(-dx,dy,dz); > > // +ve x plane > glNormal3f(1.0f,0.0f,0.0f); > > glTexCoord2f(0.0f,1.0f); > glVertex3f(dx,-dy,dz); > > glTexCoord2f(0.0f,0.0f); > glVertex3f(dx,-dy,-dz); > > glTexCoord2f(1.0f,0.0f); > glVertex3f(dx,dy,-dz); > > glTexCoord2f(1.0f,1.0f); > glVertex3f(dx,dy,dz); > > // -ve x plane > glNormal3f(-1.0f,0.0f,0.0f); > > glTexCoord2f(0.0f,1.0f); > glVertex3f(-dx,dy,dz); > > glTexCoord2f(0.0f,0.0f); > glVertex3f(-dx,dy,-dz); > > glTexCoord2f(1.0f,0.0f); > glVertex3f(-dx,-dy,-dz); > > glTexCoord2f(1.0f,1.0f); > glVertex3f(-dx,-dy,dz); > } > > if (createTop) { > // +ve z plane > glNormal3f(0.0f,0.0f,1.0f); > > glTexCoord2f(0.0f,1.0f); > glVertex3f(-dx,dy,dz); > > glTexCoord2f(0.0f,0.0f); > glVertex3f(-dx,-dy,dz); > > glTexCoord2f(1.0f,0.0f); > glVertex3f(dx,-dy,dz); > > glTexCoord2f(1.0f,1.0f); > glVertex3f(dx,dy,dz); > } > > if (createBottom) { > // -ve z plane > glNormal3f(0.0f,0.0f,-1.0f); > > glTexCoord2f(0.0f,1.0f); > glVertex3f(dx,dy,-dz); > > glTexCoord2f(0.0f,0.0f); > glVertex3f(dx,-dy,-dz); > > glTexCoord2f(1.0f,0.0f); > glVertex3f(-dx,-dy,-dz); > > glTexCoord2f(1.0f,1.0f); > glVertex3f(-dx,dy,-dz); > } > > glEnd(); > glPopMatrix(); > } > > > > > > This results in a gray box drawn at the location 10,10,10 of size 3,3,3. > > [Image: http://i137.photobucket.com/albums/q217/andyb1979/drawImpBefore.png ] > > However, if I add other objects to my scene, then the box renders incorrectly. > > [Image: http://i137.photobucket.com/albums/q217/andyb1979/drawImpAfter.png ] > > At this point the subgraph looks like this, the additional objects from the > position attitude transforms (labelled PAT) onwards are added when the cones > are in the scene. > > [Image: http://i137.photobucket.com/albums/q217/andyb1979/Subgraph.png ] > > Another example, what I actually want to do is draw a subdividing grid that > extends to the horizon. The code for this (at present) is included below > > > Code: > > void drawImplementation(osg::RenderInfo & renderInfo) const > { > currentState->applyMode(GL_LIGHTING, false); > glColor3ub(60,60,60); > > //render floor grid > glLineWidth(1.0f); > glBegin(GL_LINES); > > // Compute the Z location of the grid > int zg = (int)0; > int ystep = 100; > int xstep = 100; > > // Compute the Y-Step depending on the current zoom factor > if(m_zoom < 1.5) > ystep = xstep = 10; > if(m_zoom < 0.8) > ystep = xstep = 5; > if(m_zoom < 0.4) > ystep = xstep = 2; > if(m_zoom < 0.2) > ystep = xstep = 1; > > // Compute the min/max X and Y values for each line > float miny = (m_posY-(m_vHeight/2*m_zoom)); > float maxy = (m_posY+(m_vHeight/2*m_zoom)); > float minx = (m_posX-(m_vWidth/2*m_zoom)); > float maxx = (m_posX+(m_vWidth/2*m_zoom)); > > // Draw lines in the Y direction > for(int yg = (int)(miny - ((int)miny%ystep)); yg <= (int)(maxy - > ((int)maxy%ystep)); yg+=ystep){ > glColor3ub(60,60,60); > if(yg%10 == 0){ > glEnd(); > glColor3ub(100,100,100); > glLineWidth(2.0f); > glBegin(GL_LINES); > } > if(yg%100 == 0) > glColor3ub(180,180,180); > glVertex3f(minx, (GLfloat)yg, (GLfloat)zg); > glVertex3f(maxx, (GLfloat)yg, (GLfloat)zg); > if(yg%10 == 0){ > glEnd(); > glLineWidth(1.0f); > glBegin(GL_LINES); > } > } > > // Draw lines in the X direction > for(int xg = (int)(minx - ((int)minx%xstep)); xg <= (int)(maxx - > ((int)maxx%xstep)); xg+=xstep){ > glColor3ub(60,60,60); > if(xg%10 == 0){ > glEnd(); > glColor3ub(100,100,100); > glLineWidth(2.0f); > glBegin(GL_LINES); > } > if(xg%100 == 0) > glColor3ub(180,180,180); > glVertex3f((GLfloat)xg, miny, (GLfloat)zg); > glVertex3f((GLfloat)xg, maxy, (GLfloat)zg); > if(xg%10 == 0){ > glEnd(); > glLineWidth(1.0f); > glBegin(GL_LINES); > } > } > > glEnd(); > > // Re-enable lightning > currentState->applyMode(GL_LIGHTING, true); > } > > > > > The subgrpah is the same as above, and the result with and without external > objects is this > > [Image: http://i137.photobucket.com/albums/q217/andyb1979/drawImpBefore2.png ] > > [Image: http://i137.photobucket.com/albums/q217/andyb1979/drawImpAfter2.png ] > > Does anyone know what I'm doing wrong in my drawImplementation code? > > Thank you for your time, > Andrew > > ------------------ > Read this topic online here: > http://forum.openscenegraph.org/viewtopic.php?p=16032#16032 > > > > > > _______________________________________________ > osg-users mailing list > osg-users@lists.openscenegraph.org > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org > -- http://www.ssTk.co.uk _______________________________________________ osg-users mailing list osg-users@lists.openscenegraph.org http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org