This commit is contained in:
bjorn 2016-10-24 15:02:23 -07:00
parent 3972b3ce56
commit 703b0c2af0
9 changed files with 121 additions and 76 deletions

View File

@ -1,8 +1,5 @@
#define _USE_MATH_DEFINES
#include "graphics.h"
#include "model.h"
#include "buffer.h"
#include "shader.h"
#include "../glfw.h"
#include "../util.h"
#include <stdlib.h>
@ -20,6 +17,7 @@ void lovrGraphicsInit() {
state.lastTransform = mat4_init();
state.lastProjection = mat4_init();
state.defaultShader = lovrShaderCreate(lovrDefaultVertexShader, lovrDefaultFragmentShader);
state.skyboxShader = lovrShaderCreate(lovrSkyboxVertexShader, lovrSkyboxFragmentShader);
state.lastShader = NULL;
state.lastColor = 0;
glGenBuffers(1, &state.shapeBuffer);
@ -36,6 +34,7 @@ void lovrGraphicsDestroy() {
mat4_deinit(state.lastTransform);
mat4_deinit(state.lastProjection);
lovrShaderDestroy(state.defaultShader);
lovrShaderDestroy(state.skyboxShader);
glDeleteBuffers(1, &state.shapeBuffer);
glDeleteBuffers(1, &state.shapeIndexBuffer);
glDeleteVertexArrays(1, &state.shapeArray);
@ -480,3 +479,79 @@ void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, floa
lovrGraphicsPop();
}
void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float az) {
if (!skybox) {
return;
}
Shader* lastShader = lovrGraphicsGetShader();
lovrGraphicsSetShader(state.skyboxShader);
float cos2 = cos(angle / 2);
float sin2 = sin(angle / 2);
float rw = cos2;
float rx = sin2 * ax;
float ry = sin2 * ay;
float rz = sin2 * az;
lovrGraphicsPrepare();
lovrGraphicsPush();
lovrGraphicsOrigin();
lovrGraphicsRotate(rw, rx, ry, rz);
float cube[] = {
// Front
1.f, -1.f, -1.f, 0, 0, 0,
1.f, 1.f, -1.f, 0, 0, 0,
-1.f, -1.f, -1.f, 0, 0, 0,
-1.f, 1.f, -1.f, 0, 0, 0,
// Left
-1.f, 1.f, -1.f, 0, 0, 0,
-1.f, 1.f, 1.f, 0, 0, 0,
-1.f, -1.f, -1.f, 0, 0, 0,
-1.f, -1.f, 1.f, 0, 0, 0,
// Back
-1.f, -1.f, 1.f, 0, 0, 0,
1.f, -1.f, 1.f, 0, 0, 0,
-1.f, 1.f, 1.f, 0, 0, 0,
1.f, 1.f, 1.f, 0, 0, 0,
// Right
1.f, 1.f, 1.f, 0, 0, 0,
1.f, -1.f, 1.f, 0, 0, 0,
1.f, 1.f, -1.f, 0, 0, 0,
1.f, -1.f, -1.f, 0, 0, 0,
// Bottom
1.f, -1.f, -1.f, 0, 0, 0,
1.f, -1.f, 1.f, 0, 0, 0,
-1.f, -1.f, -1.f, 0, 0, 0,
-1.f, -1.f, 1.f, 0, 0, 0,
// Adjust
-1.f, -1.f, 1.f, 0, 0, 0,
-1.f, 1.f, -1.f, 0, 0, 0,
// Top
-1.f, 1.f, -1.f, 0, 0, 0,
-1.f, 1.f, 1.f, 0, 0, 0,
1.f, 1.f, -1.f, 0, 0, 0,
1.f, 1.f, 1.f, 0, 0, 0
};
glDepthMask(GL_FALSE);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->texture);
lovrGraphicsSetShapeData(cube, 156, NULL, 0);
lovrGraphicsDrawFilledShape();
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glDepthMask(GL_TRUE);
lovrGraphicsSetShader(lastShader);
lovrGraphicsPop();
}

View File

@ -1,6 +1,7 @@
#include "buffer.h"
#include "model.h"
#include "shader.h"
#include "skybox.h"
#include "../matrix.h"
#ifndef LOVR_GRAPHICS_TYPES
@ -34,6 +35,7 @@ typedef struct {
Shader* activeShader;
Shader* lastShader;
Shader* defaultShader;
Shader* skyboxShader;
vec_mat4_t transforms;
mat4 lastTransform;
mat4 projection;
@ -94,3 +96,4 @@ void lovrGraphicsDrawFilledShape();
void lovrGraphicsLine(float* points, int count);
void lovrGraphicsPlane(DrawMode mode, float x, float y, float z, float size, float nx, float ny, float nz);
void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ);
void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float az);

View File

