/*
-Copyright (C) 1999-2007 id Software, Inc. and contributors.
-For a list of contributors, see the accompanying CONTRIBUTORS file.
+ 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.
+ 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 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.
+ 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
-*/
+ 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
+ */
//-----------------------------------------------------------------------------
//
//
// DESCRIPTION:
// a set of functions to manipulate textures in Radiant
-//
+//
#ifndef __ISHADERS_H_
#define __ISHADERS_H_
#define SHADERS_MAJOR "shaders"
// define a GUID for this interface so plugins can access and reference it
// {D42F798A-DF57-11d3-A3EE-0004AC96D4C3}
-static const GUID QERShadersTable_GUID =
+static const GUID QERShadersTable_GUID =
{ 0xd42f798a, 0xdf57, 0x11d3, { 0xa3, 0xee, 0x0, 0x4, 0xac, 0x96, 0xd4, 0xc3 } };
// NOTES ABOUT SYNTAX:
// see the note to move all the shader language out of Radiant below)
/*!
-\todo FIXME TTimo
-fix the reference count strategy
-- define the policy. It seems the initial policy of doing an inc ref when you create the shader is not good
-(it doesn't work, and it's not being used right)
-so, when you request an IShader and store it, incref it yourself
-as a debugging safe check: push the created increfed objects into a list, and scan them at next idle loop
-to make sure they have been decref'ed ? (sounds easy, may not be that much).
-*/
+ \todo FIXME TTimo
+ fix the reference count strategy
+ - define the policy. It seems the initial policy of doing an inc ref when you create the shader is not good
+ (it doesn't work, and it's not being used right)
+ so, when you request an IShader and store it, incref it yourself
+ as a debugging safe check: push the created increfed objects into a list, and scan them at next idle loop
+ to make sure they have been decref'ed ? (sounds easy, may not be that much).
+ */
class IShader
{
public:
- // Increment the number of references to this object
- virtual void IncRef () = 0;
- // Decrement the reference count
- virtual void DecRef () = 0;
- // get/set the qtexture_t* Radiant uses to represent this shader object
- virtual qtexture_t* getTexture() const = 0;
- virtual void setTexture(qtexture_t *pTex) = 0;
- // get shader name
- virtual const char* getName() const = 0;
- // is this shader in use?
- // NOTE: this flag can mean this shader has been in use at least once since the last rescan of in-use stuff
- // (rescan of in-use happens in several cases, user command or during a texture directory load)
- // NOTE: this is used to draw the green outline in the texture window
- // NOTE: when does Radiant set the InUse flag? Whenever Select_SetTexture is called (well that doesn't necessarily means the texture actually gets in use, but that's close enough)
- virtual bool IsInUse() const = 0;
- virtual void SetInUse(bool) = 0;
- // is this shader displayed in the texture browser?
- // NOTE: if IsInUse() == true, the shader will always be displayed in the texture window and this flag ingored
- virtual bool IsDisplayed() const = 0;
- virtual void SetDisplayed(bool) = 0;
- // get the editor flags (QER_NOCARVE QER_TRANS)
- virtual int getFlags() = 0;
- // get the transparency value
- virtual float getTrans() = 0;
- // test if it's a true shader, or a default shader created to wrap around a texture
- virtual bool IsDefault() = 0;
- // test if it's a plain color shader, i.e. a shader we use on plain color stuff (like info_playerstart)
- virtual bool IsColor() = 0;
- // get the related color then!
- virtual void getColor(vec3_t v) = 0;
- // get the alphaFunc
- virtual void getAlphaFunc(int *func, float *ref) = 0;
- // get the cull type
- virtual int getCull() = 0;
- // get shader file name (ie the file where this one is defined)
- virtual const char* getShaderFileName() const = 0;
+virtual ~IShader() { }
+// Increment the number of references to this object
+virtual void IncRef() = 0;
+// Decrement the reference count
+virtual void DecRef() = 0;
+// get/set the qtexture_t* Radiant uses to represent this shader object
+virtual qtexture_t* getTexture() const = 0;
+virtual void setTexture( qtexture_t *pTex ) = 0;
+// get shader name
+virtual const char* getName() const = 0;
+// is this shader in use?
+// NOTE: this flag can mean this shader has been in use at least once since the last rescan of in-use stuff
+// (rescan of in-use happens in several cases, user command or during a texture directory load)
+// NOTE: this is used to draw the green outline in the texture window
+// NOTE: when does Radiant set the InUse flag? Whenever Select_SetTexture is called (well that doesn't necessarily means the texture actually gets in use, but that's close enough)
+virtual bool IsInUse() const = 0;
+virtual void SetInUse( bool ) = 0;
+// is this shader displayed in the texture browser?
+// NOTE: if IsInUse() == true, the shader will always be displayed in the texture window and this flag ingored
+virtual bool IsDisplayed() const = 0;
+virtual void SetDisplayed( bool ) = 0;
+// get the editor flags (QER_NOCARVE QER_TRANS)
+virtual int getFlags() = 0;
+// get the transparency value
+virtual float getTrans() = 0;
+// test if it's a true shader, or a default shader created to wrap around a texture
+virtual bool IsDefault() = 0;
+// test if it's a plain color shader, i.e. a shader we use on plain color stuff (like info_playerstart)
+virtual bool IsColor() = 0;
+// get the related color then!
+virtual void getColor( vec3_t v ) = 0;
+// get the alphaFunc
+virtual void getAlphaFunc( int *func, float *ref ) = 0;
+// get the cull type
+virtual int getCull() = 0;
+// get shader file name (ie the file where this one is defined)
+virtual const char* getShaderFileName() const = 0;
};
// NOTE: how to move all the shader language out of Radiant in a plugin?
// free all shaders
// free the shaders, will not free the qtexture_t*
-typedef void (WINAPI* PFN_FREESHADERS) ();
+typedef void ( WINAPI * PFN_FREESHADERS )();
// reload all the shaders
// this will free everything (shaders and their textures), then reload all in use stuff
-typedef void (WINAPI* PFN_RELOADSHADERS) ();
+typedef void ( WINAPI * PFN_RELOADSHADERS )();
// load all shaders in a given directory
// this will scan the list of in-memory shaders, and load the related qtexture_t if needed
-typedef int (WINAPI* PFN_LOADSHADERSFROMDIR)(const char* path);
+typedef int ( WINAPI * PFN_LOADSHADERSFROMDIR )( const char* path );
// load a shader file (ie a set of shaders)
// after LoadShaderFile shaders will be in memory, next step is to load the qtexture_t Radiant uses to represent them
// if a shader with the same name exists, new one will not be loaded - don't use this to refresh the shaders!
-typedef void (WINAPI* PFN_LOADSHADERFILE) (const char* filename);
+typedef void ( WINAPI * PFN_LOADSHADERFILE )( const char* filename );
// tell if a given shader exists in our shader table
-// NOTE: this doesn't tell wether it's corresponding qtexture is loaded
-typedef int (WINAPI* PFN_HASSHADER) (const char* name);
+// NOTE: this doesn't tell wether it's corresponding qtexture is loaded
+typedef int ( WINAPI * PFN_HASSHADER )( const char* name );
// return the shader for a given name
// if the qtexture is not already in memory, will try loading it
// if the qtexture could not be found, will use default
// will return NULL on shader not found
-typedef IShader* (WINAPI* PFN_TRYSHADERFORNAME) (const char* name);
+typedef IShader* ( WINAPI * PFN_TRYSHADERFORNAME )( const char* name );
// return the shader for a given name
// if the qtexture is not already in memory, will try loading it
// will create a default shader if not found (will use a default texture)
-typedef IShader* (WINAPI* PFN_SHADERFORNAME) (const char* name);
+typedef IShader* ( WINAPI * PFN_SHADERFORNAME )( const char* name );
// query / load a texture
// will not try loading a shader, will look for the actual image file ..
// returns NULL on file not found
// paths must be relative, ie. textures/me/myfile
// if a 3-letters filename extension (such as .jpg or .tga) is provided, it will get loaded first
// if not found or no extension, will try loading after adding .tga and .jpg (in this order)
-typedef qtexture_t* (WINAPI* PFN_TRYTEXTUREFORNAME) (const char* filename);
+typedef qtexture_t* ( WINAPI * PFN_TRYTEXTUREFORNAME )( const char* filename );
// query / load a texture
// will not try loading a shader, will look for the actual image file ..
// on file not found will use the "texture not found"
-typedef qtexture_t* (WINAPI* PFN_TEXTUREFORNAME) (const char* filename);
+typedef qtexture_t* ( WINAPI * PFN_TEXTUREFORNAME )( const char* filename );
// get the number of active shaders
// these are the shaders currently loaded, that have an associated qtexture_t*
-typedef int (WINAPI* PFN_GETACTIVESHADERCOUNT) ();
+typedef int ( WINAPI * PFN_GETACTIVESHADERCOUNT )();
// for stuff that needs to be represented by a plain texture
// the shader will get a "color" name, use GetColor to get the actual color
-typedef IShader* (WINAPI* PFN_COLORSHADERFORNAME) (const char* name);
+typedef IShader* ( WINAPI * PFN_COLORSHADERFORNAME )( const char* name );
// reload a shaderfile - update shaders and their display properties/qtexture_t if needed
// will not reload the texture files
// will switch to "show in use" atfer use
// filename must be reletive path of the shader, ex. scripts/gothic_wall.shader
-typedef void (WINAPI* PFN_RELOADSHADERFILE)(const char* filename);
+typedef void ( WINAPI * PFN_RELOADSHADERFILE )( const char* filename );
// retrieve a shader if exists, without loading the textures for it etc.
// use this function if you want special info on a shader
-typedef IShader* (WINAPI* PFN_SHADERFORNAMENOLOAD) (const char* name);
+typedef IShader* ( WINAPI * PFN_SHADERFORNAMENOLOAD )( const char* name );
// force the "in use" flag on all active shaders
-typedef void (WINAPI* PFN_ACTIVESHADERSSETINUSE) (bool b);
+typedef void ( WINAPI * PFN_ACTIVESHADERSSETINUSE )( bool b );
// sort the shaders in alphabetical order, we use the order in the texture inspector
-typedef void (WINAPI* PFN_SORTACTIVESHADERS) ();
+typedef void ( WINAPI * PFN_SORTACTIVESHADERS )();
// check if there exists an active shader with the given texture name (loaded or not, doesn't matter)
// (used to detect the textures we need to create a default shader for .. while scanning a directory)
-typedef IShader* (WINAPI* PFN_ACTIVESHADERFORTEXTURENAME) (char *);
+typedef IShader* ( WINAPI * PFN_ACTIVESHADERFORTEXTURENAME )( char * );
// create a shader to wrap around a texture name, we use this when loading a texture directory and some textures
// are not present as shaders
-typedef IShader* (WINAPI* PFN_CREATESHADERFORTEXTURENAME) (const char* name);
+typedef IShader* ( WINAPI * PFN_CREATESHADERFORTEXTURENAME )( const char* name );
// switch the IsDisplayed flag on all the active shaders
-typedef void (WINAPI* PFN_ACTIVESHADERSSETDISPLAYED) (bool b);
+typedef void ( WINAPI * PFN_ACTIVESHADERSSETDISPLAYED )( bool b );
// retrieve an active shader based on index
-typedef IShader* (WINAPI* PFN_ACTIVESHADERFORINDEX) (int i);
+typedef IShader* ( WINAPI * PFN_ACTIVESHADERFORINDEX )( int i );
// will cleanup a texture name and force it to the right format
// the debug version is painfully slow, but will detect more problems
// the idea being to avoid loading the same file several time because of uppercase/lowercase etc.
-typedef const char* (WINAPI* PFN_CLEANTEXTURENAME) (const char* name, bool bAddTexture);
+typedef const char* ( WINAPI * PFN_CLEANTEXTURENAME )( const char* name, bool bAddTexture );
struct _QERShadersTable
{
- int m_nSize;
- PFN_FREESHADERS m_pfnFreeShaders;
- PFN_RELOADSHADERS m_pfnReloadShaders;
- PFN_LOADSHADERSFROMDIR m_pfnLoadShadersFromDir;
- PFN_LOADSHADERFILE m_pfnLoadShaderFile;
- PFN_RELOADSHADERFILE m_pfnReloadShaderFile;
- PFN_HASSHADER m_pfnHasShader;
- PFN_TRYSHADERFORNAME m_pfnTry_Shader_ForName;
- PFN_SHADERFORNAME m_pfnShader_ForName;
- PFN_TRYTEXTUREFORNAME m_pfnTry_Texture_ForName;
- PFN_TEXTUREFORNAME m_pfnTexture_ForName;
- PFN_GETACTIVESHADERCOUNT m_pfnGetActiveShaderCount;
- PFN_COLORSHADERFORNAME m_pfnColorShader_ForName;
- PFN_SHADERFORNAMENOLOAD m_pfnShader_ForName_NoLoad;
- PFN_ACTIVESHADERSSETINUSE m_pfnActiveShaders_SetInUse;
- PFN_SORTACTIVESHADERS m_pfnSortActiveShaders;
- PFN_ACTIVESHADERFORTEXTURENAME m_pfnActiveShader_ForTextureName;
- PFN_CREATESHADERFORTEXTURENAME m_pfnCreateShader_ForTextureName;
- PFN_ACTIVESHADERSSETDISPLAYED m_pfnActiveShaders_SetDisplayed;
- PFN_ACTIVESHADERFORINDEX m_pfnActiveShader_ForIndex;
- PFN_CLEANTEXTURENAME m_pfnCleanTextureName;
+ int m_nSize;
+ PFN_FREESHADERS m_pfnFreeShaders;
+ PFN_RELOADSHADERS m_pfnReloadShaders;
+ PFN_LOADSHADERSFROMDIR m_pfnLoadShadersFromDir;
+ PFN_LOADSHADERFILE m_pfnLoadShaderFile;
+ PFN_RELOADSHADERFILE m_pfnReloadShaderFile;
+ PFN_HASSHADER m_pfnHasShader;
+ PFN_TRYSHADERFORNAME m_pfnTry_Shader_ForName;
+ PFN_SHADERFORNAME m_pfnShader_ForName;
+ PFN_TRYTEXTUREFORNAME m_pfnTry_Texture_ForName;
+ PFN_TEXTUREFORNAME m_pfnTexture_ForName;
+ PFN_GETACTIVESHADERCOUNT m_pfnGetActiveShaderCount;
+ PFN_COLORSHADERFORNAME m_pfnColorShader_ForName;
+ PFN_SHADERFORNAMENOLOAD m_pfnShader_ForName_NoLoad;
+ PFN_ACTIVESHADERSSETINUSE m_pfnActiveShaders_SetInUse;
+ PFN_SORTACTIVESHADERS m_pfnSortActiveShaders;
+ PFN_ACTIVESHADERFORTEXTURENAME m_pfnActiveShader_ForTextureName;
+ PFN_CREATESHADERFORTEXTURENAME m_pfnCreateShader_ForTextureName;
+ PFN_ACTIVESHADERSSETDISPLAYED m_pfnActiveShaders_SetDisplayed;
+ PFN_ACTIVESHADERFORINDEX m_pfnActiveShader_ForIndex;
+ PFN_CLEANTEXTURENAME m_pfnCleanTextureName;
};
/*!
-\todo FIXME fix the QERApp_ prototyping on shaders module
-make it homogeneous with other modules, should be straight calls
-*/
+ \todo FIXME fix the QERApp_ prototyping on shaders module
+ make it homogeneous with other modules, should be straight calls
+ */
#ifdef USE_SHADERSTABLE_DEFINE
#ifndef __SHADERSTABLENAME
- #define __SHADERSTABLENAME g_ShadersTable
+ #define __SHADERSTABLENAME g_ShadersTable
#endif
#define QERApp_Shader_ForName __SHADERSTABLENAME.m_pfnShader_ForName
#define QERApp_Texture_ForName2 __SHADERSTABLENAME.m_pfnTexture_ForName
#define APPSHADERS_MAJOR "appshaders"
// FIXME: remove
-static const GUID QERAppShadersTable_GUID =
+static const GUID QERAppShadersTable_GUID =
{ 0xec3008a8, 0xbd0b, 0x11d4, { 0x82, 0x51, 0x20, 0x4c, 0x4f, 0x4f, 0x50, 0x20 } };
// g_qeglobals.d_qtextures is used internally by the editor for actual camera drawing
-typedef qtexture_t** (WINAPI* PFN_QTEXTURES)();
+typedef qtexture_t** ( WINAPI * PFN_QTEXTURES )();
// g_qeglobals.d_qtexmap is a map for fast access
-typedef GHashTable* (WINAPI* PFN_QTEXMAP)();
+typedef GHashTable* ( WINAPI * PFN_QTEXMAP )();
// d_texturewin
//++timo NOTE: this same function is also in isurface.h table, we would eventually have to merge some stuff
-typedef texturewin_t* (* PFN_QEGLOBALSTEXTUREWIN)();
+typedef texturewin_t* ( *PFN_QEGLOBALSTEXTUREWIN )();
// Texture_SetTexture
//++timo NOTE: this one may have to be reorganized too .. putting it here is a bit clumsy
// NOTE: the C++ function used internally has a lot of default values
-typedef void (WINAPI* PFN_TEXTURESETTEXTURE)(texdef_t *texdef, brushprimit_texdef_t *brushprimit_texdef);
+typedef void ( WINAPI * PFN_TEXTURESETTEXTURE )( texdef_t *texdef, brushprimit_texdef_t *brushprimit_texdef );
// Texture_ShowInuse
-typedef void (WINAPI* PFN_TEXTURESHOWINUSE)();
+typedef void ( WINAPI * PFN_TEXTURESHOWINUSE )();
// BuildShaderList
-typedef void (* PFN_BUILDSHADERLIST)();
+typedef void ( *PFN_BUILDSHADERLIST )();
// PreloadShaders
-typedef void (* PFN_PRELOADSHADERS)();
+typedef void ( *PFN_PRELOADSHADERS )();
// a table that Radiant makes available to the shader module in return
struct _QERAppShadersTable
{
- int m_nSize;
- PFN_QTEXTURES m_pfnQTextures;
- PFN_QTEXMAP m_pfnQTexmap;
- PFN_QEGLOBALSTEXTUREWIN m_pfnQeglobalsTexturewin;
- PFN_TEXTURESETTEXTURE m_pfnTexture_SetTexture;
- PFN_TEXTURESHOWINUSE m_pfnTexture_ShowInuse;
- PFN_BUILDSHADERLIST m_pfnBuildShaderList;
- PFN_PRELOADSHADERS m_pfnPreloadShaders;
+ int m_nSize;
+ PFN_QTEXTURES m_pfnQTextures;
+ PFN_QTEXMAP m_pfnQTexmap;
+ PFN_QEGLOBALSTEXTUREWIN m_pfnQeglobalsTexturewin;
+ PFN_TEXTURESETTEXTURE m_pfnTexture_SetTexture;
+ PFN_TEXTURESHOWINUSE m_pfnTexture_ShowInuse;
+ PFN_BUILDSHADERLIST m_pfnBuildShaderList;
+ PFN_PRELOADSHADERS m_pfnPreloadShaders;
};
#ifdef USE_APPSHADERSTABLE_DEFINE
#ifndef __APPSHADERTABLENAME
- #define __APPSHADERTABLENAME g_AppShadersTable
+ #define __APPSHADERTABLENAME g_AppShadersTable
#endif
#define Texture_ShowInuse __APPSHADERTABLENAME.m_pfnTexture_ShowInuse
#endif
/*!
-NOTE TTimo: there is an important distinction between SHADER_NOT_FOUND and SHADER_NOTEX:
-SHADER_NOT_FOUND means we didn't find the raw texture or the shader for this
-SHADER_NOTEX means we recognize this as a shader script, but we are missing the texture to represent it
-this was in the initial design of the shader code since early GtkRadiant alpha, and got sort of foxed in 1.2 and put back in
-*/
+ NOTE TTimo: there is an important distinction between SHADER_NOT_FOUND and SHADER_NOTEX:
+ SHADER_NOT_FOUND means we didn't find the raw texture or the shader for this
+ SHADER_NOTEX means we recognize this as a shader script, but we are missing the texture to represent it
+ this was in the initial design of the shader code since early GtkRadiant alpha, and got sort of foxed in 1.2 and put back in
+ */
#define SHADER_NOT_FOUND "textures/radiant/notex"
#define SHADER_NOTEX "textures/radiant/shadernotex" ///< Q3 tech specific