[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60371] trunk/blender: Fix cycles issue with mapping node rotation and scale order.

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Sep 25 22:28:49 CEST 2013


Revision: 60371
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60371
Author:   blendix
Date:     2013-09-25 20:28:49 +0000 (Wed, 25 Sep 2013)
Log Message:
-----------
Fix cycles issue with mapping node rotation and scale order. When using both
scale and rotation in mapping node, there would be shearing, and the only way
to avoid that was to add 2 mapping nodes. This is because to transform the
texture, the inverse transform needs to be done on the texture coordinate

Now the mapping node has Texture/Point/Vector/Normal types to transform the
vector for a particular purpose. Point is the existing behavior, Texture is
the new default that behaves more like you might expect.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/addon/ui.py
    trunk/blender/intern/cycles/blender/blender_shader.cpp
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h
    trunk/blender/source/blender/blenkernel/BKE_texture.h
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesdna/DNA_texture_types.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_texture.c
    trunk/blender/source/blender/nodes/composite/nodes/node_composite_mapValue.c
    trunk/blender/source/blender/nodes/shader/node_shader_util.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_mapping.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_brick.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_checker.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_gradient.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_image.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_magic.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_noise.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_sky.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_wave.c

Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/intern/cycles/blender/addon/ui.py	2013-09-25 20:28:49 UTC (rev 60371)
@@ -1085,6 +1085,8 @@
 
         mapping = node.texture_mapping
 
+        layout.prop(mapping, "type", expand=True)
+
         row = layout.row()
 
         row.column().prop(mapping, "translation")

Modified: trunk/blender/intern/cycles/blender/blender_shader.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/intern/cycles/blender/blender_shader.cpp	2013-09-25 20:28:49 UTC (rev 60371)
@@ -147,6 +147,7 @@
 	mapping->translation = get_float3(b_mapping.translation());
 	mapping->rotation = get_float3(b_mapping.rotation());
 	mapping->scale = get_float3(b_mapping.scale());
+	mapping->type = (TextureMapping::Type)b_mapping.type();
 
 	mapping->x_mapping = (TextureMapping::Mapping)b_mapping.mapping_x();
 	mapping->y_mapping = (TextureMapping::Mapping)b_mapping.mapping_y();
@@ -161,6 +162,7 @@
 	mapping->translation = get_float3(b_mapping.translation());
 	mapping->rotation = get_float3(b_mapping.rotation());
 	mapping->scale = get_float3(b_mapping.scale());
+	mapping->type = (TextureMapping::Type)b_mapping.type();
 
 	mapping->use_minmax = b_mapping.use_min() || b_mapping.use_max();
 

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2013-09-25 20:28:49 UTC (rev 60371)
@@ -42,6 +42,8 @@
 	y_mapping = Y;
 	z_mapping = Z;
 
+	type = TEXTURE;
+
 	projection = FLAT;
 }
 
@@ -55,12 +57,52 @@
 		mmat[1][y_mapping-1] = 1.0f;
 	if(z_mapping != NONE)
 		mmat[2][z_mapping-1] = 1.0f;
+	
+	float3 scale_clamped = scale;
 
-	Transform smat = transform_scale(scale);
+	if(type == TEXTURE || type == NORMAL) {
+		/* keep matrix invertible */
+		if(fabsf(scale.x) < 1e-5f)
+			scale_clamped.x = signf(scale.x)*1e-5f;
+		if(fabsf(scale.y) < 1e-5f)
+			scale_clamped.y = signf(scale.y)*1e-5f;
+		if(fabsf(scale.z) < 1e-5f)
+			scale_clamped.z = signf(scale.z)*1e-5f;
+	}
+	
+	Transform smat = transform_scale(scale_clamped);
 	Transform rmat = transform_euler(rotation);
 	Transform tmat = transform_translate(translation);
 
-	return tmat*rmat*smat*mmat;
+	Transform mat;
+
+	switch(type) {
+		case TEXTURE:
+			/* inverse transform on texture coordinate gives
+			 * forward transform on texture */
+			mat = tmat*rmat*smat;
+			mat = transform_inverse(mat);
+			break;
+		case POINT:
+			/* full transform */
+			mat = tmat*rmat*smat;
+			break;
+		case VECTOR:
+			/* no translation for vectors */
+			mat = rmat*smat;
+			break;
+		case NORMAL:
+			/* no translation for normals, and inverse transpose */
+			mat = rmat*smat;
+			mat = transform_inverse(mat);
+			mat = transform_transpose(mat);
+			break;
+	}
+
+	/* projection last */
+	mat = mat*mmat;
+
+	return mat;
 }
 
 bool TextureMapping::skip()
