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@pandora.be>2011-05-04 18:01:38 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2011-05-04 18:01:38 +0400
commitcf00171da56ce1e8d6adde9e447c4dab52f47ea9 (patch)
tree3d524361174d0c24f992c119869528f49f939835 /intern/cycles
parentf56aa76752315a763924ade2406d1bcc436f27f1 (diff)
Cycles: fix for UV texture coordinates lookup with more than one mesh, bug in corner attribute storage.
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/kernel/kernel_triangle.h16
-rw-r--r--intern/cycles/render/mesh.cpp6
2 files changed, 12 insertions, 10 deletions
diff --git a/intern/cycles/kernel/kernel_triangle.h b/intern/cycles/kernel/kernel_triangle.h
index 64cbb2dcb61..ddf8b7b1caf 100644
--- a/intern/cycles/kernel/kernel_triangle.h
+++ b/intern/cycles/kernel/kernel_triangle.h
@@ -116,10 +116,10 @@ __device float triangle_attribute_float(KernelGlobals *kg, const ShaderData *sd,
return sd->u*f0 + sd->v*f1 + (1.0f - sd->u - sd->v)*f2;
}
else if(elem == ATTR_ELEMENT_CORNER) {
- int tri = offset + sd->prim;
- float f0 = kernel_tex_fetch(__attributes_float, tri*3 + 0);
- float f1 = kernel_tex_fetch(__attributes_float, tri*3 + 1);
- float f2 = kernel_tex_fetch(__attributes_float, tri*3 + 2);
+ int tri = offset + sd->prim*3;
+ float f0 = kernel_tex_fetch(__attributes_float, tri + 0);
+ float f1 = kernel_tex_fetch(__attributes_float, tri + 1);
+ float f2 = kernel_tex_fetch(__attributes_float, tri + 2);
#ifdef __RAY_DIFFERENTIALS__
if(dx) *dx = sd->du.dx*f0 + sd->dv.dx*f1 - (sd->du.dx + sd->dv.dx)*f2;
@@ -159,10 +159,10 @@ __device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData *s
return sd->u*f0 + sd->v*f1 + (1.0f - sd->u - sd->v)*f2;
}
else if(elem == ATTR_ELEMENT_CORNER) {
- int tri = offset + sd->prim;
- float3 f0 = as_float3(kernel_tex_fetch(__attributes_float3, tri*3 + 0));
- float3 f1 = as_float3(kernel_tex_fetch(__attributes_float3, tri*3 + 1));
- float3 f2 = as_float3(kernel_tex_fetch(__attributes_float3, tri*3 + 2));
+ int tri = offset + sd->prim*3;
+ float3 f0 = as_float3(kernel_tex_fetch(__attributes_float3, tri + 0));
+ float3 f1 = as_float3(kernel_tex_fetch(__attributes_float3, tri + 1));
+ float3 f2 = as_float3(kernel_tex_fetch(__attributes_float3, tri + 2));
#ifdef __RAY_DIFFERENTIALS__
if(dx) *dx = sd->du.dx*f0 + sd->dv.dx*f1 - (sd->du.dx + sd->dv.dx)*f2;
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index eb9fefcc0ad..aae32851131 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -469,11 +469,13 @@ void MeshManager::device_update_attributes(Device *device, DeviceScene *dscene,
}
/* mesh vertex/triangle index is global, not per object, so we sneak
- a correct for that in here */
+ a correction for that in here */
if(req.element == ATTR_ELEMENT_VERTEX)
req.offset -= mesh->vert_offset;
- else
+ else if(mattr->element == Attribute::FACE)
req.offset -= mesh->tri_offset;
+ else if(mattr->element == Attribute::CORNER)
+ req.offset -= 3*mesh->tri_offset;
if(progress.get_cancel()) return;
}