## Public API Reference

- Main Page
- Modules
- Namespaces
- Classes
- Files
- Related Pages

- File List
- File Members

# ivideo/shader/shader.h

Go to the documentation of this file.

    00001 /*
    00002     Copyright (C) 2002 by Marten Svanfeldt
    00003                           Anders Stenberg
    00004
    00005     This library is free software; you can redistribute it and/or
    00006     modify it under the terms of the GNU Library General Public
    00007     License as published by the Free Software Foundation; either
    00008     version 2 of the License, or (at your option) any later version.
    00009
    00010     This library is distributed in the hope that it will be useful,
    00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00013     Library General Public License for more details.
    00014
    00015     You should have received a copy of the GNU Library General Public
    00016     License along with this library; if not, write to the Free
    00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    00018 */
    00019
    00020
    00021 #ifndef __CS_IVIDEO_SHADER_H__
    00022 #define __CS_IVIDEO_SHADER_H__
    00023
    00028 #include "csutil/scf.h"
    00029
    00030 #include "csgfx/shadervar.h"
    00031
    00032 #include "csutil/array.h"
    00033 #include "csutil/refarr.h"
    00034 #include "csutil/set.h"
    00035 #include "csutil/strset.h"
    00036
    00037 struct iDocumentNode;
    00038 struct iLight;
    00039 struct iObject;
    00040
    00041 struct csRenderMesh;
    00042 class csShaderVariable;
    00043
    00044 struct iShader;
    00045 struct iShaderCompiler;
    00046 struct iShaderManager;
    00047
    00052 typedef csArray<csShaderVariable*> csShaderVarStack;
    00053
    00057 static inline csShaderVariable* csGetShaderVariableFromStack
    00058   (const csShaderVarStack& stack, const csStringID &name)
    00059 {
    00060   if ((name != csInvalidStringID) &&
    00061       (name < (csStringID)stack.Length ()))
    00062   {
    00063     return stack[name];
    00064   }
    00065   return 0;
    00066 }
    00067
    00072 struct iShaderVariableContext : public virtual iBase
    00073 {
    00074   SCF_INTERFACE(iShaderVariableContext, 2, 0, 0);
    00075
    00081   virtual void AddVariable (csShaderVariable *variable) = 0;
    00082
    00084   virtual csShaderVariable* GetVariable (csStringID name) const = 0;
    00085
    00087   csShaderVariable* GetVariableAdd (csStringID name)
    00088   {
    00089     csShaderVariable* sv;
    00090     sv = GetVariable (name);
    00091     if (sv == 0)
    00092     {
    00093       csRef<csShaderVariable> nsv (
    00094         csPtr<csShaderVariable> (new csShaderVariable (name)));
    00095       AddVariable (nsv);
    00096       sv = nsv; // OK, sv won't be destructed, SV context takes ownership
    00097     }
    00098     return sv;
    00099   }
    00100
    00102   virtual const csRefArray<csShaderVariable>& GetShaderVariables () const = 0;
    00103
    00108   virtual void PushVariables (csShaderVarStack &stacks) const = 0;
    00109
    00111   virtual bool IsEmpty () const = 0;
    00112
    00119   virtual void ReplaceVariable (csShaderVariable* variable) = 0;
    00120
    00122   virtual void Clear() = 0;
    00123 };
    00124
    00125 SCF_VERSION (iShaderManager, 0, 1, 0);
    00126
    00130 enum csShaderTagPresence
    00131 {
    00136   TagNeutral,
    00140   TagForbidden,
    00146   TagRequired
    00147 };
    00148
    00152 struct iShaderManager : public iShaderVariableContext
    00153 {
    00158   virtual void RegisterShader (iShader* shader) = 0;
    00160   virtual void UnregisterShader (iShader* shader) = 0;
    00162   virtual iShader* GetShader (const char* name) = 0;
    00164   virtual const csRefArray<iShader> &GetShaders ()  = 0;
    00165
    00167   virtual void RegisterCompiler (iShaderCompiler* compiler) = 0;
    00169   virtual iShaderCompiler* GetCompiler(const char* name) = 0;
    00170
    00172   virtual csShaderVarStack& GetShaderVariableStack () = 0;
    00173
    00182   virtual void SetTagOptions (csStringID tag, csShaderTagPresence presence,
    00183     int priority = 0) = 0;
    00188   virtual void GetTagOptions (csStringID tag, csShaderTagPresence& presence,
    00189     int& priority) = 0;
    00190
    00194   virtual const csSet<csStringID>& GetTags (csShaderTagPresence presence,
    00195     int& count) = 0;
    00196
    00201   virtual void SetActiveLights (const csArray<iLight*>& lights) = 0;
    00202
    00206   virtual const csArray<iLight*>& GetActiveLights () const = 0;
    00207 };
    00208
    00216 struct csShaderMetadata
    00217 {
    00219   char *description;
    00220
    00226   uint numberOfLights;
    00227
    00229   csShaderMetadata ()
    00230     : description (0), numberOfLights (0)
    00231   {}
    00232 };
    00233
    00238 struct iShader : public iShaderVariableContext
    00239 {
    00240   SCF_INTERFACE(iShader, 2, 0, 0);
    00241
    00243   virtual iObject* QueryObject () = 0;
    00244
    00246   virtual const char* GetFileName () = 0;
    00247
    00249   virtual void SetFileName (const char* filename) = 0;
    00250
    00261   virtual size_t GetTicket (const csRenderMeshModes& modes,
    00262     const csShaderVarStack& stacks) = 0;
    00263
    00265   virtual size_t GetNumberOfPasses (size_t ticket) = 0;
    00266
    00268   virtual bool ActivatePass (size_t ticket, size_t number) = 0;
    00269
    00271   virtual bool SetupPass (size_t ticket, const csRenderMesh *mesh,
    00272     csRenderMeshModes& modes,
    00273     const csShaderVarStack& stacks) = 0;
    00274
    00279   virtual bool TeardownPass (size_t ticket) = 0;
    00280
    00282   virtual bool DeactivatePass (size_t ticket) = 0;
    00283
    00285   virtual const csShaderMetadata& GetMetadata (size_t ticket) const = 0;
    00286 };
    00287
    00288
    00289 SCF_VERSION (iShaderPriorityList, 0,0,1);
    00293 struct iShaderPriorityList : public iBase
    00294 {
    00296   virtual size_t GetCount () const = 0;
    00298   virtual int GetPriority (size_t idx) const = 0;
    00299 };
    00300
    00301 SCF_VERSION (iShaderCompiler, 0,0,1);
    00307 struct iShaderCompiler : public virtual iBase
    00308 {
    00310   virtual const char* GetName() = 0;
    00311
    00320   virtual csPtr<iShader> CompileShader (iDocumentNode *templ,
    00321                   int forcepriority = -1) = 0;
    00322
    00324   virtual bool ValidateTemplate (iDocumentNode *templ) = 0;
    00325
    00327   virtual bool IsTemplateToCompiler (iDocumentNode *templ) = 0;
    00328
    00334   virtual csPtr<iShaderPriorityList> GetPriorities (
    00335                   iDocumentNode* templ) = 0;
    00336 };
    00337
    00338 #endif // __CS_IVIDEO_SHADER_H__