+void RenderPass::finalize_material()
+{
+ ensure_private_shader_data();
+
+ if(!texturing)
+ texturing = new Texturing;
+ material->attach_textures_to(*texturing, *shdata);
+}
+
+void RenderPass::ensure_private_shader_data()
+{
+ if(!shprog)
+ throw invalid_operation("RenderPass::ensure_private_shader_data");
+
+ if(!shdata)
+ shdata = new ProgramData(shprog);
+ else if(shdata.refcount() > 1)
+ shdata = new ProgramData(*shdata);
+}
+
+void RenderPass::set_shader_program(const Program *prog, const ProgramData *data)
+{
+ shprog = prog;
+ shdata = (data ? new ProgramData(*data) : 0);
+}
+
+const string &RenderPass::get_slotted_uniform_name(const string &slot) const
+{
+ map<string, string>::const_iterator i = uniform_slots.find(slot);
+ if(i==uniform_slots.end())
+ {
+ static string empty;
+ return empty;
+ }
+ return i->second;
+}
+