/*==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 plOccluder_inc #define plOccluder_inc #include "pnSceneObject/plObjInterface.h" #include "hsTemplates.h" #include "hsMatrix44.h" #include "plCullPoly.h" #include "hsBounds.h" #include "hsBitVector.h" class plOccluderProxy; class plDrawableSpans; class hsGMaterial; class plVisRegion; class plOccluder : public plObjInterface { public: enum { kDisable = 0x0, kNumProps }; enum { kRefVisRegion }; protected: hsTArray fPolys; plOccluderProxy* fProxyGen; hsBitVector fVisSet; hsTArray fVisRegions; hsBitVector fVisNot; hsScalar fPriority; hsBounds3Ext fWorldBounds; plKey fSceneNode; virtual hsScalar IComputeSurfaceArea(); virtual void IComputeBounds(); virtual hsTArray& IGetLocalPolyList() { return fPolys; } virtual void ISetSceneNode(plKey node); void IAddVisRegion(plVisRegion* reg); void IRemoveVisRegion(plVisRegion* reg); public: plOccluder(); virtual ~plOccluder(); CLASSNAME_REGISTER( plOccluder ); GETINTERFACE_ANY( plOccluder, plObjInterface); virtual hsBool MsgReceive(plMessage* msg); virtual hsScalar GetPriority() const { return fPriority; } hsBool InVisSet(const hsBitVector& visSet) const { return fVisSet.Overlap(visSet); } hsBool InVisNot(const hsBitVector& visNot) const { return fVisNot.Overlap(visNot); } virtual const hsBounds3Ext& GetWorldBounds() const { return fWorldBounds; } virtual void SetTransform(const hsMatrix44& l2w, const hsMatrix44& w2l); virtual const hsMatrix44& GetLocalToWorld() const; virtual const hsMatrix44& GetWorldToLocal() const; virtual void SetPolyList(const hsTArray& list); virtual const hsTArray& GetWorldPolyList() const { return fPolys; } virtual const hsTArray& GetLocalPolyList() const { return fPolys; } virtual Int32 GetNumProperties() const { return kNumProps; } virtual void Read(hsStream* s, hsResMgr* mgr); virtual void Write(hsStream* s, hsResMgr* mgr); // Visualization virtual plDrawableSpans* CreateProxy(hsGMaterial* mat, hsTArray& idx, plDrawableSpans* addTo); // Export only function to initialize. virtual void ComputeFromPolys(); // These two should only be called internally and on export/convert virtual plKey GetSceneNode() const { return fSceneNode; } }; class plMobileOccluder : public plOccluder { protected: hsMatrix44 fLocalToWorld; hsMatrix44 fWorldToLocal; hsBounds3Ext fLocalBounds; hsTArray fOrigPolys; virtual void IComputeBounds(); virtual hsTArray& IGetLocalPolyList() { return fOrigPolys; } public: plMobileOccluder(); virtual ~plMobileOccluder(); CLASSNAME_REGISTER( plMobileOccluder ); GETINTERFACE_ANY( plMobileOccluder, plOccluder ); virtual void SetTransform(const hsMatrix44& l2w, const hsMatrix44& w2l); virtual const hsMatrix44& GetLocalToWorld() const { return fLocalToWorld; } virtual const hsMatrix44& GetWorldToLocal() const { return fWorldToLocal; } virtual void SetPolyList(const hsTArray& list); virtual const hsTArray& GetLocalPolyList() const { return fOrigPolys; } virtual void Read(hsStream* s, hsResMgr* mgr); virtual void Write(hsStream* s, hsResMgr* mgr); // Export only function to initialize. virtual void ComputeFromPolys(); }; #endif // plOccluder_inc