X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FScene.cc;h=85e5be75d9697a315e5aded091589e6ab3c8da58;hp=adec6ec42ccbfa1a38c6f63647c8e24001fceb9c;hb=72d4af22710317acffab861421c4364b1780b6fe;hpb=493ddb59a8620b49dfa0ff62ce93395ebfd02e86 diff --git a/src/Moof/Scene.cc b/src/Moof/Scene.cc index adec6ec..85e5be7 100644 --- a/src/Moof/Scene.cc +++ b/src/Moof/Scene.cc @@ -70,6 +70,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) @@ -98,34 +102,17 @@ class Scene::SceneImpl : public Mippleton 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); } bool isVisible(const Camera& cam) const { - return aabb_.isVisible(cam); + return sphere_.isVisible(cam); } private: @@ -393,7 +380,8 @@ public: Quad* quad = new Quad(quadVertices, texture, indices[h][w]); boost::shared_ptr quadPtr(quad); - objects.push_back(quadPtr); + //objects.push_back(quadPtr); + Octree::add(octree, quadPtr); } } } @@ -473,7 +461,8 @@ public: boost::shared_ptr quadPtr(quad); - objects.push_back(quadPtr); + //objects.push_back(quad_Ptr); + Octree::add(octree, quadPtr); } } @@ -502,6 +491,15 @@ public: { loadBox(maximumBounds, (*it).second); } + else + { + std::cerr << "maximum bounds required in scene" << std::endl; + return; + } + + //OctreeNode rootNode(maximumBounds); + octree = Octree::createNewNode(maximumBounds); + if ((it = rootObj.find("instructions")) != rootObj.end()) { loadInstructions((*it).second); @@ -509,19 +507,36 @@ public: } - void draw(Scalar alpha) + void draw(Scalar alpha, const Camera& cam) const { - QuadVector::iterator it; + //QuadVector::const_iterator it; - for (it = objects.begin(); it != objects.end(); ++it) - { - //std::cout << "draw object"; - (*it)->draw(alpha); - } + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + + octree->drawIfVisible(alpha, cam); + + //int objectsDrawn = 0; + + //for (it = objects.begin(); it != objects.end(); ++it) + //{ + //if ((*it)->isVisible(cam)) + //{ + ////std::cout << "draw object"; + //(*it)->draw(); + + //objectsDrawn++; + //} + //} + + //std::cout << objectsDrawn << std::endl; + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glBindTexture(GL_TEXTURE_2D, 0); + Texture::resetBind(); glColor3f(0.0f, 1.0f, 0.0f); playfieldBounds.draw(); glColor3f(0.0f, 0.0f, 1.0f); @@ -534,8 +549,9 @@ public: Aabb playfieldBounds; Aabb maximumBounds; - typedef std::vector< boost::shared_ptr > QuadVector; - QuadVector objects; + //typedef std::vector< boost::shared_ptr > QuadVector; + //QuadVector objects; + OctreePtr octree; }; @@ -544,15 +560,15 @@ Scene::Scene(const std::string& name) : impl_(Scene::SceneImpl::retain(name), &Scene::SceneImpl::release) {} -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(); }