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:
-rw-r--r--intern/cycles/blender/object.cpp4
-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
-rw-r--r--intern/cycles/scene/object.cpp2
-rw-r--r--intern/cycles/scene/object.h1
-rw-r--r--intern/cycles/scene/shader_nodes.cpp6
-rw-r--r--source/blender/gpu/shaders/material/gpu_shader_material_object_info.glsl2
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_object_info.cc1
13 files changed, 39 insertions, 1 deletions
diff --git a/intern/cycles/blender/object.cpp b/intern/cycles/blender/object.cpp
index 559b0d42a29..054142a9ca4 100644
--- a/intern/cycles/blender/object.cpp
+++ b/intern/cycles/blender/object.cpp
@@ -319,7 +319,9 @@ Object *BlenderSync::sync_object(BL::Depsgraph &b_depsgraph,
(object->get_geometry() && object->get_geometry()->is_modified())) {
object->name = b_ob.name().c_str();
object->set_pass_id(b_ob.pass_index());
- object->set_color(get_float3(b_ob.color()));
+ const BL::Array<float, 4> object_color = b_ob.color();
+ object->set_color(get_float3(object_color));
+ object->set_alpha(object_color[3]);
object->set_tfm(tfm);
/* dupli texture coordinates and random_id */
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);
diff --git a/intern/cycles/scene/object.cpp b/intern/cycles/scene/object.cpp
index 97c86804507..fda9a211e60 100644
--- a/intern/cycles/scene/object.cpp
+++ b/intern/cycles/scene/object.cpp
@@ -76,6 +76,7 @@ NODE_DEFINE(Object)
SOCKET_TRANSFORM(tfm, "Transform", transform_identity());
SOCKET_UINT(visibility, "Visibility", ~0);
SOCKET_COLOR(color, "Color", zero_float3());
+ SOCKET_FLOAT(alpha, "Alpha", 0.0f);
SOCKET_UINT(random_id, "Random ID", 0);
SOCKET_INT(pass_id, "Pass ID", 0);
SOCKET_BOOLEAN(use_holdout, "Use Holdout", false);
@@ -414,6 +415,7 @@ void ObjectManager::device_update_object_transform(UpdateObjectTransformState *s
kobject.color[0] = color.x;
kobject.color[1] = color.y;
kobject.color[2] = color.z;
+ kobject.alpha = ob->alpha;
kobject.pass_id = pass_id;
kobject.random_number = random_number;
kobject.particle_index = particle_index;
diff --git a/intern/cycles/scene/object.h b/intern/cycles/scene/object.h
index e18968bc0ed..55689ccfa58 100644
--- a/intern/cycles/scene/object.h
+++ b/intern/cycles/scene/object.h
@@ -44,6 +44,7 @@ class Object : public Node {
NODE_SOCKET_API(uint, random_id)
NODE_SOCKET_API(int, pass_id)
NODE_SOCKET_API(float3, color)
+ NODE_SOCKET_API(float, alpha)
NODE_SOCKET_API(ustring, asset_name)
vector<ParamValue> attributes;
NODE_SOCKET_API(uint, visibility)
diff --git a/intern/cycles/scene/shader_nodes.cpp b/intern/cycles/scene/shader_nodes.cpp
index ba85cbde1d0..272a0dde7d8 100644
--- a/intern/cycles/scene/shader_nodes.cpp
+++ b/intern/cycles/scene/shader_nodes.cpp
@@ -4216,6 +4216,7 @@ NODE_DEFINE(ObjectInfoNode)
SOCKET_OUT_VECTOR(location, "Location");
SOCKET_OUT_COLOR(color, "Color");
+ SOCKET_OUT_FLOAT(alpha, "Alpha");
SOCKET_OUT_FLOAT(object_index, "Object Index");
SOCKET_OUT_FLOAT(material_index, "Material Index");
SOCKET_OUT_FLOAT(random, "Random");
@@ -4239,6 +4240,11 @@ void ObjectInfoNode::compile(SVMCompiler &compiler)
compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_COLOR, compiler.stack_assign(out));
}
+ out = output("Alpha");
+ if (!out->links.empty()) {
+ compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_ALPHA, compiler.stack_assign(out));
+ }
+
out = output("Object Index");
if (!out->links.empty()) {
compiler.add_node(NODE_OBJECT_INFO, NODE_INFO_OB_INDEX, compiler.stack_assign(out));
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_object_info.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_object_info.glsl
index ff77b0beea2..607cf119b36 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_object_info.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_object_info.glsl
@@ -4,12 +4,14 @@ void node_object_info(mat4 obmat,
float mat_index,
out vec3 location,
out vec4 color,
+ out float alpha,
out float object_index,
out float material_index,
out float random)
{
location = obmat[3].xyz;
color = obcolor;
+ alpha = obcolor.w;
object_index = info.x;
material_index = mat_index;
random = info.z;
diff --git a/source/blender/nodes/shader/nodes/node_shader_object_info.cc b/source/blender/nodes/shader/nodes/node_shader_object_info.cc
index 6ed5a7b715d..03c1a018d37 100644
--- a/source/blender/nodes/shader/nodes/node_shader_object_info.cc
+++ b/source/blender/nodes/shader/nodes/node_shader_object_info.cc
@@ -9,6 +9,7 @@ static void node_declare(NodeDeclarationBuilder &b)
{
b.add_output<decl::Vector>(N_("Location"));
b.add_output<decl::Color>(N_("Color"));
+ b.add_output<decl::Float>(N_("Alpha"));
b.add_output<decl::Float>(N_("Object Index"));
b.add_output<decl::Float>(N_("Material Index"));
b.add_output<decl::Float>(N_("Random"));