Hi Robert,
As per your directions, I am sending the modified osgDistortion example
to you. The file "osgDistortionMod.cpp" contains the modifications made and
some of the parts of the program that were not required (I focussed only on
the createDistortionSubgraph function) are commented out. To improve the
program readability, "osgDistortionMod_Trim.cpp" has all these portions
deleted.
Sir, I was wondering if the drop in framerate when attaching an image
instead of the texture itself may possibly be interlinked in some way to the
above problem. Hence those modifications are also made but commented in the
above program.
I am using Visual C++ 8.0 to build the program -- Windows XP x64 OS, Intel
Xeon Dual Core Processor, 8GB ECC FB RAM and nVidia Quadro FX4500 graphics
card.
I am very grateful to you for sparing your precious time on my problem.
Thank you very much.
Regards,
Harash Sharma.
<[EMAIL PROTECTED]> wrote:
Hi Robert,
Tomorrow morning I will send it to you.
Regards
Harash
Robert Osfield <[EMAIL PROTECTED]> wrote:
Hi Harash,
Could you please send a modified example that reproduces this problem.
Robert.
On 7/4/07, Harash Sharma wrote:
> Hi Robert,
>
> I was trying the luminance component drawing and came across a strange
> problem.
>
> 1. An osgViewer::View object is added to osgViewer::CompositeViewer.
> 2. The GraphicsContext is created using createGraphicsContext for given
> traits.
> 3. Used View::GetCamera()->setGraphicsContext
>
>
> Under the following three conditions, the RTT camera created, actually
draws
> to the screen and to the texture attached:
>
> 1. Texture Internal Format set to GL_LUMINANCE
> 2. Texture Rendering Camera Viewport set.
>
> I modified the osgDistortion Example to incorporate the above requirements
> and was able to reproduce the problem -- Monochrome Scene rendered in
> specified viewport and Colored scene rendered at (0,0) with the size equal
> to the specified texture size. The moment I make the Texture Internal
format
> GL_RGBA, everything becomes normal. The same happens if I remove the
> association of GraphicsContext with View (removing the
createGraphicsContext
> statement itself).
>
> I don't know if this really is a bug or something wrong in my
> understanding. I am really very sorry for troubling you in your busy
> schedule every now and then. I really appreciate your sound support.
Please
> bear with me. Thanks........
>
>
> Regards
>
> Harash
>
>
>
> ________________________________
> Park yourself in front of a world of choices in alternative vehicles.
> Visit the Yahoo! Auto Green Center.
>
>
> _______________________________________________
> osg-users mailing list
> osg-users@openscenegraph.net
> http://openscenegraph.net/mailman/listinfo/osg-users
> http://www.openscenegraph.org/
>
_______________________________________________
osg-users mailing list
osg-users@openscenegraph.net
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/
________________________________
Luggage? GPS? Comic books?
Check out fitting gifts for grads at Yahoo!
Search._______________________________________________
osg-users mailing list
osg-users@openscenegraph.net
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/
________________________________
Pinpoint customers who are looking for what you sell.
/* OpenSceneGraph example, osgdistortion.
*
* Permission is hereby granted, free of charge, to any person obtaining a
copy
* of this software and associated documentation files (the "Software"), to
deal
* in the Software without restriction, including without limitation the
rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <osg/GLExtensions>
#include <osg/Node>
#include <osg/Geometry>
#include <osg/Notify>
#include <osg/MatrixTransform>
#include <osg/Texture2D>
#include <osg/Stencil>
#include <osg/ColorMask>
#include <osg/Depth>
#include <osg/Billboard>
#include <osg/Material>
#include <osg/Projection>
#include <osg/TextureCubeMap>
#include <osg/io_utils>
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgUtil/SmoothingVisitor>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <iostream>
using namespace osg;
osg::Node* createDistortionSubgraph(osg::Node* subgraph,
const osg::Vec4& clearColour)
{
osg::Group* distortionNode = new osg::Group;
unsigned int tex_width = 1024;
unsigned int tex_height = 1024;
osg::Texture2D* texture = new osg::Texture2D;
texture->setTextureSize(tex_width, tex_height);
/********************************************************/
/* The internal format of the texture is modified to */
/* GL_LUMINANCE. If it is kept GL_RGBA, everything */
/* works fine
*/
/********************************************************/
//texture->setInternalFormat(GL_RGBA);
texture->setInternalFormat(GL_LUMINANCE);
/********************************************************/
/* Change section over
*/
/********************************************************/
texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
/********************************************************/
/* This is another thing I tried -- attaching an image */
/* to the RTT camera and setting it as the texture */
/* image. This drops the frame rate to around 1 fps. */
/* I thought this problem may be interlinked to the */
/* one stated above. hence I am sending it.
*/
/********************************************************/
/*
osg::Image* image = new osg::Image;
image->allocateImage(tex_width, tex_height, 1,
GL_LUMINANCE, GL_UNSIGNED_BYTE);
texture->setImage(image);
*/
/********************************************************/
/* Modification Section Ends
*/
/********************************************************/
// set up the render to texture camera.
{
osg::Camera* camera = new osg::Camera;
// set clear the color and depth buffer
camera->setClearColor(clearColour);
camera->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// just inherit the main cameras view
camera->setReferenceFrame(osg::Transform::RELATIVE_RF);
camera->setProjectionMatrix(osg::Matrixd::identity());
camera->setViewMatrix(osg::Matrixd::identity());
// set viewport
camera->setViewport(0,0,tex_width,tex_height);
// set the camera to render before the main camera.
camera->setRenderOrder(osg::Camera::PRE_RENDER);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
/****************************************************/
/* To be modified for problem-2
*/
/* Just attach Image object instead of texture */
/* object
*/
/****************************************************/
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture);
//
camera->attach(osg::Camera::COLOR_BUFFER, image);
/****************************************************/
/* Modification section ends
*/
/****************************************************/
// add subgraph to render
camera->addChild(subgraph);
distortionNode->addChild(camera);
}
// set up the hud camera
{
// create the quad to visualize.
osg::Geometry* polyGeom = new osg::Geometry();
polyGeom->setSupportsDisplayList(false);
osg::Vec3 origin(0.0f,0.0f,0.0f);
osg::Vec3 xAxis(1.0f,0.0f,0.0f);
osg::Vec3 yAxis(0.0f,1.0f,0.0f);
float height = 1024.0f;
float width = 1280.0f;
int noSteps = 50;
osg::Vec3Array* vertices = new osg::Vec3Array;
osg::Vec2Array* texcoords = new osg::Vec2Array;
osg::Vec4Array* colors = new osg::Vec4Array;
osg::Vec3 bottom = origin;
osg::Vec3 dx = xAxis*(width/((float)(noSteps-1)));
osg::Vec3 dy = yAxis*(height/((float)(noSteps-1)));
osg::Vec2 bottom_texcoord(0.0f,0.0f);
osg::Vec2 dx_texcoord(1.0f/(float)(noSteps-1),0.0f);
osg::Vec2 dy_texcoord(0.0f,1.0f/(float)(noSteps-1));
osg::Vec3 cursor = bottom;
osg::Vec2 texcoord = bottom_texcoord;
int i,j;
for(i=0;i<noSteps;++i)
{
osg::Vec3 cursor = bottom+dy*(float)i;
osg::Vec2 texcoord =
bottom_texcoord+dy_texcoord*(float)i;
for(j=0;j<noSteps;++j)
{
vertices->push_back(cursor);
texcoords->push_back(osg::Vec2((sin(texcoord.x()*osg::PI-osg::PI*0.5)+1.0f)*0.5f,(sin(texcoord.y()*osg::PI-osg::PI*0.5)+1.0f)*0.5f));
colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
cursor += dx;
texcoord += dx_texcoord;
}
}
// pass the created vertex array to the points geometry object.
polyGeom->setVertexArray(vertices);
polyGeom->setColorArray(colors);
polyGeom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
polyGeom->setTexCoordArray(0,texcoords);
for(i=0;i<noSteps-1;++i)
{
osg::DrawElementsUShort* elements = new
osg::DrawElementsUShort(osg::PrimitiveSet::QUAD_STRIP);
for(j=0;j<noSteps;++j)
{
elements->push_back(j+(i+1)*noSteps);
elements->push_back(j+(i)*noSteps);
}
polyGeom->addPrimitiveSet(elements);
}
// new we need to add the texture to the Drawable, we do so by
creating a
// StateSet to contain the Texture StateAttribute.
osg::StateSet* stateset =
polyGeom->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0,
texture,osg::StateAttribute::ON);
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
osg::Geode* geode = new osg::Geode();
geode->addDrawable(polyGeom);
// set up the camera to render the textured quad
osg::Camera* camera = new osg::Camera;
// just inherit the main cameras view
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setViewMatrix(osg::Matrix::identity());
camera->setProjectionMatrixAsOrtho2D(0,1280,0,1024);
// set the camera to render before the main camera.
camera->setRenderOrder(osg::Camera::NESTED_RENDER);
// add subgraph to render
camera->addChild(geode);
camera->setViewport(440, 312, 400, 400);
distortionNode->addChild(camera);
}
return distortionNode;
}
/*
void setDomeFaces(osgViewer::Viewer& viewer,
osg::ArgumentParser& arguments)
{
osg::GraphicsContext::WindowingSystemInterface* wsi =
osg::GraphicsContext::getWindowingSystemInterface();
if (!wsi)
{
osg::notify(osg::NOTICE)<<"Error, no
WindowSystemInterface available, cannot create windows."<<std::endl;
return;
}
unsigned int width, height;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),
width, height);
while (arguments.read("--width",width)) {}
while (arguments.read("--height",height)) {}
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = width;
traits->height = height;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
if (!gc)
{
osg::notify(osg::NOTICE)<<"GraphicsWindow has not
been created successfully."<<std::endl;
return;
}
int center_x = width/2;
int center_y = height/2;
int camera_width = 256;
int camera_height = 256;
// front face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(center_x-camera_width/2, center_y,
camera_width, camera_height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
viewer.addSlave(camera.get(), osg::Matrixd(), osg::Matrixd());
}
// top face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(center_x-camera_width/2,
center_y+camera_height, camera_width, camera_height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(-90.0f), 1.0,0.0,0.0));
}
// left face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(center_x-camera_width*3/2, center_y,
camera_width, camera_height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(-90.0f), 0.0,1.0,0.0));
}
// right face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(center_x+camera_width/2, center_y,
camera_width, camera_height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(90.0f), 0.0,1.0,0.0));
}
// bottom face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(center_x-camera_width/2,
center_y-camera_height, camera_width, camera_height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(90.0f), 1.0,0.0,0.0));
}
// back face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(center_x-camera_width/2,
center_y-2*camera_height, camera_width, camera_height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(-180.0f),
1.0,0.0,0.0));
}
viewer.getCamera()->setProjectionMatrixAsPerspective(90.0f,
1.0, 1, 1000.0);
viewer.assignSceneDataToCameras();
}
osg::Geometry* createDomeDistortionMesh(const osg::Vec3& origin, const
osg::Vec3& widthVector, const osg::Vec3& heightVector,
osg::ArgumentParser& arguments)
{
double sphere_radius = 1.0;
if (arguments.read("--radius", sphere_radius)) {}
double collar_radius = 0.45;
if (arguments.read("--collar", collar_radius)) {}
osg::Vec3d center(0.0,0.0,0.0);
osg::Vec3d eye(0.0,0.0,0.0);
double distance = sqrt(sphere_radius*sphere_radius -
collar_radius*collar_radius);
if (arguments.read("--distance", distance)) {}
bool centerProjection = false;
osg::Vec3d projector = eye - osg::Vec3d(0.0,0.0, distance);
osg::notify(osg::NOTICE)<<"Projector position =
"<<projector<<std::endl;
osg::notify(osg::NOTICE)<<"distance =
"<<distance<<std::endl;
// create the quad to visualize.
osg::Geometry* geometry = new osg::Geometry();
geometry->setSupportsDisplayList(false);
osg::Vec3 xAxis(widthVector);
float width = widthVector.length();
xAxis /= width;
osg::Vec3 yAxis(heightVector);
float height = heightVector.length();
yAxis /= height;
int noSteps = 50;
osg::Vec3Array* vertices = new osg::Vec3Array;
osg::Vec3Array* texcoords = new osg::Vec3Array;
osg::Vec4Array* colors = new osg::Vec4Array;
osg::Vec3 bottom = origin;
osg::Vec3 dx = xAxis*(width/((float)(noSteps-1)));
osg::Vec3 dy = yAxis*(height/((float)(noSteps-1)));
osg::Vec3d screenCenter = origin + widthVector*0.5f + heightVector*0.5f;
float screenRadius = heightVector.length() * 0.5f;
osg::Vec3 cursor = bottom;
int i,j;
if (centerProjection)
{
for(i=0;i<noSteps;++i)
{
osg::Vec3 cursor = bottom+dy*(float)i;
for(j=0;j<noSteps;++j)
{
osg::Vec2 delta(cursor.x() - screenCenter.x(), cursor.y() -
screenCenter.y());
double theta = atan2(-delta.y(), delta.x());
double phi = osg::PI_2 * delta.length() / screenRadius;
if (phi > osg::PI_2) phi = osg::PI_2;
phi *= 2.0;
// osg::notify(osg::NOTICE)<<"theta =
"<<theta<< "phi="<<phi<<std::endl;
osg::Vec3 texcoord(sin(phi) * cos(theta),
sin(phi) * sin(theta),
cos(phi));
vertices->push_back(cursor);
colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
texcoords->push_back(texcoord);
cursor += dx;
}
// osg::notify(osg::NOTICE)<<std::endl;
}
}
else
{
for(i=0;i<noSteps;++i)
{
osg::Vec3 cursor = bottom+dy*(float)i;
for(j=0;j<noSteps;++j)
{
osg::Vec2 delta(cursor.x() - screenCenter.x(), cursor.y() -
screenCenter.y());
double theta = atan2(-delta.y(), delta.x());
double phi = osg::PI_2 * delta.length() / screenRadius;
if (phi > osg::PI_2) phi = osg::PI_2;
// osg::notify(osg::NOTICE)<<"theta =
"<<theta<< "phi="<<phi<<std::endl;
double f = distance * sin(phi);
double e = distance * cos(phi) + sqrt(
sphere_radius*sphere_radius - f*f);
double l = e * cos(phi);
double h = e * sin(phi);
double z = l - distance;
osg::Vec3 texcoord(h * cos(theta) / sphere_radius,
h * sin(theta) / sphere_radius,
z / sphere_radius);
vertices->push_back(cursor);
colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
texcoords->push_back(texcoord);
cursor += dx;
}
// osg::notify(osg::NOTICE)<<std::endl;
}
}
// pass the created vertex array to the points geometry object.
geometry->setVertexArray(vertices);
geometry->setColorArray(colors);
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
geometry->setTexCoordArray(0,texcoords);
for(i=0;i<noSteps-1;++i)
{
osg::DrawElementsUShort* elements = new
osg::DrawElementsUShort(osg::PrimitiveSet::QUAD_STRIP);
for(j=0;j<noSteps;++j)
{
elements->push_back(j+(i+1)*noSteps);
elements->push_back(j+(i)*noSteps);
}
geometry->addPrimitiveSet(elements);
}
return geometry;
}
void setDomeCorrection(osgViewer::Viewer& viewer,
osg::ArgumentParser& arguments)
{
osg::GraphicsContext::WindowingSystemInterface* wsi =
osg::GraphicsContext::getWindowingSystemInterface();
if (!wsi)
{
osg::notify(osg::NOTICE)<<"Error, no
WindowSystemInterface available, cannot create windows."<<std::endl;
return;
}
unsigned int width, height;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),
width, height);
while (arguments.read("--width",width)) {}
while (arguments.read("--height",height)) {}
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = width;
traits->height = height;
traits->windowDecoration = false;
traits->doubleBuffer = true;
traits->sharedContext = 0;
osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
if (!gc)
{
osg::notify(osg::NOTICE)<<"GraphicsWindow has not
been created successfully."<<std::endl;
return;
}
int tex_width = 512;
int tex_height = 512;
int camera_width = tex_width;
int camera_height = tex_height;
osg::TextureCubeMap* texture = new osg::TextureCubeMap;
texture->setTextureSize(tex_width, tex_height);
texture->setInternalFormat(GL_RGB);
texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR);
texture->setFilter(osg::Texture::MAG_FILTER,osg::Texture::LINEAR);
#if 0
osg::Camera::RenderTargetImplementation
renderTargetImplementation = osg::Camera::SEPERATE_WINDOW;
GLenum buffer = GL_FRONT;
#else
osg::Camera::RenderTargetImplementation
renderTargetImplementation =
osg::Camera::FRAME_BUFFER_OBJECT;
GLenum buffer = GL_FRONT;
#endif
// front face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setName("Front face camera");
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(0,0,camera_width, camera_height));
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
camera->setAllowEventFocus(false);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(renderTargetImplementation);
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture,
0, osg::TextureCubeMap::POSITIVE_Y);
viewer.addSlave(camera.get(), osg::Matrixd(), osg::Matrixd());
}
// top face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setName("Top face camera");
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(0,0,camera_width, camera_height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
camera->setAllowEventFocus(false);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(renderTargetImplementation);
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture,
0, osg::TextureCubeMap::POSITIVE_Z);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(-90.0f), 1.0,0.0,0.0));
}
// left face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setName("Left face camera");
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(0,0,camera_width, camera_height));
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
camera->setAllowEventFocus(false);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(renderTargetImplementation);
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture,
0, osg::TextureCubeMap::NEGATIVE_X);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(-90.0f), 0.0,1.0,0.0) *
osg::Matrixd::rotate(osg::inDegrees(-90.0f), 0.0,0.0,1.0));
}
// right face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setName("Right face camera");
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(0,0,camera_width, camera_height));
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
camera->setAllowEventFocus(false);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(renderTargetImplementation);
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture,
0, osg::TextureCubeMap::POSITIVE_X);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(90.0f), 0.0,1.0,0.0 ) *
osg::Matrixd::rotate(osg::inDegrees(90.0f), 0.0,0.0,1.0));
}
// bottom face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setName("Bottom face camera");
camera->setViewport(new
osg::Viewport(0,0,camera_width, camera_height));
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
camera->setAllowEventFocus(false);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(renderTargetImplementation);
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture,
0, osg::TextureCubeMap::NEGATIVE_Z);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(90.0f), 1.0,0.0,0.0) *
osg::Matrixd::rotate(osg::inDegrees(180.0f), 0.0,0.0,1.0));
}
// back face
{
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setName("Back face camera");
camera->setGraphicsContext(gc.get());
camera->setViewport(new
osg::Viewport(0,0,camera_width, camera_height));
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
camera->setAllowEventFocus(false);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(renderTargetImplementation);
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture,
0, osg::TextureCubeMap::NEGATIVE_Y);
viewer.addSlave(camera.get(), osg::Matrixd(),
osg::Matrixd::rotate(osg::inDegrees(180.0f), 1.0,0.0,0.0));
}
viewer.getCamera()->setProjectionMatrixAsPerspective(90.0f,
1.0, 1, 1000.0);
// distortion correction set up.
{
osg::Geode* geode = new osg::Geode();
geode->addDrawable(createDomeDistortionMesh(osg::Vec3(0.0f,0.0f,0.0f),
osg::Vec3(width,0.0f,0.0f), osg::Vec3(0.0f,height,0.0f), arguments));
// new we need to add the texture to the mesh, we do so by creating
a
// StateSet to contain the Texture StateAttribute.
osg::StateSet* stateset = geode->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0,
texture,osg::StateAttribute::ON);
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setGraphicsContext(gc.get());
camera->setClearMask(GL_DEPTH_BUFFER_BIT |
GL_COLOR_BUFFER_BIT );
camera->setClearColor( osg::Vec4(0.1,0.1,1.0,1.0) );
camera->setViewport(new osg::Viewport(0, 0, width, height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF);
camera->setAllowEventFocus(false);
//camera->setInheritanceMask(camera->getInheritanceMask() &
~osg::CullSettings::CLEAR_COLOR &
~osg::CullSettings::COMPUTE_NEAR_FAR_MODE);
//camera->setComputeNearFarMode(osg::CullSettings::DO_NOT_COMPUTE_NEAR_FAR);
camera->setProjectionMatrixAsOrtho2D(0,width,0,height);
camera->setViewMatrix(osg::Matrix::identity());
// add subgraph to render
camera->addChild(geode);
camera->setName("DistortionCorrectionCamera");
viewer.addSlave(camera.get(), osg::Matrixd(), osg::Matrixd(),
false);
}
viewer.getCamera()->setNearFarRatio(0.0001f);
}*/
int main(int argc, char** argv)
{
/*********************************/
/* // use an ArgumentParser object to manage the program arguments.
osg::ArgumentParser arguments(&argc,argv);
// construct the viewer.
osgViewer::Viewer viewer;
// load the nodes from the commandline arguments.
osg::Node* loadedModel =
osgDB::readNodeFiles(arguments);
*/
// Directly loading a particular model
// if not loaded assume no arguments passed in, try use default mode
instead.
osg::Node* loadedModel = osgDB::readNodeFile("cow.osg");
if (!loadedModel)
{
std::cout << /*arguments.getApplicationName() <<*/": No data loaded"
<< std::endl;
return 1;
}
osgViewer::Viewer viewer;
/****************************************************************/
/* Create a graphics Context for the given traits
*/
/****************************************************************/
/* If this section is commented, everything works fine
*/
/****************************************************************/
osg::GraphicsContext::WindowingSystemInterface* wsi
= osg::GraphicsContext::getWindowingSystemInterface();
if (!wsi)
{
osg::notify(osg::NOTICE)<<"Error, no
WindowSystemInterface available, cannot create windows."<<std::endl;
return 0;
}
unsigned int width, height;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),
width, height);
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = width;
traits->height = height;
traits->windowDecoration = false;
traits->doubleBuffer = true;
traits->sharedContext = 0;
osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
if (!gc)
{
osg::notify(osg::NOTICE)<<"GraphicsWindow has not
been created successfully."<<std::endl;
return 0;
}
viewer.getCamera()->setGraphicsContext(gc.get());
/****************************************************************/
/* Section for creating Graphics context ends
*/
/****************************************************************/
/********************************************************************/
/* Out of this full section, only
createDistortionSubgraph */
/* will be used.
*/
/********************************************************************/
/*if (arguments.read("--dome") || arguments.read("--puffer") )
{
setDomeCorrection(viewer, arguments);
viewer.setSceneData( loadedModel );
}
else if (arguments.read("--faces"))
{
setDomeFaces(viewer, arguments);
viewer.setSceneData( loadedModel );
}
else
{*/
osg::Node* distortionNode = createDistortionSubgraph( loadedModel,
viewer.getCamera()->getClearColor());
viewer.setSceneData( distortionNode );
/*}
// load the nodes from the commandline arguments.
if (!viewer.getSceneData())
{
osg::notify(osg::NOTICE)<<"Please specify a model
filename on the command line."<<std::endl;
return 1;
}*/
/********************************************************************/
/* section to create distortions over
*/
/********************************************************************/
// set up the camera manipulators.
{
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator>
keyswitchManipulator = new
osgGA::KeySwitchMatrixManipulator;
keyswitchManipulator->addMatrixManipulator( '1',
"Trackball", new osgGA::TrackballManipulator() );
keyswitchManipulator->addMatrixManipulator( '2',
"Flight", new osgGA::FlightManipulator() );
keyswitchManipulator->addMatrixManipulator( '3',
"Drive", new osgGA::DriveManipulator() );
keyswitchManipulator->addMatrixManipulator( '4',
"Terrain", new osgGA::TerrainManipulator() );
/*std::string pathfile;
char keyForAnimationPath = '5';
while (arguments.read("-p",pathfile))
{
osgGA::AnimationPathManipulator* apm = new
osgGA::AnimationPathManipulator(pathfile);
if (apm || !apm->valid())
{
unsigned int num =
keyswitchManipulator->getNumMatrixManipulators();
keyswitchManipulator->addMatrixManipulator(
keyForAnimationPath, "Path", apm );
keyswitchManipulator->selectMatrixManipulator(num);
++keyForAnimationPath;
}
}*/
viewer.setCameraManipulator( keyswitchManipulator.get() );
}
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
// add the state manipulator
viewer.addEventHandler( new
osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
// add the stats handler
viewer.addEventHandler(new osgViewer::StatsHandler);
viewer.getCamera()->setViewport(440, 312, 400, 400);
return viewer.run();
}
/* OpenSceneGraph example, osgdistortion.
*
* Permission is hereby granted, free of charge, to any person obtaining a
copy
* of this software and associated documentation files (the "Software"), to
deal
* in the Software without restriction, including without limitation the
rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <osg/GLExtensions>
#include <osg/Node>
#include <osg/Geometry>
#include <osg/Notify>
#include <osg/MatrixTransform>
#include <osg/Texture2D>
#include <osg/Stencil>
#include <osg/ColorMask>
#include <osg/Depth>
#include <osg/Billboard>
#include <osg/Material>
#include <osg/Projection>
#include <osg/TextureCubeMap>
#include <osg/io_utils>
#include <osgGA/TrackballManipulator>
#include <osgGA/FlightManipulator>
#include <osgGA/DriveManipulator>
#include <osgGA/KeySwitchMatrixManipulator>
#include <osgGA/StateSetManipulator>
#include <osgGA/AnimationPathManipulator>
#include <osgGA/TerrainManipulator>
#include <osgUtil/SmoothingVisitor>
#include <osgDB/Registry>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <iostream>
using namespace osg;
osg::Node* createDistortionSubgraph(osg::Node* subgraph,
const osg::Vec4& clearColour)
{
osg::Group* distortionNode = new osg::Group;
unsigned int tex_width = 1024;
unsigned int tex_height = 1024;
osg::Texture2D* texture = new osg::Texture2D;
texture->setTextureSize(tex_width, tex_height);
/********************************************************/
/* The internal format of the texture is modified to */
/* GL_LUMINANCE. If it is kept GL_RGBA, everything */
/* works fine
*/
/********************************************************/
//texture->setInternalFormat(GL_RGBA);
texture->setInternalFormat(GL_LUMINANCE);
/********************************************************/
/* Change section over
*/
/********************************************************/
texture->setFilter(osg::Texture2D::MIN_FILTER,osg::Texture2D::LINEAR);
texture->setFilter(osg::Texture2D::MAG_FILTER,osg::Texture2D::LINEAR);
/********************************************************/
/* This is another thing I tried -- attaching an image */
/* to the RTT camera and setting it as the texture */
/* image. This drops the frame rate to around 1 fps. */
/* I thought this problem may be interlinked to the */
/* one stated above. hence I am sending it.
*/
/********************************************************/
/*
osg::Image* image = new osg::Image;
image->allocateImage(tex_width, tex_height, 1,
GL_LUMINANCE, GL_UNSIGNED_BYTE);
texture->setImage(image);
*/
/********************************************************/
/* Modification Section Ends
*/
/********************************************************/
// set up the render to texture camera.
{
osg::Camera* camera = new osg::Camera;
// set clear the color and depth buffer
camera->setClearColor(clearColour);
camera->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// just inherit the main cameras view
camera->setReferenceFrame(osg::Transform::RELATIVE_RF);
camera->setProjectionMatrix(osg::Matrixd::identity());
camera->setViewMatrix(osg::Matrixd::identity());
// set viewport
camera->setViewport(0,0,tex_width,tex_height);
// set the camera to render before the main camera.
camera->setRenderOrder(osg::Camera::PRE_RENDER);
// tell the camera to use OpenGL frame buffer object where
supported.
camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
/****************************************************/
/* To be modified for problem-2
*/
/* Just attach Image object instead of texture */
/* object
*/
/****************************************************/
// attach the texture and use it as the color buffer.
camera->attach(osg::Camera::COLOR_BUFFER, texture);
//camera->attach(osg::Camera::COLOR_BUFFER,
image);
/****************************************************/
/* Modification section ends
*/
/****************************************************/
// add subgraph to render
camera->addChild(subgraph);
distortionNode->addChild(camera);
}
// set up the hud camera
{
// create the quad to visualize.
osg::Geometry* polyGeom = new osg::Geometry();
polyGeom->setSupportsDisplayList(false);
osg::Vec3 origin(0.0f,0.0f,0.0f);
osg::Vec3 xAxis(1.0f,0.0f,0.0f);
osg::Vec3 yAxis(0.0f,1.0f,0.0f);
float height = 1024.0f;
float width = 1280.0f;
int noSteps = 50;
osg::Vec3Array* vertices = new osg::Vec3Array;
osg::Vec2Array* texcoords = new osg::Vec2Array;
osg::Vec4Array* colors = new osg::Vec4Array;
osg::Vec3 bottom = origin;
osg::Vec3 dx = xAxis*(width/((float)(noSteps-1)));
osg::Vec3 dy = yAxis*(height/((float)(noSteps-1)));
osg::Vec2 bottom_texcoord(0.0f,0.0f);
osg::Vec2 dx_texcoord(1.0f/(float)(noSteps-1),0.0f);
osg::Vec2 dy_texcoord(0.0f,1.0f/(float)(noSteps-1));
osg::Vec3 cursor = bottom;
osg::Vec2 texcoord = bottom_texcoord;
int i,j;
for(i=0;i<noSteps;++i)
{
osg::Vec3 cursor = bottom+dy*(float)i;
osg::Vec2 texcoord =
bottom_texcoord+dy_texcoord*(float)i;
for(j=0;j<noSteps;++j)
{
vertices->push_back(cursor);
texcoords->push_back(osg::Vec2((sin(texcoord.x()*osg::PI-osg::PI*0.5)+1.0f)*0.5f,(sin(texcoord.y()*osg::PI-osg::PI*0.5)+1.0f)*0.5f));
colors->push_back(osg::Vec4(1.0f,1.0f,1.0f,1.0f));
cursor += dx;
texcoord += dx_texcoord;
}
}
// pass the created vertex array to the points geometry object.
polyGeom->setVertexArray(vertices);
polyGeom->setColorArray(colors);
polyGeom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
polyGeom->setTexCoordArray(0,texcoords);
for(i=0;i<noSteps-1;++i)
{
osg::DrawElementsUShort* elements = new
osg::DrawElementsUShort(osg::PrimitiveSet::QUAD_STRIP);
for(j=0;j<noSteps;++j)
{
elements->push_back(j+(i+1)*noSteps);
elements->push_back(j+(i)*noSteps);
}
polyGeom->addPrimitiveSet(elements);
}
// new we need to add the texture to the Drawable, we do so by
creating a
// StateSet to contain the Texture StateAttribute.
osg::StateSet* stateset =
polyGeom->getOrCreateStateSet();
stateset->setTextureAttributeAndModes(0,
texture,osg::StateAttribute::ON);
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
osg::Geode* geode = new osg::Geode();
geode->addDrawable(polyGeom);
// set up the camera to render the textured quad
osg::Camera* camera = new osg::Camera;
// just inherit the main cameras view
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setViewMatrix(osg::Matrix::identity());
camera->setProjectionMatrixAsOrtho2D(0,1280,0,1024);
// set the camera to render before the main camera.
camera->setRenderOrder(osg::Camera::NESTED_RENDER);
// add subgraph to render
camera->addChild(geode);
camera->setViewport(440, 312, 400, 400);
distortionNode->addChild(camera);
}
return distortionNode;
}
int main(int argc, char** argv)
{
// Directly loading a particular model
// if not loaded assume no arguments passed in, try use default mode
instead.
osg::Node* loadedModel = osgDB::readNodeFile("cow.osg");
if (!loadedModel)
{
std::cout << /*arguments.getApplicationName() <<*/": No data loaded"
<< std::endl;
return 1;
}
osgViewer::Viewer viewer;
/****************************************************************/
/* Create a graphics Context for the given traits
*/
/****************************************************************/
/* If this section is commented, everything works fine
*/
/****************************************************************/
osg::GraphicsContext::WindowingSystemInterface* wsi
= osg::GraphicsContext::getWindowingSystemInterface();
if (!wsi)
{
osg::notify(osg::NOTICE)<<"Error, no
WindowSystemInterface available, cannot create windows."<<std::endl;
return 0;
}
unsigned int width, height;
wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),
width, height);
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits;
traits->x = 0;
traits->y = 0;
traits->width = width;
traits->height = height;
traits->windowDecoration = false;
traits->doubleBuffer = true;
traits->sharedContext = 0;
osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
if (!gc)
{
osg::notify(osg::NOTICE)<<"GraphicsWindow has not
been created successfully."<<std::endl;
return 0;
}
viewer.getCamera()->setGraphicsContext(gc.get());
/****************************************************************/
/* Section for creating Graphics context ends
*/
/****************************************************************/
/********************************************************************/
/* Out of this full section, only
createDistortionSubgraph */
/* will be used.
*/
/********************************************************************/
osg::Node* distortionNode = createDistortionSubgraph( loadedModel,
viewer.getCamera()->getClearColor());
viewer.setSceneData( distortionNode );
/********************************************************************/
/* section to create distortions over
*/
/********************************************************************/
// set up the camera manipulators.
{
osg::ref_ptr<osgGA::KeySwitchMatrixManipulator>
keyswitchManipulator = new
osgGA::KeySwitchMatrixManipulator;
keyswitchManipulator->addMatrixManipulator( '1',
"Trackball", new osgGA::TrackballManipulator() );
keyswitchManipulator->addMatrixManipulator( '2',
"Flight", new osgGA::FlightManipulator() );
keyswitchManipulator->addMatrixManipulator( '3',
"Drive", new osgGA::DriveManipulator() );
keyswitchManipulator->addMatrixManipulator( '4',
"Terrain", new osgGA::TerrainManipulator() );
viewer.setCameraManipulator( keyswitchManipulator.get() );
}
viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded);
// add the state manipulator
viewer.addEventHandler( new
osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );
// add the stats handler
viewer.addEventHandler(new osgViewer::StatsHandler);
// Setting the viewport to the centre of my 1280x1024 screen -- size
400x400
// giving absolute values to make it independent of height and width
parameter obtained above --
// the same viewport is used for the rendering camera also.
viewer.getCamera()->setViewport(440, 312, 400, 400);
return viewer.run();
}
_______________________________________________
osg-users mailing list
osg-users@openscenegraph.net
http://openscenegraph.net/mailman/listinfo/osg-users
http://www.openscenegraph.org/