Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2016-05-14 15:50:03 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2016-05-17 22:39:16 +0300
commit0e8cd14dfee9788f24854aa8f4148033ef042f51 (patch)
tree4fd7fdb358f9ef4ccdcb934025b74ee6f25598ad /intern/cycles/render/shader.cpp
parent08670d3b8117cda608c178688f261e1204794a0d (diff)
Code refactor: use shader pointers rather than shader indexes.
Diffstat (limited to 'intern/cycles/render/shader.cpp')
-rw-r--r--intern/cycles/render/shader.cpp55
1 files changed, 30 insertions, 25 deletions
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;
}
}