diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 898e3300e..b4b437480 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,6 +21,7 @@ set(Magnum_SRCS Texture.cpp Trade/AbstractImporter.cpp + Trade/Mesh.cpp Math/Math.cpp ) diff --git a/src/Trade/AbstractImporter.h b/src/Trade/AbstractImporter.h index 280db32c9..8c084fa09 100644 --- a/src/Trade/AbstractImporter.h +++ b/src/Trade/AbstractImporter.h @@ -19,21 +19,11 @@ * @brief Class Magnum::Trade::AbstractImporter */ -#include - #include "PluginManager/Plugin.h" #include "Image.h" namespace Magnum { -class AbstractShaderProgram; -class AbstractTexture; -class Camera; -class Light; -class Mesh; -class Object; -class Scene; - /** @brief Data format exchange @@ -43,6 +33,12 @@ for direct access to the data. namespace Trade { class AbstractMaterial; +class Camera; +class Light; +class Mesh; +class Object; +class Scene; +class Texture; /** @brief Base class for importer plugins @@ -55,30 +51,15 @@ textures etc. function close() and one or more pairs of data access functions, based on which features are supported in given format.

For multi-data formats file opening shouldn't take long, all parsing should -be done in data parsing functions, because the user might want to import only -some data. This is obviously not the case for single-data formats like images, -as the file contains all data user wants to import.

- -@subsection AbstractImporterMemoryManagement Memory management -

Every data access function returns std::shared_ptr, thus deletion of -underlying data is done automatically when last shared pointer instance is -destroyed. This allows for data reusing, e.g. one material can be used for many -meshes without the need for complex memory management.

-

Except for objects, the class should store its own copies of shared pointers -for all requested data until the file is closed, so when user requests the data -and then destroys his copy of shared pointer, the data are not deleted (and next -request will not require parsing them again).

-

As objects have their own hierarchy which doesn't involve shared pointers, -having copies of shared pointers for them will lead to dangling pointers when -any object deletes its child objects. Thus the class should store only one -shared pointer to root of each object tree.

+be done in data parsing functions or even in envelope classes such as Mesh, +because the user might want to import only some data. This is obviously not +the case for single-data formats like images, as the file contains all data +user wants to import.

