File: utility.hpp

package info (click to toggle)
ares 134%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 34,680 kB
  • sloc: cpp: 338,717; ansic: 89,036; sh: 52; makefile: 27
file content (109 lines) | stat: -rw-r--r-- 3,683 bytes parent folder | download
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
static auto glrSize(u32 size) -> u32 {
  return size;
//return bit::round(size);  //return nearest power of two
}

static auto glrFormat(const string& format) -> GLuint {
  if(format == "r32i"   ) return GL_R32I;
  if(format == "r32ui"  ) return GL_R32UI;
  if(format == "rgba8"  ) return GL_RGBA8;
  if(format == "rgb10a2") return GL_RGB10_A2;
  if(format == "rgba12" ) return GL_RGBA12;
  if(format == "rgba16" ) return GL_RGBA16;
  if(format == "rgba16f") return GL_RGBA16F;
  if(format == "rgba32f") return GL_RGBA32F;
  return GL_RGBA8;
}

static auto glrFilter(const string& filter) -> GLuint {
  if(filter == "nearest") return GL_NEAREST;
  if(filter == "linear" ) return GL_LINEAR;
  return GL_LINEAR;
}

static auto glrWrap(const string& wrap)  -> GLuint {
  if(wrap == "border") return GL_CLAMP_TO_BORDER;
  if(wrap == "edge"  ) return GL_CLAMP_TO_EDGE;
  if(wrap == "repeat") return GL_REPEAT;
  return GL_CLAMP_TO_BORDER;
}

static auto glrModulo(u32 modulo) -> u32 {
  if(modulo) return modulo;
  return 300;  //divisible by 2, 3, 4, 5, 6, 10, 12, 15, 20, 25, 30, 50, 60, 100, 150
}

static auto glrProgram() -> GLuint {
  GLuint program = 0;
  glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&program);
  return program;
}

static auto glrUniform1i(const string& name, GLint value) -> void {
  GLint location = glGetUniformLocation(glrProgram(), name);
  glUniform1i(location, value);
}

static auto glrUniform4f(const string& name, GLfloat value0, GLfloat value1, GLfloat value2, GLfloat value3) -> void {
  GLint location = glGetUniformLocation(glrProgram(), name);
  glUniform4f(location, value0, value1, value2, value3);
}

static auto glrUniformMatrix4fv(const string& name, GLfloat* values) -> void {
  GLint location = glGetUniformLocation(glrProgram(), name);
  glUniformMatrix4fv(location, 1, GL_FALSE, values);
}

static auto glrParameters(GLuint filter, GLuint wrap) -> void {
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap);
}

static auto glrCreateShader(GLuint program, GLuint type, const char* source) -> GLuint {
  GLuint shader = glCreateShader(type);
  glShaderSource(shader, 1, &source, 0);
  glCompileShader(shader);
  GLint result = GL_FALSE;
  glGetShaderiv(shader, GL_COMPILE_STATUS, &result);
  if(result == GL_FALSE) {
    GLint length = 0;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
    string text;
    text.resize(length);
    glGetShaderInfoLog(shader, length, &length, text.get());
    text.resize(length);
    print("[ruby::OpenGL: shader compiler error]\n", text, "\n\n");
    return 0;
  }
  glAttachShader(program, shader);
  return shader;
}

static auto glrLinkProgram(GLuint program) -> void {
  glLinkProgram(program);
  GLint result = GL_FALSE;
  glGetProgramiv(program, GL_LINK_STATUS, &result);
  if(result == GL_FALSE) {
    GLint length = 0;
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
    string text;
    text.resize(length);
    glGetProgramInfoLog(program, length, &length, text.get());
    text.resize(length);
    print("[ruby::OpenGL: shader linker error]\n", text, "\n\n");
  }
  glValidateProgram(program);
  result = GL_FALSE;
  glGetProgramiv(program, GL_VALIDATE_STATUS, &result);
  if(result == GL_FALSE) {
    GLint length = 0;
    glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
    string text;
    text.resize(length);
    glGetProgramInfoLog(program, length, &length, text.get());
    text.resize(length);
    print("[ruby::OpenGL: shader validation error]\n", text, "\n\n");
  }
}