Beispiel #1
0
void calculateCullingFrustum(mat4 camMatrix) {
    float cLeft = -0.05f;
    float cRight = 0.05f;
    float cBottom = -0.05f;
    float cTop = 0.05f;
    float cNear = 0.2f;
    //float cFar = 50.f;

    vec3 topLeft = {cLeft, cTop, -cNear};
    vec3 bottomLeft = {cLeft, cBottom, -cNear};
    vec3 topRight = {cRight, cTop, -cNear};
    vec3 bottomRight = {cRight, cBottom, -cNear};
    vec3 farNormal = {0.f, 0.f, -1.f};
    
    mat4 invCam = InvertMat4(camMatrix);

    topLeft = MultVec3(invCam, topLeft);
    bottomLeft = MultVec3(invCam, topLeft);
    topRight = MultVec3(invCam, topLeft);
    bottomRight = MultVec3(invCam, topLeft);
    farNormal = MultVec3(invCam, farNormal);
    
    
    cullingFrustumNormals[0] = Normalize(CrossProduct(topLeft, bottomLeft)); // Left normal
    cullingFrustumNormals[1] = Normalize(CrossProduct(bottomRight, topRight)); // Right normal
    cullingFrustumNormals[2] = Normalize(CrossProduct(bottomLeft, bottomRight)); // Bottom normal
    cullingFrustumNormals[3] = Normalize(CrossProduct(topRight, topLeft)); // Top normal
    cullingFrustumNormals[4] = Normalize(farNormal); // Far normal
    
}
Beispiel #2
0
void calc_bone_transform(joint_s * j, int acc)
{
  joint_s * jc;
  joint_s * rootj = j;
  mat4 tmp, tmptrans, invtrans;
  //tmp = IdentityMatrix();
  if(acc)
    tmp = j->parent->tmp;
    //tmp = j->parent->Mtot;
  else
    //tmp = IdentityMatrix();
    tmp = Mult(T(cow.pos.x, cow.pos.y, cow.pos.z), Ry(cow.angle));

  GLfloat Ms[8][16];
  int i=0,ii=0, k=0;
  float currpos[8*3] = {0};
  float bonepos[8*3] = {0};

  while(j->child[0] != NULL)
  {
    //calc_bone_transform(j->child[0], 1);
    for(k=1; k < MAX_CHILDREN; k++)
    {
      if(j->child[k] != NULL)
        calc_bone_transform(j->child[k], 1);
    }

    jc = j->child[0];
    vec3 tmp_bonepos;
    tmptrans = j->T;
    tmp = Mult(tmp, tmptrans);
    invtrans = InvertMat4(tmptrans);
    tmp = Mult(tmp, Mult(j->R, invtrans));
    j->tmp = tmp;
    j->isnull = 0;

    //middle of bone
    tmp_bonepos = ScalarMult(
		VectorAdd(j->pos, jc->pos), .5);

    for(ii=0;ii<16;ii++)
      Ms[i][ii] = (tmp).m[ii];

    currpos[i*3] = 10*j->pos.x;
    currpos[i*3+1] = 10*j->pos.y;
    currpos[i*3+2] = 10*j->pos.z;

    bonepos[i*3] = 10*tmp_bonepos.x;
    bonepos[i*3+1] = 10*tmp_bonepos.y;
    bonepos[i*3+2] = 10*tmp_bonepos.z;

    j = j->child[0];
    i++;


  }

  if(rootj->posvar != NULL)
  {
  //printf(rootj->posvar);
  //printf("\n");
  }

  //printf("%f %f %f\n", currpos[0], currpos[1], currpos[2]);
  glUniformMatrix4fv(glGetUniformLocation(g_shader, rootj->Mvar), 8, GL_TRUE, Ms[0]);
  glUniform3fv(glGetUniformLocation(g_shader, rootj->posvar), 8, currpos);
  glUniform3fv(glGetUniformLocation(g_shader, rootj->boneposvar), 8, bonepos);
}
Beispiel #3
0
///////////////////////////////////////////////////////
//		D E F O R M  C Y L I N D E R 
//
// Desc:	deformera cylinder meshen enligt skelettet
void DeformCylinder()
{
  //vec3 v[kMaxBones];

  //float w[kMaxBones];
  int row, corner, bonesnum, bonesnum2;
  //bonesnum = 0;

  // för samtliga vertexar 
  for (row = 0; row < kMaxRow; row++)
  {
    for (corner = 0; corner < kMaxCorners; corner++)
    {
      // ---------=========  UPG 4 ===========---------
      // TODO: skinna meshen mot alla benen.
      //
      // data som du kan använda:
      // g_bonesRes[].rot //Rotation på benen
      // g_bones[].pos //Benens position
      // g_boneWeights //g_boneWeights[kMaxRow][kMaxCorners][kMaxBones]
      // g_vertsOrg //Originalet
      // g_vertsRes //Det som ska skickas

    	//g_vertsRes[row][corner] = g_vertsOrg[row][corner];
    	vec3 sum = SetVector(0.0, 0.0, 0.0);

    	for(bonesnum = 0; bonesnum < kMaxBones; bonesnum++)
    	{
    		//Beräknar T för Org och Res
    		mat4 currOrgT = T(g_bones[bonesnum].pos.x, g_bones[bonesnum].pos.y, g_bones[bonesnum].pos.z);
    		mat4 currResT = T(g_bonesRes[bonesnum].pos.x, g_bonesRes[bonesnum].pos.y, g_bonesRes[bonesnum].pos.z);
    		
    		//Beräknar M för Org och Res, och även inverterad M
    		mat4 currOrgM = Mult(currOrgT, g_bones[bonesnum].rot);
    		mat4 currResM = Mult(currResT, g_bonesRes[bonesnum].rot);
			mat4 currInvM = InvertMat4(currOrgM);

			mat4 sumOrgM = currOrgM;
			mat4 sumResM = currResM;
			mat4 sumInvM = currInvM;

    		for(bonesnum2 = bonesnum - 1; bonesnum2 >= 0; bonesnum2--)
    		{
    			//Beräknar T för Org och Res för ben innan bonesnum
    			mat4 preOrgT = T(g_bones[bonesnum2].pos.x, g_bones[bonesnum2].pos.y, g_bones[bonesnum2].pos.z);
    			mat4 preResT = T(g_bonesRes[bonesnum2].pos.x, g_bonesRes[bonesnum2].pos.y, g_bonesRes[bonesnum2].pos.z);
				
				//Beräknar M för Org och Res, och även inverterad M för ben innan bonesnum
				mat4 preOrgM = Mult(preOrgT, g_bones[bonesnum2].rot);
    			mat4 preResM = Mult(preResT, g_bonesRes[bonesnum2].rot);
    			mat4 preInvM = InvertMat4(preOrgM);

    			//Summerar
    			sumOrgM = Mult(sumOrgM, preOrgM);
    			sumResM = Mult(sumResM, preResM);
    			sumInvM = Mult(preInvM, sumInvM);
    		}
    		vec3 resV = MultVec3(sumOrgM, g_vertsOrg[row][corner]);

    		mat4 temp1 = Mult(sumResM, sumInvM);
    		vec3 temp2 = MultVec3(temp1, resV);
    		temp2 = ScalarMult(temp2, g_boneWeights[row][corner][bonesnum]);

    		sum = VectorAdd(sum, temp2);
    	}
    	g_vertsRes[row][corner] = sum;
    }
  }
}