00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VRS_SG_STATICLIGHTINGOPERATOR_H
00019 #define VRS_SG_STATICLIGHTINGOPERATOR_H
00020
00021 #include <vrs/visitor.h>
00022 #include <vrs/light.h>
00023 #include <vrs/polygonset.h>
00024 #include <vrs/transform.h>
00025 #include <vrs/container/array.h>
00026 #include <vrs/container/stack.h>
00027 #include <vrs/sg/scenegraphoperator.h>
00028 #include <vrs/opengl/shapematerialgl.h>
00029
00030 namespace VRS {
00031
00045 class VRS_CORE_API StaticLightingOperator : public SceneGraphOperator,
00046 public Visitor<Light>,
00047 public Visitor<PolygonSet>,
00048 public Visitor<ShapeMaterialGL>,
00049 public Visitor<Transform>,
00050 public Visitor<SceneThing>
00051 {
00052 public:
00054 StaticLightingOperator(bool removeLights = true) : removeLights_(removeLights) {}
00055
00057 virtual void optimizeScene(SO<SceneNode>& scene);
00059 virtual VisitorBase::VisitMode visit(Light* light, bool push);
00061 virtual VisitorBase::VisitMode visit(PolygonSet* shape, bool push);
00063 virtual VisitorBase::VisitMode visit(ShapeMaterialGL* material, bool push);
00065 virtual VisitorBase::VisitMode visit(Transform* transform, bool push);
00067 virtual VisitorBase::VisitMode visit(SceneThing* thing, bool push);
00068
00069 private:
00071 bool removeLights_;
00072
00074 SO<Array<SO<Light> > > lights_;
00076 SO<Array<Matrix> > lightTransforms_;
00078 SO<Array<SO<PolygonSet> > > shapes_;
00080 SO<Array<SO<ShapeMaterialGL> > > materials_;
00082 SO<Array<Matrix> > transforms_;
00083
00085 SO<Stack<SO<ShapeMaterialGL> > > materialStack_;
00087 SO<Stack<Matrix> > transformStack_;
00088
00090 void computeLighting(void);
00091 };
00092
00093 }
00094
00095 #endif // VRS_SG_STATICLIGHTINGOPERATOR_H