Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/modes/paint_texture_mode.c
| Show First 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
| * or is free itself. Use PAINT_TEXTURE_engine_init() to | * or is free itself. Use PAINT_TEXTURE_engine_init() to | ||||
| * initialize most of them and PAINT_TEXTURE_cache_init() | * initialize most of them and PAINT_TEXTURE_cache_init() | ||||
| * for PAINT_TEXTURE_PassList */ | * for PAINT_TEXTURE_PassList */ | ||||
| typedef struct PAINT_TEXTURE_PassList { | typedef struct PAINT_TEXTURE_PassList { | ||||
| /* Declare all passes here and init them in | /* Declare all passes here and init them in | ||||
| * PAINT_TEXTURE_cache_init(). | * PAINT_TEXTURE_cache_init(). | ||||
| * Only contains (DRWPass *) */ | * Only contains (DRWPass *) */ | ||||
| struct DRWPass *image_faces; | struct DRWPass *stencil_mask_overlay; | ||||
| struct DRWPass *wire_select_overlay; | struct DRWPass *wire_select_overlay; | ||||
| struct DRWPass *face_select_overlay; | struct DRWPass *face_select_overlay; | ||||
| } PAINT_TEXTURE_PassList; | } PAINT_TEXTURE_PassList; | ||||
| typedef struct PAINT_TEXTURE_FramebufferList { | typedef struct PAINT_TEXTURE_FramebufferList { | ||||
| /* Contains all framebuffer objects needed by this engine. | /* Contains all framebuffer objects needed by this engine. | ||||
| * Only contains (GPUFrameBuffer *) */ | * Only contains (GPUFrameBuffer *) */ | ||||
| Show All 27 Lines | typedef struct PAINT_TEXTURE_Data { | ||||
| PAINT_TEXTURE_StorageList *stl; | PAINT_TEXTURE_StorageList *stl; | ||||
| } PAINT_TEXTURE_Data; | } PAINT_TEXTURE_Data; | ||||
| typedef struct PAINT_TEXTURE_Shaders { | typedef struct PAINT_TEXTURE_Shaders { | ||||
| /* Custom shaders : | /* Custom shaders : | ||||
| * Add sources to source/blender/draw/modes/shaders | * Add sources to source/blender/draw/modes/shaders | ||||
| * init in PAINT_TEXTURE_engine_init(); | * init in PAINT_TEXTURE_engine_init(); | ||||
| * free in PAINT_TEXTURE_engine_free(); */ | * free in PAINT_TEXTURE_engine_free(); */ | ||||
| struct GPUShader *fallback; | struct GPUShader *stencil_mask_overlay; | ||||
| struct GPUShader *image; | |||||
| struct GPUShader *image_mask; | |||||
| struct GPUShader *wire_select_overlay; | struct GPUShader *wire_select_overlay; | ||||
| struct GPUShader *face_select_overlay; | struct GPUShader *face_select_overlay; | ||||
| } PAINT_TEXTURE_Shaders; | } PAINT_TEXTURE_Shaders; | ||||
| /* *********** STATIC *********** */ | /* *********** STATIC *********** */ | ||||
| static struct { | static struct { | ||||
| PAINT_TEXTURE_Shaders sh_data[GPU_SHADER_CFG_LEN]; | PAINT_TEXTURE_Shaders sh_data[GPU_SHADER_CFG_LEN]; | ||||
| } e_data = {{{NULL}}}; /* Engine data */ | } e_data = {{{NULL}}}; /* Engine data */ | ||||
| typedef struct PAINT_TEXTURE_PrivateData { | typedef struct PAINT_TEXTURE_PrivateData { | ||||
| /* This keeps the references of the shading groups for | /* This keeps the references of the shading groups for | ||||
| * easy access in PAINT_TEXTURE_cache_populate() */ | * easy access in PAINT_TEXTURE_cache_populate() */ | ||||
| DRWShadingGroup *shgroup_fallback; | DRWShadingGroup *shgroup_stencil_mask; | ||||
| DRWShadingGroup **shgroup_image_array; | |||||
| /* face-mask */ | /* face-mask */ | ||||
| DRWShadingGroup *lwire_select_shgrp; | DRWShadingGroup *lwire_select_shgrp; | ||||
| DRWShadingGroup *face_select_shgrp; | DRWShadingGroup *face_select_shgrp; | ||||
| DRWView *view_wires; | DRWView *view_wires; | ||||
| } PAINT_TEXTURE_PrivateData; /* Transient data */ | } PAINT_TEXTURE_PrivateData; /* Transient data */ | ||||
| /* *********** FUNCTIONS *********** */ | /* *********** FUNCTIONS *********** */ | ||||
| /* Init Textures, Framebuffers, Storage and Shaders. | /* Init Textures, Framebuffers, Storage and Shaders. | ||||
| * It is called for every frames. */ | * It is called for every frames. */ | ||||
| static void PAINT_TEXTURE_engine_init(void *vedata) | static void PAINT_TEXTURE_engine_init(void *vedata) | ||||
| { | { | ||||
| PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | ||||
| if (!sh_data->fallback) { | if (!sh_data->stencil_mask_overlay) { | ||||
| const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; | const GPUShaderConfigData *sh_cfg_data = &GPU_shader_cfg_data[draw_ctx->sh_cfg]; | ||||
| sh_data->fallback = GPU_shader_create_from_arrays({ | sh_data->stencil_mask_overlay = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, | |||||
| datatoc_common_view_lib_glsl, | |||||
| datatoc_paint_face_vert_glsl, | |||||
| NULL}, | |||||
| .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL}, | |||||
| .defs = (const char *[]){sh_cfg_data->def, NULL}, | |||||
| }); | |||||
| sh_data->image = GPU_shader_create_from_arrays({ | |||||
| .vert = (const char *[]){sh_cfg_data->lib, | .vert = (const char *[]){sh_cfg_data->lib, | ||||
| datatoc_common_globals_lib_glsl, | datatoc_common_globals_lib_glsl, | ||||
| datatoc_common_view_lib_glsl, | datatoc_common_view_lib_glsl, | ||||
| datatoc_paint_texture_vert_glsl, | datatoc_paint_texture_vert_glsl, | ||||
| NULL}, | NULL}, | ||||
| .frag = (const char *[]){datatoc_common_colormanagement_lib_glsl, | .frag = (const char *[]){datatoc_common_colormanagement_lib_glsl, | ||||
| datatoc_paint_texture_frag_glsl, | datatoc_paint_texture_frag_glsl, | ||||
| NULL}, | NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, NULL}, | .defs = (const char *[]){sh_cfg_data->def, NULL}, | ||||
| }); | }); | ||||
| sh_data->image_mask = GPU_shader_create_from_arrays({ | |||||
| .vert = (const char *[]){sh_cfg_data->lib, | |||||
| datatoc_common_globals_lib_glsl, | |||||
| datatoc_common_view_lib_glsl, | |||||
| datatoc_paint_texture_vert_glsl, | |||||
| NULL}, | |||||
| .frag = (const char *[]){datatoc_common_colormanagement_lib_glsl, | |||||
| datatoc_paint_texture_frag_glsl, | |||||
| NULL}, | |||||
| .defs = (const char *[]){sh_cfg_data->def, "#define TEXTURE_PAINT_MASK\n", NULL}, | |||||
| }); | |||||
| sh_data->wire_select_overlay = GPU_shader_create_from_arrays({ | sh_data->wire_select_overlay = GPU_shader_create_from_arrays({ | ||||
| .vert = (const char *[]){sh_cfg_data->lib, | .vert = (const char *[]){sh_cfg_data->lib, | ||||
| datatoc_common_globals_lib_glsl, | datatoc_common_globals_lib_glsl, | ||||
| datatoc_common_view_lib_glsl, | datatoc_common_view_lib_glsl, | ||||
| datatoc_paint_wire_vert_glsl, | datatoc_paint_wire_vert_glsl, | ||||
| NULL}, | NULL}, | ||||
| .frag = (const char *[]){datatoc_paint_wire_frag_glsl, NULL}, | .frag = (const char *[]){datatoc_paint_wire_frag_glsl, NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, "#define USE_SELECT\n", NULL}, | .defs = (const char *[]){sh_cfg_data->def, "#define USE_SELECT\n", NULL}, | ||||
| Show All 9 Lines | sh_data->face_select_overlay = GPU_shader_create_from_arrays({ | ||||
| NULL}, | NULL}, | ||||
| .defs = (const char *[]){sh_cfg_data->def, NULL}, | .defs = (const char *[]){sh_cfg_data->def, NULL}, | ||||
| }); | }); | ||||
| } | } | ||||
| if (!stl->g_data) { | if (!stl->g_data) { | ||||
| /* Alloc transient pointers */ | /* Alloc transient pointers */ | ||||
| stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); | stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__); | ||||
| stl->g_data->shgroup_image_array = NULL; | stl->g_data->shgroup_stencil_mask = NULL; | ||||
| } | } | ||||
| stl->g_data->view_wires = DRW_view_create_with_zoffset(draw_ctx->rv3d, 1.0f); | stl->g_data->view_wires = DRW_view_create_with_zoffset(draw_ctx->rv3d, 1.0f); | ||||
| } | } | ||||
| static DRWShadingGroup *create_texture_paint_shading_group(PAINT_TEXTURE_PassList *psl, | static DRWShadingGroup *create_texture_paint_stencil_mask_shading_group( | ||||
| const Image *image, | PAINT_TEXTURE_PassList *psl, const DRWContextState *draw_ctx) | ||||
| const struct GPUTexture *texture, | |||||
| const DRWContextState *draw_ctx, | |||||
| const bool nearest_interp) | |||||
| { | { | ||||
| PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | ||||
| Scene *scene = draw_ctx->scene; | Scene *scene = draw_ctx->scene; | ||||
| const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint; | const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint; | ||||
| const bool masking_enabled = imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL && | |||||
| imapaint->stencil != NULL; | |||||
| DRWShadingGroup *grp = DRW_shgroup_create(masking_enabled ? sh_data->image_mask : sh_data->image, | DRWShadingGroup *grp = DRW_shgroup_create(sh_data->stencil_mask_overlay, | ||||
| psl->image_faces); | psl->stencil_mask_overlay); | ||||
| DRW_shgroup_uniform_texture(grp, "image", texture); | |||||
| DRW_shgroup_uniform_bool_copy( | |||||
| grp, "imagePremultiplied", (image->alpha_mode == IMA_ALPHA_PREMUL)); | |||||
| DRW_shgroup_uniform_float(grp, "alpha", &draw_ctx->v3d->overlay.texture_paint_mode_opacity, 1); | DRW_shgroup_uniform_float(grp, "alpha", &draw_ctx->v3d->overlay.texture_paint_mode_opacity, 1); | ||||
| DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); | ||||
| DRW_shgroup_uniform_bool_copy(grp, "nearestInterp", nearest_interp); | |||||
| if (masking_enabled) { | |||||
| const bool masking_inverted = (imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) > 0; | const bool masking_inverted = (imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) > 0; | ||||
| GPUTexture *stencil = GPU_texture_from_blender(imapaint->stencil, NULL, GL_TEXTURE_2D); | GPUTexture *stencil = GPU_texture_from_blender(imapaint->stencil, NULL, GL_TEXTURE_2D); | ||||
| DRW_shgroup_uniform_texture(grp, "maskingImage", stencil); | DRW_shgroup_uniform_texture(grp, "maskingImage", stencil); | ||||
| DRW_shgroup_uniform_bool_copy( | DRW_shgroup_uniform_bool_copy( | ||||
| grp, "maskingImagePremultiplied", (imapaint->stencil->alpha_mode == IMA_ALPHA_PREMUL)); | grp, "maskingImagePremultiplied", (imapaint->stencil->alpha_mode == IMA_ALPHA_PREMUL)); | ||||
| DRW_shgroup_uniform_vec3(grp, "maskingColor", imapaint->stencil_col, 1); | DRW_shgroup_uniform_vec3(grp, "maskingColor", imapaint->stencil_col, 1); | ||||
| DRW_shgroup_uniform_bool_copy(grp, "maskingInvertStencil", masking_inverted); | DRW_shgroup_uniform_bool_copy(grp, "maskingInvertStencil", masking_inverted); | ||||
| } | |||||
| return grp; | return grp; | ||||
| } | } | ||||
| static bool PAINT_TEXTURE_stencil_mask_enabled(const ImagePaintSettings *imapaint) | |||||
| { | |||||
| return imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL && imapaint->stencil != NULL; | |||||
| } | |||||
| /* Here init all passes and shading groups | /* Here init all passes and shading groups | ||||
| * Assume that all Passes are NULL */ | * Assume that all Passes are NULL */ | ||||
| static void PAINT_TEXTURE_cache_init(void *vedata) | static void PAINT_TEXTURE_cache_init(void *vedata) | ||||
| { | { | ||||
| PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; | PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; | ||||
| PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | |||||
| /* Create a pass */ | |||||
| { | |||||
| DRWPass *pass = DRW_pass_create( | |||||
| "Image Color Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_ALPHA); | |||||
| DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->fallback, pass); | |||||
| /* Uniforms need a pointer to it's value so be sure it's accessible at | |||||
| * any given time (i.e. use static vars) */ | |||||
| static const float color[4] = {1.0f, 0.0f, 1.0f, 1.0}; | |||||
| DRW_shgroup_uniform_vec4(shgrp, "color", color, 1); | |||||
| if (draw_ctx->sh_cfg == GPU_SHADER_CFG_CLIPPED) { | |||||
| DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES); | |||||
| } | |||||
| psl->image_faces = pass; | |||||
| stl->g_data->shgroup_fallback = shgrp; | |||||
| } | |||||
| MEM_SAFE_FREE(stl->g_data->shgroup_image_array); | |||||
| Object *ob = draw_ctx->obact; | |||||
| if (ob && ob->type == OB_MESH) { | |||||
| Scene *scene = draw_ctx->scene; | Scene *scene = draw_ctx->scene; | ||||
| const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint; | const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint; | ||||
| const bool use_material_slots = (imapaint->mode == IMAGEPAINT_MODE_MATERIAL); | |||||
| const Mesh *me = ob->data; | |||||
| const int mat_nr = max_ii(1, me->totcol); | |||||
| stl->g_data->shgroup_image_array = MEM_mallocN( | PAINT_TEXTURE_Shaders *sh_data = &e_data.sh_data[draw_ctx->sh_cfg]; | ||||
| sizeof(*stl->g_data->shgroup_image_array) * (use_material_slots ? mat_nr : 1), __func__); | |||||
| if (use_material_slots) { | |||||
| for (int i = 0; i < mat_nr; i++) { | |||||
| Material *ma = give_current_material(ob, i + 1); | |||||
| Image *ima = (ma && ma->texpaintslot) ? ma->texpaintslot[ma->paint_active_slot].ima : NULL; | |||||
| int interp = (ma && ma->texpaintslot) ? ma->texpaintslot[ma->paint_active_slot].interp : 0; | |||||
| GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D); | |||||
| if (tex) { | /* Stencil Mask */ | ||||
| DRWShadingGroup *grp = create_texture_paint_shading_group( | if (PAINT_TEXTURE_stencil_mask_enabled(imapaint)) { | ||||
| psl, ima, tex, draw_ctx, interp == SHD_INTERP_CLOSEST); | DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_EQUAL | DRW_STATE_BLEND_ALPHA; | ||||
| stl->g_data->shgroup_image_array[i] = grp; | psl->stencil_mask_overlay = DRW_pass_create("Stencil Mask Pass", state); | ||||
| } | stl->g_data->shgroup_stencil_mask = create_texture_paint_stencil_mask_shading_group(psl, | ||||
| else { | draw_ctx); | ||||
| stl->g_data->shgroup_image_array[i] = NULL; | |||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| Image *ima = imapaint->canvas; | |||||
| GPUTexture *tex = GPU_texture_from_blender(ima, NULL, GL_TEXTURE_2D); | |||||
| if (tex) { | |||||
| DRWShadingGroup *grp = create_texture_paint_shading_group( | |||||
| psl, ima, tex, draw_ctx, imapaint->interp == IMAGEPAINT_INTERP_CLOSEST); | |||||
| stl->g_data->shgroup_image_array[0] = grp; | |||||
| } | |||||
| else { | |||||
| stl->g_data->shgroup_image_array[0] = NULL; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| /* Face Mask */ | /* Face Mask */ | ||||
| { | { | ||||
| DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL; | DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL; | ||||
| DRWPass *pass = DRW_pass_create("Wire Mask Pass", state); | DRWPass *pass = DRW_pass_create("Wire Mask Pass", state); | ||||
| DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->wire_select_overlay, pass); | DRWShadingGroup *shgrp = DRW_shgroup_create(sh_data->wire_select_overlay, pass); | ||||
| Show All 28 Lines | static void PAINT_TEXTURE_cache_populate(void *vedata, Object *ob) | ||||
| PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; | PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; | ||||
| PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| UNUSED_VARS(psl, stl); | UNUSED_VARS(psl, stl); | ||||
| if ((ob->type == OB_MESH) && (draw_ctx->obact == ob)) { | if ((ob->type == OB_MESH) && (draw_ctx->obact == ob)) { | ||||
| /* Get geometry cache */ | /* Get geometry cache */ | ||||
| const Mesh *me = ob->data; | |||||
| const Mesh *me_orig = DEG_get_original_object(ob)->data; | const Mesh *me_orig = DEG_get_original_object(ob)->data; | ||||
| Scene *scene = draw_ctx->scene; | Scene *scene = draw_ctx->scene; | ||||
| const bool use_surface = draw_ctx->v3d->overlay.texture_paint_mode_opacity != | const ImagePaintSettings *imapaint = &scene->toolsettings->imapaint; | ||||
| 0.0; // DRW_object_is_mode_shade(ob) == true; | |||||
| const bool use_material_slots = (scene->toolsettings->imapaint.mode == | |||||
| IMAGEPAINT_MODE_MATERIAL); | |||||
| const bool use_face_sel = (me_orig->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; | |||||
| if (use_surface) { | const bool use_face_sel = (me_orig->editflag & ME_EDIT_PAINT_FACE_SEL) != 0; | ||||
| if (me->mloopuv != NULL) { | const bool masking_enabled = imapaint->flag & IMAGEPAINT_PROJECT_LAYER_STENCIL && | ||||
| if (use_material_slots) { | imapaint->stencil != NULL; | ||||
| int mat_nr = max_ii(1, me->totcol); | |||||
| struct GPUBatch **geom_array = DRW_cache_mesh_surface_texpaint_get(ob); | |||||
| for (int i = 0; i < mat_nr; i++) { | if (masking_enabled) { | ||||
| const int index = use_material_slots ? i : 0; | if (stl->g_data->shgroup_stencil_mask) { | ||||
| if ((i < me->totcol) && stl->g_data->shgroup_image_array[index]) { | |||||
| DRW_shgroup_call(stl->g_data->shgroup_image_array[index], geom_array[i], ob); | |||||
| } | |||||
| else { | |||||
| DRW_shgroup_call(stl->g_data->shgroup_fallback, geom_array[i], ob); | |||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| if (stl->g_data->shgroup_image_array[0]) { | |||||
| struct GPUBatch *geom = DRW_cache_mesh_surface_texpaint_single_get(ob); | struct GPUBatch *geom = DRW_cache_mesh_surface_texpaint_single_get(ob); | ||||
| DRW_shgroup_call(stl->g_data->shgroup_image_array[0], geom, ob); | DRW_shgroup_call(stl->g_data->shgroup_stencil_mask, geom, ob); | ||||
| } | |||||
| } | |||||
| } | |||||
| else { | |||||
| struct GPUBatch *geom = DRW_cache_mesh_surface_get(ob); | |||||
| DRW_shgroup_call(stl->g_data->shgroup_fallback, geom, ob); | |||||
| } | } | ||||
| } | } | ||||
| /* Face Mask */ | /* Face Mask */ | ||||
| if (use_face_sel) { | if (use_face_sel) { | ||||
| struct GPUBatch *geom; | struct GPUBatch *geom; | ||||
| geom = DRW_cache_mesh_surface_edges_get(ob); | geom = DRW_cache_mesh_surface_edges_get(ob); | ||||
| DRW_shgroup_call(stl->g_data->lwire_select_shgrp, geom, ob); | DRW_shgroup_call(stl->g_data->lwire_select_shgrp, geom, ob); | ||||
| geom = DRW_cache_mesh_surface_get(ob); | geom = DRW_cache_mesh_surface_get(ob); | ||||
| DRW_shgroup_call(stl->g_data->face_select_shgrp, geom, ob); | DRW_shgroup_call(stl->g_data->face_select_shgrp, geom, ob); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* Optional: Post-cache_populate callback */ | |||||
| static void PAINT_TEXTURE_cache_finish(void *vedata) | |||||
| { | |||||
| PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; | |||||
| PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | |||||
| /* Do something here! dependent on the objects gathered */ | |||||
| UNUSED_VARS(psl); | |||||
| MEM_SAFE_FREE(stl->g_data->shgroup_image_array); | |||||
| } | |||||
| /* Draw time ! Control rendering pipeline from here */ | /* Draw time ! Control rendering pipeline from here */ | ||||
| static void PAINT_TEXTURE_draw_scene(void *vedata) | static void PAINT_TEXTURE_draw_scene(void *vedata) | ||||
| { | { | ||||
| PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; | PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; | ||||
| PAINT_TEXTURE_FramebufferList *fbl = ((PAINT_TEXTURE_Data *)vedata)->fbl; | |||||
| PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; | ||||
| /* Default framebuffer and texture */ | /* Default framebuffer and texture */ | ||||
jbakker: Remove comment | |||||
| DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); | if (psl->stencil_mask_overlay) { | ||||
| DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | DRW_draw_pass(psl->stencil_mask_overlay); | ||||
| } | |||||
| UNUSED_VARS(fbl, dfbl, dtxl); | |||||
| DRW_draw_pass(psl->image_faces); | |||||
| DRW_draw_pass(psl->face_select_overlay); | DRW_draw_pass(psl->face_select_overlay); | ||||
| DRW_view_set_active(stl->g_data->view_wires); | DRW_view_set_active(stl->g_data->view_wires); | ||||
| DRW_draw_pass(psl->wire_select_overlay); | DRW_draw_pass(psl->wire_select_overlay); | ||||
| DRW_view_set_active(NULL); | DRW_view_set_active(NULL); | ||||
| } | } | ||||
| Show All 19 Lines | DrawEngineType draw_engine_paint_texture_type = { | ||||
| NULL, | NULL, | ||||
| NULL, | NULL, | ||||
| N_("PaintTextureMode"), | N_("PaintTextureMode"), | ||||
| &PAINT_TEXTURE_data_size, | &PAINT_TEXTURE_data_size, | ||||
| &PAINT_TEXTURE_engine_init, | &PAINT_TEXTURE_engine_init, | ||||
| &PAINT_TEXTURE_engine_free, | &PAINT_TEXTURE_engine_free, | ||||
| &PAINT_TEXTURE_cache_init, | &PAINT_TEXTURE_cache_init, | ||||
| &PAINT_TEXTURE_cache_populate, | &PAINT_TEXTURE_cache_populate, | ||||
| &PAINT_TEXTURE_cache_finish, | NULL, | ||||
| NULL, /* draw_background but not needed by mode engines */ | NULL, /* draw_background but not needed by mode engines */ | ||||
| &PAINT_TEXTURE_draw_scene, | &PAINT_TEXTURE_draw_scene, | ||||
| NULL, | NULL, | ||||
| NULL, | NULL, | ||||
| }; | }; | ||||
Remove comment