Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/svm/svm_voronoi.h
| Show First 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | for(int yy = -1; yy <= 1; yy++) { | ||||
| else { | else { | ||||
| d = powf(reduce_add(pow3(n, e)), 1.0f/e); | d = powf(reduce_add(pow3(n, e)), 1.0f/e); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| /* To keep the shortest four distances and associated points we have to keep them in sorted order. */ | /* To keep the shortest four distances and associated points we have to keep them in sorted order. */ | ||||
| if(d < da[0]) { | int insertPt; | ||||
| da[3] = da[2]; | for(insertPt = 4; (insertPt > 0) && (d < da[insertPt - 1]); insertPt--) { | ||||
| da[2] = da[1]; | if (insertPt < 4) { | ||||
| da[1] = da[0]; | da[insertPt] = da[insertPt - 1]; | ||||
| da[0] = d; | pa[insertPt] = pa[insertPt - 1]; | ||||
| } | |||||
| pa[3] = pa[2]; | } | ||||
| pa[2] = pa[1]; | if (insertPt < 4) { | ||||
| pa[1] = pa[0]; | da[insertPt] = d; | ||||
| pa[0] = vp; | pa[insertPt] = vp; | ||||
| } | |||||
| else if(d < da[1]) { | |||||
| da[3] = da[2]; | |||||
| da[2] = da[1]; | |||||
| da[1] = d; | |||||
| pa[3] = pa[2]; | |||||
| pa[2] = pa[1]; | |||||
| pa[1] = vp; | |||||
| } | |||||
| else if(d < da[2]) { | |||||
| da[3] = da[2]; | |||||
| da[2] = d; | |||||
| pa[3] = pa[2]; | |||||
| pa[2] = vp; | |||||
| } | |||||
| else if(d < da[3]) { | |||||
| da[3] = d; | |||||
| pa[3] = vp; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| ccl_device void svm_node_tex_voronoi(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) | ccl_device void svm_node_tex_voronoi(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node, int *offset) | ||||
| { | { | ||||
| uint4 node2 = read_node(kg, offset); | uint4 node2 = read_node(kg, offset); | ||||
| uint co_offset, coloring, distance, feature; | uint co_offset, coloring, distance, feature; | ||||
| uint scale_offset, e_offset, fac_offset, color_offset; | uint scale_offset, e_offset, fac_offset, color_offset; | ||||
| uint vector_out_offset; | |||||
| decode_node_uchar4(node.y, &co_offset, &coloring, &distance, &feature); | decode_node_uchar4(node.y, &co_offset, &coloring, &distance, &feature); | ||||
| decode_node_uchar4(node.z, &scale_offset, &e_offset, &fac_offset, &color_offset); | decode_node_uchar4(node.z, &scale_offset, &e_offset, &fac_offset, &color_offset); | ||||
| float3 co = stack_load_float3(stack, co_offset); | float3 co = stack_load_float3(stack, co_offset); | ||||
| float scale = stack_load_float_default(stack, scale_offset, node2.x); | float scale = stack_load_float_default(stack, scale_offset, node2.x); | ||||
| float exponent = stack_load_float_default(stack, e_offset, node2.y); | float exponent = stack_load_float_default(stack, e_offset, node2.y); | ||||
| decode_node_uchar4(node2.z, &vector_out_offset, NULL, NULL, NULL); | |||||
| float dist[4]; | float dist[4]; | ||||
| float3 neighbor[4]; | float3 neighbor[4]; | ||||
| voronoi_neighbors(co*scale, (NodeVoronoiDistanceMetric)distance, exponent, dist, neighbor); | voronoi_neighbors(co*scale, (NodeVoronoiDistanceMetric)distance, exponent, dist, neighbor); | ||||
| float3 color; | float3 color; | ||||
| float fac; | float fac; | ||||
| if(coloring == NODE_VORONOI_INTENSITY) { | uint idx; | ||||
| float3 pOut = co; | |||||
| float3 vOffset = make_float3(0.0f, 0.0f, 0.0f); | |||||
| float dOffset = 0.0f; | |||||
| switch(feature) { | switch(feature) { | ||||
| case NODE_VORONOI_F1: fac = dist[0]; break; | case NODE_VORONOI_F1: idx = 0; break; | ||||
| case NODE_VORONOI_F2: fac = dist[1]; break; | case NODE_VORONOI_F2: idx = 1; break; | ||||
| case NODE_VORONOI_F3: fac = dist[2]; break; | case NODE_VORONOI_F3: idx = 2; break; | ||||
| case NODE_VORONOI_F4: fac = dist[3]; break; | case NODE_VORONOI_F4: idx = 3; break; | ||||
| case NODE_VORONOI_F2F1: fac = dist[1] - dist[0]; break; | case NODE_VORONOI_F2F1: | ||||
| idx = 1; | |||||
| pOut = neighbor[0]; | |||||
| vOffset = neighbor[0]; | |||||
| dOffset = dist[0]; | |||||
| break; | |||||
| } | } | ||||
| float3 outVector = neighbor[idx] - pOut; | |||||
| if(coloring == NODE_VORONOI_INTENSITY) { | |||||
| fac = dist[idx] - dOffset; | |||||
| color = make_float3(fac, fac, fac); | color = make_float3(fac, fac, fac); | ||||
| } | } | ||||
| else { | else { | ||||
| /* NODE_VORONOI_CELLS */ | /* NODE_VORONOI_CELLS */ | ||||
| switch(feature) { | color = fabs(neighbor[idx] - vOffset); | ||||
| case NODE_VORONOI_F1: color = neighbor[0]; break; | |||||
| case NODE_VORONOI_F2: color = neighbor[1]; break; | |||||
| case NODE_VORONOI_F3: color = neighbor[2]; break; | |||||
| case NODE_VORONOI_F4: color = neighbor[3]; break; | |||||
| /* Usefulness of this vector is questionable. Note F2 >= F1 but the | |||||
| * individual vector components might not be. */ | |||||
| case NODE_VORONOI_F2F1: color = fabs(neighbor[1] - neighbor[0]); break; | |||||
| } | |||||
| color = cellnoise3(color); | color = cellnoise3(color); | ||||
| fac = average(color); | fac = average(color); | ||||
| } | } | ||||
| if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, fac); | if(stack_valid(fac_offset)) stack_store_float(stack, fac_offset, fac); | ||||
| if(stack_valid(color_offset)) stack_store_float3(stack, color_offset, color); | if(stack_valid(color_offset)) stack_store_float3(stack, color_offset, color); | ||||
| if(stack_valid(vector_out_offset)) stack_store_float3(stack, vector_out_offset, outVector); | |||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||