From 28b28d66f100b4a15621dc6e2b378f819b1e3ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 23 Jun 2012 03:46:35 +0200 Subject: [PATCH] AbstractImporter: Added functions for matching IDs and names. Also added getters for names in all *Data classes. --- src/Primitives/Capsule.cpp | 2 +- src/Primitives/Capsule.h | 2 +- src/Primitives/Cube.cpp | 2 +- src/Primitives/Icosphere.cpp | 2 +- src/Primitives/Plane.cpp | 2 +- src/Trade/AbstractImporter.h | 80 ++++++++++++++++++++++++++++++++ src/Trade/AbstractMaterialData.h | 9 +++- src/Trade/CameraData.h | 15 ++++++ src/Trade/ImageData.h | 10 +++- src/Trade/LightData.h | 15 ++++++ src/Trade/MeshData.h | 7 ++- src/Trade/MeshObjectData.h | 3 +- src/Trade/ObjectData.h | 7 ++- src/Trade/PhongMaterialData.h | 3 +- src/Trade/SceneData.h | 8 +++- src/Trade/TextureData.h | 15 ++++++ 16 files changed, 169 insertions(+), 13 deletions(-) diff --git a/src/Primitives/Capsule.cpp b/src/Primitives/Capsule.cpp index 66d1bb00c..00303e687 100644 --- a/src/Primitives/Capsule.cpp +++ b/src/Primitives/Capsule.cpp @@ -19,7 +19,7 @@ using namespace std; namespace Magnum { namespace Primitives { -Capsule::Capsule(unsigned int rings, unsigned int segments, GLfloat length, TextureCoords textureCoords): MeshData(Mesh::Primitive::Triangles, new vector, {new vector()}, {new vector()}, textureCoords == TextureCoords::Generate ? vector*>{new vector()} : vector*>()), segments(segments), textureCoords(textureCoords) { +Capsule::Capsule(unsigned int rings, unsigned int segments, GLfloat length, TextureCoords textureCoords): MeshData("", Mesh::Primitive::Triangles, new vector, {new vector()}, {new vector()}, textureCoords == TextureCoords::Generate ? vector*>{new vector()} : vector*>()), segments(segments), textureCoords(textureCoords) { CORRADE_ASSERT(rings >= 1 && segments >= 3, "Capsule must have at least one ring and three segments", ) GLfloat height = 2.0f+length; diff --git a/src/Primitives/Capsule.h b/src/Primitives/Capsule.h index 84273e170..79c715231 100644 --- a/src/Primitives/Capsule.h +++ b/src/Primitives/Capsule.h @@ -52,7 +52,7 @@ class Capsule: public Trade::MeshData { Capsule(unsigned int rings, unsigned int segments, GLfloat length, TextureCoords textureCoords = TextureCoords::DontGenerate); private: - inline Capsule(unsigned int segments, TextureCoords textureCoords): MeshData(Mesh::Primitive::Triangles, new std::vector, {new std::vector()}, {new std::vector()}, textureCoords == TextureCoords::Generate ? std::vector*>{new std::vector()} : std::vector*>()), segments(segments), textureCoords(textureCoords) {} + inline Capsule(unsigned int segments, TextureCoords textureCoords): MeshData("", Mesh::Primitive::Triangles, new std::vector, {new std::vector()}, {new std::vector()}, textureCoords == TextureCoords::Generate ? std::vector*>{new std::vector()} : std::vector*>()), segments(segments), textureCoords(textureCoords) {} void capVertex(GLfloat y, GLfloat normalY, GLfloat textureCoordsV); void vertexRings(unsigned int count, GLfloat centerY, GLfloat startRingAngle, GLfloat ringAngleIncrement, GLfloat startTextureCoordsV, GLfloat textureCoordsVIncrement); diff --git a/src/Primitives/Cube.cpp b/src/Primitives/Cube.cpp index 97695260e..ef908bf5c 100644 --- a/src/Primitives/Cube.cpp +++ b/src/Primitives/Cube.cpp @@ -19,7 +19,7 @@ using namespace std; namespace Magnum { namespace Primitives { -Cube::Cube(): MeshData(Mesh::Primitive::Triangles, new vector{ +Cube::Cube(): MeshData("", Mesh::Primitive::Triangles, new vector{ 0, 2, 1, 2, 3, 1, 1, 3, 5, diff --git a/src/Primitives/Icosphere.cpp b/src/Primitives/Icosphere.cpp index 2627ba42b..7e667d141 100644 --- a/src/Primitives/Icosphere.cpp +++ b/src/Primitives/Icosphere.cpp @@ -19,7 +19,7 @@ using namespace std; namespace Magnum { namespace Primitives { -Icosphere<0>::Icosphere(): MeshData(Mesh::Primitive::Triangles, new vector{ +Icosphere<0>::Icosphere(): MeshData("", Mesh::Primitive::Triangles, new vector{ 1, 2, 6, 1, 7, 2, 3, 4, 5, diff --git a/src/Primitives/Plane.cpp b/src/Primitives/Plane.cpp index 04903b226..e6216bf37 100644 --- a/src/Primitives/Plane.cpp +++ b/src/Primitives/Plane.cpp @@ -19,7 +19,7 @@ using namespace std; namespace Magnum { namespace Primitives { -Plane::Plane(): MeshData(Mesh::Primitive::TriangleStrip, nullptr, {new vector{ +Plane::Plane(): MeshData("", Mesh::Primitive::TriangleStrip, nullptr, {new vector{ {1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}, diff --git a/src/Trade/AbstractImporter.h b/src/Trade/AbstractImporter.h index 022ed5fac..ae1e9a6ac 100644 --- a/src/Trade/AbstractImporter.h +++ b/src/Trade/AbstractImporter.h @@ -115,6 +115,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief %Scene count */ virtual inline unsigned int sceneCount() const { return 0; } + /** + * @brief %Scene ID for given name + * + * If no scene for given name exists, returns -1. + * @see SceneData::name() + */ + virtual inline int sceneForName(const std::string& name) { return -1; } + /** * @brief %Scene * @param id %Scene ID, from range [0, sceneCount()). @@ -126,6 +134,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief %Light count */ virtual inline unsigned int lightCount() const { return 0; } + /** + * @brief %Light ID for given name + * + * If no light for given name exists, returns -1. + * @see LightData::name() + */ + virtual inline int lightForName(const std::string& name) { return -1; } + /** * @brief %Light * @param id %Light ID, from range [0, lightCount()). @@ -137,6 +153,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief %Camera count */ virtual inline unsigned int cameraCount() const { return 0; } + /** + * @brief %Camera ID for given name + * + * If no camera for given name exists, returns -1. + * @see CameraData::name() + */ + virtual inline int cameraForName(const std::string& name) { return -1; } + /** * @brief %Camera * @param id %Camera ID, from range [0, cameraCount()). @@ -149,6 +173,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief %Object count */ virtual inline unsigned int objectCount() const { return 0; } + /** + * @brief %Object ID for given name + * + * If no scene for given name exists, returns -1. + * @see ObjectData::name() + */ + virtual inline int objectForName(const std::string& name) { return -1; } + /** * @brief %Object * @param id %Object ID, from range [0, objectCount()). @@ -161,6 +193,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief %Mesh count */ virtual inline unsigned int meshCount() const { return 0; } + /** + * @brief %Mesh ID for given name + * + * If no mesh for given name exists, returns -1. + * @see MeshData::name() + */ + virtual inline int meshForName(const std::string& name) { return -1; } + /** * @brief %Mesh * @param id %Mesh ID, from range [0, meshCount()). @@ -172,6 +212,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief Material count */ virtual inline unsigned int materialCount() const { return 0; } + /** + * @brief Material ID for given name + * + * If no material for given name exists, returns -1. + * @see AbstractMaterialData::name() + */ + virtual inline int materialForName(const std::string& name) { return -1; } + /** * @brief Material * @param id Material ID, from range [0, materialCount()). @@ -184,6 +232,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief %Texture count */ virtual inline unsigned int textureCount() const { return 0; } + /** + * @brief %Texture ID for given name + * + * If no texture for given name exists, returns -1. + * @see TextureData::name() + */ + virtual inline int textureForName(const std::string& name) { return -1; } + /** * @brief %Texture * @param id %Texture ID, from range [0, textureCount()). @@ -196,6 +252,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief One-dimensional image count */ virtual inline unsigned int image1DCount() const { return 0; } + /** + * @brief One-dimensional image ID for given name + * + * If no image for given name exists, returns -1. + * @see ImageData1D::name() + */ + virtual inline int image1DForName(const std::string& name) { return -1; } + /** * @brief One-dimensional image * @param id %Image ID, from range [0, image1DCount()). @@ -207,6 +271,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief Two-dimensional image count */ virtual inline unsigned int image2DCount() const { return 0; } + /** + * @brief Two-dimensional image ID for given name + * + * If no image for given name exists, returns -1. + * @see ImageData2D::name() + */ + virtual inline int image2DForName(const std::string& name) { return -1; } + /** * @brief Two-dimensional image * @param id %Image ID, from range [0, image2DCount()). @@ -218,6 +290,14 @@ class MAGNUM_EXPORT AbstractImporter: public Corrade::PluginManager::Plugin { /** @brief Three-dimensional image count */ virtual inline unsigned int image3DCount() const { return 0; } + /** + * @brief Three-dimensional image ID for given name + * + * If no image for given name exists, returns -1. + * @see ImageData3D::name() + */ + virtual inline int image3DForName(const std::string& name) { return -1; } + /** * @brief Three-dimensional image * @param id %Image ID, from range [0, image3DCount()). diff --git a/src/Trade/AbstractMaterialData.h b/src/Trade/AbstractMaterialData.h index 370684576..477146bea 100644 --- a/src/Trade/AbstractMaterialData.h +++ b/src/Trade/AbstractMaterialData.h @@ -19,6 +19,8 @@ * @brief Class Magnum::Trade::AbstractMaterialData */ +#include + namespace Magnum { namespace Trade { /** @@ -40,17 +42,22 @@ class AbstractMaterialData { /** * @brief Constructor + * @param name Material name * @param type Material type */ - inline AbstractMaterialData(Type type): _type(type) {} + inline AbstractMaterialData(const std::string& name, Type type): _name(name), _type(type) {} /** @brief Destructor */ virtual ~AbstractMaterialData() = 0; + /** @brief Material name */ + inline std::string name() const { return _name; } + /** @brief Material type */ inline Type type() const { return _type; } private: + std::string _name; Type _type; }; diff --git a/src/Trade/CameraData.h b/src/Trade/CameraData.h index ba2586226..914832e4d 100644 --- a/src/Trade/CameraData.h +++ b/src/Trade/CameraData.h @@ -19,6 +19,8 @@ * @brief Class Magnum::Trade::CameraData */ +#include + namespace Magnum { namespace Trade { /** @@ -29,6 +31,19 @@ class MAGNUM_EXPORT CameraData { CameraData(CameraData&& other) = delete; CameraData& operator=(const CameraData& other) = delete; CameraData& operator=(CameraData&& other) = delete; + + public: + /** + * @brief Constructor + * @param name %Camera name + */ + inline CameraData(const std::string& name): _name(name) {} + + /** @brief %Camera name */ + inline std::string name() const { return _name; } + + private: + std::string _name; }; }} diff --git a/src/Trade/ImageData.h b/src/Trade/ImageData.h index a8e8a525a..587fb0bc9 100644 --- a/src/Trade/ImageData.h +++ b/src/Trade/ImageData.h @@ -36,6 +36,7 @@ template class ImageData: public AbstractImage { /** * @brief Constructor + * @param name %Image name * @param dimensions %Image dimensions * @param components Color components. Data type is detected * from passed data array. @@ -44,10 +45,11 @@ template class ImageData: public AbstractImage { * Note that the image data are not copied on construction, but they * are deleted on class destruction. */ - template inline ImageData(const Math::Vector& dimensions, Components components, T* data): AbstractImage(components, TypeTraits::imageType()), _dimensions(dimensions), _data(reinterpret_cast(data)) {} + template inline ImageData(const std::string& name, const Math::Vector& dimensions, Components components, T* data): AbstractImage(components, TypeTraits::imageType()), _name(name), _dimensions(dimensions), _data(reinterpret_cast(data)) {} /** * @brief Constructor + * @param name %Image name * @param dimensions %Image dimensions * @param components Color components * @param type Data type @@ -56,11 +58,14 @@ template class ImageData: public AbstractImage { * Note that the image data are not copied on construction, but they * are deleted on class destruction. */ - inline ImageData(const Math::Vector& dimensions, Components components, ComponentType type, GLvoid* data): AbstractImage(components, type), _dimensions(dimensions), _data(reinterpret_cast(data)) {} + inline ImageData(const std::string& name, const Math::Vector& dimensions, Components components, ComponentType type, GLvoid* data): AbstractImage(components, type), _name(name), _dimensions(dimensions), _data(reinterpret_cast(data)) {} /** @brief Destructor */ inline ~ImageData() { delete[] _data; } + /** @brief %Image name */ + inline std::string name() const { return _name; } + /** @brief %Image dimensions */ inline constexpr const Math::Vector& dimensions() const { return _dimensions; } @@ -68,6 +73,7 @@ template class ImageData: public AbstractImage { inline constexpr const void* data() const { return _data; } private: + std::string _name; Math::Vector _dimensions; char* _data; }; diff --git a/src/Trade/LightData.h b/src/Trade/LightData.h index 27e98ddce..824dde363 100644 --- a/src/Trade/LightData.h +++ b/src/Trade/LightData.h @@ -19,6 +19,8 @@ * @brief Class Magnum::Trade::LightData */ +#include + namespace Magnum { namespace Trade { /** @@ -29,6 +31,19 @@ class MAGNUM_EXPORT LightData { LightData(LightData&& other) = delete; LightData& operator=(const LightData& other) = delete; LightData& operator=(LightData&& other) = delete; + + public: + /** + * @brief Constructor + * @param name %Light name + */ + inline LightData(const std::string& name): _name(name) {} + + /** @brief %Light name */ + inline std::string name() const { return _name; } + + private: + std::string _name; }; }} diff --git a/src/Trade/MeshData.h b/src/Trade/MeshData.h index f26f6b052..7617f56c3 100644 --- a/src/Trade/MeshData.h +++ b/src/Trade/MeshData.h @@ -38,6 +38,7 @@ class MAGNUM_EXPORT MeshData { public: /** * @brief Constructor + * @param name %Mesh name * @param primitive Primitive * @param indices Array with indices or 0, if this is not * indexed mesh @@ -47,11 +48,14 @@ class MAGNUM_EXPORT MeshData { * @param textureCoords2D Array with two-dimensional texture * coordinate arrays or empty array */ - inline MeshData(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) {} + inline MeshData(const std::string& name, Mesh::Primitive primitive, std::vector* indices, std::vector*> vertices, std::vector*> normals, std::vector*> textureCoords2D): _name(name), _primitive(primitive), _indices(indices), _vertices(vertices), _normals(normals), _textureCoords2D(textureCoords2D) {} /** @brief Destructor */ ~MeshData(); + /** @brief %Mesh name */ + inline std::string name() const { return _name; } + /** @brief Primitive */ inline Mesh::Primitive primitive() const { return _primitive; } @@ -99,6 +103,7 @@ class MAGNUM_EXPORT MeshData { inline const std::vector* textureCoords2D(unsigned int id) const { return _textureCoords2D[id]; } /**< @overload */ private: + std::string _name; Mesh::Primitive _primitive; std::vector* _indices; std::vector*> _vertices; diff --git a/src/Trade/MeshObjectData.h b/src/Trade/MeshObjectData.h index 91d59a631..e8b9568e3 100644 --- a/src/Trade/MeshObjectData.h +++ b/src/Trade/MeshObjectData.h @@ -37,6 +37,7 @@ class MeshObjectData: public ObjectData { public: /** * @brief Constructor + * @param name %Mesh object name * @param children Child objects * @param transformation Transformation (relative to parent) * @param instance Instance ID @@ -44,7 +45,7 @@ class MeshObjectData: public ObjectData { * * Creates object with mesh instance type. */ - inline MeshObjectData(std::vector children, const Matrix4& transformation, unsigned int instance, unsigned int material): ObjectData(children, transformation, InstanceType::Mesh, instance), _material(material) {} + inline MeshObjectData(const std::string& name, const std::vector& children, const Matrix4& transformation, unsigned int instance, unsigned int material): ObjectData(name, children, transformation, InstanceType::Mesh, instance), _material(material) {} /** @brief Material ID */ inline unsigned int material() const { return _material; } diff --git a/src/Trade/ObjectData.h b/src/Trade/ObjectData.h index 69d40ff80..f7c28cfc2 100644 --- a/src/Trade/ObjectData.h +++ b/src/Trade/ObjectData.h @@ -45,16 +45,20 @@ class ObjectData { /** * @brief Constructor + * @param name Object name * @param children Child objects * @param transformation Transformation (relative to parent) * @param instanceType Instance type * @param instanceId Instance ID */ - inline ObjectData(std::vector children, const Matrix4& transformation, InstanceType instanceType, unsigned int instanceId): _children(children), _transformation(transformation), _instanceType(instanceType), _instanceId(instanceId) {} + inline ObjectData(const std::string& name, std::vector children, const Matrix4& transformation, InstanceType instanceType, unsigned int instanceId): _name(name), _children(children), _transformation(transformation), _instanceType(instanceType), _instanceId(instanceId) {} /** @brief Destructor */ inline virtual ~ObjectData() {} + /** @brief %Object name */ + inline std::string name() const { return _name; } + /** @brief Child objects */ inline std::vector& children() { return _children; } @@ -78,6 +82,7 @@ class ObjectData { inline unsigned int instanceId() const { return _instanceId; } private: + std::string _name; std::vector _children; Matrix4 _transformation; InstanceType _instanceType; diff --git a/src/Trade/PhongMaterialData.h b/src/Trade/PhongMaterialData.h index b03f76caf..7aa7cf453 100644 --- a/src/Trade/PhongMaterialData.h +++ b/src/Trade/PhongMaterialData.h @@ -31,12 +31,13 @@ class PhongMaterialData: public AbstractMaterialData { public: /** * @brief Constructor + * @param name Material name * @param ambientColor Ambient color * @param diffuseColor Diffuse color * @param specularColor Specular color * @param shininess Shininess */ - PhongMaterialData(const Vector3& ambientColor, const Vector3& diffuseColor, const Vector3& specularColor, GLfloat shininess): AbstractMaterialData(Phong), _ambientColor(ambientColor), _diffuseColor(diffuseColor), _specularColor(specularColor), _shininess(shininess) {} + PhongMaterialData(const std::string& name, const Vector3& ambientColor, const Vector3& diffuseColor, const Vector3& specularColor, GLfloat shininess): AbstractMaterialData(name, Phong), _ambientColor(ambientColor), _diffuseColor(diffuseColor), _specularColor(specularColor), _shininess(shininess) {} /** @brief Ambient color */ inline Vector3 ambientColor() const { return _ambientColor; } diff --git a/src/Trade/SceneData.h b/src/Trade/SceneData.h index c2cd786fd..678243208 100644 --- a/src/Trade/SceneData.h +++ b/src/Trade/SceneData.h @@ -19,6 +19,7 @@ * @brief Class Magnum::Trade::SceneData */ +#include #include namespace Magnum { namespace Trade { @@ -35,14 +36,19 @@ class MAGNUM_EXPORT SceneData { public: /** * @brief Constructor + * @param name %Scene name * @param children Child objects */ - inline SceneData(const std::vector& children): _children(children) {} + inline SceneData(const std::string& name, const std::vector& children): _name(name), _children(children) {} + + /** @brief %Scene name */ + inline std::string name() const { return _name; } /** @brief Child objects */ inline const std::vector& children() const { return _children; } private: + std::string _name; std::vector _children; }; diff --git a/src/Trade/TextureData.h b/src/Trade/TextureData.h index ad2c70003..d2e9ed825 100644 --- a/src/Trade/TextureData.h +++ b/src/Trade/TextureData.h @@ -19,6 +19,8 @@ * @brief Class Magnum::Trade::TextureData */ +#include + namespace Magnum { namespace Trade { /** @@ -29,6 +31,19 @@ class MAGNUM_EXPORT TextureData { TextureData(TextureData&& other) = delete; TextureData& operator=(const TextureData& other) = delete; TextureData& operator=(TextureData&& other) = delete; + + public: + /** + * @brief Constructor + * @param name %Texture name + */ + inline TextureData(const std::string& name): _name(name) {} + + /** @brief %Texture name */ + inline std::string name() const { return _name; } + + private: + std::string _name; }; }}