mirror of https://github.com/bjornbytes/lovr.git
Improve viewport/scissor accessors;
- Better validation - Can set to nil to "disable" - Getter returns nil when "disabled" - Negative viewport height works again
This commit is contained in:
parent
3fb3590b77
commit
c3c5284f11
|
@ -342,6 +342,10 @@ static int l_lovrPassGetViewport(lua_State* L) {
|
|||
Pass* pass = luax_checktype(L, 1, Pass);
|
||||
float viewport[6];
|
||||
lovrPassGetViewport(pass, viewport);
|
||||
if (viewport[2] == 0.f && viewport[3] == 0.f) {
|
||||
lua_pushnil(L);
|
||||
return 1;
|
||||
}
|
||||
lua_pushnumber(L, viewport[0]);
|
||||
lua_pushnumber(L, viewport[1]);
|
||||
lua_pushnumber(L, viewport[2]);
|
||||
|
@ -354,12 +358,20 @@ static int l_lovrPassGetViewport(lua_State* L) {
|
|||
static int l_lovrPassSetViewport(lua_State* L) {
|
||||
Pass* pass = luax_checktype(L, 1, Pass);
|
||||
float viewport[6];
|
||||
viewport[0] = luax_checkfloat(L, 2);
|
||||
viewport[1] = luax_checkfloat(L, 3);
|
||||
viewport[2] = luax_checkfloat(L, 4);
|
||||
viewport[3] = luax_checkfloat(L, 5);
|
||||
viewport[4] = luax_optfloat(L, 6, 0.f);
|
||||
viewport[5] = luax_optfloat(L, 7, 1.f);
|
||||
if (lua_isnoneornil(L, 2)) {
|
||||
memset(viewport, 0, sizeof(viewport));
|
||||
} else {
|
||||
viewport[0] = luax_checkfloat(L, 2);
|
||||
viewport[1] = luax_checkfloat(L, 3);
|
||||
viewport[2] = luax_checkfloat(L, 4);
|
||||
viewport[3] = luax_checkfloat(L, 5);
|
||||
viewport[4] = luax_optfloat(L, 6, 0.f);
|
||||
viewport[5] = luax_optfloat(L, 7, 1.f);
|
||||
lovrCheck(viewport[2] > 0.f, "Viewport width must be positive");
|
||||
lovrCheck(viewport[3] != 0.f, "Viewport height can not be zero");
|
||||
lovrCheck(viewport[4] >= 0.f && viewport[4] <= 1.f, "Viewport depth range must be between 0 and 1");
|
||||
lovrCheck(viewport[5] >= 0.f && viewport[5] <= 1.f, "Viewport depth range must be between 0 and 1");
|
||||
}
|
||||
lovrPassSetViewport(pass, viewport);
|
||||
return 0;
|
||||
}
|
||||
|
@ -368,6 +380,10 @@ static int l_lovrPassGetScissor(lua_State* L) {
|
|||
Pass* pass = luax_checktype(L, 1, Pass);
|
||||
uint32_t scissor[4];
|
||||
lovrPassGetScissor(pass, scissor);
|
||||
if (scissor[2] == 0 && scissor[3] == 0) {
|
||||
lua_pushnil(L);
|
||||
return 1;
|
||||
}
|
||||
lua_pushinteger(L, scissor[0]);
|
||||
lua_pushinteger(L, scissor[1]);
|
||||
lua_pushinteger(L, scissor[2]);
|
||||
|
@ -378,10 +394,14 @@ static int l_lovrPassGetScissor(lua_State* L) {
|
|||
static int l_lovrPassSetScissor(lua_State* L) {
|
||||
Pass* pass = luax_checktype(L, 1, Pass);
|
||||
uint32_t scissor[4];
|
||||
scissor[0] = luax_checku32(L, 2);
|
||||
scissor[1] = luax_checku32(L, 3);
|
||||
scissor[2] = luax_checku32(L, 4);
|
||||
scissor[3] = luax_checku32(L, 5);
|
||||
if (lua_isnoneornil(L, 2)) {
|
||||
memset(scissor, 0, sizeof(scissor));
|
||||
} else {
|
||||
scissor[0] = luax_checku32(L, 2);
|
||||
scissor[1] = luax_checku32(L, 3);
|
||||
scissor[2] = luax_checku32(L, 4);
|
||||
scissor[3] = luax_checku32(L, 5);
|
||||
}
|
||||
lovrPassSetScissor(pass, scissor);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1350,8 +1350,8 @@ static void recordRenderPass(Pass* pass, gpu_stream* stream) {
|
|||
|
||||
float defaultViewport[6] = { 0.f, 0.f, (float) canvas->width, (float) canvas->height, 0.f, 1.f };
|
||||
uint32_t defaultScissor[4] = { 0, 0, canvas->width, canvas->height };
|
||||
float* viewport = pass->viewport[2] > 0.f && pass->viewport[3] > 0.f ? pass->viewport : defaultViewport;
|
||||
uint32_t* scissor = pass->scissor[2] > 0 && pass->scissor[3] > 0 ? pass->scissor : defaultScissor;
|
||||
float* viewport = pass->viewport[2] == 0.f && pass->viewport[3] == 0.f ? defaultViewport : pass->viewport;
|
||||
uint32_t* scissor = pass->scissor[2] == 0 && pass->scissor[3] == 0 ? defaultScissor : pass->scissor;
|
||||
|
||||
gpu_set_viewport(stream, viewport, viewport + 4);
|
||||
gpu_set_scissor(stream, scissor);
|
||||
|
|
Loading…
Reference in New Issue