X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=radiant%2Fpluginmanager.h;h=96e2ac989be12588be86689cb2464146ffa2ca57;hp=cf148bb5f157807f80ccb366d00052233640aea3;hb=a54ff4a83e324df7206626a0e8a10951e46c4fb3;hpb=12b372f89ce109a4db9d510884fbe7d05af79870 diff --git a/radiant/pluginmanager.h b/radiant/pluginmanager.h index cf148bb5..96e2ac98 100644 --- a/radiant/pluginmanager.h +++ b/radiant/pluginmanager.h @@ -1,5 +1,5 @@ /* -Copyright (C) 1999-2006 Id Software, Inc. and contributors. +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. @@ -19,47 +19,194 @@ along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#if !defined(INCLUDED_PLUGINMANAGER_H) -#define INCLUDED_PLUGINMANAGER_H +#ifndef _PLUGINMANAGER_H_ +#define _PLUGINMANAGER_H_ -#include +#include "plugin.h" -typedef struct _GtkWidget GtkWidget; +// global interfaces we are using +extern _QERShadersTable g_ShadersTable; -/*! -\class IPlugin -pure virtual interface for a plugin -temporary solution for migration from old plugin tech to synapse plugins -*/ -class IPlugIn +// 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: - IPlugIn() { } - virtual ~IPlugIn() { } + /*! + 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); - virtual const char* getMenuName() = 0; - virtual std::size_t getCommandCount() = 0; - virtual const char* getCommand(std::size_t) = 0; - virtual const char* getCommandTitle(std::size_t) = 0; - virtual void addMenuID(std::size_t) = 0; - virtual bool ownsCommandID(std::size_t n) = 0; }; -class PluginsVisitor +class CRadiantPluginManager : public CSynapseAPIManager { + list mSlots; public: - virtual void visit(IPlugIn& plugin) = 0; + CRadiantPluginManager() {} + virtual ~CRadiantPluginManager(); + + // CSynapseAPIManager interface ------------------- + APIDescriptor_t *BuildRequireAPI(APIDescriptor_t *pAPI); + + // CRadiantPluginManager -------------------------- + void PopulateMenu(); + bool Dispatch(int n, const char* p); }; -class CPlugInManager +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: - void Dispatch(std::size_t n, const char *p); - void Init(GtkWidget* main_window); - void constructMenu(PluginsVisitor& menu); - void Shutdown(); + 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 }; -CPlugInManager& GetPlugInMgr(); +extern CRadiantImageManager g_ImageManager; -#endif +#endif // _PLUGINMANAGER_H_