00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "std3d.h"
00027
00028 #include "3d/camera.h"
00029
00030
00031 namespace NL3D
00032 {
00033
00034
00035
00036 void CCamera::registerBasic()
00037 {
00038 CMOT::registerModel(CameraId, TransformId, CCamera::creator);
00039 }
00040
00041
00042
00043 CCamera::CCamera()
00044 {
00045 setFrustum(1.0f, 1.0f, 0.01f, 1.0f);
00046
00047
00048 IAnimatable::resize(AnimValueLast);
00049
00050 _FovAnimationEnabled= false;
00051 _TargetAnimationEnabled= false;
00052 _FovAnimationAspectRatio= 4.0f/3.0f;
00053
00054
00055 _Fov.Value= (float)NLMISC::Pi/2;
00056 _Target.Value= CVector::Null;
00057 _Roll.Value= 0;
00058 }
00059
00060 void CCamera::setFrustum(float left, float right, float bottom, float top, float znear, float zfar, bool perspective)
00061 {
00062 _Frustum.init( left, right,bottom, top, znear, zfar, perspective);
00063 }
00064
00065 void CCamera::setFrustum(float width, float height, float znear, float zfar, bool perspective)
00066 {
00067 _Frustum.init(width, height, znear, zfar, perspective);
00068 }
00069
00070 void CCamera::setPerspective(float fov, float aspectRatio, float znear, float zfar)
00071 {
00072 _Frustum.initPerspective(fov, aspectRatio, znear, zfar);
00073 }
00074
00075 void CCamera::getFrustum(float &left, float &right, float &bottom, float &top, float &znear, float &zfar) const
00076 {
00077 left= _Frustum.Left;
00078 right= _Frustum.Right;
00079 bottom= _Frustum.Bottom;
00080 top= _Frustum.Top;
00081 znear= _Frustum.Near;
00082 zfar= _Frustum.Far;
00083 }
00084
00085 bool CCamera::isOrtho() const
00086 {
00087 return !_Frustum.Perspective;
00088 }
00089
00090 bool CCamera::isPerspective() const
00091 {
00092 return _Frustum.Perspective;
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 IAnimatedValue* CCamera::getValue (uint valueId)
00106 {
00107
00108 switch (valueId)
00109 {
00110 case FovValue: return &_Fov;
00111 case TargetValue: return &_Target;
00112 case RollValue: return &_Roll;
00113 }
00114
00115 return CTransform::getValue(valueId);
00116 }
00117
00118 const char *CCamera::getValueName (uint valueId) const
00119 {
00120
00121 switch (valueId)
00122 {
00123 case FovValue: return getFovValueName();
00124 case TargetValue: return getTargetValueName();
00125 case RollValue: return getRollValueName();
00126 }
00127
00128 return CTransform::getValueName(valueId);
00129 }
00130
00131
00132 CTrackDefaultFloat CCamera::DefaultFov( (float)NLMISC::Pi/2 );
00133 CTrackDefaultVector CCamera::DefaultTarget( CVector::Null );
00134 CTrackDefaultFloat CCamera::DefaultRoll( 0 );
00135
00136
00137 ITrack* CCamera::getDefaultTrack (uint valueId)
00138 {
00139
00140 switch (valueId)
00141 {
00142 case FovValue: return &DefaultFov;
00143 case TargetValue: return &DefaultTarget;
00144 case RollValue: return &DefaultRoll;
00145 }
00146
00147 return CTransform::getDefaultTrack(valueId);
00148 }
00149
00150 void CCamera::registerToChannelMixer(CChannelMixer *chanMixer, const std::string &prefix)
00151 {
00152
00153 addValue(chanMixer, FovValue, OwnerBit, prefix, false);
00154 addValue(chanMixer, TargetValue, OwnerBit, prefix, false);
00155 addValue(chanMixer, RollValue, OwnerBit, prefix, false);
00156
00157 CTransform::registerToChannelMixer(chanMixer, prefix);
00158 }
00159
00160
00161
00162
00163 void CCamera::update()
00164 {
00165 CTransform::update();
00166
00167
00168 if(IAnimatable::isTouched(OwnerBit))
00169 {
00170
00171 if( _FovAnimationEnabled && IAnimatable::isTouched(FovValue))
00172 {
00173
00174 setPerspective(_Fov.Value, _FovAnimationAspectRatio, _Frustum.Near, _Frustum.Far);
00175 }
00176
00177
00178
00179 if( _TargetAnimationEnabled && (IAnimatable::isTouched(TargetValue) || IAnimatable::isTouched(RollValue)) )
00180 {
00181 CQuat q0, q1;
00182
00183
00184 CMatrix mat;
00185 mat.setRot(CVector::I, _Target.Value, CVector::K);
00186 mat.normalize(CMatrix::YZX);
00187 q0= mat.getRot();
00188
00189
00190 q1.setAngleAxis(CVector::J, _Roll.Value);
00191
00192
00193
00194 setRotQuat(q0*q1);
00195 }
00196
00197
00198 IAnimatable::clearFlag(FovValue);
00199 IAnimatable::clearFlag(TargetValue);
00200 IAnimatable::clearFlag(RollValue);
00201
00202
00203 IAnimatable::clearFlag(OwnerBit);
00204 }
00205 }
00206
00207
00208 }
00209