/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, Inc. 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 3 of the License, or (at your option) any later version. 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, see . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #ifndef plCameraModifier_inc #define plCameraModifier_inc #include "../pnModifier/plSingleModifier.h" #include "hsBitVector.h" #include "hsGeometry3.h" #include "hsTemplates.h" class plPipeline; class plKey; class plCameraBrain1; class plCameraMsg; struct CamTrans { // used when creating default track transitions at runtime CamTrans(plKey to) { fTransTo = to; fAccel = 60.0f; fDecel = 60.0f; fVelocity = 60.0f; fPOADecel = 60.0f; fPOAAccel = 60.0f; fPOAVelocity = 60.0f; fCutPos = false; fCutPOA = false; fIgnore = false; } plKey fTransTo; hsBool fCutPos; hsBool fCutPOA; hsBool fIgnore; hsScalar fAccel; hsScalar fDecel; hsScalar fVelocity; hsScalar fPOAAccel; hsScalar fPOADecel; hsScalar fPOAVelocity; }; class plCameraModifier1 : public plSingleModifier { enum { kRefBrain, kRefCut, kRefTrack, kRefCallbackMsg, }; protected: void Output(); virtual hsBool IEval(double secs, hsScalar del, UInt32 dirty) { return true; } public: plCameraModifier1(); virtual ~plCameraModifier1(); CLASSNAME_REGISTER( plCameraModifier1 ); GETINTERFACE_ANY( plCameraModifier1, plSingleModifier ); virtual hsBool MsgReceive(plMessage* msg); void Initialize(); virtual void Update(); virtual void AddTarget(plSceneObject* so); void SetBrain(plCameraBrain1* brain) { fBrain = brain; } plCameraBrain1* GetBrain() { return fBrain;} hsPoint3 GetTargetPos() { return fFrom; } hsPoint3 GetTargetPOA() { return fAt; } hsPoint3 GetSubworldPos() { return fLastSubPos; } hsPoint3 GetSubworldPOA() { return fLastSubPOA; } void SetTransform(hsPoint3 at); void SetTargetPos(hsPoint3 pos) { fFrom = pos; } void SetTargetPOA(hsPoint3 pos) { fAt = pos; } void SetSubworldPos(hsPoint3 pos) { fLastSubPos = pos; } void SetSubworldPOA(hsPoint3 pos) { fLastSubPOA = pos; } hsScalar GetFOVw() { return fFOVw; } hsScalar GetFOVh() { return fFOVh; } void SetFOVw(hsScalar f, hsBool fUpdateVCam = true); void SetFOVh(hsScalar f, hsBool fUpdateVCam = true); hsBool GetInSubworld() { return fInSubLastUpdate; } void InSubworld(hsBool b) { fInSubLastUpdate = b; } virtual void Read(hsStream* stream, hsResMgr* mgr); virtual void Write(hsStream* stream, hsResMgr* mgr); void AddTrans(CamTrans* t) { fTrans.Append(t); } int GetNumTrans() { return fTrans.Count(); } CamTrans* GetTrans(int i) { return fTrans[i]; } void SetSubject(plSceneObject* pObj); plSceneObject* GetSubject(); virtual void Push(hsBool recenter = true); virtual void Pop(); virtual hsBool GetFaded(); virtual hsBool SetFaded(hsBool b); hsBool IsAnimated() { return fAnimated; } void SetAnimCommands(hsBool a, hsBool b, hsBool c) { fStartAnimOnPush = a; fStopAnimOnPop = b; fResetAnimOnPop = c; } private: hsPoint3 fFrom; hsPoint3 fAt; plCameraBrain1* fBrain; // the 'logic' portion of the camera hsTArray fTrans; plSceneObject* fSubObj; hsScalar fFOVw; hsScalar fFOVh; hsTArray fMessageQueue; hsTArray fFOVInstructions; hsBool fAnimated, fStartAnimOnPush, fStopAnimOnPop, fResetAnimOnPop; hsPoint3 fLastSubPos; hsPoint3 fLastSubPOA; hsBool fInSubLastUpdate; hsBool fUpdateBrainTarget; // sometimes our target isn't loaded yet, so wait to update the brain til later }; #endif plCameraModifier_inc