// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef R2_DISPLAYER_VISUAL_ACTIVITY_SEQUENCE_H #define R2_DISPLAYER_VISUAL_ACTIVITY_SEQUENCE_H #include "displayer_visual.h" #include "../decal.h" #include "editor.h" #include "nel/misc/line.h" // #include "../interface_v3/group_map.h" namespace NLMISC { class CLine; } namespace R2 { class CDisplayerVisualActivitySequence : public CDisplayerVisual, public CEditor::IInstanceObserver, public CGroupMap::IDeco { public: NLMISC_DECLARE_CLASS(R2::CDisplayerVisualActivitySequence); CDisplayerVisualActivitySequence(); ~CDisplayerVisualActivitySequence(); // from CDisplayerVisual virtual bool isSelectable() const { return false; } virtual void onAttrModified(const std::string &attrName, sint32 attrIndex); virtual void onPostRender(); virtual void onPreRender(); virtual void updateWorldPos(); virtual void setActive(bool active); virtual bool getActive() const; private: bool _AddedToWorldMap; bool _Touched; bool _Active; std::vector _Decals; std::vector _WorldMapEdges; std::vector _ObserverHandles; // need to know when one of the component world pos is changed (no notification message reach us if // word pos update is due to a parent) // TODO : add a 'world pos changed' event... struct CWorldPosCache { CDisplayerVisual::TRefPtr DV; NLMISC::CVector2f WorldPos2f; }; std::vector _WPCache; std::vector _FootSteps; NLMISC::CRGBA _DecalColor; // keep list of primitives traversed by this sequence // allows to know when to update us if visibility of one of the primitive has changed struct CTraversedPrimInfo { CDisplayerVisual::TRefPtr PrimDisplay; bool Visible; }; std::vector _TraversedPrimInfos; protected: void touch(); void update(); void clear(bool wantRemoveFromWorldMap = true); void addFootSteps(const NLMISC::CLine &line); void addWanderSteps(const NLMISC::CVector &pos); void setWorldMapColor(NLMISC::CRGBA color); void setWorldMapNumEdges(uint count); CDisplayerVisual *getParentDV() const; // from CEditor::IInstanceObserver virtual void onInstanceCreated(CInstance &instance); virtual void onInstanceErased(CInstance &instance); virtual void onAttrModified(CInstance &instance, const std::string &attrName, sint32 attrIndex); protected: // from CGroupMap::IDeco virtual void onAdd(CGroupMap &owner); virtual void onRemove(CGroupMap &owner); virtual void onPreRender(CGroupMap &owner); virtual void onUpdate(CGroupMap &owner); // return true if visible // if entiyDV == groupDV, then an ungrouped entity, else the group an its entity bool isVisible(CDisplayerVisual *groupDV, CDisplayerVisual *entityDV); // get visual displayer of parent group, or return the entity if not grouped CDisplayerVisual *getPossibleGroupDV(CDisplayerVisual *entityDV); // void removeFromWorldMap(); }; } // R2 #endif