source: branches/nanovis2/packages/vizservers/nanovis/NvShader.h @ 3007

Last change on this file since 3007 was 3007, checked in by ldelgass, 12 years ago

Cleanups, add (strict) equality operators to vector classes, add matrix uniform
setters for NvShader? (that don't use GL state), remove old camera define/code,
add method to set clipping range of camera based on bounds (not used yet),
remove camera aim command (use orient instead), add camera position command,
add cleanup to destroy objects in NanoVis::removeAllData(), don't precede image
command to client with newline.

  • Property svn:eol-style set to native
File size: 8.6 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2#ifndef NV_SHADER_H
3#define NV_SHADER_H
4
5#include <string>
6#include <tr1/unordered_map>
7
8#include <GL/glew.h>
9#include <Cg/cg.h>
10#include <Cg/cgGL.h>
11
12#include "Trace.h"
13
14class NvShader
15{
16public:
17    enum NvGLMatrix {
18        MODELVIEW_MATRIX = CG_GL_MODELVIEW_MATRIX,
19        PROJECTION_MATRIX = CG_GL_PROJECTION_MATRIX,
20        MODELVIEW_PROJECTION_MATRIX = CG_GL_MODELVIEW_PROJECTION_MATRIX
21    };
22    enum NvGLMatrixType {
23        MATRIX_IDENTITY = CG_GL_MATRIX_IDENTITY,
24        MATRIX_INVERSE = CG_GL_MATRIX_INVERSE
25    };
26
27    typedef void NvCgCallbackFunction(void);
28
29    NvShader();
30
31    virtual ~NvShader();
32
33    /**
34     * @brief create a Cg vertex program and load it
35     * @param fileName the name of Cg program file
36     * @param entryPoint a entry point of the Cg program
37     */
38    void loadVertexProgram(const char *fileName, const char *entryPoint);
39
40    /**
41     * @brief create a Cg fragment program and load it
42     * @param fileName the name of Cg program file
43     * @param entryPoint a entry point of the Cg program
44     */
45    void loadFragmentProgram(const char *fileName, const char *entryPoint);
46
47    CGparameter getNamedParameterFromFP(const char *paramName)
48    {
49        if (_cgFP) {
50            return cgGetNamedParameter(_cgFP, paramName);
51        }
52        ERROR("Unknown fragment program parameter: %s\n", paramName);
53        return 0;
54    }
55
56    CGparameter getNamedParameterFromVP(const char *paramName)
57    {
58        if (_cgVP) {
59            return cgGetNamedParameter(_cgVP, paramName);
60        }
61        ERROR("Unknown vertex program parameter: %s\n", paramName);
62        return 0;
63    }
64
65    void setVPParameter1f(const char *name, float val)
66    {
67        CGparameter param = getVPParam(name);
68        if (param == NULL)
69            return;
70        cgSetParameter1f(param, val);
71    }
72
73    void setFPParameter1f(const char *name, float val)
74    {
75        CGparameter param = getFPParam(name);
76        if (param == NULL)
77            return;
78        cgSetParameter1f(param, val);
79    }
80
81    void setVPParameter2f(const char *name, float val1, float val2)
82    {
83        CGparameter param = getVPParam(name);
84        if (param == NULL)
85            return;
86        cgSetParameter2f(param, val1, val2);
87    }
88
89    void setFPParameter2f(const char *name, float val1, float val2)
90    {
91        CGparameter param = getFPParam(name);
92        if (param == NULL)
93            return;
94        cgSetParameter2f(param, val1, val2);
95    }
96
97    void setVPParameter3f(const char *name, float val1, float val2, float val3)
98    {
99        CGparameter param = getVPParam(name);
100        if (param == NULL)
101            return;
102        cgSetParameter3f(param, val1, val2, val3);
103    }
104
105    void setFPParameter3f(const char *name, float val1, float val2, float val3)
106    {
107        CGparameter param = getFPParam(name);
108        if (param == NULL)
109            return;
110        cgSetParameter3f(param, val1, val2, val3);
111    }
112
113    void setVPParameter4f(const char *name, float val1, float val2, float val3, float val4)
114    {
115        CGparameter param = getVPParam(name);
116        if (param == NULL)
117            return;
118        cgSetParameter4f(param, val1, val2, val3, val4);
119    }
120
121    void setFPParameter4f(const char *name, float val1, float val2, float val3, float val4)
122    {
123        CGparameter param = getFPParam(name);
124        if (param == NULL)
125            return;
126        cgSetParameter4f(param, val1, val2, val3, val4);
127    }
128
129    void setVPMatrixParameterf(const char *name, float *mat)
130    {
131        CGparameter param = getVPParam(name);
132        if (param == NULL)
133            return;
134        cgSetMatrixParameterfc(param, mat);
135    }
136
137    void setFPMatrixParameterf(const char *name, float *mat)
138    {
139        CGparameter param = getFPParam(name);
140        if (param == NULL)
141            return;
142        cgSetMatrixParameterfc(param, mat);
143    }
144
145    void setVPTextureParameter(const char *name, GLuint texobj, bool enable = true)
146    {
147        CGparameter param = getVPParam(name);
148        if (param == NULL)
149            return;
150        cgGLSetTextureParameter(param, texobj);
151        if (enable)
152            cgGLEnableTextureParameter(param);
153    }
154
155    void setFPTextureParameter(const char *name, GLuint texobj, bool enable = true)
156    {
157        CGparameter param = getFPParam(name);
158        if (param == NULL)
159            return;
160        cgGLSetTextureParameter(param, texobj);
161        if (enable)
162            cgGLEnableTextureParameter(param);
163    }
164
165    void enableVPTextureParameter(const char *name)
166    {
167        CGparameter param = getVPParam(name);
168        if (param == NULL)
169            return;
170        cgGLEnableTextureParameter(param);
171    }
172
173    void enaableFPTextureParameter(const char *name)
174    {
175        CGparameter param = getFPParam(name);
176        if (param == NULL)
177            return;
178        cgGLEnableTextureParameter(param);
179    }
180
181    void disableVPTextureParameter(const char *name)
182    {
183        CGparameter param = getVPParam(name);
184        if (param == NULL)
185            return;
186        cgGLDisableTextureParameter(param);
187    }
188
189    void disableFPTextureParameter(const char *name)
190    {
191        CGparameter param = getFPParam(name);
192        if (param == NULL)
193            return;
194        cgGLDisableTextureParameter(param);
195    }
196
197    void setGLStateMatrixVPParameter(const char *name, NvGLMatrix matrix,
198                                     NvGLMatrixType type = MATRIX_IDENTITY)
199    {
200        CGparameter param = getVPParam(name);
201        if (param == NULL)
202            return;
203        cgGLSetStateMatrixParameter(param, (CGGLenum)matrix, (CGGLenum)type);
204    }
205
206    void setGLStateMatrixFPParameter(const char *name, NvGLMatrix matrix,
207                                     NvGLMatrixType type = MATRIX_IDENTITY)
208    {
209        CGparameter param = getFPParam(name);
210        if (param == NULL)
211            return;
212        cgGLSetStateMatrixParameter(param, (CGGLenum)matrix, (CGGLenum)type);
213    }
214
215    virtual void bind()
216    {
217        if (_cgVP) {
218            cgGLBindProgram(_cgVP);
219            enableVertexProfile();
220        }
221        if (_cgFP) {
222            cgGLBindProgram(_cgFP);
223            enableFragmentProfile();
224        }
225    }
226
227    virtual void unbind()
228    {
229        if (_cgVP)
230            disableVertexProfile();
231        if (_cgFP)
232            disableFragmentProfile();
233    }
234
235    void enableVertexProfile()
236    {
237        cgGLEnableProfile(_vertexProfile);
238    }
239
240    void disableVertexProfile()
241    {
242        cgGLDisableProfile(_vertexProfile);
243    }
244
245    void enableFragmentProfile()
246    {
247        cgGLEnableProfile(_fragmentProfile);
248    }
249
250    void disableFragmentProfile()
251    {
252        cgGLDisableProfile(_fragmentProfile);
253    }
254
255    static void initCg(CGprofile defaultVertexProfile = CG_PROFILE_VP40,
256                       CGprofile defaultFragmentProfile = CG_PROFILE_FP40);
257
258    static void exitCg();
259
260    static bool printErrorInfo();
261
262    static void setErrorCallback(NvCgCallbackFunction callback);
263
264    static CGcontext getCgContext()
265    {
266        return _cgContext;
267    }
268
269protected:
270    typedef std::tr1::unordered_map<std::string, CGparameter> ParameterHashmap;
271
272    CGprogram getVP()
273    {
274        return _cgVP;
275    }
276
277    CGprogram getFP()
278    {
279        return _cgFP;
280    }
281
282    CGparameter getVPParam(const char *name)
283    {
284        CGparameter param;
285        ParameterHashmap::iterator itr = _vpParams.find(name);
286        if (itr == _vpParams.end()) {
287            param = getNamedParameterFromVP(name);
288            if (param != NULL)
289                _vpParams[name] = param;
290            else
291                ERROR("Unknown vertex program parameter: %s\n", name);
292        } else {
293            param = itr->second;
294        }
295        return param;
296    }
297
298    CGparameter getFPParam(const char *name)
299    {
300        CGparameter param;
301        ParameterHashmap::iterator itr = _fpParams.find(name);
302        if (itr == _fpParams.end()) {
303            param = getNamedParameterFromFP(name);
304            if (param != NULL)
305                _fpParams[name] = param;
306            else
307                ERROR("Unknown fragment program parameter: %s\n", name);
308        } else {
309            param = itr->second;
310        }
311        return param;
312    }
313
314    void resetPrograms();
315
316    CGprofile _vertexProfile;
317    CGprofile _fragmentProfile;
318    std::string _vpFile;
319    CGprogram _cgVP;
320    std::string _fpFile;
321    CGprogram _cgFP;
322    ParameterHashmap _vpParams;
323    ParameterHashmap _fpParams;
324
325    static CGprofile _defaultVertexProfile;
326    static CGprofile _defaultFragmentProfile;
327    static CGcontext _cgContext;
328
329private:
330    static CGprogram
331    loadCgSourceProgram(CGcontext context, const char *filename,
332                        CGprofile profile, const char *entryPoint);
333};
334
335#endif
Note: See TracBrowser for help on using the repository browser.