00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef VRS_SG_TEXTUREATLASOPERATOR_H
00019 #define VRS_SG_TEXTUREATLASOPERATOR_H
00020
00021 #include <vrs/visitor.h>
00022 #include <vrs/polygonset.h>
00023 #include <vrs/container/array.h>
00024 #include <vrs/container/dictionary.h>
00025 #include <vrs/container/stack.h>
00026 #include <vrs/sg/scenegraphoperator.h>
00027 #include <vrs/opengl/texturegl.h>
00028 #include <vrs/opengl/textureunitselectorgl.h>
00029 #include <vrs/opengl/textureunitsettinggl.h>
00030 #include <vrs/image/image.h>
00031 #include <vrs/image/textureatlascreator.h>
00032
00033 namespace VRS {
00034
00044 class VRS_CORE_API TextureAtlasOperator : public SceneGraphOperator,
00045 public Visitor<TextureUnitSelectorGL>,
00046 public Visitor<TextureUnitSettingGL>,
00047 public Visitor<TextureGL>,
00048 public Visitor<PolygonSet>,
00049 public Visitor<SceneThing>
00050 {
00051 public:
00053 TextureAtlasOperator(unsigned int xSize = 1024, unsigned int ySize = 1024) : _xSize(xSize), _ySize(ySize) {}
00054
00056 virtual void optimizeScene(SO<SceneNode>& scene);
00058 virtual VisitorBase::VisitMode visit(TextureUnitSelectorGL* selector, bool push);
00060 virtual VisitorBase::VisitMode visit(TextureUnitSettingGL* setting, bool push);
00062 virtual VisitorBase::VisitMode visit(TextureGL* texture, bool push);
00064 virtual VisitorBase::VisitMode visit(PolygonSet* shape, bool push);
00066 virtual VisitorBase::VisitMode visit(SceneThing* thing, bool push);
00067
00068 private:
00070 unsigned int _xSize;
00072 unsigned int _ySize;
00073
00075 SO<Stack<unsigned int> > unitStack_;
00077 SO<Dictionary<unsigned int, SO<Stack<SO<TextureGL> > > > > textureStacks_;
00078
00080 SO<Dictionary<unsigned int, SO<Array<SO<PolygonSet> > > > > shapes_;
00082 SO<Dictionary<unsigned int, SO<Array<SO<TextureGL> > > > > textures_;
00084 SO<Dictionary<unsigned int, SO<Array<SO<Image> > > > > images_;
00086 SO<Stack<SO<SharedObj> > > parentStack_;
00088 SO<Dictionary<unsigned int, SO<Array<SO<SharedObj> > > > > parents_;
00089
00091 void setUnit(unsigned int unit);
00093 void setTexture(TextureGL* texture);
00094
00096 void addUnitToDictionaries(void);
00098 void addPolygonSetToDictionary(PolygonSet* polyset);
00099
00101 void removeUnsuitableShapes(unsigned int unit);
00103 void replaceTexturesWithAtlas(unsigned int unit, SO<TextureAtlasCreator> atlases, SO<Iterator<SO<Image > > > images);
00105 void createTextureAtlases(void);
00106 };
00107
00108 }
00109
00110 #endif // VRS_SG_TEXTUREATLASOPERATOR_H