/*===========================================================================*/ const bool Main::exec( void ) { // GLUT viewer application. kvs::glut::Application app( m_argc, m_argv ); // Parse specified arguments. Isosurface::Argument arg( m_argc, m_argv ); if( !arg.parse() ) return( false ); // Event. kvsview::Isosurface::KeyPressEvent key_press_event; // Create screen. kvs::glut::Screen screen( &app ); screen.addEvent( &key_press_event ); screen.setSize( 512, 512 ); screen.setTitle( kvsview::CommandName + " - " + kvsview::Isosurface::CommandName ); // Check the input point data. m_input_name = arg.value<std::string>(); if ( !(kvsview::FileChecker::ImportableStructuredVolume( m_input_name ) || kvsview::FileChecker::ImportableUnstructuredVolume( m_input_name ) ) ) { kvsMessageError("%s is not volume data.", m_input_name.c_str()); return( false ); } // Visualization pipeline. kvs::VisualizationPipeline pipe( m_input_name ); pipe.import(); // Verbose information. if ( arg.verboseMode() ) { std::cout << "IMPORTED OBJECT" << std::endl; std::cout << kvsview::ObjectInformation( pipe.object() ) << std::endl; std::cout << std::endl; } // Pointer to the volume object data. const kvs::VolumeObjectBase* volume = kvs::VolumeObjectBase::DownCast( pipe.object() ); // Transfer function. const kvs::TransferFunction tfunc = arg.transferFunction( volume ); // Legend bar. kvsview::Widget::LegendBar legend_bar( &screen ); legend_bar.setColorMap( tfunc.colorMap() ); if ( !tfunc.hasRange() ) { const kvs::VolumeObjectBase* object = kvs::VolumeObjectBase::DownCast( pipe.object() ); const kvs::Real32 min_value = static_cast<kvs::Real32>( object->minValue() ); const kvs::Real32 max_value = static_cast<kvs::Real32>( object->maxValue() ); legend_bar.setRange( min_value, max_value ); } legend_bar.show(); // Orientation axis. kvsview::Widget::OrientationAxis orientation_axis( &screen ); orientation_axis.show(); // Set up isosurface class. kvs::PipelineModule mapper( new kvs::Isosurface ); const kvs::Real64 level = arg.isolevel( volume, tfunc ); const kvs::PolygonObject::NormalType normal = arg.normalType(); mapper.get<kvs::Isosurface>()->setIsolevel( level ); mapper.get<kvs::Isosurface>()->setNormalType( normal ); mapper.get<kvs::Isosurface>()->setTransferFunction( tfunc ); pipe.connect( mapper ); // Construct the visualization pipeline. if ( !pipe.exec() ) { kvsMessageError("Cannot execute the visulization pipeline."); return( false ); } screen.registerObject( &pipe ); // Verbose information. if ( arg.verboseMode() ) { std::cout << "RENDERERED OBJECT" << std::endl; std::cout << kvsview::ObjectInformation( pipe.object() ) << std::endl; std::cout << std::endl; std::cout << "VISUALIZATION PIPELINE" << std::endl; std::cout << pipe << std::endl; } // Apply the specified parameters to the global and the visualization pipeline. arg.applyTo( screen, pipe ); arg.applyTo( screen ); // Show the screen and the slider widget. screen.show(); // Slider. kvsview::Isosurface::IsolevelSlider slider( &screen ); slider.setMargin( 10 ); slider.setCaption("Isolevel"); slider.setVolumeObject( volume ); slider.setTransferFunction( tfunc ); slider.setNormal( normal ); slider.setValue( static_cast<float>( level ) ); slider.setRange( static_cast<float>( legend_bar.minValue() ), static_cast<float>( legend_bar.maxValue() ) ); slider.show(); return( arg.clear(), app.run() ); }
/*===========================================================================*/ const bool Main::exec( void ) { // GLUT viewer application. kvs::glut::Application app( m_argc, m_argv ); // Parse specified arguments. kvsview::OrthoSlice::Argument arg( m_argc, m_argv ); if( !arg.parse() ) return( false ); // Create screen. kvs::glut::Screen screen( &app ); screen.setSize( 512, 512 ); screen.setTitle( kvsview::CommandName + " - " + kvsview::OrthoSlice::CommandName ); // Check the input point data. m_input_name = arg.value<std::string>(); if ( !kvsview::FileChecker::ImportableStructuredVolume( m_input_name ) && !kvsview::FileChecker::ImportableUnstructuredVolume( m_input_name ) ) { kvsMessageError("%s is not volume data.", m_input_name.c_str()); return( false ); } // Visualization pipeline. kvs::VisualizationPipeline pipe( m_input_name ); pipe.import(); // Verbose information. if ( arg.verboseMode() ) { std::cout << "IMPORTED OBJECT" << std::endl; std::cout << kvsview::ObjectInformation( pipe.object() ) << std::endl; std::cout << std::endl; } // Pointer to the volume object data. const kvs::VolumeObjectBase* volume = kvs::VolumeObjectBase::DownCast( pipe.object() ); // Transfer function. const kvs::TransferFunction tfunc = arg.transferFunction( volume ); // Legend bar. kvsview::Widget::LegendBar legend_bar( &screen ); legend_bar.setColorMap( tfunc.colorMap() ); if ( !tfunc.hasRange() ) { const kvs::VolumeObjectBase* object = kvs::VolumeObjectBase::DownCast( pipe.object() ); const kvs::Real32 min_value = static_cast<kvs::Real32>( object->minValue() ); const kvs::Real32 max_value = static_cast<kvs::Real32>( object->maxValue() ); legend_bar.setRange( min_value, max_value ); } legend_bar.show(); // Orientation axis. kvsview::Widget::OrientationAxis orientation_axis( &screen ); orientation_axis.show(); // Set up the slice plane class. kvs::PipelineModule mapper( new kvs::OrthoSlice ); const float position = arg.hasOption("p") ? arg.position() : pipe.object()->objectCenter().z(); const kvs::OrthoSlice::AlignedAxis axis( arg.axis() ); mapper.get<kvs::OrthoSlice>()->setPlane( position, axis ); mapper.get<kvs::OrthoSlice>()->setTransferFunction( tfunc ); pipe.connect( mapper ); // Construct the visualization pipeline. if ( !pipe.exec() ) { kvsMessageError("Cannot execute the visulization pipeline."); return( false ); } screen.registerObject( &pipe ); // Disable shading. pipe.renderer()->disableShading(); // Verbose information. if ( arg.verboseMode() ) { std::cout << "RENDERERED OBJECT" << std::endl; std::cout << kvsview::ObjectInformation( pipe.object() ) << std::endl; std::cout << std::endl; std::cout << "VISUALIZATION PIPELINE" << std::endl; std::cout << pipe << std::endl; } // Apply the specified parameters to the global and the visualization pipeline. arg.applyTo( screen, pipe ); arg.applyTo( screen ); // Show the screen. screen.show(); // Create a plane slider. kvsview::OrthoSlice::PlaneSlider slider( &screen ); slider.setMargin( 10 ); slider.setCaption("Slice"); slider.setVolumeObject( volume ); slider.setTransferFunction( tfunc ); slider.setAxis( axis ); slider.setValue( position ); slider.setRange( volume->minObjectCoord()[axis], volume->maxObjectCoord()[axis] ); slider.show(); return( arg.clear(), app.run() ); }
int main( int argc, char** argv ) { kvs::glut::Application app( argc, argv ); Argument arg( app.argc(), app.argv() ); p_arg = &arg; // for empty objects std::vector<kvs::Real32> coords; std::vector<kvs::UInt32> connections; std::vector<kvs::UInt8> colors; std::vector<float> values; std::vector<float> eigenvalues; colors.push_back(255); colors.push_back(255); colors.push_back(255); for ( unsigned int i = 0; i < 3; i++ ) { coords.push_back(0.0); } for ( unsigned int i = 0; i < 2; i ++ ) { connections.push_back(0); values.push_back(0.0); } eigenvalues.push_back(0); // Volume 2 (Displacement) m_volume2 = new kvs::UnstructuredVolumeObject(); m_volume2->setCellType( kvs::UnstructuredVolumeObject::Tetrahedra ); m_volume2->setConnections( kvs::ValueArray<kvs::UInt32>( connections ) ); m_volume2->setCoords( kvs::ValueArray<float>( coords ) ); m_volume2->setValues( kvs::AnyValueArray( values ) ); m_volume2->setNCells(0); m_volume2->setNNodes(0); // polygon (Empty External) #ifdef WIN32 std::string default_polygon( "D:\\Koron\\Dropbox\\Work\\Viz\\Hyperstreamline\\data\\engine\\v6engine_external_face.kvsml" ); #else std::string default_polygon( "../../data/engine/v6engine_external_face.kvsml" ); #endif if ( p_arg->hasOption( "polygon" ) ) { kvs::PolygonObject* import_polygon = new kvs::PolygonImporter( p_arg->optionValue<std::string>("polygon") ); m_polygon = new kvs::PolygonToPolygon( import_polygon ); } else { kvs::PolygonObject* import_polygon = new kvs::PolygonImporter( default_polygon ); m_polygon = new kvs::PolygonToPolygon( import_polygon ); } if ( !m_polygon ) { kvsMessageError( "Cannot create surface." ); exit( EXIT_FAILURE ); } m_polygon->setOpacity( opacity_polygon ); m_polygon->setColor( kvs::RGBColor( 255,255,255 ) ); const kvs::Vector3f min_coord = m_polygon->minExternalCoord(); const kvs::Vector3f max_coord = m_polygon->maxExternalCoord(); xmin = min_coord.x(); ymin = min_coord.y(); zmin = min_coord.z(); xmax = max_coord.x(); ymax = max_coord.y(); zmax = max_coord.z(); resx = 10; resy = 10; resz = 10; m_seed_point = new kvs::CubicPointObject(); m_seed_point->reset_coordinates( resx, resy, resz, xmin, xmax, ymin, ymax, zmin, zmax ); m_seed_point->updateMinMaxCoords(); // streamlines (Empty LineObject) m_streamline = new kvs::HyperStreamline(); m_streamline->setLineType( kvs::LineObject::Polyline ); m_streamline->setColorType( kvs::LineObject::VertexColor ); m_streamline->setCoords( kvs::ValueArray<kvs::Real32>( coords ) ); m_streamline->setConnections( kvs::ValueArray<kvs::UInt32>( connections ) ); m_streamline->setEigenValues( eigenvalues ); m_streamline->setColors( kvs::ValueArray<kvs::UInt8>( colors ) ); m_streamline->setSize( 1.0f ); // main screen kvs::glut::Screen main_screen( &app ); p_main_screen = &main_screen; //main_screen.background()->setColor( kvs::RGBAColor( 0, 0, 0, 1 ) ); int interval = 30; kvs::glut::Timer timer( interval ); TimerEvent timer_event; KeyPressEvent keypress_event; main_screen.addTimerEvent( &timer_event, &timer ); main_screen.addKeyPressEvent( &keypress_event ); main_screen.show(); // renderer #ifdef USE_KVS m_compositor = new kvs::glew::StochasticRenderingCompositor( &main_screen ); m_compositor->enableLODControl(); m_tfunc.adjustRange( m_volume2 ); m_tfunc.setColorMap( kvs::RGBFormulae::AFMHot(256) ); m_volume_renderer = new kvs::glew::StochasticTetrahedraEngine(); m_volume_renderer->setTransferFunction( m_tfunc ); m_volume_renderer->setShader( kvs::Shader::BlinnPhong() ); m_volume_renderer->disableShading(); m_volume_renderer->setEdgeSize( 2 ); m_polygon_renderer = new kvs::glew::StochasticPolygonEngine(); m_polygon_renderer->setShader( kvs::Shader::BlinnPhong() ); m_point_renderer = new kvs::glew::StochasticPointEngine(); m_point_renderer->disableShading(); m_line_renderer = new kvs::glew::StochasticLineEngine(); m_line_renderer->setShader( kvs::Shader::BlinnPhong() ); m_line_renderer->setOpacity( opacity_line ); m_compositor->registerObject( m_volume2, m_volume_renderer ); m_compositor->registerObject( m_polygon, m_polygon_renderer ); m_compositor->registerObject( m_seed_point, m_point_renderer ); m_compositor->registerObject( m_streamline, m_line_renderer ); #else m_renderer = new kvs::glew::StochasticRenderer( 1 ); m_renderer->enableLODControl(); m_tfunc.adjustRange( m_volume2 ); m_tfunc.setColorMap( kvs::RGBFormulae::AFMHot(256) ); m_volume_renderer = new kvs::glew::StochasticVolumeRenderer( m_volume2 ); m_volume_renderer->setTransferFunction( m_tfunc ); m_volume_renderer->setShader( kvs::Shader::BlinnPhong() ); m_volume_renderer->disableShading(); m_volume_renderer->setEdgeSize( 2 ); m_renderer->registerRenderer( m_volume_renderer ); m_polygon_renderer = new kvs::glew::StochasticPolygonRenderer( m_polygon ); m_polygon_renderer->setShader( kvs::Shader::BlinnPhong() ); m_renderer->registerRenderer( m_polygon_renderer ); m_point_renderer = new kvs::glew::StochasticPointRenderer( m_seed_point ); m_point_renderer->disableShading(); m_renderer->registerRenderer( m_point_renderer ); m_line_renderer = new kvs::glew::StochasticLineRenderer( m_streamline ); m_line_renderer->setShader( kvs::Shader::BlinnPhong() ); m_line_renderer->setOpacity( opacity_line ); m_renderer->registerRenderer( m_line_renderer ); null = new::kvs::NullObject( m_seed_point ); null->setName( "null" ); main_screen.registerObject( null, m_renderer ); main_screen.show(); #endif // tfunc editor //TransferFunctionEditor editor( &main_screen, m_renderer, m_volume_renderer ); //editor.setVolumeObject( m_volume2 ); //editor.show(); //kvs::ControlScreen control_screen( &app ); MouseMoveEvent mouse_move_event; kvs::glut::Screen control_screen( &app ); //control_screen.addMouseMoveEvent( &mouse_move_event ); control_screen.setMouseMoveEvent( &mouse_move_event ); control_screen.setTitle( "kvs::ControlScreen" ); control_screen.setGeometry( 512, 0, 600, 560 ); #ifdef USE_KVS //control_screen.attachMainScreen( p_main_screen, m_seed_point, m_compositor, m_point_renderer ); #else //control_screen.attachMainScreen( p_main_screen, m_seed_point, m_renderer, m_point_renderer ); #endif control_screen.show(); PaintEvent paint_event; control_screen.addPaintEvent( &paint_event ); const int width = control_screen.width(); const int height = control_screen.height(); const int ui_width = 240; PB_INFO pb_info( &control_screen ); p_pb_info = &pb_info; pb_info.setX( width/6 ); pb_info.setY( height - 40 ); pb_info.setWidth( 400 ); pb_info.setMargin( 5 ); pb_info.setTextMargin( 5 ); pb_info.setCaption(""); //pb_info.deactivate(); pb_info.show(); PB00 pb00( &control_screen ); p_pb00 = &pb00; pb00.setX( width - ui_width ); pb00.setY( 10 ); pb00.setWidth( 220 ); pb00.setMargin( 5 ); pb00.setTextMargin( 5 ); pb00.setCaption("Read volume1(Stress)"); pb00.show(); PB01 pb01( &control_screen ); p_pb01 = &pb01; pb01.setX( pb00.x() ); pb01.setY( pb00.y() + pb00.height() ); pb01.setWidth( 220 ); pb01.setMargin( 5 ); pb01.setTextMargin( 5 ); pb01.setCaption("Read volume2(Displacement)"); pb01.deactivate(); pb01.show(); PB02 pb02( &control_screen ); p_pb02 = &pb02; pb02.setX( pb01.x() ); pb02.setY( pb01.y() + pb01.height() ); pb02.setWidth( 220 ); pb02.setMargin( 5 ); pb02.setTextMargin( 5 ); pb02.setCaption("Hide Polygon"); //pb02.deactivate(); pb02.show(); PB03 pb03( &control_screen ); p_pb03 = &pb03; pb03.setX( pb02.x() ); pb03.setY( pb02.y() + pb02.height() ); pb03.setWidth( 220 ); pb03.setMargin( 5 ); pb03.setTextMargin( 5 ); pb03.setCaption("Read CellTree(Optional)"); //pb03.deactivate(); pb03.show(); SLD0 sld0( &control_screen ); p_sld0 = &sld0; sld0.setX( pb03.x() ); sld0.setY( pb03.y() + pb03.height() ); sld0.setWidth( 220 ); sld0.setMargin( 0 ); sld0.setCaption("dx"); //sld0.deactivate(); sld0.show(); SLD1 sld1( &control_screen ); p_sld1 = &sld1; sld1.setX( sld0.x() ); sld1.setY( sld0.y() + sld0.height() ); sld1.setWidth( 220 ); sld1.setMargin( 0 ); sld1.setCaption("dy"); //sld1.deactivate(); sld1.show(); SLD2 sld2( &control_screen ); p_sld2 = &sld2; sld2.setX( sld1.x() ); sld2.setY( sld1.y() + sld1.height() ); sld2.setWidth( 220 ); sld2.setMargin( 0 ); sld2.setCaption("dz"); //sld2.deactivate(); sld2.show(); SLD3 sld3( &control_screen ); p_sld3 = &sld3; sld3.setX( sld2.x() ); sld3.setY( sld2.y() + sld2.height() ); sld3.setWidth( 220 ); sld3.setMargin( 0 ); sld3.setCaption("resx"); //sld3.deactivate(); sld3.show(); SLD4 sld4( &control_screen ); p_sld4 = &sld4; sld4.setX( sld3.x() ); sld4.setY( sld3.y() + sld3.height() ); sld4.setWidth( 220 ); sld4.setMargin( 0 ); sld4.setCaption("resy"); //sld4.deactivate(); sld4.show(); SLD5 sld5( &control_screen ); p_sld5 = &sld5; sld5.setX( sld4.x() ); sld5.setY( sld4.y() + sld4.height() ); sld5.setWidth( 220 ); sld5.setMargin( 0 ); sld5.setCaption("resz"); //sld5.deactivate(); sld5.show(); PB04 pb04( &control_screen ); p_pb04 = &pb04; pb04.setX( sld5.x() ); pb04.setY( sld5.y() + sld5.height() ); pb04.setWidth( 220 ); pb04.setMargin( 15 ); pb04.setTextMargin( 5 ); pb04.setCaption("Update Streamline"); //pb04.deactivate(); pb04.show(); PB05 pb05( &control_screen ); p_pb05 = &pb05; pb05.setX( 10 ); pb05.setY( pb04.y() + 10 ); pb05.setWidth( 120 ); pb05.setMargin( 5 ); pb05.setTextMargin( 5 ); pb05.setCaption("Buffer Line"); //pb04.deactivate(); pb05.show(); PB06 pb06( &control_screen ); p_pb06 = &pb06; pb06.setX( pb05.x() + pb05.width() ); pb06.setY( pb05.y() ); pb06.setWidth( 80 ); pb06.setMargin( 5 ); pb06.setTextMargin( 5 ); pb06.setCaption("Clear"); //pb04.deactivate(); pb06.show(); PB07 pb07( &control_screen ); p_pb07 = &pb07; pb07.setX( pb06.x() + pb06.width() ); pb07.setY( pb06.y() ); pb07.setWidth( 160 ); pb07.setMargin( 5 ); pb07.setTextMargin( 5 ); pb07.setCaption("Save CellTree.dat"); //pb04.deactivate(); pb07.show(); RB00 rb00( &control_screen ); rb00.setX( pb05.x() ); rb00.setY( pb05.y() - pb05.height() ); rb00.setWidth( 100 ); rb00.setMargin( 15 ); rb00.setCaption( "Principal" ); rb00.setState( "true" ); RB01 rb01( &control_screen ); rb01.setX( rb00.x() + rb00.width() ); rb01.setY( rb00.y() ); rb01.setWidth( 130 ); rb01.setMargin( 15 ); rb01.setCaption( "Intermediate" ); RB02 rb02( &control_screen ); rb02.setX( rb01.x() + rb01.width() ); rb02.setY( rb01.y() ); rb02.setWidth( 100 ); rb02.setMargin( 15 ); rb02.setCaption( "Minor" ); kvs::glut::RadioButtonGroup rbg0( &control_screen ); rbg0.add( &rb00 ); rbg0.add( &rb01 ); rbg0.add( &rb02 ); rbg0.show(); CB00 cb00( &control_screen ); cb00.setX( rb00.x() + rb00.width() ); cb00.setY( rb00.y() - rb00.height() ); cb00.setWidth( 100 ); cb00.setMargin( 25 ); cb00.setCaption( "Cache" ); cb00.setState( true ); cb00.show(); kvs::ColorMap cmap; cmap.setRange( -127, 127 ); cmap.create(); kvs::glut::LegendBar legend_bar( &main_screen ); legend_bar.setColorMap( cmap ); legend_bar.show(); return( app.run() ); }