Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/geom/geom_primitive.h
| Show All 16 Lines | |||||
| /* Primitive Utilities | /* Primitive Utilities | ||||
| * | * | ||||
| * Generic functions to look up mesh, curve and volume primitive attributes for | * Generic functions to look up mesh, curve and volume primitive attributes for | ||||
| * shading and render passes. */ | * shading and render passes. */ | ||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| /* Generic primitive attribute reading functions */ | /* Generic primitive attribute reading functions */ | ||||
| ccl_device_inline float primitive_attribute_float(KernelGlobals *kg, | ccl_device_inline float primitive_attribute_float(KernelGlobals *kg, | ||||
| const ShaderData *sd, | const ShaderData *sd, | ||||
| const AttributeDescriptor desc, | const AttributeDescriptor desc, | ||||
| float *dx, float *dy) | float *dx, float *dy) | ||||
brecht: Adjust indentation to keep alignment of arguments, here and in other places. | |||||
| { | { | ||||
| if(sd->type & PRIMITIVE_ALL_TRIANGLE) { | if(sd->type & PRIMITIVE_ALL_TRIANGLE) { | ||||
| if(subd_triangle_patch(kg, sd) == ~0) | if(subd_triangle_patch(kg, sd) == ~0) | ||||
| return triangle_attribute_float(kg, sd, desc, dx, dy); | return triangle_attribute_float(kg, sd, desc, dx, dy); | ||||
| else | else | ||||
| return subd_triangle_attribute_float(kg, sd, desc, dx, dy); | return subd_triangle_attribute_float(kg, sd, desc, dx, dy); | ||||
| } | } | ||||
| #ifdef __HAIR__ | #ifdef __HAIR__ | ||||
| else if(sd->type & PRIMITIVE_ALL_CURVE) { | else if(sd->type & PRIMITIVE_ALL_CURVE) { | ||||
| return curve_attribute_float(kg, sd, desc, dx, dy); | return curve_attribute_float(kg, sd, desc, dx, dy); | ||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef __VOLUME__ | #ifdef __VOLUME__ | ||||
| else if(sd->object != OBJECT_NONE && desc.element == ATTR_ELEMENT_VOXEL) { | else if(sd->object != OBJECT_NONE && desc.element == ATTR_ELEMENT_VOXEL) { | ||||
| return volume_attribute_float(kg, sd, desc, dx, dy); | if(dx) *dx = 0.0f; | ||||
| if(dy) *dy = 0.0f; | |||||
| return volume_attribute_float(kg, sd, desc); | |||||
| } | } | ||||
| #endif | #endif | ||||
| else { | else { | ||||
| if(dx) *dx = 0.0f; | if(dx) *dx = 0.0f; | ||||
| if(dy) *dy = 0.0f; | if(dy) *dy = 0.0f; | ||||
| return 0.0f; | return 0.0f; | ||||
| } | } | ||||
| } | } | ||||
| ccl_device_inline float primitive_surface_attribute_float(KernelGlobals *kg, | |||||
| const ShaderData *sd, | |||||
| const AttributeDescriptor desc, | |||||
| float *dx, float *dy) | |||||
| { | |||||
| if(sd->type & PRIMITIVE_ALL_TRIANGLE) { | |||||
| if(subd_triangle_patch(kg, sd) == ~0) | |||||
| return triangle_attribute_float(kg, sd, desc, dx, dy); | |||||
| else | |||||
| return subd_triangle_attribute_float(kg, sd, desc, dx, dy); | |||||
| } | |||||
| #ifdef __HAIR__ | |||||
| else if(sd->type & PRIMITIVE_ALL_CURVE) { | |||||
| return curve_attribute_float(kg, sd, desc, dx, dy); | |||||
| } | |||||
| #endif | |||||
| else { | |||||
| if(dx) *dx = 0.0f; | |||||
| if(dy) *dy = 0.0f; | |||||
| return 0.0f; | |||||
| } | |||||
| } | |||||
| #ifdef __VOLUME__ | |||||
| ccl_device_inline float primitive_volume_attribute_float(KernelGlobals *kg, | |||||
| const ShaderData *sd, | |||||
| const AttributeDescriptor desc) | |||||
| { | |||||
| if(sd->object != OBJECT_NONE && desc.element == ATTR_ELEMENT_VOXEL) { | |||||
| return volume_attribute_float(kg, sd, desc); | |||||
| } | |||||
| else { | |||||
| return 0.0f; | |||||
| } | |||||
| } | |||||
| #endif | |||||
| ccl_device_inline float3 primitive_attribute_float3(KernelGlobals *kg, | ccl_device_inline float3 primitive_attribute_float3(KernelGlobals *kg, | ||||
| const ShaderData *sd, | const ShaderData *sd, | ||||
| const AttributeDescriptor desc, | const AttributeDescriptor desc, | ||||
| float3 *dx, float3 *dy) | float3 *dx, float3 *dy) | ||||
| { | { | ||||
| if(sd->type & PRIMITIVE_ALL_TRIANGLE) { | if(sd->type & PRIMITIVE_ALL_TRIANGLE) { | ||||
| if(subd_triangle_patch(kg, sd) == ~0) | if(subd_triangle_patch(kg, sd) == ~0) | ||||
| return triangle_attribute_float3(kg, sd, desc, dx, dy); | return triangle_attribute_float3(kg, sd, desc, dx, dy); | ||||
| else | else | ||||
| return subd_triangle_attribute_float3(kg, sd, desc, dx, dy); | return subd_triangle_attribute_float3(kg, sd, desc, dx, dy); | ||||
| } | } | ||||
| #ifdef __HAIR__ | #ifdef __HAIR__ | ||||
| else if(sd->type & PRIMITIVE_ALL_CURVE) { | else if(sd->type & PRIMITIVE_ALL_CURVE) { | ||||
| return curve_attribute_float3(kg, sd, desc, dx, dy); | return curve_attribute_float3(kg, sd, desc, dx, dy); | ||||
| } | } | ||||
| #endif | #endif | ||||
| #ifdef __VOLUME__ | #ifdef __VOLUME__ | ||||
| else if(sd->object != OBJECT_NONE && desc.element == ATTR_ELEMENT_VOXEL) { | else if(sd->object != OBJECT_NONE && desc.element == ATTR_ELEMENT_VOXEL) { | ||||
| return volume_attribute_float3(kg, sd, desc, dx, dy); | if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f); | ||||
| if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f); | |||||
| return volume_attribute_float3(kg, sd, desc); | |||||
| } | |||||
| #endif | |||||
| else { | |||||
| if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f); | |||||
| if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f); | |||||
| return make_float3(0.0f, 0.0f, 0.0f); | |||||
| } | |||||
| } | |||||
| ccl_device_inline float3 primitive_surface_attribute_float3(KernelGlobals *kg, | |||||
| const ShaderData *sd, | |||||
| const AttributeDescriptor desc, | |||||
| float3 *dx, float3 *dy) | |||||
| { | |||||
| if(sd->type & PRIMITIVE_ALL_TRIANGLE) { | |||||
| if(subd_triangle_patch(kg, sd) == ~0) | |||||
| return triangle_attribute_float3(kg, sd, desc, dx, dy); | |||||
| else | |||||
| return subd_triangle_attribute_float3(kg, sd, desc, dx, dy); | |||||
| } | |||||
| #ifdef __HAIR__ | |||||
| else if(sd->type & PRIMITIVE_ALL_CURVE) { | |||||
| return curve_attribute_float3(kg, sd, desc, dx, dy); | |||||
| } | } | ||||
| #endif | #endif | ||||
| else { | else { | ||||
| if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f); | if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f); | ||||
| if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f); | if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f); | ||||
| return make_float3(0.0f, 0.0f, 0.0f); | return make_float3(0.0f, 0.0f, 0.0f); | ||||
| } | } | ||||
| } | } | ||||
| #ifdef __VOLUME__ | |||||
| ccl_device_inline float3 primitive_volume_attribute_float3(KernelGlobals *kg, | |||||
| const ShaderData *sd, | |||||
| const AttributeDescriptor desc) | |||||
| { | |||||
| if(sd->object != OBJECT_NONE && desc.element == ATTR_ELEMENT_VOXEL) { | |||||
| return volume_attribute_float3(kg, sd, desc); | |||||
| } | |||||
| else { | |||||
| return make_float3(0.0f, 0.0f, 0.0f); | |||||
| } | |||||
| } | |||||
| #endif | |||||
| /* Default UV coordinate */ | /* Default UV coordinate */ | ||||
| ccl_device_inline float3 primitive_uv(KernelGlobals *kg, ShaderData *sd) | ccl_device_inline float3 primitive_uv(KernelGlobals *kg, ShaderData *sd) | ||||
| { | { | ||||
| const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_UV); | const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_UV); | ||||
| if(desc.offset == ATTR_STD_NOT_FOUND) | if(desc.offset == ATTR_STD_NOT_FOUND) | ||||
| return make_float3(0.0f, 0.0f, 0.0f); | return make_float3(0.0f, 0.0f, 0.0f); | ||||
| float3 uv = primitive_attribute_float3(kg, sd, desc, NULL, NULL); | float3 uv = primitive_surface_attribute_float3(kg, sd, desc, NULL, NULL); | ||||
| uv.z = 1.0f; | uv.z = 1.0f; | ||||
| return uv; | return uv; | ||||
| } | } | ||||
| /* Ptex coordinates */ | /* Ptex coordinates */ | ||||
| ccl_device bool primitive_ptex(KernelGlobals *kg, ShaderData *sd, float2 *uv, int *face_id) | ccl_device bool primitive_ptex(KernelGlobals *kg, ShaderData *sd, float2 *uv, int *face_id) | ||||
| { | { | ||||
| /* storing ptex data as attributes is not memory efficient but simple for tests */ | /* storing ptex data as attributes is not memory efficient but simple for tests */ | ||||
| const AttributeDescriptor desc_face_id = find_attribute(kg, sd, ATTR_STD_PTEX_FACE_ID); | const AttributeDescriptor desc_face_id = find_attribute(kg, sd, ATTR_STD_PTEX_FACE_ID); | ||||
| const AttributeDescriptor desc_uv = find_attribute(kg, sd, ATTR_STD_PTEX_UV); | const AttributeDescriptor desc_uv = find_attribute(kg, sd, ATTR_STD_PTEX_UV); | ||||
| if(desc_face_id.offset == ATTR_STD_NOT_FOUND || desc_uv.offset == ATTR_STD_NOT_FOUND) | if(desc_face_id.offset == ATTR_STD_NOT_FOUND || desc_uv.offset == ATTR_STD_NOT_FOUND) | ||||
| return false; | return false; | ||||
| float3 uv3 = primitive_attribute_float3(kg, sd, desc_uv, NULL, NULL); | float3 uv3 = primitive_surface_attribute_float3(kg, sd, desc_uv, NULL, NULL); | ||||
| float face_id_f = primitive_attribute_float(kg, sd, desc_face_id, NULL, NULL); | float face_id_f = primitive_surface_attribute_float(kg, sd, desc_face_id, NULL, NULL); | ||||
| *uv = make_float2(uv3.x, uv3.y); | *uv = make_float2(uv3.x, uv3.y); | ||||
| *face_id = (int)face_id_f; | *face_id = (int)face_id_f; | ||||
| return true; | return true; | ||||
| } | } | ||||
| /* Surface tangent */ | /* Surface tangent */ | ||||
| ccl_device float3 primitive_tangent(KernelGlobals *kg, ShaderData *sd) | ccl_device float3 primitive_tangent(KernelGlobals *kg, ShaderData *sd) | ||||
| { | { | ||||
| #ifdef __HAIR__ | #ifdef __HAIR__ | ||||
| if(sd->type & PRIMITIVE_ALL_CURVE) | if(sd->type & PRIMITIVE_ALL_CURVE) | ||||
| # ifdef __DPDU__ | # ifdef __DPDU__ | ||||
| return normalize(sd->dPdu); | return normalize(sd->dPdu); | ||||
| # else | # else | ||||
| return make_float3(0.0f, 0.0f, 0.0f); | return make_float3(0.0f, 0.0f, 0.0f); | ||||
| # endif | # endif | ||||
| #endif | #endif | ||||
| /* try to create spherical tangent from generated coordinates */ | /* try to create spherical tangent from generated coordinates */ | ||||
| const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_GENERATED); | const AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_GENERATED); | ||||
| if(desc.offset != ATTR_STD_NOT_FOUND) { | if(desc.offset != ATTR_STD_NOT_FOUND) { | ||||
| float3 data = primitive_attribute_float3(kg, sd, desc, NULL, NULL); | float3 data = primitive_surface_attribute_float3(kg, sd, desc, NULL, NULL); | ||||
| data = make_float3(-(data.y - 0.5f), (data.x - 0.5f), 0.0f); | data = make_float3(-(data.y - 0.5f), (data.x - 0.5f), 0.0f); | ||||
| object_normal_transform(kg, sd, &data); | object_normal_transform(kg, sd, &data); | ||||
| return cross(sd->N, normalize(cross(data, sd->N))); | return cross(sd->N, normalize(cross(data, sd->N))); | ||||
| } | } | ||||
| else { | else { | ||||
| /* otherwise use surface derivatives */ | /* otherwise use surface derivatives */ | ||||
| #ifdef __DPDU__ | #ifdef __DPDU__ | ||||
| return normalize(sd->dPdu); | return normalize(sd->dPdu); | ||||
| Show All 29 Lines | #endif | ||||
| AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_MOTION_VERTEX_POSITION); | AttributeDescriptor desc = find_attribute(kg, sd, ATTR_STD_MOTION_VERTEX_POSITION); | ||||
| if(desc.offset != ATTR_STD_NOT_FOUND) { | if(desc.offset != ATTR_STD_NOT_FOUND) { | ||||
| /* get motion info */ | /* get motion info */ | ||||
| int numverts, numkeys; | int numverts, numkeys; | ||||
| object_motion_info(kg, sd->object, NULL, &numverts, &numkeys); | object_motion_info(kg, sd->object, NULL, &numverts, &numkeys); | ||||
| /* lookup attributes */ | /* lookup attributes */ | ||||
| motion_pre = primitive_attribute_float3(kg, sd, desc, NULL, NULL); | motion_pre = primitive_surface_attribute_float3(kg, sd, desc, NULL, NULL); | ||||
| desc.offset += (sd->type & PRIMITIVE_ALL_TRIANGLE)? numverts: numkeys; | desc.offset += (sd->type & PRIMITIVE_ALL_TRIANGLE)? numverts: numkeys; | ||||
| motion_post = primitive_attribute_float3(kg, sd, desc, NULL, NULL); | motion_post = primitive_surface_attribute_float3(kg, sd, desc, NULL, NULL); | ||||
| #ifdef __HAIR__ | #ifdef __HAIR__ | ||||
| if(is_curve_primitive && (sd->object_flag & SD_OBJECT_HAS_VERTEX_MOTION) == 0) { | if(is_curve_primitive && (sd->object_flag & SD_OBJECT_HAS_VERTEX_MOTION) == 0) { | ||||
| object_position_transform(kg, sd, &motion_pre); | object_position_transform(kg, sd, &motion_pre); | ||||
| object_position_transform(kg, sd, &motion_post); | object_position_transform(kg, sd, &motion_post); | ||||
| } | } | ||||
| #endif | #endif | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 52 Lines • Show Last 20 Lines | |||||
Adjust indentation to keep alignment of arguments, here and in other places.