]> git.tdb.fi Git - libs/gl.git/blobdiff - source/technique.cpp
Use maputils functions
[libs/gl.git] / source / technique.cpp
index 78060e01f9b89e80e28f7171fc40cea23188d327..b809abdebb69fdcf4d1a015473285713d5c297f6 100644 (file)
@@ -1,13 +1,6 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #include <msp/core/refptr.h>
 #include <msp/datafile/collection.h>
-#include <msp/strings/formatter.h>
+#include <msp/strings/format.h>
 #include "material.h"
 #include "program.h"
 #include "programdata.h"
@@ -20,6 +13,11 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
+RenderPass &Technique::add_pass(const GL::Tag &tag)
+{
+       return insert_unique(passes, tag, RenderPass())->second;
+}
+
 bool Technique::has_pass(const GL::Tag &tag) const
 {
        return passes.count(tag);
@@ -27,15 +25,23 @@ bool Technique::has_pass(const GL::Tag &tag) const
 
 const RenderPass &Technique::get_pass(const GL::Tag &tag) const
 {
-       PassMap::const_iterator i=passes.find(tag);
-       if(i==passes.end())
-               throw KeyError("Unknown pass");
-       return i->second;
+       return get_item(passes, tag);
 }
 
 
+Technique::Loader::Loader(Technique &t):
+       DataFile::CollectionObjectLoader<Technique>(t, 0)
+{
+       init();
+}
+
 Technique::Loader::Loader(Technique &t, Collection &c):
        DataFile::CollectionObjectLoader<Technique>(t, &c)
+{
+       init();
+}
+
+void Technique::Loader::init()
 {
        add("inherit", &Loader::inherit);
        add("pass", &Loader::pass);
@@ -43,20 +49,20 @@ Technique::Loader::Loader(Technique &t, Collection &c):
 
 void Technique::Loader::inherit(const string &n)
 {
-       obj.passes=get_collection().get<Technique>(n)->get_passes();
+       obj.passes = get_collection().get<Technique>(n)->get_passes();
        InheritLoader ldr(obj, get_collection());
        load_sub_with(ldr);
 }
 
 void Technique::Loader::pass(const string &n)
 {
-       Tag tag(n);
-       if(obj.passes.count(tag))
-               throw KeyError("Duplicate pass name", n);
-
        RenderPass p;
-       load_sub(p, *coll);
-       obj.passes.insert(PassMap::value_type(tag, p));
+       if(coll)
+               load_sub(p, get_collection());
+       else
+               load_sub(p);
+
+       insert_unique(obj.passes, n, p);
 }
 
 
@@ -66,17 +72,15 @@ Technique::InheritLoader::InheritLoader(Technique &t, Collection &c):
        add("texture", &InheritLoader::texture);
 }
 
-void Technique::InheritLoader::texture(const string &slot, const string &name)
+void Technique::InheritLoader::texture(const std::string &slot, const string &name)
 {
-       Texture *tex=get_collection().get<Texture>(name);
+       Texture *tex = get_collection().get<Texture>(name);
        for(PassMap::iterator i=obj.passes.begin(); i!=obj.passes.end(); ++i)
        {
-               try
-               {
-                       i->second.set_texture(slot, tex);
-               }
-               catch(const KeyError &)
-               { }
+               int index = i->second.get_texture_index(slot);
+               if(index<0)
+                       continue;
+               i->second.set_texture(index, tex);
        }
 }