forked from bartvdbraak/blender
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:
parent
f33080532c
commit
c8cbe63947
@ -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");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user