root/OpenSceneGraph/trunk/examples/osghangglide/trees.cpp @ 1697

Revision 1697, 10.0 kB (checked in by robert, 12 years ago)

Ported osgGLUT based src/Demos across to being osgProducer based, and placed
them in the new examples/ directory.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <stdlib.h>
2
3#include <osg/Billboard>
4#include <osg/Group>
5#include <osg/Geode>
6#include <osg/Geometry>
7#include <osg/Texture2D>
8#include <osg/TexEnv>
9#include <osg/BlendFunc>
10#include <osg/AlphaFunc>
11
12#include <osgDB/ReadFile>
13
14#include "hat.h"
15
16#ifdef _MSC_VER
17#pragma warning( disable : 4244 )
18#pragma warning( disable : 4305 )
19#endif
20
21using namespace osg;
22
23#define sqr(x)  ((x)*(x))
24
25extern void getDatabaseCenterRadius( float dbcenter[3], float *dbradius );
26
27static float dbcenter[3], dbradius;
28
29static struct _tree
30{
31    int n;
32    float x, y, z;
33    float w, h;
34}
35
36
37trees[] =
38{
39    {    0,  -0.4769,  -0.8972,  -0.4011,   0.2000,   0.1200 },
40    {    1,  -0.2543,  -0.9117,  -0.3873,   0.2000,   0.1200 },
41    {    2,  -0.0424,  -0.8538,  -0.3728,   0.2000,   0.1200 },
42    {    3,   0.1590,  -0.8827,  -0.3594,   0.2000,   0.1200 },
43    {    4,  -0.4981,  -1.0853,  -0.4016,   0.3500,   0.1200 },
44    {    5,  -0.5405,  -1.2590,  -0.4050,   0.2000,   0.1200 },
45    {    6,  -0.5723,  -1.5339,  -0.4152,   0.2000,   0.1200 },
46    {    7,  -0.6252,  -1.8667,  -0.4280,   0.2000,   0.1200 },
47    {    8,  -0.5617,  -2.1851,  -0.4309,   0.2000,   0.1200 },
48    {    9,  -0.5087,  -2.4166,  -0.4215,   0.2000,   0.1200 },
49    {   10,  -0.4345,  -2.3443,  -0.4214,   0.2000,   0.1200 },
50    {   11,  -3.0308,  -1.5484,  -0.4876,   0.2000,   0.1200 },
51    {   12,  -3.0202,  -1.6497,  -0.4963,   0.2000,   0.1200 },
52    {   13,  -2.9355,  -1.8378,  -0.4969,   0.2000,   0.1200 },
53    {   14,  -0.6040,  -2.0259,  -0.4300,   0.2000,   0.1200 },
54    {   15,  -0.5442,  -1.3442,  -0.4080,   0.1000,   0.1200 },
55    {   16,  -0.5639,  -1.6885,  -0.4201,   0.1000,   0.1200 },
56    {   17,   0.9246,   3.4835,   0.5898,   0.2500,   0.1000 },
57    {   18,   0.0787,   3.8687,   0.3329,   0.2500,   0.1200 },
58    {   19,   0.2885,   3.7130,   0.4047,   0.2500,   0.1200 },
59    {   20,   0.2033,   3.6228,   0.3704,   0.2500,   0.1200 },
60    {   21,  -0.2098,   3.9015,   0.2327,   0.2500,   0.1200 },
61    {   22,  -0.3738,   3.7376,   0.1722,   0.2500,   0.1200 },
62    {   23,  -0.2557,   3.6064,   0.1989,   0.2500,   0.1200 },
63    {   24,   0.0590,   3.7294,   0.3210,   0.2500,   0.1200 },
64    {   25,  -0.4721,   3.8851,   0.1525,   0.2500,   0.1200 },
65    {   26,   0.9639,   3.2048,   0.5868,   0.1200,   0.0800 },
66    {   27,   0.7082,  -1.0409,  -0.3221,   0.1000,   0.1000 },
67    {   28,  -0.2426,  -2.3442,  -0.4150,   0.1000,   0.1380 },
68    {   29,  -0.1770,  -2.4179,  -0.4095,   0.1000,   0.1580 },
69    {   30,  -0.0852,  -2.5327,  -0.4056,   0.1000,   0.1130 },
70    {   31,  -0.0131,  -2.6065,  -0.4031,   0.1000,   0.1150 },
71    {   32,   0.0787,  -2.6638,  -0.4012,   0.1000,   0.1510 },
72    {   33,   0.1049,  -2.7622,  -0.3964,   0.1000,   0.1270 },
73    {   34,   0.1770,  -2.8687,  -0.3953,   0.1000,   0.1100 },
74    {   35,   0.3213,  -2.9507,  -0.3974,   0.1000,   0.1190 },
75    {   36,   0.4065,  -3.0163,  -0.4014,   0.1000,   0.1120 },
76    {   37,   0.3738,  -3.1802,  -0.4025,   0.1000,   0.1860 },
77    {   38,   0.5508,  -3.2048,  -0.3966,   0.1000,   0.1490 },
78    {   39,   0.5836,  -3.3031,  -0.3900,   0.1000,   0.1670 },
79    {   40,  -0.3082,  -2.7212,  -0.3933,   0.1000,   0.1840 },
80    {   41,  -0.1967,  -2.6474,  -0.4017,   0.1000,   0.1600 },
81    {   42,  -0.1180,  -2.7458,  -0.3980,   0.1000,   0.1250 },
82    {   43,  -0.3344,  -2.8359,  -0.3964,   0.1000,   0.1430 },
83    {   44,  -0.2492,  -2.8933,  -0.3838,   0.1000,   0.1890 },
84    {   45,  -0.1246,  -3.0491,  -0.3768,   0.1000,   0.1830 },
85    {   46,   0.0000,  -3.0818,  -0.3696,   0.1000,   0.1370 },
86    {   47,  -0.2295,  -3.0409,  -0.3706,   0.1000,   0.1660 },
87    {   48,  -1.3245,   2.6638,   0.0733,   0.0500,   0.0500 },
88    {   49,   2.2425,  -1.5491,  -0.2821,   0.2300,   0.1200 },
89    {   50,   0.2164,  -2.1311,  -0.4000,   0.1000,   0.0690 },
90    {   51,   0.2885,  -2.2130,  -0.4000,   0.1000,   0.0790 },
91    {   52,   0.3606,  -2.2786,  -0.4000,   0.1000,   0.0565 },
92    {   53,   0.4328,  -2.3442,  -0.4000,   0.1000,   0.0575 },
93    {   54,   0.5246,  -2.4343,  -0.4086,   0.1000,   0.0755 },
94    {   55,   0.6360,  -2.5245,  -0.4079,   0.1000,   0.0635 },
95    {   56,   0.7541,  -2.4261,  -0.4007,   0.1000,   0.0550 },
96    {   57,   0.7934,  -2.2786,  -0.3944,   0.1000,   0.0595 },
97    {   58,   1.0295,  -2.2868,  -0.3837,   0.1000,   0.0560 },
98    {   59,   0.8459,  -2.6474,  -0.4051,   0.1000,   0.0930 },
99    {   60,   1.0426,  -2.6884,  -0.4001,   0.1000,   0.0745 },
100    {   61,   1.1475,  -2.7458,  -0.3883,   0.1000,   0.0835 },
101    {   62,  -0.1967,  -1.4180,  -0.3988,   0.1000,   0.0920 },
102    {   63,  -0.0131,  -1.2704,  -0.3856,   0.1000,   0.0690 },
103    {   64,   0.2098,  -1.2049,  -0.3664,   0.1000,   0.0790 },
104    {   65,   0.3410,  -1.3196,  -0.3652,   0.1000,   0.0565 },
105    {   66,   0.5705,  -1.2704,  -0.3467,   0.1000,   0.0575 },
106    {   67,   0.6360,  -1.4344,  -0.3532,   0.1000,   0.0755 },
107    {   68,   0.9246,  -1.4180,  -0.3329,   0.1000,   0.0635 },
108    {   69,   1.0623,  -1.3360,  -0.3183,   0.1000,   0.0550 },
109    {   70,   1.2393,  -1.3934,  -0.3103,   0.1000,   0.0595 },
110    {   71,   1.3639,  -1.4753,  -0.3079,   0.1000,   0.0560 },
111    {   72,   1.4819,  -1.5983,  -0.3210,   0.1000,   0.0930 },
112    {   73,   1.7835,  -1.5819,  -0.3065,   0.1000,   0.0745 },
113    {   74,   1.9343,  -2.1065,  -0.3307,   0.1000,   0.0835 },
114    {   75,   2.1245,  -2.3196,  -0.3314,   0.1000,   0.0920 },
115    {   76,   2.2556,  -2.3032,  -0.3230,   0.1000,   0.0800 },
116    {   77,   2.4196,  -2.3688,  -0.3165,   0.1000,   0.0625 },
117    {   78,   1.7835,  -2.5327,  -0.3543,   0.1000,   0.0715 },
118    {   79,   1.7180,  -2.8933,  -0.3742,   0.1000,   0.0945 },
119    {   80,   1.9343,  -3.0409,  -0.3727,   0.1000,   0.0915 },
120    {   81,   2.4524,  -3.4671,  -0.3900,   0.1000,   0.0685 },
121    {   82,   2.4786,  -2.8851,  -0.3538,   0.1000,   0.0830 },
122    {   83,   2.3343,  -2.6228,  -0.3420,   0.1000,   0.0830 },
123    {   84,   2.8130,  -2.0737,  -0.2706,   0.1000,   0.0890 },
124    {   85,   2.6360,  -1.8278,  -0.2661,   0.1000,   0.0975 },
125    {   86,   2.3958,  -1.7130,  -0.2774,   0.2000,   0.1555 },
126    {   87,   2.2688,  -1.2868,  -0.2646,   0.1000,   0.0835 },
127    {   88,   2.4196,  -1.1147,  -0.2486,   0.1000,   0.0770 },
128    {   89,   2.7802,  -2.3933,  -0.3017,   0.1000,   0.0655 },
129    {   90,   3.0163,  -2.4179,  -0.2905,   0.1000,   0.0725 },
130    {   91,   2.9310,  -2.2540,  -0.2798,   0.1000,   0.0910 },
131    {   92,   2.6622,  -2.0983,  -0.2823,   0.1000,   0.0680 },
132    {   93,   2.3147,  -1.9753,  -0.2973,   0.1000,   0.0620 },
133    {   94,   2.1573,  -1.8770,  -0.3013,   0.1000,   0.0525 },
134    {   95,   2.0196,  -1.7868,  -0.3044,   0.1000,   0.0970 },
135    {   96,   2.7802,  -3.3031,  -0.3900,   0.1000,   0.0510 },
136    {   97,   2.8589,  -3.1720,  -0.3900,   0.1000,   0.0755 },
137    {   98,   3.0163,  -2.8114,  -0.3383,   0.1000,   0.0835 },
138    {   99,   3.5081,  -2.4179,  -0.2558,   0.1000,   0.0770 },
139    {  100,   3.5277,  -2.3196,  -0.2366,   0.1000,   0.0765 },
140    {  101,   3.6654,  -2.5819,  -0.2566,   0.1000,   0.0805 },
141    {  102,   3.7179,  -2.7622,  -0.2706,   0.1000,   0.0980 },
142    {  103,   3.7769,  -2.4671,  -0.2339,   0.1000,   0.0640 },
143    {  104,   3.3441,  -2.4671,  -0.2693,   0.1000,   0.0940 },
144    { -1, 0, 0, 0, 0, 0 },
145};
146
147static Geometry *makeTree( _tree *tree, StateSet *dstate )
148{
149    float vv[][3] =
150    {
151        { -tree->w/2.0, 0.0, 0.0 },
152        {  tree->w/2.0,  0.0, 0.0 },
153        {  tree->w/2.0, 0.0, 2 * tree->h },
154        { -tree->w/2.0, 0.0, 2 * tree->h },
155    };
156
157    Vec3Array& v = *(new Vec3Array(4));
158    Vec2Array& t = *(new Vec2Array(4));
159    Vec4Array& l = *(new Vec4Array(1));
160
161    int   i;
162
163    l[0][0] = l[0][1] = l[0][2] = l[0][3] = 1;
164
165    for( i = 0; i < 4; i++ )
166    {
167        v[i][0] = vv[i][0];
168        v[i][1] = vv[i][1];
169        v[i][2] = vv[i][2];
170    }
171
172    t[0][0] = 0.0; t[0][1] = 0.0;
173    t[1][0] = 1.0; t[1][1] = 0.0;
174    t[2][0] = 1.0; t[2][1] = 1.0;
175    t[3][0] = 0.0; t[3][1] = 1.0;
176
177    Geometry *geom = new Geometry;
178
179    geom->setVertexArray( &v );
180
181    geom->setTexCoordArray( 0, &t );
182
183    geom->setColorArray( &l );
184    geom->setColorBinding( Geometry::BIND_OVERALL );
185
186    geom->addPrimitiveSet( new DrawArrays(PrimitiveSet::QUADS,0,4) );
187
188    geom->setStateSet( dstate );
189
190    return geom;
191}
192
193
194static float ttx, tty;
195
196static int ct( const void *a, const void *b )
197{
198    _tree *ta = (_tree *)a;
199    _tree *tb = (_tree *)b;
200
201    float da = sqrtf( sqr(ta->x - ttx) + sqr(ta->y - tty) );
202    float db = sqrtf( sqr(tb->x - ttx) + sqr(tb->y - tty) );
203
204    if( da < db )
205        return -1;
206    else
207        return 1;
208}
209
210
211Node *makeTrees( void )
212{
213    Group *group = new Group;
214    int i;
215
216    getDatabaseCenterRadius( dbcenter, &dbradius );
217    struct _tree  *t;
218
219    Texture2D *tex = new Texture2D;
220    tex->setImage(osgDB::readImageFile("Images/tree0.rgba"));
221
222    StateSet *dstate = new StateSet;
223   
224    dstate->setTextureAttributeAndModes(0, tex, StateAttribute::ON );
225    dstate->setTextureAttribute(0, new TexEnv );
226
227    dstate->setAttributeAndModes( new BlendFunc, StateAttribute::ON );
228
229    AlphaFunc* alphaFunc = new AlphaFunc;
230    alphaFunc->setFunction(AlphaFunc::GEQUAL,0.05f);
231    dstate->setAttributeAndModes( alphaFunc, StateAttribute::ON );
232
233    dstate->setMode( GL_LIGHTING, StateAttribute::OFF );
234   
235    dstate->setRenderingHint( StateSet::TRANSPARENT_BIN );
236
237    int tt[] = { 15, 30, 45, 58, 72, 75, 93, 96, 105, -1 };
238    int *ttp = tt;
239
240    i = 0;
241    while( i < 105 )
242    {
243        ttx = trees[i].x;
244        tty = trees[i].y;
245        qsort( &trees[i], 105 - i, sizeof( _tree ), ct );
246
247        i += *ttp;
248        ttp++;
249    }
250
251    t = trees;
252    i = 0;
253    ttp = tt;
254    while( *ttp != -1 )
255    {
256        Billboard *bb = new Billboard;
257        //int starti = i;
258
259        for( ; i < (*ttp); i++ )
260        {
261            t->x -= 0.3f;
262            float  h = Hat(t->x, t->y, t->z );
263            Vec3 pos( t->x, t->y, t->z-h );
264            Geometry *geom = makeTree( t, dstate );
265            bb->addDrawable( geom, pos );
266            t++;
267        }
268        group->addChild( bb );
269        ttp++;
270    }
271
272    return group;
273}
Note: See TracBrowser for help on using the browser.