]> Dogcows Code - chaz/yoink/blobdiff - src/Moof/Scene.cc
initial working frustum culling implementation
[chaz/yoink] / src / Moof / Scene.cc
index adec6ec42ccbfa1a38c6f63647c8e24001fceb9c..85e5be75d9697a315e5aded091589e6ab3c8da58 100644 (file)
@@ -70,6 +70,10 @@ class Scene::SceneImpl : public Mippleton<SceneImpl>
                        {
                                std::cerr << "no coords for tile's texture" << std::endl;
                        }
                        {
                                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)
                }
 
                void setDetail(long detail)
@@ -98,34 +102,17 @@ class Scene::SceneImpl : public Mippleton<SceneImpl>
                        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
                        tilemap_.bind();
 
                        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
                {
 
                        glDisable(GL_BLEND);
                }
 
                bool isVisible(const Camera& cam) const
                {
-                       return aabb_.isVisible(cam);
+                       return sphere_.isVisible(cam);
                }
 
        private:
                }
 
        private:
@@ -393,7 +380,8 @@ public:
                                Quad* quad = new Quad(quadVertices, texture, indices[h][w]);
                                boost::shared_ptr<Quad> quadPtr(quad);
 
                                Quad* quad = new Quad(quadVertices, texture, indices[h][w]);
                                boost::shared_ptr<Quad> quadPtr(quad);
 
-                               objects.push_back(quadPtr);
+                               //objects.push_back(quadPtr);
+                               Octree::add(octree, quadPtr);
                        }
                }
        }
                        }
                }
        }
@@ -473,7 +461,8 @@ public:
 
                        boost::shared_ptr<Quad> quadPtr(quad);
 
 
                        boost::shared_ptr<Quad> quadPtr(quad);
 
-                       objects.push_back(quadPtr);
+                       //objects.push_back(quad_Ptr);
+                       Octree::add(octree, quadPtr);
                }
        }
 
                }
        }
 
@@ -502,6 +491,15 @@ public:
                {
                        loadBox(maximumBounds, (*it).second);
                }
                {
                        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);
                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);
 
 
                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);
                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;
 
        Aabb playfieldBounds;
        Aabb maximumBounds;
 
-       typedef std::vector< boost::shared_ptr<Quad> > QuadVector;
-       QuadVector objects;
+       //typedef std::vector< boost::shared_ptr<Quad> > QuadVector;
+       //QuadVector objects;
+       OctreePtr octree;
 };
 
 
 };
 
 
@@ -544,15 +560,15 @@ Scene::Scene(const std::string& name) :
        impl_(Scene::SceneImpl::retain(name), &Scene::SceneImpl::release) {}
 
 
        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
 {
        // pass through
-       impl_->draw(alpha);
+       impl_->draw(alpha, cam);
 }
 
 void Scene::refresh()
 {
 }
 
 void Scene::refresh()
 {
-       impl_->objects.clear();
+       //impl_->objects.clear();
        impl_->loadFromFile();
 }
 
        impl_->loadFromFile();
 }
 
This page took 0.026417 seconds and 4 git commands to generate.