/*==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 plDynamicEnvMap_inc #define plDynamicEnvMap_inc #include "plCubicRenderTarget.h" #include "../plScene/plRenderRequest.h" #include "hsBitVector.h" class plRenderRequestMsg; class hsStream; class plMessage; class plVisRegion; class plGenRefMsg; class hsResMgr; class plCameraModifier1; class plSceneObject; class plBitmap; class plLayer; class plDynamicEnvMap : public plCubicRenderTarget { public: enum { kRefVisSet, kRefRootNode, }; protected: plRenderRequest fReqs[6]; plRenderRequestMsg* fReqMsgs[6]; plSceneObject* fRootNode; hsPoint3 fPos; hsScalar fHither; hsScalar fYon; hsScalar fFogStart; hsColorRGBA fColor; hsScalar fRefreshRate; double fLastRefresh; int fLastRender; int fOutStanding; hsBitVector fVisSet; hsTArray fVisRegions; hsTArray fVisRegionNames; hsBool fIncCharacters; void IUpdatePosition(); hsBool INeedReRender(); void ISetupRenderRequests(); void ISubmitRenderRequests(); void ISubmitRenderRequest(int i); void ICheckForRefresh(double t, plPipeline *pipe); hsBool IOnRefMsg(plGenRefMsg* refMsg); public: plDynamicEnvMap(); plDynamicEnvMap(UInt16 width, UInt16 height, UInt8 bitDepth, UInt8 zDepth = -1, UInt8 sDepth = -1); virtual ~plDynamicEnvMap(); CLASSNAME_REGISTER( plDynamicEnvMap ); GETINTERFACE_ANY( plDynamicEnvMap, plCubicRenderTarget ); virtual void Read(hsStream* s, hsResMgr* mgr); virtual void Write(hsStream* s, hsResMgr* mgr); virtual hsBool MsgReceive(plMessage* msg); void ReRender(); void Init(); void SetPosition(const hsPoint3& pos); void SetHither(hsScalar f); void SetYon(hsScalar f); void SetFogStart(hsScalar f); void SetColor(const hsColorRGBA& col); void SetRefreshRate(hsScalar secs); hsPoint3 GetPosition() const; hsScalar GetHither() const { return fHither; } hsScalar GetYon() const { return fYon; } hsScalar GetFogStart() const { return fFogStart; } hsColorRGBA GetColor() const { return fColor; } hsScalar GetRefreshRate() const { return 6.f * fRefreshRate; } void AddVisRegion(plVisRegion* reg); // Will just send a ref void SetIncludeCharacters(hsBool b); hsBool GetIncludeCharacters() const { return fIncCharacters; } void SetVisRegionName(char *name){ fVisRegionNames.Push(name); } }; //////////////////////////////////////////////////////////////////////////// // Yes, it's lame that a lot of this code is nearly the same as // plDynamicEnvMap, but this derives from plRenderTarget, not plCubicRenderTarget // and I don't want to touch multiple inheritance. class plDynamicCamMap : public plRenderTarget { public: enum { kRefVisSet, kRefCamera, kRefRootNode, kRefTargetNode, kRefDisableTexture, kRefMatLayer, }; hsScalar fHither; hsScalar fYon; hsScalar fFogStart; hsColorRGBA fColor; protected: plRenderRequest fReq; plRenderRequestMsg* fReqMsg; hsScalar fRefreshRate; double fLastRefresh; int fOutStanding; hsBitVector fVisSet; hsTArray fVisRegions; hsTArray fVisRegionNames; // this allows us to specify vis-regions in other pages. hsBool fIncCharacters; plCameraModifier1* fCamera; plSceneObject* fRootNode; hsTArray fTargetNodes; // Extra info for swapping around textures when reflections are disabled. plBitmap* fDisableTexture; hsTArray fMatLayers; static UInt8 fFlags; enum { kReflectionCapable = 0x01, kReflectionEnabled = 0x02, kReflectionMask = kReflectionCapable | kReflectionEnabled, }; hsBool INeedReRender(); void ISetupRenderRequest(plPipeline *pipe); void ISubmitRenderRequest(plPipeline *pipe); void ICheckForRefresh(double t, plPipeline *pipe); void IPrepTextureLayers(); hsBool IOnRefMsg(plRefMsg* refMsg); public: plDynamicCamMap(); plDynamicCamMap(UInt16 width, UInt16 height, UInt8 bitDepth, UInt8 zDepth = -1, UInt8 sDepth = -1); virtual ~plDynamicCamMap(); CLASSNAME_REGISTER( plDynamicCamMap ); GETINTERFACE_ANY( plDynamicCamMap, plRenderTarget ); virtual void Read(hsStream* s, hsResMgr* mgr); virtual void Write(hsStream* s, hsResMgr* mgr); virtual hsBool MsgReceive(plMessage* msg); void ReRender(); void Init(); void SetIncludeCharacters(hsBool b); void SetRefreshRate(hsScalar secs); void AddVisRegion(plVisRegion* reg); void SetVisRegionName(char *name){ fVisRegionNames.Push(name); } static hsBool GetEnabled() { return (fFlags & kReflectionEnabled) != 0; } static void SetEnabled(hsBool enable); static hsBool GetCapable() { return (fFlags & kReflectionCapable) != 0; } static void SetCapable(hsBool capable); }; #endif // plDynamicEnvMap_inc