mirror of https://github.com/bjornbytes/lovr.git
Skybox;
This commit is contained in:
parent
3972b3ce56
commit
703b0c2af0
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -9,4 +9,3 @@ typedef struct {
|
|||
|
||||
Skybox* lovrSkyboxCreate();
|
||||
void lovrSkyboxDestroy(Skybox* skybox);
|
||||
void lovrSkyboxDraw(Skybox* skybox, float angle, float ax, float ay, float az);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue