X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FScene.cc;h=ccfd4f934060b605ad5de663c9e62bf84414c9e0;hp=adec6ec42ccbfa1a38c6f63647c8e24001fceb9c;hb=f72400af4fa3e7b54dab154b5a2b6503a6f9af18;hpb=493ddb59a8620b49dfa0ff62ce93395ebfd02e86 diff --git a/src/Moof/Scene.cc b/src/Moof/Scene.cc index adec6ec..ccfd4f9 100644 --- a/src/Moof/Scene.cc +++ b/src/Moof/Scene.cc @@ -36,7 +36,6 @@ #include "Entity.hh" #include "Math.hh" #include "Mippleton.hh" -#include "Octree.hh" #include "OpenGL.hh" #include "Scene.hh" #include "Serializable.hh" @@ -46,7 +45,7 @@ namespace Mf { -class Scene::SceneImpl : public Mippleton +class Scene::Impl : public Mippleton { class Quad : public Entity { @@ -70,6 +69,10 @@ class Scene::SceneImpl : public Mippleton { std::cerr << "no coords for tile's texture" << std::endl; } + + aabb_.encloseVertices(vertices, 4); + sphere_.point = aabb_.getCenter(); + sphere_.radius = (aabb_.min - sphere_.point).length(); } void setDetail(long detail) @@ -95,37 +98,27 @@ class Scene::SceneImpl : public Mippleton glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } + if (fog_) + { + glEnable(GL_FOG); + glFogi(GL_FOG_MODE, GL_LINEAR); + } + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); tilemap_.bind(); - //glEnableClientState(GL_VERTEX_ARRAY); - //glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - //glVertexPointer(3, GL_SCALAR, 0, vertices_); - //glTexCoordPointer(2, GL_SCALAR, 0, texCoords_); - - //glDrawArrays(GL_TRIANGLE_FAN, 0, sizeof(vertices_)); + glVertexPointer(3, GL_SCALAR, 0, vertices_); + glTexCoordPointer(2, GL_SCALAR, 0, texCoords_); - //glDisableClientState(GL_VERTEX_ARRAY); - //glDisableClientState(GL_TEXTURE_COORD_ARRAY); - - glBegin(GL_TRIANGLE_FAN); - glTexCoord2f(texCoords_[0], texCoords_[1]); - glVertex3v(vertices_); - glTexCoord2f(texCoords_[2], texCoords_[3]); - glVertex3v(vertices_+3); - glTexCoord2f(texCoords_[4], texCoords_[5]); - glVertex3v(vertices_+6); - glTexCoord2f(texCoords_[6], texCoords_[7]); - glVertex3v(vertices_+9); - glEnd(); + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDisable(GL_BLEND); + glDisable(GL_FOG); } bool isVisible(const Camera& cam) const { - return aabb_.isVisible(cam); + return sphere_.isVisible(cam); } private: @@ -140,13 +133,13 @@ class Scene::SceneImpl : public Mippleton }; - static void loadBox(Aabb& theBox, SerializablePtr obj) + static void loadBox(Aabb& theBox, SerializableP obj) { - std::vector numbers; + Serializable::Array numbers; if (obj->get(numbers) && numbers.size() == 6) { - double num; + Serializable::Float num; if (numbers[0]->getNumber(num)) theBox.min[0] = Scalar(num); if (numbers[1]->getNumber(num)) theBox.min[1] = Scalar(num); @@ -158,17 +151,17 @@ class Scene::SceneImpl : public Mippleton } public: - SceneImpl(const std::string& name) : - Mippleton(name) + Impl(const std::string& name) : + Mippleton(name) { loadFromFile(); } - void loadInstructions(SerializablePtr root) + void loadInstructions(SerializableP root) { - std::vector rootObj; - std::vector::iterator it; + Serializable::Array rootObj; + Serializable::Array::iterator it; if (!root->get(rootObj)) { @@ -191,7 +184,7 @@ public: } else if (instruction == "translate") { - std::vector values; + Serializable::Array values; ++it; if ((*it)->get(values)) @@ -200,7 +193,7 @@ public: for (size_t i = 0; i < values.size(); ++i) { - double value; + Serializable::Float value; if (values[i]->getNumber(value)) { @@ -215,14 +208,14 @@ public: } else if (instruction == "scale") { - std::vector values; + Serializable::Array values; ++it; if ((*it)->get(values)) { if (values.size() == 1) { - double value = 1.0; + Serializable::Float value = 1.0; values[0]->getNumber(value); @@ -237,7 +230,7 @@ public: for (size_t i = 0; i < values.size(); ++i) { - double value; + Serializable::Float value; if (values[i]->getNumber(value)) { @@ -253,7 +246,7 @@ public: } else if (instruction == "rotate") { - std::vector values; + Serializable::Array values; ++it; if ((*it)->get(values)) @@ -262,7 +255,7 @@ public: { std::string axis; size_t index = 0; - double value = 0.0; + Serializable::Float value = 0.0; if (values[0]->get(axis)) { @@ -298,11 +291,11 @@ public: } - void loadTilemap(SerializablePtr root, const Matrix4& transform, + void loadTilemap(SerializableP root, const Matrix4& transform, const std::string& texture) { - std::map rootObj; - std::map::iterator it; + Serializable::Map rootObj; + Serializable::Map::iterator it; if (!root->get(rootObj)) { @@ -324,13 +317,13 @@ public: return; } - std::vector tiles; + Serializable::Array tiles; if ((it = rootObj.find("tiles")) != rootObj.end() && (*it).second->get(tiles) && tiles.size() % width == 0) { - std::vector::iterator jt; + Serializable::Array::iterator jt; int w, h; height = tiles.size() / width; @@ -346,7 +339,7 @@ public: for (w = 0; w < width && jt != tiles.end(); ++w, ++jt) { - long index; + Serializable::Integer index; if ((*jt)->get(index)) { @@ -393,50 +386,47 @@ public: Quad* quad = new Quad(quadVertices, texture, indices[h][w]); boost::shared_ptr quadPtr(quad); - objects.push_back(quadPtr); + octree->insert(quadPtr); } } } - void loadBillboard(SerializablePtr root, const Matrix4& transform, + void loadBillboard(SerializableP root, const Matrix4& transform, const std::string& texture) { - std::map rootObj; - std::map::iterator it; - - if (!root->get(rootObj)) - { - std::cerr << "error loading scene billboard object" << std::endl; - return; - } + Serializable::Map rootObj; + Serializable::Map::iterator it; Tilemap::Index index = 0; long width = 1; bool blending = false; bool fog = false; - if ((it = rootObj.find("tile")) != rootObj.end()) + if (root->get(rootObj)) { - long value; - if ((*it).second->get(value)) + if ((it = rootObj.find("tile")) != rootObj.end()) { - index = Tilemap::Index(value); + Serializable::Integer value; + if ((*it).second->get(value)) + { + index = Tilemap::Index(value); + } } - } - if ((it = rootObj.find("u_scale")) != rootObj.end()) - { - (*it).second->get(width); - } + if ((it = rootObj.find("u_scale")) != rootObj.end()) + { + (*it).second->get(width); + } - if ((it = rootObj.find("blend")) != rootObj.end()) - { - (*it).second->get(blending); - } + if ((it = rootObj.find("blend")) != rootObj.end()) + { + (*it).second->get(blending); + } - if ((it = rootObj.find("fog")) != rootObj.end()) - { - (*it).second->get(fog); + if ((it = rootObj.find("fog")) != rootObj.end()) + { + (*it).second->get(fog); + } } @@ -473,20 +463,20 @@ public: boost::shared_ptr quadPtr(quad); - objects.push_back(quadPtr); + octree->insert(quadPtr); } } void loadFromFile() { - std::string filePath = Scene::getPathToResource(getName()); + std::string filePath = Scene::getPath(getName()); Deserializer deserializer(filePath, true); - SerializablePtr root = deserializer.deserialize(); + SerializableP root = deserializer.deserialize(); - std::map rootObj; - std::map::iterator it; + Serializable::Map rootObj; + Serializable::Map::iterator it; if (!root || !root->get(rootObj)) { @@ -502,69 +492,85 @@ public: { loadBox(maximumBounds, (*it).second); } + else + { + std::cerr << "maximum bounds required in scene" << std::endl; + return; + } + + // create the tree to store the quads + octree = Octree::alloc(maximumBounds); + if ((it = rootObj.find("instructions")) != rootObj.end()) { loadInstructions((*it).second); } + + octree->sort(); } - void draw(Scalar alpha) + void draw(Scalar alpha, const Camera& cam) const { - QuadVector::iterator it; + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); - for (it = objects.begin(); it != objects.end(); ++it) - { - //std::cout << "draw object"; - (*it)->draw(alpha); - } + octree->drawIfVisible(alpha, cam); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + //glDisableClientState(GL_VERTEX_ARRAY); + //glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glBindTexture(GL_TEXTURE_2D, 0); - glColor3f(0.0f, 1.0f, 0.0f); - playfieldBounds.draw(); - glColor3f(0.0f, 0.0f, 1.0f); - maximumBounds.draw(); + //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + //Texture::resetBind(); + //glColor3f(0.0f, 1.0f, 0.0f); + //playfieldBounds.draw(); + //glColor3f(0.0f, 0.0f, 1.0f); + //maximumBounds.draw(); + + //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } Aabb playfieldBounds; Aabb maximumBounds; - typedef std::vector< boost::shared_ptr > QuadVector; - QuadVector objects; + OctreeP octree; }; Scene::Scene(const std::string& name) : // pass through - impl_(Scene::SceneImpl::retain(name), &Scene::SceneImpl::release) {} + impl_(Scene::Impl::getInstance(name)) {} -void Scene::draw(Scalar alpha) const +void Scene::draw(Scalar alpha, const Camera& cam) const { // pass through - impl_->draw(alpha); + impl_->draw(alpha, cam); } void Scene::refresh() { - impl_->objects.clear(); + //impl_->objects.clear(); impl_->loadFromFile(); } +OctreeP Scene::getOctree() const +{ + // pass through + return impl_->octree; +} + /** * Specialized search location for scene files. They can be found in the * "scenes" subdirectory of any of the searched directories. */ -std::string Scene::getPathToResource(const std::string& name) +std::string Scene::getPath(const std::string& name) { - return Resource::getPathToResource("scenes/" + name + ".json"); + return Resource::getPath("scenes/" + name + ".json"); }