@ -17,7 +17,7 @@ const char* lovrShaderFragmentPrefix = ""
const char* lovrDefaultVertexShader = ""
"void main() { \n"
" gl_Position = lovrProjection * lovrTransform * vec4(position.xyz, 1.0); \n"
" gl_Position = lovrProjection * lovrTransform * vec4(position, 1.0); \n"
"}"
"";
@ -27,6 +27,22 @@ const char* lovrDefaultFragmentShader = ""
"}"
"";
const char* lovrSkyboxVertexShader = ""
"out vec3 texturePosition; \n"
"void main() { \n"
" texturePosition = position; \n"
" gl_Position = lovrProjection * lovrTransform * vec4(position, 1.0); \n"
"}"
"";
const char* lovrSkyboxFragmentShader = ""
"in vec3 texturePosition; \n"
"uniform samplerCube cube; \n"
"void main() { \n"
" color = texture(cube, texturePosition) * lovrColor; \n"
"}"
"";
GLuint compileShader(GLenum type, const char* source) {
GLuint shader = glCreateShader(type);

View File

@ -29,6 +29,8 @@ extern const char* lovrShaderVertexPrefix;
extern const char* lovrShaderFragmentPrefix;
extern const char* lovrDefaultVertexShader;
extern const char* lovrDefaultFragmentShader;
extern const char* lovrSkyboxVertexShader;
extern const char* lovrSkyboxFragmentShader;
GLuint compileShader(GLuint type, const char* filename);
GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader);

View File

@ -38,71 +38,3 @@ void lovrSkyboxDestroy(Skybox* skybox) {
glDeleteTextures(1, &skybox->texture);
free(skybox);
}
void lovrSkyboxDraw(Skybox* skybox, float angle, float ax, float ay, float az) {
float cos2 = cos(angle / 2);
float sin2 = sin(angle / 2);
float rw = cos2;
float rx = sin2 * ax;
float ry = sin2 * ay;
float rz = sin2 * az;
lovrGraphicsPrepare();
lovrGraphicsPush();
lovrGraphicsOrigin();
lovrGraphicsRotate(rw, rx, ry, rz);
float cube[] = {
// Front
1.f, -1.f, -1.f, 0, 0, 0,
1.f, 1.f, -1.f, 0, 0, 0,
-1.f, -1.f, -1.f,0, 0, 0,
-1.f, 1.f, -1.f, 0, 0, 0,
// Left
-1.f, 1.f, -1.f, 0, 0, 0,
-1.f, 1.f, 1.f, 0, 0, 0,
-1.f, -1.f, -1.f,0, 0, 0,
-1.f, -1.f, 1.f, 0, 0, 0,
// Back
-1.f, -1.f, 1.f, 0, 0, 0,
1.f, -1.f, 1.f, 0, 0, 0,
-1.f, 1.f, 1.f, 0, 0, 0,
1.f, 1.f, 1.f, 0, 0, 0,
// Right
1.f, 1.f, 1.f, 0, 0, 0,
1.f, -1.f, 1.f, 0, 0, 0,
1.f, 1.f, -1.f, 0, 0, 0,
1.f, -1.f, -1.f, 0, 0, 0,
// Bottom
1.f, -1.f, -1.f, 0, 0, 0,
1.f, -1.f, 1.f, 0, 0, 0,
-1.f, -1.f, -1.f,0, 0, 0,
-1.f, -1.f, 1.f, 0, 0, 0,
// Adjust
-1.f, -1.f, 1.f, 0, 0, 0,
-1.f, 1.f, -1.f, 0, 0, 0,
// Top
-1.f, 1.f, -1.f, 0, 0, 0,
-1.f, 1.f, 1.f, 0, 0, 0,
1.f, 1.f, -1.f, 0, 0, 0,
1.f, 1.f, 1.f, 0, 0, 0
};
glDepthMask(GL_FALSE);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->texture);
lovrGraphicsSetShapeData(cube, 156, NULL, 0);
lovrGraphicsDrawFilledShape();
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glDepthMask(GL_TRUE);
lovrGraphicsPop();
}

View File

@ -9,4 +9,3 @@ typedef struct {
Skybox* lovrSkyboxCreate();
void lovrSkyboxDestroy(Skybox* skybox);
void lovrSkyboxDraw(Skybox* skybox, float angle, float ax, float ay, float az);

View File

@ -519,8 +519,25 @@ int l_lovrGraphicsNewShader(lua_State* L) {
int l_lovrGraphicsNewSkybox(lua_State* L) {
const char* filenames[6];
for (int i = 0; i < 6; i++) {
filenames[i] = luaL_checkstring(L, i + 1);
if (lua_istable(L, 1)) {
if (lua_objlen(L, 1) != 6) {
return luaL_argerror(L, 1, "Expected 6 strings or a table containing 6 strings");
}
for (int i = 0; i < 6; i++) {
lua_rawgeti(L, 1, i + 1);
if (!lua_isstring(L, -1)) {
return luaL_argerror(L, 1, "Expected 6 strings or a table containing 6 strings");
}
filenames[i] = lua_tostring(L, -1);
lua_pop(L, 1);
}
} else {
for (int i = 0; i < 6; i++) {
filenames[i] = luaL_checkstring(L, i + 1);
}
}
luax_pushskybox(L, lovrSkyboxCreate(filenames));

View File

@ -32,6 +32,6 @@ int l_lovrSkyboxDraw(lua_State* L) {
float ax = luaL_optnumber(L, 3, 0.f);
float ay = luaL_optnumber(L, 4, 0.f);
float az = luaL_optnumber(L, 5, 0.f);
lovrSkyboxDraw(skybox, angle, ax, ay, az);
lovrGraphicsSkybox(skybox, angle, ax, ay, az);
return 0;
}

View File

@ -2,6 +2,7 @@
#include <lauxlib.h>
#include <lualib.h>
#include "../graphics/skybox.h"
#include "../graphics/graphics.h"
void luax_pushskybox(lua_State* L, Skybox* skybox);
Skybox* luax_checkskybox(lua_State* L, int index);