*/
#include <iostream>
+#include <map>
+#include <vector>
#include <boost/noncopyable.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
-#include <moof/drawable.hh>
+#include <moof/entity.hh>
#include <moof/image.hh>
#include <moof/math.hh>
#include <moof/resource.hh>
namespace moof {
-class mesh : public boost::noncopyable, public drawable
+class script;
+
+
+class mesh : public boost::noncopyable, public entity
{
public:
std::string name;
vector4 diffuse;
- vector3 ambient;
- vector3 emissive;
- vector3 specular;
+ vector4 ambient;
+ vector4 emissive;
+ vector4 specular;
scalar shininess;
};
void set_material(int index) const;
void set_material(const material& material) const;
- struct material_group : public drawable
+ struct material_group
{
- material_group() {}
-
- void draw(scalar alpha = SCALAR(0.0)) const;
-
-
std::vector<unsigned> triangles;
std::vector<vector2> triangles_uv;
};
class object;
typedef boost::shared_ptr<object> object_ptr;
+ typedef boost::weak_ptr<object> object_weakptr;
struct object
{
- object() :
+ object(const mesh& m) :
+ mesh(m),
texrep(SCALAR(1.0), SCALAR(1.0)) {}
- static object_ptr alloc()
+ static object_ptr alloc(const mesh& m)
{
- return object_ptr(new object);
+ return object_ptr(new object(m));
}
+ void draw(scalar alpha = SCALAR(0.0), bool recurse = true) const;
- void draw(const mesh& mesh, scalar alpha = SCALAR(0.0)) const;
+ const moof::mesh& mesh;
std::string name;
std::string data;
std::vector<material_group> faces;
std::vector<object_ptr> kids;
- object_ptr parent;
+ std::map<std::string,object_ptr> kids_byname;
+ object_weakptr parent;
};
+ object_ptr operator [] (unsigned index) const
+ {
+ return objects_[index];
+ }
+
+
+ /**
+ * Import script bindings for the mesh class.
+ * \param The script.
+ * \param The name of the namespace to import to.
+ */
+ static void import(script& script, const std::string& nspace = "");
+
+
private:
void import(std::istream& stream);