|
|
|
@@ -196,7 +196,7 @@ struct DRWShadingGroup {
|
|
|
|
|
GPUShader *shader; /* Shader to bind */
|
|
|
|
|
DRWInterface *interface; /* Uniforms pointers */
|
|
|
|
|
ListBase calls; /* DRWCall or DRWCallDynamic depending of type */
|
|
|
|
|
DRWState state; /* State changes for this batch only */
|
|
|
|
|
DRWState state_extra; /* State changes for this batch only (or'd with the pass's state) */
|
|
|
|
|
int type;
|
|
|
|
|
|
|
|
|
|
Batch *instance_geom; /* Geometry to instance */
|
|
|
|
@@ -229,6 +229,9 @@ static struct DRWGlobalState {
|
|
|
|
|
ListBase bound_texs;
|
|
|
|
|
int tex_bind_id;
|
|
|
|
|
|
|
|
|
|
/* Managed by `DRW_state_set`, `DRW_state_reset` */
|
|
|
|
|
DRWState state;
|
|
|
|
|
|
|
|
|
|
/* Per viewport */
|
|
|
|
|
GPUViewport *viewport;
|
|
|
|
|
struct GPUFrameBuffer *default_framebuffer;
|
|
|
|
@@ -608,7 +611,7 @@ DRWShadingGroup *DRW_shgroup_create(struct GPUShader *shader, DRWPass *pass)
|
|
|
|
|
shgroup->type = DRW_SHG_NORMAL;
|
|
|
|
|
shgroup->shader = shader;
|
|
|
|
|
shgroup->interface = DRW_interface_create(shader);
|
|
|
|
|
shgroup->state = 0;
|
|
|
|
|
shgroup->state_extra = 0;
|
|
|
|
|
shgroup->batch_geom = NULL;
|
|
|
|
|
shgroup->instance_geom = NULL;
|
|
|
|
|
|
|
|
|
@@ -797,9 +800,10 @@ void DRW_shgroup_call_dynamic_add_array(DRWShadingGroup *shgroup, const void *at
|
|
|
|
|
|
|
|
|
|
/* Make sure you know what you do when using this,
|
|
|
|
|
* State is not revert back at the end of the shgroup */
|
|
|
|
|
void DRW_shgroup_state_set(DRWShadingGroup *shgroup, DRWState state)
|
|
|
|
|
|
|
|
|
|
void DRW_shgroup_state_enable(DRWShadingGroup *shgroup, DRWState state)
|
|
|
|
|
{
|
|
|
|
|
shgroup->state = state;
|
|
|
|
|
shgroup->state_extra |= state;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DRW_shgroup_attrib_float(DRWShadingGroup *shgroup, const char *name, int size)
|
|
|
|
@@ -1027,127 +1031,226 @@ void DRW_pass_free(DRWPass *pass)
|
|
|
|
|
/** \name Draw (DRW_draw)
|
|
|
|
|
* \{ */
|
|
|
|
|
|
|
|
|
|
static void set_state(DRWState flag, const bool reset)
|
|
|
|
|
static void DRW_state_set(DRWState state)
|
|
|
|
|
{
|
|
|
|
|
/* TODO Keep track of the state and only revert what is needed */
|
|
|
|
|
if (DST.state == state) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (reset) {
|
|
|
|
|
/* Depth Write */
|
|
|
|
|
if (flag & DRW_STATE_WRITE_DEPTH)
|
|
|
|
|
glDepthMask(GL_TRUE);
|
|
|
|
|
else
|
|
|
|
|
glDepthMask(GL_FALSE);
|
|
|
|
|
|
|
|
|
|
/* Color Write */
|
|
|
|
|
if (flag & DRW_STATE_WRITE_COLOR)
|
|
|
|
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
|
|
|
|
else
|
|
|
|
|
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
|
|
|
|
#define CHANGED_TO(f) \
|
|
|
|
|
((DST.state & (f)) ? \
|
|
|
|
|
((state & (f)) ? 0 : -1) : \
|
|
|
|
|
((state & (f)) ? 1 : 0))
|
|
|
|
|
|
|
|
|
|
/* Backface Culling */
|
|
|
|
|
if (flag & DRW_STATE_CULL_BACK ||
|
|
|
|
|
flag & DRW_STATE_CULL_FRONT)
|
|
|
|
|
#define CHANGED_ANY(f) \
|
|
|
|
|
((DST.state & (f)) != (state & (f)))
|
|
|
|
|
|
|
|
|
|
#define CHANGED_ANY_STORE_VAR(f, enabled) \
|
|
|
|
|
((DST.state & (f)) != (enabled = (state & (f))))
|
|
|
|
|
|
|
|
|
|
/* Depth Write */
|
|
|
|
|
{
|
|
|
|
|
int test;
|
|
|
|
|
if ((test = CHANGED_TO(DRW_STATE_WRITE_DEPTH))) {
|
|
|
|
|
if (test == 1) {
|
|
|
|
|
glDepthMask(GL_TRUE);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
glDepthMask(GL_FALSE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Color Write */
|
|
|
|
|
{
|
|
|
|
|
int test;
|
|
|
|
|
if ((test = CHANGED_TO(DRW_STATE_WRITE_COLOR))) {
|
|
|
|
|
if (test == 1) {
|
|
|
|
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Cull */
|
|
|
|
|
{
|
|
|
|
|
DRWState test;
|
|
|
|
|
if (CHANGED_ANY_STORE_VAR(
|
|
|
|
|
DRW_STATE_CULL_BACK | DRW_STATE_CULL_FRONT,
|
|
|
|
|
test))
|
|
|
|
|
{
|
|
|
|
|
glEnable(GL_CULL_FACE);
|
|
|
|
|
if (test) {
|
|
|
|
|
glEnable(GL_CULL_FACE);
|
|
|
|
|
|
|
|
|
|
if (flag & DRW_STATE_CULL_BACK)
|
|
|
|
|
glCullFace(GL_BACK);
|
|
|
|
|
else if (flag & DRW_STATE_CULL_FRONT)
|
|
|
|
|
glCullFace(GL_FRONT);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
glDisable(GL_CULL_FACE);
|
|
|
|
|
if ((state & DRW_STATE_CULL_BACK) != 0) {
|
|
|
|
|
glCullFace(GL_BACK);
|
|
|
|
|
}
|
|
|
|
|
else if ((state & DRW_STATE_CULL_FRONT) != 0) {
|
|
|
|
|
glCullFace(GL_FRONT);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
BLI_assert(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
glDisable(GL_CULL_FACE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Depth Test */
|
|
|
|
|
if ((flag & (DRW_STATE_DEPTH_LESS | DRW_STATE_DEPTH_EQUAL | DRW_STATE_DEPTH_GREATER)) != 0) {
|
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
|
/* Depth Test */
|
|
|
|
|
{
|
|
|
|
|
DRWState test;
|
|
|
|
|
if (CHANGED_ANY_STORE_VAR(
|
|
|
|
|
DRW_STATE_DEPTH_LESS | DRW_STATE_DEPTH_EQUAL | DRW_STATE_DEPTH_GREATER,
|
|
|
|
|
test))
|
|
|
|
|
{
|
|
|
|
|
if (test) {
|
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
|
|
|
|
|
|
if (flag & DRW_STATE_DEPTH_LESS)
|
|
|
|
|
glDepthFunc(GL_LEQUAL);
|
|
|
|
|
else if (flag & DRW_STATE_DEPTH_EQUAL)
|
|
|
|
|
glDepthFunc(GL_EQUAL);
|
|
|
|
|
else if (flag & DRW_STATE_DEPTH_GREATER)
|
|
|
|
|
glDepthFunc(GL_GREATER);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
|
if (state & DRW_STATE_DEPTH_LESS) {
|
|
|
|
|
glDepthFunc(GL_LEQUAL);
|
|
|
|
|
}
|
|
|
|
|
else if (state & DRW_STATE_DEPTH_EQUAL) {
|
|
|
|
|
glDepthFunc(GL_EQUAL);
|
|
|
|
|
}
|
|
|
|
|
else if (state & DRW_STATE_DEPTH_GREATER) {
|
|
|
|
|
glDepthFunc(GL_GREATER);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
BLI_assert(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Wire Width */
|
|
|
|
|
if ((flag & DRW_STATE_WIRE) != 0) {
|
|
|
|
|
glLineWidth(1.0f);
|
|
|
|
|
}
|
|
|
|
|
else if ((flag & DRW_STATE_WIRE_LARGE) != 0) {
|
|
|
|
|
glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f);
|
|
|
|
|
{
|
|
|
|
|
if (CHANGED_ANY(DRW_STATE_WIRE | DRW_STATE_WIRE_LARGE)) {
|
|
|
|
|
if ((state & DRW_STATE_WIRE) != 0) {
|
|
|
|
|
glLineWidth(1.0f);
|
|
|
|
|
}
|
|
|
|
|
else if ((state & DRW_STATE_WIRE_LARGE) != 0) {
|
|
|
|
|
glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
/* do nothing */
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Points Size */
|
|
|
|
|
if ((flag & DRW_STATE_POINT) != 0) {
|
|
|
|
|
GPU_enable_program_point_size();
|
|
|
|
|
glPointSize(5.0f);
|
|
|
|
|
}
|
|
|
|
|
else if (reset) {
|
|
|
|
|
GPU_disable_program_point_size();
|
|
|
|
|
{
|
|
|
|
|
int test;
|
|
|
|
|
if ((test = CHANGED_TO(DRW_STATE_POINT))) {
|
|
|
|
|
if (test == 1) {
|
|
|
|
|
GPU_enable_program_point_size();
|
|
|
|
|
glPointSize(5.0f);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
GPU_disable_program_point_size();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Blending (all buffer) */
|
|
|
|
|
if ((flag & DRW_STATE_BLEND) != 0) {
|
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
|
}
|
|
|
|
|
else if (reset) {
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
{
|
|
|
|
|
int test;
|
|
|
|
|
if ((test = CHANGED_TO(DRW_STATE_BLEND))) {
|
|
|
|
|
if (test == 1) {
|
|
|
|
|
glEnable(GL_BLEND);
|
|
|
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Line Stipple */
|
|
|
|
|
if ((flag & DRW_STATE_STIPPLE_2) != 0) {
|
|
|
|
|
setlinestyle(2);
|
|
|
|
|
}
|
|
|
|
|
else if ((flag & DRW_STATE_STIPPLE_3) != 0) {
|
|
|
|
|
setlinestyle(3);
|
|
|
|
|
}
|
|
|
|
|
else if ((flag & DRW_STATE_STIPPLE_4) != 0) {
|
|
|
|
|
setlinestyle(4);
|
|
|
|
|
}
|
|
|
|
|
else if (reset) {
|
|
|
|
|
setlinestyle(0);
|
|
|
|
|
{
|
|
|
|
|
int test;
|
|
|
|
|
if (CHANGED_ANY_STORE_VAR(
|
|
|
|
|
DRW_STATE_STIPPLE_2 | DRW_STATE_STIPPLE_3 | DRW_STATE_STIPPLE_4,
|
|
|
|
|
test))
|
|
|
|
|
{
|
|
|
|
|
if (test) {
|
|
|
|
|
if ((state & DRW_STATE_STIPPLE_2) != 0) {
|
|
|
|
|
setlinestyle(2);
|
|
|
|
|
}
|
|
|
|
|
else if ((state & DRW_STATE_STIPPLE_3) != 0) {
|
|
|
|
|
setlinestyle(3);
|
|
|
|
|
}
|
|
|
|
|
else if ((state & DRW_STATE_STIPPLE_4) != 0) {
|
|
|
|
|
setlinestyle(4);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
BLI_assert(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
setlinestyle(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Stencil */
|
|
|
|
|
if ((flag & (DRW_STATE_WRITE_STENCIL_SELECT | DRW_STATE_WRITE_STENCIL_ACTIVE |
|
|
|
|
|
DRW_STATE_TEST_STENCIL_SELECT | DRW_STATE_TEST_STENCIL_ACTIVE)) != 0)
|
|
|
|
|
{
|
|
|
|
|
glEnable(GL_STENCIL_TEST);
|
|
|
|
|
DRWState test;
|
|
|
|
|
if (CHANGED_ANY_STORE_VAR(
|
|
|
|
|
DRW_STATE_WRITE_STENCIL_SELECT |
|
|
|
|
|
DRW_STATE_WRITE_STENCIL_ACTIVE |
|
|
|
|
|
DRW_STATE_TEST_STENCIL_SELECT |
|
|
|
|
|
DRW_STATE_TEST_STENCIL_ACTIVE,
|
|
|
|
|
test))
|
|
|
|
|
{
|
|
|
|
|
if (test) {
|
|
|
|
|
glEnable(GL_STENCIL_TEST);
|
|
|
|
|
|
|
|
|
|
/* Stencil Write */
|
|
|
|
|
if ((flag & DRW_STATE_WRITE_STENCIL_SELECT) != 0) {
|
|
|
|
|
glStencilMask(STENCIL_SELECT);
|
|
|
|
|
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
|
|
|
|
glStencilFunc(GL_ALWAYS, 0xFF, STENCIL_SELECT);
|
|
|
|
|
}
|
|
|
|
|
else if ((flag & DRW_STATE_WRITE_STENCIL_ACTIVE) != 0) {
|
|
|
|
|
glStencilMask(STENCIL_ACTIVE);
|
|
|
|
|
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
|
|
|
|
glStencilFunc(GL_ALWAYS, 0xFF, STENCIL_ACTIVE);
|
|
|
|
|
}
|
|
|
|
|
/* Stencil Test */
|
|
|
|
|
else if ((flag & DRW_STATE_TEST_STENCIL_SELECT) != 0) {
|
|
|
|
|
glStencilMask(0x00); /* disable write */
|
|
|
|
|
glStencilFunc(GL_NOTEQUAL, 0xFF, STENCIL_SELECT);
|
|
|
|
|
}
|
|
|
|
|
else if ((flag & DRW_STATE_TEST_STENCIL_ACTIVE) != 0) {
|
|
|
|
|
glStencilMask(0x00); /* disable write */
|
|
|
|
|
glStencilFunc(GL_NOTEQUAL, 0xFF, STENCIL_ACTIVE);
|
|
|
|
|
/* Stencil Write */
|
|
|
|
|
if ((state & DRW_STATE_WRITE_STENCIL_SELECT) != 0) {
|
|
|
|
|
glStencilMask(STENCIL_SELECT);
|
|
|
|
|
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
|
|
|
|
glStencilFunc(GL_ALWAYS, 0xFF, STENCIL_SELECT);
|
|
|
|
|
}
|
|
|
|
|
else if ((state & DRW_STATE_WRITE_STENCIL_ACTIVE) != 0) {
|
|
|
|
|
glStencilMask(STENCIL_ACTIVE);
|
|
|
|
|
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
|
|
|
|
glStencilFunc(GL_ALWAYS, 0xFF, STENCIL_ACTIVE);
|
|
|
|
|
}
|
|
|
|
|
/* Stencil Test */
|
|
|
|
|
else if ((state & DRW_STATE_TEST_STENCIL_SELECT) != 0) {
|
|
|
|
|
glStencilMask(0x00); /* disable write */
|
|
|
|
|
glStencilFunc(GL_NOTEQUAL, 0xFF, STENCIL_SELECT);
|
|
|
|
|
}
|
|
|
|
|
else if ((state & DRW_STATE_TEST_STENCIL_ACTIVE) != 0) {
|
|
|
|
|
glStencilMask(0x00); /* disable write */
|
|
|
|
|
glStencilFunc(GL_NOTEQUAL, 0xFF, STENCIL_ACTIVE);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
BLI_assert(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
/* disable write & test */
|
|
|
|
|
glStencilMask(0x00);
|
|
|
|
|
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
|
|
|
|
glDisable(GL_STENCIL_TEST);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (reset) {
|
|
|
|
|
/* disable write & test */
|
|
|
|
|
glStencilMask(0x00);
|
|
|
|
|
glStencilFunc(GL_ALWAYS, 1, 0xFF);
|
|
|
|
|
glDisable(GL_STENCIL_TEST);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#undef CHANGED_TO
|
|
|
|
|
#undef CHANGED_ANY
|
|
|
|
|
#undef CHANGED_ANY_STORE_VAR
|
|
|
|
|
|
|
|
|
|
DST.state = state;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typedef struct DRWBoundTexture {
|
|
|
|
@@ -1237,7 +1340,7 @@ static void draw_geometry(DRWShadingGroup *shgroup, Batch *geom, const float (*o
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void draw_shgroup(DRWShadingGroup *shgroup)
|
|
|
|
|
static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
|
|
|
|
|
{
|
|
|
|
|
BLI_assert(shgroup->shader);
|
|
|
|
|
BLI_assert(shgroup->interface);
|
|
|
|
@@ -1256,9 +1359,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup)
|
|
|
|
|
shgroup_dynamic_batch_from_calls(shgroup);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (shgroup->state != 0) {
|
|
|
|
|
set_state(shgroup->state, false);
|
|
|
|
|
}
|
|
|
|
|
DRW_state_set(pass_state | shgroup->state_extra);
|
|
|
|
|
|
|
|
|
|
/* Binding Uniform */
|
|
|
|
|
/* Don't check anything, Interface should already contain the least uniform as possible */
|
|
|
|
@@ -1355,10 +1456,7 @@ static void draw_shgroup(DRWShadingGroup *shgroup)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* reset the state for the next group, note - we could only reset states we changed! */
|
|
|
|
|
if (shgroup->state != 0) {
|
|
|
|
|
DRW_state_reset();
|
|
|
|
|
}
|
|
|
|
|
DRW_state_reset();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DRW_draw_pass(DRWPass *pass)
|
|
|
|
@@ -1367,7 +1465,7 @@ void DRW_draw_pass(DRWPass *pass)
|
|
|
|
|
DST.shader = NULL;
|
|
|
|
|
DST.tex_bind_id = 0;
|
|
|
|
|
|
|
|
|
|
set_state(pass->state, true);
|
|
|
|
|
DRW_state_set(pass->state);
|
|
|
|
|
BLI_listbase_clear(&DST.bound_texs);
|
|
|
|
|
|
|
|
|
|
pass->wasdrawn = true;
|
|
|
|
@@ -1394,7 +1492,7 @@ void DRW_draw_pass(DRWPass *pass)
|
|
|
|
|
glBeginQuery(GL_TIME_ELAPSED, pass->timer_queries[pass->back_idx]);
|
|
|
|
|
|
|
|
|
|
for (DRWShadingGroup *shgroup = pass->shgroups.first; shgroup; shgroup = shgroup->next) {
|
|
|
|
|
draw_shgroup(shgroup);
|
|
|
|
|
draw_shgroup(shgroup, pass->state);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Clear Bound textures */
|
|
|
|
@@ -1431,11 +1529,12 @@ void DRW_draw_callbacks_post_scene(void)
|
|
|
|
|
/* Reset state to not interfer with other UI drawcall */
|
|
|
|
|
void DRW_state_reset(void)
|
|
|
|
|
{
|
|
|
|
|
DRWState state = 0;
|
|
|
|
|
state |= DRW_STATE_WRITE_DEPTH;
|
|
|
|
|
state |= DRW_STATE_WRITE_COLOR;
|
|
|
|
|
state |= DRW_STATE_DEPTH_LESS;
|
|
|
|
|
set_state(state, true);
|
|
|
|
|
DRWState state =
|
|
|
|
|
DRW_STATE_WRITE_DEPTH |
|
|
|
|
|
DRW_STATE_WRITE_COLOR |
|
|
|
|
|
DRW_STATE_DEPTH_LESS;
|
|
|
|
|
DST.state = ~state;
|
|
|
|
|
DRW_state_set(state);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** \} */
|
|
|
|
@@ -2238,6 +2337,7 @@ void DRW_draw_render_loop(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Start Drawing */
|
|
|
|
|
DRW_state_reset();
|
|
|
|
|
DRW_engines_draw_background();
|
|
|
|
|
|
|
|
|
|
DRW_draw_callbacks_pre_scene();
|
|
|
|
@@ -2252,6 +2352,8 @@ void DRW_draw_render_loop(
|
|
|
|
|
ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DRW_state_reset();
|
|
|
|
|
|
|
|
|
|
DRW_engines_draw_text();
|
|
|
|
|
|
|
|
|
|
/* needed so manipulator isn't obscured */
|
|
|
|
@@ -2400,6 +2502,7 @@ void DRW_draw_select_loop(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Start Drawing */
|
|
|
|
|
DRW_state_reset();
|
|
|
|
|
DRW_draw_callbacks_pre_scene();
|
|
|
|
|
DRW_engines_draw_scene();
|
|
|
|
|
DRW_draw_callbacks_post_scene();
|
|
|
|
@@ -2482,6 +2585,7 @@ void DRW_draw_depth_loop(
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Start Drawing */
|
|
|
|
|
DRW_state_reset();
|
|
|
|
|
DRW_draw_callbacks_pre_scene();
|
|
|
|
|
DRW_engines_draw_scene();
|
|
|
|
|
DRW_draw_callbacks_post_scene();
|
|
|
|
|