mirror of https://github.com/bjornbytes/lovr.git
OpenGL ES3; Remove glad;
Stop using OpenGL extensions and drop support for OpenGL ES2, WebGL 1, and OpenGL 2. Remove glad.
This commit is contained in:
parent
5f3ce18fcd
commit
8beac66db0
|
@ -3,14 +3,11 @@ project(lovr)
|
|||
|
||||
# Setup
|
||||
if(EMSCRIPTEN)
|
||||
add_definitions(-DLOVR_WEB=1)
|
||||
set(CMAKE_EXECUTABLE_SUFFIX ".html")
|
||||
add_definitions(-O3)
|
||||
add_definitions(-s USE_ZLIB=1)
|
||||
add_definitions(-s ASSERTIONS=1)
|
||||
add_definitions(-s FULL_ES2=1)
|
||||
add_definitions(-s AGGRESSIVE_VARIABLE_ELIMINATION=1)
|
||||
add_definitions(-s NO_EXIT_RUNTIME=1)
|
||||
add_definitions(-s TOTAL_MEMORY=134217728)
|
||||
set(LOVR_EMSCRIPTEN_FLAGS "-O3 -s USE_WEBGL2=1 -s FULL_ES3=1 -s USE_FREETYPE=1 -s USE_GLFW=3 -s USE_ZLIB=1 -s ASSERTIONS=1 -s AGGRESSIVE_VARIABLE_ELIMINATION=1 -s NO_EXIT_RUNTIME=1 -s TOTAL_MEMORY=134217728 -s ELIMINATE_DUPLICATE_FUNCTIONS=1")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LOVR_EMSCRIPTEN_FLAGS}")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${LOVR_EMSCRIPTEN_FLAGS}")
|
||||
include_directories("${EMSCRIPTEN_ROOT_PATH}/tests/zlib")
|
||||
elseif(UNIX)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
|
@ -61,13 +58,11 @@ endif()
|
|||
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "")
|
||||
set(GLFW_BUILD_TESTS OFF CACHE BOOL "")
|
||||
set(GLFW_BUILD_DOCS OFF CACHE BOOL "")
|
||||
if(EMSCRIPTEN)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s USE_GLFW=3")
|
||||
elseif(WIN32)
|
||||
if(WIN32)
|
||||
add_subdirectory(deps/glfw glfw)
|
||||
include_directories(deps/glfw/include)
|
||||
set(LOVR_GLFW glfw ${GLFW_LIBRARIES})
|
||||
else()
|
||||
elseif(NOT EMSCRIPTEN)
|
||||
pkg_search_module(GLFW REQUIRED glfw3)
|
||||
include_directories(${GLFW_INCLUDE_DIRS})
|
||||
set(LOVR_GLFW ${GLFW_LIBRARIES})
|
||||
|
@ -78,6 +73,7 @@ if(EMSCRIPTEN)
|
|||
option(LUA_USE_RELATIVE_LOADLIB OFF)
|
||||
option(LUA_USE_ULONGJMP OFF)
|
||||
add_subdirectory(deps/lua lua)
|
||||
set_target_properties(lua luac liblua liblua_static PROPERTIES EXCLUDE_FROM_ALL 1)
|
||||
include_directories(deps/lua/src ${CMAKE_BINARY_DIR}/lua)
|
||||
set(LOVR_LUA liblua_static)
|
||||
elseif(WIN32)
|
||||
|
@ -94,7 +90,12 @@ else()
|
|||
endif()
|
||||
|
||||
# ODE
|
||||
if (WIN32 OR EMSCRIPTEN)
|
||||
if(EMSCRIPTEN)
|
||||
set(ODE_BUILD_SHARED OFF CACHE BOOL "")
|
||||
add_subdirectory(deps/ode ode)
|
||||
include_directories(deps/ode/include "${CMAKE_CURRENT_BINARY_DIR}/ode/include")
|
||||
set(LOVR_ODE ode)
|
||||
elseif(WIN32)
|
||||
set(ODE_BUILD_SHARED ON CACHE BOOL "")
|
||||
add_subdirectory(deps/ode ode)
|
||||
include_directories(deps/ode/include "${CMAKE_CURRENT_BINARY_DIR}/ode/include")
|
||||
|
@ -213,7 +214,6 @@ set(LOVR_SRC
|
|||
src/graphics/skybox.c
|
||||
src/graphics/texture.c
|
||||
src/headset/headset.c
|
||||
src/lib/glad/glad.c
|
||||
src/lib/lua-cjson/fpconv.c
|
||||
src/lib/lua-cjson/lua_cjson.c
|
||||
src/lib/lua-cjson/strbuf.c
|
||||
|
@ -255,6 +255,8 @@ target_link_libraries(lovr
|
|||
${LOVR_OPENGL}
|
||||
${LOVR_OPENVR}
|
||||
${LOVR_PHYSFS}
|
||||
|
||||
${LOVR_EMSCRIPTEN_FLAGS}
|
||||
)
|
||||
|
||||
if(WIN32)
|
||||
|
|
|
@ -138,7 +138,6 @@ int l_lovrGraphicsInit(lua_State* L) {
|
|||
map_set(&WrapModes, "clamp", WRAP_CLAMP);
|
||||
map_set(&WrapModes, "repeat", WRAP_REPEAT);
|
||||
map_set(&WrapModes, "mirroredrepeat", WRAP_MIRRORED_REPEAT);
|
||||
map_set(&WrapModes, "clampzero", WRAP_CLAMP_ZERO);
|
||||
|
||||
lovrGraphicsInit();
|
||||
return 1;
|
||||
|
|
|
@ -19,7 +19,7 @@ void lovrAudioInit() {
|
|||
error("Unable to create OpenAL context");
|
||||
}
|
||||
|
||||
#ifndef EMSCRIPTEN
|
||||
#ifndef LOVR_WEB
|
||||
static LPALCRESETDEVICESOFT alcResetDeviceSOFT;
|
||||
alcResetDeviceSOFT = (LPALCRESETDEVICESOFT) alcGetProcAddress(device, "alcResetDeviceSOFT");
|
||||
state.isSpatialized = alcIsExtensionPresent(device, "ALC_SOFT_HRTF");
|
||||
|
@ -76,7 +76,7 @@ void lovrAudioAdd(Source* source) {
|
|||
}
|
||||
|
||||
void lovrAudioGetDopplerEffect(float* factor, float* speedOfSound) {
|
||||
#ifdef EMSCRIPTEN
|
||||
#ifdef LOVR_WEB
|
||||
*factor = *speedOfSound = 0;
|
||||
#else
|
||||
alGetFloatv(AL_DOPPLER_FACTOR, factor);
|
||||
|
@ -138,7 +138,7 @@ void lovrAudioRewind() {
|
|||
}
|
||||
|
||||
void lovrAudioSetDopplerEffect(float scale, float speedOfSound) {
|
||||
#ifndef EMSCRIPTEN
|
||||
#ifndef LOVR_WEB
|
||||
alDopplerFactor(scale);
|
||||
alSpeedOfSound(speedOfSound);
|
||||
#endif
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
#include "lib/vec/vec.h"
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#ifndef EMSCRIPTEN
|
||||
#ifndef LOVR_WEB
|
||||
#include <AL/alext.h>
|
||||
#endif
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ int lovrFilesystemGetAppdataDirectory(char* dest, unsigned int size) {
|
|||
wcstombs(dest, appData, size);
|
||||
CoTaskMemFree(appData);
|
||||
return 0;
|
||||
#elif EMSCRIPTEN
|
||||
#elif LOVR_WEB
|
||||
strncpy(dest, "/home/web_user", size);
|
||||
return 0;
|
||||
#else
|
||||
|
@ -99,7 +99,7 @@ int lovrFilesystemGetExecutablePath(char* dest, unsigned int size) {
|
|||
}
|
||||
#elif _WIN32
|
||||
return !GetModuleFileName(NULL, dest, size);
|
||||
#elif EMSCRIPTEN
|
||||
#elif LOVR_WEB
|
||||
return 1;
|
||||
#else
|
||||
#error "This platform is missing an implementation for lovrFilesystemGetExecutablePath"
|
||||
|
|
|
@ -52,10 +52,12 @@ Font* lovrFontCreate(FontData* fontData) {
|
|||
font->texture = lovrTextureCreate(textureData);
|
||||
lovrTextureSetWrap(font->texture, WRAP_CLAMP, WRAP_CLAMP);
|
||||
|
||||
if (lovrGraphicsIsSupported(FEATURE_SWIZZLE)) {
|
||||
int swizzle[4] = { GL_RED, GL_RED, GL_RED, GL_GREEN };
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
|
||||
}
|
||||
#ifndef LOVR_WEB
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_RED);
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
|
||||
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_GREEN);
|
||||
#endif
|
||||
|
||||
return font;
|
||||
}
|
||||
|
|
|
@ -25,11 +25,11 @@ static void onCloseWindow(GLFWwindow* window) {
|
|||
// Base
|
||||
|
||||
void lovrGraphicsInit() {
|
||||
#ifdef EMSCRIPTEN
|
||||
#define loadGLLoader gladLoadGLES2Loader
|
||||
#ifdef LOVR_WEB
|
||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
||||
#else
|
||||
#define loadGLLoader gladLoadGLLoader
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
|
@ -50,15 +50,13 @@ void lovrGraphicsInit() {
|
|||
glfwMakeContextCurrent(state.window);
|
||||
glfwSetWindowCloseCallback(state.window, onCloseWindow);
|
||||
glfwSetTime(0);
|
||||
loadGLLoader((GLADloadproc) glfwGetProcAddress);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
|
||||
if (GLAD_GL_VERSION_3_0) {
|
||||
glfwSwapInterval(0);
|
||||
glEnable(GL_LINE_SMOOTH);
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
}
|
||||
#ifndef LOVR_WEB
|
||||
glfwSwapInterval(0);
|
||||
glEnable(GL_LINE_SMOOTH);
|
||||
#endif
|
||||
|
||||
// Allocations
|
||||
state.activeFont = NULL;
|
||||
|
@ -66,9 +64,7 @@ void lovrGraphicsInit() {
|
|||
state.activeTexture = NULL;
|
||||
glGenBuffers(1, &state.shapeBuffer);
|
||||
glGenBuffers(1, &state.shapeIndexBuffer);
|
||||
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
|
||||
glGenVertexArrays(1, &state.shapeArray);
|
||||
}
|
||||
glGenVertexArrays(1, &state.shapeArray);
|
||||
vec_init(&state.shapeData);
|
||||
vec_init(&state.shapeIndices);
|
||||
for (int i = 0; i < MAX_CANVASES; i++) {
|
||||
|
@ -85,15 +81,15 @@ void lovrGraphicsInit() {
|
|||
|
||||
// System Limits
|
||||
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &state.maxTextureSize);
|
||||
if (GLAD_GL_VERSION_2_0) {
|
||||
float pointSizes[2];
|
||||
glGetFloatv(GL_POINT_SIZE_RANGE, pointSizes);
|
||||
state.maxPointSize = pointSizes[1];
|
||||
glGetIntegerv(GL_MAX_SAMPLES, &state.maxTextureMSAA);
|
||||
} else {
|
||||
state.maxPointSize = 1.f;
|
||||
state.maxTextureMSAA = 1;
|
||||
}
|
||||
#ifdef LOVR_WEB
|
||||
state.maxPointSize = 1.f;
|
||||
state.maxTextureMSAA = 1;
|
||||
#else
|
||||
float pointSizes[2];
|
||||
glGetFloatv(GL_POINT_SIZE_RANGE, pointSizes);
|
||||
state.maxPointSize = pointSizes[1];
|
||||
glGetIntegerv(GL_MAX_SAMPLES, &state.maxTextureMSAA);
|
||||
#endif
|
||||
|
||||
// State
|
||||
state.depthTest = -1;
|
||||
|
@ -117,9 +113,7 @@ void lovrGraphicsDestroy() {
|
|||
lovrRelease(&state.defaultTexture->ref);
|
||||
glDeleteBuffers(1, &state.shapeBuffer);
|
||||
glDeleteBuffers(1, &state.shapeIndexBuffer);
|
||||
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
|
||||
glDeleteVertexArrays(1, &state.shapeArray);
|
||||
}
|
||||
glDeleteVertexArrays(1, &state.shapeArray);
|
||||
vec_deinit(&state.shapeData);
|
||||
vec_deinit(&state.shapeIndices);
|
||||
}
|
||||
|
@ -221,21 +215,13 @@ void lovrGraphicsSetBlendMode(BlendMode mode, BlendAlphaMode alphaMode) {
|
|||
break;
|
||||
|
||||
case BLEND_LIGHTEN:
|
||||
if (lovrGraphicsIsSupported(FEATURE_LIGHTEN)) {
|
||||
glBlendEquation(GL_MAX);
|
||||
glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
} else {
|
||||
error("The lighten blend mode is not supported on this platform.");
|
||||
}
|
||||
glBlendEquation(GL_MAX);
|
||||
glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
break;
|
||||
|
||||
case BLEND_DARKEN:
|
||||
if (lovrGraphicsIsSupported(FEATURE_LIGHTEN)) {
|
||||
glBlendEquation(GL_MIN);
|
||||
glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
} else {
|
||||
error("The darken blend mode is not supported on this platform.");
|
||||
}
|
||||
glBlendEquation(GL_MIN);
|
||||
glBlendFuncSeparate(srcRGB, GL_ZERO, GL_ONE, GL_ZERO);
|
||||
break;
|
||||
|
||||
case BLEND_SCREEN:
|
||||
|
@ -391,10 +377,10 @@ float lovrGraphicsGetPointSize() {
|
|||
}
|
||||
|
||||
void lovrGraphicsSetPointSize(float size) {
|
||||
if (lovrGraphicsIsSupported(FEATURE_POINT_SIZE)) {
|
||||
state.pointSize = size;
|
||||
glPointSize(size);
|
||||
}
|
||||
#ifndef LOVR_WEB
|
||||
state.pointSize = size;
|
||||
glPointSize(size);
|
||||
#endif
|
||||
}
|
||||
|
||||
int lovrGraphicsIsCullingEnabled() {
|
||||
|
@ -440,10 +426,12 @@ int lovrGraphicsIsWireframe() {
|
|||
}
|
||||
|
||||
void lovrGraphicsSetWireframe(int wireframe) {
|
||||
if (lovrGraphicsIsSupported(FEATURE_WIREFRAME) && state.isWireframe != wireframe) {
|
||||
#ifndef LOVR_WEB
|
||||
if (state.isWireframe != wireframe) {
|
||||
state.isWireframe = wireframe;
|
||||
glPolygonMode(GL_FRONT_AND_BACK, wireframe ? GL_LINE : GL_FILL);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int lovrGraphicsGetWidth() {
|
||||
|
@ -467,20 +455,6 @@ float lovrGraphicsGetSystemLimit(GraphicsLimit limit) {
|
|||
}
|
||||
}
|
||||
|
||||
int lovrGraphicsIsSupported(GraphicsFeature feature) {
|
||||
switch (feature) {
|
||||
case FEATURE_LIGHTEN: return GLAD_GL_VERSION_2_0 || GLAD_GL_EXT_blend_minmax;
|
||||
case FEATURE_MAPPED_BUFFERS: return GLAD_GL_VERSION_3_0 || GLAD_GL_ARB_map_buffer_range;
|
||||
case FEATURE_POINT_SIZE: return GLAD_GL_VERSION_2_0;
|
||||
case FEATURE_SHADER_INTS: return GLAD_GL_VERSION_2_0;
|
||||
case FEATURE_SWIZZLE: return GLAD_GL_VERSION_3_0;
|
||||
case FEATURE_TEXTURE_RG: return GLAD_GL_VERSION_3_0 || GLAD_GL_ARB_texture_rg || GLAD_GL_EXT_texture_rg;
|
||||
case FEATURE_TEXTURE_FANCY_WRAPS: return !GLAD_GL_ES_VERSION_2_0;
|
||||
case FEATURE_VAO: return GLAD_GL_VERSION_3_0;
|
||||
case FEATURE_WIREFRAME: return GLAD_GL_VERSION_3_0;
|
||||
}
|
||||
}
|
||||
|
||||
void lovrGraphicsPushCanvas() {
|
||||
if (++state.canvas >= MAX_CANVASES) {
|
||||
error("Canvas overflow");
|
||||
|
@ -561,9 +535,7 @@ void lovrGraphicsDrawPrimitive(GLenum mode, int hasNormals, int hasTexCoords, in
|
|||
int strideBytes = stride * sizeof(float);
|
||||
|
||||
lovrGraphicsPrepare();
|
||||
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
|
||||
glBindVertexArray(state.shapeArray);
|
||||
}
|
||||
glBindVertexArray(state.shapeArray);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, state.shapeBuffer);
|
||||
glBufferData(GL_ARRAY_BUFFER, state.shapeData.length * sizeof(float), state.shapeData.data, GL_STREAM_DRAW);
|
||||
glEnableVertexAttribArray(LOVR_SHADER_POSITION);
|
||||
|
@ -592,9 +564,7 @@ void lovrGraphicsDrawPrimitive(GLenum mode, int hasNormals, int hasTexCoords, in
|
|||
glDrawArrays(mode, 0, state.shapeData.length / stride);
|
||||
}
|
||||
|
||||
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
void lovrGraphicsPoints(float* points, int count) {
|
||||
|
|
|
@ -55,18 +55,6 @@ typedef enum {
|
|||
LIMIT_TEXTURE_MSAA
|
||||
} GraphicsLimit;
|
||||
|
||||
typedef enum {
|
||||
FEATURE_LIGHTEN,
|
||||
FEATURE_MAPPED_BUFFERS,
|
||||
FEATURE_POINT_SIZE,
|
||||
FEATURE_SHADER_INTS,
|
||||
FEATURE_SWIZZLE,
|
||||
FEATURE_TEXTURE_RG,
|
||||
FEATURE_TEXTURE_FANCY_WRAPS,
|
||||
FEATURE_VAO,
|
||||
FEATURE_WIREFRAME
|
||||
} GraphicsFeature;
|
||||
|
||||
typedef struct {
|
||||
int x;
|
||||
int y;
|
||||
|
@ -162,7 +150,6 @@ void lovrGraphicsSetWireframe(int wireframe);
|
|||
int lovrGraphicsGetWidth();
|
||||
int lovrGraphicsGetHeight();
|
||||
float lovrGraphicsGetSystemLimit(GraphicsLimit limit);
|
||||
int lovrGraphicsIsSupported(GraphicsFeature feature);
|
||||
void lovrGraphicsPushCanvas();
|
||||
void lovrGraphicsPopCanvas();
|
||||
void lovrGraphicsSetViewport(int x, int y, int w, int h);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
static void lovrMeshBindAttributes(Mesh* mesh) {
|
||||
Shader* shader = lovrGraphicsGetShader();
|
||||
if (!shader || (shader == mesh->lastShader && !mesh->attributesDirty && lovrGraphicsIsSupported(FEATURE_VAO))) {
|
||||
if (!shader || (shader == mesh->lastShader && !mesh->attributesDirty)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -23,11 +23,7 @@ static void lovrMeshBindAttributes(Mesh* mesh) {
|
|||
glEnableVertexAttribArray(location);
|
||||
|
||||
if (attribute.type == MESH_INT) {
|
||||
if (!lovrGraphicsIsSupported(FEATURE_SHADER_INTS)) {
|
||||
error("Integer attributes are not supported on this platform.");
|
||||
} else {
|
||||
glVertexAttribIPointer(location, attribute.count, attribute.type, mesh->stride, (void*) offset);
|
||||
}
|
||||
glVertexAttribIPointer(location, attribute.count, attribute.type, mesh->stride, (void*) offset);
|
||||
} else {
|
||||
glVertexAttribPointer(location, attribute.count, attribute.type, GL_FALSE, mesh->stride, (void*) offset);
|
||||
}
|
||||
|
@ -72,7 +68,6 @@ Mesh* lovrMeshCreate(int count, MeshFormat* format, MeshDrawMode drawMode, MeshU
|
|||
return NULL;
|
||||
}
|
||||
|
||||
mesh->data = NULL;
|
||||
mesh->count = count;
|
||||
mesh->stride = stride;
|
||||
mesh->enabledAttributes = ~0;
|
||||
|
@ -92,13 +87,7 @@ Mesh* lovrMeshCreate(int count, MeshFormat* format, MeshDrawMode drawMode, MeshU
|
|||
glGenBuffers(1, &mesh->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, mesh->count * mesh->stride, NULL, mesh->usage);
|
||||
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
|
||||
glGenVertexArrays(1, &mesh->vao);
|
||||
}
|
||||
|
||||
if (!lovrGraphicsIsSupported(FEATURE_MAPPED_BUFFERS)) {
|
||||
mesh->data = malloc(mesh->count * mesh->stride);
|
||||
}
|
||||
glGenVertexArrays(1, &mesh->vao);
|
||||
|
||||
return mesh;
|
||||
}
|
||||
|
@ -110,12 +99,9 @@ void lovrMeshDestroy(const Ref* ref) {
|
|||
}
|
||||
glDeleteBuffers(1, &mesh->vbo);
|
||||
glDeleteBuffers(1, &mesh->ibo);
|
||||
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
|
||||
glDeleteVertexArrays(1, &mesh->vao);
|
||||
}
|
||||
glDeleteVertexArrays(1, &mesh->vao);
|
||||
vec_deinit(&mesh->map);
|
||||
vec_deinit(&mesh->format);
|
||||
free(mesh->data);
|
||||
free(mesh);
|
||||
}
|
||||
|
||||
|
@ -131,9 +117,7 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform) {
|
|||
lovrGraphicsBindTexture(mesh->texture);
|
||||
lovrGraphicsPrepare();
|
||||
|
||||
if (lovrGraphicsIsSupported(FEATURE_VAO)) {
|
||||
glBindVertexArray(mesh->vao);
|
||||
}
|
||||
glBindVertexArray(mesh->vao);
|
||||
|
||||
lovrMeshBindAttributes(mesh);
|
||||
|
||||
|
@ -266,12 +250,6 @@ void lovrMeshSetTexture(Mesh* mesh, Texture* texture) {
|
|||
}
|
||||
|
||||
void* lovrMeshMap(Mesh* mesh, int start, int count) {
|
||||
if (!lovrGraphicsIsSupported(FEATURE_MAPPED_BUFFERS)) {
|
||||
mesh->isMapped = 1;
|
||||
mesh->mapStart = start;
|
||||
mesh->mapCount = count;
|
||||
return (char*) mesh->data + start * mesh->stride;
|
||||
}
|
||||
|
||||
// Unmap because the mapped ranges aren't necessarily the same. Could be improved.
|
||||
if (mesh->isMapped && (mesh->mapStart != start || mesh->mapCount != count)) {
|
||||
|
@ -287,16 +265,6 @@ void* lovrMeshMap(Mesh* mesh, int start, int count) {
|
|||
}
|
||||
|
||||
void lovrMeshUnmap(Mesh* mesh) {
|
||||
if (!lovrGraphicsIsSupported(FEATURE_MAPPED_BUFFERS)) {
|
||||
mesh->isMapped = 0;
|
||||
int start = mesh->mapStart * mesh->stride;
|
||||
int count = mesh->mapCount * mesh->stride;
|
||||
char* data = (char*) mesh->data + start;
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
|
||||
glBufferSubData(GL_ARRAY_BUFFER, start, count, data);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mesh->isMapped) {
|
||||
mesh->isMapped = 0;
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->vbo);
|
||||
|
|
|
@ -35,7 +35,6 @@ typedef vec_t(MeshAttribute) MeshFormat;
|
|||
|
||||
typedef struct {
|
||||
Ref ref;
|
||||
void* data;
|
||||
int count;
|
||||
int stride;
|
||||
int enabledAttributes;
|
||||
|
@ -43,6 +42,7 @@ typedef struct {
|
|||
int isMapped;
|
||||
int mapStart;
|
||||
int mapCount;
|
||||
void* mappedData;
|
||||
MeshFormat format;
|
||||
MeshDrawMode drawMode;
|
||||
MeshUsage usage;
|
||||
|
|
|
@ -4,36 +4,31 @@
|
|||
#include <stdlib.h>
|
||||
|
||||
const char* lovrShaderVertexPrefix = ""
|
||||
#ifdef EMSCRIPTEN
|
||||
"#version 100 \n"
|
||||
#ifdef LOVR_WEB
|
||||
"#version 300 es \n"
|
||||
"precision mediump float; \n"
|
||||
"attribute vec3 lovrPosition; \n"
|
||||
"attribute vec3 lovrNormal; \n"
|
||||
"attribute vec2 lovrTexCoord; \n"
|
||||
"varying vec2 texCoord; \n"
|
||||
#else
|
||||
"#version 150 \n"
|
||||
#endif
|
||||
"in vec3 lovrPosition; \n"
|
||||
"in vec3 lovrNormal; \n"
|
||||
"in vec2 lovrTexCoord; \n"
|
||||
"out vec2 texCoord; \n"
|
||||
#endif
|
||||
"uniform mat4 lovrTransform; \n"
|
||||
"uniform mat3 lovrNormalMatrix; \n"
|
||||
"uniform mat4 lovrProjection; \n"
|
||||
"";
|
||||
|
||||
const char* lovrShaderFragmentPrefix = ""
|
||||
#ifdef EMSCRIPTEN
|
||||
"#version 100 \n"
|
||||
#ifdef LOVR_WEB
|
||||
"#version 300 es \n"
|
||||
"precision mediump float; \n"
|
||||
"varying vec2 texCoord; \n"
|
||||
#else
|
||||
"#version 150 \n"
|
||||
"in vec2 texCoord; \n"
|
||||
"in vec4 gl_FragCoord; \n"
|
||||
"out vec4 lovrFragColor; \n"
|
||||
#endif
|
||||
"in vec2 texCoord; \n"
|
||||
"out vec4 lovrFragColor; \n"
|
||||
"uniform vec4 lovrColor; \n"
|
||||
"uniform sampler2D lovrTexture; \n"
|
||||
"";
|
||||
|
@ -47,11 +42,7 @@ const char* lovrShaderVertexSuffix = ""
|
|||
|
||||
const char* lovrShaderFragmentSuffix = ""
|
||||
"void main() { \n"
|
||||
#ifdef EMSCRIPTEN
|
||||
" gl_FragColor = color(lovrColor, lovrTexture, texCoord); \n"
|
||||
#else
|
||||
" lovrFragColor = color(lovrColor, lovrTexture, texCoord); \n"
|
||||
#endif
|
||||
"}"
|
||||
"";
|
||||
|
||||
|
@ -63,20 +54,12 @@ const char* lovrDefaultVertexShader = ""
|
|||
|
||||
const char* lovrDefaultFragmentShader = ""
|
||||
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
||||
#ifdef EMSCRIPTEN
|
||||
" return graphicsColor * texture2D(image, uv); \n"
|
||||
#else
|
||||
" return graphicsColor * texture(image, uv); \n"
|
||||
#endif
|
||||
"}"
|
||||
"";
|
||||
|
||||
const char* lovrSkyboxVertexShader = ""
|
||||
#ifdef EMSCRIPTEN
|
||||
"varying vec3 texturePosition; \n"
|
||||
#else
|
||||
"out vec3 texturePosition; \n"
|
||||
#endif
|
||||
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
|
||||
" texturePosition = vertex.xyz; \n"
|
||||
" return projection * transform * vertex; \n"
|
||||
|
@ -84,19 +67,11 @@ const char* lovrSkyboxVertexShader = ""
|
|||
"";
|
||||
|
||||
const char* lovrSkyboxFragmentShader = ""
|
||||
#ifdef EMSCRIPTEN
|
||||
"varying vec3 texturePosition; \n"
|
||||
"uniform samplerCube cube; \n"
|
||||
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
||||
" return graphicsColor * textureCube(cube, texturePosition); \n"
|
||||
"}"
|
||||
#else
|
||||
"in vec3 texturePosition; \n"
|
||||
"uniform samplerCube cube; \n"
|
||||
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
|
||||
" return graphicsColor * texture(cube, texturePosition); \n"
|
||||
"}"
|
||||
#endif
|
||||
"";
|
||||
|
||||
const char* lovrNoopVertexShader = ""
|
||||
|
|
|
@ -7,8 +7,12 @@
|
|||
|
||||
GLenum lovrTextureGetGLFormat(TextureFormat format) {
|
||||
switch (format) {
|
||||
case FORMAT_RED: return lovrGraphicsIsSupported(FEATURE_TEXTURE_RG) ? GL_RED : GL_LUMINANCE;
|
||||
case FORMAT_RG: return lovrGraphicsIsSupported(FEATURE_TEXTURE_RG) ? GL_RG : GL_LUMINANCE_ALPHA;
|
||||
case FORMAT_RED: return GL_RED;
|
||||
#ifdef LOVR_WEB
|
||||
case FORMAT_RG: return GL_LUMINANCE_ALPHA;
|
||||
#else
|
||||
case FORMAT_RG: return GL_RG;
|
||||
#endif
|
||||
case FORMAT_RGB: return GL_RGB;
|
||||
case FORMAT_RGBA: return GL_RGBA;
|
||||
}
|
||||
|
@ -176,10 +180,6 @@ void lovrTextureGetWrap(Texture* texture, WrapMode* horizontal, WrapMode* vertic
|
|||
}
|
||||
|
||||
void lovrTextureSetWrap(Texture* texture, WrapMode horizontal, WrapMode vertical) {
|
||||
if (!lovrGraphicsIsSupported(FEATURE_TEXTURE_FANCY_WRAPS)) {
|
||||
horizontal = vertical = WRAP_CLAMP;
|
||||
}
|
||||
|
||||
texture->wrapHorizontal = horizontal;
|
||||
texture->wrapVertical = vertical;
|
||||
lovrGraphicsBindTexture(texture);
|
||||
|
|
|
@ -12,8 +12,7 @@ typedef enum {
|
|||
typedef enum {
|
||||
WRAP_CLAMP = GL_CLAMP_TO_EDGE,
|
||||
WRAP_REPEAT = GL_REPEAT,
|
||||
WRAP_MIRRORED_REPEAT = GL_MIRRORED_REPEAT,
|
||||
WRAP_CLAMP_ZERO = GL_CLAMP_TO_BORDER
|
||||
WRAP_MIRRORED_REPEAT = GL_MIRRORED_REPEAT
|
||||
} WrapMode;
|
||||
|
||||
typedef enum {
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
GL_ARB_framebuffer_object
|
||||
GL_ARB_map_buffer_range
|
||||
GL_ARB_texture_rg
|
||||
GL_EXT_texture_rg
|
||||
GL_EXT_blend_minmax
|
||||
GL_OES_texture_npot
|
1962
src/lib/glad/glad.c
1962
src/lib/glad/glad.c
File diff suppressed because it is too large
Load Diff
3749
src/lib/glad/glad.h
3749
src/lib/glad/glad.h
File diff suppressed because it is too large
Load Diff
|
@ -2,9 +2,8 @@
|
|||
|
||||
#ifdef _WIN32
|
||||
#define APIENTRY __stdcall
|
||||
#elif EMSCRIPTEN
|
||||
#define GLFW_INCLUDE_ES2
|
||||
#elif LOVR_WEB
|
||||
#define GLFW_INCLUDE_ES3
|
||||
#endif
|
||||
|
||||
#include "lib/glad/glad.h"
|
||||
#include <GLFW/glfw3.h>
|
||||
|
|
|
@ -41,7 +41,7 @@ static int lovrGetOS(lua_State* L) {
|
|||
#elif __APPLE__
|
||||
lua_pushstring(L, "macOS");
|
||||
return 1;
|
||||
#elif EMSCRIPTEN
|
||||
#elif LOVR_WEB
|
||||
lua_pushstring(L, "Web");
|
||||
#else
|
||||
lua_pushnil(L);
|
||||
|
@ -120,7 +120,7 @@ void lovrDestroy(int exitCode) {
|
|||
exit(exitCode);
|
||||
}
|
||||
|
||||
#ifdef EMSCRIPTEN
|
||||
#ifdef LOVR_WEB
|
||||
#include <emscripten.h>
|
||||
|
||||
static int stepRef = 0;
|
||||
|
|
Loading…
Reference in New Issue