00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _OSGSHLCHUNK_H_
00040 #define _OSGSHLCHUNK_H_
00041 #ifdef __sgi
00042 #pragma once
00043 #endif
00044
00045 #include <OSGConfig.h>
00046
00047 #include <string>
00048 #include <vector>
00049 #include <map>
00050
00051 #include "OSGDrawActionBase.h"
00052 #include "OSGWindow.h"
00053
00054 #include <OSGSHLChunkBase.h>
00055
00056 OSG_BEGIN_NAMESPACE
00057
00062 class OSG_SYSTEMLIB_DLLMAPPING SHLChunk : public SHLChunkBase
00063 {
00064 private:
00065
00066 typedef SHLChunkBase Inherited;
00067
00068
00069 public:
00070
00071
00075 virtual const StateChunkClass * getClass (void) const;
00076
00078
00082 inline static UInt32 getStaticClassId (void);
00083 inline static const StateChunkClass * getStaticClass (void);
00084
00086
00090 virtual void changed(BitVector whichField,
00091 UInt32 origin );
00092
00094
00098 virtual void dump( UInt32 uiIndent = 0,
00099 const BitVector bvFlags = 0) const;
00100
00102
00106 static void updateParameterLocation(Window *win, GLuint program,
00107 const ShaderParameterPtr ¶meter);
00108
00109 void updateParameterLocations(Window *win,
00110 const MFShaderParameterPtr ¶meters);
00111
00112 void updateParameters(Window *win, const MFShaderParameterPtr ¶meters,
00113 bool useProgram = true, bool force = false,
00114 bool keepProgramActive = false);
00115
00116 void updateProgramParameters(Window *win);
00117
00119
00123 virtual void update ( DrawActionBase * action );
00124
00125 virtual void activate ( DrawActionBase * action, UInt32 index = 0 );
00126
00127 virtual void changeFrom ( DrawActionBase * action, StateChunk * old,
00128 UInt32 index = 0 );
00129
00130 virtual void deactivate ( DrawActionBase * action, UInt32 index = 0 );
00131
00133
00137 virtual Real32 switchCost ( StateChunk * chunk );
00138
00139 virtual bool operator < (const StateChunk &other) const;
00140
00141 virtual bool operator == (const StateChunk &other) const;
00142 virtual bool operator != (const StateChunk &other) const;
00143
00145
00149 typedef GLint (OSG_APIENTRY * OSGGLGETUNIFORMLOCATIONARBPROC)
00150 (GLuint programObj, const char *name);
00151
00152 typedef void (*parametercbfp) (OSGGLGETUNIFORMLOCATIONARBPROC getUniformLocation,
00153 DrawActionBase *action, GLuint program);
00154
00155 typedef void (*osgparametercbfp) (const ShaderParameterPtr ¶meter,
00156 DrawActionBase *action, GLuint program);
00157
00158 void addParameterCallback(const char *name, parametercbfp fp);
00159 void addParameterCallback(const char *name, osgparametercbfp fp);
00160
00161 static void setParameterCallback(parametercbfp fp);
00162
00164
00168 void addProgramParameter(GLenum name, UInt32 value);
00169 void subProgramParameter(GLenum name);
00170 void setProgramParameter(GLenum name, UInt32 value);
00171 UInt32 getProgramParameter(GLenum name);
00172 std::vector<std::pair<GLenum, UInt32> > getProgramParameters(void);
00173 void clearProgramParameters(void);
00174
00176
00180 static inline UInt32 getFuncUniform1i(void);
00181 static inline UInt32 getFuncUniform1iv(void);
00182 static inline UInt32 getFuncUniform2iv(void);
00183 static inline UInt32 getFuncUniform3iv(void);
00184 static inline UInt32 getFuncUniform4iv(void);
00185
00186 static inline UInt32 getFuncUniform1f(void);
00187 static inline UInt32 getFuncUniform1fv(void);
00188 static inline UInt32 getFuncUniform2fv(void);
00189 static inline UInt32 getFuncUniform3fv(void);
00190 static inline UInt32 getFuncUniform4fv(void);
00191
00192 static inline UInt32 getFuncUniformMatrix4fv(void);
00193
00194 static inline UInt32 getFuncGetUniformiv(void);
00195 static inline UInt32 getFuncGetUniformfv(void);
00196
00198
00202 static void setClusterId(Int32 id);
00203
00205
00206 protected:
00207
00208
00209
00210 void onCreate(const SHLChunk *source = NULL);
00211 void onDestroy(void);
00212
00213
00217 SHLChunk(void);
00218 SHLChunk(const SHLChunk &source);
00219
00221
00225 virtual ~SHLChunk(void);
00226
00229
00230 private:
00231
00232 friend class FieldContainer;
00233 friend class SHLChunkBase;
00234
00235
00236 static StateChunkClass _class;
00237
00238
00242 static UInt32 _shl_extension;
00243 static UInt32 _cg_extension;
00244 static UInt32 _geometry_extension;
00245
00246 static UInt32 _funcCreateProgramObject;
00247 static UInt32 _funcProgramParameteri;
00248 static UInt32 _funcCreateShaderObject;
00249 static UInt32 _funcDeleteObject;
00250 static UInt32 _funcDetachObject;
00251 static UInt32 _funcAttachObject;
00252
00253 static UInt32 _funcShaderSource;
00254 static UInt32 _funcCompileShader;
00255 static UInt32 _funcLinkProgram;
00256 static UInt32 _funcGetInfoLog;
00257 static UInt32 _funcUseProgramObject;
00258
00259 static UInt32 _funcGetObjectParameteriv;
00260 static UInt32 _funcGetObjectParameterfv;
00261 static UInt32 _funcGetUniformLocation;
00262
00263 static UInt32 _funcBindAttribLocation;
00264 static UInt32 _funcGetAttribLocation;
00265
00266 static UInt32 _funcUniform1i;
00267 static UInt32 _funcUniform1iv;
00268 static UInt32 _funcUniform2iv;
00269 static UInt32 _funcUniform3iv;
00270 static UInt32 _funcUniform4iv;
00271
00272 static UInt32 _funcUniform1f;
00273 static UInt32 _funcUniform1fv;
00274 static UInt32 _funcUniform2fv;
00275 static UInt32 _funcUniform3fv;
00276 static UInt32 _funcUniform4fv;
00277
00278 static UInt32 _funcUniformMatrix4fv;
00279
00280 static UInt32 _funcGetUniformiv;
00281 static UInt32 _funcGetUniformfv;
00282
00283 static Int32 _clusterId;
00284
00287 static void initMethod(void);
00288
00289 void handleGL(Window *win, UInt32 id);
00290
00291
00292 void operator =(const SHLChunk &source);
00293
00294 void updateProgram(Window *win);
00295 void checkOSGParameters(bool force = false);
00296 void updateOSGParameters(DrawActionBase *action, GLuint program,
00297 bool update = false);
00298
00299 static void updateWorldMatrix (const ShaderParameterPtr ¶meter,
00300 DrawActionBase *action, GLuint program);
00301 static void updateInvWorldMatrix (const ShaderParameterPtr ¶meter,
00302 DrawActionBase *action, GLuint program);
00303 static void updateTransInvWorldMatrix(const ShaderParameterPtr ¶meter,
00304 DrawActionBase *action, GLuint program);
00305 static void updateCameraOrientation (const ShaderParameterPtr ¶meter,
00306 DrawActionBase *action, GLuint program);
00307 static void updateCameraPosition (const ShaderParameterPtr ¶meter,
00308 DrawActionBase *action, GLuint program);
00309 static void updateViewMatrix (const ShaderParameterPtr ¶meter,
00310 DrawActionBase *action, GLuint program);
00311 static void updateInvViewMatrix (const ShaderParameterPtr ¶meter,
00312 DrawActionBase *action, GLuint program);
00313 static void updateStereoLeftEye (const ShaderParameterPtr ¶meter,
00314 DrawActionBase *action, GLuint program);
00315 static void updateClusterId (const ShaderParameterPtr ¶meter,
00316 DrawActionBase *action, GLuint program);
00317 static void updateActiveLightsMask (const ShaderParameterPtr ¶meter,
00318 DrawActionBase *action, GLuint program);
00319 static void updateLight0Active (const ShaderParameterPtr ¶meter,
00320 DrawActionBase *action, GLuint program);
00321 static void updateLight1Active (const ShaderParameterPtr ¶meter,
00322 DrawActionBase *action, GLuint program);
00323 static void updateLight2Active (const ShaderParameterPtr ¶meter,
00324 DrawActionBase *action, GLuint program);
00325 static void updateLight3Active (const ShaderParameterPtr ¶meter,
00326 DrawActionBase *action, GLuint program);
00327 static void updateLight4Active (const ShaderParameterPtr ¶meter,
00328 DrawActionBase *action, GLuint program);
00329 static void updateLight5Active (const ShaderParameterPtr ¶meter,
00330 DrawActionBase *action, GLuint program);
00331 static void updateLight6Active (const ShaderParameterPtr ¶meter,
00332 DrawActionBase *action, GLuint program);
00333 static void updateLight7Active (const ShaderParameterPtr ¶meter,
00334 DrawActionBase *action, GLuint program);
00335
00336 std::vector<std::pair<std::pair<parametercbfp, osgparametercbfp>,
00337 ShaderParameterPtr> > _osgParametersCallbacks;
00338
00339 UInt32 _oldParameterSize;
00340
00341 typedef std::map<std::string, std::pair<parametercbfp, osgparametercbfp> >
00342 userParameterCallbacksMap;
00343 userParameterCallbacksMap _userParameterCallbacks;
00344
00345 static parametercbfp _userParametersCallback;
00346 };
00347
00348 typedef SHLChunk *SHLChunkP;
00349
00350 OSG_END_NAMESPACE
00351
00352 #include <OSGSHLChunkBase.inl>
00353 #include <OSGSHLChunk.inl>
00354
00355 #define OSGSHLCHUNK_HEADER_CVSID "@(#)$Id: OSGSHLChunk.h,v 1.33 2007/03/09 18:11:48 a-m-z Exp $"
00356
00357 #endif