diff options
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r-- | intern/cycles/kernel/geom/object.h | 10 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/services.cpp | 5 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/services.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/osl/shaders/node_object_info.osl | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/geometry.h | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/types.h | 1 | ||||
-rw-r--r-- | intern/cycles/kernel/types.h | 2 |
7 files changed, 24 insertions, 0 deletions
diff --git a/intern/cycles/kernel/geom/object.h b/intern/cycles/kernel/geom/object.h index e8f5dfcc529..86c57c84b47 100644 --- a/intern/cycles/kernel/geom/object.h +++ b/intern/cycles/kernel/geom/object.h @@ -263,6 +263,16 @@ ccl_device_inline float3 object_color(KernelGlobals kg, int object) return make_float3(kobject->color[0], kobject->color[1], kobject->color[2]); } +/* Alpha of the object */ + +ccl_device_inline float object_alpha(KernelGlobals kg, int object) +{ + if (object == OBJECT_NONE) + return 0.0f; + + return kernel_tex_fetch(__objects, object).alpha; +} + /* Pass ID number of object */ ccl_device_inline float object_pass_id(KernelGlobals kg, int object) diff --git a/intern/cycles/kernel/osl/services.cpp b/intern/cycles/kernel/osl/services.cpp index 85bdb47600e..79547872c68 100644 --- a/intern/cycles/kernel/osl/services.cpp +++ b/intern/cycles/kernel/osl/services.cpp @@ -76,6 +76,7 @@ ustring OSLRenderServices::u_raster("raster"); ustring OSLRenderServices::u_ndc("NDC"); ustring OSLRenderServices::u_object_location("object:location"); ustring OSLRenderServices::u_object_color("object:color"); +ustring OSLRenderServices::u_object_alpha("object:alpha"); ustring OSLRenderServices::u_object_index("object:index"); ustring OSLRenderServices::u_geom_dupli_generated("geom:dupli_generated"); ustring OSLRenderServices::u_geom_dupli_uv("geom:dupli_uv"); @@ -873,6 +874,10 @@ bool OSLRenderServices::get_object_standard_attribute(const KernelGlobalsCPU *kg float3 f = object_color(kg, sd->object); return set_attribute_float3(f, type, derivatives, val); } + else if (name == u_object_alpha) { + float f = object_alpha(kg, sd->object); + return set_attribute_float(f, type, derivatives, val); + } else if (name == u_object_index) { float f = object_pass_id(kg, sd->object); return set_attribute_float(f, type, derivatives, val); diff --git a/intern/cycles/kernel/osl/services.h b/intern/cycles/kernel/osl/services.h index 0685003ca5c..653fa017140 100644 --- a/intern/cycles/kernel/osl/services.h +++ b/intern/cycles/kernel/osl/services.h @@ -259,6 +259,7 @@ class OSLRenderServices : public OSL::RendererServices { static ustring u_ndc; static ustring u_object_location; static ustring u_object_color; + static ustring u_object_alpha; static ustring u_object_index; static ustring u_geom_dupli_generated; static ustring u_geom_dupli_uv; diff --git a/intern/cycles/kernel/osl/shaders/node_object_info.osl b/intern/cycles/kernel/osl/shaders/node_object_info.osl index 37e545f9988..8ed73231213 100644 --- a/intern/cycles/kernel/osl/shaders/node_object_info.osl +++ b/intern/cycles/kernel/osl/shaders/node_object_info.osl @@ -5,12 +5,14 @@ shader node_object_info(output point Location = point(0.0, 0.0, 0.0), output color Color = color(1.0, 1.0, 1.0), + output float Alpha = 1.0, output float ObjectIndex = 0.0, output float MaterialIndex = 0.0, output float Random = 0.0) { getattribute("object:location", Location); getattribute("object:color", Color); + getattribute("object:alpha", Alpha); getattribute("object:index", ObjectIndex); getattribute("material:index", MaterialIndex); getattribute("object:random", Random); diff --git a/intern/cycles/kernel/svm/geometry.h b/intern/cycles/kernel/svm/geometry.h index c1a5fdb8ca4..4b5368dd765 100644 --- a/intern/cycles/kernel/svm/geometry.h +++ b/intern/cycles/kernel/svm/geometry.h @@ -116,6 +116,9 @@ ccl_device_noinline void svm_node_object_info(KernelGlobals kg, stack_store_float3(stack, out_offset, object_color(kg, sd->object)); return; } + case NODE_INFO_OB_ALPHA: + data = object_alpha(kg, sd->object); + break; case NODE_INFO_OB_INDEX: data = object_pass_id(kg, sd->object); break; diff --git a/intern/cycles/kernel/svm/types.h b/intern/cycles/kernel/svm/types.h index 777a27b8716..bede58f7a54 100644 --- a/intern/cycles/kernel/svm/types.h +++ b/intern/cycles/kernel/svm/types.h @@ -142,6 +142,7 @@ typedef enum NodeGeometry { typedef enum NodeObjectInfo { NODE_INFO_OB_LOCATION, NODE_INFO_OB_COLOR, + NODE_INFO_OB_ALPHA, NODE_INFO_OB_INDEX, NODE_INFO_MAT_INDEX, NODE_INFO_OB_RANDOM diff --git a/intern/cycles/kernel/types.h b/intern/cycles/kernel/types.h index 24eb783daf9..07d4a95780b 100644 --- a/intern/cycles/kernel/types.h +++ b/intern/cycles/kernel/types.h @@ -1307,6 +1307,7 @@ typedef struct KernelObject { float pass_id; float random_number; float color[3]; + float alpha; int particle_index; float dupli_generated[3]; @@ -1330,6 +1331,7 @@ typedef struct KernelObject { uint visibility; int primitive_type; + int pad[2]; } KernelObject; static_assert_align(KernelObject, 16); |