コード例 #1
0
ファイル: Game.c プロジェクト: Meith/OpenGLFramework
void Game_FixedUpdate(Game *game, float t, const float dt)
{
	if (game->input_handler->keystates[SDL_SCANCODE_UP])
	{
		game->moving_object[0]->rigid_body->current.direction[2] = -1.0f;
		game->moving_object[0]->rigid_body->current.speed = 1.0f;
	}

	if (game->input_handler->keystates[SDL_SCANCODE_DOWN])
	{
		game->moving_object[0]->rigid_body->current.direction[2] = 1.0f;
		game->moving_object[0]->rigid_body->current.speed = 1.0f;
	}

	if (game->input_handler->keystates[SDL_SCANCODE_LEFT])
	{
		game->moving_object[0]->rigid_body->current.direction[0] = -1.0f;
		game->moving_object[0]->rigid_body->current.speed = 1.0f;
	}

	if (game->input_handler->keystates[SDL_SCANCODE_RIGHT])
	{
		game->moving_object[0]->rigid_body->current.direction[0] = 1.0f;
		game->moving_object[0]->rigid_body->current.speed = 1.0f;
	}

	GameObject_FixedUpdate(game->moving_object[0], t, dt);
	vec3_Zero(game->moving_object[0]->rigid_body->current.direction);
}
コード例 #2
0
ファイル: RigidBody.c プロジェクト: Meith/OpenGLFramework
RigidBody *RigidBody_Init(Transform transform)
{
	RigidBody *rigid_body = (RigidBody *)malloc(sizeof(RigidBody));

	rigid_body->current.transform = transform;
	rigid_body->current.size = 0.5f;
	rigid_body->current.mass = 1.0f;
	rigid_body->current.inverse_mass = 1.0f / rigid_body->current.mass;
	vec3_Zero(rigid_body->current.momentum);
	vec3_Zero(rigid_body->current.angular_momentum);
	rigid_body->current.inertia_tensor = rigid_body->current.mass * rigid_body->current.size * rigid_body->current.size * 2.0f / 5.0f;
	rigid_body->current.inverse_inertia_tensor = 1.0f / rigid_body->current.inertia_tensor;
	vec3_Zero(rigid_body->current.direction);
	rigid_body->current.speed = 0.0f;
	State_Recalculate(&rigid_body->current); 
	rigid_body->previous = rigid_body->current;

	return rigid_body;
}
コード例 #3
0
nebu_Mesh_ShadowInfo* nebu_Mesh_Shadow_Create(nebu_Mesh_VB *pVB, nebu_Mesh_IB *pIB)
{
	nebu_Mesh_ShadowInfo *pSI = (nebu_Mesh_ShadowInfo*) malloc(sizeof(nebu_Mesh_ShadowInfo));
	pSI->pFrontfaces = NULL;
	pSI->pBackfaces = NULL;
	pSI->pEdges = NULL;
	pSI->pAdjacency = NULL;
	pSI->pFaceNormals = NULL;
	pSI->pDotsigns = NULL;
	vec3_Zero(&pSI->vLight);
	pSI->pVB = pVB;
	pSI->pVB_Extruded = NULL;
	pSI->pIB = pIB;
	
	return pSI;
}
コード例 #4
0
ファイル: camera.c プロジェクト: BackupTheBerlios/gltron-svn
void nebu_Camera_Rotate(nebu_Camera *pCamera, int flags,
                        float dx, float dy)
{
    // adjust up vector, so that it is orthogonal to
    // view direction
    vec3 vDiff, vView, vRight, vUp;
    vec3 vdx, vdy;
    vec3 *pvCenter, *pvMoving;

    switch(flags & NEBU_CAMERA_ROTATE_MASK)
    {
    case NEBU_CAMERA_ROTATE_AROUND_EYE:
        pvCenter = &pCamera->vEye;
        pvMoving = &pCamera->vLookAt;
        break;
    case NEBU_CAMERA_ROTATE_AROUND_LOOKAT:
        pvCenter = &pCamera->vLookAt;
        pvMoving = &pCamera->vEye;
        break;
    default:
        assert(0);
        return;
    }

    vec3_Sub(&vDiff, pvCenter, pvMoving);
    vec3_Normalize(&vView, &vDiff);
    vec3_Cross(&vRight, &pCamera->vUp, &vView);
    vec3_Normalize(&vRight, &vRight);
    vec3_Cross(&vUp, &vView, &vRight);
    vec3_Normalize(&vUp, &vUp);

    // horizontal movement (dx):
    if(dx == 0) {
        vec3_Zero(&vdx);
    } else {
        // rotate moving around up vector through center point
        vec3 v = vDiff;
        float fAngle = dx * 2 * (float)M_PI / 360.0f;
        matrix matRotation;
        matrixRotationAxis(&matRotation, fAngle, &vUp);
        vec3_Transform(&v, &vDiff, &matRotation);
        vec3_Sub(&vdx, &v, &vDiff);
    }

    // vertical movement (dy):
    if(dy == 0) {
        vec3_Zero(&vdy);
    } else {
        // rotate eye point around up vector through lookAt point
        vec3 v = vDiff;
        float fAngle = dy * 2 * (float)M_PI / 360.0f;
        matrix matRotation;
        matrixRotationAxis(&matRotation, fAngle, &vRight);
        vec3_Transform(&v, &vDiff, &matRotation);
        vec3_Sub(&vdy, &v, &vDiff);

        matrixTranspose(&matRotation, &matRotation);
        if(!(flags & NEBU_CAMERA_FIXED_UP))
            vec3_Transform(&pCamera->vUp, &pCamera->vUp, &matRotation);
    }

    {
        vec3 v;
        vec3_Add(&v, &vdx, &vdy);
        vec3_Add(&v, &v, pvMoving);
        vec3_Sub(&v, &v, pvCenter);
        vec3_Normalize(&v, &v);
        // printf("up dot view: %.4f\n", - vec3_Dot(&v, &pCamera->vUp));
        vec3_Scale(&v, &v, vec3_Length(&vDiff));
        vec3_Add(pvMoving, &v, pvCenter);

    }
}
コード例 #5
0
ファイル: camera.c プロジェクト: BackupTheBerlios/gltron-svn
void nebu_Camera_RotateAroundTarget(nebu_Camera *pCamera,
																		float dx, float dy) {
	// adjust up vector, so that it is orthogonal to
	// view direction
	vec3 vDiff, vView, vRight, vUp;
	vec3 vdx, vdy;
	
	vec3_Sub(&vDiff, &pCamera->vLookAt, &pCamera->vEye);
	vec3_Normalize(&vView, &vDiff);
	vec3_Cross(&vRight, &pCamera->vUp, &vView);
	vec3_Normalize(&vRight, &vRight);
	vec3_Cross(&vUp, &vView, &vRight);
	vec3_Normalize(&vUp, &vUp);
	
	// horizontal movement (dx):
	if(dx == 0) {
		vec3_Zero(&vdx);
	} else {
		// rotate eye point around up vector through lookAt point
		vec3 v = vDiff;
		float fAngle = dx * 2 * M_PI / 360.0;
		matrix matRotation;
		matrixRotationAxis(&matRotation, fAngle, &vUp);
		vec3_Transform(&v, &vDiff, &matRotation);
		vec3_Sub(&vdx, &v, &vDiff);
	}

	// vertical movement (dy):
	if(dy == 0) {
		vec3_Zero(&vdy);
	} else {
		// rotate eye point around up vector through lookAt point
		vec3 v = vDiff;
		float fAngle = dy * 2 * M_PI / 360.0;
		matrix matRotation;
		matrixRotationAxis(&matRotation, fAngle, &vRight);
		vec3_Transform(&v, &vDiff, &matRotation);
		vec3_Sub(&vdy, &v, &vDiff);

		matrixTranspose(&matRotation, &matRotation);
		vec3_Transform(&pCamera->vUp, &pCamera->vUp, &matRotation);
	}

	// add relative movements to camera position
	
	/*
	vec3_Add(&pCamera->vEye, &pCamera->vEye, &vdx);
	vec3_Add(&pCamera->vEye, &pCamera->vEye, &vdy);
	*/
	{
		vec3 v;
		vec3_Add(&v, &vdx, &vdy);
		vec3_Add(&v, &v, &pCamera->vEye);
		vec3_Sub(&v, &v, &pCamera->vLookAt);
		vec3_Normalize(&v, &v);
		// printf("up dot view: %.4f\n", - vec3_Dot(&v, &pCamera->vUp));
		vec3_Scale(&v, &v, vec3_Length(&vDiff));
		vec3_Add(&pCamera->vEye, &v, &pCamera->vLookAt);

	}
}