Add lovr.graphics.blit for fullscreen quads;

This commit is contained in:
bjorn 2018-03-10 23:18:07 -08:00
parent 8bcaacd63c
commit 8b201838b6
8 changed files with 45 additions and 41 deletions

View File

@ -677,12 +677,6 @@ int l_lovrGraphicsTriangle(lua_State* L) {
}
int l_lovrGraphicsPlane(lua_State* L) {
if (lua_isuserdata(L, 1) && lua_gettop(L) == 1) {
Texture* texture = luax_checktypeof(L, 1, Texture);
lovrGraphicsPlaneFullscreen(texture);
return 0;
}
DrawMode drawMode = DRAW_MODE_FILL;
Material* material = NULL;
if (lua_isuserdata(L, 1)) {
@ -817,6 +811,12 @@ int l_lovrGraphicsStencil(lua_State* L) {
return 0;
}
int l_lovrGraphicsBlit(lua_State* L) {
Texture* texture = luax_checktypeof(L, 1, Texture);
lovrGraphicsBlit(texture);
return 0;
}
// Types
int l_lovrGraphicsNewAnimator(lua_State* L) {
@ -1173,6 +1173,7 @@ const luaL_Reg lovrGraphics[] = {
{ "skybox", l_lovrGraphicsSkybox },
{ "print", l_lovrGraphicsPrint },
{ "stencil", l_lovrGraphicsStencil },
{ "blit", l_lovrGraphicsBlit },
{ "newAnimator", l_lovrGraphicsNewAnimator },
{ "newCanvas", l_lovrGraphicsNewCanvas },
{ "newFont", l_lovrGraphicsNewFont },

View File

@ -706,27 +706,6 @@ void lovrGraphicsPlane(DrawMode mode, Material* material, mat4 transform) {
lovrMeshDraw(state.mesh, transform, NULL, 1);
}
void lovrGraphicsPlaneFullscreen(Texture* texture) {
float vertices[] = {
-1, 1, 0, 0, 0, 0, 0, 1,
-1, -1, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0, 1, 1,
1, -1, 0, 0, 0, 0, 1, 0
};
lovrGraphicsSetDefaultShader(SHADER_FULLSCREEN);
Material* material = lovrGraphicsGetDefaultMaterial();
lovrMaterialSetTexture(material, TEXTURE_DIFFUSE, texture);
VertexPointer vertexPointer = lovrGraphicsGetVertexPointer(4);
memcpy(vertexPointer.raw, vertices, 4 * 8 * sizeof(float));
lovrMeshWriteIndices(state.mesh, 0, 0);
lovrMeshSetMaterial(state.mesh, material);
lovrMeshSetDrawMode(state.mesh, MESH_TRIANGLE_STRIP);
lovrMeshSetDrawRange(state.mesh, 0, 4);
lovrMaterialSetTexture(material, TEXTURE_DIFFUSE, NULL);
lovrMeshDraw(state.mesh, NULL, NULL, 1);
}
void lovrGraphicsBox(DrawMode mode, Material* material, mat4 transform) {
if (mode == DRAW_MODE_LINE) {
float vertices[] = {
@ -1018,7 +997,7 @@ void lovrGraphicsSkybox(Texture* texture, float angle, float ax, float ay, float
MaterialTexture materialTexture = type == TEXTURE_CUBE ? TEXTURE_ENVIRONMENT_MAP : TEXTURE_DIFFUSE;
Winding winding = state.winding;
lovrGraphicsSetWinding(WINDING_COUNTERCLOCKWISE);
lovrGraphicsSetDefaultShader(type == TEXTURE_CUBE ? SHADER_SKYBOX : SHADER_PANO);
lovrGraphicsSetDefaultShader(type == TEXTURE_CUBE ? SHADER_CUBE : SHADER_PANO);
Material* material = lovrGraphicsGetDefaultMaterial();
lovrMaterialSetTexture(material, materialTexture, texture);
VertexPointer vertexPointer = lovrGraphicsGetVertexPointer(4);
@ -1086,6 +1065,27 @@ void lovrGraphicsStencil(StencilAction action, int replaceValue, StencilCallback
lovrGraphicsSetStencilTest(state.stencilMode, state.stencilValue);
}
void lovrGraphicsBlit(Texture* texture) {
float vertices[] = {
-1, 1, 0, 0, 0, 0, 0, 1,
-1, -1, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0, 1, 1,
1, -1, 0, 0, 0, 0, 1, 0
};
lovrGraphicsSetDefaultShader(SHADER_BLIT);
Material* material = lovrGraphicsGetDefaultMaterial();
lovrMaterialSetTexture(material, TEXTURE_DIFFUSE, texture);
VertexPointer vertexPointer = lovrGraphicsGetVertexPointer(4);
memcpy(vertexPointer.raw, vertices, 4 * 8 * sizeof(float));
lovrMeshWriteIndices(state.mesh, 0, 0);
lovrMeshSetMaterial(state.mesh, material);
lovrMeshSetDrawMode(state.mesh, MESH_TRIANGLE_STRIP);
lovrMeshSetDrawRange(state.mesh, 0, 4);
lovrMaterialSetTexture(material, TEXTURE_DIFFUSE, NULL);
lovrMeshDraw(state.mesh, NULL, NULL, 1);
}
// Internal State
void lovrGraphicsPushLayer(Layer layer) {
if (++state.layer >= MAX_LAYERS) {

View File

@ -194,7 +194,6 @@ void lovrGraphicsPoints(uint32_t count);
void lovrGraphicsLine(uint32_t count);
void lovrGraphicsTriangle(DrawMode mode, Material* material, float points[9]);
void lovrGraphicsPlane(DrawMode mode, Material* material, mat4 transform);
void lovrGraphicsPlaneFullscreen(Texture* texture);
void lovrGraphicsBox(DrawMode mode, Material* material, mat4 transform);
void lovrGraphicsArc(DrawMode mode, ArcMode, Material* material, mat4 transform, float theta1, float theta2, int segments);
void lovrGraphicsCircle(DrawMode mode, Material* material, mat4 transform, int segments);
@ -203,6 +202,7 @@ void lovrGraphicsSphere(Material* material, mat4 transform, int segments);
void lovrGraphicsSkybox(Texture* texture, float angle, float ax, float ay, float az);
void lovrGraphicsPrint(const char* str, mat4 transform, float wrap, HorizontalAlign halign, VerticalAlign valign);
void lovrGraphicsStencil(StencilAction action, int replaceValue, StencilCallback callback, void* userdata);
void lovrGraphicsBlit(Texture* texture);
// Internal State
VertexPointer lovrGraphicsGetVertexPointer(uint32_t capacity);

View File

@ -264,10 +264,10 @@ Shader* lovrShaderCreate(const char* vertexSource, const char* fragmentSource) {
Shader* lovrShaderCreateDefault(DefaultShader type) {
switch (type) {
case SHADER_DEFAULT: return lovrShaderCreate(NULL, NULL);
case SHADER_SKYBOX: return lovrShaderCreate(lovrSkyboxVertexShader, lovrSkyboxFragmentShader); break;
case SHADER_PANO: return lovrShaderCreate(lovrSkyboxVertexShader, lovrPanoFragmentShader); break;
case SHADER_CUBE: return lovrShaderCreate(lovrCubeVertexShader, lovrCubeFragmentShader); break;
case SHADER_PANO: return lovrShaderCreate(lovrCubeVertexShader, lovrPanoFragmentShader); break;
case SHADER_FONT: return lovrShaderCreate(NULL, lovrFontFragmentShader);
case SHADER_FULLSCREEN: return lovrShaderCreate(lovrNoopVertexShader, NULL);
case SHADER_BLIT: return lovrShaderCreate(lovrBlitVertexShader, NULL);
default: lovrThrow("Unknown default shader type");
}
}

View File

@ -34,10 +34,10 @@ typedef union {
typedef enum {
SHADER_DEFAULT,
SHADER_SKYBOX,
SHADER_CUBE,
SHADER_PANO,
SHADER_FONT,
SHADER_FULLSCREEN
SHADER_BLIT
} DefaultShader;
typedef struct {

View File

@ -732,7 +732,7 @@ static void openvrRenderTo(headsetRenderCallback callback, void* userdata) {
Shader* lastShader = lovrGraphicsGetShader();
lovrRetain(lastShader);
lovrGraphicsSetShader(NULL);
lovrGraphicsPlaneFullscreen(&state.canvas->texture);
lovrGraphicsBlit(&state.canvas->texture);
lovrGraphicsSetShader(lastShader);
lovrRelease(lastShader);
lovrGraphicsSetColor(oldColor);

View File

@ -90,9 +90,11 @@ const char* lovrShaderVertexSuffix = ""
" lovrPose[lovrBones[3]] * lovrBoneWeights[3]; \n"
" gl_PointSize = lovrPointSize; \n"
" vec4 projected = position(lovrProjection, lovrTransform, pose * vec4(lovrPosition, 1.0)); \n"
"#ifndef MONOSCOPIC \n"
" gl_ClipDistance[0] = dot(projected, lovrClipPlane[lovrEye]); \n"
" projected.x *= .5; \n"
" projected.x += lovrEyeOffset[lovrEye] * projected.w; \n"
"#endif \n"
" gl_Position = projected; \n"
"}";
@ -115,7 +117,7 @@ const char* lovrDefaultFragmentShader = ""
" return graphicsColor * lovrDiffuseColor * vertexColor * texture(image, uv); \n"
"}";
const char* lovrSkyboxVertexShader = ""
const char* lovrCubeVertexShader = ""
"out vec3 texturePosition; \n"
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" texturePosition = inverse(mat3(transform)) * (inverse(projection) * vertex).xyz; \n"
@ -123,7 +125,7 @@ const char* lovrSkyboxVertexShader = ""
" return vertex; \n"
"}";
const char* lovrSkyboxFragmentShader = ""
const char* lovrCubeFragmentShader = ""
"in vec3 texturePosition; \n"
"vec4 color(vec4 graphicsColor, sampler2D image, vec2 uv) { \n"
" return graphicsColor * texture(lovrEnvironmentTexture, texturePosition); \n"
@ -151,7 +153,8 @@ const char* lovrFontFragmentShader = ""
" return vec4(graphicsColor.rgb, graphicsColor.a * alpha); \n"
"}";
const char* lovrNoopVertexShader = ""
const char* lovrBlitVertexShader = ""
"#define MONOSCOPIC \n"
"vec4 position(mat4 projection, mat4 transform, vec4 vertex) { \n"
" return vertex; \n"
"}";

View File

@ -9,8 +9,8 @@ extern const char* lovrShaderFragmentPrefix;
extern const char* lovrShaderFragmentSuffix;
extern const char* lovrDefaultVertexShader;
extern const char* lovrDefaultFragmentShader;
extern const char* lovrSkyboxVertexShader;
extern const char* lovrSkyboxFragmentShader;
extern const char* lovrCubeVertexShader;
extern const char* lovrCubeFragmentShader;
extern const char* lovrPanoFragmentShader;
extern const char* lovrFontFragmentShader;
extern const char* lovrNoopVertexShader;
extern const char* lovrBlitVertexShader;