Cycles: fix issues with texture coordinates and object scale. Auto texture

space size and location were outdated often, and already computed on demand
by blender internal, now do that through RNA as well.
This commit is contained in:
Brecht Van Lommel 2012-05-08 23:39:31 +00:00
parent f33080532c
commit c8cbe63947
6 changed files with 38 additions and 7 deletions

@ -268,7 +268,7 @@ __device void triangle_light_sample(KernelGlobals *kg, int prim, int object,
Transform itfm = object_fetch_transform(kg, ls->object, time, OBJECT_INVERSE_TRANSFORM);
ls->P = transform_point(&tfm, ls->P);
ls->Ng = transform_direction_transposed(&itfm, ls->Ng);
ls->Ng = normalize(transform_direction_transposed(&itfm, ls->Ng));
}
#endif
}

@ -77,6 +77,16 @@ __device_inline void object_position_transform(KernelGlobals *kg, ShaderData *sd
#endif
}
__device_inline void object_inverse_position_transform(KernelGlobals *kg, ShaderData *sd, float3 *P)
{
#ifdef __MOTION__
*P = transform_point(&sd->ob_itfm, *P);
#else
Transform tfm = object_fetch_transform(kg, sd->object, TIME_INVALID, OBJECT_INVERSE_TRANSFORM);
*P = transform_point(&tfm, *P);
#endif
}
__device_inline void object_inverse_normal_transform(KernelGlobals *kg, ShaderData *sd, float3 *N)
{
#ifdef __MOTION__

@ -57,7 +57,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
data = sd->P;
object_position_transform(kg, sd, &data);
object_inverse_position_transform(kg, sd, &data);
}
else
data = sd->P;
@ -106,7 +106,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
data = sd->P + sd->dP.dx;
object_position_transform(kg, sd, &data);
object_inverse_position_transform(kg, sd, &data);
}
else
data = sd->P + sd->dP.dx;
@ -158,7 +158,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
data = sd->P + sd->dP.dy;
object_position_transform(kg, sd, &data);
object_inverse_position_transform(kg, sd, &data);
}
else
data = sd->P + sd->dP.dy;

@ -494,7 +494,6 @@ Mesh *BKE_mesh_add(const char *name)
me->smoothresh = 30;
me->texflag = ME_AUTOSPACE;
me->flag = ME_TWOSIDED;
me->bb = BKE_boundbox_alloc_unit();
me->drawflag = ME_DRAWEDGES | ME_DRAWFACES | ME_DRAWCREASES;
return me;

@ -3599,8 +3599,8 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
finalDM->release(finalDM);
}
else {
/* don't create boundbox here with BKE_mesh_boundbox_get(), the derived system will make it, puts deformed bb's OK */
if (me->totpoly <= 4 || ED_view3d_boundbox_clip(rv3d, ob->obmat, (ob->bb) ? ob->bb : me->bb)) {
/* ob->bb was set by derived mesh system, do NULL check just to be sure */
if (me->totpoly <= 4 || (ob->bb && ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb))) {
glsl = draw_glsl_material(scene, ob, v3d, dt);
check_alpha = check_alpha_pass(base);

@ -452,6 +452,26 @@ static int rna_Mesh_texspace_editable(PointerRNA *ptr)
return (me->texflag & ME_AUTOSPACE)? 0: PROP_EDITABLE;
}
static void rna_Mesh_texspace_size_get(PointerRNA *ptr, float values[3])
{
Mesh *me= (Mesh*)ptr->data;
if(!me->bb)
BKE_mesh_texspace_calc(me);
copy_v3_v3(values, me->size);
}
static void rna_Mesh_texspace_loc_get(PointerRNA *ptr, float values[3])
{
Mesh *me= (Mesh*)ptr->data;
if(!me->bb)
BKE_mesh_texspace_calc(me);
copy_v3_v3(values, me->loc);
}
static void rna_MeshVertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *me = rna_mesh(ptr);
@ -2066,12 +2086,14 @@ void rna_def_texmat_common(StructRNA *srna, const char *texspace_editable)
prop = RNA_def_property(srna, "texspace_location", PROP_FLOAT, PROP_TRANSLATION);
RNA_def_property_float_sdna(prop, NULL, "loc");
RNA_def_property_ui_text(prop, "Texure Space Location", "Texture space location");
RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_loc_get", NULL, NULL);
RNA_def_property_editable_func(prop, texspace_editable);
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");
prop = RNA_def_property(srna, "texspace_size", PROP_FLOAT, PROP_XYZ);
RNA_def_property_float_sdna(prop, NULL, "size");
RNA_def_property_ui_text(prop, "Texture Space Size", "Texture space size");
RNA_def_property_float_funcs(prop, "rna_Mesh_texspace_size_get", NULL, NULL);
RNA_def_property_editable_func(prop, texspace_editable);
RNA_def_property_update(prop, 0, "rna_Mesh_update_draw");