source: trunk/packages/vizservers/nanovis/NvShader.h @ 3452

Last change on this file since 3452 was 3452, checked in by ldelgass, 6 years ago

Remove XINETD define from nanovis. We only support server mode now, no glut
interaction loop with mouse/keyboard handlers. Fixes for trace logging to make
output closer to vtkvis: inlcude function name for trace messages, remove
newlines from format strings in macros since newlines get added by syslog.

  • 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", 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", 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", 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", 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.