292 lines
11 KiB
C++
292 lines
11 KiB
C++
/* OpenSceneGraph example, osghangglide.
|
|
*
|
|
* 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 <stdlib.h>
|
|
|
|
#include <osg/Billboard>
|
|
#include <osg/Group>
|
|
#include <osg/Geode>
|
|
#include <osg/Geometry>
|
|
#include <osg/Texture2D>
|
|
#include <osg/TexEnv>
|
|
#include <osg/BlendFunc>
|
|
#include <osg/AlphaFunc>
|
|
|
|
#include <osgDB/ReadFile>
|
|
|
|
#include "hat.h"
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning( disable : 4244 )
|
|
#pragma warning( disable : 4305 )
|
|
#endif
|
|
|
|
using namespace osg;
|
|
|
|
#define sqr(x) ((x)*(x))
|
|
|
|
extern void getDatabaseCenterRadius( float dbcenter[3], float *dbradius );
|
|
|
|
static float dbcenter[3], dbradius;
|
|
|
|
static struct _tree
|
|
{
|
|
int n;
|
|
float x, y, z;
|
|
float w, h;
|
|
}
|
|
|
|
|
|
trees[] =
|
|
{
|
|
{ 0, -0.4769, -0.8972, -0.4011, 0.2000, 0.1200 },
|
|
{ 1, -0.2543, -0.9117, -0.3873, 0.2000, 0.1200 },
|
|
{ 2, -0.0424, -0.8538, -0.3728, 0.2000, 0.1200 },
|
|
{ 3, 0.1590, -0.8827, -0.3594, 0.2000, 0.1200 },
|
|
{ 4, -0.4981, -1.0853, -0.4016, 0.3500, 0.1200 },
|
|
{ 5, -0.5405, -1.2590, -0.4050, 0.2000, 0.1200 },
|
|
{ 6, -0.5723, -1.5339, -0.4152, 0.2000, 0.1200 },
|
|
{ 7, -0.6252, -1.8667, -0.4280, 0.2000, 0.1200 },
|
|
{ 8, -0.5617, -2.1851, -0.4309, 0.2000, 0.1200 },
|
|
{ 9, -0.5087, -2.4166, -0.4215, 0.2000, 0.1200 },
|
|
{ 10, -0.4345, -2.3443, -0.4214, 0.2000, 0.1200 },
|
|
{ 11, -3.0308, -1.5484, -0.4876, 0.2000, 0.1200 },
|
|
{ 12, -3.0202, -1.6497, -0.4963, 0.2000, 0.1200 },
|
|
{ 13, -2.9355, -1.8378, -0.4969, 0.2000, 0.1200 },
|
|
{ 14, -0.6040, -2.0259, -0.4300, 0.2000, 0.1200 },
|
|
{ 15, -0.5442, -1.3442, -0.4080, 0.1000, 0.1200 },
|
|
{ 16, -0.5639, -1.6885, -0.4201, 0.1000, 0.1200 },
|
|
{ 17, 0.9246, 3.4835, 0.5898, 0.2500, 0.1000 },
|
|
{ 18, 0.0787, 3.8687, 0.3329, 0.2500, 0.1200 },
|
|
{ 19, 0.2885, 3.7130, 0.4047, 0.2500, 0.1200 },
|
|
{ 20, 0.2033, 3.6228, 0.3704, 0.2500, 0.1200 },
|
|
{ 21, -0.2098, 3.9015, 0.2327, 0.2500, 0.1200 },
|
|
{ 22, -0.3738, 3.7376, 0.1722, 0.2500, 0.1200 },
|
|
{ 23, -0.2557, 3.6064, 0.1989, 0.2500, 0.1200 },
|
|
{ 24, 0.0590, 3.7294, 0.3210, 0.2500, 0.1200 },
|
|
{ 25, -0.4721, 3.8851, 0.1525, 0.2500, 0.1200 },
|
|
{ 26, 0.9639, 3.2048, 0.5868, 0.1200, 0.0800 },
|
|
{ 27, 0.7082, -1.0409, -0.3221, 0.1000, 0.1000 },
|
|
{ 28, -0.2426, -2.3442, -0.4150, 0.1000, 0.1380 },
|
|
{ 29, -0.1770, -2.4179, -0.4095, 0.1000, 0.1580 },
|
|
{ 30, -0.0852, -2.5327, -0.4056, 0.1000, 0.1130 },
|
|
{ 31, -0.0131, -2.6065, -0.4031, 0.1000, 0.1150 },
|
|
{ 32, 0.0787, -2.6638, -0.4012, 0.1000, 0.1510 },
|
|
{ 33, 0.1049, -2.7622, -0.3964, 0.1000, 0.1270 },
|
|
{ 34, 0.1770, -2.8687, -0.3953, 0.1000, 0.1100 },
|
|
{ 35, 0.3213, -2.9507, -0.3974, 0.1000, 0.1190 },
|
|
{ 36, 0.4065, -3.0163, -0.4014, 0.1000, 0.1120 },
|
|
{ 37, 0.3738, -3.1802, -0.4025, 0.1000, 0.1860 },
|
|
{ 38, 0.5508, -3.2048, -0.3966, 0.1000, 0.1490 },
|
|
{ 39, 0.5836, -3.3031, -0.3900, 0.1000, 0.1670 },
|
|
{ 40, -0.3082, -2.7212, -0.3933, 0.1000, 0.1840 },
|
|
{ 41, -0.1967, -2.6474, -0.4017, 0.1000, 0.1600 },
|
|
{ 42, -0.1180, -2.7458, -0.3980, 0.1000, 0.1250 },
|
|
{ 43, -0.3344, -2.8359, -0.3964, 0.1000, 0.1430 },
|
|
{ 44, -0.2492, -2.8933, -0.3838, 0.1000, 0.1890 },
|
|
{ 45, -0.1246, -3.0491, -0.3768, 0.1000, 0.1830 },
|
|
{ 46, 0.0000, -3.0818, -0.3696, 0.1000, 0.1370 },
|
|
{ 47, -0.2295, -3.0409, -0.3706, 0.1000, 0.1660 },
|
|
{ 48, -1.3245, 2.6638, 0.0733, 0.0500, 0.0500 },
|
|
{ 49, 2.2425, -1.5491, -0.2821, 0.2300, 0.1200 },
|
|
{ 50, 0.2164, -2.1311, -0.4000, 0.1000, 0.0690 },
|
|
{ 51, 0.2885, -2.2130, -0.4000, 0.1000, 0.0790 },
|
|
{ 52, 0.3606, -2.2786, -0.4000, 0.1000, 0.0565 },
|
|
{ 53, 0.4328, -2.3442, -0.4000, 0.1000, 0.0575 },
|
|
{ 54, 0.5246, -2.4343, -0.4086, 0.1000, 0.0755 },
|
|
{ 55, 0.6360, -2.5245, -0.4079, 0.1000, 0.0635 },
|
|
{ 56, 0.7541, -2.4261, -0.4007, 0.1000, 0.0550 },
|
|
{ 57, 0.7934, -2.2786, -0.3944, 0.1000, 0.0595 },
|
|
{ 58, 1.0295, -2.2868, -0.3837, 0.1000, 0.0560 },
|
|
{ 59, 0.8459, -2.6474, -0.4051, 0.1000, 0.0930 },
|
|
{ 60, 1.0426, -2.6884, -0.4001, 0.1000, 0.0745 },
|
|
{ 61, 1.1475, -2.7458, -0.3883, 0.1000, 0.0835 },
|
|
{ 62, -0.1967, -1.4180, -0.3988, 0.1000, 0.0920 },
|
|
{ 63, -0.0131, -1.2704, -0.3856, 0.1000, 0.0690 },
|
|
{ 64, 0.2098, -1.2049, -0.3664, 0.1000, 0.0790 },
|
|
{ 65, 0.3410, -1.3196, -0.3652, 0.1000, 0.0565 },
|
|
{ 66, 0.5705, -1.2704, -0.3467, 0.1000, 0.0575 },
|
|
{ 67, 0.6360, -1.4344, -0.3532, 0.1000, 0.0755 },
|
|
{ 68, 0.9246, -1.4180, -0.3329, 0.1000, 0.0635 },
|
|
{ 69, 1.0623, -1.3360, -0.3183, 0.1000, 0.0550 },
|
|
{ 70, 1.2393, -1.3934, -0.3103, 0.1000, 0.0595 },
|
|
{ 71, 1.3639, -1.4753, -0.3079, 0.1000, 0.0560 },
|
|
{ 72, 1.4819, -1.5983, -0.3210, 0.1000, 0.0930 },
|
|
{ 73, 1.7835, -1.5819, -0.3065, 0.1000, 0.0745 },
|
|
{ 74, 1.9343, -2.1065, -0.3307, 0.1000, 0.0835 },
|
|
{ 75, 2.1245, -2.3196, -0.3314, 0.1000, 0.0920 },
|
|
{ 76, 2.2556, -2.3032, -0.3230, 0.1000, 0.0800 },
|
|
{ 77, 2.4196, -2.3688, -0.3165, 0.1000, 0.0625 },
|
|
{ 78, 1.7835, -2.5327, -0.3543, 0.1000, 0.0715 },
|
|
{ 79, 1.7180, -2.8933, -0.3742, 0.1000, 0.0945 },
|
|
{ 80, 1.9343, -3.0409, -0.3727, 0.1000, 0.0915 },
|
|
{ 81, 2.4524, -3.4671, -0.3900, 0.1000, 0.0685 },
|
|
{ 82, 2.4786, -2.8851, -0.3538, 0.1000, 0.0830 },
|
|
{ 83, 2.3343, -2.6228, -0.3420, 0.1000, 0.0830 },
|
|
{ 84, 2.8130, -2.0737, -0.2706, 0.1000, 0.0890 },
|
|
{ 85, 2.6360, -1.8278, -0.2661, 0.1000, 0.0975 },
|
|
{ 86, 2.3958, -1.7130, -0.2774, 0.2000, 0.1555 },
|
|
{ 87, 2.2688, -1.2868, -0.2646, 0.1000, 0.0835 },
|
|
{ 88, 2.4196, -1.1147, -0.2486, 0.1000, 0.0770 },
|
|
{ 89, 2.7802, -2.3933, -0.3017, 0.1000, 0.0655 },
|
|
{ 90, 3.0163, -2.4179, -0.2905, 0.1000, 0.0725 },
|
|
{ 91, 2.9310, -2.2540, -0.2798, 0.1000, 0.0910 },
|
|
{ 92, 2.6622, -2.0983, -0.2823, 0.1000, 0.0680 },
|
|
{ 93, 2.3147, -1.9753, -0.2973, 0.1000, 0.0620 },
|
|
{ 94, 2.1573, -1.8770, -0.3013, 0.1000, 0.0525 },
|
|
{ 95, 2.0196, -1.7868, -0.3044, 0.1000, 0.0970 },
|
|
{ 96, 2.7802, -3.3031, -0.3900, 0.1000, 0.0510 },
|
|
{ 97, 2.8589, -3.1720, -0.3900, 0.1000, 0.0755 },
|
|
{ 98, 3.0163, -2.8114, -0.3383, 0.1000, 0.0835 },
|
|
{ 99, 3.5081, -2.4179, -0.2558, 0.1000, 0.0770 },
|
|
{ 100, 3.5277, -2.3196, -0.2366, 0.1000, 0.0765 },
|
|
{ 101, 3.6654, -2.5819, -0.2566, 0.1000, 0.0805 },
|
|
{ 102, 3.7179, -2.7622, -0.2706, 0.1000, 0.0980 },
|
|
{ 103, 3.7769, -2.4671, -0.2339, 0.1000, 0.0640 },
|
|
{ 104, 3.3441, -2.4671, -0.2693, 0.1000, 0.0940 },
|
|
{ -1, 0, 0, 0, 0, 0 },
|
|
};
|
|
|
|
static Geometry *makeTree( _tree *tree, StateSet *dstate )
|
|
{
|
|
float vv[][3] =
|
|
{
|
|
{ -tree->w/2.0f, 0.0f, 0.0f },
|
|
{ tree->w/2.0f, 0.0f, 0.0f },
|
|
{ tree->w/2.0f, 0.0f, 2.0f * tree->h },
|
|
{ -tree->w/2.0f, 0.0f, 2.0f * tree->h },
|
|
};
|
|
|
|
Vec3Array& v = *(new Vec3Array(4));
|
|
Vec2Array& t = *(new Vec2Array(4));
|
|
Vec4Array& l = *(new Vec4Array(1));
|
|
|
|
int i;
|
|
|
|
l[0][0] = l[0][1] = l[0][2] = l[0][3] = 1;
|
|
|
|
for( i = 0; i < 4; i++ )
|
|
{
|
|
v[i][0] = vv[i][0];
|
|
v[i][1] = vv[i][1];
|
|
v[i][2] = vv[i][2];
|
|
}
|
|
|
|
t[0][0] = 0.0; t[0][1] = 0.0;
|
|
t[1][0] = 1.0; t[1][1] = 0.0;
|
|
t[2][0] = 1.0; t[2][1] = 1.0;
|
|
t[3][0] = 0.0; t[3][1] = 1.0;
|
|
|
|
Geometry *geom = new Geometry;
|
|
|
|
geom->setVertexArray( &v );
|
|
|
|
geom->setTexCoordArray( 0, &t );
|
|
|
|
geom->setColorArray( &l );
|
|
geom->setColorBinding( Geometry::BIND_OVERALL );
|
|
|
|
geom->addPrimitiveSet( new DrawArrays(PrimitiveSet::QUADS,0,4) );
|
|
|
|
geom->setStateSet( dstate );
|
|
|
|
return geom;
|
|
}
|
|
|
|
|
|
static float ttx, tty;
|
|
|
|
static int ct( const void *a, const void *b )
|
|
{
|
|
_tree *ta = (_tree *)a;
|
|
_tree *tb = (_tree *)b;
|
|
|
|
float da = sqrtf( sqr(ta->x - ttx) + sqr(ta->y - tty) );
|
|
float db = sqrtf( sqr(tb->x - ttx) + sqr(tb->y - tty) );
|
|
|
|
if( da < db )
|
|
return -1;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
|
|
Node *makeTrees( void )
|
|
{
|
|
Group *group = new Group;
|
|
int i;
|
|
|
|
getDatabaseCenterRadius( dbcenter, &dbradius );
|
|
struct _tree *t;
|
|
|
|
Texture2D *tex = new Texture2D;
|
|
tex->setImage(osgDB::readImageFile("Images/tree0.rgba"));
|
|
|
|
StateSet *dstate = new StateSet;
|
|
|
|
dstate->setTextureAttributeAndModes(0, tex, StateAttribute::ON );
|
|
dstate->setTextureAttribute(0, new TexEnv );
|
|
|
|
dstate->setAttributeAndModes( new BlendFunc, StateAttribute::ON );
|
|
|
|
AlphaFunc* alphaFunc = new AlphaFunc;
|
|
alphaFunc->setFunction(AlphaFunc::GEQUAL,0.05f);
|
|
dstate->setAttributeAndModes( alphaFunc, StateAttribute::ON );
|
|
|
|
dstate->setMode( GL_LIGHTING, StateAttribute::OFF );
|
|
|
|
dstate->setRenderingHint( StateSet::TRANSPARENT_BIN );
|
|
|
|
int tt[] = { 15, 30, 45, 58, 72, 75, 93, 96, 105, -1 };
|
|
int *ttp = tt;
|
|
|
|
i = 0;
|
|
while( i < 105 )
|
|
{
|
|
ttx = trees[i].x;
|
|
tty = trees[i].y;
|
|
qsort( &trees[i], 105 - i, sizeof( _tree ), ct );
|
|
|
|
i += *ttp;
|
|
ttp++;
|
|
}
|
|
|
|
t = trees;
|
|
i = 0;
|
|
ttp = tt;
|
|
while( *ttp != -1 )
|
|
{
|
|
Billboard *bb = new Billboard;
|
|
//int starti = i;
|
|
|
|
for( ; i < (*ttp); i++ )
|
|
{
|
|
t->x -= 0.3f;
|
|
float h = Hat(t->x, t->y, t->z );
|
|
Vec3 pos( t->x, t->y, t->z-h );
|
|
Geometry *geom = makeTree( t, dstate );
|
|
bb->addDrawable( geom, pos );
|
|
t++;
|
|
}
|
|
group->addChild( bb );
|
|
ttp++;
|
|
}
|
|
|
|
return group;
|
|
}
|