[Bf-blender-cvs] [5b4ab896634] master: Shader Nodes: add Alpha output to Object Info node

Ethan-Hall noreply at git.blender.org
Mon Mar 7 17:47:06 CET 2022


Commit: 5b4ab896634fd118cb46740f6f90e45f96d550ac
Author: Ethan-Hall
Date:   Mon Mar 7 17:34:52 2022 +0100
Branches: master
https://developer.blender.org/rB5b4ab896634fd118cb46740f6f90e45f96d550ac

Shader Nodes: add Alpha output to Object Info node

An alpha component can be specified for an object's color. This adds an alpha
socket to the object info shader node allowing for the alpha component of the
object's color to be accessed in the shader editor.

Differential Revision: https://developer.blender.org/D14141

===================================================================

M	intern/cycles/blender/object.cpp
M	intern/cycles/kernel/geom/object.h
M	intern/cycles/kernel/osl/services.cpp
M	intern/cycles/kernel/osl/services.h
M	intern/cycles/kernel/osl/shaders/node_object_info.osl
M	intern/cycles/kernel/svm/geometry.h
M	intern/cycles/kernel/svm/types.h
M	intern/cycles/kernel/types.h
M	intern/cycles/scene/object.cpp
M	intern/cycles/scene/object.h
M	intern/cycles/scene/shader_nodes.cpp
M	source/blender/gpu/shaders/material/gpu_shader_material_object_info.glsl
M	source/blender/nodes/shader/nodes/node_shader_object_info.cc

===================================================================

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"));



More information about the Bf-blender-cvs mailing list