Cycles: checker texture node, patch by Thomas.
This commit is contained in:
@@ -57,6 +57,7 @@ set(SRC_SVM_HEADERS
|
||||
svm/svm_camera.h
|
||||
svm/svm_closure.h
|
||||
svm/svm_convert.h
|
||||
svm/svm_checker.h
|
||||
svm/svm_displace.h
|
||||
svm/svm_fresnel.h
|
||||
svm/svm_gamma.h
|
||||
|
||||
@@ -145,6 +145,7 @@ CCL_NAMESPACE_END
|
||||
#include "svm_tex_coord.h"
|
||||
#include "svm_value.h"
|
||||
#include "svm_voronoi.h"
|
||||
#include "svm_checker.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
@@ -235,6 +236,9 @@ __device_noinline void svm_eval_nodes(KernelGlobals *kg, ShaderData *sd, ShaderT
|
||||
case NODE_TEX_MAGIC:
|
||||
svm_node_tex_magic(kg, sd, stack, node, &offset);
|
||||
break;
|
||||
case NODE_TEX_CHECKER:
|
||||
svm_node_tex_checker(kg, sd, stack, node, &offset);
|
||||
break;
|
||||
#endif
|
||||
case NODE_CAMERA:
|
||||
svm_node_camera(kg, sd, stack, node.y, node.z, node.w);
|
||||
|
||||
57
intern/cycles/kernel/svm/svm_checker.h
Normal file
57
intern/cycles/kernel/svm/svm_checker.h
Normal file
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
/* Checker */
|
||||
|
||||
__device_noinline float svm_checker(float3 p, float scale)
|
||||
{
|
||||
p *= scale;
|
||||
|
||||
/* 0.00001 because of unit sized stuff */
|
||||
int xi = (int)fabsf(floor(0.00001f + p.x));
|
||||
int yi = (int)fabsf(floor(0.00001f + p.y));
|
||||
int zi = (int)fabsf(floor(0.00001f + p.z));
|
||||
|
||||
return ((xi % 2 == yi % 2) == (zi % 2))? 1.0f: 0.0f;
|
||||
}
|
||||
|
||||
__device void svm_node_tex_checker(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset)
|
||||
{
|
||||
uint co_offset, color1_offset, color2_offset, scale_offset;
|
||||
uint color_offset, fac_offset;
|
||||
|
||||
decode_node_uchar4(node.y, &co_offset, &color1_offset, &color2_offset, &scale_offset);
|
||||
decode_node_uchar4(node.z, &color_offset, &fac_offset, NULL, NULL);
|
||||
|
||||
float3 co = stack_load_float3(stack, co_offset);
|
||||
float3 color1 = stack_load_float3(stack, color1_offset);
|
||||
float3 color2 = stack_load_float3(stack, color2_offset);
|
||||
float scale = stack_load_float_default(stack, scale_offset, node.w);
|
||||
|
||||
float f = svm_checker(co, scale);
|
||||
|
||||
if(stack_valid(color_offset))
|
||||
stack_store_float3(stack, color_offset, (f == 1.0f)? color1: color2);
|
||||
if(stack_valid(fac_offset))
|
||||
stack_store_float(stack, fac_offset, f);
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
@@ -86,7 +86,8 @@ typedef enum NodeType {
|
||||
NODE_CAMERA = 5300,
|
||||
NODE_INVERT = 5400,
|
||||
NODE_NORMAL = 5500,
|
||||
NODE_GAMMA = 5600
|
||||
NODE_GAMMA = 5600,
|
||||
NODE_TEX_CHECKER = 5700
|
||||
} NodeType;
|
||||
|
||||
typedef enum NodeAttributeType {
|
||||
|
||||
Reference in New Issue
Block a user