source: experimental/distortionNG/extViewer.cpp @ 313

Last change on this file since 313 was 313, checked in by Torben Dannhauer, 13 years ago
File size: 7.4 KB
Line 
1#include "extViewer.h"
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
12extViewer::extViewer() : Viewer()
13{
14
15}
16
17extViewer::extViewer(osg::ArgumentParser& arguments) : Viewer(arguments)
18{
19
20}
21
22extViewer::extViewer(const osgViewer::Viewer& viewer, const osg::CopyOp& copyop) : Viewer(viewer, copyop)
23{
24
25}
26
27extViewer::~extViewer()
28{
29
30}
31
32void extViewer::setUpViewForManualDistortion(osg::Image* intensityMap, unsigned int screenNum)
33{
34        OSG_INFO<<"View::setUpViewForManualDistortion(sn="<<screenNum<<", im="<<intensityMap<<")"<<std::endl;
35
36    osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface();
37    if (!wsi)
38    {
39        OSG_NOTICE<<"Error, no WindowSystemInterface available, cannot create windows."<<std::endl;
40        return;
41    }
42
43        osg::GraphicsContext::ScreenIdentifier si;
44    si.readDISPLAY();
45
46    // displayNum has not been set so reset it to 0.
47    if (si.displayNum<0) si.displayNum = 0;
48
49    si.screenNum = screenNum;
50
51    unsigned int width, height;
52    wsi->getScreenResolution(si, width, height);
53
54        osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
55    traits->hostName = si.hostName;
56    traits->displayNum = si.displayNum;
57    traits->screenNum = si.screenNum;
58    traits->x = 0;
59    traits->y = 0;
60    traits->width = width;
61    traits->height = height;
62    traits->windowDecoration = false;
63    traits->doubleBuffer = true;
64    traits->sharedContext = 0;
65
66        bool applyIntensityMapAsColours = true;
67
68        osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());
69    if (!gc)
70    {
71        OSG_NOTICE<<"GraphicsWindow has not been created successfully."<<std::endl;
72        return;
73    }
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
163osg::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}
Note: See TracBrowser for help on using the repository browser.