Changeset 313
- Timestamp:
- Sep 4, 2011, 11:24:46 AM (13 years ago)
- Location:
- experimental/distortionNG
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
experimental/distortionNG/distortionNG.cpp
r310 r313 1 1 #include "distortionNG.h" 2 2 3 #include<osg/Texture2D>4 3 #include<osg/Point> 5 #include<osg/ComputeBoundsVisitor> 4 6 5 7 6 #include<osgViewer/Viewer> 8 9 #include<osgDB/ReadFile>10 11 #include <osgUtil/SmoothingVisitor>12 7 13 8 … … 21 16 } 22 17 23 osg::Geometry* distortionNG::createMesh( unsigned int column, unsigned int row )24 {25 osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(column * row);26 osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array(column * row);27 for ( unsigned int i=0; i<row; ++i )28 {29 for ( unsigned int j=0; j<column; ++j )30 {31 (*vertices)[i*column + j].set( (float)i, (float)j, 0.0f );32 (*texcoords)[i*column + j].set( (float)i/(float)row, (float)j/(float)column );33 }34 }35 18 36 osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;37 geom->setUseDisplayList( false );38 geom->setUseVertexBufferObjects( true );39 geom->setVertexArray( vertices.get() );40 geom->setTexCoordArray( 0, texcoords.get() );41 for ( unsigned int i=0; i<row-1; ++i )42 {43 osg::ref_ptr<osg::DrawElementsUInt> de = new osg::DrawElementsUInt(GL_QUAD_STRIP, column*2);44 for ( unsigned int j=0; j<column; ++j )45 {46 (*de)[j*2 + 0] = i*column + j;47 (*de)[j*2 + 1] = (i+1)*column + j;48 }49 geom->addPrimitiveSet( de.get() );50 }51 52 53 54 osg::ComputeBoundsVisitor cbv;55 cbv.applyDrawable(geom);56 osg::BoundingBox box = cbv.getBoundingBox();57 if (!box.valid())58 std::cout << "Invalid bounding box!";59 geom->setInitialBound(box);60 61 osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;62 texture->setImage( osgDB::readImageFile("Images/osg256.png") );63 texture->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR_MIPMAP_LINEAR );64 texture->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR_MIPMAP_LINEAR );65 geom->getOrCreateStateSet()->setTextureAttributeAndModes( 0, texture.get() );66 67 // Create normals68 osgUtil::SmoothingVisitor::smooth( *geom );69 70 return geom.release();71 }72 19 73 20 osg::Geode* distortionHandler::createVertexHighlighter() -
experimental/distortionNG/distortionNG.h
r310 r313 38 38 distortionNG(); 39 39 virtual ~distortionNG(); 40 41 static osg::Geometry* createMesh(unsigned int column, unsigned int row);42 40 }; -
experimental/distortionNG/extViewer.cpp
r311 r313 1 1 #include "extViewer.h" 2 2 3 #include<osg/Texture2D> 4 #include<osg/TextureRectangle> 5 #include<osg/TexMat> 6 #include<osg/ComputeBoundsVisitor> 7 8 #include<osgDB/ReadFile> 9 10 #include <osgUtil/SmoothingVisitor> 11 3 12 extViewer::extViewer() : Viewer() 4 13 { … … 21 30 } 22 31 23 void extViewer::setUpViewForDistortion() 24 { 25 OSG_INFO<<"View::setUpViewForDistortion"<<std::endl; 32 void extViewer::setUpViewForManualDistortion(osg::Image* intensityMap, unsigned int screenNum) 33 { 34 OSG_INFO<<"View::setUpViewForManualDistortion(sn="<<screenNum<<", im="<<intensityMap<<")"<<std::endl; 35 26 36 osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface(); 27 37 if (!wsi) … … 31 41 } 32 42 33 43 osg::GraphicsContext::ScreenIdentifier si; 34 44 si.readDISPLAY(); 35 45 … … 42 52 wsi->getScreenResolution(si, width, height); 43 53 44 45 54 osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; 46 55 traits->hostName = si.hostName; … … 55 64 traits->sharedContext = 0; 56 65 57 58 osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); 66 bool applyIntensityMapAsColours = true; 67 68 osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); 59 69 if (!gc) 60 70 { … … 62 72 return; 63 73 } 64 } 74 75 int tex_width = width; 76 int tex_height = height; 77 78 int camera_width = tex_width; 79 int camera_height = tex_height; 80 81 osg::TextureRectangle* texture = new osg::TextureRectangle; 82 83 texture->setTextureSize(tex_width, tex_height); 84 texture->setInternalFormat(GL_RGB); 85 texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR); 86 texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR); 87 texture->setWrap(osg::Texture::WRAP_S,osg::Texture::CLAMP_TO_EDGE); 88 texture->setWrap(osg::Texture::WRAP_T,osg::Texture::CLAMP_TO_EDGE); 89 90 91 #if 0 92 osg::Camera::RenderTargetImplementation renderTargetImplementation = osg::Camera::SEPERATE_WINDOW; 93 GLenum buffer = GL_FRONT; 94 #else 95 osg::Camera::RenderTargetImplementation renderTargetImplementation = osg::Camera::FRAME_BUFFER_OBJECT; 96 GLenum buffer = GL_FRONT; 97 #endif 98 99 // Scene camera 100 { 101 osg::ref_ptr<osg::Camera> camera = new osg::Camera; 102 camera->setName("Scene camera"); 103 camera->setGraphicsContext(gc.get()); 104 camera->setViewport(new osg::Viewport(0,0,camera_width, camera_height)); 105 camera->setDrawBuffer(buffer); 106 camera->setReadBuffer(buffer); 107 camera->setAllowEventFocus(false); 108 // tell the camera to use OpenGL frame buffer object where supported. 109 camera->setRenderTargetImplementation(renderTargetImplementation); 110 111 // attach the texture and use it as the color buffer. 112 camera->attach(osg::Camera::COLOR_BUFFER, texture); 113 114 addSlave(camera.get(), osg::Matrixd(), osg::Matrixd()); 115 } 116 117 // distortion correction set up. 118 { 119 osg::Geode* geode = new osg::Geode(); 120 //geode->addDrawable(createParoramicSphericalDisplayDistortionMesh(osg::Vec3(0.0f,0.0f,0.0f), osg::Vec3(width,0.0f,0.0f), osg::Vec3(0.0f,height,0.0f), radius, collar, applyIntensityMapAsColours ? intensityMap : 0, projectorMatrix)); 121 geode->addDrawable(createMesh(16, 19)); 122 123 // new we need to add the texture to the mesh, we do so by creating a 124 // StateSet to contain the Texture StateAttribute. 125 osg::StateSet* stateset = geode->getOrCreateStateSet(); 126 stateset->setTextureAttributeAndModes(0, texture,osg::StateAttribute::ON); 127 stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF); 128 129 osg::TexMat* texmat = new osg::TexMat; 130 texmat->setScaleByTextureRectangleSize(true); 131 stateset->setTextureAttributeAndModes(0, texmat, osg::StateAttribute::ON); 132 133 if (!applyIntensityMapAsColours && intensityMap) 134 { 135 stateset->setTextureAttributeAndModes(1, new osg::Texture2D(intensityMap), osg::StateAttribute::ON); 136 } 137 138 osg::ref_ptr<osg::Camera> camera = new osg::Camera; 139 camera->setGraphicsContext(gc.get()); 140 camera->setClearMask(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); 141 camera->setClearColor( osg::Vec4(0.0,0.0,0.0,1.0) ); 142 camera->setViewport(new osg::Viewport(0, 0, width, height)); 143 GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT; 144 camera->setDrawBuffer(buffer); 145 camera->setReadBuffer(buffer); 146 camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); 147 camera->setAllowEventFocus(false); 148 camera->setInheritanceMask(camera->getInheritanceMask() & ~osg::CullSettings::CLEAR_COLOR & ~osg::CullSettings::COMPUTE_NEAR_FAR_MODE); 149 //camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR); 150 151 camera->setProjectionMatrixAsOrtho2D(0,width,0,height); 152 camera->setViewMatrix(osg::Matrix::identity()); 153 154 // add subgraph to render 155 camera->addChild(geode); 156 157 camera->setName("DistortionCorrectionCamera"); 158 159 addSlave(camera.get(), osg::Matrixd(), osg::Matrixd(), false); 160 } 161 } 162 163 osg::Geometry* extViewer::createMesh( unsigned int column, unsigned int row ) 164 { 165 osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array(column * row); 166 osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array(column * row); 167 for ( unsigned int i=0; i<row; ++i ) 168 { 169 for ( unsigned int j=0; j<column; ++j ) 170 { 171 (*vertices)[i*column + j].set( (float)i, (float)j, 0.0f ); 172 (*texcoords)[i*column + j].set( (float)i/(float)row, (float)j/(float)column ); 173 } 174 } 175 176 osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; 177 geom->setUseDisplayList( false ); 178 geom->setUseVertexBufferObjects( true ); 179 geom->setVertexArray( vertices.get() ); 180 geom->setTexCoordArray( 0, texcoords.get() ); 181 for ( unsigned int i=0; i<row-1; ++i ) 182 { 183 osg::ref_ptr<osg::DrawElementsUInt> de = new osg::DrawElementsUInt(GL_QUAD_STRIP, column*2); 184 for ( unsigned int j=0; j<column; ++j ) 185 { 186 (*de)[j*2 + 0] = i*column + j; 187 (*de)[j*2 + 1] = (i+1)*column + j; 188 } 189 geom->addPrimitiveSet( de.get() ); 190 } 191 192 193 194 osg::ComputeBoundsVisitor cbv; 195 cbv.applyDrawable(geom); 196 osg::BoundingBox box = cbv.getBoundingBox(); 197 if (!box.valid()) 198 std::cout << "Invalid bounding box!"; 199 geom->setInitialBound(box); 200 201 osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; 202 texture->setImage( osgDB::readImageFile("Images/osg256.png") ); 203 texture->setFilter( osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR_MIPMAP_LINEAR ); 204 texture->setFilter( osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR_MIPMAP_LINEAR ); 205 geom->getOrCreateStateSet()->setTextureAttributeAndModes( 0, texture.get() ); 206 207 // Create normals 208 osgUtil::SmoothingVisitor::smooth( *geom ); 209 210 return geom.release(); 211 } -
experimental/distortionNG/extViewer.h
r311 r313 14 14 15 15 /** Convenience method for projection on curved screens using a slave camera rendering scene and a second camera doing distortion correction to present on a nonplaner display.*/ 16 void setUpViewForDistortion(); 16 void setUpViewForManualDistortion(osg::Image* intensityMap, unsigned int screenNum=0); 17 18 static osg::Geometry* createMesh(unsigned int column, unsigned int row); 17 19 }; -
experimental/distortionNG/main.cpp
r311 r313 107 107 108 108 osg::ref_ptr<osg::Geode> geode = new osg::Geode; 109 geode->addDrawable( distortionNG::createMesh(16, 9) );109 geode->addDrawable( extViewer::createMesh(16, 9) ); 110 110 geode->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF ); 111 111 geode->getOrCreateStateSet()->setAttributeAndModes( new osg::PolygonOffset(1.0f, 1.0f) );
Note: See TracChangeset
for help on using the changeset viewer.