forked from bartvdbraak/blender
GPencil: Create blank texture only once by engine
This texture is used for missing textures as replace. Differential Revision: https://developer.blender.org/D5845
This commit is contained in:
parent
e7fde3a0f3
commit
6f7a64b57f
@ -414,7 +414,8 @@ static void set_wireframe_color(Object *ob,
|
||||
}
|
||||
|
||||
/* create shading group for filling */
|
||||
static DRWShadingGroup *gpencil_shgroup_fill_create(GPENCIL_Data *vedata,
|
||||
static DRWShadingGroup *gpencil_shgroup_fill_create(GPENCIL_e_data *e_data,
|
||||
GPENCIL_Data *vedata,
|
||||
DRWPass *pass,
|
||||
GPUShader *shader,
|
||||
Object *ob,
|
||||
@ -543,7 +544,7 @@ static DRWShadingGroup *gpencil_shgroup_fill_create(GPENCIL_Data *vedata,
|
||||
}
|
||||
else {
|
||||
/* if no texture defined, need a blank texture to avoid errors in draw manager */
|
||||
DRW_shgroup_uniform_texture(grp, "myTexture", stl->g_data->gpencil_blank_texture);
|
||||
DRW_shgroup_uniform_texture(grp, "myTexture", e_data->gpencil_blank_texture);
|
||||
stl->shgroups[id].texture_clamp = 0;
|
||||
DRW_shgroup_uniform_int(grp, "texture_clamp", &stl->shgroups[id].texture_clamp, 1);
|
||||
}
|
||||
@ -563,7 +564,8 @@ bool gpencil_onion_active(bGPdata *gpd)
|
||||
}
|
||||
|
||||
/* create shading group for strokes */
|
||||
DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_Data *vedata,
|
||||
DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_e_data *e_data,
|
||||
GPENCIL_Data *vedata,
|
||||
DRWPass *pass,
|
||||
GPUShader *shader,
|
||||
Object *ob,
|
||||
@ -722,14 +724,15 @@ DRWShadingGroup *gpencil_shgroup_stroke_create(GPENCIL_Data *vedata,
|
||||
}
|
||||
else {
|
||||
/* if no texture defined, need a blank texture to avoid errors in draw manager */
|
||||
DRW_shgroup_uniform_texture(grp, "myTexture", stl->g_data->gpencil_blank_texture);
|
||||
DRW_shgroup_uniform_texture(grp, "myTexture", e_data->gpencil_blank_texture);
|
||||
}
|
||||
|
||||
return grp;
|
||||
}
|
||||
|
||||
/* create shading group for points */
|
||||
static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_Data *vedata,
|
||||
static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_e_data *e_data,
|
||||
GPENCIL_Data *vedata,
|
||||
DRWPass *pass,
|
||||
GPUShader *shader,
|
||||
Object *ob,
|
||||
@ -894,7 +897,7 @@ static DRWShadingGroup *gpencil_shgroup_point_create(GPENCIL_Data *vedata,
|
||||
}
|
||||
else {
|
||||
/* if no texture defined, need a blank texture to avoid errors in draw manager */
|
||||
DRW_shgroup_uniform_texture(grp, "myTexture", stl->g_data->gpencil_blank_texture);
|
||||
DRW_shgroup_uniform_texture(grp, "myTexture", e_data->gpencil_blank_texture);
|
||||
}
|
||||
|
||||
return grp;
|
||||
@ -1588,6 +1591,7 @@ void gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data,
|
||||
if (gpd->runtime.sbuffer_used > 1) {
|
||||
if ((gp_style) && (gp_style->mode == GP_STYLE_MODE_LINE)) {
|
||||
stl->g_data->shgrps_drawing_stroke = gpencil_shgroup_stroke_create(
|
||||
e_data,
|
||||
vedata,
|
||||
psl->drawing_pass,
|
||||
e_data->gpencil_stroke_sh,
|
||||
@ -1613,6 +1617,7 @@ void gpencil_populate_buffer_strokes(GPENCIL_e_data *e_data,
|
||||
}
|
||||
else {
|
||||
stl->g_data->shgrps_drawing_stroke = gpencil_shgroup_point_create(
|
||||
e_data,
|
||||
vedata,
|
||||
psl->drawing_pass,
|
||||
e_data->gpencil_point_sh,
|
||||
@ -1800,7 +1805,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
|
||||
case eGpencilBatchGroupType_Stroke: {
|
||||
const int len = elm->vertex_idx - start_stroke;
|
||||
|
||||
shgrp = gpencil_shgroup_stroke_create(vedata,
|
||||
shgrp = gpencil_shgroup_stroke_create(e_data,
|
||||
vedata,
|
||||
stroke_pass,
|
||||
e_data->gpencil_stroke_sh,
|
||||
ob,
|
||||
@ -1838,7 +1844,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
|
||||
case eGpencilBatchGroupType_Point: {
|
||||
const int len = elm->vertex_idx - start_point;
|
||||
|
||||
shgrp = gpencil_shgroup_point_create(vedata,
|
||||
shgrp = gpencil_shgroup_point_create(e_data,
|
||||
vedata,
|
||||
stroke_pass,
|
||||
e_data->gpencil_point_sh,
|
||||
ob,
|
||||
@ -1865,7 +1872,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
|
||||
case eGpencilBatchGroupType_Fill: {
|
||||
const int len = elm->vertex_idx - start_fill;
|
||||
|
||||
shgrp = gpencil_shgroup_fill_create(vedata,
|
||||
shgrp = gpencil_shgroup_fill_create(e_data,
|
||||
vedata,
|
||||
stroke_pass,
|
||||
e_data->gpencil_fill_sh,
|
||||
ob,
|
||||
|
@ -178,6 +178,12 @@ static void GPENCIL_create_framebuffers(void *vedata)
|
||||
|
||||
static void GPENCIL_create_shaders(void)
|
||||
{
|
||||
/* blank texture used if no texture defined for fill shader */
|
||||
if (!e_data.gpencil_blank_texture) {
|
||||
float rect[1][1][4] = {{{0.0f}}};
|
||||
e_data.gpencil_blank_texture = DRW_texture_create_2d(
|
||||
1, 1, GPU_RGBA8, DRW_TEX_FILTER, (float *)rect);
|
||||
}
|
||||
/* normal fill shader */
|
||||
if (!e_data.gpencil_fill_sh) {
|
||||
e_data.gpencil_fill_sh = GPU_shader_create_from_arrays({
|
||||
@ -293,6 +299,8 @@ static void GPENCIL_engine_free(void)
|
||||
DRW_SHADER_FREE_SAFE(e_data.gpencil_background_sh);
|
||||
DRW_SHADER_FREE_SAFE(e_data.gpencil_paper_sh);
|
||||
|
||||
DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
|
||||
|
||||
/* effects */
|
||||
GPENCIL_delete_fx_shaders(&e_data);
|
||||
}
|
||||
@ -338,17 +346,11 @@ void GPENCIL_cache_init(void *vedata)
|
||||
stl->g_data->shgrps_edit_point = NULL;
|
||||
|
||||
/* reset textures */
|
||||
stl->g_data->gpencil_blank_texture = NULL;
|
||||
stl->g_data->batch_buffer_stroke = NULL;
|
||||
stl->g_data->batch_buffer_fill = NULL;
|
||||
stl->g_data->batch_buffer_ctrlpoint = NULL;
|
||||
stl->g_data->batch_grid = NULL;
|
||||
|
||||
/* blank texture used if no texture defined for fill shader */
|
||||
float rect[1][1][4] = {{{0.0f}}};
|
||||
stl->g_data->gpencil_blank_texture = DRW_texture_create_2d(
|
||||
1, 1, GPU_RGBA8, DRW_TEX_FILTER, (float *)rect);
|
||||
|
||||
if (!stl->shgroups) {
|
||||
/* Alloc maximum size because count strokes is very slow and can be very complex due onion
|
||||
* skinning.
|
||||
@ -789,8 +791,6 @@ void DRW_gpencil_free_runtime_data(void *ved)
|
||||
GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
|
||||
|
||||
/* free gpu data */
|
||||
DRW_TEXTURE_FREE_SAFE(stl->g_data->gpencil_blank_texture);
|
||||
|
||||
GPU_BATCH_DISCARD_SAFE(stl->g_data->batch_buffer_stroke);
|
||||
MEM_SAFE_FREE(stl->g_data->batch_buffer_stroke);
|
||||
|
||||
|
@ -265,9 +265,6 @@ typedef struct g_data {
|
||||
/* grid geometry */
|
||||
GPUBatch *batch_grid;
|
||||
|
||||
/* textures */
|
||||
struct GPUTexture *gpencil_blank_texture;
|
||||
|
||||
/* runtime pointers texture */
|
||||
struct GPUTexture *input_depth_tx;
|
||||
struct GPUTexture *input_color_tx;
|
||||
@ -297,6 +294,9 @@ typedef enum eGPsession_Flag {
|
||||
} eGPsession_Flag;
|
||||
|
||||
typedef struct GPENCIL_e_data {
|
||||
/* textures */
|
||||
struct GPUTexture *gpencil_blank_texture;
|
||||
|
||||
/* general drawing shaders */
|
||||
struct GPUShader *gpencil_fill_sh;
|
||||
struct GPUShader *gpencil_stroke_sh;
|
||||
@ -386,7 +386,8 @@ typedef struct GpencilBatchCache {
|
||||
} GpencilBatchCache;
|
||||
|
||||
/* general drawing functions */
|
||||
struct DRWShadingGroup *gpencil_shgroup_stroke_create(struct GPENCIL_Data *vedata,
|
||||
struct DRWShadingGroup *gpencil_shgroup_stroke_create(struct GPENCIL_e_data *e_data,
|
||||
struct GPENCIL_Data *vedata,
|
||||
struct DRWPass *pass,
|
||||
struct GPUShader *shader,
|
||||
struct Object *ob,
|
||||
|
Loading…
Reference in New Issue
Block a user