diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-05-14 15:50:03 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2016-06-08 22:45:40 +0300 |
commit | 64c9b93513b4f3e8a3c3ed19fe6fa8176334446a (patch) | |
tree | 70558c3cfbfde40e727c5a414d7660e668c83d2e /intern/cycles/render | |
parent | 40453dbca1ee07dc1ecc4a8ad148b8c20e622270 (diff) |
Code refactor: use shader pointers rather than shader indexes.
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/background.cpp | 18 | ||||
-rw-r--r-- | intern/cycles/render/background.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/light.cpp | 17 | ||||
-rw-r--r-- | intern/cycles/render/light.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/mesh.cpp | 33 | ||||
-rw-r--r-- | intern/cycles/render/mesh.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/mesh_displace.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/render/object.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/render/osl.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/render/scene.h | 8 | ||||
-rw-r--r-- | intern/cycles/render/shader.cpp | 55 | ||||
-rw-r--r-- | intern/cycles/render/shader.h | 3 | ||||
-rw-r--r-- | intern/cycles/render/svm.cpp | 8 |
13 files changed, 83 insertions, 77 deletions
diff --git a/intern/cycles/render/background.cpp b/intern/cycles/render/background.cpp index 0cd164dc03e..89f90bc8dad 100644 --- a/intern/cycles/render/background.cpp +++ b/intern/cycles/render/background.cpp @@ -37,7 +37,7 @@ Background::Background() use_ao = false; visibility = PATH_RAY_ALL_VISIBILITY; - shader = 0; + shader = NULL; transparent = false; need_update = true; @@ -54,10 +54,14 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene device_free(device, dscene); - if(use_shader) - shader = scene->default_background; + Shader *bg_shader = shader; + + if(use_shader) { + if(!bg_shader) + bg_shader = scene->default_background; + } else - shader = scene->default_empty; + bg_shader = scene->default_empty; /* set shader index and transparent option */ KernelBackground *kbackground = &dscene->data.background; @@ -72,15 +76,15 @@ void Background::device_update(Device *device, DeviceScene *dscene, Scene *scene } kbackground->transparent = transparent; - kbackground->surface_shader = scene->shader_manager->get_shader_id(shader); + kbackground->surface_shader = scene->shader_manager->get_shader_id(bg_shader); - if(scene->shaders[shader]->has_volume) + if(bg_shader->has_volume) kbackground->volume_shader = kbackground->surface_shader; else kbackground->volume_shader = SHADER_NONE; /* No background node, make world shader invisible to all rays, to skip evaluation in kernel. */ - if(scene->shaders[shader]->graph->nodes.size() <= 1) { + if(bg_shader->graph->nodes.size() <= 1) { kbackground->surface_shader |= SHADER_EXCLUDE_ANY; } /* Background present, check visibilities */ diff --git a/intern/cycles/render/background.h b/intern/cycles/render/background.h index 8bf97f5d6f7..645d002424e 100644 --- a/intern/cycles/render/background.h +++ b/intern/cycles/render/background.h @@ -23,6 +23,7 @@ CCL_NAMESPACE_BEGIN class Device; class DeviceScene; +class Shader; class Scene; class Background { @@ -34,7 +35,7 @@ public: bool use_ao; uint visibility; - uint shader; + Shader *shader; bool transparent; bool need_update; diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index fef28b25f3e..4564b935de4 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -126,7 +126,7 @@ Light::Light() use_transmission = true; use_scatter = true; - shader = 0; + shader = NULL; samples = 1; max_bounces = 1024; @@ -147,7 +147,7 @@ bool Light::has_contribution(Scene *scene) if(type == LIGHT_BACKGROUND) { return true; } - return scene->shaders[shader]->has_surface_emission; + return (shader) ? shader->has_surface_emission : scene->default_light->has_surface_emission; } /* Light Manager */ @@ -180,7 +180,7 @@ void LightManager::disable_ineffective_light(Device *device, Scene *scene) * - If unsupported on a device * - If we don't need it (no HDRs etc.) */ - Shader *shader = scene->shaders[scene->background->shader]; + Shader *shader = (scene->background->shader) ? scene->background->shader : scene->default_background; bool disable_mis = !(has_portal || shader->has_surface_spatial_varying) || !(device->info.advanced_shading); if(disable_mis) { @@ -223,9 +223,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen continue; /* skip if we have no emission shaders */ - foreach(uint sindex, mesh->used_shaders) { - Shader *shader = scene->shaders[sindex]; - + foreach(Shader *shader, mesh->used_shaders) { if(shader->use_mis && shader->has_surface_emission) { have_emission = true; break; @@ -270,9 +268,7 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen } /* skip if we have no emission shaders */ - foreach(uint sindex, mesh->used_shaders) { - Shader *shader = scene->shaders[sindex]; - + foreach(Shader *shader, mesh->used_shaders) { if(shader->use_mis && shader->has_surface_emission) { have_emission = true; break; @@ -604,7 +600,8 @@ void LightManager::device_update_points(Device *device, } float3 co = light->co; - int shader_id = scene->shader_manager->get_shader_id(light->shader); + Shader *shader = (light->shader) ? light->shader : scene->default_light; + int shader_id = scene->shader_manager->get_shader_id(shader); float samples = __int_as_float(light->samples); float max_bounces = __int_as_float(light->max_bounces); diff --git a/intern/cycles/render/light.h b/intern/cycles/render/light.h index 15038d0a920..24ca0157eba 100644 --- a/intern/cycles/render/light.h +++ b/intern/cycles/render/light.h @@ -27,6 +27,7 @@ CCL_NAMESPACE_BEGIN class Device; class DeviceScene; class Progress; +class Shader; class Scene; class Light { @@ -59,7 +60,7 @@ public: bool is_portal; bool is_enabled; - int shader; + Shader *shader; int samples; int max_bounces; diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index f8273107e1b..96e6ce0918b 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -413,7 +413,9 @@ void Mesh::pack_normals(Scene *scene, uint *tri_shader, float4 *vnormal) if(shader_ptr[i] != last_shader || last_smooth != smooth[i]) { last_shader = shader_ptr[i]; last_smooth = smooth[i]; - shader_id = scene->shader_manager->get_shader_id(last_shader, this, last_smooth); + Shader *shader = (last_shader < used_shaders.size()) ? + used_shaders[last_shader] : scene->default_surface; + shader_id = scene->shader_manager->get_shader_id(shader, this, last_smooth); } tri_shader[i] = shader_id; @@ -483,7 +485,9 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, s for(size_t i = 0; i < curve_num; i++) { Curve curve = curve_ptr[i]; - shader_id = scene->shader_manager->get_shader_id(curve.shader, this, false); + Shader *shader = (curve.shader < used_shaders.size()) ? + used_shaders[curve.shader] : scene->default_surface; + shader_id = scene->shader_manager->get_shader_id(shader, this, false); curve_data[i] = make_float4( __int_as_float(curve.first_key + curvekey_offset), @@ -545,8 +549,8 @@ void Mesh::tag_update(Scene *scene, bool rebuild) scene->light_manager->need_update = true; } else { - foreach(uint sindex, used_shaders) - if(scene->shaders[sindex]->has_surface_emission) + foreach(Shader *shader, used_shaders) + if(shader->has_surface_emission) scene->light_manager->need_update = true; } @@ -921,8 +925,7 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene, scene->need_global_attributes(mesh_attributes[i]); - foreach(uint sindex, mesh->used_shaders) { - Shader *shader = scene->shaders[sindex]; + foreach(Shader *shader, mesh->used_shaders) { mesh_attributes[i].add(shader->attributes); } } @@ -1168,8 +1171,7 @@ void MeshManager::device_update_flags(Device * /*device*/, /* update flags */ foreach(Mesh *mesh, scene->meshes) { mesh->has_volume = false; - foreach(uint shader_index, mesh->used_shaders) { - const Shader *shader = scene->shaders[shader_index]; + foreach(const Shader *shader, mesh->used_shaders) { if(shader->has_volume) { mesh->has_volume = true; } @@ -1192,8 +1194,7 @@ void MeshManager::device_update_displacement_images(Device *device, set<int> bump_images; foreach(Mesh *mesh, scene->meshes) { if(mesh->need_update) { - foreach(uint shader_index, mesh->used_shaders) { - Shader *shader = scene->shaders[shader_index]; + foreach(Shader *shader, mesh->used_shaders) { if(shader->graph_bump == NULL) { continue; } @@ -1239,8 +1240,8 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen /* update normals */ foreach(Mesh *mesh, scene->meshes) { - foreach(uint shader, mesh->used_shaders) { - if(scene->shaders[shader]->need_update_attributes) + foreach(Shader *shader, mesh->used_shaders) { + if(shader->need_update_attributes) mesh->need_update = true; } @@ -1428,8 +1429,8 @@ bool Mesh::need_attribute(Scene *scene, AttributeStandard std) if(scene->need_global_attribute(std)) return true; - foreach(uint shader, used_shaders) - if(scene->shaders[shader]->attributes.find(std)) + foreach(Shader *shader, used_shaders) + if(shader->attributes.find(std)) return true; return false; @@ -1440,8 +1441,8 @@ bool Mesh::need_attribute(Scene *scene, ustring name) if(name == ustring()) return false; - foreach(uint shader, used_shaders) - if(scene->shaders[shader]->attributes.find(name)) + foreach(Shader *shader, used_shaders) + if(shader->attributes.find(name)) return true; return false; diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h index 006a4889d50..557b664bff3 100644 --- a/intern/cycles/render/mesh.h +++ b/intern/cycles/render/mesh.h @@ -94,7 +94,7 @@ public: vector<float4> curve_keys; /* co + radius */ vector<Curve> curves; - vector<uint> used_shaders; + vector<Shader*> used_shaders; AttributeSet attributes; AttributeSet curve_attributes; diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp index dccfd74f17a..df8be4cbe2f 100644 --- a/intern/cycles/render/mesh_displace.cpp +++ b/intern/cycles/render/mesh_displace.cpp @@ -32,8 +32,8 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me bool has_displacement = false; if(mesh->displacement_method != Mesh::DISPLACE_BUMP) { - foreach(uint sindex, mesh->used_shaders) - if(scene->shaders[sindex]->has_displacement) + foreach(Shader *shader, mesh->used_shaders) + if(shader->has_displacement) has_displacement = true; } diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index a7ea75820ea..e2fe0bd72a1 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -185,9 +185,7 @@ void Object::tag_update(Scene *scene) if(mesh->transform_applied) mesh->need_update = true; - foreach(uint sindex, mesh->used_shaders) { - Shader *shader = scene->shaders[sindex]; - + foreach(Shader *shader, mesh->used_shaders) { if(shader->use_mis && shader->has_surface_emission) scene->light_manager->need_update = true; } diff --git a/intern/cycles/render/osl.cpp b/intern/cycles/render/osl.cpp index 88a69e251db..5118d4b17da 100644 --- a/intern/cycles/render/osl.cpp +++ b/intern/cycles/render/osl.cpp @@ -99,7 +99,7 @@ void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene thread_scoped_lock lock(ss_mutex); OSLCompiler compiler((void*)this, (void*)ss, scene->image_manager); - compiler.background = (shader == scene->shaders[scene->default_background]); + compiler.background = (shader == scene->default_background); compiler.compile(scene, og, shader); if(shader->use_mis && shader->has_surface_emission) diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index 435d7a396c5..33c03d40f27 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -183,10 +183,10 @@ public: BakeManager *bake_manager; /* default shaders */ - int default_surface; - int default_light; - int default_background; - int default_empty; + Shader *default_surface; + Shader *default_light; + Shader *default_background; + Shader *default_empty; /* device */ Device *device; diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp index 82b607563ed..1453958a0aa 100644 --- a/intern/cycles/render/shader.cpp +++ b/intern/cycles/render/shader.cpp @@ -157,6 +157,7 @@ Shader::Shader() has_object_dependency = false; has_integrator_dependency = false; + id = -1; used = false; need_update = true; @@ -287,10 +288,10 @@ uint ShaderManager::get_attribute_id(AttributeStandard std) return (uint)std; } -int ShaderManager::get_shader_id(uint shader, Mesh *mesh, bool smooth) +int ShaderManager::get_shader_id(Shader *shader, Mesh *mesh, bool smooth) { /* get a shader id to pass to the kernel */ - int id = shader*2; + int id = shader->id*2; /* index depends bump since this setting is not in the shader */ if(mesh && mesh->displacement_method != Mesh::DISPLACE_TRUE) @@ -309,21 +310,27 @@ void ShaderManager::device_update_shaders_used(Scene *scene) { /* figure out which shaders are in use, so SVM/OSL can skip compiling them * for speed and avoid loading image textures into memory */ - foreach(Shader *shader, scene->shaders) + uint id = 0; + foreach(Shader *shader, scene->shaders) { shader->used = false; + shader->id = id++; + } + + scene->default_surface->used = true; + scene->default_light->used = true; + scene->default_background->used = true; + scene->default_empty->used = true; - scene->shaders[scene->background->shader]->used = true; - scene->shaders[scene->default_surface]->used = true; - scene->shaders[scene->default_light]->used = true; - scene->shaders[scene->default_background]->used = true; - scene->shaders[scene->default_empty]->used = true; + if(scene->background->shader) + scene->background->shader->used = true; foreach(Mesh *mesh, scene->meshes) - foreach(uint shader, mesh->used_shaders) - scene->shaders[shader]->used = true; + foreach(Shader *shader, mesh->used_shaders) + shader->used = true; foreach(Light *light, scene->lights) - scene->shaders[light->shader]->used = true; + if(light->shader) + light->shader->used = true; } void ShaderManager::device_update_common(Device *device, @@ -426,13 +433,11 @@ void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scen void ShaderManager::add_default(Scene *scene) { - Shader *shader; - ShaderGraph *graph; ShaderNode *closure, *out; /* default surface */ { - graph = new ShaderGraph(); + ShaderGraph *graph = new ShaderGraph(); closure = graph->add(new DiffuseBsdfNode()); closure->input("Color")->value = make_float3(0.8f, 0.8f, 0.8f); @@ -440,16 +445,16 @@ void ShaderManager::add_default(Scene *scene) graph->connect(closure->output("BSDF"), out->input("Surface")); - shader = new Shader(); + Shader *shader = new Shader(); shader->name = "default_surface"; shader->graph = graph; scene->shaders.push_back(shader); - scene->default_surface = scene->shaders.size() - 1; + scene->default_surface = shader; } /* default light */ { - graph = new ShaderGraph(); + ShaderGraph *graph = new ShaderGraph(); closure = graph->add(new EmissionNode()); closure->input("Color")->value = make_float3(0.8f, 0.8f, 0.8f); @@ -458,33 +463,33 @@ void ShaderManager::add_default(Scene *scene) graph->connect(closure->output("Emission"), out->input("Surface")); - shader = new Shader(); + Shader *shader = new Shader(); shader->name = "default_light"; shader->graph = graph; scene->shaders.push_back(shader); - scene->default_light = scene->shaders.size() - 1; + scene->default_light = shader; } /* default background */ { - graph = new ShaderGraph(); + ShaderGraph *graph = new ShaderGraph(); - shader = new Shader(); + Shader *shader = new Shader(); shader->name = "default_background"; shader->graph = graph; scene->shaders.push_back(shader); - scene->default_background = scene->shaders.size() - 1; + scene->default_background = shader; } /* default empty */ { - graph = new ShaderGraph(); + ShaderGraph *graph = new ShaderGraph(); - shader = new Shader(); + Shader *shader = new Shader(); shader->name = "default_empty"; shader->graph = graph; scene->shaders.push_back(shader); - scene->default_empty = scene->shaders.size() - 1; + scene->default_empty = shader; } } diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h index d7692a2b6f5..4a1502cb86d 100644 --- a/intern/cycles/render/shader.h +++ b/intern/cycles/render/shader.h @@ -112,6 +112,7 @@ public: AttributeRequestSet attributes; /* determined before compiling */ + uint id; bool used; #ifdef WITH_OSL @@ -159,7 +160,7 @@ public: uint get_attribute_id(AttributeStandard std); /* get shader id for mesh faces */ - int get_shader_id(uint shader, Mesh *mesh = NULL, bool smooth = false); + int get_shader_id(Shader *shader, Mesh *mesh = NULL, bool smooth = false); /* add default shaders to scene, to use as default for things that don't * have any shader assigned explicitly */ diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index 1d00a5f764e..ab4fe4193db 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -66,9 +66,7 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene svm_nodes.push_back(make_int4(NODE_SHADER_JUMP, 0, 0, 0)); } - for(i = 0; i < scene->shaders.size(); i++) { - Shader *shader = scene->shaders[i]; - + foreach(Shader *shader, scene->shaders) { if(progress.get_cancel()) return; assert(shader->graph); @@ -78,8 +76,8 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene SVMCompiler::Summary summary; SVMCompiler compiler(scene->shader_manager, scene->image_manager); - compiler.background = ((int)i == scene->default_background); - compiler.compile(scene, shader, svm_nodes, i, &summary); + compiler.background = (shader == scene->default_background); + compiler.compile(scene, shader, svm_nodes, shader->id, &summary); VLOG(2) << "Compilation summary:\n" << "Shader name: " << shader->name << "\n" |