GL material shader, normal maps, issues


I use a code in several shaders about normal mapping, that I get and adapted from the GLSL wiki :

It seems I have an issue with the tangent attribute :
provided the object does not rotate, or rotates slowly it’s ok, the bump effect looks nice and reacts to lights transformations.
but if I rotate the object of 90° in one tic, there’s a glitch at this tic, I have an error about world/view/something matrices I suppose.

example of case where I can observe the glitch :
characted oriented towards north, order given to rotate towards east
> RIG animation that goes from idle towards -Y to idle oriented towards +X
> when RIG animation ends, rotate the OBJECT rig 90°, replace rig animation frame idle +X by idle -Y
-> normals ‘jump’ at this tic, light reflection is a bit different, but still looks ok…

at shader creation time, among all the necessary stuff and uniforms for normal map etc, I :


in the vertex code :

VertexShader = """
	attribute vec4 tangent;
	varying mat3 localSurface2View;
	varying vec4 uvmap
		localSurface2View[0] = normalize(vec3(gl_ModelViewMatrix * vec4(vec3(tangent), 0.0)));
		localSurface2View[2] = normalize(gl_NormalMatrix * gl_Normal);
		localSurface2View[1] = normalize(cross(localSurface2View[2], localSurface2View[0]));
		uvmap = gl_MultiTexCoord0 ;

in the fragment code :

FragmentShader = """
	varying mat3 localSurface2View;
	varying vec4 uvmap ;
	uniform sampler2D normalid; // 'normalMap' could it be relevant ?
	// uniform float normalInt;
	// uniform	float normalScale ; I removed these to simplify the thread, seem to be out of cause.

	vec3 bump(vec4 texNormal) //, mat3 localSurface2View, float normalInt)
		vec3 localCoords = normalize(vec3(2.0, 2.0, 1.0) * vec3(texNormal) - vec3(1.0, 1.0, 0.0));
		return normalize(localSurface2View * localCoords) ;
	void main()
		vec4 texNormal = texture2D(normalid,vec2(uvmap) ) ;
		vec3 N = bump(texNormal) ;

lamps coordinates/directions/other light props are given by uniforms and I 90% sure they are, now… finally… after huge battles against matrices and BGE docs, working right.

interesting potential of information in the BGE docs :

I believe it comes from the tangent calculation.

how do you perform this ? what should I know or test ?