2018-07-09 09:05:30 +00:00
|
|
|
#include "graphics/shader.h"
|
|
|
|
#include "graphics/texture.h"
|
|
|
|
#include "graphics/canvas.h"
|
|
|
|
#include "graphics/mesh.h"
|
|
|
|
#include "util.h"
|
2018-07-09 09:54:45 +00:00
|
|
|
#include "lib/glfw.h"
|
2018-07-09 09:05:30 +00:00
|
|
|
#include "lib/map/map.h"
|
|
|
|
#include <stdint.h>
|
|
|
|
|
2018-07-09 09:54:45 +00:00
|
|
|
#pragma once
|
|
|
|
|
2018-07-09 09:05:30 +00:00
|
|
|
#define LOVR_SHADER_POSITION 0
|
|
|
|
#define LOVR_SHADER_NORMAL 1
|
|
|
|
#define LOVR_SHADER_TEX_COORD 2
|
|
|
|
#define LOVR_SHADER_VERTEX_COLOR 3
|
|
|
|
#define LOVR_SHADER_TANGENT 4
|
|
|
|
#define LOVR_SHADER_BONES 5
|
|
|
|
#define LOVR_SHADER_BONE_WEIGHTS 6
|
|
|
|
#define LOVR_MAX_UNIFORM_LENGTH 256
|
|
|
|
#define LOVR_MAX_ATTRIBUTE_LENGTH 256
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
GLchar name[LOVR_MAX_UNIFORM_LENGTH];
|
|
|
|
GLenum glType;
|
|
|
|
int index;
|
|
|
|
int location;
|
|
|
|
int count;
|
|
|
|
int components;
|
|
|
|
size_t size;
|
|
|
|
UniformType type;
|
|
|
|
union {
|
|
|
|
void* data;
|
|
|
|
int* ints;
|
|
|
|
float* floats;
|
|
|
|
Texture** textures;
|
|
|
|
} value;
|
|
|
|
int baseTextureSlot;
|
|
|
|
bool dirty;
|
|
|
|
} Uniform;
|
|
|
|
|
|
|
|
typedef map_t(Uniform) map_uniform_t;
|
|
|
|
|
|
|
|
struct Shader {
|
|
|
|
Ref ref;
|
|
|
|
uint32_t program;
|
|
|
|
map_uniform_t uniforms;
|
|
|
|
map_int_t attributes;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Texture {
|
|
|
|
Ref ref;
|
|
|
|
TextureType type;
|
|
|
|
GLenum glType;
|
|
|
|
TextureData** slices;
|
|
|
|
int width;
|
|
|
|
int height;
|
|
|
|
int depth;
|
|
|
|
GLuint id;
|
|
|
|
TextureFilter filter;
|
|
|
|
TextureWrap wrap;
|
|
|
|
bool srgb;
|
|
|
|
bool mipmaps;
|
|
|
|
bool allocated;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Canvas {
|
|
|
|
Texture texture;
|
|
|
|
GLuint framebuffer;
|
|
|
|
GLuint resolveFramebuffer;
|
|
|
|
GLuint depthStencilBuffer;
|
|
|
|
GLuint msaaTexture;
|
|
|
|
CanvasFlags flags;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
Mesh* mesh;
|
|
|
|
int attributeIndex;
|
|
|
|
int divisor;
|
|
|
|
bool enabled;
|
|
|
|
} MeshAttachment;
|
|
|
|
|
|
|
|
typedef map_t(MeshAttachment) map_attachment_t;
|
|
|
|
|
|
|
|
struct Mesh {
|
|
|
|
Ref ref;
|
|
|
|
uint32_t count;
|
|
|
|
VertexFormat format;
|
|
|
|
MeshDrawMode drawMode;
|
|
|
|
GLenum usage;
|
|
|
|
VertexPointer data;
|
|
|
|
IndexPointer indices;
|
|
|
|
uint32_t indexCount;
|
|
|
|
size_t indexSize;
|
|
|
|
size_t indexCapacity;
|
|
|
|
bool mappedIndices;
|
|
|
|
uint32_t dirtyStart;
|
|
|
|
uint32_t dirtyEnd;
|
|
|
|
uint32_t rangeStart;
|
|
|
|
uint32_t rangeCount;
|
|
|
|
GLuint vao;
|
|
|
|
GLuint vbo;
|
|
|
|
GLuint ibo;
|
|
|
|
Material* material;
|
|
|
|
float* pose;
|
|
|
|
map_attachment_t attachments;
|
|
|
|
MeshAttachment layout[MAX_ATTACHMENTS];
|
|
|
|
bool isAttachment;
|
|
|
|
};
|
2018-07-09 09:54:45 +00:00
|
|
|
|
|
|
|
GLenum lovrConvertWrapMode(WrapMode mode);
|
|
|
|
GLenum lovrConvertTextureFormat(TextureFormat format);
|
|
|
|
GLenum lovrConvertTextureFormatInternal(TextureFormat format, bool srgb);
|
2018-07-12 02:25:01 +00:00
|
|
|
GLenum lovrConvertMeshUsage(MeshUsage usage);
|
|
|
|
GLenum lovrConvertMeshDrawMode(MeshDrawMode mode);
|
2018-07-09 09:54:45 +00:00
|
|
|
bool lovrIsTextureFormatCompressed(TextureFormat format);
|