[Bf-blender-cvs] [6080e43] temp-cycles-microdisplacement: Fix bug in offset calculation of attributes for subdivision patches

Mai Lavelle noreply at git.blender.org
Tue Apr 12 18:46:12 CEST 2016


Commit: 6080e43e0b7f5461fa61ec3d612ed9ce564b677c
Author: Mai Lavelle
Date:   Tue Apr 12 11:10:27 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB6080e43e0b7f5461fa61ec3d612ed9ce564b677c

Fix bug in offset calculation of attributes for subdivision patches

===================================================================

M	intern/cycles/kernel/geom/geom_cache_triangle.h
M	intern/cycles/render/mesh.cpp

===================================================================

diff --git a/intern/cycles/kernel/geom/geom_cache_triangle.h b/intern/cycles/kernel/geom/geom_cache_triangle.h
index 1d95ed0..eef417b 100644
--- a/intern/cycles/kernel/geom/geom_cache_triangle.h
+++ b/intern/cycles/kernel/geom/geom_cache_triangle.h
@@ -181,7 +181,7 @@ ccl_device float cache_triangle_attribute_float(KernelGlobals *kg, const ShaderD
 		if(dx) *dx = 0.0f;
 		if(dy) *dy = 0.0f;
 
-		return kernel_tex_fetch(__attributes_float, offset + ccl_fetch(sd, prim));
+		return kernel_tex_fetch(__attributes_float, offset + ccl_fetch(sd, cache_triangle).patch);
 	}
 	else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
 		float2 uv[3];
@@ -263,7 +263,7 @@ ccl_device float3 cache_triangle_attribute_float3(KernelGlobals *kg, const Shade
 		if(dx) *dx = make_float3(0.0f, 0.0f, 0.0f);
 		if(dy) *dy = make_float3(0.0f, 0.0f, 0.0f);
 
-		return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + ccl_fetch(sd, prim)));
+		return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + ccl_fetch(sd, cache_triangle).patch));
 	}
 	else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
 		float2 uv[3];
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index e226b70..82365b5 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -978,22 +978,17 @@ static void update_attribute_element_offset(Mesh *mesh,
 
 		/* mesh vertex/curve index is global, not per object, so we sneak
 		 * a correction for that in here */
-		if(element == ATTR_ELEMENT_VERTEX)
+		if(prim == ATTR_PRIM_SUBD) {
+			/* subd requires no correction */
+		}
+		else if(element == ATTR_ELEMENT_VERTEX)
 			offset -= mesh->vert_offset;
 		else if(element == ATTR_ELEMENT_VERTEX_MOTION)
 			offset -= mesh->vert_offset;
-		else if(element == ATTR_ELEMENT_FACE) {
-			if(prim == ATTR_PRIM_TRIANGLE)
-				offset -= mesh->tri_offset;
-			else
-				offset -= mesh->patch_offset;
-		}
-		else if(element == ATTR_ELEMENT_CORNER || element == ATTR_ELEMENT_CORNER_BYTE) {
-			if(prim == ATTR_PRIM_TRIANGLE)
-				offset -= 3*mesh->tri_offset;
-			else
-				offset -= 4*mesh->patch_offset;
-		}
+		else if(element == ATTR_ELEMENT_FACE)
+			offset -= mesh->tri_offset;
+		else if(element == ATTR_ELEMENT_CORNER || element == ATTR_ELEMENT_CORNER_BYTE)
+			offset -= 3*mesh->tri_offset;
 		else if(element == ATTR_ELEMENT_CURVE)
 			offset -= mesh->curve_offset;
 		else if(element == ATTR_ELEMENT_CURVE_KEY)




More information about the Bf-blender-cvs mailing list