aboutsummaryrefslogtreecommitdiff
path: root/Gem/develop/include/Gem/Utils/GLUtil.h
blob: 16fa4925a0214d3a6bbe01ea71ebd0069c626853 (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
/*-----------------------------------------------------------------
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 */
#include "Gem/GemGL.h"
#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