/*==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 plSceneObject_inc #define plSceneObject_inc #include "hsBitVector.h" #include "pnKeyedObject/hsKeyedObject.h" #include "pnMessage/plRefMsg.h" #include "pnNetCommon/plSynchedObject.h" #include "pnNetCommon/plSynchedValue.h" #include "pnModifier/plModifier.h" #include "hsStream.h" class plObjInterface; class plDrawInterface; class plSimulationInterface; class plCoordinateInterface; class plAudioInterface; class plMessage; class hsStream; class hsResMgr; class plMessage; class plDispatchBase; struct hsMatrix44; // The following two aren't dragging the Conversion side into the runtime. // They are just to let the converter do things we don't want done at runtime. // Nice that we can make friends with these opaque classes. class plMaxNode; class plMaxNodeBase; class plSceneObject : public plSynchedObject { friend class plSynchedValueBase; private: plDrawInterface* GetVolatileDrawInterface() { return fDrawInterface; } plSimulationInterface* GetVolatileSimulationInterface() { return fSimulationInterface; } plCoordinateInterface* GetVolatileCoordinateInterface() { return fCoordinateInterface; } plAudioInterface* GetVolatileAudioInterface() { return fAudioInterface; } plObjInterface* GetVolatileGenericInterface(UInt16 classIdx) const; plModifier* GetVolatileModifier(int i) { return fModifiers[i]; } plKey fSceneNode; friend class plModifier; friend class plCoordinateInterface; friend class plObjInterface; friend class plMaxNode; friend class plMaxNodeBase; hsBool IMsgHandle(plMessage* msg); protected: plDrawInterface* fDrawInterface; plSimulationInterface* fSimulationInterface; plCoordinateInterface* fCoordinateInterface; plAudioInterface* fAudioInterface; hsTArray fModifiers; hsTArray fGenerics; void ISetDrawInterface(plDrawInterface* di); void ISetSimulationInterface(plSimulationInterface* si); void ISetAudioInterface(plAudioInterface* ai); void ISetCoordinateInterface(plCoordinateInterface* ci); void IAddGeneric(plObjInterface* gen); void IRemoveGeneric(plObjInterface* gen); void IRemoveAllGenerics(); void IPropagateToGenerics(plMessage* msg); void IPropagateToGenerics(const hsBitVector& types, plMessage* msg); void IAddModifier(plModifier* mo, int i); void IRemoveModifier(plModifier* mo); hsBool IPropagateToModifiers(plMessage* msg); void ISetInterface(plObjInterface* iface); void IRemoveInterface(plObjInterface* iface); void IRemoveInterface(Int16 idx, plObjInterface* iface=nil); void ISetTransform(const hsMatrix44& l2w, const hsMatrix44& w2l); public: plSceneObject(); virtual ~plSceneObject(); CLASSNAME_REGISTER( plSceneObject ); GETINTERFACE_ANY( plSceneObject, plSynchedObject ); virtual void Read(hsStream* stream, hsResMgr* mgr); virtual void Write(hsStream* stream, hsResMgr* mgr); virtual const plDrawInterface* GetDrawInterface() const { return fDrawInterface; } virtual const plSimulationInterface* GetSimulationInterface() const { return fSimulationInterface; } virtual const plCoordinateInterface* GetCoordinateInterface() const { return fCoordinateInterface; } virtual const plAudioInterface* GetAudioInterface() const { return fAudioInterface; } int GetNumGenerics() const { return fGenerics.GetCount(); } const plObjInterface* GetGeneric(int i) const { return fGenerics[i]; } plObjInterface* GetGenericInterface(UInt16 classIdx) const { return GetVolatileGenericInterface(classIdx); } int GetNumModifiers() const { return fModifiers.GetCount(); } const plModifier* GetModifier(int i) const { return fModifiers[i]; } const plModifier* GetModifierByType(UInt16 classIdx) const; virtual hsBool MsgReceive(plMessage* msg); virtual hsBool Eval(double secs, hsScalar del); void SetSceneNode(plKey newNode); plKey GetSceneNode() const; // Network only strange function. Do not emulate or generalize this functionality. virtual void SetNetGroup(plNetGroupId netGroup); virtual void ReleaseData( void ); // Force an immediate re-sync of the transforms in the hierarchy this object belongs to, // as opposed to waiting for the plTransformMsg to resync. void FlushTransform(); void SetTransform(const hsMatrix44& l2w, const hsMatrix44& w2l); hsMatrix44 GetLocalToWorld() const; hsMatrix44 GetWorldToLocal() const; hsMatrix44 GetLocalToParent() const; hsMatrix44 GetParentToLocal() const; hsBool IsFinal(); // "is ready to process Loads" // Export only virtual void SetDrawInterface(plDrawInterface* di); virtual void SetSimulationInterface(plSimulationInterface* si); virtual void SetAudioInterface(plAudioInterface* ai); virtual void SetCoordinateInterface(plCoordinateInterface* ci); virtual void AddModifier(plModifier* mo); virtual void RemoveModifier(plModifier* mo); }; #endif // plSceneObject_inc