X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fmaterials%2Fmaterial.h;h=278fc4dc0ee8ba7da8ce27fcd392d5c4bf0c2b46;hp=2f8f38ab7ce183c40492b3d75f2b11c2904939a6;hb=a4b9ae04a0a89bb2cf3ab4235d7376d3ff70af7b;hpb=da85eb77172dbd62f764a63b45c79fc059af563b diff --git a/source/materials/material.h b/source/materials/material.h index 2f8f38ab..278fc4dc 100644 --- a/source/materials/material.h +++ b/source/materials/material.h @@ -62,31 +62,32 @@ public: { private: template - struct AddType + struct CreateMaterial { - void operator()(const std::string &kw, GenericLoader &ldr) const { ldr.add(kw, &GenericLoader::typed_material); } + void operator()(const std::string &, GenericLoader &) const; }; DataFile::Collection *coll; - RefPtr material; + Material *material; + Loader *mat_loader; static ActionMap shared_actions; public: GenericLoader(DataFile::Collection * = 0); + ~GenericLoader(); - Material *get_material() { return material.release(); } + Material *get_material() { Material *m = material; material = 0; return m; } private: virtual void init_actions(); - template - void typed_material(); + void type(const DataFile::Symbol &); friend class Material; }; private: - typedef TypeRegistry MaterialRegistry; + typedef TypeRegistry MaterialRegistry; protected: const Sampler *sampler; @@ -194,16 +195,18 @@ void Material::PropertyLoader::property_texture(void (C::*set_texture)(const template -void Material::GenericLoader::typed_material() +void Material::GenericLoader::CreateMaterial::operator()(const std::string &, GenericLoader &ldr) const { - if(material) - throw std::logic_error("Material was already loaded"); - RefPtr mat = new T; - if(coll) - load_sub(*mat, *coll); + if(ldr.material) + throw std::logic_error("Material type was already specified"); + + T *mat = new T; + ldr.material = mat; + if(ldr.coll) + ldr.mat_loader = new typename T::Loader(*mat, *ldr.coll); else - load_sub(*mat); - material = mat; + ldr.mat_loader = new typename T::Loader(*mat); + ldr.add_auxiliary_loader(*ldr.mat_loader); } } // namespace GL