]> Dogcows Code - chaz/yoink/blobdiff - src/Scene.cc
beginning CD implementation
[chaz/yoink] / src / Scene.cc
index bd9c034c5f4f610ce59b80d93b328debfb71a848..cffd382b1a7aaa62a0e1da42e592b6fea83421bf 100644 (file)
 #include <Moof/Octree.hh>
 #include <Moof/Script.hh>
 #include <Moof/Settings.hh>
-#include <Moof/Tilemap.hh>
 
+#include "Character.hh"
 #include "Scene.hh"
+#include "Tilemap.hh"
 
 
 struct Scene::Impl : public Mf::Mippleton<Impl>
 {
-       class Quad : public Mf::Entity, public Mf::OctreeInsertable
+       struct Quad : public Mf::Entity, public Mf::OctreeInsertable
        {
-               Mf::Scalar              vertices_[12];
-               Mf::Scalar              texCoords_[8];
-               
-               Mf::Tilemap             tilemap_;
-
-               bool                    blending_;
-               bool                    fog_;
-
-               Mf::Aabb                aabb_;
-               Mf::Sphere              sphere_;
-
-       public:
-
                enum SURFACE_TYPE
                {
+                       NONE    = 0,
                        LEFT    = 1,
                        RIGHT   = 2,
                        TOP             = 3
                };
 
                Quad(const Mf::Vector3 vertices[4], const std::string& texture,
-                               Mf::Tilemap::Index tileIndex) :
+                               Tilemap::Index tileIndex) :
                        tilemap_(texture),
                        blending_(false),
-                       fog_(false)
+                       fog_(false),
+                       surfaceType_(NONE)
                {
                        for (int i = 0, num = 0; i < 4; ++i)
                        {
@@ -107,6 +97,11 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                        fog_ = fog;
                }
 
+               void setSurfaceType(SURFACE_TYPE type)
+               {
+                       surfaceType_ = type;
+               }
+
                void draw(Mf::Scalar alpha = 0.0) const
                {
                        if (blending_)
@@ -263,17 +258,31 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
 
                        return octantNum;
                }
-       };
 
 
+               Mf::Scalar              vertices_[12];
+               Mf::Scalar              texCoords_[8];
+               
+               Tilemap                 tilemap_;
+
+               bool                    blending_;
+               bool                    fog_;
+               SURFACE_TYPE    surfaceType_;
+
+               Mf::Aabb                aabb_;
+               Mf::Sphere              sphere_;
+       };
+
 
-       Mf::Script                              script;
 
        Mf::Matrix4                             transform;
        std::string                             texture;
 
        Mf::Octree<Quad>::Ptr   octree;
 
