1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-05 22:03:36 +00:00
lovr/src/graphics/shader.h
2017-10-31 01:14:09 -07:00

73 lines
1.7 KiB
C

#include "graphics/texture.h"
#include "math/math.h"
#include "lib/map/map.h"
#include "lib/glfw.h"
#include "util.h"
#include <stdbool.h>
#pragma once
#define LOVR_SHADER_POSITION 0
#define LOVR_SHADER_NORMAL 1
#define LOVR_SHADER_TEX_COORD 2
#define LOVR_SHADER_VERTEX_COLOR 3
#define LOVR_MAX_UNIFORM_LENGTH 256
typedef enum {
UNIFORM_FLOAT,
UNIFORM_MATRIX,
UNIFORM_INT,
UNIFORM_SAMPLER
} UniformType;
typedef union {
void* data;
int* ints;
float* floats;
Texture** textures;
} UniformValue;
typedef enum {
SHADER_DEFAULT,
SHADER_SKYBOX,
SHADER_FONT,
SHADER_FULLSCREEN
} DefaultShader;
typedef struct {
GLchar name[LOVR_MAX_UNIFORM_LENGTH];
GLenum glType;
int index;
int location;
int count;
int components;
size_t size;
UniformType type;
UniformValue value;
int baseTextureSlot;
bool dirty;
} Uniform;
typedef map_t(Uniform) map_uniform_t;
typedef struct {
Ref ref;
uint32_t program;
map_uniform_t uniforms;
float model[16];
float view[16];
float projection[16];
Color color;
} Shader;
Shader* lovrShaderCreate(const char* vertexSource, const char* fragmentSource);
Shader* lovrShaderCreateDefault(DefaultShader type);
void lovrShaderDestroy(const Ref* ref);
void lovrShaderBind(Shader* shader);
int lovrShaderGetAttributeId(Shader* shader, const char* name);
Uniform* lovrShaderGetUniform(Shader* shader, const char* name);
void lovrShaderSetFloat(Shader* shader, const char* name, float* data, int count);
void lovrShaderSetInt(Shader* shader, const char* name, int* data, int count);
void lovrShaderSetMatrix(Shader* shader, const char* name, float* data, int count);
void lovrShaderSetTexture(Shader* shader, const char* name, Texture** data, int count);