aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorraysan5 <raysan5@gmail.com>2016-03-05 13:05:45 +0100
committerraysan5 <raysan5@gmail.com>2016-03-05 13:05:45 +0100
commitd8bd8634ab7d5179cb1481206176af1f8e592e75 (patch)
tree1b22e39d70514808acbef6f7b2dcd2d5a50f3346 /src
parentdcbf2a0e0c904870ac3ac59a3623a3954ab0243f (diff)
downloadraylib-d8bd8634ab7d5179cb1481206176af1f8e592e75.tar.gz
raylib-d8bd8634ab7d5179cb1481206176af1f8e592e75.zip
3d Camera: Added support for field-of-view Y
Diffstat (limited to 'src')
-rw-r--r--src/camera.c8
-rw-r--r--src/camera.h1
-rw-r--r--src/core.c20
-rw-r--r--src/models.c28
-rw-r--r--src/raylib.h9
5 files changed, 32 insertions, 34 deletions
diff --git a/src/camera.c b/src/camera.c
index 517e4a2b..8e5c527e 100644
--- a/src/camera.c
+++ b/src/camera.c
@@ -84,7 +84,7 @@ typedef enum { MOVE_FRONT = 0, MOVE_LEFT, MOVE_BACK, MOVE_RIGHT, MOVE_UP, MOVE_D
//----------------------------------------------------------------------------------
// Global Variables Definition
//----------------------------------------------------------------------------------
-static Camera internalCamera = {{ 2.0f, 0.0f, 2.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }};
+static Camera internalCamera = {{ 2.0f, 0.0f, 2.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, 45.0f };
static Vector2 cameraAngle = { 0.0f, 0.0f };
static float cameraTargetDistance = 5.0f;
static Vector2 cameraMousePosition = { 0.0f, 0.0f };
@@ -212,6 +212,12 @@ void SetCameraTarget(Vector3 target)
cameraTargetDistance = sqrt(dx*dx + dy*dy + dz*dz);
}
+// Set internal camera fovy
+void SetCameraFovy(float fovy)
+{
+ internalCamera.fovy = fovy;
+}
+
// Set camera pan key to combine with mouse movement (free camera)
void SetCameraPanControl(int panKey)
{
diff --git a/src/camera.h b/src/camera.h
index 9ad09c6f..8d8029af 100644
--- a/src/camera.h
+++ b/src/camera.h
@@ -81,6 +81,7 @@ void UpdateCameraPlayer(Camera *camera, Vector3 *position); // Update camera and
void SetCameraPosition(Vector3 position); // Set internal camera position
void SetCameraTarget(Vector3 target); // Set internal camera target
+void SetCameraFovy(float fovy); // Set internal camera field-of-view-y
void SetCameraPanControl(int panKey); // Set camera pan key to combine with mouse movement (free camera)
void SetCameraAltControl(int altKey); // Set camera alt key to combine with mouse movement (free camera)
diff --git a/src/core.c b/src/core.c
index 259e1f29..a8cc593a 100644
--- a/src/core.c
+++ b/src/core.c
@@ -609,10 +609,10 @@ void Begin3dMode(Camera camera)
rlPushMatrix(); // Save previous matrix, which contains the settings for the 2d ortho projection
rlLoadIdentity(); // Reset current matrix (PROJECTION)
-
+
// Setup perspective projection
float aspect = (float)screenWidth/(float)screenHeight;
- double top = 0.01*tan(45.0*PI/360.0);
+ double top = 0.01*tan(camera.fovy*PI/360.0);
double right = top*aspect;
// NOTE: zNear and zFar values are important when computing depth buffer values
@@ -883,7 +883,7 @@ Ray GetMouseRay(Vector2 mousePosition, Camera camera)
TraceLog(DEBUG, "Device coordinates: (%f, %f, %f)", deviceCoords.x, deviceCoords.y, deviceCoords.z);
// Calculate projection matrix (from perspective instead of frustum)
- Matrix matProj = MatrixPerspective(45.0, ((double)GetScreenWidth()/(double)GetScreenHeight()), 0.01, 1000.0);
+ Matrix matProj = MatrixPerspective(camera.fovy, ((double)GetScreenWidth()/(double)GetScreenHeight()), 0.01, 1000.0);
// Calculate view matrix from camera look at
Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up);
@@ -936,7 +936,7 @@ Ray GetMouseRay(Vector2 mousePosition, Camera camera)
Vector2 WorldToScreen(Vector3 position, Camera camera)
{
// Calculate projection matrix (from perspective instead of frustum
- Matrix matProj = MatrixPerspective(45.0f, (float)((float)GetScreenWidth() / (float)GetScreenHeight()), 0.01f, 1000.0f);
+ Matrix matProj = MatrixPerspective(camera.fovy, (double)GetScreenWidth()/(double)GetScreenHeight(), 0.01, 1000.0);
// Calculate view matrix from camera look at (and transpose it)
Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up);
@@ -1752,8 +1752,8 @@ static void MouseButtonCallback(GLFWwindow *window, int button, int action, int
// Normalize gestureEvent.position[0] for screenWidth and screenHeight
gestureEvent.position[0].x /= (float)GetScreenWidth();
gestureEvent.position[0].y /= (float)GetScreenHeight();
-
- // Gesture data is sent to gestures system for processing
+
+ // Gesture data is sent to gestures system for processing
ProcessGestureEvent(gestureEvent);
#endif
}
@@ -1890,7 +1890,7 @@ static void AndroidCommandCallback(struct android_app *app, int32_t cmd)
// TODO: GPU assets reload in case of lost focus (lost context)
// NOTE: This problem has been solved just unbinding and rebinding context from display
- /*
+ /*
if (assetsReloadRequired)
{
for (int i = 0; i < assetsCount; i++)
@@ -2471,9 +2471,9 @@ static void *GamepadThread(void *arg)
const int joystickAxisY = 1;
// Read gamepad event
- struct js_event gamepadEvent;
+ struct js_event gamepadEvent;
- while (1)
+ while (1)
{
if (read(gamepadStream, &gamepadEvent, sizeof(struct js_event)) == (int)sizeof(struct js_event))
{
@@ -2507,7 +2507,7 @@ static void *GamepadThread(void *arg)
*/
}
}
- }
+ }
return NULL;
}
diff --git a/src/models.c b/src/models.c
index fc95f58d..a0b0e656 100644
--- a/src/models.c
+++ b/src/models.c
@@ -558,19 +558,9 @@ Model LoadModel(const char *fileName)
// NOTE: model properties (transform, texture, shader) are initialized inside rlglLoadModel()
model = rlglLoadModel(mesh); // Upload vertex data to GPU
- // Now that vertex data is uploaded to GPU VRAM, we can free arrays from CPU RAM
- // NOTE 1: We don't need CPU vertex data on OpenGL 3.3 or ES2... for static meshes...
- // NOTE 2: ...but we could keep CPU vertex data in case we need to update the mesh
-
- /*
- if (rlGetVersion() != OPENGL_11)
- {
- free(mesh.vertices);
- free(mesh.texcoords);
- free(mesh.normals);
- free(mesh.colors);
- }
- */
+ // NOTE: Now that vertex data is uploaded to GPU VRAM, we can free arrays from CPU RAM
+ // We don't need CPU vertex data on OpenGL 3.3 or ES2... for static meshes...
+ // ...but we could keep CPU vertex data in case we need to update the mesh
}
return model;
@@ -1082,16 +1072,16 @@ void UnloadModel(Model model)
free(model.mesh.vertices);
free(model.mesh.texcoords);
free(model.mesh.normals);
- if (model.mesh.texcoords2 != NULL) free(model.mesh.texcoords2);
- if (model.mesh.tangents != NULL) free(model.mesh.tangents);
- if (model.mesh.colors != NULL) free(model.mesh.colors);
+ free(model.mesh.colors);
+ //if (model.mesh.texcoords2 != NULL) free(model.mesh.texcoords2); // Not used
+ //if (model.mesh.tangents != NULL) free(model.mesh.tangents); // Not used
rlDeleteBuffers(model.mesh.vboId[0]); // vertex
rlDeleteBuffers(model.mesh.vboId[1]); // texcoords
rlDeleteBuffers(model.mesh.vboId[2]); // normals
- rlDeleteBuffers(model.mesh.vboId[3]); // texcoords2
- rlDeleteBuffers(model.mesh.vboId[4]); // tangents
- rlDeleteBuffers(model.mesh.vboId[5]); // colors
+ //rlDeleteBuffers(model.mesh.vboId[3]); // texcoords2 (NOT USED)
+ //rlDeleteBuffers(model.mesh.vboId[4]); // tangents (NOT USED)
+ //rlDeleteBuffers(model.mesh.vboId[5]); // colors (NOT USED)
rlDeleteVertexArrays(model.mesh.vaoId);
diff --git a/src/raylib.h b/src/raylib.h
index 00afb4f3..b6cf98fe 100644
--- a/src/raylib.h
+++ b/src/raylib.h
@@ -309,10 +309,10 @@ typedef struct SpriteFont {
// Camera type, defines a camera position/orientation in 3d space
typedef struct Camera {
- Vector3 position;
- Vector3 target;
- Vector3 up;
- //float fovy; // Field-Of-View apperture in Y (degrees)
+ Vector3 position; // Camera position
+ Vector3 target; // Camera target it looks-at
+ Vector3 up; // Camera up vector (rotation over its axis)
+ float fovy; // Field-Of-View apperture in Y (degrees)
} Camera;
// Bounding box type
@@ -630,6 +630,7 @@ void UpdateCameraPlayer(Camera *camera, Vector3 *position); // Update camera and
void SetCameraPosition(Vector3 position); // Set internal camera position
void SetCameraTarget(Vector3 target); // Set internal camera target
+void SetCameraFovy(float fovy); // Set internal camera field-of-view-y
void SetCameraPanControl(int panKey); // Set camera pan key to combine with mouse movement (free camera)
void SetCameraAltControl(int altKey); // Set camera alt key to combine with mouse movement (free camera)