Pass:fill;

This commit is contained in:
bjorn 2022-06-24 19:59:48 -07:00
parent 0a3ccb4f8a
commit 5c43ad0792
5 changed files with 51 additions and 1 deletions

View File

@ -1,7 +1,7 @@
#include "shaders/unlit.vert.h"
#include "shaders/unlit.frag.h"
#include "shaders/font.frag.h"
#include "shaders/fill.vert.h"
#include "shaders/lovr.glsl.h"

14
etc/shaders/fill.vert Normal file
View File

@ -0,0 +1,14 @@
#version 460
#extension GL_EXT_multiview : require
#extension GL_GOOGLE_include_directive : require
#include "lovr.glsl"
void main() {
FragColor = VertexColor * Color;
float x = -1 + float((VertexIndex & 1) << 2);
float y = -1 + float((VertexIndex & 2) << 1);
FragUV = vec2(x, y) * .5 + .5;
Position = vec4(x, y, 0., 1.);
PointSize = 1.f;
}

View File

@ -553,6 +553,13 @@ static int l_lovrPassText(lua_State* L) {
return 0;
}
static int l_lovrPassFill(lua_State* L) {
Pass* pass = luax_checktype(L, 1, Pass);
Texture* texture = luax_totype(L, 2, Texture);
lovrPassFill(pass, texture);
return 0;
}
static int l_lovrPassMesh(lua_State* L) {
Pass* pass = luax_checktype(L, 1, Pass);
Buffer* vertices = !lua_toboolean(L, 2) ? NULL : luax_totype(L, 2, Buffer);
@ -803,6 +810,7 @@ const luaL_Reg lovrPass[] = {
{ "sphere", l_lovrPassSphere },
{ "torus", l_lovrPassTorus },
{ "text", l_lovrPassText },
{ "fill", l_lovrPassFill },
{ "mesh", l_lovrPassMesh },
{ "multimesh", l_lovrPassMultimesh },

View File

@ -177,6 +177,7 @@ typedef enum {
VERTEX_SHAPE,
VERTEX_POINT,
VERTEX_GLYPH,
VERTEX_EMPTY,
VERTEX_FORMAT_COUNT
} VertexFormat;
@ -479,6 +480,16 @@ bool lovrGraphicsInit(bool debug, bool vsync) {
.attributes[4] = { 1, 14, 0, GPU_TYPE_F32x4 }
};
state.vertexFormats[VERTEX_EMPTY] = (gpu_vertex_format) {
.bufferCount = 2,
.attributeCount = 5,
.attributes[0] = { 1, 10, 0, GPU_TYPE_F32x2 },
.attributes[1] = { 1, 11, 0, GPU_TYPE_F32x4 },
.attributes[2] = { 1, 12, 0, GPU_TYPE_F32x2 },
.attributes[3] = { 1, 13, 16, GPU_TYPE_F32x4 },
.attributes[4] = { 1, 14, 0, GPU_TYPE_F32x4 }
};
state.defaultMaterial = lovrMaterialCreate(&(MaterialInfo) {
.data.color = { 1.f, 1.f, 1.f, 1.f },
.texture = state.defaultTexture
@ -1346,6 +1357,11 @@ Shader* lovrGraphicsGetDefaultShader(DefaultShader type) {
info.stages[1] = lovrBlobCreate((void*) lovr_shader_font_frag, sizeof(lovr_shader_font_frag), "Font Fragment Shader");
info.label = "font";
break;
case SHADER_FILL:
info.stages[0] = lovrBlobCreate((void*) lovr_shader_fill_vert, sizeof(lovr_shader_fill_vert), "Fill Vertex Shader");
info.stages[1] = lovrBlobCreate((void*) lovr_shader_unlit_frag, sizeof(lovr_shader_unlit_frag), "Unlit Fragment Shader");
info.label = "fill";
break;
default: lovrUnreachable();
}
@ -3393,6 +3409,16 @@ void lovrPassText(Pass* pass, Font* font, const char* text, uint32_t length, flo
}
}
void lovrPassFill(Pass* pass, Texture* texture) {
lovrPassDraw(pass, &(Draw) {
.mode = VERTEX_TRIANGLES,
.shader = SHADER_FILL,
.material = texture ? lovrTextureGetMaterial(texture) : NULL,
.vertex.format = VERTEX_EMPTY,
.count = 3
});
}
void lovrPassMesh(Pass* pass, Buffer* vertices, Buffer* indices, float* transform, uint32_t start, uint32_t count, uint32_t instances) {
if (count == ~0u) {
count = (indices ? indices : vertices)->info.length - start;

View File

@ -251,6 +251,7 @@ const SamplerInfo* lovrSamplerGetInfo(Sampler* sampler);
typedef enum {
SHADER_UNLIT,
SHADER_FONT,
SHADER_FILL,
DEFAULT_SHADER_COUNT
} DefaultShader;
@ -481,6 +482,7 @@ void lovrPassCircle(Pass* pass, float* transform, DrawStyle style, float angle1,
void lovrPassSphere(Pass* pass, float* transform, uint32_t segmentsH, uint32_t segmentsV);
void lovrPassTorus(Pass* pass, float* transform, uint32_t segmentsT, uint32_t segmentsP);
void lovrPassText(Pass* pass, Font* font, const char* text, uint32_t length, float* transform, float wrap, HorizontalAlign halign, VerticalAlign valign);
void lovrPassFill(Pass* pass, Texture* texture);
void lovrPassMesh(Pass* pass, Buffer* vertices, Buffer* indices, float* transform, uint32_t start, uint32_t count, uint32_t instances);
void lovrPassMultimesh(Pass* pass, Buffer* vertices, Buffer* indices, Buffer* indirect, uint32_t count, uint32_t offset, uint32_t stride);
void lovrPassCompute(Pass* pass, uint32_t x, uint32_t y, uint32_t z, Buffer* indirect, uint32_t offset);