/*] Copyright (c) 2009-2011, Charles McGarvey [***************************** **] All rights reserved. * * Distributable under the terms and conditions of the 2-clause BSD license; * see the file COPYING for a complete text of the license. * *****************************************************************************/ #ifndef _MOOF_MESH_HH_ #define _MOOF_MESH_HH_ #include #include #include #include #include #include #include #include #include #include /** * \file mesh.hh * Defines classes for loading and manipulating meshes. */ namespace moof { // forward declarations class script; class mesh : public boost::noncopyable, public entity { public: explicit mesh(const std::string& path); void draw(scalar alpha = SCALAR(0.0)) const; struct material { material(const std::string& id) : name(id) {} scalar shininess; std::string name; vector4 ambient; vector4 diffuse; vector4 emissive; vector4 specular; }; void set_material(int index) const; void set_material(const material& material) const; struct material_group { std::vector triangles; std::vector triangles_uv; }; class object; typedef boost::shared_ptr object_ptr; typedef boost::weak_ptr object_weakptr; struct object { object(const mesh& m) : mesh(m), texrep(SCALAR(1.0), SCALAR(1.0)) {} static object_ptr alloc(const mesh& m) { return object_ptr(new object(m)); } void draw(scalar alpha = SCALAR(0.0), bool recurse = true) const; const moof::mesh& mesh; std::string name; std::string data; std::string url; image_handle texture; vector2 texrep; std::vector verts; std::vector faces; std::vector kids; std::map 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 load(std::istream& stream); void load_material(std::istream& stream); object_ptr load_object(std::istream& stream, object_ptr parent); void load_surface(std::istream& stream, object_ptr obj); std::vector materials_; std::vector objects_; }; typedef resource_handle mesh_handle; } // namespace moof #endif // _MOOF_MESH_HH_