/* Copyright (C) 1999-2007 id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant 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 2 of the License, or (at your option) any later version. GtkRadiant 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 GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _PLUGINMANAGER_H_ #define _PLUGINMANAGER_H_ #include "plugin.h" // global interfaces we are using extern _QERShadersTable g_ShadersTable; // NOTE: it's actually a module manager, the name should change to ModuleManager.. class CPlugInManager { private: GSList* m_PlugIns; CPtrArray m_BrushHandles; CPtrArray m_SelectedBrushHandles; CPtrArray m_ActiveBrushHandles; // v1.70 //! brushes of the current entity ( see m_SelectedBrushHandles and m_ActiveBrushHandles ) CPtrArray m_EntityBrushHandles; //! allocated entities, not commited yet ( see m_BrushHandles ) CPtrArray m_EntityHandles; //! tells in which array to look when given a patch index enum EPatchesMode { EActivePatches, ESelectedPatches, EAllocatedPatches } PatchesMode; //! patches handles (brush_t*) CPtrArray m_PatchesHandles; //! plugin-allocated patches, not commited yet (patchMesh_t*) CPtrArray m_PluginPatches; void InitForDir( const Str &dir ); ///< init for plguins/modules below this directory public: CPtrArray& GetActiveHandles() {return m_ActiveBrushHandles; }; CPtrArray& GetSelectedHandles() {return m_SelectedBrushHandles; }; CPtrArray& GetPluginPatches() {return m_PluginPatches; }; brush_t* FindBrushHandle( void *vp ); patchMesh_t* FindPatchHandle( int index ); int CreatePatchHandle(); int AllocateActivePatchHandles(); int AllocateSelectedPatchHandles(); void CommitPatchHandleToMap( int index, patchMesh_t *pMesh, char *texName ); void CommitPatchHandleToEntity( int index, patchMesh_t *pMesh, char *texName, void *vpEntity ); void ReleasePatchesHandles() { m_PatchesHandles.RemoveAll(); m_PluginPatches.RemoveAll(); } void AddFaceToBrushHandle( void *vp, vec3_t v1, vec3_t v2, vec3_t v3 ); void CommitBrushHandleToMap( void *vp ); void DeleteBrushHandle( void* vp ); void* CreateBrushHandle(); void Dispatch( int n, const char *p ); void Cleanup(); ///< cleanup of data structures allocated for plugins, not a plugin reload void Init(); ///< go through the path where we will find modules and plugins void LoadImage( const char *name, unsigned char **pic, int *width, int *height ); void ImportMap( IDataStream *in, CPtrArray *ents, const char *type ); void ExportMap( CPtrArray *ents, IDataStream *out, const char *type ); void Shutdown(); ///< shutdown all the plugins/module subsystem CPlugInManager(); virtual ~CPlugInManager(); /*! the texture manager front ends the single load addins (texture, model, map formats.. etc.) */ _QERTextureInfo* GetTextureInfo(); void LoadTexture( const char *pFilename ); void* GetSurfaceFlags(); // v1.70 CPtrArray& GetEntityBrushHandles() {return m_EntityBrushHandles; }; CPtrArray& GetEntityHandles() {return m_EntityHandles; }; //! the vpBrush needs to be in m_BrushHandles void CommitBrushHandleToEntity( void* vpBrush, void* vpEntity ); //! the vpEntity needs to be in m_EntityHandles void CommitEntityHandleToMap( void* vpEntity ); protected: //! read the interfaces this plugin implements void LoadFromPath( const char *path ); ///< load all modules/plugins in specified path void RegisterInterfaces(); }; class CPluginSlot : public IPlugIn { APIDescriptor_t *mpAPI; _QERPluginTable *mpTable; /*! is false until Init() happened */ bool m_bReady; /*! below is valid only if m_bReady = true */ GSList *m_CommandStrings; GSList *m_CommandIDs; public: /*! build directly from a SYN_PROVIDE interface */ CPluginSlot( APIDescriptor_t *pAPI ); virtual ~CPluginSlot(); APIDescriptor_t* GetDescriptor() { return mpAPI; } /*! initialize some management data after the synapse interfaces have been hooked up */ void Init(); /*! dispatching a command by name to the plugin */ void Dispatch( const char *p ); // IPlugIn ------------------------------------------------------------ const char* getMenuName(); int getCommandCount(); const char* getCommand( int n ); void addMenuID( int n ); bool ownsCommandID( int n ); }; class CRadiantPluginManager : public CSynapseAPIManager { list mSlots; public: CRadiantPluginManager() {} virtual ~CRadiantPluginManager(); // CSynapseAPIManager interface ------------------- APIDescriptor_t *BuildRequireAPI( APIDescriptor_t *pAPI ); // CRadiantPluginManager -------------------------- void PopulateMenu(); bool Dispatch( int n, const char* p ); }; class CImageTableSlot { /*! \todo this is a duplicate from the APIDescriptor_t* list that privately stored inside CSynapseAPIManager this is probably useless to us in here? */ APIDescriptor_t *mpAPI; /*! shortcut to mpAPI->mpTable, with correct typing this is what we allocate and should free locally */ _QERPlugImageTable *mpTable; public: CImageTableSlot() { } virtual ~CImageTableSlot() { } ///\ \todo need to correctly free and release still.. APIDescriptor_t* GetDescriptor() { return mpAPI; } _QERPlugImageTable* GetTable() { return mpTable; } /*! don't go through PrepareRequireAPI for init, just get this API and add the table info */ void InitForFillAPITable( APIDescriptor_t *pAPI ); }; class CRadiantImageManager : public CSynapseAPIManager { list mSlots; list::iterator mExtScanSlot; public: CRadiantImageManager() {} virtual ~CRadiantImageManager(); // CSynapseAPIManager interface -------------------- void FillAPITable( APIDescriptor_t *pAPI ); // CRadiantImageManager ---------------------------- /*! extract the extension, go through the list of image interfaces, and load */ void LoadImage( const char *name, byte **pic, int *width, int *height ); /*! we often need to walk through the extensions this used to be hardcoded in texwindow.cpp the two functions are related, they use a static to go through the list */ void BeginExtensionsScan(); const char* GetNextExtension(); ///< \return NULL when the list has been completely scanned }; extern CRadiantImageManager g_ImageManager; #endif // _PLUGINMANAGER_H_