diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2013-12-28 04:54:44 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2013-12-28 19:57:02 +0400 |
commit | a35db17cee5a9b47dc9624f7dfcb41f5fc185b33 (patch) | |
tree | ef23032da73b9b202490307f865e2afd4e2e7e76 /intern/cycles/kernel/osl/osl_shader.cpp | |
parent | a06c9c277a8577f7ef473fffaf2258d2a3a6ab80 (diff) |
Cycles Volume Render: work on nodes and closures.
* Henyey-Greenstein scattering closure implementation.
* Rename transparent to absorption node and isotropic to scatter node.
* Volume density is folded into the closure weights.
* OSL support for volume closures and nodes.
* This commit has no user visible changes, there is no volume render code yet.
This is work by "storm", Stuart Broadfoot, Thomas Dinges and myself.
Diffstat (limited to 'intern/cycles/kernel/osl/osl_shader.cpp')
-rw-r--r-- | intern/cycles/kernel/osl/osl_shader.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/intern/cycles/kernel/osl/osl_shader.cpp b/intern/cycles/kernel/osl/osl_shader.cpp index b0461013239..4358d3f2e76 100644 --- a/intern/cycles/kernel/osl/osl_shader.cpp +++ b/intern/cycles/kernel/osl/osl_shader.cpp @@ -187,7 +187,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag, #endif /* add */ - if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) { + if(sc.sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure < MAX_CLOSURE) { sd->closure[sd->num_closure++] = sc; sd->flag |= bsdf->shaderdata_flag(); } @@ -243,7 +243,7 @@ static void flatten_surface_closure_tree(ShaderData *sd, int path_flag, CBSSRDFClosure *bssrdf = (CBSSRDFClosure *)prim; float sample_weight = fabsf(average(weight)); - if(sample_weight > 1e-5f && sd->num_closure+2 < MAX_CLOSURE) { + if(sample_weight > CLOSURE_WEIGHT_CUTOFF && sd->num_closure+2 < MAX_CLOSURE) { sc.sample_weight = sample_weight; sc.type = bssrdf->sc.type; @@ -401,18 +401,21 @@ static void flatten_volume_closure_tree(ShaderData *sd, switch (prim->category) { case CClosurePrimitive::Volume: { + CVolumeClosure *volume = (CVolumeClosure *)prim; /* sample weight */ float sample_weight = fabsf(average(weight)); sc.sample_weight = sample_weight; - sc.type = CLOSURE_VOLUME_ID; - sc.data0 = 0.0f; - sc.data1 = 0.0f; - sc.prim = NULL; + sc.type = volume->sc.type; + sc.data0 = volume->sc.data0; + sc.data1 = volume->sc.data1; /* add */ - if(sc.sample_weight > 1e-5f && sd->num_closure < MAX_CLOSURE) + if(sc.sample_weight > CLOSURE_WEIGHT_CUTOFF && + sd->num_closure < MAX_CLOSURE) { sd->closure[sd->num_closure++] = sc; + sd->flag |= volume->shaderdata_flag(); + } break; } case CClosurePrimitive::Holdout: @@ -451,6 +454,10 @@ void OSLShader::eval_volume(KernelGlobals *kg, ShaderData *sd, float randb, int if (kg->osl->volume_state[shader]) ss->execute(*octx, *(kg->osl->volume_state[shader]), *globals); + + /* flatten closure tree */ + sd->num_closure = 0; + sd->randb_closure = randb; if (globals->Ci) flatten_volume_closure_tree(sd, globals->Ci); |