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:
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r--intern/cycles/kernel/geom/object.h10
-rw-r--r--intern/cycles/kernel/osl/services.cpp5
-rw-r--r--intern/cycles/kernel/osl/services.h1
-rw-r--r--intern/cycles/kernel/osl/shaders/node_object_info.osl2
-rw-r--r--intern/cycles/kernel/svm/geometry.h3
-rw-r--r--intern/cycles/kernel/svm/types.h1
-rw-r--r--intern/cycles/kernel/types.h2
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);