diff options
-rw-r--r-- | intern/cycles/blender/object.cpp | 4 | ||||
-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 | ||||
-rw-r--r-- | intern/cycles/scene/object.cpp | 2 | ||||
-rw-r--r-- | intern/cycles/scene/object.h | 1 | ||||
-rw-r--r-- | intern/cycles/scene/shader_nodes.cpp | 6 | ||||
-rw-r--r-- | source/blender/gpu/shaders/material/gpu_shader_material_object_info.glsl | 2 | ||||
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_object_info.cc | 1 |
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")); |