HW Skinning
* Added check in shader for number of bones * Fix crash when Skinning.glsllib is imported by shader * Fix incorrect transform of tangent vector in shader git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10552 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
		
							parent
							
								
									8c1e5c9cf9
								
							
						
					
					
						commit
						c21b60fbe7
					
				| @ -1,55 +1,66 @@ | ||||
|  #ifdef NUM_BONES | ||||
| #ifdef NUM_BONES | ||||
| 
 | ||||
| #if NUM_BONES < 1 || NUM_BONES > 255 | ||||
| #error NUM_BONES must be between 1 and 255. | ||||
| #endif | ||||
| 
 | ||||
| #define NUM_WEIGHTS_PER_VERT 4 | ||||
|   | ||||
| attribute vec4 inBoneWeight; | ||||
| attribute vec4 inBoneIndex; | ||||
| uniform mat4 m_BoneMatrices[NUM_BONES]; | ||||
|   | ||||
| void Skinning_Compute(inout vec4 position){ | ||||
|     #if NUM_WEIGHTS_PER_VERT == 1 | ||||
| #if NUM_WEIGHTS_PER_VERT == 1 | ||||
|     position = m_BoneMatrices[int(inBoneIndex.x)] * position; | ||||
|     #else | ||||
| #else | ||||
|     mat4 mat = mat4(0.0); | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w; | ||||
|     position = mat * position; | ||||
|     #endif | ||||
| #endif | ||||
| } | ||||
|   | ||||
| void Skinning_Compute(inout vec4 position, inout vec3 normal){ | ||||
|     #if NUM_WEIGHTS_PER_VERT == 1 | ||||
| #if NUM_WEIGHTS_PER_VERT == 1 | ||||
|     position = m_BoneMatrices[int(inBoneIndex.x)] * position; | ||||
|     normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz, | ||||
|                    m_BoneMatrices[int(inBoneIndex.x)][1].xyz, | ||||
|                    m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal); | ||||
|     #else | ||||
| #else | ||||
|     mat4 mat = mat4(0.0); | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w; | ||||
|     position = mat * position; | ||||
|     normal = (mat3(mat[0].xyz,mat[1].xyz,mat[2].xyz) * normal); | ||||
|     #endif | ||||
| 
 | ||||
|     mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz); | ||||
|     normal = rotMat * normal; | ||||
| #endif | ||||
| } | ||||
|   | ||||
| void Skinning_Compute(inout vec4 position, inout vec4 tangent, inout vec3 normal){ | ||||
|     #if NUM_WEIGHTS_PER_VERT == 1 | ||||
| void Skinning_Compute(inout vec4 position, inout vec3 tangent, inout vec3 normal){ | ||||
| #if NUM_WEIGHTS_PER_VERT == 1 | ||||
|     position = m_BoneMatrices[int(inBoneIndex.x)] * position; | ||||
|     tangent = m_BoneMatrices[int(inBoneIndex.x)] * tangent; | ||||
|     normal = (mat3(m_BoneMatrices[int(inBoneIndex.x)][0].xyz, | ||||
|                    m_BoneMatrices[int(inBoneIndex.x)][1].xyz, | ||||
|                    m_BoneMatrices[int(inBoneIndex.x)][2].xyz) * normal); | ||||
|     #else | ||||
| #else | ||||
|     mat4 mat = mat4(0.0); | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.x)] * inBoneWeight.x; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.y)] * inBoneWeight.y; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.z)] * inBoneWeight.z; | ||||
|     mat += m_BoneMatrices[int(inBoneIndex.w)] * inBoneWeight.w; | ||||
|     position = mat * position; | ||||
|     tangent = mat * tangent; | ||||
|     normal = (mat3(mat[0].xyz,mat[1].xyz,mat[2].xyz) * normal); | ||||
|     #endif | ||||
| 
 | ||||
|     mat3 rotMat = mat3(mat[0].xyz, mat[1].xyz, mat[2].xyz); | ||||
|     tangent = rotMat * tangent; | ||||
|     normal = rotMat * normal; | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user