X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FScene.cc;h=afbfa440f9f915f949feda5e459b7c4fa1d80c2e;hp=aa2249c596ae0b462e9910db1bd93362ef8ceabd;hb=90b2c7fb10b244b781b84965a0d36f1f323ee94d;hpb=987971a961454d97082c6448fdc0bbeb540281bb diff --git a/src/Scene.cc b/src/Scene.cc index aa2249c..afbfa44 100644 --- a/src/Scene.cc +++ b/src/Scene.cc @@ -1,50 +1,33 @@ -/******************************************************************************* - - Copyright (c) 2009, Charles McGarvey - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*******************************************************************************/ +/*] Copyright (c) 2009-2010, Charles McGarvey [************************** +**] All rights reserved. +* +* vi:ts=4 sw=4 tw=75 +* +* Distributable under the terms and conditions of the 2-clause BSD license; +* see the file COPYING for a complete text of the license. +* +**************************************************************************/ #include #include #include #include -#include +#include #include #include #include //#include #include #include +#include #include "Character.hh" #include "Scene.hh" -#include "Tilemap.hh" -struct Scene::Impl : public Mf::Library +struct Scene::Impl : public Mf::Manager { struct Quad : public Mf::Entity { @@ -57,7 +40,7 @@ struct Scene::Impl : public Mf::Library }; Quad(const Mf::Vector3* vertices[4], const std::string& texture, - Tilemap::Index tileIndex) : + Mf::Texture::TileIndex tileIndex) : mTilemap(texture), mBlending(false), mFog(false), @@ -143,7 +126,7 @@ struct Scene::Impl : public Mf::Library Mf::Vector3 mVertices[4]; Mf::Scalar mTexCoords[8]; - Tilemap mTilemap; + Mf::Texture mTilemap; bool mBlending; bool mFog; @@ -170,10 +153,10 @@ struct Scene::Impl : public Mf::Library }; - explicit Impl(const std::string& name) : - Mf::Library(name) {} + void init(const std::string& name) {} - void importSceneBindings(Mf::Script& script) + + void importSceneBindings(Mf::Settings& settings, Mf::Script& script) { script.importFunction("SetBounds", boost::bind(&Impl::setBounds, this, _1)); @@ -193,7 +176,7 @@ struct Scene::Impl : public Mf::Library boost::bind(&Impl::drawTile, this, _1)); int detail = 3; - Mf::settings.get("detail", detail); + settings.get("detail", detail); script.push(detail); script.set("detail"); script.push(1); script.set("LOW"); @@ -210,17 +193,17 @@ struct Scene::Impl : public Mf::Library } - Mf::Script::Result load(Mf::Script& script) + Mf::Script::Result load(Mf::Settings& settings, Mf::Script& script) { - std::string filePath = Scene::getPath(getName()); - if (filePath == "") + std::string path(getName()); + if (!Scene::getPath(path)) { script.push("the scene file could not be found"); return Mf::Script::FILE_ERROR; } - importSceneBindings(script); - return script.doFile(filePath); + importSceneBindings(settings, script); + return script.doFile(path); } @@ -314,7 +297,8 @@ struct Scene::Impl : public Mf::Library Mf::Scalar value; script[2].requireNumber().get(value); - cml::matrix_rotate_about_world_axis(mTransform, index, cml::rad(value)); + cml::matrix_rotate_about_world_axis(mTransform, + index, cml::rad(value)); return 0; } @@ -339,15 +323,19 @@ struct Scene::Impl : public Mf::Library script.pop(); nTiles = table.getLength(); - if (nTiles % width != 0) table.throwError("invalid number of tiles"); + if (nTiles % width != 0) + { + table.throwError("invalid number of tiles"); + } if (width == 0) table.throwError("width field must not be zero"); height = nTiles / width; Mf::Vector3 vertices[height+1][width+1]; - // the indices are stored upside-down in the scene file so that they are - // easier to edit as text, so we'll need to load them last row first + // the indices are stored upside-down in the scene file so that + // they are easier to edit as text, so we'll need to load them last + // row first // do first row and first column of vertices @@ -372,7 +360,7 @@ struct Scene::Impl : public Mf::Library table.pushField(i); - Tilemap::Index index; + Mf::Texture::TileIndex index; top.get(index); script.pop(); @@ -380,7 +368,7 @@ struct Scene::Impl : public Mf::Library vertices[h][wPlus1] = Mf::demote(mTransform * Mf::Vector4(wPlus1, h, 0.0, 1.0)); - if (index == Tilemap::NO_TILE) continue; + if (index == Mf::Texture::NO_TILE) continue; const Mf::Vector3* corners[4] = { &vertices[h][w], @@ -425,10 +413,10 @@ struct Scene::Impl : public Mf::Library Mf::Script::Slot param = script[1]; Mf::Script::Slot top = script[-1]; - Tilemap::Index index = 0; - int width = 1; - bool blending = false; - bool fog = false; + Mf::Texture::TileIndex index = 0; + int width = 1; + bool blending = false; + bool fog = false; if (param.isTable()) { @@ -494,10 +482,10 @@ Scene::Scene(const std::string& name) : mImpl(Scene::Impl::getInstance(name)) {} -Mf::Script::Result Scene::load(Mf::Script& script) +Mf::Script::Result Scene::load(Mf::Settings& settings, Mf::Script& script) { // pass through - return mImpl->load(script); + return mImpl->load(settings, script); } @@ -514,7 +502,8 @@ void Scene::draw(Mf::Scalar alpha) const mImpl->mBounds.draw(); } -void Scene::drawIfVisible(Mf::Scalar alpha, const Mf::Frustum& frustum) const +void Scene::drawIfVisible(Mf::Scalar alpha, + const Mf::Frustum& frustum) const { std::list< boost::shared_ptr >& objects = mImpl->mObjects; std::list< boost::shared_ptr >::const_iterator it; @@ -537,14 +526,14 @@ void Scene::drawIfVisible(Mf::Scalar alpha, const Mf::Frustum& frustum) const bool Scene::castRay(const Mf::Ray<2>& ray, - std::list::Intersection>& hits) const + std::list::Contact>& hits) const { std::list< Mf::Line<2> >& lines = mImpl->mLines; std::list< Mf::Line<2> >::const_iterator it; for (it = lines.begin(); it != lines.end(); ++it) { - Mf::Ray<2>::Intersection hit; + Mf::Ray<2>::Contact hit; Mf::Scalar d = (*it).intersectRay(ray, hit); if (d > 0.0) { @@ -620,11 +609,8 @@ bool Scene::checkForCollision(Character& character) } -std::string Scene::getPath(const std::string& name) +bool Scene::getPath(std::string& name) { - return Mf::Resource::getPath("scenes/" + name + ".lua"); + return Mf::Resource::getPath(name, "scenes/", "lua"); } - -/** vim: set ts=4 sw=4 tw=80: *************************************************/ -