+void RenderPass::finalize_material(DataFile::Collection *coll)
+{
+ maybe_create_material_shader(coll);
+ ensure_private_shader_data();
+
+ if(!texturing)
+ texturing = new Texturing;
+ material->attach_textures_to(*texturing, *shdata);
+}
+
+void RenderPass::maybe_create_material_shader(DataFile::Collection *coll)
+{
+ if(shprog && !shprog_from_material)
+ return;
+
+ if(coll)
+ {
+ shprog = material->create_compatible_shader(*coll);
+ shprog.keep();
+ }
+ else
+ shprog = material->create_compatible_shader();
+
+ if(shdata)
+ shdata = new ProgramData(*shdata, shprog.get());
+
+ shprog_from_material = true;
+}
+
+void RenderPass::ensure_private_shader_data()
+{
+ if(!shprog)
+ throw invalid_operation("RenderPass::ensure_private_shader_data");
+
+ if(!shdata)
+ shdata = new ProgramData(shprog.get());
+ else if(shdata.refcount()>1)
+ shdata = new ProgramData(*shdata);
+}
+