2011-02-22 12:42:55 +00:00
|
|
|
/*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
2008-04-16 22:40:48 +00:00
|
|
|
* of the License, or (at your option) any later version.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2002-10-12 11:37:38 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
2008-04-16 22:40:48 +00:00
|
|
|
* ***** END GPL LICENSE BLOCK *****
|
2002-10-12 11:37:38 +00:00
|
|
|
*/
|
2011-02-22 12:42:55 +00:00
|
|
|
|
|
|
|
/** \file RAS_FramingManager.h
|
|
|
|
* \ingroup bgerast
|
|
|
|
*/
|
|
|
|
|
2012-02-23 10:41:31 +00:00
|
|
|
#ifndef __RAS_FRAMINGMANAGER_H__
|
|
|
|
#define __RAS_FRAMINGMANAGER_H__
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2009-08-18 15:37:31 +00:00
|
|
|
#ifdef WITH_CXX_GUARDEDALLOC
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
#endif
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
class RAS_Rect;
|
|
|
|
|
|
|
|
/**
|
2012-03-02 16:05:54 +00:00
|
|
|
* \section RAS_FrameSettings
|
2002-10-12 11:37:38 +00:00
|
|
|
* This is a value type describing the framing used
|
|
|
|
* by a particular scene in the game engine.
|
|
|
|
* Each KX_Scene contains a RAS_FrameSetting describing
|
|
|
|
* how the frustum and viewport are to be modified
|
|
|
|
* depending on the canvas size.
|
|
|
|
*
|
|
|
|
* e_frame_scale means that the viewport is set to the current
|
|
|
|
* canvas size. If the view frustum aspect ratio is different
|
|
|
|
* to the canvas aspect this will lead to stretching.
|
|
|
|
*
|
|
|
|
* e_frame_extend means that the best fit viewport will be
|
|
|
|
* computed based upon the design aspect ratio
|
|
|
|
* and the view frustum will be adjusted so that
|
|
|
|
* more of the scene is visible.
|
|
|
|
*
|
|
|
|
* e_frame_bars means that the best fit viewport will be
|
|
|
|
* be computed based upon the design aspect ratio.
|
|
|
|
*/
|
|
|
|
|
|
|
|
class RAS_FrameSettings
|
|
|
|
{
|
|
|
|
public :
|
|
|
|
/**
|
|
|
|
* enum defining the policy to use
|
|
|
|
* in each axis.
|
|
|
|
*/
|
|
|
|
enum RAS_FrameType {
|
|
|
|
e_frame_scale,
|
|
|
|
e_frame_extend,
|
|
|
|
e_frame_bars
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Contructor
|
|
|
|
*/
|
|
|
|
|
|
|
|
RAS_FrameSettings(
|
|
|
|
RAS_FrameType frame_type,
|
|
|
|
float bar_r,
|
|
|
|
float bar_g,
|
|
|
|
float bar_b,
|
|
|
|
unsigned int design_aspect_width,
|
|
|
|
unsigned int design_aspect_height
|
|
|
|
):
|
|
|
|
m_frame_type(frame_type),
|
|
|
|
m_bar_r(bar_r),
|
|
|
|
m_bar_g(bar_g),
|
|
|
|
m_bar_b(bar_b),
|
|
|
|
m_design_aspect_width(design_aspect_width),
|
|
|
|
m_design_aspect_height(design_aspect_height)
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
|
|
|
RAS_FrameSettings(
|
|
|
|
):
|
|
|
|
m_frame_type(e_frame_scale),
|
|
|
|
m_bar_r(0),
|
|
|
|
m_bar_g(0),
|
|
|
|
m_bar_b(0),
|
|
|
|
m_design_aspect_width(1),
|
|
|
|
m_design_aspect_height(1)
|
|
|
|
{
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Accessors
|
|
|
|
*/
|
|
|
|
|
|
|
|
const
|
|
|
|
RAS_FrameType &
|
|
|
|
FrameType(
|
|
|
|
) const {
|
|
|
|
return m_frame_type;
|
|
|
|
};
|
2008-09-14 00:32:18 +00:00
|
|
|
|
|
|
|
void
|
|
|
|
SetFrameType(
|
|
|
|
RAS_FrameType type
|
|
|
|
) {
|
|
|
|
m_frame_type = type;
|
|
|
|
};
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
float
|
|
|
|
BarRed(
|
|
|
|
) const {
|
|
|
|
return m_bar_r;
|
|
|
|
};
|
|
|
|
|
|
|
|
float
|
|
|
|
BarGreen(
|
|
|
|
) const {
|
|
|
|
return m_bar_g;
|
|
|
|
};
|
|
|
|
|
|
|
|
float
|
|
|
|
BarBlue(
|
|
|
|
) const {
|
|
|
|
return m_bar_b;
|
|
|
|
};
|
|
|
|
|
|
|
|
unsigned int
|
|
|
|
DesignAspectWidth(
|
|
|
|
) const {
|
|
|
|
return m_design_aspect_width;
|
|
|
|
};
|
|
|
|
|
|
|
|
unsigned int
|
|
|
|
DesignAspectHeight(
|
|
|
|
) const {
|
|
|
|
return m_design_aspect_height;
|
|
|
|
};
|
|
|
|
|
|
|
|
private :
|
|
|
|
|
|
|
|
RAS_FrameType m_frame_type;
|
|
|
|
float m_bar_r;
|
|
|
|
float m_bar_g;
|
|
|
|
float m_bar_b;
|
|
|
|
unsigned int m_design_aspect_width;
|
|
|
|
unsigned int m_design_aspect_height;
|
2009-08-18 15:37:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
#ifdef WITH_CXX_GUARDEDALLOC
|
|
|
|
public:
|
2010-06-06 01:15:44 +00:00
|
|
|
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FrameSettings"); }
|
2009-08-18 15:37:31 +00:00
|
|
|
void operator delete( void *mem ) { MEM_freeN(mem); }
|
|
|
|
#endif
|
2002-10-12 11:37:38 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct RAS_FrameFrustum
|
|
|
|
{
|
|
|
|
float camnear,camfar;
|
|
|
|
float x1,y1;
|
|
|
|
float x2,y2;
|
2012-04-21 13:37:26 +00:00
|
|
|
};
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2009-04-20 15:06:46 +00:00
|
|
|
/* must match R_CULLING_... from DNA_scene_types.h */
|
|
|
|
enum RAS_CullingMode
|
|
|
|
{
|
|
|
|
RAS_CULLING_DBVT = 0,
|
|
|
|
RAS_CULLING_NORMAL,
|
|
|
|
RAS_CULLING_NONE
|
|
|
|
};
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2011-11-04 14:36:06 +00:00
|
|
|
/* Should match CAMERA_SENSOR_FIT... from DNA_camera_types.h */
|
|
|
|
enum RAS_SensorFit
|
|
|
|
{
|
|
|
|
RAS_SENSORFIT_AUTO = 0,
|
|
|
|
RAS_SENSORFIT_HOR,
|
|
|
|
RAS_SENSORFIT_VERT
|
|
|
|
};
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
/**
|
2012-03-02 16:05:54 +00:00
|
|
|
* \section RAS_FramingManager
|
2002-10-12 11:37:38 +00:00
|
|
|
* This class helps to compute a view frustum
|
|
|
|
* and a viewport rectangle given the
|
|
|
|
* above settings and a description of the
|
|
|
|
* current canvas dimensions.
|
|
|
|
*
|
|
|
|
* You do not have to instantiate this class
|
|
|
|
* directly, it only contains static helper functions
|
|
|
|
*/
|
|
|
|
|
|
|
|
class RAS_FramingManager
|
|
|
|
{
|
|
|
|
public :
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Compute a viewport given
|
|
|
|
* a RAS_FrameSettings and a description of the
|
|
|
|
* canvas.
|
|
|
|
*/
|
|
|
|
|
|
|
|
static
|
|
|
|
void
|
|
|
|
ComputeViewport(
|
|
|
|
const RAS_FrameSettings &settings,
|
|
|
|
const RAS_Rect &availableViewport,
|
|
|
|
RAS_Rect &viewport
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* compute a frustrum given a valid viewport,
|
|
|
|
* RAS_FrameSettings, canvas description
|
|
|
|
* and camera description
|
|
|
|
*/
|
|
|
|
|
2009-06-08 20:08:19 +00:00
|
|
|
static
|
|
|
|
void
|
|
|
|
ComputeOrtho(
|
|
|
|
const RAS_FrameSettings &settings,
|
|
|
|
const RAS_Rect &availableViewport,
|
|
|
|
const RAS_Rect &viewport,
|
|
|
|
const float scale,
|
|
|
|
const float camnear,
|
|
|
|
const float camfar,
|
2011-11-04 14:36:06 +00:00
|
|
|
const short sensor_fit,
|
2009-06-08 20:08:19 +00:00
|
|
|
RAS_FrameFrustum &frustum
|
|
|
|
);
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
static
|
|
|
|
void
|
|
|
|
ComputeFrustum(
|
|
|
|
const RAS_FrameSettings &settings,
|
|
|
|
const RAS_Rect &availableViewport,
|
|
|
|
const RAS_Rect &viewport,
|
|
|
|
const float lens,
|
2011-11-04 14:36:06 +00:00
|
|
|
const float sensor_x, const float sensor_y, const short sensor_fit,
|
2002-10-12 11:37:38 +00:00
|
|
|
const float camnear,
|
|
|
|
const float camfar,
|
|
|
|
RAS_FrameFrustum &frustum
|
|
|
|
);
|
|
|
|
|
|
|
|
static
|
|
|
|
void
|
|
|
|
ComputeDefaultFrustum(
|
|
|
|
const float camnear,
|
|
|
|
const float camfar,
|
|
|
|
const float lens,
|
2011-11-04 14:36:06 +00:00
|
|
|
const float sensor_x, const float sensor_y,
|
|
|
|
const short sensor_fit,
|
2002-10-12 11:37:38 +00:00
|
|
|
const float design_aspect_ratio,
|
|
|
|
RAS_FrameFrustum & frustum
|
|
|
|
);
|
|
|
|
|
2009-06-08 20:08:19 +00:00
|
|
|
static
|
|
|
|
void
|
|
|
|
ComputeDefaultOrtho(
|
|
|
|
const float camnear,
|
|
|
|
const float camfar,
|
|
|
|
const float scale,
|
|
|
|
const float design_aspect_ratio,
|
2011-11-04 14:36:06 +00:00
|
|
|
const short sensor_fit,
|
2009-06-08 20:08:19 +00:00
|
|
|
RAS_FrameFrustum & frustum
|
|
|
|
);
|
|
|
|
|
2008-12-14 17:32:24 +00:00
|
|
|
private :
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
static
|
|
|
|
void
|
|
|
|
ComputeBestFitViewRect(
|
|
|
|
const RAS_Rect &availableViewport,
|
|
|
|
const float design_aspect_ratio,
|
|
|
|
RAS_Rect &viewport
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Private constructor - this class is not meant
|
|
|
|
* for instanciation.
|
|
|
|
*/
|
|
|
|
|
|
|
|
RAS_FramingManager(
|
|
|
|
);
|
|
|
|
|
|
|
|
RAS_FramingManager(
|
|
|
|
const RAS_FramingManager &
|
|
|
|
);
|
2009-08-18 15:37:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
#ifdef WITH_CXX_GUARDEDALLOC
|
|
|
|
public:
|
2010-06-06 01:15:44 +00:00
|
|
|
void *operator new(size_t num_bytes) { return MEM_mallocN(num_bytes, "GE:RAS_FramingManager"); }
|
2009-08-18 15:37:31 +00:00
|
|
|
void operator delete( void *mem ) { MEM_freeN(mem); }
|
|
|
|
#endif
|
2012-04-21 13:37:26 +00:00
|
|
|
};
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
#endif
|
2002-10-30 02:07:20 +00:00
|
|
|
|