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); }
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; }
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; }
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); } }
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); } }