Commit: 103ecf7acaadca866d5444ca9913e8224af0aae1
Author: Lukas Tönne
Date:   Mon Apr 11 16:51:45 2016 +0200
Branches: object_nodes
https://developer.blender.org/rB103ecf7acaadca866d5444ca9913e8224af0aae1

Fix expression result use as function arguments and add RGBA color mix node.

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

M       source/blender/blenvm/llvm/CMakeLists.txt
M       source/blender/blenvm/llvm/llvm_codegen.cc
A       source/blender/blenvm/modules/mod_color.h
M       source/blender/blenvm/modules/mod_math.h
D       source/blender/blenvm/modules/mod_value.cc
A       source/blender/blenvm/modules/modules.cc

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

diff --git a/source/blender/blenvm/llvm/CMakeLists.txt 
b/source/blender/blenvm/llvm/CMakeLists.txt
index 0944e6c..ceac79a 100644
--- a/source/blender/blenvm/llvm/CMakeLists.txt
+++ b/source/blender/blenvm/llvm/CMakeLists.txt
@@ -91,14 +91,14 @@ macro(BLENVM_LLVM_MODULE_ADD src)
        add_custom_command(
                OUTPUT ${llvm_ir}
                COMMAND ${LLVM_IR_COMPILER}
-                               -cc1
                                -S
                                ${CMAKE_CURRENT_SOURCE_DIR}/${src}
                                -emit-llvm
+                               -std=c++0x
                                -o ${CMAKE_CURRENT_BINARY_DIR}/${llvm_ir}
                                -DBLENVM_RUNTIME
                                -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS
-                               -std=c++0x
+                               -I${CMAKE_CURRENT_SOURCE_DIR}/../../blenlib
                DEPENDS ${LLVM_SRC} ${LLVM_HEADERS})
 
        delayed_install("${CMAKE_CURRENT_BINARY_DIR}" "${llvm_ir}" 
${LLVM_IR_INSTALL_PATH}/modules/)
@@ -107,9 +107,11 @@ endmacro()
 
 
 set(LLVM_SRC
-       ../modules/mod_value.cc
+       ../modules/modules.cc
 )
 set(LLVM_HEADERS
+       ../modules/mod_color.h
+       ../modules/mod_math.h
        ../modules/mod_value.h
 )
 
diff --git a/source/blender/blenvm/llvm/llvm_codegen.cc 
b/source/blender/blenvm/llvm/llvm_codegen.cc
index 8dc94c4..724d4e5 100644
--- a/source/blender/blenvm/llvm/llvm_codegen.cc
+++ b/source/blender/blenvm/llvm/llvm_codegen.cc
@@ -353,13 +353,18 @@ llvm::CallInst 
*LLVMCompiler::codegen_node_call(llvm::BasicBlock *block,
                                args.push_back(value);
                                break;
                        }
-                       case INPUT_EXPRESSION:
-                               args.push_back(output_values.at(input.link()));
+                       case INPUT_EXPRESSION: {
+                               Value *valuemem = 
output_values.at(input.link());
+                               Type *arg_type = 
evalfunc->getFunctionType()->getParamType(args.size());
+                               Value *value = 
builder.CreatePointerBitCastOrAddrSpaceCast(valuemem, arg_type);
+                               args.push_back(value);
                                break;
-                       case INPUT_VARIABLE:
+                       }
+                       case INPUT_VARIABLE: {
                                /* TODO */
                                BLI_assert(false && "Variable inputs not 
supported yet!");
                                break;
+                       }
                }
        }
        
