[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57278] trunk/blender/intern/cycles: Cycles: mist pass added, with start/depth/falloff control.
Brecht Van Lommel
brechtvanlommel at pandora.be
Fri Jun 7 14:45:26 CEST 2013
Revision: 57278
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57278
Author: blendix
Date: 2013-06-07 12:45:26 +0000 (Fri, 07 Jun 2013)
Log Message:
-----------
Cycles: mist pass added, with start/depth/falloff control. If the pass is
enabled in a render layer a Mist Pass panel will be shown in the world
properties.
Modified Paths:
--------------
trunk/blender/intern/cycles/blender/addon/ui.py
trunk/blender/intern/cycles/blender/blender_session.cpp
trunk/blender/intern/cycles/blender/blender_sync.cpp
trunk/blender/intern/cycles/kernel/kernel_accumulate.h
trunk/blender/intern/cycles/kernel/kernel_passes.h
trunk/blender/intern/cycles/kernel/kernel_types.h
trunk/blender/intern/cycles/render/film.cpp
trunk/blender/intern/cycles/render/film.h
Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/blender/addon/ui.py 2013-06-07 12:45:26 UTC (rev 57278)
@@ -326,16 +326,15 @@
col = split.column()
col.prop(rl, "use_pass_combined")
col.prop(rl, "use_pass_z")
+ col.prop(rl, "use_pass_mist")
col.prop(rl, "use_pass_normal")
col.prop(rl, "use_pass_vector")
col.prop(rl, "use_pass_uv")
col.prop(rl, "use_pass_object_index")
col.prop(rl, "use_pass_material_index")
- col.prop(rl, "use_pass_ambient_occlusion")
col.prop(rl, "use_pass_shadow")
col = split.column()
- col.label()
col.label(text="Diffuse:")
row = col.row(align=True)
row.prop(rl, "use_pass_diffuse_direct", text="Direct", toggle=True)
@@ -354,6 +353,7 @@
col.prop(rl, "use_pass_emit", text="Emission")
col.prop(rl, "use_pass_environment")
+ col.prop(rl, "use_pass_ambient_occlusion")
class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
@@ -748,7 +748,32 @@
row.prop(light, "ao_factor", text="Factor")
row.prop(light, "distance", text="Distance")
+class CyclesWorld_PT_mist(CyclesButtonsPanel, Panel):
+ bl_label = "Mist Pass"
+ bl_context = "world"
+ bl_options = {'DEFAULT_CLOSED'}
+ @classmethod
+ def poll(cls, context):
+ if CyclesButtonsPanel.poll(context):
+ for rl in context.scene.render.layers:
+ if rl.use_pass_mist:
+ return True
+
+ return False
+
+ def draw(self, context):
+ layout = self.layout
+
+ world = context.world
+
+ split = layout.split(align=True)
+ split.prop(world.mist_settings, "start")
+ split.prop(world.mist_settings, "depth")
+
+ layout.prop(world.mist_settings, "falloff")
+
+
class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
bl_label = "Settings"
bl_context = "world"
Modified: trunk/blender/intern/cycles/blender/blender_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp 2013-06-07 12:45:26 UTC (rev 57278)
@@ -187,6 +187,8 @@
case BL::RenderPass::type_Z:
return PASS_DEPTH;
+ case BL::RenderPass::type_MIST:
+ return PASS_MIST;
case BL::RenderPass::type_NORMAL:
return PASS_NORMAL;
case BL::RenderPass::type_OBJECT_INDEX:
@@ -233,7 +235,6 @@
case BL::RenderPass::type_REFRACTION:
case BL::RenderPass::type_SPECULAR:
case BL::RenderPass::type_REFLECTION:
- case BL::RenderPass::type_MIST:
return PASS_NONE;
}
Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp 2013-06-07 12:45:26 UTC (rev 57278)
@@ -208,6 +208,7 @@
void BlenderSync::sync_film()
{
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ BL::WorldMistSettings b_mist = b_scene.world().mist_settings();
Film *film = scene->film;
Film prevfilm = *film;
@@ -216,6 +217,21 @@
film->filter_type = (FilterType)RNA_enum_get(&cscene, "filter_type");
film->filter_width = (film->filter_type == FILTER_BOX)? 1.0f: get_float(cscene, "filter_width");
+ film->mist_start = b_mist.start();
+ film->mist_depth = b_mist.depth();
+
+ switch(b_mist.falloff()) {
+ case BL::WorldMistSettings::falloff_QUADRATIC:
+ film->mist_falloff = 2.0f;
+ break;
+ case BL::WorldMistSettings::falloff_LINEAR:
+ film->mist_falloff = 1.0f;
+ break;
+ case BL::WorldMistSettings::falloff_INVERSE_QUADRATIC:
+ film->mist_falloff = 0.5f;
+ break;
+ }
+
if(film->modified(prevfilm))
film->tag_update(scene);
}
Modified: trunk/blender/intern/cycles/kernel/kernel_accumulate.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_accumulate.h 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/kernel/kernel_accumulate.h 2013-06-07 12:45:26 UTC (rev 57278)
@@ -141,6 +141,7 @@
L->background = make_float3(0.0f, 0.0f, 0.0f);
L->ao = make_float3(0.0f, 0.0f, 0.0f);
L->shadow = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
+ L->mist = 0.0f;
}
else
L->emission = make_float3(0.0f, 0.0f, 0.0f);
Modified: trunk/blender/intern/cycles/kernel/kernel_passes.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_passes.h 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/kernel/kernel_passes.h 2013-06-07 12:45:26 UTC (rev 57278)
@@ -86,6 +86,31 @@
L->color_glossy += shader_bsdf_glossy(kg, sd)*throughput;
if(flag & (PASS_TRANSMISSION_INDIRECT|PASS_TRANSMISSION_COLOR|PASS_TRANSMISSION_DIRECT))
L->color_transmission += shader_bsdf_transmission(kg, sd)*throughput;
+
+ if(flag & PASS_MIST) {
+ /* bring depth into 0..1 range */
+ float mist_start = kernel_data.film.mist_start;
+ float mist_inv_depth = kernel_data.film.mist_inv_depth;
+
+ float depth = camera_distance(kg, sd->P);
+ float mist = clamp((depth - mist_start)*mist_inv_depth, 0.0f, 1.0f);
+
+ /* falloff */
+ float mist_falloff = kernel_data.film.mist_falloff;
+
+ if(mist_falloff == 1.0f)
+ ;
+ else if(mist_falloff == 2.0f)
+ mist = mist*mist;
+ else if(mist_falloff == 0.5f)
+ mist = sqrtf(mist);
+ else
+ mist = powf(mist, mist_falloff);
+
+ /* modulate by transparency */
+ float3 alpha = throughput*(make_float3(1.0f, 1.0f, 1.0f) - shader_bsdf_transparency(kg, sd));
+ L->mist += (1.0f - mist)*average(alpha);
+ }
#endif
}
@@ -128,6 +153,8 @@
shadow.w = kernel_data.film.pass_shadow_scale;
kernel_write_pass_float4(buffer + kernel_data.film.pass_shadow, sample, shadow);
}
+ if(flag & PASS_MIST)
+ kernel_write_pass_float(buffer + kernel_data.film.pass_mist, sample, L->mist);
#endif
}
Modified: trunk/blender/intern/cycles/kernel/kernel_types.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_types.h 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/kernel/kernel_types.h 2013-06-07 12:45:26 UTC (rev 57278)
@@ -253,7 +253,8 @@
PASS_AO = 131072,
PASS_SHADOW = 262144,
PASS_MOTION = 524288,
- PASS_MOTION_WEIGHT = 1048576
+ PASS_MOTION_WEIGHT = 1048576,
+ PASS_MIST = 2097152
} PassType;
#define PASS_ALL (~0)
@@ -290,6 +291,7 @@
float3 path_transmission;
float4 shadow;
+ float mist;
} PathRadiance;
typedef struct BsdfEval {
@@ -658,9 +660,13 @@
int pass_shadow;
float pass_shadow_scale;
+ int filter_table_offset;
+ int pass_pad1;
- int filter_table_offset;
- int filter_pad;
+ int pass_mist;
+ float mist_start;
+ float mist_inv_depth;
+ float mist_falloff;
} KernelFilm;
typedef struct KernelBackground {
Modified: trunk/blender/intern/cycles/render/film.cpp
===================================================================
--- trunk/blender/intern/cycles/render/film.cpp 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/render/film.cpp 2013-06-07 12:45:26 UTC (rev 57278)
@@ -65,6 +65,9 @@
pass.components = 1;
pass.filter = false;
break;
+ case PASS_MIST:
+ pass.components = 1;
+ break;
case PASS_NORMAL:
pass.components = 4;
break;
@@ -252,6 +255,10 @@
filter_width = 1.0f;
filter_table_offset = TABLE_OFFSET_INVALID;
+ mist_start = 0.0f;
+ mist_depth = 100.0f;
+ mist_falloff = 1.0f;
+
need_update = true;
}
@@ -284,6 +291,10 @@
case PASS_DEPTH:
kfilm->pass_depth = kfilm->pass_stride;
break;
+ case PASS_MIST:
+ kfilm->pass_mist = kfilm->pass_stride;
+ kfilm->use_light_pass = 1;
+ break;
case PASS_NORMAL:
kfilm->pass_normal = kfilm->pass_stride;
break;
@@ -366,6 +377,11 @@
filter_table_offset = scene->lookup_tables->add_table(dscene, table);
kfilm->filter_table_offset = (int)filter_table_offset;
+ /* mist pass parameters */
+ kfilm->mist_start = mist_start;
+ kfilm->mist_inv_depth = (mist_depth > 0.0f)? 1.0f/mist_depth: 0.0f;
+ kfilm->mist_falloff = mist_falloff;
+
need_update = false;
}
Modified: trunk/blender/intern/cycles/render/film.h
===================================================================
--- trunk/blender/intern/cycles/render/film.h 2013-06-07 07:48:30 UTC (rev 57277)
+++ trunk/blender/intern/cycles/render/film.h 2013-06-07 12:45:26 UTC (rev 57278)
@@ -57,6 +57,10 @@
float filter_width;
size_t filter_table_offset;
+ float mist_start;
+ float mist_depth;
+ float mist_falloff;
+
bool need_update;
Film();
More information about the Bf-blender-cvs
mailing list