📄 camera.cc
字号:
//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "platform/platform.h"
#include "dgl/dgl.h"
#include "game/game.h"
#include "math/mMath.h"
#include "console/simBase.h"
#include "console/console.h"
#include "console/consoleTypes.h"
#include "core/bitStream.h"
#include "core/dnet.h"
#include "game/camera.h"
#include "game/gameConnection.h"
#include "math/mathIO.h"
#include "editor/editor.h"
#define MaxPitch 1.3962
#define CameraRadius 0.05;
//----------------------------------------------------------------------------
IMPLEMENT_CO_DATABLOCK_V1(CameraData);
void CameraData::initPersistFields()
{
Parent::initPersistFields();
}
void CameraData::packData(BitStream* stream)
{
Parent::packData(stream);
}
void CameraData::unpackData(BitStream* stream)
{
Parent::unpackData(stream);
}
//----------------------------------------------------------------------------
IMPLEMENT_CO_NETOBJECT_V1(Camera);
F32 Camera::mMovementSpeed = 40;
Camera::Camera()
{
mNetFlags.clear(Ghostable);
mTypeMask |= CameraObjectType;
delta.pos = Point3F(0,0,100);
delta.rot = Point3F(0,0,0);
delta.posVec = delta.rotVec = VectorF(0,0,0);
mObjToWorld.setColumn(3,delta.pos);
mRot = delta.rot;
mMinOrbitDist = 0;
mMaxOrbitDist = 0;
mCurOrbitDist = 0;
mOrbitObject = NULL;
mPosition.set(0.f, 0.f, 0.f);
mObservingClientObject = false;
mode = 2;
}
Camera::~Camera()
{
}
//----------------------------------------------------------------------------
bool Camera::onAdd()
{
if(!Parent::onAdd())
return false;
mObjBox.max = mObjScale;
mObjBox.min = mObjScale;
mObjBox.min.neg();
resetWorldBox();
if(isClientObject())
gClientContainer.addObject(this);
else
gServerContainer.addObject(this);
// addToScene();
return true;
}
void Camera::onEditorEnable()
{
mNetFlags.set(Ghostable);
}
void Camera::onEditorDisable()
{
mNetFlags.clear(Ghostable);
}
void Camera::onRemove()
{
// removeFromScene();
if (getContainer())
getContainer()->removeObject(this);
Parent::onRemove();
}
//----------------------------------------------------------------------------
// check if the object needs to be observed through its own camera...
void Camera::getCameraTransform(F32* pos, MatrixF* mat)
{
// The camera doesn't support a third person mode,
// so we want to override the default ShapeBase behavior.
ShapeBase * obj = dynamic_cast<ShapeBase*>(static_cast<SimObject*>(mOrbitObject));
if(obj && static_cast<ShapeBaseData*>(obj->getDataBlock())->observeThroughObject)
obj->getCameraTransform(pos, mat);
else
#ifdef TGE_RPG /// TGE_Move
// Parent::getCameraTransform(pos, mat);
//#else
getEyeTransform(mat);
#endif
}
F32 Camera::getCameraFov()
{
ShapeBase * obj = dynamic_cast<ShapeBase*>(static_cast<SimObject*>(mOrbitObject));
if(obj && static_cast<ShapeBaseData*>(obj->getDataBlock())->observeThroughObject)
return(obj->getCameraFov());
else
return(Parent::getCameraFov());
}
F32 Camera::getDefaultCameraFov()
{
ShapeBase * obj = dynamic_cast<ShapeBase*>(static_cast<SimObject*>(mOrbitObject));
if(obj && static_cast<ShapeBaseData*>(obj->getDataBlock())->observeThroughObject)
return(obj->getDefaultCameraFov());
else
return(Parent::getDefaultCameraFov());
}
bool Camera::isValidCameraFov(F32 fov)
{
ShapeBase * obj = dynamic_cast<ShapeBase*>(static_cast<SimObject*>(mOrbitObject));
if(obj && static_cast<ShapeBaseData*>(obj->getDataBlock())->observeThroughObject)
return(obj->isValidCameraFov(fov));
else
return(Parent::isValidCameraFov(fov));
}
void Camera::setCameraFov(F32 fov)
{
ShapeBase * obj = dynamic_cast<ShapeBase*>(static_cast<SimObject*>(mOrbitObject));
if(obj && static_cast<ShapeBaseData*>(obj->getDataBlock())->observeThroughObject)
obj->setCameraFov(fov);
else
Parent::setCameraFov(fov);
}
//----------------------------------------------------------------------------
void Camera::processTick(const Move* move)
{
Parent::processTick(move);
Point3F vec,pos;
if (move)
{
// If using editor then force camera into fly mode
if(gEditingMission && mode != FlyMode)
setFlyMode();
// Update orientation
delta.rotVec = mRot;
mObjToWorld.getColumn(3,&delta.posVec);
mRot.x += move->pitch;
if(mRot.x > MaxPitch)
mRot.x = MaxPitch;
else if(mRot.x < -MaxPitch)
mRot.x = -MaxPitch;
mRot.z += move->yaw;
if(mode == OrbitObjectMode || mode == OrbitPointMode)
{
if(mode == OrbitObjectMode && bool(mOrbitObject))
{
// If this is a shapebase, use its render eye transform
// to avoid jittering.
GameBase *castObj = mOrbitObject;
ShapeBase* shape = dynamic_cast<ShapeBase*>(castObj);
if( shape != NULL )
{
MatrixF ret;
shape->getRenderEyeTransform( &ret );
mPosition = ret.getPosition();
}
else
{
// Hopefully this is a static object that doesn't move,
// because the worldbox doesn't get updated between ticks.
mOrbitObject->getWorldBox().getCenter(&mPosition);
}
}
setPosition(mPosition, mRot);
validateEyePoint(1.0f, &mObjToWorld);
pos = mPosition;
}
else
{
// Update pos
bool faster = move->trigger[0] || move->trigger[1];
F32 scale = mMovementSpeed * (faster + 1);
mObjToWorld.getColumn(3,&pos);
mObjToWorld.getColumn(0,&vec);
pos += vec * move->x * TickSec * scale;
mObjToWorld.getColumn(1,&vec);
pos += vec * move->y * TickSec * scale;
mObjToWorld.getColumn(2,&vec);
pos += vec * move->z * TickSec * scale;
setPosition(pos,mRot);
}
// If on the client, calc delta for backstepping
if (isClientObject())
{
delta.pos = pos;
delta.rot = mRot;
delta.posVec = delta.posVec - delta.pos;
delta.rotVec = delta.rotVec - delta.rot;
}
setMaskBits(MoveMask);
}
if(getControllingClient() && mContainer)
updateContainer();
}
void Camera::onDeleteNotify(SimObject *obj)
{
Parent::onDeleteNotify(obj);
if (obj == (SimObject*)mOrbitObject)
{
mOrbitObject = NULL;
if(mode == OrbitObjectMode)
mode = OrbitPointMode;
}
}
void Camera::interpolateTick(F32 dt)
{
Parent::interpolateTick(dt);
Point3F rot = delta.rot + delta.rotVec * dt;
if(mode == OrbitObjectMode || mode == OrbitPointMode)
{
if(mode == OrbitObjectMode && bool(mOrbitObject))
{
// If this is a shapebase, use its render eye transform
// to avoid jittering.
GameBase *castObj = mOrbitObject;
ShapeBase* shape = dynamic_cast<ShapeBase*>(castObj);
if( shape != NULL )
{
MatrixF ret;
shape->getRenderEyeTransform( &ret );
mPosition = ret.getPosition();
}
else
{
// Hopefully this is a static object that doesn't move,
// because the worldbox doesn't get updated between ticks.
mOrbitObject->getWorldBox().getCenter(&mPosition);
}
}
setRenderPosition(mPosition, rot);
validateEyePoint(1.0f, &mRenderObjToWorld);
}
else
{
Point3F pos = delta.pos + delta.posVec * dt;
setRenderPosition(pos,rot);
}
}
void Camera::setPosition(const Point3F& pos,const Point3F& rot)
{
MatrixF xRot, zRot;
xRot.set(EulerF(rot.x, 0, 0));
zRot.set(EulerF(0, 0, rot.z));
MatrixF temp;
temp.mul(zRot, xRot);
temp.setColumn(3, pos);
Parent::setTransform(temp);
mRot = rot;
}
void Camera::setRenderPosition(const Point3F& pos,const Point3F& rot)
{
MatrixF xRot, zRot;
xRot.set(EulerF(rot.x, 0, 0));
zRot.set(EulerF(0, 0, rot.z));
MatrixF temp;
temp.mul(zRot, xRot);
temp.setColumn(3, pos);
Parent::setRenderTransform(temp);
mRot = rot;
}
//----------------------------------------------------------------------------
void Camera::writePacketData(GameConnection *connection, BitStream *bstream)
{
// Update client regardless of status flags.
Parent::writePacketData(connection, bstream);
Point3F pos;
mObjToWorld.getColumn(3,&pos);
bstream->setCompressionPoint(pos);
mathWrite(*bstream, pos);
bstream->write(mRot.x);
bstream->write(mRot.z);
U32 writeMode = mode;
Point3F writePos = mPosition;
S32 gIndex = -1;
if(mode == OrbitObjectMode)
{
gIndex = bool(mOrbitObject) ? connection->getGhostIndex(mOrbitObject): -1;
if(gIndex == -1)
{
writeMode = OrbitPointMode;
mOrbitObject->getWorldBox().getCenter(&writePos);
}
}
bstream->writeRangedU32(writeMode, CameraFirstMode, CameraLastMode);
if (writeMode == OrbitObjectMode || writeMode == OrbitPointMode)
{
bstream->write(mMinOrbitDist);
bstream->write(mMaxOrbitDist);
bstream->write(mCurOrbitDist);
if(writeMode == OrbitObjectMode)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -