Float4X4 MatrixRotationX(float r) { float sinR = SDL_sinf(r); float cosR = SDL_cosf(r); Float4X4 m; SDL_zero(m); m._11 = 1.0f; m._22 = cosR; m._23 = sinR; m._32 = -sinR; m._33 = cosR; m._44 = 1.0f; return m; }
/* * Simulates desktop's glRotatef. The matrix is returned in column-major * order. */ static void rotate_matrix(float angle, float x, float y, float z, float *r) { float radians, c, s, c1, u[3], length; int i, j; radians = (float)(angle * M_PI) / 180.0f; c = SDL_cosf(radians); s = SDL_sinf(radians); c1 = 1.0f - SDL_cosf(radians); length = (float)SDL_sqrt(x * x + y * y + z * z); u[0] = x / length; u[1] = y / length; u[2] = z / length; for (i = 0; i < 16; i++) { r[i] = 0.0; } r[15] = 1.0; for (i = 0; i < 3; i++) { r[i * 4 + (i + 1) % 3] = u[(i + 2) % 3] * s; r[i * 4 + (i + 2) % 3] = -u[(i + 1) % 3] * s; } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { r[i * 4 + j] += c1 * u[i] * u[j] + (i == j ? c : 0.0f); } } }
void Player_Update(Player *player, Terrain *terrain) { check_input(player); player->entity.rotY += player->turnSpeed * Time_GetFrameTime(); player->entity.position.x += SDL_sinf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime(); player->entity.position.z += SDL_cosf(toRadians(player->entity.rotY)) * player->speed * Time_GetFrameTime(); /* player->verticalSpeed += GRAVITY * Time_GetFrameTime(); player->entity.position.y += player->verticalSpeed * Time_GetFrameTime(); */ GLfloat terrainHeight = Terrain_GetHeightOfTerrain(terrain, player->entity.position.x, player->entity.position.z); if(player->entity.position.y - 1.0f < terrainHeight) { //player->entity.position.y = terrainHeight + 1.0f; //player->verticalSpeed = 0.0f; } }