#ifndef SCENE_H #define SCENE_H #include #include "camera.h" #include #include "light.h" class Mesh; // Scene interface : template class SceneIterator { public: virtual SceneIterator& operator++() = 0; virtual T& operator*() = 0; virtual bool isValid() = 0; void next() {if(isValid()) operator++();} T& getItem() {return operator*();} }; struct GeometryNode { Mesh* mesh; glm::mat4 modelMatrix; }; class Scene { public: virtual SceneIterator* getLights() = 0; virtual SceneIterator* getGeometry() = 0; }; // Some basic implementations : template class ArraySceneIterator : public SceneIterator { std::vector &vec; int id; public: ArraySceneIterator(std::vector &myVec, int myId=0) : vec(myVec), id(myId) {} virtual SceneIterator& operator++() {++id; return *this;} virtual T& operator*() {return vec[id];} virtual bool isValid() {return id < vec.size();} }; class ArrayScene : public Scene { protected: std::vector lights; std::vector geometry; public: void clearLights() {lights.clear();} void clearEntities() {geometry.clear();} void clearScene() {clearLights(); clearEntities();} void addMesh(GeometryNode* node) {geometry.push_back(node);} void addLight(Light* myLight) {lights.push_back(myLight);} virtual SceneIterator* getLights() {return new ArraySceneIterator(lights);} virtual SceneIterator* getGeometry() {return new ArraySceneIterator(geometry);} }; #endif // SCENE_H