1 #ifndef COIN_SOSHADERPARAMETER_H
2 #define COIN_SOSHADERPARAMETER_H
3 
4 /**************************************************************************\
5  * Copyright (c) Kongsberg Oil & Gas Technologies AS
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are
10  * met:
11  *
12  * Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution.
18  *
19  * Neither the name of the copyright holder nor the names of its
20  * contributors may be used to endorse or promote products derived from
21  * this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 \**************************************************************************/
35 
36 #include <Inventor/nodes/SoNode.h>
37 #include <Inventor/nodes/SoSubNode.h>
38 #include <Inventor/fields/SoSFString.h>
39 #include <Inventor/fields/SoSFFloat.h>
40 #include <Inventor/fields/SoSFInt32.h>
41 #include <Inventor/fields/SoSFVec2f.h>
42 #include <Inventor/fields/SoSFVec3f.h>
43 #include <Inventor/fields/SoSFVec4f.h>
44 #include <Inventor/fields/SoMFFloat.h>
45 #include <Inventor/fields/SoMFInt32.h>
46 #include <Inventor/fields/SoMFVec2f.h>
47 #include <Inventor/fields/SoMFVec3f.h>
48 #include <Inventor/fields/SoMFVec4f.h>
49 #include <Inventor/fields/SoSFMatrix.h>
50 #include <Inventor/fields/SoMFMatrix.h>
51 #include <Inventor/fields/SoSFNode.h>
52 #include <Inventor/fields/SoSFEnum.h>
53 #include <Inventor/fields/SoSFImage.h>
54 
55 #include <Inventor/fields/SoSFVec2i32.h>
56 #include <Inventor/fields/SoSFVec3i32.h>
57 #include <Inventor/fields/SoSFVec4i32.h>
58 #include <Inventor/fields/SoMFVec2i32.h>
59 #include <Inventor/fields/SoMFVec3i32.h>
60 #include <Inventor/fields/SoMFVec4i32.h>
61 
62 class SoGLShaderParameter;
63 class SoGLShaderObject;
64 class SoState;
65 
66 // *************************************************************************
67 
68 // FIXME: split to one header file for each class? 20050120 mortene.
69 
70 /* **************************************************************************
71  * *** SoShaderParameter ***
72  * **************************************************************************/
73 
74 class COIN_DLL_API SoShaderParameter : public SoNode {
75   typedef SoNode inherited;
76   SO_NODE_ABSTRACT_HEADER(SoShaderParameter);
77 
78 public:
79   SoSFString name;
80   SoSFInt32 identifier;
81 
82   SoINTERNAL public:
83   static void initClass();
84 
85 protected:
86   SoShaderParameter();
87   virtual ~SoShaderParameter();
88 };
89 
90 /* **************************************************************************
91  * *** SoUniformShaderParameter ***
92  * **************************************************************************/
93 class SoUniformShaderParameterP;
94 
95 class COIN_DLL_API SoUniformShaderParameter : public SoShaderParameter {
96   typedef SoShaderParameter inherited;
97   SO_NODE_ABSTRACT_HEADER(SoUniformShaderParameter);
98 
99   SoINTERNAL public:
100   static void initClass(void);
101   virtual void updateParameter(SoGLShaderObject *shaderObject) = 0;
102 
103 protected:
104   SoUniformShaderParameter();
105   virtual ~SoUniformShaderParameter();
106 
107   SoGLShaderParameter * getGLShaderParameter(const uint32_t cachecontext);
108   void ensureParameter(SoGLShaderObject * shader);
109 
110 private:
111   SoUniformShaderParameterP * pimpl;
112 };
113 
114 /* **************************************************************************
115  * *** SoShaderParameter1f ***
116  * **************************************************************************/
117 
118 class COIN_DLL_API SoShaderParameter1f : public SoUniformShaderParameter {
119   typedef SoUniformShaderParameter inherited;
120   SO_NODE_HEADER(SoShaderParameter1f);
121 
122 public:
123   SoSFFloat value;
124   SoShaderParameter1f();
125 
126   SoINTERNAL public:
127   static void initClass();
128   virtual void updateParameter(SoGLShaderObject *shaderObject);
129 
130 protected:
131   virtual ~SoShaderParameter1f();
132 };
133 
134 /* **************************************************************************
135  * *** SoShaderParameter1i ***
136  * **************************************************************************/
137 
138 class COIN_DLL_API SoShaderParameter1i : public SoUniformShaderParameter {
139   typedef SoUniformShaderParameter inherited;
140   SO_NODE_HEADER(SoShaderParameter1i);
141 
142 public:
143   SoSFInt32 value;
144   SoShaderParameter1i();
145 
146   SoINTERNAL public:
147   static void initClass();
148   virtual void updateParameter(SoGLShaderObject *shaderObject);
149 
150 protected:
151   virtual ~SoShaderParameter1i();
152 };
153 
154 /* **************************************************************************
155  * *** SoShaderParameter2f ***
156  * **************************************************************************/
157 
158 class COIN_DLL_API SoShaderParameter2f : public SoUniformShaderParameter {
159   typedef SoUniformShaderParameter inherited;
160   SO_NODE_HEADER(SoShaderParameter2f);
161 
162 public:
163   SoSFVec2f value;
164   SoShaderParameter2f();
165 
166   SoINTERNAL public:
167   static void initClass();
168   virtual void updateParameter(SoGLShaderObject *shaderObject);
169 
170 protected:
171   virtual ~SoShaderParameter2f();
172 };
173 
174 /* **************************************************************************
175  * *** SoShaderParameter2i ***
176  * **************************************************************************/
177 
178 class COIN_DLL_API SoShaderParameter2i : public SoUniformShaderParameter {
179   typedef SoUniformShaderParameter inherited;
180   SO_NODE_HEADER(SoShaderParameter2i);
181 
182 public:
183   SoSFVec2i32 value;
184   SoShaderParameter2i();
185 
186   SoINTERNAL public:
187   static void initClass();
188   virtual void updateParameter(SoGLShaderObject *shaderObject);
189 
190 protected:
191   virtual ~SoShaderParameter2i();
192 };
193 
194 /* **************************************************************************
195  * *** SoShaderParameter3f ***
196  * **************************************************************************/
197 
198 class COIN_DLL_API SoShaderParameter3f : public SoUniformShaderParameter {
199   typedef SoUniformShaderParameter inherited;
200   SO_NODE_HEADER(SoShaderParameter3f);
201 
202 public:
203   SoSFVec3f value;
204 
205   SoShaderParameter3f();
206 
207   SoINTERNAL public:
208   static void initClass();
209   virtual void updateParameter(SoGLShaderObject *shaderObject);
210 
211 protected:
212   virtual ~SoShaderParameter3f();
213 };
214 
215 /* **************************************************************************
216  * *** SoShaderParameter3i ***
217  * **************************************************************************/
218 
219 class COIN_DLL_API SoShaderParameter3i : public SoUniformShaderParameter {
220   typedef SoUniformShaderParameter inherited;
221   SO_NODE_HEADER(SoShaderParameter3i);
222 
223 public:
224   SoSFVec3i32 value;
225 
226   SoShaderParameter3i();
227 
228   SoINTERNAL public:
229   static void initClass();
230   virtual void updateParameter(SoGLShaderObject *shaderObject);
231 
232 protected:
233   virtual ~SoShaderParameter3i();
234 };
235 
236 /* **************************************************************************
237  * *** SoShaderParameter4f ***
238  * **************************************************************************/
239 
240 class COIN_DLL_API SoShaderParameter4f : public SoUniformShaderParameter {
241   typedef SoUniformShaderParameter inherited;
242   SO_NODE_HEADER(SoShaderParameter4f);
243 
244 public:
245   SoSFVec4f value;
246 
247   SoShaderParameter4f();
248 
249   SoINTERNAL public:
250   static void initClass();
251   virtual void updateParameter(SoGLShaderObject *shaderObject);
252 
253 protected:
254   virtual ~SoShaderParameter4f();
255 };
256 
257 /* **************************************************************************
258  * *** SoShaderParameter4i ***
259  * **************************************************************************/
260 
261 class COIN_DLL_API SoShaderParameter4i : public SoUniformShaderParameter {
262   typedef SoUniformShaderParameter inherited;
263   SO_NODE_HEADER(SoShaderParameter4i);
264 
265 public:
266   SoSFVec4i32 value;
267 
268   SoShaderParameter4i();
269 
270   SoINTERNAL public:
271   static void initClass();
272   virtual void updateParameter(SoGLShaderObject *shaderObject);
273 
274 protected:
275   virtual ~SoShaderParameter4i();
276 };
277 
278 /* **************************************************************************
279  * *** SoShaderParameterArray1f ***
280  * **************************************************************************/
281 
282 class COIN_DLL_API SoShaderParameterArray1f : public SoUniformShaderParameter {
283   typedef SoUniformShaderParameter inherited;
284   SO_NODE_HEADER(SoShaderParameterArray1f);
285 
286 public:
287   SoMFFloat value;
288 
289   SoShaderParameterArray1f();
290 
291   SoINTERNAL public:
292   static void initClass();
293   virtual void updateParameter(SoGLShaderObject *shaderObject);
294 
295 protected:
296   virtual ~SoShaderParameterArray1f();
297 };
298 
299 /* **************************************************************************
300  * *** SoShaderParameterArray1i ***
301  * **************************************************************************/
302 
303 class COIN_DLL_API SoShaderParameterArray1i : public SoUniformShaderParameter {
304   typedef SoUniformShaderParameter inherited;
305   SO_NODE_HEADER(SoShaderParameterArray1i);
306 
307 public:
308   SoMFInt32 value;
309 
310   SoShaderParameterArray1i();
311 
312   SoINTERNAL public:
313   static void initClass();
314   virtual void updateParameter(SoGLShaderObject *shaderObject);
315 
316 protected:
317   virtual ~SoShaderParameterArray1i();
318 };
319 
320 /* **************************************************************************
321  * *** SoShaderParameterArray2f ***
322  * **************************************************************************/
323 
324 class COIN_DLL_API SoShaderParameterArray2f : public SoUniformShaderParameter {
325   typedef SoUniformShaderParameter inherited;
326   SO_NODE_HEADER(SoShaderParameterArray2f);
327 
328 public:
329   SoMFVec2f value;
330 
331   SoShaderParameterArray2f();
332 
333   SoINTERNAL public:
334   static void initClass();
335   virtual void updateParameter(SoGLShaderObject *shaderObject);
336 
337 protected:
338   virtual ~SoShaderParameterArray2f();
339 };
340 
341 /* **************************************************************************
342  * *** SoShaderParameterArray2i ***
343  * **************************************************************************/
344 class COIN_DLL_API SoShaderParameterArray2i : public SoUniformShaderParameter {
345   typedef SoUniformShaderParameter inherited;
346   SO_NODE_HEADER(SoShaderParameterArray2i);
347 
348 public:
349   SoMFVec2i32 value;
350 
351   SoShaderParameterArray2i();
352 
353   SoINTERNAL public:
354   static void initClass();
355   virtual void updateParameter(SoGLShaderObject *shaderObject);
356 
357 protected:
358   virtual ~SoShaderParameterArray2i();
359 };
360 
361 /* **************************************************************************
362  * *** SoShaderParameterArray3f ***
363  * **************************************************************************/
364 
365 class COIN_DLL_API SoShaderParameterArray3f : public SoUniformShaderParameter {
366   typedef SoUniformShaderParameter inherited;
367   SO_NODE_HEADER(SoShaderParameterArray3f);
368 
369 public:
370   SoMFVec3f value;
371 
372   SoShaderParameterArray3f();
373 
374   SoINTERNAL public:
375   static void initClass();
376   virtual void updateParameter(SoGLShaderObject *shaderObject);
377 
378 protected:
379   virtual ~SoShaderParameterArray3f();
380 };
381 
382 /* **************************************************************************
383  * *** SoShaderParameterArray3i ***
384  * **************************************************************************/
385 
386 class COIN_DLL_API SoShaderParameterArray3i : public SoUniformShaderParameter {
387   typedef SoUniformShaderParameter inherited;
388   SO_NODE_HEADER(SoShaderParameterArray3i);
389 
390 public:
391   SoMFVec3i32 value;
392 
393   SoShaderParameterArray3i();
394 
395   SoINTERNAL public:
396   static void initClass();
397   virtual void updateParameter(SoGLShaderObject *shaderObject);
398 
399 protected:
400   virtual ~SoShaderParameterArray3i();
401 };
402 
403 /* **************************************************************************
404  * *** SoShaderParameterArray4f ***
405  * **************************************************************************/
406 
407 class COIN_DLL_API SoShaderParameterArray4f : public SoUniformShaderParameter {
408   typedef SoUniformShaderParameter inherited;
409   SO_NODE_HEADER(SoShaderParameterArray4f);
410 
411 public:
412   SoMFVec4f value;
413 
414   SoShaderParameterArray4f();
415 
416   SoINTERNAL public:
417   static void initClass();
418   virtual void updateParameter(SoGLShaderObject *shaderObject);
419 
420 protected:
421   virtual ~SoShaderParameterArray4f();
422 
423 };
424 
425 /* **************************************************************************
426  * *** SoShaderParameterArray4i ***
427  * **************************************************************************/
428 
429 class COIN_DLL_API SoShaderParameterArray4i : public SoUniformShaderParameter {
430   typedef SoUniformShaderParameter inherited;
431   SO_NODE_HEADER(SoShaderParameterArray4i);
432 
433 public:
434   SoMFVec4i32 value;
435 
436   SoShaderParameterArray4i();
437 
438   SoINTERNAL public:
439   static void initClass();
440   virtual void updateParameter(SoGLShaderObject *shaderObject);
441 
442 protected:
443   virtual ~SoShaderParameterArray4i();
444 };
445 
446 /* **************************************************************************
447  * *** SoShaderParameterMatrix ***
448  * **************************************************************************/
449 
450 class COIN_DLL_API SoShaderParameterMatrix : public SoUniformShaderParameter {
451   typedef SoUniformShaderParameter inherited;
452   SO_NODE_HEADER(SoShaderParameterMatrix);
453 
454 public:
455   SoSFMatrix value;
456 
457   SoShaderParameterMatrix();
458 
459   SoINTERNAL public:
460   static void initClass();
461   virtual void updateParameter(SoGLShaderObject *shaderObject);
462 
463 protected:
464   virtual ~SoShaderParameterMatrix();
465 };
466 
467 /* **************************************************************************
468  * *** SoShaderParameterMatrixArray ***
469  * **************************************************************************/
470 
471 class COIN_DLL_API SoShaderParameterMatrixArray : public SoUniformShaderParameter {
472   typedef SoUniformShaderParameter inherited;
473   SO_NODE_HEADER(SoShaderParameterMatrixArray);
474 
475 public:
476   SoMFMatrix value;
477 
478   SoShaderParameterMatrixArray();
479 
480   SoINTERNAL public:
481   static void initClass();
482   virtual void updateParameter(SoGLShaderObject *shaderObject);
483 
484 protected:
485   virtual ~SoShaderParameterMatrixArray();
486 };
487 
488 /* **************************************************************************
489  * *** SoShaderStateMatrixParameter ***
490  * **************************************************************************/
491 
492 class COIN_DLL_API SoShaderStateMatrixParameter : public SoUniformShaderParameter {
493   typedef SoUniformShaderParameter inherited;
494   SO_NODE_HEADER(SoShaderStateMatrixParameter);
495 
496 public:
497 
498   enum MatrixType {
499     MODELVIEW,
500     PROJECTION,
501     TEXTURE,
502     MODELVIEW_PROJECTION
503   };
504 
505   enum MatrixTransform{
506     IDENTITY,
507     TRANSPOSE,
508     INVERSE,
509     INVERSE_TRANSPOSE
510   };
511 
512   SoSFEnum matrixType;
513   SoSFEnum matrixTransform;
514 
515   SoShaderStateMatrixParameter();
516   virtual ~SoShaderStateMatrixParameter();
517 
518   static void initClass(void);
519   virtual void updateParameter(SoGLShaderObject *shaderObject);
520   virtual void updateValue(SoState *state);
521 
522 protected:
523   // Unlike in other parameter classes, here value is not a field because
524   // it is updated dynamically from the state.
525   SbMatrix value;
526 };
527 
528 #endif /* ! COIN_SOSHADERPARAMETER_H */
529