void apiSimpleShapeUI::drawVertices( const MDrawRequest & request, M3dView & view ) const // // Description: // // Component (vertex) drawing routine // // Arguments: // // request - request to be drawn // view - view to draw into // { MDrawData data = request.drawData(); MVectorArray * geom = (MVectorArray*)data.geometry(); view.beginGL(); // Query current state so it can be restored // bool lightingWasOn = glIsEnabled( GL_LIGHTING ) ? true : false; if ( lightingWasOn ) { glDisable( GL_LIGHTING ); } float lastPointSize; glGetFloatv( GL_POINT_SIZE, &lastPointSize ); // Set the point size of the vertices // glPointSize( POINT_SIZE ); // If there is a component specified by the draw request // then loop over comp (using an MFnComponent class) and draw the // active vertices, otherwise draw all vertices. // MObject comp = request.component(); if ( ! comp.isNull() ) { MFnSingleIndexedComponent fnComponent( comp ); for ( int i=0; i<fnComponent.elementCount(); i++ ) { int index = fnComponent.element( i ); glBegin( GL_POINTS ); MVector& point = (*geom)[index]; glVertex3f( (float)point[0], (float)point[1], (float)point[2] ); glEnd(); char annotation[32]; sprintf( annotation, "%d", index ); view.drawText( annotation, point ); } } else { for ( unsigned int i=0; i<geom->length(); i++ ) { glBegin( GL_POINTS ); MVector point = (*geom)[ i ]; glVertex3f( (float)point[0], (float)point[1], (float)point[2] ); glEnd(); } } // Restore the state // if ( lightingWasOn ) { glEnable( GL_LIGHTING ); } glPointSize( lastPointSize ); view.endGL(); }
void ProceduralHolderUI::draw( const MDrawRequest &request, M3dView &view ) const { MStatus s; MDrawData drawData = request.drawData(); ProceduralHolder *proceduralHolder = (ProceduralHolder *)drawData.geometry(); assert( proceduralHolder ); view.beginGL(); LightingState lightingState; bool restoreLightState = cleanupLights( request, view, &lightingState ); // maya can sometimes leave an error from it's own code, // and we don't want that to confuse us in our drawing code. while( glGetError()!=GL_NO_ERROR ) { } try { // draw the bound if asked if( request.token()==BoundDrawMode ) { IECoreGL::BoxPrimitive::renderWireframe( IECore::convert<Imath::Box3f>( proceduralHolder->boundingBox() ) ); } // draw the scene if asked if( request.token()==SceneDrawMode ) { resetHilites(); IECoreGL::ConstScenePtr scene = proceduralHolder->scene(); if( scene ) { IECoreGL::State *displayState = m_displayStyle.baseState( (M3dView::DisplayStyle)request.displayStyle() ); if ( request.component() != MObject::kNullObj ) { MDoubleArray col; s = MGlobal::executeCommand( "colorIndex -q 21", col ); assert( s ); IECoreGL::WireframeColorStateComponentPtr hilite = new IECoreGL::WireframeColorStateComponent( Imath::Color4f( col[0], col[1], col[2], 1.0f ) ); MFnSingleIndexedComponent fnComp( request.component(), &s ); assert( s ); int len = fnComp.elementCount( &s ); assert( s ); for ( int j = 0; j < len; j++ ) { int compId = fnComp.element(j); assert( proceduralHolder->m_componentToGroupMap.find( compId ) != proceduralHolder->m_componentToGroupMap.end() ); hiliteGroups( proceduralHolder->m_componentToGroupMap[compId], hilite, const_cast<IECoreGL::WireframeColorStateComponent *>( displayState->get< IECoreGL::WireframeColorStateComponent >() ) ); } } scene->render( displayState ); } } } catch( const IECoreGL::Exception &e ) { // much better to catch and report this than to let the application die IECore::msg( IECore::Msg::Error, "ProceduralHolderUI::draw", boost::format( "IECoreGL Exception : %s" ) % e.what() ); } if( restoreLightState ) { restoreLights( &lightingState ); } view.endGL(); }
void SceneShapeUI::draw( const MDrawRequest &request, M3dView &view ) const { MStatus s; MDrawData drawData = request.drawData(); SceneShape *sceneShape = (SceneShape *)drawData.geometry(); assert( sceneShape ); view.beginGL(); M3dView::LightingMode lightingMode; view.getLightingMode( lightingMode ); LightingState lightingState; bool restoreLightState = cleanupLights( request, view, &lightingState ); // maya can sometimes leave an error from it's own code, // and we don't want that to confuse us in our drawing code. while( glGetError()!=GL_NO_ERROR ) { } try { // draw the bound if asked if( request.token()==BoundDrawMode ) { IECoreGL::BoxPrimitive::renderWireframe( IECore::convert<Imath::Box3f>( sceneShape->boundingBox() ) ); } // draw the scene if asked if( request.token()==SceneDrawMode ) { resetHilites(); IECoreGL::ConstScenePtr scene = sceneShape->glScene(); if( scene ) { IECoreGL::State *displayState = m_displayStyle.baseState( (M3dView::DisplayStyle)request.displayStyle(), lightingMode ); if ( request.component() != MObject::kNullObj ) { MDoubleArray col; s = MGlobal::executeCommand( "colorIndex -q 21", col ); assert( s ); IECoreGL::WireframeColorStateComponentPtr hilite = new IECoreGL::WireframeColorStateComponent( Imath::Color4f( col[0], col[1], col[2], 1.0f ) ); MFnSingleIndexedComponent fnComp( request.component(), &s ); assert( s ); int len = fnComp.elementCount( &s ); assert( s ); std::vector<IECore::InternedString> groupNames; for ( int j = 0; j < len; j++ ) { int index = fnComp.element(j); groupNames.push_back( sceneShape->selectionName( index ) ); } // Sort by name to make sure we don't unhilite selected items that are further down the hierarchy std::sort( groupNames.begin(), groupNames.end() ); for ( std::vector<IECore::InternedString>::iterator it = groupNames.begin(); it!= groupNames.end(); ++it) { IECoreGL::GroupPtr group = sceneShape->glGroup( *it ); hiliteGroups( group, hilite, const_cast<IECoreGL::WireframeColorStateComponent *>( displayState->get< IECoreGL::WireframeColorStateComponent >() ) ); } } scene->render( displayState ); } } } catch( const IECoreGL::Exception &e ) { // much better to catch and report this than to let the application die IECore::msg( IECore::Msg::Error, "SceneShapeUI::draw", boost::format( "IECoreGL Exception : %s" ) % e.what() ); } if( restoreLightState ) { restoreLights( &lightingState ); } view.endGL(); }