- sgVec3 center;
- calc_center_point( nodes, pnt_i, center );
- // cout << center[0] << "," << center[1] << "," << center[2] << endl;
-
-
- // find a vector perpendicular to the normal.
- sgVec3 perp1;
- if ( !vertical ) {
- // normal isn't vertical so we can use up as our first vector
- sgNormalizeVec3( perp1, up );
- } else {
- // normal is vertical so we have to work a bit harder to
- // determine our first vector
- sgVec3 pt1, pt2;
- sgSetVec3( pt1, nodes[pnt_i[0]][0], nodes[pnt_i[0]][1],
- nodes[pnt_i[0]][2] );
- sgSetVec3( pt2, nodes[pnt_i[1]][0], nodes[pnt_i[1]][1],
- nodes[pnt_i[1]][2] );
-
- sgSubVec3( perp1, pt2, pt1 );
- sgNormalizeVec3( perp1 );
- }
-
- ssgVertexArray *vl = new ssgVertexArray( 3 * pnt_i.size() );
- ssgNormalArray *nl = new ssgNormalArray( 3 * pnt_i.size() );
- ssgColourArray *cl = new ssgColourArray( 3 * pnt_i.size() );
-
- unsigned int i;
- sgVec3 pt, normal;
- for ( i = 0; i < pnt_i.size(); ++i ) {
- sgSetVec3( pt, nodes[pnt_i[i]][0], nodes[pnt_i[i]][1],
- nodes[pnt_i[i]][2] );
- sgSubVec3( pt, center );
- sgSetVec3( normal, normals[nml_i[i]][0], normals[nml_i[i]][1],
- normals[nml_i[i]][2] );
-
- // calculate a vector perpendicular to dir and up
- sgVec3 perp2;
- sgVectorProductVec3( perp2, normal, perp1 );
-
- // front face
- sgVec3 tmp3;
- sgCopyVec3( tmp3, pt );
- vl->add( tmp3 );
- sgAddVec3( tmp3, perp1 );
- vl->add( tmp3 );
- sgAddVec3( tmp3, perp2 );
- vl->add( tmp3 );
- // sgSubVec3( tmp3, perp1 );
- // vl->add( tmp3 );
-
- nl->add( normal );
- nl->add( normal );
- nl->add( normal );
- // nl->add( normal );
-
- sgVec4 color;
- sgSetVec4( color, 1.0, 1.0, 1.0, 1.0 );
- cl->add( color );
- sgSetVec4( color, 1.0, 1.0, 1.0, 0.0 );
- cl->add( color );
- cl->add( color );
- // cl->add( color );
- }
-
- ssgLeaf *leaf =
- new ssgVtxTable ( GL_TRIANGLES, vl, nl, NULL, cl );
-
- if ( mat != NULL ) {
- leaf->setState( mat->get_state() );
- } else {
- SG_LOG( SG_TERRAIN, SG_ALERT, "Warning: material = NULL" );
- }
-
- // put an LOD on each lighting component
- ssgRangeSelector *lod = new ssgRangeSelector;
- lod->setRange( 0, SG_ZERO );
- lod->setRange( 1, 20000 );
- lod->addKid( leaf );
-
- // create the transformation.
- sgCoord coord;
- sgSetCoord( &coord, center[0], center[1], center[2], 0.0, 0.0, 0.0 );
- ssgTransform *trans = new ssgTransform;
- trans->setTransform( &coord );
- trans->addKid( lod );
-
- return trans;
+ osg::PointSprite* pointSprite = new osg::PointSprite;
+ _pointSpriteStateSet->setTextureAttributeAndModes(0, pointSprite,
+ osg::StateAttribute::ON);
+ osg::Texture2D* texture = gen_standard_light_sprite();
+ _pointSpriteStateSet->setTextureAttribute(0, texture);
+ _pointSpriteStateSet->setTextureMode(0, GL_TEXTURE_2D,
+ osg::StateAttribute::ON);
+ osg::TexEnv* texEnv = new osg::TexEnv;
+ texEnv->setMode(osg::TexEnv::MODULATE);
+ _pointSpriteStateSet->setTextureAttribute(0, texEnv);
+
+ _distanceAttenuationStateSet->setAttributeAndModes(point);