[Bf-blender-cvs] [0193cc12e53] soc-2019-cycles-procedural: Fix Vector Math backward compatibility. Update add and subtract operators.
OmarSquircleArt
noreply at git.blender.org
Sat Aug 3 13:05:57 CEST 2019
Commit: 0193cc12e531036b5c84a81d44a0098758c5b080
Author: OmarSquircleArt
Date: Sat Aug 3 13:06:43 2019 +0200
Branches: soc-2019-cycles-procedural
https://developer.blender.org/rB0193cc12e531036b5c84a81d44a0098758c5b080
Fix Vector Math backward compatibility. Update add and subtract operators.
===================================================================
M source/blender/blenloader/intern/versioning_cycles.c
===================================================================
diff --git a/source/blender/blenloader/intern/versioning_cycles.c b/source/blender/blenloader/intern/versioning_cycles.c
index 761778bb72e..6e538e30184 100644
--- a/source/blender/blenloader/intern/versioning_cycles.c
+++ b/source/blender/blenloader/intern/versioning_cycles.c
@@ -44,6 +44,8 @@
#include "BLO_readfile.h"
#include "readfile.h"
+#define IS_SOCKET_IN_USE(sock) (sock->flag & SOCK_IN_USE)
+
static float *cycles_node_socket_float_value(bNodeSocket *socket)
{
bNodeSocketValueFloat *socket_data = socket->default_value;
@@ -56,6 +58,12 @@ static float *cycles_node_socket_rgba_value(bNodeSocket *socket)
return socket_data->value;
}
+static float *cycles_node_socket_vector_value(bNodeSocket *socket)
+{
+ bNodeSocketValueVector *socket_data = socket->default_value;
+ return socket_data->value;
+}
+
static IDProperty *cycles_properties_from_ID(ID *id)
{
IDProperty *idprop = IDP_GetProperties(id, false);
@@ -504,6 +512,69 @@ static void update_vector_math_socket_names_and_identifiers(bNodeTree *ntree)
}
}
+/* The Value output of the Vector Math node is no longer available in the Add
+ * and Subtract operators. Previously, this Value output was computed from the
+ * Vector output V as follows:
+ *
+ * Value = (abs(V.x) + abs(V.y) + abs(V.z)) / 3
+ *
+ * Or more compactly using vector operators:
+ *
+ * Value = dot(abs(V), (1 / 3, 1 / 3, 1 / 3))
+ *
+ * To correct this, if the Value output was used, we are going to compute
+ * it using the second equation by adding an absolute and a dot node, then
+ * connect them appropriately.
+ */
+static void update_vector_add_and_subtract_operators(bNodeTree *ntree)
+{
+ bool need_update = false;
+
+ for (bNode *node = ntree->nodes.first; node; node = node->next) {
+ if (node->type == SH_NODE_VECTOR_MATH) {
+ bNodeSocket *sockOutValue = nodeFindSocket(node, SOCK_OUT, "Value");
+ if (IS_SOCKET_IN_USE(sockOutValue) &&
+ ELEM(node->custom1, NODE_VECTOR_MATH_ADD, NODE_VECTOR_MATH_SUBTRACT)) {
+
+ bNode *absNode = nodeAddStaticNode(NULL, ntree, SH_NODE_VECTOR_MATH);
+ absNode->custom1 = NODE_VECTOR_MATH_ABSOLUTE;
+ absNode->locx = node->locx + node->width + 20.0f;
+ absNode->locy = node->locy;
+
+ bNode *dotNode = nodeAddStaticNode(NULL, ntree, SH_NODE_VECTOR_MATH);
+ dotNode->custom1 = NODE_VECTOR_MATH_DOT_PRODUCT;
+ dotNode->locx = absNode->locx + absNode->width + 20.0f;
+ dotNode->locy = absNode->locy;
+ bNodeSocket *sockDotB = nodeFindSocket(dotNode, SOCK_IN, "B");
+ bNodeSocket *sockDotOutValue = nodeFindSocket(dotNode, SOCK_OUT, "Value");
+ copy_v3_fl(cycles_node_socket_vector_value(sockDotB), 1 / 3.0f);
+
+ /* Iterate backwards from end so we don't encounter newly added links. */
+ for (bNodeLink *link = ntree->links.last; link; link = link->prev) {
+ if (link->fromsock == sockOutValue) {
+ nodeAddLink(ntree, dotNode, sockDotOutValue, link->tonode, link->tosock);
+ nodeRemLink(ntree, link);
+ }
+ }
+
+ bNodeSocket *sockAbsA = nodeFindSocket(absNode, SOCK_IN, "A");
+ bNodeSocket *sockDotA = nodeFindSocket(dotNode, SOCK_IN, "A");
+ bNodeSocket *sockOutVector = nodeFindSocket(node, SOCK_OUT, "Vector");
+ bNodeSocket *sockAbsOutVector = nodeFindSocket(absNode, SOCK_OUT, "Vector");
+
+ nodeAddLink(ntree, node, sockOutVector, absNode, sockAbsA);
+ nodeAddLink(ntree, absNode, sockAbsOutVector, dotNode, sockDotA);
+
+ need_update = true;
+ }
+ }
+ }
+
+ if (need_update) {
+ ntreeUpdateTree(NULL, ntree);
+ }
+}
+
void blo_do_versions_cycles(FileData *UNUSED(fd), Library *UNUSED(lib), Main *bmain)
{
/* Particle shape shared with Eevee. */
@@ -664,6 +735,7 @@ void do_versions_after_linking_cycles(Main *bmain)
}
update_single_operand_math_operators(ntree);
update_math_clamp_option(ntree);
+ update_vector_add_and_subtract_operators(ntree);
}
FOREACH_NODETREE_END;
}
More information about the Bf-blender-cvs
mailing list