- if(cur_obj!=this)
- return;
-
- if(mask&AMBIENT)
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r);
- if(mask&DIFFUSE)
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r);
- if(mask&SPECULAR)
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r);
- if(mask&EMISSION)
- glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, &emission.r);
- if(mask&SHININESS)
- glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+ string source = create_program_source();
+ string name = format("_material_%016x.glsl", hash64(source));
+ Program *shprog = coll.find<Program>(name);
+ if(shprog)
+ return shprog;
+
+ shprog = new Program(create_program_source());
+ try
+ {
+ coll.add(name, shprog);
+ }
+ catch(...)
+ {
+ delete shprog;
+ throw;
+ }
+
+ return shprog;