@@ -98,6 +140,11 @@
 		compiler.add_node(float3_to_float4(min));
 		compiler.add_node(float3_to_float4(max));
 	}
+
+	if(type == NORMAL) {
+		compiler.add_node(NODE_VECTOR_MATH, NODE_VECTOR_MATH_NORMALIZE, offset_out, offset_out);
+		compiler.add_node(NODE_VECTOR_MATH, SVM_STACK_INVALID, offset_out);
+	}
 }
 
 void TextureMapping::compile(OSLCompiler &compiler)

Modified: trunk/blender/intern/cycles/render/nodes.h
===================================================================
--- trunk/blender/intern/cycles/render/nodes.h	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/intern/cycles/render/nodes.h	2013-09-25 20:28:49 UTC (rev 60371)
@@ -43,6 +43,9 @@
 	float3 min, max;
 	bool use_minmax;
 
+	enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 };
+	Type type;
+
 	enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 };
 	Mapping x_mapping, y_mapping, z_mapping;
 

Modified: trunk/blender/source/blender/blenkernel/BKE_texture.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_texture.h	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/source/blender/blenkernel/BKE_texture.h	2013-09-25 20:28:49 UTC (rev 60371)
@@ -101,8 +101,8 @@
 
 int has_current_material_texture(struct Material *ma);
 
-struct TexMapping *add_tex_mapping(void);
-void default_tex_mapping(struct TexMapping *texmap);
+struct TexMapping *add_tex_mapping(int type);
+void default_tex_mapping(struct TexMapping *texmap, int type);
 void init_tex_mapping(struct TexMapping *texmap);
 
 struct ColorMapping *add_color_mapping(void);

Modified: trunk/blender/source/blender/blenkernel/intern/texture.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/texture.c	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/source/blender/blenkernel/intern/texture.c	2013-09-25 20:28:49 UTC (rev 60371)
@@ -71,16 +71,16 @@
 
 /* ****************** Mapping ******************* */
 
-TexMapping *add_tex_mapping(void)
+TexMapping *add_tex_mapping(int type)
 {
 	TexMapping *texmap = MEM_callocN(sizeof(TexMapping), "TexMapping");
 	
-	default_tex_mapping(texmap);
+	default_tex_mapping(texmap, type);
 	
 	return texmap;
 }
 
