first commit

This commit is contained in:
2026-06-22 11:49:35 +02:00
commit d805f2ba86
619 changed files with 126873 additions and 0 deletions

View File

@ -0,0 +1,152 @@
/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#ifndef __NCAMERA__
#define __NCAMERA__
#include "core/item.h"
#include "geometry/frustum.h"
#include "geometry/rect.h"
namespace GS {
namespace Core {
class Light;
/*!
@short Camera.
- World space:
Described by the world_matrix,
transform from object space to world space.<br>
- Camera space:
Described by the camera_matrix,
transform from world space to camera space.<br>
- Projection matrix:
Transform from a given space (usually camera space)
to a 2D orthonormal space.<br>
- View matrix:
Transform from the 2D orthonormal space
to the view (screen) space.<br>
This class is not managed, the user is responsible for freeing it.
For a managed implementation please see S3D::Scene::nMCamera.
@author Emmanuel Julien (ejulien@gsworks.fr)
*/
class Camera : public Item
{
public:
/*!
@name Aspect ratio system.
@note On a 16/9 display using a PC resolution the display is stretched
horizontally to fill the whole display area, in such case calling
using ASPECTRATIO_16_9 as the aspect ratio correction will shrink
the render to compensate for the distortion.
@{
*/
/// Compute the aspect ration based on the output dimensions.
#define AR_Auto (-1.f)
#define AR_Square (1.f)
#define AR_Television (1.33f)
#define AR_Pc AR_Television
#define AR_35mm (1.37f)
#define AR_Widescreen (1.78f)
#define AR_EuropeanTheatricalStandard (1.66f)
#define AR_AmericanTheatricalStandard (1.85f)
#define AR_AnamorphicWidescreen (2.35f)
float aspect_ratio; ///< Aspect ratio horizontal correction.
bool aspect_ratio_ref_yaxis; ///< Reference (fixed) axis for aspect ratio correction.
/// Compute the current aspect ratio correction coefficients.
Vector4 ComputeAspectRatioCorrection(const fRect &viewport, float global_ar = 1.f) const;
/// @}
/// Setup render object.
virtual void RenderSetup(ResourceFactories * = 0) {}
/// Convert from world coordinate to normalized screen coordinate.
bool WorldToScreen(const fRect &viewport, const Vector4 &in, Vector4 &out, bool normalize = true);
/// Convert from normalized screen coordinate to world.
Vector4 ScreenToWorld(const fRect &viewport, float x, float y, float z = 1, float ar = -1);
/// Compute camera projection matrix.
void ComputeProjectionMatrix(const fRect &viewport, Matrix4 &m) const;
/// Compute camera view frustum.
void ComputeFrustum(Frustum &, const fRect &viewport, float z_near = -1, float z_far = -1) const;
/// Adjust this camera so that its viewport matches the viewport of a given light.
void AlignTo(const Light &);
/// Compute world hierarchy matrix.
virtual void ComputeMatrix();
/// Get near clipping plane.
float GetNearClippingPlane() const { return z_near; }
/// Get far clipping plane.
float GetFarClippingPlane() const { return z_far; }
/// Set near clipping plane.
void SetNearClippingPlane(float z) { z_near = z; }
/// Set far clipping plane.
void SetFarClippingPlane(float z) { z_far = z; }
/// Set the camera zoom factor, relative to z = 1 meter.
void SetZoomFactor(float zf = Units::Mtr(1.9f));
/*!
@short Set the camera field of view.
@note FOV must be in the [Deg(0),Deg(180)[ range.
@see GetFov().
*/
void SetFov(float fov = Units::Deg(60));
/*!
@short Get camera fov.
@note This value is converted on the fly from the current zoom factor.
If you need it frequently and as this class only store fov as the
zoom factor you may want to cache the fov value in your application
to avoid possible numerical drift.
*/
float GetFov() const;
/// Set viewport (all values in range [0,1]).
void SetViewport(float origin_x, float origin_y, float width, float height);
Frustum frustum; ///< View frustum.
float z_near; ///< Z near clipping plane.
float z_far; ///< Z far clipping plane.
bool is_orthographic; ///< Is the camera using an orthographic projection.
float ortho_w; ///< Orthographic view width.
float ortho_h; ///< Orthographic view height.
float zoom_factor;
Matrix4 custom_projection;
bool is_occulus_camera;
float tan_up, tan_down, tan_left, tan_right;
/*!
@name Serialization.
@{
*/
bool FromMetaTag(NML::Tag &);
NML::Tag *AsMetaTag();
/// @}
Camera();
};
} // Core
} // GS
#endif //__NCAMERA__