//
// Written by Curtis Olson, started March 2002.
//
-// Copyright (C) 2002 Curtis L. Olson - curt@flightgear.org
+// Copyright (C) 2002 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#define _SG_PT_LIGHTS_HXX
-#ifndef __cplusplus
+#ifndef __cplusplus
# error This library requires C++
-#endif
-
+#endif
#include <simgear/compiler.h>
-#include STL_STRING
+#include <string>
#include <vector> // STL
-#include <plib/sg.h>
-#include <plib/ssg.h> // plib include
+#include <osg/Drawable>
+#include <osg/Node>
+#include <osg/Point>
#include <simgear/math/sg_types.hxx>
+#include <simgear/scene/material/matlib.hxx>
+#include <simgear/scene/util/SGSceneFeatures.hxx>
-SG_USING_STD(string);
-SG_USING_STD(vector);
-
-
-typedef vector < int > int_list;
-typedef int_list::iterator int_list_iterator;
-typedef int_list::const_iterator int_point_list_iterator;
-
-
-// Define the various supported light types
-typedef enum {
- SG_RWYLIGHT_TAXI = 0,
- SG_RWYLIGHT_VASI,
- SG_RWYLIGHT_EDGE,
- SG_RWYLIGHT_TOUCHDOWN,
- SG_RWYLIGHT_THRESHOLD,
- SG_RWYLIGHT_WHITE,
- SG_RWYLIGHT_RED,
- SG_RWYLIGHT_GREEN,
- SG_RWYLIGHT_YELLOW
-} sgPointLightType;
-
+#include "SGLightBin.hxx"
+#include "SGDirectionalLightBin.hxx"
-// Generate a directional light. This routines creates a
-// 'directional' light that can only be viewed from within 90 degrees
-// of the specified dir vector.
+namespace simgear
+{
+class Effect;
+}
-// To accomplish this, he routine creates a triangle with the 1st
-// point coincident with the specified pt and the 2nd and 3rd points
-// extending upward. The 1st point is created with an 'alpha' value
-// of 1 while the 2nd and 3rd points are created with an 'alpha' of
-// 0.0.
+// Specify the way we want to draw directional point lights (assuming the
+// appropriate extensions are available.)
-// If the triangle is drawn in glPolygonMode(GL_FRONT, GL_POINT) mode,
-// then two important things happen:
+inline void SGConfigureDirectionalLights( bool use_point_sprites,
+ bool enhanced_lighting,
+ bool distance_attenuation ) {
+ static SGSceneFeatures* sceneFeatures = SGSceneFeatures::instance();
+ sceneFeatures->setEnablePointSpriteLights(use_point_sprites);
+ sceneFeatures->setEnableDistanceAttenuationLights(distance_attenuation);
+}
-// 1) Only the 3 vertex points are drawn, the 2nd two with an alpha of
-// 0 so actually only the desired point is rendered.
+class SGLightFactory {
+public:
-// 2) since we are drawing a triangle, back face culling takes care of
-// eliminating this poing when the view angle relative to dir is
-// greater than 90 degrees.
+ static osg::Drawable*
+ getLightDrawable(const SGLightBin::Light& light);
-// The final piece of this puzzle is that if we now use environment
-// mapping on this point, via an appropriate texture we can then
-// control the intensity and color of the point based on the view
-// angle relative to 'dir' the optimal view direction of the light
-// (i.e. the direction the light is pointing.)
+ static osg::Drawable*
+ getLightDrawable(const SGDirectionalLightBin::Light& light);
-// Yes this get's to be long and convoluted. If you can suggest a
-// simpler way, please do! :-)
+ /**
+ * Return a drawable for a very simple point light that isn't
+ * distance scaled.
+ */
+ static osg::Drawable*
+ getLights(const SGLightBin& lights, unsigned inc = 1, float alphaOff = 0);
-ssgLeaf *sgMakeDirectionalLight( sgVec3 pt, sgVec3 dir, sgVec3 up );
+ static osg::Drawable*
+ getLights(const SGDirectionalLightBin& lights);
+ static osg::Drawable*
+ getVasi(const SGVec3f& up, const SGDirectionalLightBin& lights,
+ const SGVec4f& red, const SGVec4f& white);
-ssgBranch *sgMakeDirectionalLights( const point_list &nodes,
- const point_list &normals,
- const int_list &pnt_i,
- const int_list &nml_i,
- SGMaterialLib *matlib,
- const string &material,
- sgVec3 up );
+ static osg::Node*
+ getSequenced(const SGDirectionalLightBin& lights);
+ static osg::Node*
+ getOdal(const SGLightBin& lights);
+};
+simgear::Effect* getLightEffect(float size, const osg::Vec3& attenuation,
+ float minSize, float maxSize, bool directional);
#endif // _SG_PT_LIGHTS_HXX