]> git.mxchange.org Git - simgear.git/blobdiff - simgear/scene/tgdb/pt_lights.hxx
Only disable display lists if using VBOs.
[simgear.git] / simgear / scene / tgdb / pt_lights.hxx
index 2a2e4c01ce58f81c2fd8e24c37a8d4aa78668d5d..863328dc60bffafcd90500e4aca615bcc8e854e7 100644 (file)
@@ -2,7 +2,7 @@
 //
 // 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$
 
 
-#ifndef _PT_LIGHTS_HXX
-#define _PT_LIGHTS_HXX
+#ifndef _SG_PT_LIGHTS_HXX
+#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/SGReaderWriterOptions.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;
-
+#include "SGLightBin.hxx"
+#include "SGDirectionalLightBin.hxx"
 
-// Define the various supported light types
-typedef enum {
-    FG_RWYLIGHT_TAXI = 0,
-    FG_RWYLIGHT_VASI,
-    FG_RWYLIGHT_EDGE,
-    FG_RWYLIGHT_TOUCHDOWN,
-    FG_RWYLIGHT_THRESHOLD,
-    FG_RWYLIGHT_WHITE,
-    FG_RWYLIGHT_RED,
-    FG_RWYLIGHT_GREEN,
-    FG_RWYLIGHT_YELLOW
-} fgRunwayLightType;
+namespace simgear
+{
+class Effect;
+}
 
+// Specify the way we want to draw directional point lights (assuming the
+// appropriate extensions are available.)
 
-// Generate a directional light.  This routines creates a
-// 'directional' light that can only be viewed from within 90 degrees
-// of the specified dir vector.
+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);
+}
 
-// 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.
+class SGLightFactory {
+public:
 
-// If the triangle is drawn in glPolygonMode(GL_FRONT, GL_POINT) mode,
-// then two important things happen:
+  static osg::Drawable*
+  getLightDrawable(const SGLightBin::Light& light);
 
-// 1) Only the 3 vertex points are drawn, the 2nd two with an alpha of
-// 0 so actually only the desired point is rendered.
+  static osg::Drawable*
+  getLightDrawable(const SGDirectionalLightBin::Light& light);
 
-// 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.
+  /**
+   * 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);
 
-// 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*
+  getLights(const SGDirectionalLightBin& lights);
 
-// Yes this get's to be long and convoluted.  If you can suggest a
-// simpler way, please do! :-)
+  static osg::Drawable*
+  getVasi(const SGVec3f& up, const SGDirectionalLightBin& lights,
+          const SGVec4f& red, const SGVec4f& white);
 
-ssgLeaf *gen_directional_light( sgVec3 pt, sgVec3 dir, sgVec3 up );
+  static osg::Node*
+  getSequenced(const SGDirectionalLightBin& lights, const simgear::SGReaderWriterOptions* options);
 
+  static osg::Node*
+  getOdal(const SGLightBin& lights, const simgear::SGReaderWriterOptions* options);
 
-ssgBranch *gen_directional_lights( 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*
+  getHoldShort(const SGDirectionalLightBin& lights, const simgear::SGReaderWriterOptions* options);
 
+  static osg::Node*
+  getGuard(const SGDirectionalLightBin& lights, const simgear::SGReaderWriterOptions* options);
+};
 
-#endif // _PT_LIGHTS_HXX
+simgear::Effect* getLightEffect(float size, const osg::Vec3& attenuation,
+                                float minSize, float maxSize, bool directional,
+                                const simgear::SGReaderWriterOptions* options);
+#endif // _SG_PT_LIGHTS_HXX