From c8cbe63947f6ba05584b5dc6d298dd7301e5dbc0 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 8 May 2012 23:39:31 +0000 Subject: [PATCH] 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. --- intern/cycles/kernel/kernel_light.h | 2 +- intern/cycles/kernel/kernel_object.h | 10 +++++++++ intern/cycles/kernel/svm/svm_tex_coord.h | 6 ++--- source/blender/blenkernel/intern/mesh.c | 1 - .../blender/editors/space_view3d/drawobject.c | 4 ++-- source/blender/makesrna/intern/rna_mesh.c | 22 +++++++++++++++++++ 6 files changed, 38 insertions(+), 7 deletions(-) diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h index c2cf293cab3..cd9557bd0bf 100644 --- a/intern/cycles/kernel/kernel_light.h +++ b/intern/cycles/kernel/kernel_light.h @@ -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 } diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h index 4a3ef55e8cb..abe427d8345 100644 --- a/intern/cycles/kernel/kernel_object.h +++ b/intern/cycles/kernel/kernel_object.h @@ -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__ diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h index 169307574a2..aa924bcc38b 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -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; diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 3ccd09257e6..944f06cf740 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -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; diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index fe140060821..7f1e3d4934b 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -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); diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 436b6938e05..733e14857fd 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -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");