mirror of https://github.com/bjornbytes/lovr.git
Add lovr.graphics.blit for fullscreen quads;
This commit is contained in:
parent
8bcaacd63c
commit
8b201838b6
|
@ -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 },
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
"}";
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue