Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/draw/intern/draw_cache_impl.h5
-rw-r--r--source/blender/draw/intern/draw_cache_impl_mesh.c66
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c26
-rw-r--r--source/blender/gpu/GPU_shader.h1
-rw-r--r--source/blender/gpu/intern/gpu_shader.c6
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_vert.glsl5
6 files changed, 41 insertions, 68 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index 9f4162195bf..63af602873d 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -139,12 +139,11 @@ struct GPUBatch *DRW_mesh_batch_cache_get_edituv_faces(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_edituv_edges(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_edituv_verts(struct Mesh *me);
struct GPUBatch *DRW_mesh_batch_cache_get_edituv_facedots(struct Mesh *me);
+/* For Image UV editor. */
+struct GPUBatch *DRW_mesh_batch_cache_get_uv_edges(struct Mesh *me);
void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me);
-/* For Image UV editor. */
-struct GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(struct Mesh *me);
-
/* Edit mesh bitflags (is this the right place?) */
enum {
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index 0bac64df567..92131a2e74c 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -2100,15 +2100,13 @@ typedef struct MeshBatchCache {
GPUBatch *loose_edges;
GPUBatch *edge_detection;
GPUBatch *wire_loops; /* Loops around faces. */
+ GPUBatch *wire_loops_uvs; /* Same as wire_loops but only has uvs. */
GPUBatch *wire_triangles; /* Triangles for object mode wireframe. */
} batch;
GPUIndexBuf **surf_per_mat_tris;
GPUBatch **surf_per_mat;
- /* OLD BATCH METHOD, thoses needs to be ported and added in the structs above. */
- GPUBatch *texpaint_uv_loops;
-
/* arrays of bool uniform names (and value) that will be use to
* set srgb conversion for auto attribs.*/
char *auto_layer_names;
@@ -2272,10 +2270,6 @@ static void mesh_batch_cache_discard_uvedit(MeshBatchCache *cache)
GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_edges);
GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_verts);
GPU_BATCH_DISCARD_SAFE(cache->batch.edituv_facedots);
-
- gpu_batch_presets_unregister(cache->texpaint_uv_loops);
-
- GPU_BATCH_DISCARD_SAFE(cache->texpaint_uv_loops);
}
void DRW_mesh_batch_cache_dirty_tag(Mesh *me, int mode)
@@ -4667,56 +4661,11 @@ GPUBatch *DRW_mesh_batch_cache_get_edituv_facedots(Mesh *me)
return DRW_batch_request(&cache->batch.edituv_facedots);
}
-/* TODO port to batch request. Is basically batch.wire_loops. */
-GPUBatch *DRW_mesh_batch_cache_get_texpaint_loop_wire(Mesh *me)
+GPUBatch *DRW_mesh_batch_cache_get_uv_edges(Mesh *me)
{
MeshBatchCache *cache = mesh_batch_cache_get(me);
-
- if (cache->texpaint_uv_loops == NULL) {
- /* create batch from DM */
- const int datatype = MR_DATATYPE_LOOP | MR_DATATYPE_POLY | MR_DATATYPE_LOOPUV;
- MeshRenderData *rdata = mesh_render_data_create(me, datatype);
-
- const MLoopUV *mloopuv_base = rdata->mloopuv;
- if (mloopuv_base == NULL) {
- return NULL;
- }
-
- uint vidx = 0;
-
- static GPUVertFormat format = { 0 };
- static struct { uint uv; } attr_id;
- if (format.attr_len == 0) {
- attr_id.uv = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- }
-
- const uint vert_len = mesh_render_data_loops_len_get(rdata);
- const uint poly_len = mesh_render_data_polys_len_get(rdata);
- const uint idx_len = vert_len + poly_len;
-
- GPUIndexBufBuilder elb;
- GPU_indexbuf_init_ex(&elb, GPU_PRIM_LINE_LOOP, idx_len, vert_len, true);
-
- GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
- GPU_vertbuf_data_alloc(vbo, vert_len);
-
- const MPoly *mpoly = rdata->mpoly;
- for (int a = 0; a < poly_len; a++, mpoly++) {
- const MLoopUV *mloopuv = mloopuv_base + mpoly->loopstart;
- for (int b = 0; b < mpoly->totloop; b++, mloopuv++) {
- GPU_vertbuf_attr_set(vbo, attr_id.uv, vidx, mloopuv->uv);
- GPU_indexbuf_add_generic_vert(&elb, vidx++);
- }
- GPU_indexbuf_add_primitive_restart(&elb);
- }
-
- cache->texpaint_uv_loops = GPU_batch_create_ex(GPU_PRIM_LINE_LOOP,
- vbo, GPU_indexbuf_build(&elb),
- GPU_BATCH_OWNS_VBO | GPU_BATCH_OWNS_INDEX);
- gpu_batch_presets_register(cache->texpaint_uv_loops);
- mesh_render_data_free(rdata);
- }
- return cache->texpaint_uv_loops;
+ texpaint_request_active_uv(cache, me);
+ return DRW_batch_request(&cache->batch.wire_loops_uvs);
}
GPUBatch *DRW_mesh_batch_cache_get_surface_edges(Mesh *me)
@@ -5154,6 +5103,13 @@ void DRW_mesh_batch_cache_create_requested(
DRW_ibo_request(cache->batch.wire_loops, &cache->ibo.loops_lines);
DRW_vbo_request(cache->batch.wire_loops, &cache->ordered.loop_pos_nor);
}
+ if (DRW_batch_requested(cache->batch.wire_loops_uvs, GPU_PRIM_LINE_STRIP)) {
+ DRW_ibo_request(cache->batch.wire_loops_uvs, &cache->ibo.loops_lines);
+ /* For paint overlay. Active layer should have been queried. */
+ if (cache->cd_lused[CD_MLOOPUV] != 0) {
+ DRW_vbo_request(cache->batch.wire_loops_uvs, &cache->ordered.loop_uv_tan);
+ }
+ }
if (DRW_batch_requested(cache->batch.wire_triangles, GPU_PRIM_TRIS)) {
DRW_vbo_request(cache->batch.wire_triangles, &cache->tess.pos_nor);
DRW_vbo_request(cache->batch.wire_triangles, &cache->tess.wireframe_data);
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 46c62c4a086..356f24e0758 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -199,16 +199,15 @@ static void uvedit_get_batches(
static void draw_uvs_shadow(SpaceImage *UNUSED(sima), Scene *scene, Object *obedit, Depsgraph *depsgraph)
{
Object *eval_ob = DEG_get_evaluated_object(depsgraph, obedit);
+ Mesh *me = eval_ob->data;
float col[4];
UI_GetThemeColor4fv(TH_UV_SHADOW, col);
- /* TODO get real modified edges. */
- GPUBatch *edges = DRW_mesh_batch_cache_get_edituv_edges(eval_ob->data);
-
- DRW_mesh_batch_cache_create_requested(eval_ob, eval_ob->data, scene->toolsettings, false, false);
+ GPUBatch *edges = DRW_mesh_batch_cache_get_uv_edges(me);
+ DRW_mesh_batch_cache_create_requested(eval_ob, me, scene->toolsettings, false, false);
if (edges) {
- GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_UNIFORM_COLOR);
+ GPU_batch_program_set_builtin(edges, GPU_SHADER_2D_UV_UNIFORM_COLOR);
GPU_batch_uniform_4fv(edges, "color", col);
GPU_batch_draw(edges);
}
@@ -219,14 +218,17 @@ static void draw_uvs_texpaint(Scene *scene, Object *ob, Depsgraph *depsgraph)
Object *eval_ob = DEG_get_evaluated_object(depsgraph, ob);
Mesh *me = eval_ob->data;
ToolSettings *ts = scene->toolsettings;
- GPUBatch *geom = DRW_mesh_batch_cache_get_texpaint_loop_wire(me);
float col[4];
UI_GetThemeColor4fv(TH_UV_SHADOW, col);
- if (!geom)
+ if (me->mloopuv == NULL) {
return;
+ }
+
+ GPUBatch *geom = DRW_mesh_batch_cache_get_uv_edges(me);
+ DRW_mesh_batch_cache_create_requested(eval_ob, me, scene->toolsettings, false, false);
- GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_UNIFORM_COLOR);
+ GPU_batch_program_set_builtin(geom, GPU_SHADER_2D_UV_UNIFORM_COLOR);
GPU_batch_uniform_4fv(geom, "color", col);
const bool do_material_masking = (ts->uv_flag & UV_SHOW_SAME_IMAGE);
@@ -275,8 +277,12 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit, Depsgraph *
float col1[4], col2[4], col3[4], transparent[4] = {0.0f, 0.0f, 0.0f, 0.0f};
if (sima->flag & SI_DRAWSHADOW) {
- /* XXX TODO: Need to check if shadow mesh is different than original mesh. */
- bool is_cage_like_final_meshes = true;
+ bool is_cage_like_final_meshes = false;
+ Mesh *me = (Mesh *)eval_ob->data;
+ BMEditMesh *embm = me->edit_btmesh;
+ is_cage_like_final_meshes = embm &&
+ embm->mesh_eval_final &&
+ embm->mesh_eval_final->runtime.is_original;
/* When sync selection is enabled, all faces are drawn (except for hidden)
* so if cage is the same as the final, there is no point in drawing this. */
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 71536523caf..4803c6c0792 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -344,6 +344,7 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_2D_NODELINK,
GPU_SHADER_2D_NODELINK_INST,
/* specialized for edituv drawing */
+ GPU_SHADER_2D_UV_UNIFORM_COLOR,
GPU_SHADER_2D_UV_VERTS,
GPU_SHADER_2D_UV_FACEDOTS,
GPU_SHADER_2D_UV_EDGES,
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c
index 8a3581c54df..8a141eaa2b2 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.c
@@ -918,6 +918,9 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = {
{ datatoc_gpu_shader_2D_nodelink_vert_glsl,
datatoc_gpu_shader_2D_nodelink_frag_glsl },
+ [GPU_SHADER_2D_UV_UNIFORM_COLOR] =
+ { datatoc_gpu_shader_2D_vert_glsl,
+ datatoc_gpu_shader_uniform_color_frag_glsl },
[GPU_SHADER_2D_UV_VERTS] =
{ datatoc_gpu_shader_2D_edituvs_points_vert_glsl,
datatoc_gpu_shader_point_varying_color_varying_outline_aa_frag_glsl },
@@ -1007,6 +1010,9 @@ static const char *gpu_shader_get_builtin_shader_defines(
case GPU_SHADER_SIMPLE_LIGHTING_FLAT_COLOR:
return "#define USE_FLAT_NORMAL\n";
+ case GPU_SHADER_2D_UV_UNIFORM_COLOR:
+ return "#define UV_POS\n";
+
case GPU_SHADER_2D_UV_EDGES_SMOOTH:
return "#define SMOOTH_COLOR\n";
diff --git a/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl
index 89e3c52f9f8..b3b897da3c6 100644
--- a/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_2D_vert.glsl
@@ -1,7 +1,12 @@
uniform mat4 ModelViewProjectionMatrix;
+#ifdef UV_POS
+in vec2 u;
+# define pos u
+#else
in vec2 pos;
+#endif
void main()
{