X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FScene.cc;h=918ff5250b843c8c8b0020b3935ab848e07cf4ae;hp=45fc3a0ac9bc6f70397206fc49646546c1006614;hb=58c1f9a499d3bb80ea2869b29c714f61e656d48d;hpb=e973a129b5b83b628ba3f09e8c95682fc74080cd diff --git a/src/Scene.cc b/src/Scene.cc index 45fc3a0..918ff52 100644 --- a/src/Scene.cc +++ b/src/Scene.cc @@ -1,30 +1,13 @@ -/******************************************************************************* - - 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 @@ -157,7 +140,7 @@ struct Scene::Impl : public Mf::Manager //Mf::Octree::Ptr mOctree; std::list< boost::shared_ptr > mObjects; - std::list< Mf::Line<2> > mLines; + std::list mLines; Mf::Aabb<3> mBounds; @@ -173,7 +156,7 @@ struct Scene::Impl : public Mf::Manager 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::Manager 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::Manager } - 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); } @@ -278,24 +261,26 @@ struct Scene::Impl : public Mf::Manager int scale(Mf::Script& script) { - if (script.getSize() == 3) + int size = script.getSize(); + + if (size == 1) { - Mf::Vector3 vec; - script[1].requireNumber().get(vec[0]); - script[2].requireNumber().get(vec[1]); - script[3].requireNumber().get(vec[2]); + Mf::Scalar value = 1.0; + script[1].requireNumber().get(value); Mf::Matrix4 scaling; - cml::matrix_scale(scaling, vec); + cml::matrix_uniform_scale(scaling, value); mTransform = scaling * mTransform; } - else if (script.getSize() == 1) + else if (size == 3) { - Mf::Scalar value = 1.0; - script[1].requireNumber().get(value); + Mf::Vector3 vec; + script[1].requireNumber().get(vec[0]); + script[2].requireNumber().get(vec[1]); + script[3].requireNumber().get(vec[2]); Mf::Matrix4 scaling; - cml::matrix_uniform_scale(scaling, value); + cml::matrix_scale(scaling, vec); mTransform = scaling * mTransform; } else @@ -314,7 +299,8 @@ struct Scene::Impl : public Mf::Manager 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; } @@ -327,27 +313,28 @@ struct Scene::Impl : public Mf::Manager int drawTilemap(Mf::Script& script) { - Mf::Script::Slot table = script[1].requireTable(); - Mf::Script::Slot top = script[-1]; + Mf::Script::Slot table = script[1].requireTable(); - int width = 1; - int height = 1; - int nTiles = 0; + int width = 1; + int height = 1; + int nTiles = 0; - table.pushField("width"); - top.get(width); - script.pop(); + table.get(width, "width"); 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 @@ -370,12 +357,8 @@ struct Scene::Impl : public Mf::Manager int wPlus1 = w + 1; int hPlus1 = h + 1; - table.pushField(i); - Mf::Texture::TileIndex index; - top.get(index); - - script.pop(); + table.get(index, i); vertices[h][wPlus1] = Mf::demote(mTransform * Mf::Vector4(wPlus1, h, 0.0, 1.0)); @@ -398,10 +381,7 @@ struct Scene::Impl : public Mf::Manager } Quad::Surface surface = Quad::NONE; - - table.pushField("surface"); - top.get(surface); - script.pop(); + table.get(surface, "surface"); if (surface != Quad::NONE) { @@ -414,7 +394,6 @@ struct Scene::Impl : public Mf::Manager Mf::Vector2 tr = Mf::demote(vertices[height][width]); mLines.push_back(Mf::Line<2>(bl, tr)); - Mf::logInfo("new line"); } return 0; @@ -432,18 +411,10 @@ struct Scene::Impl : public Mf::Manager if (param.isTable()) { - script.push(1); - param.pushField(); - top.get(index); - - param.pushField("u_scale"); - top.get(width); - - param.pushField("blend"); - top.get(blending); - - param.pushField("fog"); - top.get(fog); + param.get(index, 1); + param.get(width, "u_scale"); + param.get(blending, "blend"); + param.get(fog, "fog"); } else if (param.isNumber()) { @@ -453,7 +424,7 @@ struct Scene::Impl : public Mf::Manager Mf::Vector3 vertices[2][width+1]; Mf::Scalar xf; - Mf::Scalar increment = 1.0 / Mf::Scalar(width); + Mf::Scalar increment = SCALAR(1.0) / Mf::Scalar(width); for (int h = 0; h <= 1; ++h) { @@ -494,10 +465,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 +485,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 +509,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 +592,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: *************************************************/ -