forked from bartvdbraak/blender
Cycles: fix for UV texture coordinates lookup with more than one mesh, bug in corner attribute storage.
This commit is contained in:
parent
f56aa76752
commit
cf00171da5
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user