-/*******************************************************************************
-
- 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 <map>
#include <Moof/Aabb.hh>
#include <Moof/Camera.hh>
#include <Moof/Entity.hh>
-#include <Moof/Library.hh>
+#include <Moof/Manager.hh>
#include <Moof/Line.hh>
#include <Moof/Log.hh>
#include <Moof/Math.hh>
//#include <Moof/Octree.hh>
#include <Moof/Script.hh>
#include <Moof/Settings.hh>
+#include <Moof/Texture.hh>
#include "Character.hh"
#include "Scene.hh"
-#include "Tilemap.hh"
-struct Scene::Impl : public Mf::Library<Impl>
+struct Scene::Impl : public Mf::Manager<Impl>
{
struct Quad : public Mf::Entity
{
};
Quad(const Mf::Vector3* vertices[4], const std::string& texture,
- Tilemap::Index tileIndex) :
+ Mf::Texture::TileIndex tileIndex) :
mTilemap(texture),
mBlending(false),
mFog(false),
Mf::Vector3 mVertices[4];
Mf::Scalar mTexCoords[8];
- Tilemap mTilemap;
+ Mf::Texture mTilemap;
bool mBlending;
bool mFog;
//Mf::Octree<Quad>::Ptr mOctree;
std::list< boost::shared_ptr<Impl::Quad> > mObjects;
- std::list< Mf::Line<2> > mLines;
+ std::list<Mf::Line2> mLines;
Mf::Aabb<3> mBounds;
};
- explicit Impl(const std::string& name) :
- Mf::Library<Impl>(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));
boost::bind(&Impl::drawTile, this, _1));
int detail = 3;
- Mf::settings.get("detail", detail);
- script.push(detail); script.set("detail");
+ settings.get("detail", detail);
+ script.globals().setField("detail", detail);
- script.push(1); script.set("LOW");
- script.push(2); script.set("MEDIUM");
- script.push(3); script.set("HIGH");
+ script.globals().setField("LOW", 1);
+ script.globals().setField("MEDIUM", 2);
+ script.globals().setField("HIGH", 3);
- script.push(X); script.set("X");
- script.push(Y); script.set("Y");
- script.push(Z); script.set("Z");
+ script.globals().setField("X", X);
+ script.globals().setField("Y", Y);
+ script.globals().setField("Z", Z);
- script.push(Quad::LEFT); script.set("LEFT");
- script.push(Quad::RIGHT); script.set("RIGHT");
- script.push(Quad::TOP); script.set("TOP");
+ script.globals().setField("LEFT", Quad::LEFT);
+ script.globals().setField("RIGHT", Quad::RIGHT);
+ script.globals().setField("TOP", Quad::TOP);
}
- 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);
}
- static int loadBox(Mf::Script& script, Mf::Aabb<3>& aabb)
+ static int loadBox(Mf::Script& script, Mf::Aabb3& aabb)
{
script[1].requireTable();
script[2].requireTable();
- script.setSize(2);
- for (int i = 1; i <= 2; ++i)
- {
- for (int j = 1; j <= 3; ++j)
- {
- script[i].pushField(j);
- }
- }
-
- script[3].get(aabb.min[0]);
- script[4].get(aabb.min[1]);
- script[5].get(aabb.min[2]);
- script[6].get(aabb.max[0]);
- script[7].get(aabb.max[1]);
- script[8].get(aabb.max[2]);
+ script[1].pushField(1).get(aabb.min[0]);
+ script[1].pushField(2).get(aabb.min[1]);
+ script[1].pushField(3).get(aabb.min[2]);
+ script[2].pushField(1).get(aabb.max[0]);
+ script[2].pushField(2).get(aabb.max[1]);
+ script[2].pushField(3).get(aabb.max[2]);
return 0;
}
int translate(Mf::Script& script)
{
Mf::Vector3 vec;
-
script[1].requireNumber().get(vec[0]);
script[2].requireNumber().get(vec[1]);
script[3].requireNumber().get(vec[2]);
int scale(Mf::Script& script)
{
- if (script.getSize() == 3)
+ int size = script.stackSize();
+
+ 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
{
- script.getTop().throwError("wrong number of arguments");
+ script.top().raise("wrong number of arguments");
}
return 0;
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;
}
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;
+ table.get(width, "width");
- table.pushField("width");
- top.get(width);
- script.pop();
-
- nTiles = table.getLength();
- if (nTiles % width != 0) table.throwError("invalid number of tiles");
+ int nTiles = table.length();
+ if (nTiles % width != 0)
+ {
+ table.raise("invalid number of tiles");
+ }
- if (width == 0) table.throwError("width field must not be zero");
- height = nTiles / width;
+ if (width == 0) table.raise("width field must not be zero");
+ int 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
int wPlus1 = w + 1;
int hPlus1 = h + 1;
- table.pushField(i);
-
- Tilemap::Index index;
- top.get(index);
-
- script.pop();
+ Mf::Texture::TileIndex index;
+ table.get(index, i);
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],
}
Quad::Surface surface = Quad::NONE;
-
- table.pushField("surface");
- top.get(surface);
- script.pop();
+ table.get(surface, "surface");
if (surface != Quad::NONE)
{
Mf::Vector2 tr = Mf::demote(vertices[height][width]);
mLines.push_back(Mf::Line<2>(bl, tr));
- Mf::logInfo("new line");
}
return 0;
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())
{
- 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())
{
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)
{
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);
}
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<Impl::Quad> >& objects = mImpl->mObjects;
std::list< boost::shared_ptr<Impl::Quad> >::const_iterator it;
bool Scene::castRay(const Mf::Ray<2>& ray,
- std::list<Mf::Ray<2>::Intersection>& hits) const
+ std::list<Mf::Ray<2>::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)
{
}
-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: *************************************************/
-