model loading, cubemap, skybox
This commit is contained in:
parent
954075bd4f
commit
3c6254ece3
28 changed files with 10202 additions and 879 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
assets/fish.png
BIN
assets/fish.png
Binary file not shown.
Before Width: | Height: | Size: 7.2 KiB |
BIN
assets/fish.qoi
BIN
assets/fish.qoi
Binary file not shown.
|
@ -5,6 +5,7 @@ project(
|
||||||
)
|
)
|
||||||
|
|
||||||
glfw3_dep = dependency('glfw3')
|
glfw3_dep = dependency('glfw3')
|
||||||
|
assimp_dep = dependency('assimp')
|
||||||
incdir = include_directories(['src', 'src/vendor'])
|
incdir = include_directories(['src', 'src/vendor'])
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
|
@ -12,8 +13,12 @@ executable(
|
||||||
'./src/common.cpp',
|
'./src/common.cpp',
|
||||||
'./src/shader.cpp',
|
'./src/shader.cpp',
|
||||||
'./src/camera.cpp',
|
'./src/camera.cpp',
|
||||||
|
'./src/stb_image_impl.cpp',
|
||||||
|
'./src/texture.cpp',
|
||||||
|
'./src/mesh.cpp',
|
||||||
|
'./src/primitives.cpp',
|
||||||
'./src/main.cpp',
|
'./src/main.cpp',
|
||||||
'./src/vendor/glad/glad.c',
|
'./src/vendor/glad/glad.c',
|
||||||
include_directories : incdir,
|
include_directories : incdir,
|
||||||
dependencies : [glfw3_dep]
|
dependencies : [glfw3_dep, assimp_dep]
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#version 330 core
|
#version 430 core
|
||||||
out vec4 FragColor;
|
out vec4 FragColor;
|
||||||
|
|
||||||
in vec3 Normal;
|
in vec3 Normal;
|
||||||
|
@ -6,8 +6,8 @@ in vec3 FragPos;
|
||||||
in vec2 TexCoords;
|
in vec2 TexCoords;
|
||||||
|
|
||||||
struct Material {
|
struct Material {
|
||||||
sampler2D diffuse;
|
sampler2D texture_diffuse1;
|
||||||
sampler2D specular;
|
sampler2D texture_specular1;
|
||||||
float shininess;
|
float shininess;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -64,9 +64,9 @@ vec3 ComputeDirectionalLight(DirectionalLight light, vec3 norm, vec3 viewDir)
|
||||||
float diff = max(dot(norm, lightDir), 0.0);
|
float diff = max(dot(norm, lightDir), 0.0);
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
||||||
|
|
||||||
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
|
vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords));
|
||||||
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
|
vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords));
|
||||||
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
|
vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords));
|
||||||
|
|
||||||
return (ambient + diffuse + specular);
|
return (ambient + diffuse + specular);
|
||||||
}
|
}
|
||||||
|
@ -82,9 +82,9 @@ vec3 ComputePointLight(PointLight light, vec3 norm, vec3 viewDir, vec3 fragPos)
|
||||||
float diff = max(dot(norm, lightDir), 0.0);
|
float diff = max(dot(norm, lightDir), 0.0);
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
||||||
|
|
||||||
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
|
vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords));
|
||||||
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
|
vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords));
|
||||||
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
|
vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords));
|
||||||
|
|
||||||
return (ambient * attenuation + diffuse * attenuation + specular * attenuation);
|
return (ambient * attenuation + diffuse * attenuation + specular * attenuation);
|
||||||
}
|
}
|
||||||
|
@ -103,9 +103,9 @@ vec3 ComputeSpotLight(SpotLight light, vec3 norm, vec3 viewDir, vec3 fragPos) {
|
||||||
float diff = max(dot(norm, lightDir), 0.0);
|
float diff = max(dot(norm, lightDir), 0.0);
|
||||||
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);
|
||||||
|
|
||||||
vec3 ambient = light.ambient * vec3(texture(material.diffuse, TexCoords));
|
vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords));
|
||||||
vec3 diffuse = light.diffuse * diff * vec3(texture(material.diffuse, TexCoords));
|
vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords));
|
||||||
vec3 specular = light.specular * spec * vec3(texture(material.specular, TexCoords));
|
vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords));
|
||||||
|
|
||||||
// we leave ambient alone so there's always a little light
|
// we leave ambient alone so there's always a little light
|
||||||
return ((ambient * attenuation) + (diffuse * intensity * attenuation) + (specular * intensity * attenuation));
|
return ((ambient * attenuation) + (diffuse * intensity * attenuation) + (specular * intensity * attenuation));
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#version 330 core
|
#version 430 core
|
||||||
layout (location = 0) in vec3 aPos;
|
layout (location = 0) in vec3 aPos;
|
||||||
layout (location = 1) in vec3 aNormal;
|
layout (location = 1) in vec3 aNormal;
|
||||||
layout (location = 2) in vec2 aTexCoords;
|
layout (location = 2) in vec2 aTexCoords;
|
||||||
|
|
12
shaders/skybox_fragment.glsl
Normal file
12
shaders/skybox_fragment.glsl
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#version 430 core
|
||||||
|
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
in vec3 TexCoords;
|
||||||
|
|
||||||
|
uniform samplerCube texture_cubemap1;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
FragColor = texture(texture_cubemap1, TexCoords);
|
||||||
|
}
|
15
shaders/skybox_vertex.glsl
Normal file
15
shaders/skybox_vertex.glsl
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#version 430 core
|
||||||
|
layout (location = 0) in vec3 aPos;
|
||||||
|
|
||||||
|
out vec3 TexCoords;
|
||||||
|
|
||||||
|
uniform mat4 view;
|
||||||
|
uniform mat4 projection;
|
||||||
|
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 pos = projection * view * vec4(aPos, 1.0);
|
||||||
|
gl_Position = pos.xyww;
|
||||||
|
TexCoords = aPos;
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
|
||||||
|
|
||||||
Errno read_entire_file(FILE *f, char **out_data)
|
Errno read_entire_file(FILE *f, char **out_data, bool null_terminate)
|
||||||
{
|
{
|
||||||
long saved = ftell(f);
|
long saved = ftell(f);
|
||||||
if (saved < 0) return errno;
|
if (saved < 0) return errno;
|
||||||
|
@ -24,7 +24,7 @@ Errno read_entire_file(FILE *f, char **out_data)
|
||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
data[size] = 0;
|
if (null_terminate) data[size] = 0;
|
||||||
*out_data = data;
|
*out_data = data;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -5,4 +5,4 @@
|
||||||
typedef int Errno;
|
typedef int Errno;
|
||||||
|
|
||||||
|
|
||||||
Errno read_entire_file(FILE *f, char **out_data);
|
Errno read_entire_file(FILE *f, char **out_data, bool null_terminate);
|
||||||
|
|
7
src/defer.hpp
Normal file
7
src/defer.hpp
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include "scope_guard.hpp"
|
||||||
|
|
||||||
|
#define __$CONCAT(a,b) a ## b
|
||||||
|
#define _$CONCAT(a, b) __$CONCAT(a, b)
|
||||||
|
|
||||||
|
#define guard(M_fn) auto _$CONCAT(__defer__, __LINE__) = (sg::make_scope_guard((M_fn)));
|
||||||
|
#define defer(M_stmt) auto _$CONCAT(__defer__, __LINE__) = (sg::make_scope_guard([&](void) -> void { M_stmt ; }));
|
303
src/main.cpp
303
src/main.cpp
|
@ -1,14 +1,19 @@
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
#include "camera.hpp"
|
#include "camera.hpp"
|
||||||
|
#include "glm/glm/ext/matrix_float4x4.hpp"
|
||||||
|
#include "mesh.hpp"
|
||||||
|
#include "primitives.hpp"
|
||||||
#include "shader.hpp"
|
#include "shader.hpp"
|
||||||
|
#include "texture.hpp"
|
||||||
|
#include "vendor/stb_image.h"
|
||||||
#include "vendor/glad/glad.h"
|
#include "vendor/glad/glad.h"
|
||||||
#include "vendor/glm/glm/ext/matrix_transform.hpp"
|
#include "vendor/glm/glm/ext/matrix_transform.hpp"
|
||||||
#define GLFW_INCLUDE_NONE
|
#define GLFW_INCLUDE_NONE
|
||||||
#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#define QOI_IMPLEMENTATION
|
|
||||||
#include "vendor/qoi.h"
|
|
||||||
|
|
||||||
#include "vendor/glm/glm/vec3.hpp"
|
#include "vendor/glm/glm/vec3.hpp"
|
||||||
#include "vendor/glm/glm/vec4.hpp"
|
#include "vendor/glm/glm/vec4.hpp"
|
||||||
|
@ -21,20 +26,23 @@
|
||||||
std::function<void(int width, int height)> framebuffer_size_callback = nullptr;
|
std::function<void(int width, int height)> framebuffer_size_callback = nullptr;
|
||||||
std::function<void(double x, double y)> cursor_position_callback = nullptr;
|
std::function<void(double x, double y)> cursor_position_callback = nullptr;
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY gl_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "OPENGL MESSAGE: %s\n", message);
|
||||||
|
if (type == GL_DEBUG_TYPE_ERROR) {
|
||||||
|
fprintf(stderr, "exiting due to gl error above...\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
qoi_desc fish_desc;
|
|
||||||
void *fish_rgba = qoi_read("assets/container2.qoi", &fish_desc, 4);
|
|
||||||
|
|
||||||
qoi_desc fish_map_desc;
|
|
||||||
void *fish_map_rgba = qoi_read("assets/container2_specular.qoi", &fish_map_desc, 4);
|
|
||||||
|
|
||||||
|
|
||||||
if (!glfwInit()) {
|
if (!glfwInit()) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
|
||||||
|
@ -45,7 +53,7 @@ int main()
|
||||||
|
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
gladLoadGL();
|
gladLoadGL();
|
||||||
glfwSwapInterval(1);
|
glfwSwapInterval(0);
|
||||||
|
|
||||||
glfwSetFramebufferSizeCallback(window, [](GLFWwindow *_, int width, int height) {
|
glfwSetFramebufferSizeCallback(window, [](GLFWwindow *_, int width, int height) {
|
||||||
if (framebuffer_size_callback) {
|
if (framebuffer_size_callback) {
|
||||||
|
@ -61,66 +69,10 @@ int main()
|
||||||
});
|
});
|
||||||
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_DEBUG_OUTPUT);
|
||||||
|
glDebugMessageCallback(gl_message_callback, NULL);
|
||||||
|
|
||||||
float cube_verts[] = {
|
|
||||||
// positions // normals // texture coords
|
|
||||||
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
|
|
||||||
0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,
|
|
||||||
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
|
|
||||||
0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,
|
|
||||||
-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,
|
|
||||||
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,
|
|
||||||
|
|
||||||
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
|
||||||
0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,
|
|
||||||
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
|
|
||||||
0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,
|
|
||||||
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,
|
|
||||||
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
|
|
||||||
|
|
||||||
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
|
|
||||||
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
|
||||||
-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
|
||||||
-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
|
|
||||||
-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
|
|
||||||
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
|
|
||||||
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
|
||||||
0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
|
|
||||||
0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
|
|
||||||
0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
|
|
||||||
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
|
|
||||||
0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,
|
|
||||||
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,
|
|
||||||
-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,
|
|
||||||
|
|
||||||
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,
|
|
||||||
0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,
|
|
||||||
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,
|
|
||||||
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
|
|
||||||
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f
|
|
||||||
};
|
|
||||||
|
|
||||||
// positions all containers
|
|
||||||
glm::vec3 cube_positions[] = {
|
|
||||||
glm::vec3( 0.0f, 0.0f, 0.0f),
|
|
||||||
glm::vec3( 2.0f, 5.0f, -15.0f),
|
|
||||||
glm::vec3(-1.5f, -2.2f, -2.5f),
|
|
||||||
glm::vec3(-3.8f, -2.0f, -12.3f),
|
|
||||||
glm::vec3( 2.4f, -0.4f, -3.5f),
|
|
||||||
glm::vec3(-1.7f, 3.0f, -7.5f),
|
|
||||||
glm::vec3( 1.3f, -2.0f, -2.5f),
|
|
||||||
glm::vec3( 1.5f, 2.0f, -2.5f),
|
|
||||||
glm::vec3( 1.5f, 0.2f, -1.5f),
|
|
||||||
glm::vec3(-1.3f, 1.0f, -1.5f)
|
|
||||||
};
|
|
||||||
// positions of the point lights
|
|
||||||
glm::vec3 point_light_positions[] = {
|
glm::vec3 point_light_positions[] = {
|
||||||
glm::vec3( 0.7f, 0.2f, 2.0f),
|
glm::vec3( 0.7f, 0.2f, 2.0f),
|
||||||
glm::vec3( 2.3f, -3.3f, -4.0f),
|
glm::vec3( 2.3f, -3.3f, -4.0f),
|
||||||
|
@ -128,52 +80,8 @@ int main()
|
||||||
glm::vec3( 0.0f, 0.0f, -3.0f)
|
glm::vec3( 0.0f, 0.0f, -3.0f)
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned int fish_texture;
|
unsigned int lit_program = create_program("shaders/lighting_vertex.glsl", "shaders/lighting_fragment.glsl");
|
||||||
glGenTextures(1, &fish_texture);
|
unsigned int skybox_program = create_program("shaders/skybox_vertex.glsl", "shaders/skybox_fragment.glsl");
|
||||||
glBindTexture(GL_TEXTURE_2D, fish_texture);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fish_desc.width, fish_desc.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, fish_rgba);
|
|
||||||
glGenerateMipmap(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
unsigned int fish_map_texture;
|
|
||||||
glGenTextures(1, &fish_map_texture);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, fish_map_texture);
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fish_map_desc.width, fish_map_desc.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, fish_map_rgba);
|
|
||||||
glGenerateMipmap(GL_TEXTURE_2D);
|
|
||||||
|
|
||||||
unsigned int lighting_program = create_program("shaders/lighting_vertex.glsl", "shaders/lighting_fragment.glsl");
|
|
||||||
unsigned int light_cube_program = create_program("shaders/light_cube_vertex.glsl", "shaders/light_cube_fragment.glsl");
|
|
||||||
|
|
||||||
unsigned int cube_buffer = 0;
|
|
||||||
glGenBuffers(1, &cube_buffer);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, cube_buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, sizeof(cube_verts), &cube_verts, GL_STATIC_DRAW);
|
|
||||||
|
|
||||||
unsigned int object_vao;
|
|
||||||
glGenVertexArrays(1, &object_vao);
|
|
||||||
glBindVertexArray(object_vao);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, cube_buffer);
|
|
||||||
|
|
||||||
// position
|
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)0);
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
// normal
|
|
||||||
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)(3 * sizeof(float)));
|
|
||||||
glEnableVertexAttribArray(1);
|
|
||||||
// texture coord
|
|
||||||
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)(6 * sizeof(float)));
|
|
||||||
glEnableVertexAttribArray(2);
|
|
||||||
|
|
||||||
unsigned int light_source_vao;
|
|
||||||
glGenVertexArrays(1, &light_source_vao);
|
|
||||||
glBindVertexArray(light_source_vao);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, cube_buffer);
|
|
||||||
|
|
||||||
// position
|
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)0);
|
|
||||||
glEnableVertexAttribArray(0);
|
|
||||||
|
|
||||||
|
|
||||||
glm::mat4 projection = glm::mat4(1.0f);
|
glm::mat4 projection = glm::mat4(1.0f);
|
||||||
Camera camera;
|
Camera camera;
|
||||||
|
@ -187,6 +95,41 @@ int main()
|
||||||
camera.process_mouse(x, y);
|
camera.process_mouse(x, y);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
std::vector<Mesh> meshes;
|
||||||
|
load_model_from_file(meshes, "./assets/model/backpack.obj");
|
||||||
|
for (auto &mesh : meshes) {
|
||||||
|
mesh.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int skybox_vao, skybox_cubemap_texture;
|
||||||
|
{
|
||||||
|
unsigned int skybox_vbo;
|
||||||
|
|
||||||
|
std::vector<const char *> files = {
|
||||||
|
"./assets/cubemap/px.png",
|
||||||
|
"./assets/cubemap/nx.png",
|
||||||
|
"./assets/cubemap/py.png",
|
||||||
|
"./assets/cubemap/ny.png",
|
||||||
|
"./assets/cubemap/pz.png",
|
||||||
|
"./assets/cubemap/nz.png"
|
||||||
|
};
|
||||||
|
skybox_cubemap_texture = cubemap_from_files(files);
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &skybox_vao);
|
||||||
|
glGenBuffers(1, &skybox_vbo);
|
||||||
|
|
||||||
|
glBindVertexArray(skybox_vao);
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, skybox_vbo);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, skybox_verts.size() * sizeof(float), &skybox_verts[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
||||||
|
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
float delta_time = 0.0f;
|
float delta_time = 0.0f;
|
||||||
float last_frame_time = 0.0f;
|
float last_frame_time = 0.0f;
|
||||||
|
|
||||||
|
@ -220,87 +163,81 @@ int main()
|
||||||
{
|
{
|
||||||
/* lit objects */
|
/* lit objects */
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glUseProgram(lit_program);
|
||||||
glBindTexture(GL_TEXTURE_2D, fish_texture);
|
program_set(lit_program, "model", glm::scale(glm::translate(glm::mat4(1.0), glm::vec3(0.0, 0.0, 0.0)), glm::vec3(1.0, 1.0, 1.0)));
|
||||||
glActiveTexture (GL_TEXTURE1);
|
program_set(lit_program, "projection", projection);
|
||||||
glBindTexture(GL_TEXTURE_2D, fish_map_texture);
|
program_set(lit_program, "view", camera.view);
|
||||||
|
program_set(lit_program, "viewPos", camera.position);
|
||||||
|
|
||||||
glUseProgram(lighting_program);
|
program_set(lit_program, "material.shininess", 32.0f);
|
||||||
glBindVertexArray(object_vao);
|
|
||||||
|
|
||||||
program_set(lighting_program, "projection", projection);
|
program_set(lit_program, "directionalLight.direction", -0.2f, -1.0f, -0.3f);
|
||||||
program_set(lighting_program, "view", camera.view);
|
program_set(lit_program, "directionalLight.ambient", 0.05f, 0.05f, 0.05f);
|
||||||
program_set(lighting_program, "viewPos", camera.position);
|
program_set(lit_program, "directionalLight.diffuse", 0.4f, 0.4f, 0.4f);
|
||||||
|
program_set(lit_program, "directionalLight.specular", 0.5f, 0.5f, 0.5f);
|
||||||
program_set(lighting_program, "material.shininess", 32.0f);
|
|
||||||
|
|
||||||
program_set(lighting_program, "directionalLight.direction", -0.2f, -1.0f, -0.3f);
|
|
||||||
program_set(lighting_program, "directionalLight.ambient", 0.05f, 0.05f, 0.05f);
|
|
||||||
program_set(lighting_program, "directionalLight.diffuse", 0.4f, 0.4f, 0.4f);
|
|
||||||
program_set(lighting_program, "directionalLight.specular", 0.5f, 0.5f, 0.5f);
|
|
||||||
// point light 1
|
// point light 1
|
||||||
program_set(lighting_program, "pointLights[0].position", point_light_positions[0]);
|
program_set(lit_program, "pointLights[0].position", point_light_positions[0]);
|
||||||
program_set(lighting_program, "pointLights[0].ambient", 0.05f, 0.05f, 0.05f);
|
program_set(lit_program, "pointLights[0].ambient", 0.05f, 0.05f, 0.05f);
|
||||||
program_set(lighting_program, "pointLights[0].diffuse", 0.8f, 0.8f, 0.8f);
|
program_set(lit_program, "pointLights[0].diffuse", 0.8f, 0.8f, 0.8f);
|
||||||
program_set(lighting_program, "pointLights[0].specular", 1.0f, 1.0f, 1.0f);
|
program_set(lit_program, "pointLights[0].specular", 1.0f, 1.0f, 1.0f);
|
||||||
program_set(lighting_program, "pointLights[0].constant", 1.0f);
|
program_set(lit_program, "pointLights[0].constant", 1.0f);
|
||||||
program_set(lighting_program, "pointLights[0].linear", 0.09f);
|
program_set(lit_program, "pointLights[0].linear", 0.09f);
|
||||||
program_set(lighting_program, "pointLights[0].quadratic", 0.032f);
|
program_set(lit_program, "pointLights[0].quadratic", 0.032f);
|
||||||
// point light 2
|
// point light 2
|
||||||
program_set(lighting_program, "pointLights[1].position", point_light_positions[1]);
|
program_set(lit_program, "pointLights[1].position", point_light_positions[1]);
|
||||||
program_set(lighting_program, "pointLights[1].ambient", 0.05f, 0.05f, 0.05f);
|
program_set(lit_program, "pointLights[1].ambient", 0.05f, 0.05f, 0.05f);
|
||||||
program_set(lighting_program, "pointLights[1].diffuse", 0.8f, 0.8f, 0.8f);
|
program_set(lit_program, "pointLights[1].diffuse", 0.8f, 0.8f, 0.8f);
|
||||||
program_set(lighting_program, "pointLights[1].specular", 1.0f, 1.0f, 1.0f);
|
program_set(lit_program, "pointLights[1].specular", 1.0f, 1.0f, 1.0f);
|
||||||
program_set(lighting_program, "pointLights[1].constant", 1.0f);
|
program_set(lit_program, "pointLights[1].constant", 1.0f);
|
||||||
program_set(lighting_program, "pointLights[1].linear", 0.09f);
|
program_set(lit_program, "pointLights[1].linear", 0.09f);
|
||||||
program_set(lighting_program, "pointLights[1].quadratic", 0.032f);
|
program_set(lit_program, "pointLights[1].quadratic", 0.032f);
|
||||||
// point light 3
|
// point light 3
|
||||||
program_set(lighting_program, "pointLights[2].position", point_light_positions[2]);
|
program_set(lit_program, "pointLights[2].position", point_light_positions[2]);
|
||||||
program_set(lighting_program, "pointLights[2].ambient", 0.05f, 0.05f, 0.05f);
|
program_set(lit_program, "pointLights[2].ambient", 0.05f, 0.05f, 0.05f);
|
||||||
program_set(lighting_program, "pointLights[2].diffuse", 0.8f, 0.8f, 0.8f);
|
program_set(lit_program, "pointLights[2].diffuse", 0.8f, 0.8f, 0.8f);
|
||||||
program_set(lighting_program, "pointLights[2].specular", 1.0f, 1.0f, 1.0f);
|
program_set(lit_program, "pointLights[2].specular", 1.0f, 1.0f, 1.0f);
|
||||||
program_set(lighting_program, "pointLights[2].constant", 1.0f);
|
program_set(lit_program, "pointLights[2].constant", 1.0f);
|
||||||
program_set(lighting_program, "pointLights[2].linear", 0.09f);
|
program_set(lit_program, "pointLights[2].linear", 0.09f);
|
||||||
program_set(lighting_program, "pointLights[2].quadratic", 0.032f);
|
program_set(lit_program, "pointLights[2].quadratic", 0.032f);
|
||||||
// point light 4
|
// point light 4
|
||||||
program_set(lighting_program, "pointLights[3].position", point_light_positions[3]);
|
program_set(lit_program, "pointLights[3].position", point_light_positions[3]);
|
||||||
program_set(lighting_program, "pointLights[3].ambient", 0.05f, 0.05f, 0.05f);
|
program_set(lit_program, "pointLights[3].ambient", 0.05f, 0.05f, 0.05f);
|
||||||
program_set(lighting_program, "pointLights[3].diffuse", 0.8f, 0.8f, 0.8f);
|
program_set(lit_program, "pointLights[3].diffuse", 0.8f, 0.8f, 0.8f);
|
||||||
program_set(lighting_program, "pointLights[3].specular", 1.0f, 1.0f, 1.0f);
|
program_set(lit_program, "pointLights[3].specular", 1.0f, 1.0f, 1.0f);
|
||||||
program_set(lighting_program, "pointLights[3].constant", 1.0f);
|
program_set(lit_program, "pointLights[3].constant", 1.0f);
|
||||||
program_set(lighting_program, "pointLights[3].linear", 0.09f);
|
program_set(lit_program, "pointLights[3].linear", 0.09f);
|
||||||
program_set(lighting_program, "pointLights[3].quadratic", 0.032f);
|
program_set(lit_program, "pointLights[3].quadratic", 0.032f);
|
||||||
// spot light
|
// spot light
|
||||||
program_set(lighting_program, "spotLight.position", camera.position);
|
program_set(lit_program, "spotLight.position", camera.position);
|
||||||
program_set(lighting_program, "spotLight.direction", camera.front);
|
program_set(lit_program, "spotLight.direction", camera.front);
|
||||||
program_set(lighting_program, "spotLight.ambient", 0.0f, 0.0f, 0.0f);
|
program_set(lit_program, "spotLight.ambient", 0.0f, 0.0f, 0.0f);
|
||||||
program_set(lighting_program, "spotLight.diffuse", 1.0f, 1.0f, 1.0f);
|
program_set(lit_program, "spotLight.diffuse", 1.0f, 1.0f, 1.0f);
|
||||||
program_set(lighting_program, "spotLight.specular", 1.0f, 1.0f, 1.0f);
|
program_set(lit_program, "spotLight.specular", 1.0f, 1.0f, 1.0f);
|
||||||
program_set(lighting_program, "spotLight.constant", 1.0f);
|
program_set(lit_program, "spotLight.constant", 1.0f);
|
||||||
program_set(lighting_program, "spotLight.linear", 0.09f);
|
program_set(lit_program, "spotLight.linear", 0.09f);
|
||||||
program_set(lighting_program, "spotLight.quadratic", 0.032f);
|
program_set(lit_program, "spotLight.quadratic", 0.032f);
|
||||||
program_set(lighting_program, "spotLight.cutOff", glm::cos(glm::radians(12.5f)));
|
program_set(lit_program, "spotLight.cutOff", glm::cos(glm::radians(12.5f)));
|
||||||
program_set(lighting_program, "spotLight.outerCutOff", glm::cos(glm::radians(15.0f)));
|
program_set(lit_program, "spotLight.outerCutOff", glm::cos(glm::radians(15.0f)));
|
||||||
|
|
||||||
|
for (const auto &mesh : meshes) {
|
||||||
for (int i = 0; i < 10; i++) {
|
mesh.draw(lit_program);
|
||||||
program_set(lighting_program, "model", glm::rotate(glm::translate(glm::mat4(1.0f), cube_positions[i]), glm::radians(20.0f * i), glm::vec3(1.0f, 0.3f, 0.5f)));
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 36);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* lamp object */
|
/* skybox */
|
||||||
{
|
{
|
||||||
glUseProgram(light_cube_program);
|
glDepthFunc(GL_LEQUAL);
|
||||||
glBindVertexArray(light_source_vao);
|
|
||||||
|
|
||||||
program_set(light_cube_program, "view", camera.view);
|
glUseProgram(skybox_program);
|
||||||
program_set(light_cube_program, "projection", projection);
|
glBindVertexArray(skybox_vao);
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_cubemap_texture);
|
||||||
|
program_set(skybox_program, "projection", projection);
|
||||||
|
program_set(skybox_program, "view", glm::mat4(glm::mat3(camera.view)));
|
||||||
|
program_set(skybox_program, "texture_cubemap1", 0);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, 36);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) {
|
glDepthFunc(GL_LESS);
|
||||||
program_set(light_cube_program, "model", glm::scale(glm::translate(glm::mat4(1.0f), point_light_positions[i]), glm::vec3(0.2f)));
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 36);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
165
src/mesh.cpp
Normal file
165
src/mesh.cpp
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
#include "texture.hpp"
|
||||||
|
#include "vendor/glad/glad.h"
|
||||||
|
#include <assimp/Importer.hpp>
|
||||||
|
#include <assimp/material.h>
|
||||||
|
#include <assimp/mesh.h>
|
||||||
|
#include <assimp/scene.h>
|
||||||
|
#include <assimp/postprocess.h>
|
||||||
|
#include <assimp/types.h>
|
||||||
|
#include <assimp/vector2.h>
|
||||||
|
#include <assimp/vector3.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <chrono>
|
||||||
|
#include <vector>
|
||||||
|
#include "mesh.hpp"
|
||||||
|
#include "shader.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
void Mesh::init()
|
||||||
|
{
|
||||||
|
glGenVertexArrays(1, &vao);
|
||||||
|
glGenBuffers(1, &vertices_vbo);
|
||||||
|
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
|
||||||
|
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vertices_vbo);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glGenBuffers(1, &indicies_ebo);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicies_ebo);
|
||||||
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size() * sizeof(unsigned int), &indicies[0], GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(1);
|
||||||
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, normal));
|
||||||
|
|
||||||
|
glEnableVertexAttribArray(2);
|
||||||
|
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, textureCoords));
|
||||||
|
|
||||||
|
|
||||||
|
glBindVertexArray(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::draw(unsigned int program_id) const
|
||||||
|
{
|
||||||
|
unsigned int diffuse_number = 1;
|
||||||
|
unsigned int specular_number = 1;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < textures.size(); i++) {
|
||||||
|
const Texture &texture = textures[i];
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE0 + i);
|
||||||
|
|
||||||
|
if (texture.type == "texture_diffuse") {
|
||||||
|
program_set(program_id, ("material.texture_diffuse" + std::to_string(diffuse_number++)).c_str(), static_cast<int>(i));
|
||||||
|
} else if (texture.type == "texture_specular") {
|
||||||
|
program_set(program_id, ("material.texture_specular" + std::to_string(specular_number++)).c_str(), static_cast<int>(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
glDrawElements(GL_TRIANGLES, indicies.size(), GL_UNSIGNED_INT, 0);
|
||||||
|
glBindVertexArray(0);
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static std::unordered_map<std::string, Texture> file_path_to_loaded_texture_cache;
|
||||||
|
static void load_material_textures(std::vector<Texture> &out_textures, const aiMaterial *material, const aiTextureType texture_type, const char *type_name, const std::string &texture_root_directory)
|
||||||
|
{
|
||||||
|
unsigned int texture_count = aiGetMaterialTextureCount(material, texture_type);
|
||||||
|
|
||||||
|
out_textures.reserve(texture_count);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < texture_count; i++) {
|
||||||
|
aiString filename;
|
||||||
|
material->GetTexture(texture_type, i, &filename);
|
||||||
|
std::string path = texture_root_directory + "/" + filename.C_Str();
|
||||||
|
|
||||||
|
auto it = file_path_to_loaded_texture_cache.find(path);
|
||||||
|
if (it != file_path_to_loaded_texture_cache.end()) {
|
||||||
|
Texture texture = it->second;
|
||||||
|
out_textures.push_back(texture);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int texture_id = texture_from_file(path.c_str());
|
||||||
|
|
||||||
|
Texture texture = out_textures.emplace_back(texture_id, type_name);
|
||||||
|
|
||||||
|
file_path_to_loaded_texture_cache[path] = texture;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void visit_node_process_mesh(const aiScene *scene, const aiMesh *mesh, const std::string *texture_root_directory, std::vector<Mesh> &out_meshes)
|
||||||
|
{
|
||||||
|
auto &out_mesh = out_meshes.emplace_back();
|
||||||
|
|
||||||
|
std::vector<Vertex> &vertices = out_mesh.vertices;
|
||||||
|
std::vector<Texture> &textures = out_mesh.textures;
|
||||||
|
std::vector<unsigned int> &indicies = out_mesh.indicies;
|
||||||
|
|
||||||
|
vertices.reserve(mesh->mNumVertices);
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; i++) {
|
||||||
|
const aiVector3D vertex = mesh->mVertices[i];
|
||||||
|
const aiVector3D normal = mesh->mNormals[i];
|
||||||
|
const aiVector3D *textureCoords = mesh->mTextureCoords[0];
|
||||||
|
vertices.emplace_back(
|
||||||
|
glm::vec3(vertex.x, vertex.y, vertex.z),
|
||||||
|
glm::vec3(normal.x, normal.y, normal.z),
|
||||||
|
textureCoords ? glm::vec2(textureCoords[i].x, textureCoords[i].y) : glm::vec2(0.0, 0.0)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumFaces; i++) {
|
||||||
|
aiFace face = mesh->mFaces[i];
|
||||||
|
for (unsigned int j = 0; j < face.mNumIndices; j++) {
|
||||||
|
indicies.push_back(face.mIndices[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mesh->mMaterialIndex >= 0) {
|
||||||
|
aiMaterial *material = scene->mMaterials[mesh->mMaterialIndex];
|
||||||
|
load_material_textures(textures, material, aiTextureType_DIFFUSE, "texture_diffuse", *texture_root_directory);
|
||||||
|
load_material_textures(textures, material, aiTextureType_SPECULAR, "texture_specular", *texture_root_directory);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void visit_node(aiNode *node, const aiScene *scene, std::string *texture_root_directory, std::vector<Mesh> &out_meshes)
|
||||||
|
{
|
||||||
|
for (unsigned int i = 0; i < node->mNumMeshes; i++) {
|
||||||
|
const aiMesh *mesh = scene->mMeshes[node->mMeshes[i]];
|
||||||
|
visit_node_process_mesh(scene, mesh, texture_root_directory, out_meshes);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < node->mNumChildren; i++) {
|
||||||
|
visit_node(node->mChildren[i], scene, texture_root_directory, out_meshes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_model_from_file(std::vector<Mesh> &out_meshes, const std::string &path)
|
||||||
|
{
|
||||||
|
auto t1 = std::chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
|
Assimp::Importer importer;
|
||||||
|
const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_ValidateDataStructure | aiProcess_OptimizeMeshes | aiProcess_OptimizeGraph);
|
||||||
|
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) {
|
||||||
|
std::cerr << "load_model_from_file: assimp importer failed to read model: " << importer.GetErrorString() << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string texture_root_directory = path.substr(0, path.find_last_of('/'));
|
||||||
|
visit_node(scene->mRootNode, scene, &texture_root_directory, out_meshes);
|
||||||
|
|
||||||
|
auto t2 = std::chrono::high_resolution_clock::now();
|
||||||
|
std::chrono::duration<double, std::milli> delta = t2 - t1;
|
||||||
|
|
||||||
|
printf("processed %ld meshes in %fms\n", out_meshes.size(), delta.count());
|
||||||
|
}
|
32
src/mesh.hpp
Normal file
32
src/mesh.hpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include "vendor/glm/glm/vec2.hpp"
|
||||||
|
#include "vendor/glm/glm/vec3.hpp"
|
||||||
|
|
||||||
|
struct Vertex {
|
||||||
|
glm::vec3 position;
|
||||||
|
glm::vec3 normal;
|
||||||
|
glm::vec2 textureCoords;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Texture {
|
||||||
|
unsigned int id;
|
||||||
|
std::string type;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Mesh {
|
||||||
|
std::vector<Vertex> vertices;
|
||||||
|
std::vector<Texture> textures;
|
||||||
|
std::vector<unsigned int> indicies;
|
||||||
|
bool use_indicies = true;
|
||||||
|
|
||||||
|
unsigned int vao, vertices_vbo, indicies_ebo;
|
||||||
|
|
||||||
|
void init();
|
||||||
|
void draw(unsigned int program_id) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void load_model_from_file(std::vector<Mesh> &out_meshes, const std::string &path);
|
45
src/primitives.cpp
Normal file
45
src/primitives.cpp
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
#include "primitives.hpp"
|
||||||
|
|
||||||
|
const std::vector<float> skybox_verts = {
|
||||||
|
-1.0f, 1.0f, -1.0f,
|
||||||
|
-1.0f, -1.0f, -1.0f,
|
||||||
|
1.0f, -1.0f, -1.0f,
|
||||||
|
1.0f, -1.0f, -1.0f,
|
||||||
|
1.0f, 1.0f, -1.0f,
|
||||||
|
-1.0f, 1.0f, -1.0f,
|
||||||
|
|
||||||
|
-1.0f, -1.0f, 1.0f,
|
||||||
|
-1.0f, -1.0f, -1.0f,
|
||||||
|
-1.0f, 1.0f, -1.0f,
|
||||||
|
-1.0f, 1.0f, -1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f,
|
||||||
|
-1.0f, -1.0f, 1.0f,
|
||||||
|
|
||||||
|
1.0f, -1.0f, -1.0f,
|
||||||
|
1.0f, -1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, -1.0f,
|
||||||
|
1.0f, -1.0f, -1.0f,
|
||||||
|
|
||||||
|
-1.0f, -1.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, -1.0f, 1.0f,
|
||||||
|
-1.0f, -1.0f, 1.0f,
|
||||||
|
|
||||||
|
-1.0f, 1.0f, -1.0f,
|
||||||
|
1.0f, 1.0f, -1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f,
|
||||||
|
1.0f, 1.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f, 1.0f,
|
||||||
|
-1.0f, 1.0f, -1.0f,
|
||||||
|
|
||||||
|
-1.0f, -1.0f, -1.0f,
|
||||||
|
-1.0f, -1.0f, 1.0f,
|
||||||
|
1.0f, -1.0f, -1.0f,
|
||||||
|
1.0f, -1.0f, -1.0f,
|
||||||
|
-1.0f, -1.0f, 1.0f,
|
||||||
|
1.0f, -1.0f, 1.0f
|
||||||
|
};
|
5
src/primitives.hpp
Normal file
5
src/primitives.hpp
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
extern const std::vector<float> skybox_verts;
|
|
@ -1,6 +1,7 @@
|
||||||
#include "shader.hpp"
|
#include "shader.hpp"
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
#include "vendor/glad/glad.h"
|
#include "vendor/glad/glad.h"
|
||||||
|
#include "defer.hpp"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
|
@ -66,42 +67,39 @@ unsigned int create_program_source(const char *vertex_shader_source, const char
|
||||||
|
|
||||||
unsigned int create_program(const char *vertex_shader_path, const char *fragment_shader_path)
|
unsigned int create_program(const char *vertex_shader_path, const char *fragment_shader_path)
|
||||||
{
|
{
|
||||||
FILE *vertex_shader_file, *fragment_shader_file = NULL;
|
|
||||||
char *vertex_shader_source = NULL;
|
|
||||||
char *fragment_shader_source = NULL;
|
|
||||||
Errno err = 0;
|
Errno err = 0;
|
||||||
unsigned int ret = 0;
|
|
||||||
|
|
||||||
vertex_shader_file = fopen(vertex_shader_path, "r");
|
FILE *vertex_shader_file = fopen(vertex_shader_path, "r");
|
||||||
|
defer(if (vertex_shader_file) fclose(vertex_shader_file));
|
||||||
if (!vertex_shader_file) {
|
if (!vertex_shader_file) {
|
||||||
fprintf(stderr, "create_program: failed to open vertex shader file (%s): %s\n", vertex_shader_path, strerror(errno));
|
fprintf(stderr, "create_program: failed to open vertex shader file (%s): %s\n", vertex_shader_path, strerror(errno));
|
||||||
goto done;
|
return 0;
|
||||||
}
|
}
|
||||||
err = read_entire_file(vertex_shader_file, &vertex_shader_source);
|
|
||||||
|
char *vertex_shader_source = NULL;
|
||||||
|
defer(free(vertex_shader_source));
|
||||||
|
err = read_entire_file(vertex_shader_file, &vertex_shader_source, true);
|
||||||
if (err) {
|
if (err) {
|
||||||
fprintf(stderr, "create_program: failed to read vertex shader file (%s): %s\n", vertex_shader_path, strerror(err));
|
fprintf(stderr, "create_program: failed to read vertex shader file (%s): %s\n", vertex_shader_path, strerror(err));
|
||||||
goto done;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fragment_shader_file = fopen(fragment_shader_path, "r");
|
FILE *fragment_shader_file = fopen(fragment_shader_path, "r");
|
||||||
|
defer(if (fragment_shader_file) fclose(fragment_shader_file));
|
||||||
if (!fragment_shader_file) {
|
if (!fragment_shader_file) {
|
||||||
fprintf(stderr, "create_program: failed to open fragment shader file (%s): %s\n", fragment_shader_path, strerror(errno));
|
fprintf(stderr, "create_program: failed to open fragment shader file (%s): %s\n", fragment_shader_path, strerror(errno));
|
||||||
goto done;
|
return 0;
|
||||||
}
|
}
|
||||||
err = read_entire_file(fragment_shader_file, &fragment_shader_source);
|
|
||||||
|
char *fragment_shader_source = NULL;
|
||||||
|
defer(free(fragment_shader_source));
|
||||||
|
err = read_entire_file(fragment_shader_file, &fragment_shader_source, true);
|
||||||
if (err) {
|
if (err) {
|
||||||
fprintf(stderr, "create_program: failed to read fragment shader file (%s): %s\n", fragment_shader_path, strerror(err));
|
fprintf(stderr, "create_program: failed to read fragment shader file (%s): %s\n", fragment_shader_path, strerror(err));
|
||||||
goto done;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = create_program_source(vertex_shader_source, fragment_shader_source);
|
return create_program_source(vertex_shader_source, fragment_shader_source);
|
||||||
|
|
||||||
done:
|
|
||||||
if (vertex_shader_file) fclose(vertex_shader_file);
|
|
||||||
if (fragment_shader_file) fclose(fragment_shader_file);
|
|
||||||
if (vertex_shader_source) free(vertex_shader_source);
|
|
||||||
if (fragment_shader_source) free(fragment_shader_source);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void program_set(unsigned int program, const char *uniform, int value)
|
void program_set(unsigned int program, const char *uniform, int value)
|
||||||
|
@ -109,6 +107,11 @@ void program_set(unsigned int program, const char *uniform, int value)
|
||||||
glUniform1i(glGetUniformLocation(program, uniform), value);
|
glUniform1i(glGetUniformLocation(program, uniform), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void program_set(unsigned int program, const char *uniform, unsigned int value)
|
||||||
|
{
|
||||||
|
glUniform1ui(glGetUniformLocation(program, uniform), value);
|
||||||
|
}
|
||||||
|
|
||||||
void program_set(unsigned int program, const char *uniform, float value)
|
void program_set(unsigned int program, const char *uniform, float value)
|
||||||
{
|
{
|
||||||
glUniform1f(glGetUniformLocation(program, uniform), value);
|
glUniform1f(glGetUniformLocation(program, uniform), value);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
unsigned int create_program(const char *vertex_shader_path, const char *fragment_shader_path);
|
unsigned int create_program(const char *vertex_shader_path, const char *fragment_shader_path);
|
||||||
void program_set(unsigned int program, const char *uniform, int value);
|
void program_set(unsigned int program, const char *uniform, int value);
|
||||||
|
void program_set(unsigned int program, const char *uniform, unsigned int value);
|
||||||
void program_set(unsigned int program, const char *uniform, float value);
|
void program_set(unsigned int program, const char *uniform, float value);
|
||||||
void program_set(unsigned int program, const char *uniform, glm::vec3 vec);
|
void program_set(unsigned int program, const char *uniform, glm::vec3 vec);
|
||||||
void program_set(unsigned int program, const char *uniform, float x, float y, float z);
|
void program_set(unsigned int program, const char *uniform, float x, float y, float z);
|
||||||
|
|
11
src/stb_image_impl.cpp
Normal file
11
src/stb_image_impl.cpp
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#define STB_IMAGE_IMPLEMENTATION
|
||||||
|
// #define STBI_NO_JPEG
|
||||||
|
// #define STBI_NO_PNG
|
||||||
|
#define STBI_NO_BMP
|
||||||
|
#define STBI_NO_PSD
|
||||||
|
#define STBI_NO_TGA
|
||||||
|
#define STBI_NO_GIF
|
||||||
|
// #define STBI_NO_HDR
|
||||||
|
#define STBI_NO_PIC
|
||||||
|
#define STBI_NO_PNM
|
||||||
|
#include "vendor/stb_image.h"
|
71
src/texture.cpp
Normal file
71
src/texture.cpp
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
#include "texture.hpp"
|
||||||
|
#include "defer.hpp"
|
||||||
|
#include "common.hpp"
|
||||||
|
#include "vendor/glad/glad.h"
|
||||||
|
#include "vendor/stb_image.h"
|
||||||
|
#include <cerrno>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int texture_from_file(const char *path)
|
||||||
|
{
|
||||||
|
printf("texture_from_file: load %s\n", path);
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
unsigned char *data = stbi_load(path, &x, &y, NULL, 4);
|
||||||
|
defer(stbi_image_free(data));
|
||||||
|
if (!data) {
|
||||||
|
fprintf(stderr, "texture_from_file: failed to load %s\n", path);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int texture;
|
||||||
|
glGenTextures(1, &texture);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture);
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||||
|
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||||
|
glGenerateMipmap(GL_TEXTURE_2D);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, 0);
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int cubemap_from_files(std::vector<const char *> &faces)
|
||||||
|
{
|
||||||
|
unsigned int texture;
|
||||||
|
glGenTextures(1, &texture);
|
||||||
|
glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
|
||||||
|
|
||||||
|
int width, height = 0;
|
||||||
|
unsigned char *data = NULL;
|
||||||
|
for (unsigned int i = 0; i < faces.size(); i++) {
|
||||||
|
printf("cubemap_from_files: load %s\n", faces[i]);
|
||||||
|
|
||||||
|
data = stbi_load(faces[i], &width, &height, NULL, 3);
|
||||||
|
defer(stbi_image_free(data));
|
||||||
|
|
||||||
|
if (data) {
|
||||||
|
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "cubemap_from_files: failed to load file %s\n", faces[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
|
return texture;
|
||||||
|
}
|
8
src/texture.hpp
Normal file
8
src/texture.hpp
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string_view>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int texture_from_file(const char *path);
|
||||||
|
unsigned int cubemap_from_files(std::vector<const char *> &faces);
|
417
src/vendor/glad/glad.c
vendored
417
src/vendor/glad/glad.c
vendored
|
@ -1,10 +1,10 @@
|
||||||
/*
|
/*
|
||||||
|
|
||||||
OpenGL loader generated by glad 0.1.34 on Thu Jun 29 15:12:42 2023.
|
OpenGL loader generated by glad 0.1.34 on Mon Aug 28 15:56:17 2023.
|
||||||
|
|
||||||
Language/Generator: C/C++
|
Language/Generator: C/C++
|
||||||
Specification: gl
|
Specification: gl
|
||||||
APIs: gl=3.3
|
APIs: gl=4.3
|
||||||
Profile: core
|
Profile: core
|
||||||
Extensions:
|
Extensions:
|
||||||
|
|
||||||
|
@ -14,9 +14,9 @@
|
||||||
Reproducible: False
|
Reproducible: False
|
||||||
|
|
||||||
Commandline:
|
Commandline:
|
||||||
--profile="core" --api="gl=3.3" --generator="c" --spec="gl" --extensions=""
|
--profile="core" --api="gl=4.3" --generator="c" --spec="gl" --extensions=""
|
||||||
Online:
|
Online:
|
||||||
https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.3
|
https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D4.3
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -267,10 +267,16 @@ int GLAD_GL_VERSION_3_0 = 0;
|
||||||
int GLAD_GL_VERSION_3_1 = 0;
|
int GLAD_GL_VERSION_3_1 = 0;
|
||||||
int GLAD_GL_VERSION_3_2 = 0;
|
int GLAD_GL_VERSION_3_2 = 0;
|
||||||
int GLAD_GL_VERSION_3_3 = 0;
|
int GLAD_GL_VERSION_3_3 = 0;
|
||||||
|
int GLAD_GL_VERSION_4_0 = 0;
|
||||||
|
int GLAD_GL_VERSION_4_1 = 0;
|
||||||
|
int GLAD_GL_VERSION_4_2 = 0;
|
||||||
|
int GLAD_GL_VERSION_4_3 = 0;
|
||||||
|
PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL;
|
||||||
PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL;
|
PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL;
|
||||||
PFNGLATTACHSHADERPROC glad_glAttachShader = NULL;
|
PFNGLATTACHSHADERPROC glad_glAttachShader = NULL;
|
||||||
PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL;
|
PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL;
|
||||||
PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL;
|
PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL;
|
||||||
|
PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed = NULL;
|
||||||
PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL;
|
PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL;
|
||||||
PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL;
|
PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL;
|
||||||
PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL;
|
PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL;
|
||||||
|
@ -279,27 +285,38 @@ PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL;
|
||||||
PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL;
|
PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL;
|
||||||
PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL;
|
PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL;
|
||||||
PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL;
|
PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL;
|
||||||
|
PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture = NULL;
|
||||||
|
PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL;
|
||||||
PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL;
|
PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL;
|
||||||
PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL;
|
PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL;
|
||||||
PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL;
|
PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL;
|
||||||
|
PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback = NULL;
|
||||||
PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL;
|
PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL;
|
||||||
|
PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer = NULL;
|
||||||
PFNGLBLENDCOLORPROC glad_glBlendColor = NULL;
|
PFNGLBLENDCOLORPROC glad_glBlendColor = NULL;
|
||||||
PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL;
|
PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL;
|
||||||
PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL;
|
PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL;
|
||||||
|
PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei = NULL;
|
||||||
|
PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi = NULL;
|
||||||
PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL;
|
PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL;
|
||||||
PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL;
|
PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL;
|
||||||
|
PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei = NULL;
|
||||||
|
PFNGLBLENDFUNCIPROC glad_glBlendFunci = NULL;
|
||||||
PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL;
|
PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL;
|
||||||
PFNGLBUFFERDATAPROC glad_glBufferData = NULL;
|
PFNGLBUFFERDATAPROC glad_glBufferData = NULL;
|
||||||
PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL;
|
PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL;
|
||||||
PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL;
|
PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL;
|
||||||
PFNGLCLAMPCOLORPROC glad_glClampColor = NULL;
|
PFNGLCLAMPCOLORPROC glad_glClampColor = NULL;
|
||||||
PFNGLCLEARPROC glad_glClear = NULL;
|
PFNGLCLEARPROC glad_glClear = NULL;
|
||||||
|
PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData = NULL;
|
||||||
|
PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData = NULL;
|
||||||
PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL;
|
PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL;
|
||||||
PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL;
|
PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL;
|
||||||
PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL;
|
PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL;
|
||||||
PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL;
|
PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL;
|
||||||
PFNGLCLEARCOLORPROC glad_glClearColor = NULL;
|
PFNGLCLEARCOLORPROC glad_glClearColor = NULL;
|
||||||
PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL;
|
PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL;
|
||||||
|
PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL;
|
||||||
PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL;
|
PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL;
|
||||||
PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL;
|
PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL;
|
||||||
PFNGLCOLORMASKPROC glad_glColorMask = NULL;
|
PFNGLCOLORMASKPROC glad_glColorMask = NULL;
|
||||||
|
@ -316,6 +333,7 @@ PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL;
|
||||||
PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL;
|
PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL;
|
||||||
PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL;
|
PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL;
|
||||||
PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL;
|
PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL;
|
||||||
|
PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData = NULL;
|
||||||
PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL;
|
PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL;
|
||||||
PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL;
|
PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL;
|
||||||
PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL;
|
PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL;
|
||||||
|
@ -323,44 +341,66 @@ PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL;
|
||||||
PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL;
|
PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL;
|
||||||
PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL;
|
PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL;
|
||||||
PFNGLCREATESHADERPROC glad_glCreateShader = NULL;
|
PFNGLCREATESHADERPROC glad_glCreateShader = NULL;
|
||||||
|
PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL;
|
||||||
PFNGLCULLFACEPROC glad_glCullFace = NULL;
|
PFNGLCULLFACEPROC glad_glCullFace = NULL;
|
||||||
|
PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL;
|
||||||
|
PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL;
|
||||||
|
PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL;
|
||||||
PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL;
|
PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL;
|
||||||
PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL;
|
PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL;
|
||||||
PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL;
|
PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL;
|
||||||
|
PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL;
|
||||||
PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL;
|
PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL;
|
||||||
PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL;
|
PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL;
|
||||||
PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL;
|
PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL;
|
||||||
PFNGLDELETESHADERPROC glad_glDeleteShader = NULL;
|
PFNGLDELETESHADERPROC glad_glDeleteShader = NULL;
|
||||||
PFNGLDELETESYNCPROC glad_glDeleteSync = NULL;
|
PFNGLDELETESYNCPROC glad_glDeleteSync = NULL;
|
||||||
PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL;
|
PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL;
|
||||||
|
PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks = NULL;
|
||||||
PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL;
|
PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL;
|
||||||
PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL;
|
PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL;
|
||||||
PFNGLDEPTHMASKPROC glad_glDepthMask = NULL;
|
PFNGLDEPTHMASKPROC glad_glDepthMask = NULL;
|
||||||
PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL;
|
PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL;
|
||||||
|
PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv = NULL;
|
||||||
|
PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed = NULL;
|
||||||
|
PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL;
|
||||||
PFNGLDETACHSHADERPROC glad_glDetachShader = NULL;
|
PFNGLDETACHSHADERPROC glad_glDetachShader = NULL;
|
||||||
PFNGLDISABLEPROC glad_glDisable = NULL;
|
PFNGLDISABLEPROC glad_glDisable = NULL;
|
||||||
PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL;
|
PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL;
|
||||||
PFNGLDISABLEIPROC glad_glDisablei = NULL;
|
PFNGLDISABLEIPROC glad_glDisablei = NULL;
|
||||||
|
PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute = NULL;
|
||||||
|
PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect = NULL;
|
||||||
PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL;
|
PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL;
|
||||||
|
PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect = NULL;
|
||||||
PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL;
|
PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL;
|
||||||
|
PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance = NULL;
|
||||||
PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL;
|
PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL;
|
||||||
PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL;
|
PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL;
|
||||||
PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL;
|
PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL;
|
||||||
PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL;
|
PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL;
|
||||||
|
PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect = NULL;
|
||||||
PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL;
|
PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL;
|
||||||
|
PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance = NULL;
|
||||||
PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL;
|
PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL;
|
||||||
|
PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance = NULL;
|
||||||
PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL;
|
PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL;
|
||||||
PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL;
|
PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL;
|
||||||
|
PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback = NULL;
|
||||||
|
PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced = NULL;
|
||||||
|
PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream = NULL;
|
||||||
|
PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced = NULL;
|
||||||
PFNGLENABLEPROC glad_glEnable = NULL;
|
PFNGLENABLEPROC glad_glEnable = NULL;
|
||||||
PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL;
|
PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL;
|
||||||
PFNGLENABLEIPROC glad_glEnablei = NULL;
|
PFNGLENABLEIPROC glad_glEnablei = NULL;
|
||||||
PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL;
|
PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL;
|
||||||
PFNGLENDQUERYPROC glad_glEndQuery = NULL;
|
PFNGLENDQUERYPROC glad_glEndQuery = NULL;
|
||||||
|
PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed = NULL;
|
||||||
PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL;
|
PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL;
|
||||||
PFNGLFENCESYNCPROC glad_glFenceSync = NULL;
|
PFNGLFENCESYNCPROC glad_glFenceSync = NULL;
|
||||||
PFNGLFINISHPROC glad_glFinish = NULL;
|
PFNGLFINISHPROC glad_glFinish = NULL;
|
||||||
PFNGLFLUSHPROC glad_glFlush = NULL;
|
PFNGLFLUSHPROC glad_glFlush = NULL;
|
||||||
PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL;
|
PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL;
|
||||||
|
PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri = NULL;
|
||||||
PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL;
|
PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL;
|
||||||
PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL;
|
PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL;
|
||||||
PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL;
|
PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL;
|
||||||
|
@ -370,13 +410,19 @@ PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL;
|
||||||
PFNGLFRONTFACEPROC glad_glFrontFace = NULL;
|
PFNGLFRONTFACEPROC glad_glFrontFace = NULL;
|
||||||
PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL;
|
PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL;
|
||||||
PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL;
|
PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL;
|
||||||
|
PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL;
|
||||||
PFNGLGENQUERIESPROC glad_glGenQueries = NULL;
|
PFNGLGENQUERIESPROC glad_glGenQueries = NULL;
|
||||||
PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL;
|
PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL;
|
||||||
PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL;
|
PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL;
|
||||||
PFNGLGENTEXTURESPROC glad_glGenTextures = NULL;
|
PFNGLGENTEXTURESPROC glad_glGenTextures = NULL;
|
||||||
|
PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks = NULL;
|
||||||
PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL;
|
PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL;
|
||||||
PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL;
|
PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL;
|
||||||
|
PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv = NULL;
|
||||||
PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL;
|
PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL;
|
||||||
|
PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName = NULL;
|
||||||
|
PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName = NULL;
|
||||||
|
PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv = NULL;
|
||||||
PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL;
|
PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL;
|
||||||
PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL;
|
PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL;
|
||||||
PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL;
|
PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL;
|
||||||
|
@ -391,19 +437,39 @@ PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL;
|
||||||
PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL;
|
PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL;
|
||||||
PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL;
|
PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL;
|
||||||
PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL;
|
PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL;
|
||||||
|
PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL;
|
||||||
|
PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v = NULL;
|
||||||
PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL;
|
PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL;
|
||||||
PFNGLGETERRORPROC glad_glGetError = NULL;
|
PFNGLGETERRORPROC glad_glGetError = NULL;
|
||||||
|
PFNGLGETFLOATI_VPROC glad_glGetFloati_v = NULL;
|
||||||
PFNGLGETFLOATVPROC glad_glGetFloatv = NULL;
|
PFNGLGETFLOATVPROC glad_glGetFloatv = NULL;
|
||||||
PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL;
|
PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL;
|
||||||
PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL;
|
PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL;
|
||||||
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL;
|
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL;
|
||||||
|
PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv = NULL;
|
||||||
PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL;
|
PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL;
|
||||||
PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL;
|
PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL;
|
||||||
PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL;
|
PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL;
|
||||||
PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL;
|
PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL;
|
||||||
|
PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v = NULL;
|
||||||
|
PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ = NULL;
|
||||||
PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL;
|
PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL;
|
||||||
|
PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL;
|
||||||
|
PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL;
|
||||||
|
PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL;
|
||||||
|
PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL;
|
||||||
PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL;
|
PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL;
|
||||||
|
PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv = NULL;
|
||||||
|
PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL;
|
||||||
|
PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL;
|
||||||
|
PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex = NULL;
|
||||||
|
PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation = NULL;
|
||||||
|
PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex = NULL;
|
||||||
|
PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName = NULL;
|
||||||
|
PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv = NULL;
|
||||||
|
PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv = NULL;
|
||||||
PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL;
|
PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL;
|
||||||
|
PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv = NULL;
|
||||||
PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL;
|
PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL;
|
||||||
PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL;
|
PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL;
|
||||||
PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL;
|
PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL;
|
||||||
|
@ -415,10 +481,13 @@ PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL;
|
||||||
PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL;
|
PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL;
|
||||||
PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL;
|
PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL;
|
||||||
PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL;
|
PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL;
|
||||||
|
PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat = NULL;
|
||||||
PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL;
|
PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL;
|
||||||
PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL;
|
PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL;
|
||||||
PFNGLGETSTRINGPROC glad_glGetString = NULL;
|
PFNGLGETSTRINGPROC glad_glGetString = NULL;
|
||||||
PFNGLGETSTRINGIPROC glad_glGetStringi = NULL;
|
PFNGLGETSTRINGIPROC glad_glGetStringi = NULL;
|
||||||
|
PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex = NULL;
|
||||||
|
PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation = NULL;
|
||||||
PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL;
|
PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL;
|
||||||
PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL;
|
PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL;
|
||||||
PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL;
|
PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL;
|
||||||
|
@ -431,36 +500,51 @@ PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL;
|
||||||
PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL;
|
PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL;
|
||||||
PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL;
|
PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL;
|
||||||
PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL;
|
PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL;
|
||||||
|
PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv = NULL;
|
||||||
|
PFNGLGETUNIFORMDVPROC glad_glGetUniformdv = NULL;
|
||||||
PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL;
|
PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL;
|
||||||
PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL;
|
PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL;
|
||||||
PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL;
|
PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL;
|
||||||
PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL;
|
PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL;
|
||||||
PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL;
|
PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL;
|
||||||
|
PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv = NULL;
|
||||||
PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL;
|
PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL;
|
||||||
PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL;
|
PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL;
|
||||||
PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL;
|
PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL;
|
||||||
PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL;
|
PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL;
|
||||||
PFNGLHINTPROC glad_glHint = NULL;
|
PFNGLHINTPROC glad_glHint = NULL;
|
||||||
|
PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData = NULL;
|
||||||
|
PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData = NULL;
|
||||||
|
PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer = NULL;
|
||||||
|
PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer = NULL;
|
||||||
|
PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage = NULL;
|
||||||
|
PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage = NULL;
|
||||||
PFNGLISBUFFERPROC glad_glIsBuffer = NULL;
|
PFNGLISBUFFERPROC glad_glIsBuffer = NULL;
|
||||||
PFNGLISENABLEDPROC glad_glIsEnabled = NULL;
|
PFNGLISENABLEDPROC glad_glIsEnabled = NULL;
|
||||||
PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL;
|
PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL;
|
||||||
PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL;
|
PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL;
|
||||||
PFNGLISPROGRAMPROC glad_glIsProgram = NULL;
|
PFNGLISPROGRAMPROC glad_glIsProgram = NULL;
|
||||||
|
PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL;
|
||||||
PFNGLISQUERYPROC glad_glIsQuery = NULL;
|
PFNGLISQUERYPROC glad_glIsQuery = NULL;
|
||||||
PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL;
|
PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL;
|
||||||
PFNGLISSAMPLERPROC glad_glIsSampler = NULL;
|
PFNGLISSAMPLERPROC glad_glIsSampler = NULL;
|
||||||
PFNGLISSHADERPROC glad_glIsShader = NULL;
|
PFNGLISSHADERPROC glad_glIsShader = NULL;
|
||||||
PFNGLISSYNCPROC glad_glIsSync = NULL;
|
PFNGLISSYNCPROC glad_glIsSync = NULL;
|
||||||
PFNGLISTEXTUREPROC glad_glIsTexture = NULL;
|
PFNGLISTEXTUREPROC glad_glIsTexture = NULL;
|
||||||
|
PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback = NULL;
|
||||||
PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL;
|
PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL;
|
||||||
PFNGLLINEWIDTHPROC glad_glLineWidth = NULL;
|
PFNGLLINEWIDTHPROC glad_glLineWidth = NULL;
|
||||||
PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL;
|
PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL;
|
||||||
PFNGLLOGICOPPROC glad_glLogicOp = NULL;
|
PFNGLLOGICOPPROC glad_glLogicOp = NULL;
|
||||||
PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL;
|
PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL;
|
||||||
PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL;
|
PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL;
|
||||||
|
PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier = NULL;
|
||||||
|
PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading = NULL;
|
||||||
PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL;
|
PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL;
|
||||||
|
PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect = NULL;
|
||||||
PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL;
|
PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL;
|
||||||
PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL;
|
PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL;
|
||||||
|
PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect = NULL;
|
||||||
PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL;
|
PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL;
|
||||||
PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL;
|
PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL;
|
||||||
PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL;
|
PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL;
|
||||||
|
@ -471,6 +555,11 @@ PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL;
|
||||||
PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL;
|
PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL;
|
||||||
PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL;
|
PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL;
|
||||||
PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL;
|
PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL;
|
||||||
|
PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL;
|
||||||
|
PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL;
|
||||||
|
PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv = NULL;
|
||||||
|
PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri = NULL;
|
||||||
|
PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback = NULL;
|
||||||
PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL;
|
PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL;
|
||||||
PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL;
|
PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL;
|
||||||
PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL;
|
PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL;
|
||||||
|
@ -480,13 +569,69 @@ PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL;
|
||||||
PFNGLPOINTSIZEPROC glad_glPointSize = NULL;
|
PFNGLPOINTSIZEPROC glad_glPointSize = NULL;
|
||||||
PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL;
|
PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL;
|
||||||
PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL;
|
PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL;
|
||||||
|
PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL;
|
||||||
PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL;
|
PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL;
|
||||||
|
PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL;
|
||||||
|
PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv = NULL;
|
||||||
|
PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL;
|
||||||
PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL;
|
PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL;
|
||||||
|
PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL;
|
||||||
PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL;
|
PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL;
|
||||||
PFNGLREADBUFFERPROC glad_glReadBuffer = NULL;
|
PFNGLREADBUFFERPROC glad_glReadBuffer = NULL;
|
||||||
PFNGLREADPIXELSPROC glad_glReadPixels = NULL;
|
PFNGLREADPIXELSPROC glad_glReadPixels = NULL;
|
||||||
|
PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler = NULL;
|
||||||
PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL;
|
PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL;
|
||||||
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL;
|
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL;
|
||||||
|
PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback = NULL;
|
||||||
PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL;
|
PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL;
|
||||||
PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL;
|
PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL;
|
||||||
PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL;
|
PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL;
|
||||||
|
@ -496,9 +641,14 @@ PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL;
|
||||||
PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL;
|
PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL;
|
||||||
PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL;
|
PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL;
|
||||||
PFNGLSCISSORPROC glad_glScissor = NULL;
|
PFNGLSCISSORPROC glad_glScissor = NULL;
|
||||||
|
PFNGLSCISSORARRAYVPROC glad_glScissorArrayv = NULL;
|
||||||
|
PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed = NULL;
|
||||||
|
PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv = NULL;
|
||||||
PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL;
|
PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL;
|
||||||
PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL;
|
PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL;
|
||||||
|
PFNGLSHADERBINARYPROC glad_glShaderBinary = NULL;
|
||||||
PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL;
|
PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL;
|
||||||
|
PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding = NULL;
|
||||||
PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL;
|
PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL;
|
||||||
PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL;
|
PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL;
|
||||||
PFNGLSTENCILMASKPROC glad_glStencilMask = NULL;
|
PFNGLSTENCILMASKPROC glad_glStencilMask = NULL;
|
||||||
|
@ -506,6 +656,7 @@ PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL;
|
||||||
PFNGLSTENCILOPPROC glad_glStencilOp = NULL;
|
PFNGLSTENCILOPPROC glad_glStencilOp = NULL;
|
||||||
PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL;
|
PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL;
|
||||||
PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL;
|
PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL;
|
||||||
|
PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange = NULL;
|
||||||
PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL;
|
PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL;
|
||||||
PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL;
|
PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL;
|
||||||
PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL;
|
PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL;
|
||||||
|
@ -525,28 +676,42 @@ PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL;
|
||||||
PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL;
|
PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL;
|
||||||
PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL;
|
PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL;
|
||||||
PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL;
|
PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL;
|
||||||
|
PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D = NULL;
|
||||||
|
PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D = NULL;
|
||||||
|
PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample = NULL;
|
||||||
|
PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D = NULL;
|
||||||
|
PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample = NULL;
|
||||||
PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL;
|
PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL;
|
||||||
PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL;
|
PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL;
|
||||||
PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL;
|
PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL;
|
||||||
|
PFNGLTEXTUREVIEWPROC glad_glTextureView = NULL;
|
||||||
PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL;
|
PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL;
|
||||||
|
PFNGLUNIFORM1DPROC glad_glUniform1d = NULL;
|
||||||
|
PFNGLUNIFORM1DVPROC glad_glUniform1dv = NULL;
|
||||||
PFNGLUNIFORM1FPROC glad_glUniform1f = NULL;
|
PFNGLUNIFORM1FPROC glad_glUniform1f = NULL;
|
||||||
PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL;
|
PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL;
|
||||||
PFNGLUNIFORM1IPROC glad_glUniform1i = NULL;
|
PFNGLUNIFORM1IPROC glad_glUniform1i = NULL;
|
||||||
PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL;
|
PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL;
|
||||||
PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL;
|
PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL;
|
||||||
PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL;
|
PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL;
|
||||||
|
PFNGLUNIFORM2DPROC glad_glUniform2d = NULL;
|
||||||
|
PFNGLUNIFORM2DVPROC glad_glUniform2dv = NULL;
|
||||||
PFNGLUNIFORM2FPROC glad_glUniform2f = NULL;
|
PFNGLUNIFORM2FPROC glad_glUniform2f = NULL;
|
||||||
PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL;
|
PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL;
|
||||||
PFNGLUNIFORM2IPROC glad_glUniform2i = NULL;
|
PFNGLUNIFORM2IPROC glad_glUniform2i = NULL;
|
||||||
PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL;
|
PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL;
|
||||||
PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL;
|
PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL;
|
||||||
PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL;
|
PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL;
|
||||||
|
PFNGLUNIFORM3DPROC glad_glUniform3d = NULL;
|
||||||
|
PFNGLUNIFORM3DVPROC glad_glUniform3dv = NULL;
|
||||||
PFNGLUNIFORM3FPROC glad_glUniform3f = NULL;
|
PFNGLUNIFORM3FPROC glad_glUniform3f = NULL;
|
||||||
PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL;
|
PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL;
|
||||||
PFNGLUNIFORM3IPROC glad_glUniform3i = NULL;
|
PFNGLUNIFORM3IPROC glad_glUniform3i = NULL;
|
||||||
PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL;
|
PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL;
|
||||||
PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL;
|
PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL;
|
||||||
PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL;
|
PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL;
|
||||||
|
PFNGLUNIFORM4DPROC glad_glUniform4d = NULL;
|
||||||
|
PFNGLUNIFORM4DVPROC glad_glUniform4dv = NULL;
|
||||||
PFNGLUNIFORM4FPROC glad_glUniform4f = NULL;
|
PFNGLUNIFORM4FPROC glad_glUniform4f = NULL;
|
||||||
PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL;
|
PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL;
|
||||||
PFNGLUNIFORM4IPROC glad_glUniform4i = NULL;
|
PFNGLUNIFORM4IPROC glad_glUniform4i = NULL;
|
||||||
|
@ -554,18 +719,30 @@ PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL;
|
||||||
PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL;
|
PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL;
|
||||||
PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL;
|
PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL;
|
||||||
PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL;
|
PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL;
|
PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL;
|
PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL;
|
PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL;
|
PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL;
|
PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL;
|
PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL;
|
PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL;
|
PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL;
|
||||||
|
PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv = NULL;
|
||||||
PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL;
|
PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL;
|
||||||
|
PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv = NULL;
|
||||||
PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL;
|
PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL;
|
||||||
PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL;
|
PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL;
|
||||||
|
PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL;
|
||||||
PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL;
|
PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL;
|
||||||
|
PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL;
|
||||||
PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL;
|
PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL;
|
||||||
PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL;
|
PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL;
|
||||||
PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL;
|
PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL;
|
||||||
|
@ -602,7 +779,9 @@ PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL;
|
||||||
PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL;
|
PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL;
|
||||||
PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL;
|
PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL;
|
||||||
PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL;
|
PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL;
|
||||||
|
PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding = NULL;
|
||||||
PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL;
|
PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL;
|
||||||
|
PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat = NULL;
|
||||||
PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL;
|
PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL;
|
||||||
PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL;
|
PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL;
|
||||||
PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL;
|
PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL;
|
||||||
|
@ -623,7 +802,18 @@ PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL;
|
||||||
PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL;
|
PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL;
|
||||||
PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL;
|
PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL;
|
||||||
PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL;
|
PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL;
|
||||||
|
PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat = NULL;
|
||||||
PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL;
|
PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d = NULL;
|
||||||
|
PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv = NULL;
|
||||||
|
PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat = NULL;
|
||||||
|
PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer = NULL;
|
||||||
PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL;
|
PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL;
|
||||||
PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL;
|
PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL;
|
||||||
PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL;
|
PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL;
|
||||||
|
@ -633,6 +823,7 @@ PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL;
|
||||||
PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL;
|
PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL;
|
||||||
PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL;
|
PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL;
|
||||||
PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL;
|
PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL;
|
||||||
|
PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor = NULL;
|
||||||
PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL;
|
PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL;
|
||||||
PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL;
|
PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL;
|
||||||
PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL;
|
PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL;
|
||||||
|
@ -640,6 +831,9 @@ PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL;
|
||||||
PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL;
|
PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL;
|
||||||
PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL;
|
PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL;
|
||||||
PFNGLVIEWPORTPROC glad_glViewport = NULL;
|
PFNGLVIEWPORTPROC glad_glViewport = NULL;
|
||||||
|
PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv = NULL;
|
||||||
|
PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf = NULL;
|
||||||
|
PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv = NULL;
|
||||||
PFNGLWAITSYNCPROC glad_glWaitSync = NULL;
|
PFNGLWAITSYNCPROC glad_glWaitSync = NULL;
|
||||||
static void load_GL_VERSION_1_0(GLADloadproc load) {
|
static void load_GL_VERSION_1_0(GLADloadproc load) {
|
||||||
if(!GLAD_GL_VERSION_1_0) return;
|
if(!GLAD_GL_VERSION_1_0) return;
|
||||||
|
@ -1054,6 +1248,209 @@ static void load_GL_VERSION_3_3(GLADloadproc load) {
|
||||||
glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)load("glSecondaryColorP3ui");
|
glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)load("glSecondaryColorP3ui");
|
||||||
glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)load("glSecondaryColorP3uiv");
|
glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)load("glSecondaryColorP3uiv");
|
||||||
}
|
}
|
||||||
|
static void load_GL_VERSION_4_0(GLADloadproc load) {
|
||||||
|
if(!GLAD_GL_VERSION_4_0) return;
|
||||||
|
glad_glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)load("glMinSampleShading");
|
||||||
|
glad_glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)load("glBlendEquationi");
|
||||||
|
glad_glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)load("glBlendEquationSeparatei");
|
||||||
|
glad_glBlendFunci = (PFNGLBLENDFUNCIPROC)load("glBlendFunci");
|
||||||
|
glad_glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)load("glBlendFuncSeparatei");
|
||||||
|
glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)load("glDrawArraysIndirect");
|
||||||
|
glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)load("glDrawElementsIndirect");
|
||||||
|
glad_glUniform1d = (PFNGLUNIFORM1DPROC)load("glUniform1d");
|
||||||
|
glad_glUniform2d = (PFNGLUNIFORM2DPROC)load("glUniform2d");
|
||||||
|
glad_glUniform3d = (PFNGLUNIFORM3DPROC)load("glUniform3d");
|
||||||
|
glad_glUniform4d = (PFNGLUNIFORM4DPROC)load("glUniform4d");
|
||||||
|
glad_glUniform1dv = (PFNGLUNIFORM1DVPROC)load("glUniform1dv");
|
||||||
|
glad_glUniform2dv = (PFNGLUNIFORM2DVPROC)load("glUniform2dv");
|
||||||
|
glad_glUniform3dv = (PFNGLUNIFORM3DVPROC)load("glUniform3dv");
|
||||||
|
glad_glUniform4dv = (PFNGLUNIFORM4DVPROC)load("glUniform4dv");
|
||||||
|
glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)load("glUniformMatrix2dv");
|
||||||
|
glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)load("glUniformMatrix3dv");
|
||||||
|
glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)load("glUniformMatrix4dv");
|
||||||
|
glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)load("glUniformMatrix2x3dv");
|
||||||
|
glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)load("glUniformMatrix2x4dv");
|
||||||
|
glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)load("glUniformMatrix3x2dv");
|
||||||
|
glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)load("glUniformMatrix3x4dv");
|
||||||
|
glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)load("glUniformMatrix4x2dv");
|
||||||
|
glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)load("glUniformMatrix4x3dv");
|
||||||
|
glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC)load("glGetUniformdv");
|
||||||
|
glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)load("glGetSubroutineUniformLocation");
|
||||||
|
glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)load("glGetSubroutineIndex");
|
||||||
|
glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)load("glGetActiveSubroutineUniformiv");
|
||||||
|
glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)load("glGetActiveSubroutineUniformName");
|
||||||
|
glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)load("glGetActiveSubroutineName");
|
||||||
|
glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)load("glUniformSubroutinesuiv");
|
||||||
|
glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)load("glGetUniformSubroutineuiv");
|
||||||
|
glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)load("glGetProgramStageiv");
|
||||||
|
glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)load("glPatchParameteri");
|
||||||
|
glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)load("glPatchParameterfv");
|
||||||
|
glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)load("glBindTransformFeedback");
|
||||||
|
glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)load("glDeleteTransformFeedbacks");
|
||||||
|
glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)load("glGenTransformFeedbacks");
|
||||||
|
glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)load("glIsTransformFeedback");
|
||||||
|
glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)load("glPauseTransformFeedback");
|
||||||
|
glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)load("glResumeTransformFeedback");
|
||||||
|
glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)load("glDrawTransformFeedback");
|
||||||
|
glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)load("glDrawTransformFeedbackStream");
|
||||||
|
glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)load("glBeginQueryIndexed");
|
||||||
|
glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)load("glEndQueryIndexed");
|
||||||
|
glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)load("glGetQueryIndexediv");
|
||||||
|
}
|
||||||
|
static void load_GL_VERSION_4_1(GLADloadproc load) {
|
||||||
|
if(!GLAD_GL_VERSION_4_1) return;
|
||||||
|
glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)load("glReleaseShaderCompiler");
|
||||||
|
glad_glShaderBinary = (PFNGLSHADERBINARYPROC)load("glShaderBinary");
|
||||||
|
glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)load("glGetShaderPrecisionFormat");
|
||||||
|
glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC)load("glDepthRangef");
|
||||||
|
glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC)load("glClearDepthf");
|
||||||
|
glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)load("glGetProgramBinary");
|
||||||
|
glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC)load("glProgramBinary");
|
||||||
|
glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)load("glProgramParameteri");
|
||||||
|
glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)load("glUseProgramStages");
|
||||||
|
glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)load("glActiveShaderProgram");
|
||||||
|
glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)load("glCreateShaderProgramv");
|
||||||
|
glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)load("glBindProgramPipeline");
|
||||||
|
glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)load("glDeleteProgramPipelines");
|
||||||
|
glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)load("glGenProgramPipelines");
|
||||||
|
glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)load("glIsProgramPipeline");
|
||||||
|
glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)load("glGetProgramPipelineiv");
|
||||||
|
glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)load("glProgramParameteri");
|
||||||
|
glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)load("glProgramUniform1i");
|
||||||
|
glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)load("glProgramUniform1iv");
|
||||||
|
glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)load("glProgramUniform1f");
|
||||||
|
glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)load("glProgramUniform1fv");
|
||||||
|
glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)load("glProgramUniform1d");
|
||||||
|
glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)load("glProgramUniform1dv");
|
||||||
|
glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)load("glProgramUniform1ui");
|
||||||
|
glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)load("glProgramUniform1uiv");
|
||||||
|
glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)load("glProgramUniform2i");
|
||||||
|
glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)load("glProgramUniform2iv");
|
||||||
|
glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)load("glProgramUniform2f");
|
||||||
|
glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)load("glProgramUniform2fv");
|
||||||
|
glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)load("glProgramUniform2d");
|
||||||
|
glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)load("glProgramUniform2dv");
|
||||||
|
glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)load("glProgramUniform2ui");
|
||||||
|
glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)load("glProgramUniform2uiv");
|
||||||
|
glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)load("glProgramUniform3i");
|
||||||
|
glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)load("glProgramUniform3iv");
|
||||||
|
glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)load("glProgramUniform3f");
|
||||||
|
glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)load("glProgramUniform3fv");
|
||||||
|
glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)load("glProgramUniform3d");
|
||||||
|
glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)load("glProgramUniform3dv");
|
||||||
|
glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)load("glProgramUniform3ui");
|
||||||
|
glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)load("glProgramUniform3uiv");
|
||||||
|
glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)load("glProgramUniform4i");
|
||||||
|
glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)load("glProgramUniform4iv");
|
||||||
|
glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)load("glProgramUniform4f");
|
||||||
|
glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)load("glProgramUniform4fv");
|
||||||
|
glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)load("glProgramUniform4d");
|
||||||
|
glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)load("glProgramUniform4dv");
|
||||||
|
glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)load("glProgramUniform4ui");
|
||||||
|
glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)load("glProgramUniform4uiv");
|
||||||
|
glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)load("glProgramUniformMatrix2fv");
|
||||||
|
glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)load("glProgramUniformMatrix3fv");
|
||||||
|
glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)load("glProgramUniformMatrix4fv");
|
||||||
|
glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)load("glProgramUniformMatrix2dv");
|
||||||
|
glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)load("glProgramUniformMatrix3dv");
|
||||||
|
glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)load("glProgramUniformMatrix4dv");
|
||||||
|
glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)load("glProgramUniformMatrix2x3fv");
|
||||||
|
glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)load("glProgramUniformMatrix3x2fv");
|
||||||
|
glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)load("glProgramUniformMatrix2x4fv");
|
||||||
|
glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)load("glProgramUniformMatrix4x2fv");
|
||||||
|
glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)load("glProgramUniformMatrix3x4fv");
|
||||||
|
glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)load("glProgramUniformMatrix4x3fv");
|
||||||
|
glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)load("glProgramUniformMatrix2x3dv");
|
||||||
|
glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)load("glProgramUniformMatrix3x2dv");
|
||||||
|
glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)load("glProgramUniformMatrix2x4dv");
|
||||||
|
glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)load("glProgramUniformMatrix4x2dv");
|
||||||
|
glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)load("glProgramUniformMatrix3x4dv");
|
||||||
|
glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)load("glProgramUniformMatrix4x3dv");
|
||||||
|
glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)load("glValidateProgramPipeline");
|
||||||
|
glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)load("glGetProgramPipelineInfoLog");
|
||||||
|
glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)load("glVertexAttribL1d");
|
||||||
|
glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)load("glVertexAttribL2d");
|
||||||
|
glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)load("glVertexAttribL3d");
|
||||||
|
glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)load("glVertexAttribL4d");
|
||||||
|
glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)load("glVertexAttribL1dv");
|
||||||
|
glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)load("glVertexAttribL2dv");
|
||||||
|
glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)load("glVertexAttribL3dv");
|
||||||
|
glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)load("glVertexAttribL4dv");
|
||||||
|
glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)load("glVertexAttribLPointer");
|
||||||
|
glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)load("glGetVertexAttribLdv");
|
||||||
|
glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)load("glViewportArrayv");
|
||||||
|
glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)load("glViewportIndexedf");
|
||||||
|
glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)load("glViewportIndexedfv");
|
||||||
|
glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC)load("glScissorArrayv");
|
||||||
|
glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)load("glScissorIndexed");
|
||||||
|
glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)load("glScissorIndexedv");
|
||||||
|
glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)load("glDepthRangeArrayv");
|
||||||
|
glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)load("glDepthRangeIndexed");
|
||||||
|
glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC)load("glGetFloati_v");
|
||||||
|
glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)load("glGetDoublei_v");
|
||||||
|
}
|
||||||
|
static void load_GL_VERSION_4_2(GLADloadproc load) {
|
||||||
|
if(!GLAD_GL_VERSION_4_2) return;
|
||||||
|
glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)load("glDrawArraysInstancedBaseInstance");
|
||||||
|
glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)load("glDrawElementsInstancedBaseInstance");
|
||||||
|
glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)load("glDrawElementsInstancedBaseVertexBaseInstance");
|
||||||
|
glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)load("glGetInternalformativ");
|
||||||
|
glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)load("glGetActiveAtomicCounterBufferiv");
|
||||||
|
glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)load("glBindImageTexture");
|
||||||
|
glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)load("glMemoryBarrier");
|
||||||
|
glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)load("glTexStorage1D");
|
||||||
|
glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)load("glTexStorage2D");
|
||||||
|
glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)load("glTexStorage3D");
|
||||||
|
glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)load("glDrawTransformFeedbackInstanced");
|
||||||
|
glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)load("glDrawTransformFeedbackStreamInstanced");
|
||||||
|
}
|
||||||
|
static void load_GL_VERSION_4_3(GLADloadproc load) {
|
||||||
|
if(!GLAD_GL_VERSION_4_3) return;
|
||||||
|
glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)load("glClearBufferData");
|
||||||
|
glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)load("glClearBufferSubData");
|
||||||
|
glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)load("glDispatchCompute");
|
||||||
|
glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)load("glDispatchComputeIndirect");
|
||||||
|
glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)load("glCopyImageSubData");
|
||||||
|
glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)load("glFramebufferParameteri");
|
||||||
|
glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)load("glGetFramebufferParameteriv");
|
||||||
|
glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)load("glGetInternalformati64v");
|
||||||
|
glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)load("glInvalidateTexSubImage");
|
||||||
|
glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)load("glInvalidateTexImage");
|
||||||
|
glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)load("glInvalidateBufferSubData");
|
||||||
|
glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)load("glInvalidateBufferData");
|
||||||
|
glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)load("glInvalidateFramebuffer");
|
||||||
|
glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)load("glInvalidateSubFramebuffer");
|
||||||
|
glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)load("glMultiDrawArraysIndirect");
|
||||||
|
glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)load("glMultiDrawElementsIndirect");
|
||||||
|
glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)load("glGetProgramInterfaceiv");
|
||||||
|
glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)load("glGetProgramResourceIndex");
|
||||||
|
glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)load("glGetProgramResourceName");
|
||||||
|
glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)load("glGetProgramResourceiv");
|
||||||
|
glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)load("glGetProgramResourceLocation");
|
||||||
|
glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)load("glGetProgramResourceLocationIndex");
|
||||||
|
glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)load("glShaderStorageBlockBinding");
|
||||||
|
glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)load("glTexBufferRange");
|
||||||
|
glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)load("glTexStorage2DMultisample");
|
||||||
|
glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)load("glTexStorage3DMultisample");
|
||||||
|
glad_glTextureView = (PFNGLTEXTUREVIEWPROC)load("glTextureView");
|
||||||
|
glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)load("glBindVertexBuffer");
|
||||||
|
glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)load("glVertexAttribFormat");
|
||||||
|
glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)load("glVertexAttribIFormat");
|
||||||
|
glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)load("glVertexAttribLFormat");
|
||||||
|
glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)load("glVertexAttribBinding");
|
||||||
|
glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)load("glVertexBindingDivisor");
|
||||||
|
glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)load("glDebugMessageControl");
|
||||||
|
glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)load("glDebugMessageInsert");
|
||||||
|
glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)load("glDebugMessageCallback");
|
||||||
|
glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)load("glGetDebugMessageLog");
|
||||||
|
glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)load("glPushDebugGroup");
|
||||||
|
glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)load("glPopDebugGroup");
|
||||||
|
glad_glObjectLabel = (PFNGLOBJECTLABELPROC)load("glObjectLabel");
|
||||||
|
glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)load("glGetObjectLabel");
|
||||||
|
glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)load("glObjectPtrLabel");
|
||||||
|
glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)load("glGetObjectPtrLabel");
|
||||||
|
glad_glGetPointerv = (PFNGLGETPOINTERVPROC)load("glGetPointerv");
|
||||||
|
}
|
||||||
static int find_extensionsGL(void) {
|
static int find_extensionsGL(void) {
|
||||||
if (!get_exts()) return 0;
|
if (!get_exts()) return 0;
|
||||||
(void)&has_ext;
|
(void)&has_ext;
|
||||||
|
@ -1109,8 +1506,12 @@ static void find_coreGL(void) {
|
||||||
GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3;
|
GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3;
|
||||||
GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3;
|
GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3;
|
||||||
GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3;
|
GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3;
|
||||||
if (GLVersion.major > 3 || (GLVersion.major >= 3 && GLVersion.minor >= 3)) {
|
GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4;
|
||||||
max_loaded_major = 3;
|
GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4;
|
||||||
|
GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4;
|
||||||
|
GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4;
|
||||||
|
if (GLVersion.major > 4 || (GLVersion.major >= 4 && GLVersion.minor >= 3)) {
|
||||||
|
max_loaded_major = 4;
|
||||||
max_loaded_minor = 3;
|
max_loaded_minor = 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1133,6 +1534,10 @@ int gladLoadGLLoader(GLADloadproc load) {
|
||||||
load_GL_VERSION_3_1(load);
|
load_GL_VERSION_3_1(load);
|
||||||
load_GL_VERSION_3_2(load);
|
load_GL_VERSION_3_2(load);
|
||||||
load_GL_VERSION_3_3(load);
|
load_GL_VERSION_3_3(load);
|
||||||
|
load_GL_VERSION_4_0(load);
|
||||||
|
load_GL_VERSION_4_1(load);
|
||||||
|
load_GL_VERSION_4_2(load);
|
||||||
|
load_GL_VERSION_4_3(load);
|
||||||
|
|
||||||
if (!find_extensionsGL()) return 0;
|
if (!find_extensionsGL()) return 0;
|
||||||
return GLVersion.major != 0 || GLVersion.minor != 0;
|
return GLVersion.major != 0 || GLVersion.minor != 0;
|
||||||
|
|
1081
src/vendor/glad/glad.h
vendored
1081
src/vendor/glad/glad.h
vendored
File diff suppressed because it is too large
Load diff
649
src/vendor/qoi.h
vendored
649
src/vendor/qoi.h
vendored
|
@ -1,649 +0,0 @@
|
||||||
/*
|
|
||||||
|
|
||||||
Copyright (c) 2021, Dominic Szablewski - https://phoboslab.org
|
|
||||||
SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
|
|
||||||
QOI - The "Quite OK Image" format for fast, lossless image compression
|
|
||||||
|
|
||||||
-- About
|
|
||||||
|
|
||||||
QOI encodes and decodes images in a lossless format. Compared to stb_image and
|
|
||||||
stb_image_write QOI offers 20x-50x faster encoding, 3x-4x faster decoding and
|
|
||||||
20% better compression.
|
|
||||||
|
|
||||||
|
|
||||||
-- Synopsis
|
|
||||||
|
|
||||||
// Define `QOI_IMPLEMENTATION` in *one* C/C++ file before including this
|
|
||||||
// library to create the implementation.
|
|
||||||
|
|
||||||
#define QOI_IMPLEMENTATION
|
|
||||||
#include "qoi.h"
|
|
||||||
|
|
||||||
// Encode and store an RGBA buffer to the file system. The qoi_desc describes
|
|
||||||
// the input pixel data.
|
|
||||||
qoi_write("image_new.qoi", rgba_pixels, &(qoi_desc){
|
|
||||||
.width = 1920,
|
|
||||||
.height = 1080,
|
|
||||||
.channels = 4,
|
|
||||||
.colorspace = QOI_SRGB
|
|
||||||
});
|
|
||||||
|
|
||||||
// Load and decode a QOI image from the file system into a 32bbp RGBA buffer.
|
|
||||||
// The qoi_desc struct will be filled with the width, height, number of channels
|
|
||||||
// and colorspace read from the file header.
|
|
||||||
qoi_desc desc;
|
|
||||||
void *rgba_pixels = qoi_read("image.qoi", &desc, 4);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Documentation
|
|
||||||
|
|
||||||
This library provides the following functions;
|
|
||||||
- qoi_read -- read and decode a QOI file
|
|
||||||
- qoi_decode -- decode the raw bytes of a QOI image from memory
|
|
||||||
- qoi_write -- encode and write a QOI file
|
|
||||||
- qoi_encode -- encode an rgba buffer into a QOI image in memory
|
|
||||||
|
|
||||||
See the function declaration below for the signature and more information.
|
|
||||||
|
|
||||||
If you don't want/need the qoi_read and qoi_write functions, you can define
|
|
||||||
QOI_NO_STDIO before including this library.
|
|
||||||
|
|
||||||
This library uses malloc() and free(). To supply your own malloc implementation
|
|
||||||
you can define QOI_MALLOC and QOI_FREE before including this library.
|
|
||||||
|
|
||||||
This library uses memset() to zero-initialize the index. To supply your own
|
|
||||||
implementation you can define QOI_ZEROARR before including this library.
|
|
||||||
|
|
||||||
|
|
||||||
-- Data Format
|
|
||||||
|
|
||||||
A QOI file has a 14 byte header, followed by any number of data "chunks" and an
|
|
||||||
8-byte end marker.
|
|
||||||
|
|
||||||
struct qoi_header_t {
|
|
||||||
char magic[4]; // magic bytes "qoif"
|
|
||||||
uint32_t width; // image width in pixels (BE)
|
|
||||||
uint32_t height; // image height in pixels (BE)
|
|
||||||
uint8_t channels; // 3 = RGB, 4 = RGBA
|
|
||||||
uint8_t colorspace; // 0 = sRGB with linear alpha, 1 = all channels linear
|
|
||||||
};
|
|
||||||
|
|
||||||
Images are encoded row by row, left to right, top to bottom. The decoder and
|
|
||||||
encoder start with {r: 0, g: 0, b: 0, a: 255} as the previous pixel value. An
|
|
||||||
image is complete when all pixels specified by width * height have been covered.
|
|
||||||
|
|
||||||
Pixels are encoded as
|
|
||||||
- a run of the previous pixel
|
|
||||||
- an index into an array of previously seen pixels
|
|
||||||
- a difference to the previous pixel value in r,g,b
|
|
||||||
- full r,g,b or r,g,b,a values
|
|
||||||
|
|
||||||
The color channels are assumed to not be premultiplied with the alpha channel
|
|
||||||
("un-premultiplied alpha").
|
|
||||||
|
|
||||||
A running array[64] (zero-initialized) of previously seen pixel values is
|
|
||||||
maintained by the encoder and decoder. Each pixel that is seen by the encoder
|
|
||||||
and decoder is put into this array at the position formed by a hash function of
|
|
||||||
the color value. In the encoder, if the pixel value at the index matches the
|
|
||||||
current pixel, this index position is written to the stream as QOI_OP_INDEX.
|
|
||||||
The hash function for the index is:
|
|
||||||
|
|
||||||
index_position = (r * 3 + g * 5 + b * 7 + a * 11) % 64
|
|
||||||
|
|
||||||
Each chunk starts with a 2- or 8-bit tag, followed by a number of data bits. The
|
|
||||||
bit length of chunks is divisible by 8 - i.e. all chunks are byte aligned. All
|
|
||||||
values encoded in these data bits have the most significant bit on the left.
|
|
||||||
|
|
||||||
The 8-bit tags have precedence over the 2-bit tags. A decoder must check for the
|
|
||||||
presence of an 8-bit tag first.
|
|
||||||
|
|
||||||
The byte stream's end is marked with 7 0x00 bytes followed a single 0x01 byte.
|
|
||||||
|
|
||||||
|
|
||||||
The possible chunks are:
|
|
||||||
|
|
||||||
|
|
||||||
.- QOI_OP_INDEX ----------.
|
|
||||||
| Byte[0] |
|
|
||||||
| 7 6 5 4 3 2 1 0 |
|
|
||||||
|-------+-----------------|
|
|
||||||
| 0 0 | index |
|
|
||||||
`-------------------------`
|
|
||||||
2-bit tag b00
|
|
||||||
6-bit index into the color index array: 0..63
|
|
||||||
|
|
||||||
A valid encoder must not issue 2 or more consecutive QOI_OP_INDEX chunks to the
|
|
||||||
same index. QOI_OP_RUN should be used instead.
|
|
||||||
|
|
||||||
|
|
||||||
.- QOI_OP_DIFF -----------.
|
|
||||||
| Byte[0] |
|
|
||||||
| 7 6 5 4 3 2 1 0 |
|
|
||||||
|-------+-----+-----+-----|
|
|
||||||
| 0 1 | dr | dg | db |
|
|
||||||
`-------------------------`
|
|
||||||
2-bit tag b01
|
|
||||||
2-bit red channel difference from the previous pixel between -2..1
|
|
||||||
2-bit green channel difference from the previous pixel between -2..1
|
|
||||||
2-bit blue channel difference from the previous pixel between -2..1
|
|
||||||
|
|
||||||
The difference to the current channel values are using a wraparound operation,
|
|
||||||
so "1 - 2" will result in 255, while "255 + 1" will result in 0.
|
|
||||||
|
|
||||||
Values are stored as unsigned integers with a bias of 2. E.g. -2 is stored as
|
|
||||||
0 (b00). 1 is stored as 3 (b11).
|
|
||||||
|
|
||||||
The alpha value remains unchanged from the previous pixel.
|
|
||||||
|
|
||||||
|
|
||||||
.- QOI_OP_LUMA -------------------------------------.
|
|
||||||
| Byte[0] | Byte[1] |
|
|
||||||
| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |
|
|
||||||
|-------+-----------------+-------------+-----------|
|
|
||||||
| 1 0 | green diff | dr - dg | db - dg |
|
|
||||||
`---------------------------------------------------`
|
|
||||||
2-bit tag b10
|
|
||||||
6-bit green channel difference from the previous pixel -32..31
|
|
||||||
4-bit red channel difference minus green channel difference -8..7
|
|
||||||
4-bit blue channel difference minus green channel difference -8..7
|
|
||||||
|
|
||||||
The green channel is used to indicate the general direction of change and is
|
|
||||||
encoded in 6 bits. The red and blue channels (dr and db) base their diffs off
|
|
||||||
of the green channel difference and are encoded in 4 bits. I.e.:
|
|
||||||
dr_dg = (cur_px.r - prev_px.r) - (cur_px.g - prev_px.g)
|
|
||||||
db_dg = (cur_px.b - prev_px.b) - (cur_px.g - prev_px.g)
|
|
||||||
|
|
||||||
The difference to the current channel values are using a wraparound operation,
|
|
||||||
so "10 - 13" will result in 253, while "250 + 7" will result in 1.
|
|
||||||
|
|
||||||
Values are stored as unsigned integers with a bias of 32 for the green channel
|
|
||||||
and a bias of 8 for the red and blue channel.
|
|
||||||
|
|
||||||
The alpha value remains unchanged from the previous pixel.
|
|
||||||
|
|
||||||
|
|
||||||
.- QOI_OP_RUN ------------.
|
|
||||||
| Byte[0] |
|
|
||||||
| 7 6 5 4 3 2 1 0 |
|
|
||||||
|-------+-----------------|
|
|
||||||
| 1 1 | run |
|
|
||||||
`-------------------------`
|
|
||||||
2-bit tag b11
|
|
||||||
6-bit run-length repeating the previous pixel: 1..62
|
|
||||||
|
|
||||||
The run-length is stored with a bias of -1. Note that the run-lengths 63 and 64
|
|
||||||
(b111110 and b111111) are illegal as they are occupied by the QOI_OP_RGB and
|
|
||||||
QOI_OP_RGBA tags.
|
|
||||||
|
|
||||||
|
|
||||||
.- QOI_OP_RGB ------------------------------------------.
|
|
||||||
| Byte[0] | Byte[1] | Byte[2] | Byte[3] |
|
|
||||||
| 7 6 5 4 3 2 1 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 |
|
|
||||||
|-------------------------+---------+---------+---------|
|
|
||||||
| 1 1 1 1 1 1 1 0 | red | green | blue |
|
|
||||||
`-------------------------------------------------------`
|
|
||||||
8-bit tag b11111110
|
|
||||||
8-bit red channel value
|
|
||||||
8-bit green channel value
|
|
||||||
8-bit blue channel value
|
|
||||||
|
|
||||||
The alpha value remains unchanged from the previous pixel.
|
|
||||||
|
|
||||||
|
|
||||||
.- QOI_OP_RGBA ---------------------------------------------------.
|
|
||||||
| Byte[0] | Byte[1] | Byte[2] | Byte[3] | Byte[4] |
|
|
||||||
| 7 6 5 4 3 2 1 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 |
|
|
||||||
|-------------------------+---------+---------+---------+---------|
|
|
||||||
| 1 1 1 1 1 1 1 1 | red | green | blue | alpha |
|
|
||||||
`-----------------------------------------------------------------`
|
|
||||||
8-bit tag b11111111
|
|
||||||
8-bit red channel value
|
|
||||||
8-bit green channel value
|
|
||||||
8-bit blue channel value
|
|
||||||
8-bit alpha channel value
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
Header - Public functions */
|
|
||||||
|
|
||||||
#ifndef QOI_H
|
|
||||||
#define QOI_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* A pointer to a qoi_desc struct has to be supplied to all of qoi's functions.
|
|
||||||
It describes either the input format (for qoi_write and qoi_encode), or is
|
|
||||||
filled with the description read from the file header (for qoi_read and
|
|
||||||
qoi_decode).
|
|
||||||
|
|
||||||
The colorspace in this qoi_desc is an enum where
|
|
||||||
0 = sRGB, i.e. gamma scaled RGB channels and a linear alpha channel
|
|
||||||
1 = all channels are linear
|
|
||||||
You may use the constants QOI_SRGB or QOI_LINEAR. The colorspace is purely
|
|
||||||
informative. It will be saved to the file header, but does not affect
|
|
||||||
how chunks are en-/decoded. */
|
|
||||||
|
|
||||||
#define QOI_SRGB 0
|
|
||||||
#define QOI_LINEAR 1
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int width;
|
|
||||||
unsigned int height;
|
|
||||||
unsigned char channels;
|
|
||||||
unsigned char colorspace;
|
|
||||||
} qoi_desc;
|
|
||||||
|
|
||||||
#ifndef QOI_NO_STDIO
|
|
||||||
|
|
||||||
/* Encode raw RGB or RGBA pixels into a QOI image and write it to the file
|
|
||||||
system. The qoi_desc struct must be filled with the image width, height,
|
|
||||||
number of channels (3 = RGB, 4 = RGBA) and the colorspace.
|
|
||||||
|
|
||||||
The function returns 0 on failure (invalid parameters, or fopen or malloc
|
|
||||||
failed) or the number of bytes written on success. */
|
|
||||||
|
|
||||||
int qoi_write(const char *filename, const void *data, const qoi_desc *desc);
|
|
||||||
|
|
||||||
|
|
||||||
/* Read and decode a QOI image from the file system. If channels is 0, the
|
|
||||||
number of channels from the file header is used. If channels is 3 or 4 the
|
|
||||||
output format will be forced into this number of channels.
|
|
||||||
|
|
||||||
The function either returns NULL on failure (invalid data, or malloc or fopen
|
|
||||||
failed) or a pointer to the decoded pixels. On success, the qoi_desc struct
|
|
||||||
will be filled with the description from the file header.
|
|
||||||
|
|
||||||
The returned pixel data should be free()d after use. */
|
|
||||||
|
|
||||||
void *qoi_read(const char *filename, qoi_desc *desc, int channels);
|
|
||||||
|
|
||||||
#endif /* QOI_NO_STDIO */
|
|
||||||
|
|
||||||
|
|
||||||
/* Encode raw RGB or RGBA pixels into a QOI image in memory.
|
|
||||||
|
|
||||||
The function either returns NULL on failure (invalid parameters or malloc
|
|
||||||
failed) or a pointer to the encoded data on success. On success the out_len
|
|
||||||
is set to the size in bytes of the encoded data.
|
|
||||||
|
|
||||||
The returned qoi data should be free()d after use. */
|
|
||||||
|
|
||||||
void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len);
|
|
||||||
|
|
||||||
|
|
||||||
/* Decode a QOI image from memory.
|
|
||||||
|
|
||||||
The function either returns NULL on failure (invalid parameters or malloc
|
|
||||||
failed) or a pointer to the decoded pixels. On success, the qoi_desc struct
|
|
||||||
is filled with the description from the file header.
|
|
||||||
|
|
||||||
The returned pixel data should be free()d after use. */
|
|
||||||
|
|
||||||
void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels);
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /* QOI_H */
|
|
||||||
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
Implementation */
|
|
||||||
|
|
||||||
#ifdef QOI_IMPLEMENTATION
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifndef QOI_MALLOC
|
|
||||||
#define QOI_MALLOC(sz) malloc(sz)
|
|
||||||
#define QOI_FREE(p) free(p)
|
|
||||||
#endif
|
|
||||||
#ifndef QOI_ZEROARR
|
|
||||||
#define QOI_ZEROARR(a) memset((a),0,sizeof(a))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define QOI_OP_INDEX 0x00 /* 00xxxxxx */
|
|
||||||
#define QOI_OP_DIFF 0x40 /* 01xxxxxx */
|
|
||||||
#define QOI_OP_LUMA 0x80 /* 10xxxxxx */
|
|
||||||
#define QOI_OP_RUN 0xc0 /* 11xxxxxx */
|
|
||||||
#define QOI_OP_RGB 0xfe /* 11111110 */
|
|
||||||
#define QOI_OP_RGBA 0xff /* 11111111 */
|
|
||||||
|
|
||||||
#define QOI_MASK_2 0xc0 /* 11000000 */
|
|
||||||
|
|
||||||
#define QOI_COLOR_HASH(C) (C.rgba.r*3 + C.rgba.g*5 + C.rgba.b*7 + C.rgba.a*11)
|
|
||||||
#define QOI_MAGIC \
|
|
||||||
(((unsigned int)'q') << 24 | ((unsigned int)'o') << 16 | \
|
|
||||||
((unsigned int)'i') << 8 | ((unsigned int)'f'))
|
|
||||||
#define QOI_HEADER_SIZE 14
|
|
||||||
|
|
||||||
/* 2GB is the max file size that this implementation can safely handle. We guard
|
|
||||||
against anything larger than that, assuming the worst case with 5 bytes per
|
|
||||||
pixel, rounded down to a nice clean value. 400 million pixels ought to be
|
|
||||||
enough for anybody. */
|
|
||||||
#define QOI_PIXELS_MAX ((unsigned int)400000000)
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
struct { unsigned char r, g, b, a; } rgba;
|
|
||||||
unsigned int v;
|
|
||||||
} qoi_rgba_t;
|
|
||||||
|
|
||||||
static const unsigned char qoi_padding[8] = {0,0,0,0,0,0,0,1};
|
|
||||||
|
|
||||||
static void qoi_write_32(unsigned char *bytes, int *p, unsigned int v) {
|
|
||||||
bytes[(*p)++] = (0xff000000 & v) >> 24;
|
|
||||||
bytes[(*p)++] = (0x00ff0000 & v) >> 16;
|
|
||||||
bytes[(*p)++] = (0x0000ff00 & v) >> 8;
|
|
||||||
bytes[(*p)++] = (0x000000ff & v);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int qoi_read_32(const unsigned char *bytes, int *p) {
|
|
||||||
unsigned int a = bytes[(*p)++];
|
|
||||||
unsigned int b = bytes[(*p)++];
|
|
||||||
unsigned int c = bytes[(*p)++];
|
|
||||||
unsigned int d = bytes[(*p)++];
|
|
||||||
return a << 24 | b << 16 | c << 8 | d;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len) {
|
|
||||||
int i, max_size, p, run;
|
|
||||||
int px_len, px_end, px_pos, channels;
|
|
||||||
unsigned char *bytes;
|
|
||||||
const unsigned char *pixels;
|
|
||||||
qoi_rgba_t index[64];
|
|
||||||
qoi_rgba_t px, px_prev;
|
|
||||||
|
|
||||||
if (
|
|
||||||
data == NULL || out_len == NULL || desc == NULL ||
|
|
||||||
desc->width == 0 || desc->height == 0 ||
|
|
||||||
desc->channels < 3 || desc->channels > 4 ||
|
|
||||||
desc->colorspace > 1 ||
|
|
||||||
desc->height >= QOI_PIXELS_MAX / desc->width
|
|
||||||
) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
max_size =
|
|
||||||
desc->width * desc->height * (desc->channels + 1) +
|
|
||||||
QOI_HEADER_SIZE + sizeof(qoi_padding);
|
|
||||||
|
|
||||||
p = 0;
|
|
||||||
bytes = (unsigned char *) QOI_MALLOC(max_size);
|
|
||||||
if (!bytes) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
qoi_write_32(bytes, &p, QOI_MAGIC);
|
|
||||||
qoi_write_32(bytes, &p, desc->width);
|
|
||||||
qoi_write_32(bytes, &p, desc->height);
|
|
||||||
bytes[p++] = desc->channels;
|
|
||||||
bytes[p++] = desc->colorspace;
|
|
||||||
|
|
||||||
|
|
||||||
pixels = (const unsigned char *)data;
|
|
||||||
|
|
||||||
QOI_ZEROARR(index);
|
|
||||||
|
|
||||||
run = 0;
|
|
||||||
px_prev.rgba.r = 0;
|
|
||||||
px_prev.rgba.g = 0;
|
|
||||||
px_prev.rgba.b = 0;
|
|
||||||
px_prev.rgba.a = 255;
|
|
||||||
px = px_prev;
|
|
||||||
|
|
||||||
px_len = desc->width * desc->height * desc->channels;
|
|
||||||
px_end = px_len - desc->channels;
|
|
||||||
channels = desc->channels;
|
|
||||||
|
|
||||||
for (px_pos = 0; px_pos < px_len; px_pos += channels) {
|
|
||||||
px.rgba.r = pixels[px_pos + 0];
|
|
||||||
px.rgba.g = pixels[px_pos + 1];
|
|
||||||
px.rgba.b = pixels[px_pos + 2];
|
|
||||||
|
|
||||||
if (channels == 4) {
|
|
||||||
px.rgba.a = pixels[px_pos + 3];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (px.v == px_prev.v) {
|
|
||||||
run++;
|
|
||||||
if (run == 62 || px_pos == px_end) {
|
|
||||||
bytes[p++] = QOI_OP_RUN | (run - 1);
|
|
||||||
run = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
int index_pos;
|
|
||||||
|
|
||||||
if (run > 0) {
|
|
||||||
bytes[p++] = QOI_OP_RUN | (run - 1);
|
|
||||||
run = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
index_pos = QOI_COLOR_HASH(px) % 64;
|
|
||||||
|
|
||||||
if (index[index_pos].v == px.v) {
|
|
||||||
bytes[p++] = QOI_OP_INDEX | index_pos;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
index[index_pos] = px;
|
|
||||||
|
|
||||||
if (px.rgba.a == px_prev.rgba.a) {
|
|
||||||
signed char vr = px.rgba.r - px_prev.rgba.r;
|
|
||||||
signed char vg = px.rgba.g - px_prev.rgba.g;
|
|
||||||
signed char vb = px.rgba.b - px_prev.rgba.b;
|
|
||||||
|
|
||||||
signed char vg_r = vr - vg;
|
|
||||||
signed char vg_b = vb - vg;
|
|
||||||
|
|
||||||
if (
|
|
||||||
vr > -3 && vr < 2 &&
|
|
||||||
vg > -3 && vg < 2 &&
|
|
||||||
vb > -3 && vb < 2
|
|
||||||
) {
|
|
||||||
bytes[p++] = QOI_OP_DIFF | (vr + 2) << 4 | (vg + 2) << 2 | (vb + 2);
|
|
||||||
}
|
|
||||||
else if (
|
|
||||||
vg_r > -9 && vg_r < 8 &&
|
|
||||||
vg > -33 && vg < 32 &&
|
|
||||||
vg_b > -9 && vg_b < 8
|
|
||||||
) {
|
|
||||||
bytes[p++] = QOI_OP_LUMA | (vg + 32);
|
|
||||||
bytes[p++] = (vg_r + 8) << 4 | (vg_b + 8);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bytes[p++] = QOI_OP_RGB;
|
|
||||||
bytes[p++] = px.rgba.r;
|
|
||||||
bytes[p++] = px.rgba.g;
|
|
||||||
bytes[p++] = px.rgba.b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
bytes[p++] = QOI_OP_RGBA;
|
|
||||||
bytes[p++] = px.rgba.r;
|
|
||||||
bytes[p++] = px.rgba.g;
|
|
||||||
bytes[p++] = px.rgba.b;
|
|
||||||
bytes[p++] = px.rgba.a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
px_prev = px;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < (int)sizeof(qoi_padding); i++) {
|
|
||||||
bytes[p++] = qoi_padding[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
*out_len = p;
|
|
||||||
return bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels) {
|
|
||||||
const unsigned char *bytes;
|
|
||||||
unsigned int header_magic;
|
|
||||||
unsigned char *pixels;
|
|
||||||
qoi_rgba_t index[64];
|
|
||||||
qoi_rgba_t px;
|
|
||||||
int px_len, chunks_len, px_pos;
|
|
||||||
int p = 0, run = 0;
|
|
||||||
|
|
||||||
if (
|
|
||||||
data == NULL || desc == NULL ||
|
|
||||||
(channels != 0 && channels != 3 && channels != 4) ||
|
|
||||||
size < QOI_HEADER_SIZE + (int)sizeof(qoi_padding)
|
|
||||||
) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bytes = (const unsigned char *)data;
|
|
||||||
|
|
||||||
header_magic = qoi_read_32(bytes, &p);
|
|
||||||
desc->width = qoi_read_32(bytes, &p);
|
|
||||||
desc->height = qoi_read_32(bytes, &p);
|
|
||||||
desc->channels = bytes[p++];
|
|
||||||
desc->colorspace = bytes[p++];
|
|
||||||
|
|
||||||
if (
|
|
||||||
desc->width == 0 || desc->height == 0 ||
|
|
||||||
desc->channels < 3 || desc->channels > 4 ||
|
|
||||||
desc->colorspace > 1 ||
|
|
||||||
header_magic != QOI_MAGIC ||
|
|
||||||
desc->height >= QOI_PIXELS_MAX / desc->width
|
|
||||||
) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (channels == 0) {
|
|
||||||
channels = desc->channels;
|
|
||||||
}
|
|
||||||
|
|
||||||
px_len = desc->width * desc->height * channels;
|
|
||||||
pixels = (unsigned char *) QOI_MALLOC(px_len);
|
|
||||||
if (!pixels) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
QOI_ZEROARR(index);
|
|
||||||
px.rgba.r = 0;
|
|
||||||
px.rgba.g = 0;
|
|
||||||
px.rgba.b = 0;
|
|
||||||
px.rgba.a = 255;
|
|
||||||
|
|
||||||
chunks_len = size - (int)sizeof(qoi_padding);
|
|
||||||
for (px_pos = 0; px_pos < px_len; px_pos += channels) {
|
|
||||||
if (run > 0) {
|
|
||||||
run--;
|
|
||||||
}
|
|
||||||
else if (p < chunks_len) {
|
|
||||||
int b1 = bytes[p++];
|
|
||||||
|
|
||||||
if (b1 == QOI_OP_RGB) {
|
|
||||||
px.rgba.r = bytes[p++];
|
|
||||||
px.rgba.g = bytes[p++];
|
|
||||||
px.rgba.b = bytes[p++];
|
|
||||||
}
|
|
||||||
else if (b1 == QOI_OP_RGBA) {
|
|
||||||
px.rgba.r = bytes[p++];
|
|
||||||
px.rgba.g = bytes[p++];
|
|
||||||
px.rgba.b = bytes[p++];
|
|
||||||
px.rgba.a = bytes[p++];
|
|
||||||
}
|
|
||||||
else if ((b1 & QOI_MASK_2) == QOI_OP_INDEX) {
|
|
||||||
px = index[b1];
|
|
||||||
}
|
|
||||||
else if ((b1 & QOI_MASK_2) == QOI_OP_DIFF) {
|
|
||||||
px.rgba.r += ((b1 >> 4) & 0x03) - 2;
|
|
||||||
px.rgba.g += ((b1 >> 2) & 0x03) - 2;
|
|
||||||
px.rgba.b += ( b1 & 0x03) - 2;
|
|
||||||
}
|
|
||||||
else if ((b1 & QOI_MASK_2) == QOI_OP_LUMA) {
|
|
||||||
int b2 = bytes[p++];
|
|
||||||
int vg = (b1 & 0x3f) - 32;
|
|
||||||
px.rgba.r += vg - 8 + ((b2 >> 4) & 0x0f);
|
|
||||||
px.rgba.g += vg;
|
|
||||||
px.rgba.b += vg - 8 + (b2 & 0x0f);
|
|
||||||
}
|
|
||||||
else if ((b1 & QOI_MASK_2) == QOI_OP_RUN) {
|
|
||||||
run = (b1 & 0x3f);
|
|
||||||
}
|
|
||||||
|
|
||||||
index[QOI_COLOR_HASH(px) % 64] = px;
|
|
||||||
}
|
|
||||||
|
|
||||||
pixels[px_pos + 0] = px.rgba.r;
|
|
||||||
pixels[px_pos + 1] = px.rgba.g;
|
|
||||||
pixels[px_pos + 2] = px.rgba.b;
|
|
||||||
|
|
||||||
if (channels == 4) {
|
|
||||||
pixels[px_pos + 3] = px.rgba.a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return pixels;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef QOI_NO_STDIO
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int qoi_write(const char *filename, const void *data, const qoi_desc *desc) {
|
|
||||||
FILE *f = fopen(filename, "wb");
|
|
||||||
int size, err;
|
|
||||||
void *encoded;
|
|
||||||
|
|
||||||
if (!f) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
encoded = qoi_encode(data, desc, &size);
|
|
||||||
if (!encoded) {
|
|
||||||
fclose(f);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fwrite(encoded, 1, size, f);
|
|
||||||
fflush(f);
|
|
||||||
err = ferror(f);
|
|
||||||
fclose(f);
|
|
||||||
|
|
||||||
QOI_FREE(encoded);
|
|
||||||
return err ? 0 : size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *qoi_read(const char *filename, qoi_desc *desc, int channels) {
|
|
||||||
FILE *f = fopen(filename, "rb");
|
|
||||||
int size, bytes_read;
|
|
||||||
void *pixels, *data;
|
|
||||||
|
|
||||||
if (!f) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
|
||||||
size = ftell(f);
|
|
||||||
if (size <= 0 || fseek(f, 0, SEEK_SET) != 0) {
|
|
||||||
fclose(f);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
data = QOI_MALLOC(size);
|
|
||||||
if (!data) {
|
|
||||||
fclose(f);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bytes_read = fread(data, 1, size, f);
|
|
||||||
fclose(f);
|
|
||||||
pixels = (bytes_read != size) ? NULL : qoi_decode(data, bytes_read, desc, channels);
|
|
||||||
QOI_FREE(data);
|
|
||||||
return pixels;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* QOI_NO_STDIO */
|
|
||||||
#endif /* QOI_IMPLEMENTATION */
|
|
190
src/vendor/scope_guard.hpp
vendored
Normal file
190
src/vendor/scope_guard.hpp
vendored
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
/*
|
||||||
|
* Created on: 13/02/2018
|
||||||
|
* Author: ricab
|
||||||
|
*
|
||||||
|
* See README.md for documentation of this header's public interface.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SCOPE_GUARD_HPP_
|
||||||
|
#define SCOPE_GUARD_HPP_
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#if __cplusplus >= 201703L
|
||||||
|
#define SG_NODISCARD [[nodiscard]]
|
||||||
|
#ifdef SG_REQUIRE_NOEXCEPT_IN_CPP17
|
||||||
|
#define SG_REQUIRE_NOEXCEPT
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
#define SG_NODISCARD
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace sg
|
||||||
|
{
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
/* --- Some custom type traits --- */
|
||||||
|
|
||||||
|
// Type trait determining whether a type is callable with no arguments
|
||||||
|
template<typename T, typename = void>
|
||||||
|
struct is_noarg_callable_t
|
||||||
|
: public std::false_type
|
||||||
|
{}; // in general, false
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct is_noarg_callable_t<T, decltype(std::declval<T&&>()())>
|
||||||
|
: public std::true_type
|
||||||
|
{}; // only true when call expression valid
|
||||||
|
|
||||||
|
// Type trait determining whether a no-argument callable returns void
|
||||||
|
template<typename T>
|
||||||
|
struct returns_void_t
|
||||||
|
: public std::is_same<void, decltype(std::declval<T&&>()())>
|
||||||
|
{};
|
||||||
|
|
||||||
|
/* Type trait determining whether a no-arg callable is nothrow invocable if
|
||||||
|
required. This is where SG_REQUIRE_NOEXCEPT logic is encapsulated. */
|
||||||
|
template<typename T>
|
||||||
|
struct is_nothrow_invocable_if_required_t
|
||||||
|
: public
|
||||||
|
#ifdef SG_REQUIRE_NOEXCEPT
|
||||||
|
std::is_nothrow_invocable<T> /* Note: _r variants not enough to
|
||||||
|
confirm void return: any return can be
|
||||||
|
discarded so all returns are
|
||||||
|
compatible with void */
|
||||||
|
#else
|
||||||
|
std::true_type
|
||||||
|
#endif
|
||||||
|
{};
|
||||||
|
|
||||||
|
// logic AND of two or more type traits
|
||||||
|
template<typename A, typename B, typename... C>
|
||||||
|
struct and_t : public and_t<A, and_t<B, C...>>
|
||||||
|
{}; // for more than two arguments
|
||||||
|
|
||||||
|
template<typename A, typename B>
|
||||||
|
struct and_t<A, B> : public std::conditional<A::value, B, A>::type
|
||||||
|
{}; // for two arguments
|
||||||
|
|
||||||
|
// Type trait determining whether a type is a proper scope_guard callback.
|
||||||
|
template<typename T>
|
||||||
|
struct is_proper_sg_callback_t
|
||||||
|
: public and_t<is_noarg_callable_t<T>,
|
||||||
|
returns_void_t<T>,
|
||||||
|
is_nothrow_invocable_if_required_t<T>,
|
||||||
|
std::is_nothrow_destructible<T>>
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
|
/* --- The actual scope_guard template --- */
|
||||||
|
|
||||||
|
template<typename Callback,
|
||||||
|
typename = typename std::enable_if<
|
||||||
|
is_proper_sg_callback_t<Callback>::value>::type>
|
||||||
|
class scope_guard;
|
||||||
|
|
||||||
|
|
||||||
|
/* --- Now the friend maker --- */
|
||||||
|
|
||||||
|
template<typename Callback>
|
||||||
|
detail::scope_guard<Callback> make_scope_guard(Callback&& callback)
|
||||||
|
noexcept(std::is_nothrow_constructible<Callback, Callback&&>::value); /*
|
||||||
|
we need this in the inner namespace due to MSVC bugs preventing
|
||||||
|
sg::detail::scope_guard from befriending a sg::make_scope_guard
|
||||||
|
template instance in the parent namespace (see https://is.gd/xFfFhE). */
|
||||||
|
|
||||||
|
|
||||||
|
/* --- The template specialization that actually defines the class --- */
|
||||||
|
|
||||||
|
template<typename Callback>
|
||||||
|
class SG_NODISCARD scope_guard<Callback> final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef Callback callback_type;
|
||||||
|
|
||||||
|
scope_guard(scope_guard&& other)
|
||||||
|
noexcept(std::is_nothrow_constructible<Callback, Callback&&>::value);
|
||||||
|
|
||||||
|
~scope_guard() noexcept; // highlight noexcept dtor
|
||||||
|
|
||||||
|
void dismiss() noexcept;
|
||||||
|
|
||||||
|
public:
|
||||||
|
scope_guard() = delete;
|
||||||
|
scope_guard(const scope_guard&) = delete;
|
||||||
|
scope_guard& operator=(const scope_guard&) = delete;
|
||||||
|
scope_guard& operator=(scope_guard&&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
explicit scope_guard(Callback&& callback)
|
||||||
|
noexcept(std::is_nothrow_constructible<Callback, Callback&&>::value); /*
|
||||||
|
meant for friends only */
|
||||||
|
|
||||||
|
friend scope_guard<Callback> make_scope_guard<Callback>(Callback&&)
|
||||||
|
noexcept(std::is_nothrow_constructible<Callback, Callback&&>::value); /*
|
||||||
|
only make_scope_guard can create scope_guards from scratch (i.e. non-move)
|
||||||
|
*/
|
||||||
|
|
||||||
|
private:
|
||||||
|
Callback m_callback;
|
||||||
|
bool m_active;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
|
||||||
|
/* --- Now the single public maker function --- */
|
||||||
|
|
||||||
|
using detail::make_scope_guard; // see comment on declaration above
|
||||||
|
|
||||||
|
} // namespace sg
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
template<typename Callback>
|
||||||
|
sg::detail::scope_guard<Callback>::scope_guard(Callback&& callback)
|
||||||
|
noexcept(std::is_nothrow_constructible<Callback, Callback&&>::value)
|
||||||
|
: m_callback(std::forward<Callback>(callback)) /* use () instead of {} because
|
||||||
|
of DR 1467 (https://is.gd/WHmWuo), which still impacts older compilers
|
||||||
|
(e.g. GCC 4.x and clang <=3.6, see https://godbolt.org/g/TE9tPJ and
|
||||||
|
https://is.gd/Tsmh8G) */
|
||||||
|
, m_active{true}
|
||||||
|
{}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
template<typename Callback>
|
||||||
|
sg::detail::scope_guard<Callback>::scope_guard::~scope_guard() noexcept /*
|
||||||
|
need the extra injected-class-name here to make different compilers happy */
|
||||||
|
{
|
||||||
|
if(m_active)
|
||||||
|
m_callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
template<typename Callback>
|
||||||
|
sg::detail::scope_guard<Callback>::scope_guard(scope_guard&& other)
|
||||||
|
noexcept(std::is_nothrow_constructible<Callback, Callback&&>::value)
|
||||||
|
: m_callback(std::forward<Callback>(other.m_callback)) // idem
|
||||||
|
, m_active{std::move(other.m_active)}
|
||||||
|
{
|
||||||
|
other.m_active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
template<typename Callback>
|
||||||
|
inline void sg::detail::scope_guard<Callback>::dismiss() noexcept
|
||||||
|
{
|
||||||
|
m_active = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
template<typename Callback>
|
||||||
|
inline auto sg::detail::make_scope_guard(Callback&& callback)
|
||||||
|
noexcept(std::is_nothrow_constructible<Callback, Callback&&>::value)
|
||||||
|
-> detail::scope_guard<Callback>
|
||||||
|
{
|
||||||
|
return detail::scope_guard<Callback>{std::forward<Callback>(callback)};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* SCOPE_GUARD_HPP_ */
|
7987
src/vendor/stb_image.h
vendored
Normal file
7987
src/vendor/stb_image.h
vendored
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue