00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __GZ_SHADER_H__
00023 #define __GZ_SHADER_H__
00024
00031 #include "gzObject.h"
00032 #include "gzMatrix.h"
00033 #include "gzImage.h"
00034
00035
00036 class gzContext;
00037 class gzGFXProgram;
00038 class gzState;
00039
00041 enum gzGFXProgramType {
00042 GZ_GFX_VERTEX_PROGRAM =0 ,
00043 GZ_GFX_GEOMETRY_PROGRAM =1 ,
00044 GZ_GFX_FRAGMENT_PROGRAM =2 ,
00045 GZ_GFX_SOFTWARE_PROGRAM =3 ,
00046 GZ_GFX_GLOBAL =4 ,
00047 };
00048
00049 const gzULong GZ_NUMBER_OF_GFX_PROGRAM_TYPES = 4;
00050
00051
00052
00053 const gzString GZ_GFX_GLOBAL_ENABLED_LIGHTS = "gz_EnabledLights";
00054 const gzString GZ_GFX_GLOBAL_ENABLED_LIGHT = "gz_EnabledLight";
00055 const gzString GZ_GFX_GLOBAL_RENDER_TIME = "gz_RenderTime";
00056 const gzString GZ_GFX_GLOBAL_RENDER_DAY = "gz_RenderDay";
00057 const gzString GZ_GFX_GLOBAL_WIN_WIDTH = "gz_WinWidth";
00058 const gzString GZ_GFX_GLOBAL_WIN_HEIGHT = "gz_WinHeight";
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 class gzParameterUpdateInfo
00075 {
00076 public:
00077
00078 gzParameterUpdateInfo():updateID(0),contextEnumerator(0xFFFFUL),attribIndexID(0){};
00079
00080 gzULong updateID;
00081 gzULong contextEnumerator;
00082 gzULong attribIndexID;
00083 };
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 class gzGFXProgramManager : public gzReference
00101 {
00102 public:
00103
00104 GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_GRAPH_EXPORT);
00105
00106 GZ_GRAPH_EXPORT virtual ~gzGFXProgramManager(){};
00107
00108 GZ_GRAPH_EXPORT gzULong getVersion() { return m_version; }
00109
00110 GZ_GRAPH_EXPORT virtual gzBool isManagerFor(gzGFXProgram *program)=0;
00111
00112 GZ_GRAPH_EXPORT virtual gzBool activate(gzContext *context,gzGFXProgram *program,gzGFXProgramType type)=0;
00113
00114 GZ_GRAPH_EXPORT virtual gzBool deactivate(gzContext *context,gzGFXProgram *program,gzGFXProgramType type)=0;
00115
00116 GZ_GRAPH_EXPORT virtual gzVoid cleanUpContext(gzContext *context){};
00117
00118 GZ_GRAPH_EXPORT virtual gzVoid resetProgram(gzGFXProgram *program){};
00119
00120 GZ_GRAPH_EXPORT virtual gzVoid deleteProgram(gzGFXProgram *program){};
00121
00122
00123
00124 GZ_GRAPH_EXPORT static gzVoid registerManager(gzGFXProgramManager *manager);
00125
00126 GZ_GRAPH_EXPORT static gzVoid unregisterManagers();
00127
00128 GZ_GRAPH_EXPORT static gzGFXProgramManager * getManagerForProgram(gzGFXProgram *program);
00129
00130 GZ_GRAPH_EXPORT static gzVoid cleanUpGFXData(gzContext *context);
00131
00132 protected:
00133
00134 GZ_GRAPH_EXPORT virtual gzVoid registerManager()=0;
00135
00136 static gzRefList<gzGFXProgramManager> s_registeredGFXProgramManagers;
00137
00138 gzULong m_version;
00139
00140 };
00141
00142 enum gzGFXProgramParameterType
00143 {
00144 GZ_GFX_PARAM_INTEGER,
00145 GZ_GFX_PARAM_FLOAT,
00146 GZ_GFX_PARAM_VEC2,
00147 GZ_GFX_PARAM_IVEC2,
00148 GZ_GFX_PARAM_VEC3,
00149 GZ_GFX_PARAM_IVEC3,
00150 GZ_GFX_PARAM_VEC4,
00151 GZ_GFX_PARAM_IVEC4,
00152 GZ_GFX_PARAM_MAT2,
00153 GZ_GFX_PARAM_MAT3,
00154 GZ_GFX_PARAM_MAT4
00155 };
00156
00157 union gzFloatInt
00158 {
00159 gzFloat fVal;
00160 gzInt iVal;
00161 };
00162
00163 class gzGFXProgramParameter : public gzReference
00164 {
00165 public:
00166
00167 virtual ~gzGFXProgramParameter(){}
00168
00169 gzString name;
00170 gzUInt position;
00171 gzBool usePosition;
00172 gzGFXProgramParameterType type;
00173
00174 gzArray<gzFloatInt> values;
00175 };
00176
00177 class gzGlobalGFXProgramParams
00178 {
00179 public:
00180
00181 gzRefList<gzGFXProgramParameter> params;
00182 gzDynamicArray<gzParameterUpdateInfo> updateInfo;
00183 };
00184
00185 class gzVertexAttributeIndex : public gzReference
00186 {
00187 public:
00188
00189 virtual ~gzVertexAttributeIndex(){};
00190
00191 gzString name;
00192 gzUInt index;
00193 };
00194
00195
00196
00197 const gzString GZ_GFX_PROGRAM_SETTINGS = "GZ_GFX_PROGRAM_SETTINGS";
00198
00199
00200
00201 const gzString GZ_GFX_GEOMETRY_PROGRAM_INPUT_TYPE = "GZ_GFX_GEOMETRY_PROGRAM_INPUT_TYPE";
00202 const gzString GZ_GFX_GEOMETRY_PROGRAM_OUTPUT_TYPE = "GZ_GFX_GEOMETRY_PROGRAM_OUTPUT_TYPE";
00203 const gzString GZ_GFX_GEOMETRY_PROGRAM_VERTICES_OUT = "GZ_GFX_GEOMETRY_PROGRAM_VERTICES_OUT";
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 class gzGFXProgram : public gzObject
00221 {
00222 public:
00223 GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_GRAPH_EXPORT);
00224
00225 GZ_GRAPH_EXPORT gzGFXProgram();
00226
00227 GZ_GRAPH_EXPORT virtual ~gzGFXProgram();
00228
00229 GZ_GRAPH_EXPORT virtual gzBool activate(gzContext *context,gzGFXProgramType type);
00230
00231 GZ_GRAPH_EXPORT virtual gzBool deactivate(gzContext *context,gzGFXProgramType type);
00232
00233
00234 GZ_GRAPH_EXPORT virtual gzReference* clone() const;
00235 GZ_GRAPH_EXPORT virtual gzBool useDeepCopy();
00236
00237
00238
00240 GZ_GRAPH_EXPORT gzVoid setProgramScript(const gzString &script);
00241
00243 GZ_GRAPH_EXPORT gzBool loadProgramScript(const gzString &url);
00244
00246 GZ_GRAPH_EXPORT const gzString & getProgramScript();
00247
00249 GZ_GRAPH_EXPORT gzGFXProgramManager *getCurrentManager() { return m_manager.get(); }
00250
00252 GZ_GRAPH_EXPORT gzBool hasError();
00253
00255 GZ_GRAPH_EXPORT const gzString & getError();
00256
00258 GZ_GRAPH_EXPORT gzInt getErrorPos();
00259
00261 GZ_GRAPH_EXPORT gzVoid setError(const gzString & error,gzInt pos);
00262
00263
00264 GZ_GRAPH_EXPORT gzVoid setManagerData(gzReference *data);
00265 GZ_GRAPH_EXPORT gzReference * getManagerData();
00266
00268 GZ_GRAPH_EXPORT gzVoid setFallbackProgram(gzGFXProgram *program);
00269 GZ_GRAPH_EXPORT gzGFXProgram * getFallbackProgram();
00270
00271
00272
00273 GZ_GRAPH_EXPORT gzVoid bindVertexAttribute(const gzString &name, gzUInt index);
00274 GZ_GRAPH_EXPORT gzUInt getVertexAttributeIndex(const gzString &name);
00275 GZ_GRAPH_EXPORT const gzRefList<gzVertexAttributeIndex> & getVertexAttributeIndexList();
00276
00277
00278
00279
00280 GZ_GRAPH_EXPORT gzVoid setLocalParameter(gzUInt index,const gzFloat &val,gzBool integer=FALSE);
00281 GZ_GRAPH_EXPORT gzVoid setLocalParameter(gzUInt index,const gzVec2 &val);
00282 GZ_GRAPH_EXPORT gzVoid setLocalParameter(gzUInt index,const gzVec3 &val);
00283 GZ_GRAPH_EXPORT gzVoid setLocalParameter(gzUInt index,const gzVec4 &val);
00284 GZ_GRAPH_EXPORT gzVoid setLocalParameter(gzUInt index,const gzMatrix2 &val);
00285 GZ_GRAPH_EXPORT gzVoid setLocalParameter(gzUInt index,const gzMatrix3 &val);
00286 GZ_GRAPH_EXPORT gzVoid setLocalParameter(gzUInt index,const gzMatrix4 &val);
00287
00288 GZ_GRAPH_EXPORT const gzGFXProgramParameter * getLocalParameter(gzUInt index,gzGFXProgramParameterType type, gzBool update=FALSE);
00289
00290 GZ_GRAPH_EXPORT const gzRefList<gzGFXProgramParameter> & getLocalParameterList();
00291
00292
00293
00294 GZ_GRAPH_EXPORT gzVoid setLocalParameter(const gzString &name,const gzFloat &val,gzBool integer=FALSE);
00295 GZ_GRAPH_EXPORT gzVoid setLocalParameter(const gzString &name,const gzVec2 &val);
00296 GZ_GRAPH_EXPORT gzVoid setLocalParameter(const gzString &name,const gzVec3 &val);
00297 GZ_GRAPH_EXPORT gzVoid setLocalParameter(const gzString &name,const gzVec4 &val);
00298 GZ_GRAPH_EXPORT gzVoid setLocalParameter(const gzString &name,const gzMatrix2 &val);
00299 GZ_GRAPH_EXPORT gzVoid setLocalParameter(const gzString &name,const gzMatrix3 &val);
00300 GZ_GRAPH_EXPORT gzVoid setLocalParameter(const gzString &name,const gzMatrix4 &val);
00301
00302 GZ_GRAPH_EXPORT const gzGFXProgramParameter * getLocalParameter(const gzString &name,gzGFXProgramParameterType type,gzBool update=FALSE);
00303
00304 GZ_GRAPH_EXPORT gzParameterUpdateInfo & getLocalUpdateInfo(gzULong contextID);
00305
00306 GZ_GRAPH_EXPORT gzVoid useGlobalProgramScripts(gzBool on);
00307 GZ_GRAPH_EXPORT gzBool useGlobalProgramScripts();
00308
00309
00310
00311 static GZ_GRAPH_EXPORT gzParameterUpdateInfo & getGlobalUpdateInfo(gzULong contextID,gzGFXProgramType type=GZ_GFX_GLOBAL);
00312
00313
00314
00315 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(gzUInt index,const gzFloat &val,gzBool integer=FALSE,gzGFXProgramType type=GZ_GFX_GLOBAL);
00316 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(gzUInt index,const gzVec2 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00317 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(gzUInt index,const gzVec3 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00318 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(gzUInt index,const gzVec4 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00319 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(gzUInt index,const gzMatrix2 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00320 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(gzUInt index,const gzMatrix3 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00321 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(gzUInt index,const gzMatrix4 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00322
00323 static GZ_GRAPH_EXPORT const gzGFXProgramParameter * getGlobalParameter(gzUInt index,gzGFXProgramParameterType type,gzGFXProgramType programType=GZ_GFX_GLOBAL,gzBool update=FALSE);
00324
00325 static GZ_GRAPH_EXPORT const gzRefList<gzGFXProgramParameter> & getGlobalParameterList(gzGFXProgramType type=GZ_GFX_GLOBAL);
00326
00327
00328
00329 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzFloat &val,gzBool integer=FALSE,gzGFXProgramType type=GZ_GFX_GLOBAL);
00330 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzVec2 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00331 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzVec3 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00332 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzVec4 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00333 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzMatrix2 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00334 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzMatrix3 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00335 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzMatrix4 &val,gzGFXProgramType type=GZ_GFX_GLOBAL);
00336 static GZ_GRAPH_EXPORT gzVoid setGlobalParameter(const gzString &name,const gzBool (&val)[8],gzGFXProgramType type=GZ_GFX_GLOBAL);
00337
00338 static GZ_GRAPH_EXPORT const gzGFXProgramParameter * getGlobalParameter(const gzString &name,gzGFXProgramParameterType type,gzGFXProgramType programType=GZ_GFX_GLOBAL,gzBool update=FALSE);
00339
00340
00341
00342 static GZ_GRAPH_EXPORT gzVoid setGlobalProgramScript(gzGFXProgramType type , gzULong index,const gzString &script);
00343 static GZ_GRAPH_EXPORT gzDynamicArray<gzString> & getGlobalProgramScripts(gzGFXProgramType type,gzBool update=FALSE);
00344 static GZ_GRAPH_EXPORT gzULong getGlobalProgramScriptUpdateID(gzGFXProgramType type);
00345
00346
00347
00348 static GZ_GRAPH_EXPORT gzGFXProgram *getProgram(const gzString &name,gzGFXProgramType type);
00349 static GZ_GRAPH_EXPORT gzVoid registerProgram(const gzString &name,gzGFXProgramType type,gzGFXProgram *program);
00350 static GZ_GRAPH_EXPORT gzVoid unregisterProgram(const gzString &name,gzGFXProgramType type,gzGFXProgram *program);
00351
00352 private:
00353
00354 gzString m_script;
00355
00356 gzRefPointer<gzGFXProgramManager> m_manager;
00357
00358 gzBool m_hasError:1;
00359
00360 gzBool m_useGlobalProgramScripts:1;
00361
00362 gzInt m_errorPos;
00363
00364 gzString m_error;
00365
00366 gzRefList<gzGFXProgramParameter> m_params;
00367
00368 gzRefList<gzVertexAttributeIndex> m_vertexAttributeIndex;
00369
00370 gzDynamicArray<gzParameterUpdateInfo> m_updateInfo;
00371
00372 gzRefPointer<gzReference> m_managerData;
00373
00374 gzRefPointer<gzGFXProgram> m_fallbackProgram;
00375
00376 static gzGlobalGFXProgramParams s_globalEnvParams[GZ_NUMBER_OF_GFX_PROGRAM_TYPES+1];
00377
00378 static gzDynamicArray<gzString> s_globalProgramScripts[GZ_NUMBER_OF_GFX_PROGRAM_TYPES];
00379
00380 static gzULong s_globalProgramScriptsUpdateID[GZ_NUMBER_OF_GFX_PROGRAM_TYPES];
00381
00382 static gzRefDict<gzString,gzGFXProgram> s_registeredPrograms[GZ_NUMBER_OF_GFX_PROGRAM_TYPES];
00383 };
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400 class gzGFXProgramManager_VFP_1 : public gzGFXProgramManager
00401 {
00402 public:
00403
00404 GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_GRAPH_EXPORT);
00405
00406 GZ_GRAPH_EXPORT gzGFXProgramManager_VFP_1();
00407
00408 GZ_GRAPH_EXPORT virtual ~gzGFXProgramManager_VFP_1();
00409
00410 GZ_GRAPH_EXPORT virtual gzBool isManagerFor(gzGFXProgram *program);
00411
00412 GZ_GRAPH_EXPORT virtual gzBool activate(gzContext *context,gzGFXProgram *program,gzGFXProgramType type);
00413
00414 GZ_GRAPH_EXPORT virtual gzBool deactivate(gzContext *context,gzGFXProgram *program,gzGFXProgramType type);
00415
00416 GZ_GRAPH_EXPORT virtual gzVoid cleanUpContext(gzContext *context);
00417
00418 GZ_GRAPH_EXPORT virtual gzVoid resetProgram(gzGFXProgram *program);
00419
00420 GZ_GRAPH_EXPORT virtual gzVoid deleteProgram(gzGFXProgram *program);
00421
00422 protected:
00423
00424 GZ_GRAPH_EXPORT virtual gzVoid registerManager();
00425
00426 private:
00427
00428 static gzQueue<gzUInt> s_deleteBindID;
00429
00430 static gzDynamicArray<gzParameterUpdateInfo> s_updateInfo[GZ_NUMBER_OF_GFX_PROGRAM_TYPES];
00431 };
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 class gzGFXProgramManager_GLSL_1 : public gzGFXProgramManager
00448 {
00449 public:
00450
00451 GZ_DECLARE_TYPE_INTERFACE_EXPORT(GZ_GRAPH_EXPORT);
00452
00453 GZ_GRAPH_EXPORT gzGFXProgramManager_GLSL_1();
00454
00455 GZ_GRAPH_EXPORT virtual ~gzGFXProgramManager_GLSL_1(){};
00456
00457 GZ_GRAPH_EXPORT virtual gzBool isManagerFor(gzGFXProgram *program);
00458
00459 GZ_GRAPH_EXPORT virtual gzBool activate(gzContext *context,gzGFXProgram *program,gzGFXProgramType type);
00460
00461 GZ_GRAPH_EXPORT virtual gzBool deactivate(gzContext *context,gzGFXProgram *program,gzGFXProgramType type);
00462
00463 GZ_GRAPH_EXPORT virtual gzVoid cleanUpContext(gzContext *context);
00464
00465 GZ_GRAPH_EXPORT virtual gzVoid resetProgram(gzGFXProgram *program);
00466
00467 GZ_GRAPH_EXPORT virtual gzVoid deleteProgram(gzGFXProgram *program);
00468
00469 protected:
00470
00471 GZ_GRAPH_EXPORT virtual gzVoid registerManager();
00472
00473 GZ_GRAPH_EXPORT gzVoid setUniform(gzInt index,gzGFXProgramParameter *parameter);
00474
00475 private:
00476
00477 static gzQueue<gzHandle> s_deleteHandles;
00478 };
00479
00480 GZ_GRAPH_EXPORT gzVoid gzInitializeGFXProgramManagers();
00481 GZ_GRAPH_EXPORT gzVoid gzUninitializeGFXProgramManagers();
00482
00483
00484
00485 const gzString GZ_ALPHA_NORMAL_VP = "GZ_ALPHA_NORMAL_VP";
00486
00487 const gzString GZ_PHONG_VP = "GZ_PHONG_VP";
00488 const gzString GZ_PHONG_FP = "GZ_PHONG_FP";
00489
00490
00491
00492 GZ_GRAPH_EXPORT gzState * gzGetBuiltInState_Phong();
00493
00494 #endif