X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FScene.cc;h=bfc788af1a75f46ed0f5adfa19ac963be5420c74;hp=fce451799db5e4d56a9649e79f7d9ce7fd38453a;hb=e0c0a3b5e7337cde55e520801d2e59e03dc97d9c;hpb=7e84479de612a4ce287c6f63deb014b447a993ec diff --git a/src/Scene.cc b/src/Scene.cc index fce4517..bfc788a 100644 --- a/src/Scene.cc +++ b/src/Scene.cc @@ -1,51 +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 #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 { @@ -58,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), @@ -75,8 +57,8 @@ struct Scene::Impl : public Mf::Library if (!mTilemap.getTileCoords(tileIndex, mTexCoords)) { - Mf::logWarning("no index %d in texture %s", tileIndex, - texture.c_str()); + Mf::logWarning << "no index " << tileIndex << + " in texture " << texture << std::endl; mTexCoords[0] = mTexCoords[1] = mTexCoords[3] = mTexCoords[6] = 0.0; @@ -144,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; @@ -171,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)); @@ -194,7 +176,7 @@ struct Scene::Impl : public Mf::Library boost::bind(&Impl::drawTile, this, _1)); int detail = 3; - Mf::Settings::getInstance().get("detail", detail); + settings.get("detail", detail); script.push(detail); script.set("detail"); script.push(1); script.set("LOW"); @@ -211,7 +193,7 @@ struct Scene::Impl : public Mf::Library } - Mf::Script::Status load(Mf::Script& script) + Mf::Script::Result load(Mf::Settings& settings, Mf::Script& script) { std::string filePath = Scene::getPath(getName()); if (filePath == "") @@ -220,25 +202,22 @@ struct Scene::Impl : public Mf::Library return Mf::Script::FILE_ERROR; } - importSceneBindings(script); + importSceneBindings(settings, script); return script.doFile(filePath); } static int loadBox(Mf::Script& script, Mf::Aabb<3>& aabb) { - Mf::Script::Value table[] = - { - script[1].requireTable(), - script[2].requireTable() - }; + script[1].requireTable(); + script[2].requireTable(); + script.setSize(2); - for (int i = 0; i <= 1; ++i) + for (int i = 1; i <= 2; ++i) { for (int j = 1; j <= 3; ++j) { - script.push(j); - table[i].pushField(); + script[i].pushField(j); } } @@ -267,14 +246,11 @@ struct Scene::Impl : public Mf::Library int translate(Mf::Script& script) { - Mf::Script::Value x = script[1].requireNumber(); - Mf::Script::Value y = script[2].requireNumber(); - Mf::Script::Value z = script[3].requireNumber(); - Mf::Vector3 vec; - x.get(vec[0]); - y.get(vec[1]); - z.get(vec[2]); + + script[1].requireNumber().get(vec[0]); + script[2].requireNumber().get(vec[1]); + script[3].requireNumber().get(vec[2]); Mf::Matrix4 translation; cml::matrix_translation(translation, vec); @@ -315,16 +291,14 @@ struct Scene::Impl : public Mf::Library int rotate(Mf::Script& script) { - Mf::Script::Value axis = script[1].requireNumber(); - Mf::Script::Value angle = script[2].requireNumber(); - size_t index = 0; - axis.get(index); + script[1].requireNumber().get(index); Mf::Scalar value; - angle.get(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; } @@ -337,8 +311,8 @@ struct Scene::Impl : public Mf::Library int drawTilemap(Mf::Script& script) { - Mf::Script::Value table = script[1].requireTable(); - Mf::Script::Value top = script[-1]; + Mf::Script::Slot table = script[1].requireTable(); + Mf::Script::Slot top = script[-1]; int width = 1; int height = 1; @@ -349,17 +323,21 @@ 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 + // do first row and first column of vertices for (int w = 0; w <= width; ++w) { @@ -382,7 +360,7 @@ struct Scene::Impl : public Mf::Library table.pushField(i); - Tilemap::Index index; + Mf::Texture::TileIndex index; top.get(index); script.pop(); @@ -390,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], @@ -420,25 +398,11 @@ struct Scene::Impl : public Mf::Library // scene is built, simply demoting the vector again should // project the points to the xy-plane - //Mf::Vector2 tr = Mf::demote(vertices[height+1][width+1]); - //Mf::Vector2 bl = Mf::demote(vertices[0][0]); - Mf::Vector2 bl = Mf::demote(vertices[0][0]); Mf::Vector2 tr = Mf::demote(vertices[height][width]); - //Mf::logInfo("pt1: %f, %f", bl[0], bl[1]); - //Mf::logInfo("pt2: %f, %f", tr[0], tr[1]); mLines.push_back(Mf::Line<2>(bl, tr)); Mf::logInfo("new line"); - - //if (tl == tr) - //{ - //mLines.push_back(Mf::Line<2>(bl, tl)); - //} - //else - //{ - //mLines.push_back(Mf::Line<2>(bl, tl)); - //} } return 0; @@ -446,13 +410,13 @@ struct Scene::Impl : public Mf::Library int drawTile(Mf::Script& script) { - Mf::Script::Value param = script[1]; - Mf::Script::Value top = script[-1]; + 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()) { @@ -518,10 +482,10 @@ Scene::Scene(const std::string& name) : mImpl(Scene::Impl::getInstance(name)) {} -Mf::Script::Status 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); } @@ -538,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; @@ -561,23 +526,25 @@ 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) { hits.push_back(hit); - return true; + //return true; } } - return false; + hits.sort(); + return !hits.empty(); + //return false; } bool Scene::checkForCollision(Character& character) @@ -635,7 +602,7 @@ bool Scene::checkForCollision(Character& character) if (collisions > 0) { - Mf::logInfo("collisions: %d", collisions); + Mf::logInfo << "collisions: " << collisions << std::endl; } return false; @@ -647,6 +614,3 @@ std::string Scene::getPath(const std::string& name) return Mf::Resource::getPath("scenes/" + name + ".lua"); } - -/** vim: set ts=4 sw=4 tw=80: *************************************************/ -