*/ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { PLUGIN_INTERFACE("cz.mosra.magnum.Trade.AbstractImporter/0.1") public: - struct MeshData; - /** @brief Features supported by this importer */ enum Feature { OpenFile = 0x01, /**< Can open files specified by filename */ @@ -133,10 +114,9 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Scene * @param id Scene ID, from range [0, sceneCount()). * - * Returns (shared) pointer to given scene or nullptr, if no such scene - * exists. + * Returns pointer to given scene or nullptr, if no such scene exists. */ - virtual inline std::shared_ptr scene(size_t id) { return nullptr; } + virtual inline Scene* scene(size_t id) { return nullptr; } /** @brief Light count */ virtual inline size_t lightCount() const { return 0; } @@ -145,10 +125,9 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Light * @param id Light ID, from range [0, lightCount()). * - * Returns (shared) pointer to given light or nullptr, if no such - * light exists. + * Returns pointer to given light or nullptr, if no such light exists. */ - virtual inline std::shared_ptr light(size_t id) { return nullptr; } + virtual inline Light* light(size_t id) { return nullptr; } /** @brief Camera count */ virtual inline size_t cameraCount() const { return 0; } @@ -157,10 +136,10 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Camera * @param id Camera ID, from range [0, cameraCount()). * - * Returns (shared) pointer to given camera or nullptr, if no such - * camera exists. + * Returns pointer to given camera or nullptr, if no such camera + * exists. */ - virtual inline std::shared_ptr camera(size_t id) { return nullptr; } + virtual inline Camera* camera(size_t id) { return nullptr; } /** @brief Object count (without lights and cameras) */ virtual inline size_t objectCount() const { return 0; } @@ -169,35 +148,21 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Object * @param id Object ID, from range [0, objectCount()). * - * Returns (shared) pointer to given object or nullptr, if no such - * object exists. + * Returns pointer to given object or nullptr, if no such object + * exists. */ - virtual inline std::shared_ptr object(size_t id) { return nullptr; } + virtual inline Object* object(size_t id) { return nullptr; } /** @brief Mesh count */ virtual inline size_t meshCount() const { return 0; } - /** - * @brief Mesh data - * @param meshId Mesh ID, from range [0, meshCount()). - * @return (Shared) pointer to given mesh data or nullptr, if no - * such mesh exists. - * - * If you modify the mesh data before mesh/object using them is - * requested, the changes will be reflected in the resulting mesh. - * This can be used for e.g. optimizing or modifying the data using - * functions from MeshTools. - */ - virtual inline std::shared_ptr meshData(size_t meshId) { return nullptr; } - /** * @brief Mesh * @param id Mesh ID, from range [0, meshCount()). * - * Returns (shared) pointer to given mesh or nullptr, if no such - * mesh exists. + * Returns pointer to given mesh or nullptr, if no such mesh exists. */ - virtual inline std::shared_ptr mesh(size_t id) { return nullptr; } + virtual inline Mesh* mesh(size_t id) { return nullptr; } /** @brief Material count */ virtual inline size_t materialCount() const { return 0; } @@ -206,22 +171,10 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Material * @param id Material ID, from range [0, materialCount()). * - * Returns (shared) pointer to given material or nullptr, if no such - * material exists. - */ - virtual inline std::shared_ptr material(size_t id) { return nullptr; } - - /** @brief Shader count */ - virtual inline size_t shaderCount() const { return 0; } - - /** - * @brief Shader - * @param id Shader ID, from range [0, shaderCount()). - * - * Returns (shared) pointer to given shader or nullptr, if no such - * shader exists. + * Returns pointer to given material or nullptr, if no such material + * exists. */ - virtual inline std::shared_ptr shader(size_t id) { return nullptr; } + virtual inline AbstractMaterial* material(size_t id) { return nullptr; } /** @brief Texture count */ virtual inline size_t textureCount() const { return 0; } @@ -230,10 +183,10 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Texture * @param id Texture ID, from range [0, textureCount()). * - * Returns (shared) pointer to given texture or nullptr, if no such - * texture exists. + * Returns pointer to given texture or nullptr, if no such texture + * exists. */ - virtual inline std::shared_ptr texture(size_t id) { return nullptr; } + virtual inline Texture* texture(size_t id) { return nullptr; } /** @brief One-dimensional image count */ virtual inline size_t image1DCount() const { return 0; } @@ -242,10 +195,9 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief One-dimensional image * @param id Image ID, from range [0, image1DCount()). * - * Returns (shared) pointer to given image or nullptr, if no such image - * exists. + * Returns pointer to given image or nullptr, if no such image exists. */ - virtual inline std::shared_ptr image1D(size_t id) { return nullptr; } + virtual inline Image1D* image1D(size_t id) { return nullptr; } /** @brief Two-dimensional image count */ virtual inline size_t image2DCount() const { return 0; } @@ -254,10 +206,9 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Two-dimensional image * @param id Image ID, from range [0, image2DCount()). * - * Returns (shared) pointer to given image or nullptr, if no such image - * exists. + * Returns pointer to given image or nullptr, if no such image exists. */ - virtual inline std::shared_ptr image2D(size_t id) { return nullptr; } + virtual inline Image2D* image2D(size_t id) { return nullptr; } /** @brief Three-dimensional image count */ virtual inline size_t image3DCount() const { return 0; } @@ -266,53 +217,13 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { * @brief Three-dimensional image * @param id Image ID, from range [0, image3DCount()). * - * Returns (shared) pointer to given image or nullptr, if no such image - * exists. + * Returns pointer to given image or nullptr, if no such image exists. */ - virtual inline std::shared_ptr image3D(size_t id) { return nullptr; } + virtual inline Image3D* image3D(size_t id) { return nullptr; } /*@}*/ }; -/** -@brief Mesh data - -Provides direct access to data of any mesh. See also -AbstractImporter::meshData(). -*/ -class MAGNUM_EXPORT AbstractImporter::MeshData { - public: - /** - * @brief Indices - * @return Indices or nullptr if the mesh is not indexed. - */ - virtual std::vector* const indices() { return nullptr; } - - /** - * @brief Vertices - * @param id ID of vertex data array - * @return Vertices or nullptr if there is no vertex array with given - * ID. - */ - virtual std::vector* const vertices(size_t id) { return nullptr; } - - /** - * @brief Normals - * @param id ID of normal data array - * @return Vertices or nullptr if there is no normal array with given - * ID. - */ - virtual std::vector* const normals(size_t id) { return nullptr; } - - /** - * @brief 2D texture coordinates - * @param id ID of texture coordinates array - * @return Texture coordinates or nullptr if there is no texture - * coordinates array with given ID. - */ - virtual std::vector* const textureCoords2D(size_t id) { return nullptr; } -}; - }} #endif diff --git a/src/Trade/AbstractMaterial.h b/src/Trade/AbstractMaterial.h index 79c68a27b..a369ea276 100644 --- a/src/Trade/AbstractMaterial.h +++ b/src/Trade/AbstractMaterial.h @@ -19,26 +19,39 @@ * @brief Class Magnum::Trade::AbstractMaterial */ -#include "Magnum.h" - namespace Magnum { namespace Trade { -/** @brief Base class for materials */ -class AbstractMaterial { +/** +@brief Base class for materials + +Subclasses provide access to parameters for given material type. +*/ +class MAGNUM_EXPORT AbstractMaterial { AbstractMaterial(const AbstractMaterial& other) = delete; AbstractMaterial(AbstractMaterial&& other) = delete; AbstractMaterial& operator=(const AbstractMaterial& other) = delete; AbstractMaterial& operator=(AbstractMaterial&& other) = delete; public: - AbstractMaterial() = default; + /** @brief Material type */ + enum Type { + Phong /**< Phong shading */ + }; /** - * @brief Use material - * - * Uses associated shader and sets uniforms. + * @brief Constructor + * @param type Material type */ - virtual bool use(const Matrix4& transformationMatrix, const Matrix4& projectionMatrix) = 0; + inline AbstractMaterial(Type type): _type(type) {} + + /** @brief Destructor */ + virtual ~AbstractMaterial() {} + + /** @brief Material type */ + inline Type type() const { return _type; } + + private: + Type _type; }; }} diff --git a/src/Trade/Camera.h b/src/Trade/Camera.h new file mode 100644 index 000000000..2aa0065f5 --- /dev/null +++ b/src/Trade/Camera.h @@ -0,0 +1,36 @@ +#ifndef Magnum_Trade_Camera_h +#define Magnum_Trade_Camera_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Trade::Camera + */ + +namespace Magnum { namespace Trade { + +/** +@brief %Camera +*/ +class MAGNUM_EXPORT Camera { + Camera(const Camera& other) = delete; + Camera(Camera&& other) = delete; + Camera& operator=(const Camera& other) = delete; + Camera& operator=(Camera&& other) = delete; +}; + +}} + +#endif diff --git a/src/Trade/Image.h b/src/Trade/Image.h index e93cb3deb..e6da645cd 100644 --- a/src/Trade/Image.h +++ b/src/Trade/Image.h @@ -26,9 +26,8 @@ namespace Magnum { namespace Trade { /** @brief %Image -Class for storing data, which are later fed to textures. It is just a -transparent envelope around the data, which holds additional information about -data type and dimensions. +Provides access to image data and additional information about data type and +dimensions. */ template class Image { Image(const Image& other) = delete; diff --git a/src/Trade/Light.h b/src/Trade/Light.h new file mode 100644 index 000000000..f96dee289 --- /dev/null +++ b/src/Trade/Light.h @@ -0,0 +1,36 @@ +#ifndef Magnum_Trade_Light_h +#define Magnum_Trade_Light_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Trade::Light + */ + +namespace Magnum { namespace Trade { + +/** +@brief %Light +*/ +class MAGNUM_EXPORT Light { + Light(const Light& other) = delete; + Light(Light&& other) = delete; + Light& operator=(const Light& other) = delete; + Light& operator=(Light&& other) = delete; +}; + +}} + +#endif diff --git a/src/Trade/Mesh.cpp b/src/Trade/Mesh.cpp new file mode 100644 index 000000000..1396f66c0 --- /dev/null +++ b/src/Trade/Mesh.cpp @@ -0,0 +1,27 @@ +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "Mesh.h" + +namespace Magnum { namespace Trade { + +Mesh::~Mesh() { + delete _indices; + for(auto i: _vertices) delete i; + for(auto i: _normals) delete i; + for(auto i: _textureCoords2D) delete i; +} + +}} diff --git a/src/Trade/Mesh.h b/src/Trade/Mesh.h new file mode 100644 index 000000000..81e609510 --- /dev/null +++ b/src/Trade/Mesh.h @@ -0,0 +1,100 @@ +#ifndef Magnum_Trade_Mesh_h +#define Magnum_Trade_Mesh_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Trade::Mesh + */ + +#include "../Mesh.h" + +namespace Magnum { namespace Trade { + +/** +@brief %Mesh + +Provides access to mesh data and additional information, such as primitive +type. +*/ +class MAGNUM_EXPORT Mesh { + Mesh(const Mesh& other) = delete; + Mesh(Mesh&& other) = delete; + Mesh& operator=(const Mesh& other) = delete; + Mesh& operator=(Mesh&& other) = delete; + + public: + /** + * @brief Constructor + * @param primitive Primitive + */ + inline Mesh(Magnum::Mesh::Primitive primitive, std::vector* indices, std::vector*> vertices, std::vector*> normals, std::vector*> textureCoords2D): _primitive(primitive), _indices(indices), _vertices(vertices), _normals(normals), _textureCoords2D(textureCoords2D) {} + + /** @brief Destructor */ + ~Mesh(); + + /** @brief Primitive */ + inline Magnum::Mesh::Primitive primitive() const { return _primitive; } + + /** + * @brief Indices + * @return Indices or nullptr if the mesh is not indexed. + */ + inline std::vector* indices() { return _indices; } + + /** @brief Count of vertex arrays */ + inline size_t vertexArrayCount() { return _vertices.size(); }; + + /** + * @brief Vertices + * @param id ID of vertex data array + * @return Vertices or nullptr if there is no vertex array with given + * ID. + */ + inline std::vector* vertices(size_t id) { return _vertices[id]; } + + /** @brief Count of normal arrays */ + inline size_t normalArrayCount() { return _normals.size(); }; + + /** + * @brief Normals + * @param id ID of normal data array + * @return Vertices or nullptr if there is no normal array with given + * ID. + */ + inline std::vector* normals(size_t id) { return _normals[id]; } + + /** @brief Count of 2D texture coordinate arrays */ + inline size_t textureCoords2DArrayCount() { return _textureCoords2D.size(); }; + + /** + * @brief 2D texture coordinates + * @param id ID of texture coordinates array + * @return Texture coordinates or nullptr if there is no texture + * coordinates array with given ID. + */ + inline std::vector* textureCoords2D(size_t id) { return _textureCoords2D[id]; } + + private: + Magnum::Mesh::Primitive _primitive; + std::vector* _indices; + std::vector*> _vertices, + _normals; + std::vector*> _textureCoords2D; +}; + +}} + +#endif diff --git a/src/Trade/Object.h b/src/Trade/Object.h new file mode 100644 index 000000000..429343d8e --- /dev/null +++ b/src/Trade/Object.h @@ -0,0 +1,53 @@ +#ifndef Magnum_Trade_Object_h +#define Magnum_Trade_Object_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Trade::Object + */ + +#include "Magnum.h" + +namespace Magnum { namespace Trade { + +/** +@brief Object + +Provides access to object transformation and hierarchy. +*/ +struct MAGNUM_EXPORT Object { + Object(const Object& other) = delete; + Object(Object&& other) = delete; + Object& operator=(const Object& other) = delete; + Object& operator=(Object&& other) = delete; + + public: + /** + * @brief Constructor + */ + Object(size_t parent, const Matrix4& transformation): _parent(parent), _transformation(transformation) {} + + inline size_t parent() const { return _parent; } + inline size_t transformation() const { return _transformation; } + + private: + size_t _parent; + Matrix4 _transformation; +}; + +}} + +#endif diff --git a/src/Trade/PhongMaterial.h b/src/Trade/PhongMaterial.h new file mode 100644 index 000000000..50502a0a7 --- /dev/null +++ b/src/Trade/PhongMaterial.h @@ -0,0 +1,62 @@ +#ifndef Magnum_Trade_PhongMaterial_h +#define Magnum_Trade_PhongMaterial_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Trade::PhongMaterial + */ + +#include "Magnum.h" +#include "AbstractMaterial.h" + +namespace Magnum { namespace Trade { + +/** +@brief Phong material +*/ +class MAGNUM_EXPORT PhongMaterial: public AbstractMaterial { + public: + /** + * @brief Constructor + * @param ambientColor Ambient color + * @param diffuseColor Diffuse color + * @param specularColor Specular color + * @param shininess Shininess + */ + PhongMaterial(const Vector3& ambientColor, const Vector3& diffuseColor, const Vector3& specularColor, GLfloat shininess): AbstractMaterial(Phong), _ambientColor(ambientColor), _diffuseColor(diffuseColor), _specularColor(specularColor), _shininess(shininess) {} + + /** @brief Ambient color */ + inline Vector3 ambientColor() const { return _ambientColor; } + + /** @brief Diffuse color */ + inline Vector3 diffuseColor() const { return _diffuseColor; } + + /** @brief Specular color */ + inline Vector3 specularColor() const { return _specularColor; } + + /** @brief Shininess */ + inline GLfloat shininess() const { return _shininess; } + + private: + Vector3 _ambientColor, + _diffuseColor, + _specularColor; + GLfloat _shininess; +}; + +}} + +#endif diff --git a/src/Trade/Scene.h b/src/Trade/Scene.h new file mode 100644 index 000000000..7f488633d --- /dev/null +++ b/src/Trade/Scene.h @@ -0,0 +1,36 @@ +#ifndef Magnum_Trade_Scene_h +#define Magnum_Trade_Scene_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Trade::Scene + */ + +namespace Magnum { namespace Trade { + +/** +@brief %Scene +*/ +class MAGNUM_EXPORT Scene { + Scene(const Scene& other) = delete; + Scene(Scene&& other) = delete; + Scene& operator=(const Scene& other) = delete; + Scene& operator=(Scene&& other) = delete; +}; + +}} + +#endif diff --git a/src/Trade/Texture.h b/src/Trade/Texture.h new file mode 100644 index 000000000..eb3ec15a7 --- /dev/null +++ b/src/Trade/Texture.h @@ -0,0 +1,36 @@ +#ifndef Magnum_Trade_Texture_h +#define Magnum_Trade_Texture_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +/** @file + * @brief Class Magnum::Trade::Texture + */ + +namespace Magnum { namespace Trade { + +/** +@brief %Texture +*/ +class MAGNUM_EXPORT Texture { + Texture(const Texture& other) = delete; + Texture(Texture&& other) = delete; + Texture& operator=(const Texture& other) = delete; + Texture& operator=(Texture&& other) = delete; +}; + +}} + +#endif