reman3/Rayman_X/cpa/tempgrp/gli/Camera.c

283 lines
9.2 KiB
C
Raw Blame History

/*
=======================================================================================
Name : Camera.c
Description : Camera function
=======================================================================================
*/
/*
Tested with LINT
*/
#include "gli_st.h"
#include "GLI_Defn.h"
#include "light_st.h"
#ifndef U64
#include "PvObj_st.h"
#include "Liste.h"
#include "vpt3D.h"
#endif
#include "camera.h"
#include "Init_Gli.h"
#ifdef __cplusplus
extern "C"
{
#endif
#include "camera.cxx"
/*
=======================================================================================
a special camera to correct some bug (anti bug)
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : Create a camera
----------------------------------------------------------------------------------------
*/
/*
----------------------------------------------------------------------------------------
Description : Copy a camera
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 07/06/99 */
void GLI_vCopyCamera ( GLI_tdstCamera *p_stCamDest ,GLI_tdstCamera *p_stCamSource )
{
*p_stCamDest = *p_stCamSource ;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 07/06/99 */
/*
----------------------------------------------------------------------------------------
Description : Duplicate a camera
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
GLI_tdstCamera *GLI_xDuplicateCamera ( GLI_tdstCamera *p_stCamSource )
{
GLI_tdstCamera *xReturnValue;
GLI_xCreateCamera ( &xReturnValue, p_stCamSource->lCameraMode);
GLI_vCopyCamera ( xReturnValue,p_stCamSource );
return (xReturnValue);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*
----------------------------------------------------------------------------------------
Description : Access function to camera mode
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void GLI_xGetCameraMode ( GLI_tdstCamera *p_stCam , long *p_lMode)
{
*p_lMode = p_stCam -> lCameraMode;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void GLI_xSetCameraMode ( GLI_tdstCamera *p_stCam , long lMode)
{
p_stCam -> lCameraMode = lMode;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*
----------------------------------------------------------------------------------------
Description : return the lenght in pixels of 1.0 unity in the 3D worl at a Z distance
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
MTH_tdxReal GLI_xGetCameraFocalizationPlane( GLI_tdstCamera *p_stCam )
{
return ( p_stCam->xScreen );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*
----------------------------------------------------------------------------------------
Description : Access function to camera near & far plane
----------------------------------------------------------------------------------------
*/
void GLI_xSetCameraNearFar( GLI_tdstCamera *p_stCam, GLI_tdxValue xNear , GLI_tdxValue xFar )
{
p_stCam->xNear = GLI_C_xZClippingNear; /*xNear;*/
if ( xFar == GLI_M_FloatToValue( 0.0 ) )
p_stCam -> xFar = GLI_M_FloatToValue( 100000.0 );
else
p_stCam -> xFar = xFar;
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void GLI_xGetCameraNearFar ( GLI_tdstCamera *p_stCam , GLI_tdxValue *p_xNear , GLI_tdxValue *p_xFar )
{
*p_xNear = p_stCam -> xNear;
*p_xFar = p_stCam -> xFar;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*
----------------------------------------------------------------------------------------
Description : Access function to camera position matrix
----------------------------------------------------------------------------------------
*/
void GLI_xGetCameraMatrix ( GLI_tdstCamera *p_stCam, POS_tdstCompletePosition *p_stMatrix )
{
*p_stMatrix = p_stCam -> stMatrix ;
}
void GLI_xSetCameraMatrix( GLI_tdstCamera *p_stCam , POS_tdstCompletePosition *p_stMatrix )
{
p_stCam -> stMatrix = *p_stMatrix ;
}
/*
----------------------------------------------------------------------------------------
Description : Access function to camera aspect and ratio
----------------------------------------------------------------------------------------
*/
void GLI_xSetCameraAspectAndRatio ( GLI_tdstCamera *p_stCam, MTH_tdxReal xAlphaX, GLI_tdxValue xRatio )
{
p_stCam->xAlphaX = xAlphaX ;
p_stCam->xRatio = xRatio ;
p_stCam->xAlphaY = GLI_M_Mul ( xAlphaX , xRatio ) ;
}
void GLI_xGetCameraAspectAndRatio ( GLI_tdstCamera *p_stCam, MTH_tdxReal *p_xAlphaX , GLI_tdxValue *p_xRatio )
{
*p_xAlphaX = p_stCam -> xAlphaX ;
*p_xRatio = p_stCam->xRatio;
}
void GLI_xSetCameraRatio ( GLI_tdstCamera *p_stCam , GLI_tdxValue xRatio )
{
p_stCam->xRatio = xRatio ;
p_stCam->xAlphaY = GLI_M_Mul ( p_stCam->xAlphaX , xRatio ) ;
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void GLI_xGetCameraRatio ( GLI_tdstCamera *p_stCam , GLI_tdxValue *p_xRatio )
{
*p_xRatio = p_stCam->xRatio ;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*
----------------------------------------------------------------------------------------
Description : Access function to viewport camera
----------------------------------------------------------------------------------------
*/
#ifdef U64
extern char g_bWeirdWaterEffect;
extern char g_bWeirdFireEffect;
extern int bChangedFarClippingSettings;
#endif
void GLI_xSetViewportCamera ( GLD_tdhDevice hDevice, GLD_tdhViewport hViewport, GLI_tdstCamera *p_stCam )
{
GLD_tdstViewportAttributes stViewAttrib;
GLI_tdstSpecificAttributesFor3D *p_stSpecAttrib3D;
if ( !GLD_bGetViewportAttributes( hDevice, hViewport, &stViewAttrib ) )
return;
p_stSpecAttrib3D = (GLI_tdstSpecificAttributesFor3D *)stViewAttrib.p_vSpecificToXD;
#ifdef U64
/* if ((g_bWeirdWaterEffect || g_bWeirdFireEffect) || ( p_stCam != p_stSpecAttrib3D->p_stCam ) || (bChangedFarClippingSettings)) */
#else
if ( p_stCam != p_stSpecAttrib3D->p_stCam )
#endif
{
p_stSpecAttrib3D->p_stCam = p_stCam;
GLI_xAdjustCameraToViewport ( hDevice, hViewport, p_stCam );
}
}
void GLI_xGetViewportCamera ( GLD_tdhDevice hDevice, GLD_tdhViewport hViewport, GLI_tdstCamera **p_stCam )
{
GLD_tdstViewportAttributes stViewAttrib;
GLI_tdstSpecificAttributesFor3D *p_stSpecAttrib3D;
if ( !GLD_bGetViewportAttributes( hDevice, hViewport, &stViewAttrib ) )
return ;
p_stSpecAttrib3D = (GLI_tdstSpecificAttributesFor3D *)stViewAttrib.p_vSpecificToXD;
(*p_stCam) = p_stSpecAttrib3D->p_stCam ;
}
/*
----------------------------------------------------------------------------------------
Description : Change le z dans le rep<65>re de la cam<61>ra d'un vertex dont les coordon<6F>es
sont dans le rep<65>re du monde, Tout en conservant les coordonn<6E>es x et y
<20> l'<27>cran.
Author : Yann Le Tensorer
Date : 07/01/97
----------------------------------------------------------------------------------------
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void fn_vSetZCamera(GLD_tdhDevice hDev, GLD_tdhViewport hVp, MTH3D_tdstVector *p_stSrcVertex, MTH3D_tdstVector *p_stDstVertex, MTH_tdxReal z)
{
GLI_tdstSpecificAttributesFor3D *p_stSpecAttrib3D;
GLD_tdstViewportAttributes stViewAttrib;
POS_tdstCompletePosition stMatrix, stInvMatrix ;
GLI_tdstCamera *p_stCam;
MTH3D_tdstVector stTmpVertex;
MTH_tdxReal z1;
if ( !GLD_bGetViewportAttributes( hDev, hVp, &stViewAttrib ) )
return;
p_stSpecAttrib3D = (GLI_tdstSpecificAttributesFor3D *)stViewAttrib.p_vSpecificToXD;
p_stCam = p_stSpecAttrib3D->p_stCam;
/* passe dans le rep<65>re de la camera*/
GLI_xGetCameraMatrix ( p_stCam , &stMatrix );
POS_fn_vMulMatrixVertex ( &stTmpVertex , &stMatrix , p_stSrcVertex );
/* z1 est le z du point initial dans le repere de la camera*/
z1=stTmpVertex.xZ;
/* z est le nouveau z dans le repere de la camera*/
stTmpVertex.xZ=z;
/* ajuste les coordonn<6E>es x et y pour que le point ait la m<>me projection <20> l'<27>cran*/
stTmpVertex.xX=z*stTmpVertex.xX/z1;
stTmpVertex.xY=z*stTmpVertex.xY/z1;
/* Repasse dans le rep<65>re du monde*/
POS_fn_vInvertMatrix ( &stInvMatrix , &stMatrix );
POS_fn_vMulMatrixVertex ( p_stDstVertex , &stInvMatrix , &stTmpVertex );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
#ifdef __cplusplus
} /* extern "C" */
#endif