aboutsummaryrefslogtreecommitdiff
path: root/Gem/develop/include/Gem/Utils/GLUtil.h
blob: fb15b250649f1bd4ef47403e51a17d00cf719ca2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*-----------------------------------------------------------------
LOG
    GEM - Graphics Environment for Multimedia

    GemGLUtil.h
       - contains functions for graphics
       - part of GEM

    Copyright (c) 1997-2000 Mark Danks. mark@danks.org
    Copyright (c) Günther Geiger. geiger@epy.co.at
    Copyright (c) 2001-2011 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at
    For information on usage and redistribution, and for a DISCLAIMER OF ALL
    WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.

-----------------------------------------------------------------*/

#ifndef _INCLUDE__GEM_UTILS_GLUTIL_H_
#define _INCLUDE__GEM_UTILS_GLUTIL_H_

#include "Gem/ExportDef.h"

/* for t_symbol/t_atom */
/* LATER get rid of that (std::string) */
struct _atom;
struct _symbol;
#include <string>

/* for GLenum */
#ifdef __EMSCRIPTEN__
#include "Gem/glew.h"
#else
#include "Gem/GemGL.h"
#endif
#include "Gem/Exception.h"


namespace gem
{
namespace utils
{
namespace gl
{
GEM_EXTERN extern GLenum        glReportError (bool verbose=true);
GEM_EXTERN extern int           getGLdefine(const char *name);
GEM_EXTERN extern int           getGLdefine(const struct _symbol *name);
GEM_EXTERN extern int           getGLdefine(const struct _atom *name);
GEM_EXTERN extern int           getGLbitfield(int argc,
    struct _atom *argv);



/* mapping between GLSL-program IDs and float */
/* this can also return different IDs for different contexts */
class GEM_EXTERN GLuintMap
{
public:
  GLuintMap(const std::string&name);
  virtual ~GLuintMap();
  GLuint get(float); // throws GemException
  /* map a GLuint to float; if float is 0, the new mapping is created,
   * else we just update an existing one
   * updating is especially useful with multiple contexts */
  float set(GLuint, float f=0);

  void del(float);


  /* usage:
     mapper=GLuintMap("glsl_program");
     prog=glCreateProgram();
     progMapped=mapper.set(prog);
     // for multi-context, you probably want to have a single float map to multiple
     // programIDs; you add (or update) an existing mapping with:
     //    progMapped=mapper.set(prog, progMapped));
     outlet_float(m_out, mapper.get(progMapped));

     // ... somewhere else
     mapper=GLuintMap("glsl_program");
     GLuint id = mapper.get(atom_getfloat(ap));
  */

  /* multi-context:
       mapper=GLuintMap("glsl_program");
       float progF=0;
       switchContext(A);
       prog=glCreateProgram();
       progF=mapper.set(prog, progF);
       print(prog,progF); // "3" "3.1415"
       switchContext(B);
       prog=glCreateProgram();
       progF=mapper.set(prog, progF);
       print(prog,progF); // "6" "3.1415"

       // ...somewhere else
       mapper=GLuintMap("glsl_program");
       prog=mapper.get(progF);
       print(prog,progF); // "3" "3.1415"
       switchContext(B);
       prog=mapper.get(progF);
       print(prog,progF); // "6" "3.1415"
  */
private:
  struct PIMPL;
  PIMPL*m_pimpl;
  GLuintMap();
  GLuintMap&operator=(const GLuintMap&);
};
};
};
}; /* namespace */

#endif  // for header file