@@ -526,14 +531,14 @@ FunctionLLVM *LLVMCompiler::compile_function(const string 
&name, const NodeGraph
        BLI_assert(m_module->getFunction(name) && "Function not registered in 
module!");
        BLI_assert(func != NULL && "codegen_node_function returned NULL!");
        
-       optimize_function(func, 2);
-       
        printf("=== NODE FUNCTION ===\n");
        fflush(stdout);
        func->dump();
        printf("=====================\n");
        fflush(stdout);
        
+       optimize_function(func, 2);
+       
        verifyFunction(*func, &outs());
        verifyModule(*m_module, &outs());
        
diff --git a/source/blender/blenvm/modules/mod_color.h 
b/source/blender/blenvm/modules/mod_color.h
new file mode 100644
index 0000000..c56f247
--- /dev/null
+++ b/source/blender/blenvm/modules/mod_color.h
@@ -0,0 +1,286 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __MOD_COLOR_H__
+#define __MOD_COLOR_H__
+
+extern "C" {
+#include "BLI_math_color.h"
+}
+
+#include "mod_math.h"
+
+enum BlendMode {
+       MA_RAMP_BLEND       = 0,
+       MA_RAMP_ADD         = 1,
+       MA_RAMP_MULT        = 2,
+       MA_RAMP_SUB         = 3,
+       MA_RAMP_SCREEN      = 4,
+       MA_RAMP_DIV         = 5,
+       MA_RAMP_DIFF        = 6,
+       MA_RAMP_DARK        = 7,
+       MA_RAMP_LIGHT       = 8,
+       MA_RAMP_OVERLAY     = 9,
+       MA_RAMP_DODGE       = 10,
+       MA_RAMP_BURN        = 11,
+       MA_RAMP_HUE         = 12,
+       MA_RAMP_SAT         = 13,
+       MA_RAMP_VAL         = 14,
+       MA_RAMP_COLOR       = 15,
+       MA_RAMP_SOFT        = 16,
+       MA_RAMP_LINEAR      = 17,
+};
+
+inline void MIX_RGB3(float3 &result, const int &mode, const float &fac,
+                     const float3 &col_a, const float3 &col_b)
+{
+       float tmp, facm = 1.0f - fac;
+       
+       result = col_a;
+       
+       switch (mode) {
+               case MA_RAMP_BLEND:
+                       result[0] = facm * (result[0]) + fac * col_b[0];
+                       result[1] = facm * (result[1]) + fac * col_b[1];
+                       result[2] = facm * (result[2]) + fac * col_b[2];
+                       break;
+               case MA_RAMP_ADD:
+                       result[0] += fac * col_b[0];
+                       result[1] += fac * col_b[1];
+                       result[2] += fac * col_b[2];
+                       break;
+               case MA_RAMP_MULT:
+                       result[0] *= (facm + fac * col_b[0]);
+                       result[1] *= (facm + fac * col_b[1]);
+                       result[2] *= (facm + fac * col_b[2]);
+                       break;
+               case MA_RAMP_SCREEN:
+                       result[0] = 1.0f - (facm + fac * (1.0f - col_b[0])) * 
(1.0f - result[0]);
+                       result[1] = 1.0f - (facm + fac * (1.0f - col_b[1])) * 
(1.0f - result[1]);
+                       result[2] = 1.0f - (facm + fac * (1.0f - col_b[2])) * 
(1.0f - result[2]);
+                       break;
+               case MA_RAMP_OVERLAY:
+                       if (result[0] < 0.5f)
+                               result[0] *= (facm + 2.0f * fac * col_b[0]);
+                       else
+                               result[0] = 1.0f - (facm + 2.0f * fac * (1.0f - 
col_b[0])) * (1.0f - result[0]);
+                       if (result[1] < 0.5f)
+                               result[1] *= (facm + 2.0f * fac * col_b[1]);
+                       else
+                               result[1] = 1.0f - (facm + 2.0f * fac * (1.0f - 
col_b[1])) * (1.0f - result[1]);
+                       if (result[2] < 0.5f)
+                               result[2] *= (facm + 2.0f * fac * col_b[2]);
+                       else
+                               result[2] = 1.0f - (facm + 2.0f * fac * (1.0f - 
col_b[2])) * (1.0f - result[2]);
+                       break;
+               case MA_RAMP_SUB:
+                       result[0] -= fac * col_b[0];
+                       result[1] -= fac * col_b[1];
+                       result[2] -= fac * col_b[2];
+                       break;
+               case MA_RAMP_DIV:
+                       if (col_b[0] != 0.0f)
+                               result[0] = facm * (result[0]) + fac * 
(result[0]) / col_b[0];
+                       if (col_b[1] != 0.0f)
+                               result[1] = facm * (result[1]) + fac * 
(result[1]) / col_b[1];
+                       if (col_b[2] != 0.0f)
+                               result[2] = facm * (result[2]) + fac * 
(result[2]) / col_b[2];
+                       break;
+               case MA_RAMP_DIFF:
+                       result[0] = facm * (result[0]) + fac * fabsf(result[0] 
- col_b[0]);
+                       result[1] = facm * (result[1]) + fac * fabsf(result[1] 
- col_b[1]);
+                       result[2] = facm * (result[2]) + fac * fabsf(result[2] 
- col_b[2]);
+                       break;
+               case MA_RAMP_DARK:
+                       result[0] = min_ff(result[0], col_b[0]) * fac + 
result[0] * facm;
+                       result[1] = min_ff(result[1], col_b[1]) * fac + 
result[1] * facm;
+                       result[2] = min_ff(result[2], col_b[2]) * fac + 
result[2] * facm;
+                       break;
+               case MA_RAMP_LIGHT:
+                       tmp = fac * col_b[0];
+                       if (tmp > result[0]) result[0] = tmp;
+                       tmp = fac * col_b[1];
+                       if (tmp > result[1]) result[1] = tmp;
+                       tmp = fac * col_b[2];
+                       if (tmp > result[2]) result[2] = tmp;
+                       break;
+               case MA_RAMP_DODGE:
+                       if (result[0] != 0.0f) {
+                               tmp = 1.0f - fac * col_b[0];
+                               if (tmp <= 0.0f)
+                                       result[0] = 1.0f;
+                               else if ((tmp = (result[0]) / tmp) > 1.0f)
+                                       result[0] = 1.0f;
+                               else
+                                       result[0] = tmp;
+                       }
+                       if (result[1] != 0.0f) {
+                               tmp = 1.0f - fac * col_b[1];
+                               if (tmp <= 0.0f)
+                                       result[1] = 1.0f;
+                               else if ((tmp = (result[1]) / tmp) > 1.0f)
+                                       result[1] = 1.0f;
+                               else
+                                       result[1] = tmp;
+                       }
+                       if (result[2] != 0.0f) {
+                               tmp = 1.0f - fac * col_b[2];
+                               if (tmp <= 0.0f)
+                                       result[2] = 1.0f;
+                               else if ((tmp = (result[2]) / tmp) > 1.0f)
+                                       result[2] = 1.0f;
+                               else
+                                       result[2] = tmp;
+                       }
+                       break;
+               case MA_RAMP_BURN:
+                       tmp = facm + fac * col_b[0];
+                       
+                       if (tmp <= 0.0f)
+                               result[0] = 0.0f;
+                       else if ((tmp = (1.0f - (1.0f - (result[0])) / tmp)) < 
0.0f)
+                               result[0] = 0.0f;
+                       else if (tmp > 1.0f)
+                               result[0] = 1.0f;
+                       else
+                               result[0] = tmp;
+                       
+                       tmp = facm + fac * col_b[1];
+                       if (tmp <= 0.0f)
+                               result[1] = 0.0f;
+                       else if ((tmp = (1.0f - (1.0f - (result[1])) / tmp)) < 
0.0f)
+                               result[1] = 0.0f;
+                       else if (tmp > 1.0f)
+                               result[1] = 1.0f;
+                       else
+                               result[1] = tmp;
+                       
+                       tmp = facm + fac * col_b[2];
+                       if (tmp <= 0.0f)
+                               result[2] = 0.0f;
+                       else if ((tmp = (1.0f - (1.0f - (result[2])) / tmp)) < 
0.0f)
+                               result[2] = 0.0f;
+                       else if (tmp > 1.0f)
+                               result[2] = 1.0f;
+                       else
+                               result[2] = tmp;
+                       break;
+               case MA_RAMP_HUE:
+               {
+                       float rH, rS, rV;
+                       float colH, colS, colV;
+                       float tmpr, tmpg, tmpb;
+                       rgb_to_hsv(col_b[0], col_b[1], col_b[2], &colH, &colS, 
&colV);
+                       if (colS != 0) {
+                               rgb_to_hsv(result[0], result[1], result[2], 
&rH, &rS, &rV);
+                               hsv_to_rgb(colH, rS, rV, &tmpr, &tmpg, &tmpb);
+                               result[0] = facm * (result[0]) + fac * tmpr;
+                               result[1] = facm * (result[1]) + fac * tmpg;
+                               result[2] = facm * (result[2]) + fac * tmpb;
+                       }
+                       break;
+               }
+               case MA_RAMP_SAT:
+               {
+                       float rH, rS, rV;
+                       float colH, colS, colV;
+                       rgb_to_hsv(result[0], result[1], result[2], &rH, &rS, 
&rV);
+                       if (rS != 0) {
+                               rgb_to_hsv(col_b[0], col_b[1], col_b[2], &colH, 
&colS, &colV);
+                               hsv_to_rgb(rH, (facm * rS + fac * colS), rV, 
&result[0], &result[1], &result[2]);
+                       }
+                       break;
+               }
+               case MA_RAMP_VAL:
+               {
+                       float rH, rS, rV;
+                       float colH, colS, colV;
+                       rgb_to_hsv(result[0], result[1], result[2], &rH, &rS, 
&rV);
+                       rgb_to_hsv(col_b[0], col_b[1], col_b[2], &colH, &colS, 
&colV);
+                       hsv_to_rgb(rH, rS, (facm * rV + fac * colV), 
&result[0], &result[1], &result[2]);
+                       break;
+               }
+               case MA_RAMP_COLOR:
+               {
+                       float rH, rS, rV;
+                       float colH, colS, colV;
+                       float tmpr, tmpg, tmpb;
+                       rgb_to_hsv(col_b[0], col_b[1], col_b[2], &colH, &colS, 
&colV);
+                       if (colS != 0) {
+                               rgb_to_hsv(result[0], result[1], result[2], 
&rH, &rS, &rV);
+                               hsv_to_rgb(colH, colS, rV, &tmpr, &tmpg, &tmpb);
+                               result[0] = facm * (result[0]) + fac * tmpr;
+                               result[1] = facm * (result[1]) + fac * tmpg;
+                               result[2] = facm * (result[2]) + fac * tmpb;
+                       }
+                       break;
+               }
+               case MA_RAMP_SOFT:
+               {
+                       float scr, scg, scb;
+                       
+                       /* first calculate non-fac based Screen mix */
+                       scr = 1.0f - (1.0f - col_b[0]) * (1.0f - result[0]);
+                       scg = 1.0f - (1.0f - col_b[1]) 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to