New feature
Patch [#33445] - Experimental Cycles Hair Rendering (CPU only) This patch allows hair data to be exported to cycles and introduces a new line segment primitive to render with. The UI appears under the particle tab and there is a new hair info node available. It is only available under the experimental feature set and for cpu rendering.
This commit is contained in:
@@ -58,27 +58,45 @@ __device void svm_node_attr(KernelGlobals *kg, ShaderData *sd, float *stack, uin
|
||||
|
||||
svm_node_attr_init(kg, sd, node, &type, &mesh_type, &elem, &offset, &out_offset);
|
||||
|
||||
/* fetch and store attribute */
|
||||
if(type == NODE_ATTR_FLOAT) {
|
||||
if(mesh_type == NODE_ATTR_FLOAT) {
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float(stack, out_offset, f);
|
||||
}
|
||||
#ifdef __HAIR__
|
||||
if (sd->curve_seg != ~0) {
|
||||
/*currently strand attributes aren't enabled - only exports stored uvs*/
|
||||
if(type == NODE_ATTR_FLOAT)
|
||||
stack_store_float(stack, out_offset, 0.0f);
|
||||
else {
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float(stack, out_offset, average(f));
|
||||
float4 sd2 = kernel_tex_fetch(__tri_woop, sd->prim*3+2);
|
||||
float3 uv = make_float3(sd2.z,sd2.w,0.0f);
|
||||
stack_store_float3(stack, out_offset, uv);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(mesh_type == NODE_ATTR_FLOAT3) {
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float3(stack, out_offset, f);
|
||||
else
|
||||
{
|
||||
#endif
|
||||
|
||||
/* fetch and store attribute */
|
||||
if(type == NODE_ATTR_FLOAT) {
|
||||
if(mesh_type == NODE_ATTR_FLOAT) {
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float(stack, out_offset, f);
|
||||
}
|
||||
else {
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float(stack, out_offset, average(f));
|
||||
}
|
||||
}
|
||||
else {
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float3(stack, out_offset, make_float3(f, f, f));
|
||||
if(mesh_type == NODE_ATTR_FLOAT3) {
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float3(stack, out_offset, f);
|
||||
}
|
||||
else {
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, NULL);
|
||||
stack_store_float3(stack, out_offset, make_float3(f, f, f));
|
||||
}
|
||||
}
|
||||
#ifdef __HAIR__
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
__device void svm_node_attr_bump_dx(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
|
||||
@@ -91,30 +109,43 @@ __device void svm_node_attr_bump_dx(KernelGlobals *kg, ShaderData *sd, float *st
|
||||
svm_node_attr_init(kg, sd, node, &type, &mesh_type, &elem, &offset, &out_offset);
|
||||
|
||||
/* fetch and store attribute */
|
||||
if(type == NODE_ATTR_FLOAT) {
|
||||
if(mesh_type == NODE_ATTR_FLOAT) {
|
||||
float dx;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float(stack, out_offset, f+dx);
|
||||
}
|
||||
else {
|
||||
float3 dx;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float(stack, out_offset, average(f+dx));
|
||||
}
|
||||
#ifdef __HAIR__
|
||||
if (sd->curve_seg != ~0) {
|
||||
/*currently strand attributes aren't enabled*/
|
||||
if(type == NODE_ATTR_FLOAT)
|
||||
stack_store_float(stack, out_offset, 0.0f);
|
||||
else
|
||||
stack_store_float3(stack, out_offset, make_float3(0.0f, 0.0f, 0.0f));
|
||||
}
|
||||
else {
|
||||
if(mesh_type == NODE_ATTR_FLOAT3) {
|
||||
float3 dx;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float3(stack, out_offset, f+dx);
|
||||
#endif
|
||||
if(type == NODE_ATTR_FLOAT) {
|
||||
if(mesh_type == NODE_ATTR_FLOAT) {
|
||||
float dx;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float(stack, out_offset, f+dx);
|
||||
}
|
||||
else {
|
||||
float3 dx;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float(stack, out_offset, average(f+dx));
|
||||
}
|
||||
}
|
||||
else {
|
||||
float dx;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float3(stack, out_offset, make_float3(f+dx, f+dx, f+dx));
|
||||
if(mesh_type == NODE_ATTR_FLOAT3) {
|
||||
float3 dx;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float3(stack, out_offset, f+dx);
|
||||
}
|
||||
else {
|
||||
float dx;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, &dx, NULL);
|
||||
stack_store_float3(stack, out_offset, make_float3(f+dx, f+dx, f+dx));
|
||||
}
|
||||
}
|
||||
#ifdef __HAIR__
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
__device void svm_node_attr_bump_dy(KernelGlobals *kg, ShaderData *sd, float *stack, uint4 node)
|
||||
@@ -127,30 +158,43 @@ __device void svm_node_attr_bump_dy(KernelGlobals *kg, ShaderData *sd, float *st
|
||||
svm_node_attr_init(kg, sd, node, &type, &mesh_type, &elem, &offset, &out_offset);
|
||||
|
||||
/* fetch and store attribute */
|
||||
if(type == NODE_ATTR_FLOAT) {
|
||||
if(mesh_type == NODE_ATTR_FLOAT) {
|
||||
float dy;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float(stack, out_offset, f+dy);
|
||||
}
|
||||
else {
|
||||
float3 dy;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float(stack, out_offset, average(f+dy));
|
||||
}
|
||||
#ifdef __HAIR__
|
||||
if (sd->curve_seg != ~0) {
|
||||
/*currently strand attributes aren't enabled*/
|
||||
if(type == NODE_ATTR_FLOAT)
|
||||
stack_store_float(stack, out_offset, 0.0f);
|
||||
else
|
||||
stack_store_float3(stack, out_offset, make_float3(0.0f, 0.0f, 0.0f));
|
||||
}
|
||||
else {
|
||||
if(mesh_type == NODE_ATTR_FLOAT3) {
|
||||
float3 dy;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float3(stack, out_offset, f+dy);
|
||||
#endif
|
||||
if(type == NODE_ATTR_FLOAT) {
|
||||
if(mesh_type == NODE_ATTR_FLOAT) {
|
||||
float dy;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float(stack, out_offset, f+dy);
|
||||
}
|
||||
else {
|
||||
float3 dy;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float(stack, out_offset, average(f+dy));
|
||||
}
|
||||
}
|
||||
else {
|
||||
float dy;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float3(stack, out_offset, make_float3(f+dy, f+dy, f+dy));
|
||||
if(mesh_type == NODE_ATTR_FLOAT3) {
|
||||
float3 dy;
|
||||
float3 f = triangle_attribute_float3(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float3(stack, out_offset, f+dy);
|
||||
}
|
||||
else {
|
||||
float dy;
|
||||
float f = triangle_attribute_float(kg, sd, elem, offset, NULL, &dy);
|
||||
stack_store_float3(stack, out_offset, make_float3(f+dy, f+dy, f+dy));
|
||||
}
|
||||
}
|
||||
#ifdef __HAIR__
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
Reference in New Issue
Block a user