Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2013-12-31 20:33:55 +0400
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2013-12-31 20:38:26 +0400
commit9cd2b199994ba48f343a89a270827b2e0ed3221d (patch)
treea90b3f0b2a5a8869b0fb8552a8d660d3d91209c1 /intern/cycles/kernel/svm
parent6b03f92aa7bdb10cfde99bc30a7337c843bda57c (diff)
Cycles Volume Render: generated texture coordinates for volume render.
This does not support staying fixed while the surface deforms, but for static meshes it should match up with the surface texture coordinates. Implemented as a matrix transform from objects space to mesh texture space. Making this work for deforming surfaces would be quite complicated, you might need something like harmonic coordinates as used in the mesh deform modifier, probably will not be possible anytime soon.
Diffstat (limited to 'intern/cycles/kernel/svm')
-rw-r--r--intern/cycles/kernel/svm/svm_tex_coord.h90
-rw-r--r--intern/cycles/kernel/svm/svm_types.h6
2 files changed, 64 insertions, 32 deletions
diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h
index 3044cbf81e0..4b1f30e55bb 100644
--- a/intern/cycles/kernel/svm/svm_tex_coord.h
+++ b/intern/cycles/kernel/svm/svm_tex_coord.h
@@ -24,21 +24,15 @@ ccl_device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, int path_f
switch(type) {
case NODE_TEXCO_OBJECT: {
- if(sd->object != ~0) {
- data = sd->P;
+ data = sd->P;
+ if(sd->object != ~0)
object_inverse_position_transform(kg, sd, &data);
- }
- else
- data = sd->P;
break;
}
case NODE_TEXCO_NORMAL: {
- if(sd->object != ~0) {
- data = sd->N;
+ data = sd->N;
+ if(sd->object != ~0)
object_inverse_normal_transform(kg, sd, &data);
- }
- else
- data = sd->N;
break;
}
case NODE_TEXCO_CAMERA: {
@@ -73,6 +67,22 @@ ccl_device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, int path_f
data = object_dupli_uv(kg, sd->object);
break;
}
+ case NODE_TEXCO_VOLUME_GENERATED: {
+ data = sd->P;
+
+ if(sd->object != ~0) {
+ AttributeElement attr_elem;
+ int attr_offset = find_attribute(kg, sd, ATTR_STD_GENERATED_TRANSFORM, &attr_elem);
+
+ object_inverse_position_transform(kg, sd, &data);
+
+ if(attr_offset != ATTR_STD_NOT_FOUND) {
+ Transform tfm = primitive_attribute_matrix(kg, sd, attr_offset);
+ data = transform_point(&tfm, data);
+ }
+ }
+ break;
+ }
}
stack_store_float3(stack, out_offset, data);
@@ -85,21 +95,15 @@ ccl_device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, in
switch(type) {
case NODE_TEXCO_OBJECT: {
- if(sd->object != ~0) {
- data = sd->P + sd->dP.dx;
+ data = sd->P + sd->dP.dx;
+ if(sd->object != ~0)
object_inverse_position_transform(kg, sd, &data);
- }
- else
- data = sd->P + sd->dP.dx;
break;
}
case NODE_TEXCO_NORMAL: {
- if(sd->object != ~0) {
- data = sd->N;
+ data = sd->N;
+ if(sd->object != ~0)
object_inverse_normal_transform(kg, sd, &data);
- }
- else
- data = sd->N;
break;
}
case NODE_TEXCO_CAMERA: {
@@ -134,6 +138,22 @@ ccl_device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, in
data = object_dupli_uv(kg, sd->object);
break;
}
+ case NODE_TEXCO_VOLUME_GENERATED: {
+ data = sd->P + sd->dP.dx;
+
+ if(sd->object != ~0) {
+ AttributeElement attr_elem;
+ int attr_offset = find_attribute(kg, sd, ATTR_STD_GENERATED_TRANSFORM, &attr_elem);
+
+ object_inverse_position_transform(kg, sd, &data);
+
+ if(attr_offset != ATTR_STD_NOT_FOUND) {
+ Transform tfm = primitive_attribute_matrix(kg, sd, attr_offset);
+ data = transform_point(&tfm, data);
+ }
+ }
+ break;
+ }
}
stack_store_float3(stack, out_offset, data);
@@ -149,21 +169,15 @@ ccl_device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, in
switch(type) {
case NODE_TEXCO_OBJECT: {
- if(sd->object != ~0) {
- data = sd->P + sd->dP.dy;
+ data = sd->P + sd->dP.dy;
+ if(sd->object != ~0)
object_inverse_position_transform(kg, sd, &data);
- }
- else
- data = sd->P + sd->dP.dy;
break;
}
case NODE_TEXCO_NORMAL: {
- if(sd->object != ~0) {
- data = sd->N;
+ data = sd->N;
+ if(sd->object != ~0)
object_inverse_normal_transform(kg, sd, &data);
- }
- else
- data = sd->N;
break;
}
case NODE_TEXCO_CAMERA: {
@@ -198,6 +212,22 @@ ccl_device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, in
data = object_dupli_uv(kg, sd->object);
break;
}
+ case NODE_TEXCO_VOLUME_GENERATED: {
+ data = sd->P + sd->dP.dy;
+
+ if(sd->object != ~0) {
+ AttributeElement attr_elem;
+ int attr_offset = find_attribute(kg, sd, ATTR_STD_GENERATED_TRANSFORM, &attr_elem);
+
+ object_inverse_position_transform(kg, sd, &data);
+
+ if(attr_offset != ATTR_STD_NOT_FOUND) {
+ Transform tfm = primitive_attribute_matrix(kg, sd, attr_offset);
+ data = transform_point(&tfm, data);
+ }
+ }
+ break;
+ }
}
stack_store_float3(stack, out_offset, data);
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index e6df5fe17b7..9850a058611 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -107,7 +107,8 @@ typedef enum NodeType {
typedef enum NodeAttributeType {
NODE_ATTR_FLOAT = 0,
- NODE_ATTR_FLOAT3
+ NODE_ATTR_FLOAT3,
+ NODE_ATTR_MATRIX
} NodeAttributeType;
typedef enum NodeGeometry {
@@ -173,7 +174,8 @@ typedef enum NodeTexCoord {
NODE_TEXCO_WINDOW,
NODE_TEXCO_REFLECTION,
NODE_TEXCO_DUPLI_GENERATED,
- NODE_TEXCO_DUPLI_UV
+ NODE_TEXCO_DUPLI_UV,
+ NODE_TEXCO_VOLUME_GENERATED
} NodeTexCoord;
typedef enum NodeMix {