X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FScene.cc;h=cffd382b1a7aaa62a0e1da42e592b6fea83421bf;hb=31d52677b38d935297d132bdbd956c655cd3feee;hp=bd9c034c5f4f610ce59b80d93b328debfb71a848;hpb=a4debfe4a5f5d339410788971b698ba00cb7f09c;p=chaz%2Fyoink diff --git a/src/Scene.cc b/src/Scene.cc index bd9c034..cffd382 100644 --- a/src/Scene.cc +++ b/src/Scene.cc @@ -38,40 +38,30 @@ #include #include #include -#include +#include "Character.hh" #include "Scene.hh" +#include "Tilemap.hh" struct Scene::Impl : public Mf::Mippleton { - 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 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 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::Ptr octree; + Mf::Aabb playfieldBounds; + Mf::Aabb maximumBounds; + enum AXIS { @@ -287,10 +296,6 @@ struct Scene::Impl : public Mf::Mippleton explicit Impl(const std::string& name) : Mf::Mippleton(name) { - script.importStandardLibraries(); - importLogScript(script); - - importSceneBindings(script); loadFromFile(); } @@ -315,7 +320,7 @@ struct Scene::Impl : public Mf::Mippleton 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 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 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 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::alloc(bounds); + int ret = loadBox(script, maximumBounds); + octree = Mf::Octree::alloc(maximumBounds); return ret; } @@ -473,13 +475,17 @@ struct Scene::Impl : public Mf::Mippleton 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 if (nTiles % width != 0) table.throwError("invalid number of tiles"); - std::vector< std::vector > indices; + std::vector< std::vector > indices; int i, w, h; @@ -501,18 +507,18 @@ struct Scene::Impl : public Mf::Mippleton i = 1; for (h = height - 1; h >= 0; --h) { - std::vector row; + std::vector 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 { 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 { 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 quadPtr(quad); + Quad* quad = new Quad(demotedVertices, texture, indices[h][w]); + quad->setSurfaceType(surfaceType); + boost::shared_ptr quadPtr(quad); octree->insert(quadPtr); } } @@ -560,10 +566,10 @@ struct Scene::Impl : public Mf::Mippleton 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 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 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 > objects; + //std::list::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");