This code is for skeletal animation

so say i have this code

Code :#define NUM_BONES 50 uniform mat4 bones[NUM_BONES]; uniform vec4 weights[NUM_BONES]; uniform ivec4 attachments[NUM_BONES]; in vec4 position; void main() { vec4 position4 = vec4(position, 1.0); vec4 worldPosition = vec4(0.0); for (int i = 0; i < 4; i++) worldPosition += weights[attachments[gl_VertexID][i]] * (bones[attachments[gl_VertexID][i]] * position); gl_Position = gl_ModelViewProjectionMatrix * worldPosition; }

1.Why is the weights a vec4? Isn't a weight only one value, like a float?

2.in the vertex shader, why am i only able to use 1D arrays? I have to make about 8 uniform arrays in order to use all the information i need.

3. When a parent bone rotates, the matrix of the bone is given a slight change in rotation(Im converting the matrix to quanternion and then multiplying quanternions), how do i correctly rotate the child bones. For example, if i rotate the shoulder, the rest of the arm has to rotate the same amount. Could somebody explain this further? / in more detail.

4. with the code below, it shows only 4 bones per vertex. What if i want more than just 4? And once again i dont understand the vec4 weight thing.

Code :in vec3 position; in vec2 textureCoords; in vec3 normal; in vec4 BoneIndex; in vec4 Weights; uniform mat4 bones[10]; void main() { vec4 newvertex; vev3 newNormal; new newvertex += bones[int(BoneIndex.x)]*gl_Vertex*Weights.x; new newNormal+= mat3(bones[int(BoneIndex.x)])*gl_Normal*Weights.x; new newvertex += bones[int(BoneIndex.y)]*gl_Vertex*Weights.y; new newNormal+= mat3(bones[int(BoneIndex.y)])*gl_Normal*Weights.y; new newvertex += bones[int(BoneIndex.z)]*gl_Vertex*Weights.z; new newNormal+= mat3(bones[int(BoneIndex.z)])*gl_Normal*Weights.z; new newvertex += bones[int(BoneIndex.w)]*gl_Vertex*Weights.w; new newNormal+= mat3(bones[int(BoneIndex.w)])*gl_Normal*Weights.w; gl_Position = Projection*View*Transform*newvertex ; newNormal = mat4(Transform)*newNormal ; }

Currently i have this code as my vertex shader:

Code :#version 400 core in vec3 position; in vec2 textureCoords; in vec3 normal; out vec2 pass_textureCoords; out vec3 surfaceNormal; out vec3 toLightVector; out vec3 toCameraVector; uniform mat4 transformationMatrix; uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform vec3 lightPosition; uniform int boneCount; uniform mat4 bonesMatrix[21]; uniform float boneWeights[2013]; void main(void){ float bonepos_x = transformationMatrix[3][0]; float bonepos_y = transformationMatrix[3][1]; float bonepos_z = transformationMatrix[3][2]; vec4 worldPosition = (transformationMatrix* vec4(position,1.0)); gl_Position = projectionMatrix * viewMatrix * worldPosition; pass_textureCoords = textureCoords; surfaceNormal = (transformationMatrix * vec4(normal,0.0)).xyz; toLightVector = lightPosition - worldPosition.xyz; toCameraVector = (inverse(viewMatrix) * vec4(0.0,0.0,0.0,1.0)).xyz - worldPosition.xyz; }

as you can see i have an array of boneWeights, but i think it needs to be in vec4 to work? but i dont know.

If you can help me out in any way go ahead! Thanks .