-void default_tex_mapping(TexMapping *texmap)
+void default_tex_mapping(TexMapping *texmap, int type)
 {
 	memset(texmap, 0, sizeof(TexMapping));
 
@@ -92,11 +92,12 @@
 	texmap->projy = PROJ_Y;
 	texmap->projz = PROJ_Z;
 	texmap->mapping = MTEX_FLAT;
+	texmap->type = type;
 }
 
 void init_tex_mapping(TexMapping *texmap)
 {
-	float smat[3][3], rmat[3][3], mat[3][3], proj[3][3];
+	float smat[4][4], rmat[4][4], tmat[4][4], proj[4][4], size[3];
 
 	if (texmap->projx == PROJ_X && texmap->projy == PROJ_Y && texmap->projz == PROJ_Z &&
 	    is_zero_v3(texmap->loc) && is_zero_v3(texmap->rot) && is_one_v3(texmap->size))
@@ -107,7 +108,8 @@
 	}
 	else {
 		/* axis projection */
-		zero_m3(proj);
+		zero_m4(proj);
+		proj[3][3] = 1.0f;
 
 		if (texmap->projx != PROJ_N)
 			proj[texmap->projx - 1][0] = 1.0f;
@@ -117,20 +119,51 @@
 			proj[texmap->projz - 1][2] = 1.0f;
 
 		/* scale */
-		size_to_mat3(smat, texmap->size);
+		copy_v3_v3(size, texmap->size);
+
+		if (ELEM(texmap->type, TEXMAP_TYPE_TEXTURE, TEXMAP_TYPE_NORMAL)) {
+			/* keep matrix invertible */
+			if(fabsf(size[0]) < 1e-5f)
+				size[0] = signf(size[0])*1e-5f;
+			if(fabsf(size[1]) < 1e-5f)
+				size[1] = signf(size[1])*1e-5f;
+			if(fabsf(size[2]) < 1e-5f)
+				size[2] = signf(size[2])*1e-5f;
+		}
 		
+		size_to_mat4(smat, texmap->size);
+
 		/* rotation */
-		/* TexMapping rotation are now in radians. */
-		eul_to_mat3(rmat, texmap->rot);
-		
-		/* compose it all */
-		mul_m3_m3m3(mat, rmat, smat);
-		mul_m3_m3m3(mat, proj, mat);
-		
+		eul_to_mat4(rmat, texmap->rot);
+
 		/* translation */
-		copy_m4_m3(texmap->mat, mat);
-		copy_v3_v3(texmap->mat[3], texmap->loc);
+		unit_m4(tmat);
+		copy_v3_v3(tmat[3], texmap->loc);
 
+		if (texmap->type == TEXMAP_TYPE_TEXTURE) {
+			/* to transform a texture, the inverse transform needs
+			 * to be applied to the texture coordinate */
+			mul_serie_m4(texmap->mat, tmat, rmat, smat, 0, 0, 0, 0, 0);
+			invert_m4(texmap->mat);
+		}
+		else if (texmap->type == TEXMAP_TYPE_POINT) {
+			/* forward transform */
+			mul_serie_m4(texmap->mat, tmat, rmat, smat, 0, 0, 0, 0, 0);
+		}
+		else if (texmap->type == TEXMAP_TYPE_VECTOR) {
+			/* no translation for vectors */
+			mul_m4_m4m4(texmap->mat, rmat, smat);
+		}
+		else if (texmap->type == TEXMAP_TYPE_NORMAL) {
+			/* no translation for normals, and inverse transpose */
+			mul_m4_m4m4(texmap->mat, rmat, smat);
+			invert_m4(texmap->mat);
+			transpose_m4(texmap->mat);
+		}
+
+		/* projection last */
+		mul_m4_m4m4(texmap->mat, texmap->mat, proj);
+
 		texmap->flag &= ~TEXMAP_UNIT_MATRIX;
 	}
 }

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2013-09-25 20:28:49 UTC (rev 60371)
@@ -709,6 +709,8 @@
 {
 	uiLayout *row;
 	
+	uiItemR(layout, ptr, "type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+
 	uiItemL(layout, IFACE_("Location:"), ICON_NONE);
 	row = uiLayoutRow(layout, TRUE);
 	uiItemR(row, ptr, "translation", 0, "", ICON_NONE);

Modified: trunk/blender/source/blender/makesdna/DNA_node_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_node_types.h	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/source/blender/makesdna/DNA_node_types.h	2013-09-25 20:28:49 UTC (rev 60371)
@@ -975,7 +975,7 @@
 #define SHD_NORMAL_MAP_BLENDER_OBJECT	3
 #define SHD_NORMAL_MAP_BLENDER_WORLD	4
 
-/* tangent */
+/* subsurface */
 #define SHD_SUBSURFACE_COMPATIBLE		0
 #define SHD_SUBSURFACE_CUBIC			1
 #define SHD_SUBSURFACE_GAUSSIAN			2

Modified: trunk/blender/source/blender/makesdna/DNA_texture_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_texture_types.h	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/source/blender/makesdna/DNA_texture_types.h	2013-09-25 20:28:49 UTC (rev 60371)
@@ -263,7 +263,7 @@
 	float loc[3], rot[3], size[3];
 	int flag;
 	char projx, projy, projz, mapping;
-	int pad;
+	int type;
 	
 	float mat[4][4];
 	float min[3], max[3];
@@ -287,6 +287,12 @@
 #define TEXMAP_CLIP_MAX		2
 #define TEXMAP_UNIT_MATRIX	4
 
+/* texmap->type */
+#define TEXMAP_TYPE_POINT		0
+#define TEXMAP_TYPE_TEXTURE		1
+#define TEXMAP_TYPE_VECTOR		2
+#define TEXMAP_TYPE_NORMAL		3
+
 /* colormap->flag */
 #define COLORMAP_USE_RAMP 1
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2013-09-25 19:18:28 UTC (rev 60370)
+++ trunk/blender/source/blender/makesrna/intern/rna_nodetree.c	2013-09-25 20:28:49 UTC (rev 60371)
@@ -3135,10 +3135,24 @@
 
 static void def_sh_mapping(StructRNA *srna)
 {
+	static EnumPropertyItem prop_vect_type_items[] = {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list