+       Mf::Aabb                                playfieldBounds;
+       Mf::Aabb                                maximumBounds;
+
 
        enum AXIS
        {
@@ -287,10 +296,6 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
        explicit Impl(const std::string& name) :
                Mf::Mippleton<Impl>(name)
        {
-               script.importStandardLibraries();
-               importLogScript(script);
-
-               importSceneBindings(script);
                loadFromFile();
        }
 
@@ -315,7 +320,7 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                script.importFunction("MakeBillboard",
                                boost::bind(&Impl::makeBillboard, this, _1));
 
-               long detail = 3;
+               int detail = 3;
                Mf::Settings::getInstance().get("detail", detail);
                script.push(detail); script.set("detail");
 
@@ -331,8 +336,13 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
 
        void loadFromFile()
        {
+               Mf::Script script;
                std::string filePath = Scene::getPath(getName());
 
+               script.importStandardLibraries();
+               importLogScript(script);
+               importSceneBindings(script);
+
                if (script.doFile(filePath) != Mf::Script::SUCCESS)
                {
                        std::string str;
@@ -350,17 +360,11 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                        script[2].requireTable()
                };
 
-               if (!table[0].isTable() || !table[1].isTable())
-               {
-                       Mf::logWarning("wrong arguments to setPlayfieldBounds; ignoring...");
-                       return 0;
-               }
-
                for (int i = 0; i <= 1; ++i)
                {
                        for (int j = 1; j <= 3; ++j)
                        {
-                               script.push((long)j);
+                               script.push(j);
                                table[i].pushField();
                        }
                }
@@ -377,15 +381,13 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
 
        int setPlayfieldBounds(Mf::Script& script)
        {
-               Mf::Aabb bounds;
-               return loadBox(script, bounds);
+               return loadBox(script, playfieldBounds);
        }
 
        int setMaximumBounds(Mf::Script& script)
        {
-               Mf::Aabb bounds;
-               int ret = loadBox(script, bounds);
-               octree = Mf::Octree<Quad>::alloc(bounds);
+               int ret = loadBox(script, maximumBounds);
+               octree = Mf::Octree<Quad>::alloc(maximumBounds);
                return ret;
        }
 
@@ -473,13 +475,17 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                Mf::Script::Value table = script[1].requireTable();
                Mf::Script::Value top = script[-1];
 
-               long width = 1;
-               long height = 1;
+               Quad::SURFACE_TYPE surfaceType;
+               table.pushField("surface_type");
+               top.get(surfaceType);
+
+               int width = 1;
+               int height = 1;
 
                table.pushField("width");
                top.get(width);
 
-               long nTiles = 0;
+               int nTiles = 0;
 
                table.pushField("tiles");
                Mf::Script::Value tiles = script.getTop();
@@ -487,7 +493,7 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
 
                if (nTiles % width != 0) table.throwError("invalid number of tiles");
 
-               std::vector< std::vector<Mf::Tilemap::Index> > indices;
+               std::vector< std::vector<Tilemap::Index> > indices;
 
                int i, w, h;
 
@@ -501,18 +507,18 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                i = 1;
                for (h = height - 1; h >= 0; --h)
                {
-                       std::vector<Mf::Tilemap::Index> row;
+                       std::vector<Tilemap::Index> row;
 
                        for (w = 0; w < width; ++w, ++i)
                        {
                                script.checkStack(2);
-                               script.push(long(i));
+                               script.push(i);
                                tiles.pushField();
 
-                               long index;
+                               Tilemap::Index index;
                                top.get(index);
 
-                               row.push_back(Mf::Tilemap::Index(index));
+                               row.push_back(index);
                        }
 
                        indices[h] = row;
@@ -527,8 +533,7 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                {
                        for (int w = 0; w <= width; ++w)
                        {
-                               vertices[h][w] = Mf::Vector4(Mf::Scalar(w), Mf::Scalar(h), 0.0, 1.0) *
-                                       transposedTransform;
+                               vertices[h][w] = Mf::Vector4(w, h, 0.0, 1.0) * transposedTransform;
                        }
                }
 
@@ -536,18 +541,19 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                {
                        for (int w = 0; w < width; ++w)
                        {
-                               if (indices[h][w] == Mf::Tilemap::NO_TILE) continue;
+                               if (indices[h][w] == Tilemap::NO_TILE) continue;
 
-                               Mf::Vector3 quadVertices[4];
+                               Mf::Vector3 demotedVertices[4];
 
-                               quadVertices[0] = Mf::demote(vertices[h][w]);
-                               quadVertices[1] = Mf::demote(vertices[h][w+1]);
-                               quadVertices[2] = Mf::demote(vertices[h+1][w+1]);
-                               quadVertices[3] = Mf::demote(vertices[h+1][w]);
+                               demotedVertices[0] = Mf::demote(vertices[h][w]);
+                               demotedVertices[1] = Mf::demote(vertices[h][w+1]);
+                               demotedVertices[2] = Mf::demote(vertices[h+1][w+1]);
+                               demotedVertices[3] = Mf::demote(vertices[h+1][w]);
 
-                               Quad* quad = new Quad(quadVertices, texture, indices[h][w]);
-                               boost::shared_ptr<Quad> quadPtr(quad);
+                               Quad* quad = new Quad(demotedVertices, texture, indices[h][w]);
+                               quad->setSurfaceType(surfaceType);
 
+                               boost::shared_ptr<Quad> quadPtr(quad);
                                octree->insert(quadPtr);
                        }
                }
@@ -560,10 +566,10 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
                Mf::Script::Value table = script[1];
                Mf::Script::Value top = script[-1];
 
-               long    index = 0;
-               long    width = 1;
-               bool    blending = false;
-               bool    fog = false;
+               Tilemap::Index  index = 0;
+               int                             width = 1;
+               bool                    blending = false;
+               bool                    fog = false;
 
                if (table.isTable())
                {
@@ -600,19 +606,18 @@ struct Scene::Impl : public Mf::Mippleton<Impl>
 
                for (int w = 0; w < width; ++w)
                {
-                       Mf::Vector3 quadVertices[4];
+                       Mf::Vector3 demotedVertices[4];
 
-                       quadVertices[0] = Mf::demote(vertices[0][w]);
-                       quadVertices[1] = Mf::demote(vertices[0][w+1]);
-                       quadVertices[2] = Mf::demote(vertices[1][w+1]);
-                       quadVertices[3] = Mf::demote(vertices[1][w]);
+                       demotedVertices[0] = Mf::demote(vertices[0][w]);
+                       demotedVertices[1] = Mf::demote(vertices[0][w+1]);
+                       demotedVertices[2] = Mf::demote(vertices[1][w+1]);
+                       demotedVertices[3] = Mf::demote(vertices[1][w]);
 
-                       Quad* quad = new Quad(quadVertices, texture, Mf::Tilemap::Index(index));
+                       Quad* quad = new Quad(demotedVertices, texture, index);
                        quad->setBlending(blending);
                        quad->setFog(fog);
 
                        boost::shared_ptr<Quad> quadPtr(quad);
-
                        octree->insert(quadPtr);
                }
 
@@ -637,6 +642,18 @@ void Scene::drawIfVisible(Mf::Scalar alpha, const Mf::Frustum& frustum) const
 }
 
 
+bool Scene::checkForCollision(Character& character)
+{
+       std::list< boost::shared_ptr<Impl::Quad> > objects;
+       //std::list<Mf::Octree<Impl::Quad>::InsertableP> objects;
+       impl_->octree->getNearbyObjects(objects, character);
+       impl_->maximumBounds.draw();
+
+       Mf::logDebug("nearby objects: %d", objects.size());
+       return false;
+}
+
+
 std::string Scene::getPath(const std::string& name)
 {
        return Mf::Resource::getPath("scenes/" + name + ".lua");
This page took 0.026334 seconds and 4 git commands to generate.