root/OpenSceneGraph/trunk/examples/osgbillboard/osgbillboard.cpp @ 13574

Revision 13574, 6.2 kB (checked in by robert, 13 hours ago)

From Aitor Moreno, LAS plugin - depends upon boost and liblas and liblas-c

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
RevLine 
[6941]1/* OpenSceneGraph example, osgbillboard.
2*
3*  Permission is hereby granted, free of charge, to any person obtaining a copy
4*  of this software and associated documentation files (the "Software"), to deal
5*  in the Software without restriction, including without limitation the rights
6*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*  copies of the Software, and to permit persons to whom the Software is
8*  furnished to do so, subject to the following conditions:
[13574]9*
[6941]10*  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
15*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
16*  THE SOFTWARE.
17*/
18
[1697]19#include <osg/Node>
20#include <osg/Geometry>
21#include <osg/Notify>
22#include <osg/MatrixTransform>
23#include <osg/Texture2D>
24#include <osg/Billboard>
25#include <osg/LineWidth>
26
27#include <osgGA/TrackballManipulator>
28#include <osgGA/FlightManipulator>
29#include <osgGA/DriveManipulator>
30
31#include <osgDB/Registry>
32#include <osgDB/ReadFile>
33
[5911]34#include <osgViewer/Viewer>
[1697]35
36//
[13574]37// A simple demo demonstrating different texturing modes,
[1697]38// including using of texture extensions.
39//
40
41
42typedef std::vector< osg::ref_ptr<osg::Image> > ImageList;
43
44/** create quad at specified position. */
45osg::Drawable* createSquare(const osg::Vec3& corner,const osg::Vec3& width,const osg::Vec3& height, osg::Image* image=NULL)
46{
47    // set up the Geometry.
48    osg::Geometry* geom = new osg::Geometry;
49
50    osg::Vec3Array* coords = new osg::Vec3Array(4);
51    (*coords)[0] = corner;
52    (*coords)[1] = corner+width;
53    (*coords)[2] = corner+width+height;
54    (*coords)[3] = corner+height;
55
56
57    geom->setVertexArray(coords);
58
59    osg::Vec3Array* norms = new osg::Vec3Array(1);
60    (*norms)[0] = width^height;
61    (*norms)[0].normalize();
62
[13574]63    geom->setNormalArray(norms, osg::Array::BIND_OVERALL);
64
[1697]65    osg::Vec2Array* tcoords = new osg::Vec2Array(4);
66    (*tcoords)[0].set(0.0f,0.0f);
67    (*tcoords)[1].set(1.0f,0.0f);
68    (*tcoords)[2].set(1.0f,1.0f);
69    (*tcoords)[3].set(0.0f,1.0f);
70    geom->setTexCoordArray(0,tcoords);
[13574]71
[1697]72    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));
[13574]73
[1697]74    if (image)
75    {
76        osg::StateSet* stateset = new osg::StateSet;
77        osg::Texture2D* texture = new osg::Texture2D;
78        texture->setImage(image);
79        stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);
80        geom->setStateSet(stateset);
81    }
[13574]82
[1697]83    return geom;
84}
85
86osg::Drawable* createAxis(const osg::Vec3& corner,const osg::Vec3& xdir,const osg::Vec3& ydir,const osg::Vec3& zdir)
87{
88    // set up the Geometry.
89    osg::Geometry* geom = new osg::Geometry;
90
91    osg::Vec3Array* coords = new osg::Vec3Array(6);
92    (*coords)[0] = corner;
93    (*coords)[1] = corner+xdir;
94    (*coords)[2] = corner;
95    (*coords)[3] = corner+ydir;
96    (*coords)[4] = corner;
97    (*coords)[5] = corner+zdir;
98
99    geom->setVertexArray(coords);
100
101    osg::Vec4 x_color(0.0f,1.0f,1.0f,1.0f);
102    osg::Vec4 y_color(0.0f,1.0f,1.0f,1.0f);
103    osg::Vec4 z_color(1.0f,0.0f,0.0f,1.0f);
104
105    osg::Vec4Array* color = new osg::Vec4Array(6);
106    (*color)[0] = x_color;
107    (*color)[1] = x_color;
108    (*color)[2] = y_color;
109    (*color)[3] = y_color;
110    (*color)[4] = z_color;
111    (*color)[5] = z_color;
[13574]112
113    geom->setColorArray(color, osg::Array::BIND_PER_VERTEX);
114
[1697]115    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,6));
[13574]116
[1697]117    osg::StateSet* stateset = new osg::StateSet;
118    osg::LineWidth* linewidth = new osg::LineWidth();
119    linewidth->setWidth(4.0f);
120    stateset->setAttributeAndModes(linewidth,osg::StateAttribute::ON);
121    stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
122    geom->setStateSet(stateset);
[13574]123
[1697]124    return geom;
125}
126
127osg::Node* createModel()
128{
129
130    // create the root node which will hold the model.
131    osg::Group* root = new osg::Group();
132
133    // add the drawable into a single goede to be shared...
134    osg::Billboard* center = new osg::Billboard();
135    center->setMode(osg::Billboard::POINT_ROT_EYE);
136    center->addDrawable(
137        createSquare(osg::Vec3(-0.5f,0.0f,-0.5f),osg::Vec3(1.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f),osgDB::readImageFile("Images/reflect.rgb")),
138        osg::Vec3(0.0f,0.0f,0.0f));
[13574]139
[1697]140    osg::Billboard* x_arrow = new osg::Billboard();
141    x_arrow->setMode(osg::Billboard::AXIAL_ROT);
142    x_arrow->setAxis(osg::Vec3(1.0f,0.0f,0.0f));
143    x_arrow->setNormal(osg::Vec3(0.0f,-1.0f,0.0f));
144    x_arrow->addDrawable(
145       createSquare(osg::Vec3(-0.5f,0.0f,-0.5f),osg::Vec3(1.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f),osgDB::readImageFile("Cubemap_axis/posx.png")),
146       osg::Vec3(5.0f,0.0f,0.0f));
147
148    osg::Billboard* y_arrow = new osg::Billboard();
149    y_arrow->setMode(osg::Billboard::AXIAL_ROT);
150    y_arrow->setAxis(osg::Vec3(0.0f,1.0f,0.0f));
151    y_arrow->setNormal(osg::Vec3(1.0f,0.0f,0.0f));
152    y_arrow->addDrawable(
153        createSquare(osg::Vec3(0.0f,-0.5f,-0.5f),osg::Vec3(0.0f,1.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f),osgDB::readImageFile("Cubemap_axis/posy.png")),
154        osg::Vec3(0.0f,5.0f,0.0f));
155
156    osg::Billboard* z_arrow = new osg::Billboard();
157    z_arrow->setMode(osg::Billboard::AXIAL_ROT);
158    z_arrow->setAxis(osg::Vec3(0.0f,0.0f,1.0f));
159    z_arrow->setNormal(osg::Vec3(0.0f,-1.0f,0.0f));
160    z_arrow->addDrawable(
161        createSquare(osg::Vec3(-0.5f,0.0f,-0.5f),osg::Vec3(1.0f,0.0f,0.0f),osg::Vec3(0.0f,0.0f,1.0f),osgDB::readImageFile("Cubemap_axis/posz.png")),
162        osg::Vec3(0.0f,0.0f,5.0f));
163
164
165
166    osg::Geode* axis = new osg::Geode();
167    axis->addDrawable(createAxis(osg::Vec3(0.0f,0.0f,0.0f),osg::Vec3(5.0f,0.0f,0.0f),osg::Vec3(0.0f,5.0f,0.0f),osg::Vec3(0.0f,0.0f,5.0f)));
168
169
170    root->addChild(center);
171    root->addChild(x_arrow);
172    root->addChild(y_arrow);
173    root->addChild(z_arrow);
174    root->addChild(axis);
175
176    return root;
177}
178
[5911]179int main(int, char**)
[1697]180{
[5911]181    // construct the viewer
182    osgViewer::Viewer viewer;
[13574]183
[1697]184    // set the scene to render
[5911]185    viewer.setSceneData(createModel());
[1697]186
[5911]187    // run the viewers frame loop
188    return viewer.run();
[1697]189}
Note: See TracBrowser for help on using the browser.