/* Copyright (C) 2005-2006 Feeling Software Inc. MIT License: http://www.opensource.org/licenses/mit-license.php */ /* Based on the FS Import classes: Copyright (C) 2005-2006 Feeling Software Inc Copyright (C) 2005-2006 Autodesk Media Entertainment MIT License: http://www.opensource.org/licenses/mit-license.php */ /** @file FCDMaterialInstance.h This file contains the FCDMaterialInstance and the FCDMaterialInstanceBind classes. */ #ifndef _FCD_MATERIAL_BIND_H_ #define _FCD_MATERIAL_BIND_H_ #include "FCDocument/FCDEntityInstance.h" class FCDocument; class FCDGeometryInstance; /** A ColladaFX per-instance binding. */ class FCOLLADA_EXPORT FCDMaterialInstanceBind { public: string semantic; string target; }; typedef vector FCDMaterialInstanceBindList; /**< A dynamically-sized array of per-instance binding. */ /** A COLLADA material instance. A material instance is used to given polygon sets with a COLLADA material entity. It is also used to bind data sources with the inputs of an effect. @ingroup FCDocument */ class FCOLLADA_EXPORT FCDMaterialInstance : public FCDEntityInstance { private: DeclareObjectType; FCDGeometryInstance* parent; fstring semantic; FCDMaterial* material; FCDMaterialInstanceBindList bindings; public: FCDMaterialInstance(FCDocument* document, FCDGeometryInstance* parent); virtual ~FCDMaterialInstance(); // Accessors virtual Type GetType() const { return MATERIAL; } inline const fstring& GetSemantic() const { return semantic; } inline void SetSemantic(const fchar* _semantic) { semantic = _semantic; } inline void SetSemantic(const fstring& _semantic) { semantic = _semantic; } inline FCDMaterial* GetMaterial() { return material; } inline const FCDMaterial* GetMaterial() const { return material; } inline void SetMaterial(FCDMaterial* _material) { material = _material; } inline FCDMaterialInstanceBindList& GetBindings() { return bindings; } inline const FCDMaterialInstanceBindList& GetBindings() const { return bindings; } inline size_t GetBindingCount() const { return bindings.size(); } inline FCDMaterialInstanceBind* GetBinding(size_t index) { FUAssert(index < bindings.size(), return NULL); return &bindings.at(index); } inline const FCDMaterialInstanceBind* GetBinding(size_t index) const { FUAssert(index < bindings.size(), return NULL); return &bindings.at(index); } FCDMaterialInstanceBind* AddBinding(); FCDMaterialInstanceBind* AddBinding(const char* semantic, const char* target); inline FCDMaterialInstanceBind* AddBinding(const string& semantic, const char* target) { return AddBinding(semantic.c_str(), target); } inline FCDMaterialInstanceBind* AddBinding(const char* semantic, const string& target) { return AddBinding(semantic, target.c_str()); } inline FCDMaterialInstanceBind* AddBinding(const string& semantic, const string& target) { return AddBinding(semantic.c_str(), target.c_str()); } void ReleaseBinding(size_t index); /** Creates a flattened version of the instantiated material. This is the prefered way to generate viewer materials from a COLLADA document. @return The flattened version of the instantiated material. You will need to delete this pointer manually. This pointer will be NULL when there is no material attached to this instance. */ FCDMaterial* FlattenMaterial(); // Read in the materal instantiation from the COLLADA document virtual FUStatus LoadFromXML(xmlNode* instanceNode); FUStatus LoadFromId(const string& materialId); // COLLADA 1.3 backward compatibility // Write out the instantiation information to the xml node tree xmlNode* WriteToXML(xmlNode* parentNode) const; }; #endif // _FCD_MATERIAL_BIND_H_