Cleanup: replace attrib w/ attr
[blender.git] / source / blender / draw / intern / draw_cache_impl_curve.c
index 1d142053126722b01e1dbdc3814dd58a1c7f378c..742ca20ba83c9ac7a999ab0f05ad31ba3e99aeae 100644 (file)
@@ -35,7 +35,7 @@
 #include "DNA_curve_types.h"
 
 #include "BKE_curve.h"
-
+#include "BKE_displist.h"
 #include "BKE_font.h"
 
 #include "GPU_batch.h"
@@ -105,21 +105,22 @@ static void curve_render_wire_verts_edges_len_get(
        BLI_assert(r_vert_len || r_edge_len);
        int vert_len = 0;
        int edge_len = 0;
-       *r_curve_len = 0;
+       int curve_len = 0;
        for (const BevList *bl = ob_curve_cache->bev.first; bl; bl = bl->next) {
                if (bl->nr > 0) {
                        const bool is_cyclic = bl->poly != -1;
-                       /* Curve */
-                       *r_curve_len += 1;
-
-                       /* verts */
+                       edge_len += (is_cyclic) ? bl->nr : bl->nr - 1;
                        vert_len += bl->nr;
-
-                       /* edges */
-                       edge_len += bl->nr;
-                       if (!is_cyclic) {
-                               edge_len -= 1;
-                       }
+                       curve_len += 1;
+               }
+       }
+       for (const DispList *dl = ob_curve_cache->disp.first; dl; dl = dl->next) {
+               if (ELEM(dl->type, DL_SEGM, DL_POLY)) {
+                       BLI_assert(dl->parts == 1);
+                       const bool is_cyclic = dl->type == DL_POLY;
+                       edge_len += (is_cyclic) ? dl->nr : dl->nr - 1;
+                       vert_len += dl->nr;
+                       curve_len += 1;
                }
        }
        if (r_vert_len) {
@@ -128,6 +129,9 @@ static void curve_render_wire_verts_edges_len_get(
        if (r_edge_len) {
                *r_edge_len = edge_len;
        }
+       if (r_curve_len) {
+               *r_curve_len = curve_len;
+       }
 }
 
 static int curve_render_normal_len_get(const ListBase *lb, const CurveCache *ob_curve_cache)
@@ -300,16 +304,16 @@ static int curve_render_data_normal_len_get(const CurveRenderData *rdata)
 
 static void curve_cd_calc_used_gpu_layers(int *cd_layers, struct GPUMaterial **gpumat_array, int gpumat_array_len)
 {
-       GPUVertexAttribs gattribs = {{{0}}};
+       GPUVertAttrLayers gpu_attrs = {{{0}}};
        for (int i = 0; i < gpumat_array_len; i++) {
                struct GPUMaterial *gpumat = gpumat_array[i];
                if (gpumat == NULL) {
                        continue;
                }
-               GPU_material_vertex_attributes(gpumat, &gattribs);
-               for (int j = 0; j < gattribs.totlayer; j++) {
-                       const char *name = gattribs.layer[j].name;
-                       int type = gattribs.layer[j].type;
+               GPU_material_vertex_attrs(gpumat, &gpu_attrs);
+               for (int j = 0; j < gpu_attrs.totlayer; j++) {
+                       const char *name = gpu_attrs.layer[j].name;
+                       int type = gpu_attrs.layer[j].type;
 
                        /* Curves cannot have named layers.
                         * Note: We could relax this assumption later. */
@@ -345,7 +349,6 @@ static void curve_cd_calc_used_gpu_layers(int *cd_layers, struct GPUMaterial **g
 
 typedef struct CurveBatchCache {
        struct {
-               /* Split by normals if necessary. */
                GPUVertBuf *pos_nor;
                GPUVertBuf *curves_pos;
        } ordered;
@@ -541,7 +544,6 @@ void DRW_curve_batch_cache_free(Curve *cu)
 }
 
 /* -------------------------------------------------------------------- */
-
 /** \name Private Curve Cache API
  * \{ */
 
@@ -570,6 +572,13 @@ static void curve_create_curves_pos(CurveRenderData *rdata, GPUVertBuf *vbo_curv
                        GPU_vertbuf_attr_set(vbo_curves_pos, attr_id.pos, v_idx, bevp->vec);
                }
        }
+       for (const DispList *dl = rdata->ob_curve_cache->disp.first; dl; dl = dl->next) {
+               if (ELEM(dl->type, DL_SEGM, DL_POLY)) {
+                       for (int i = 0; i < dl->nr; v_idx++, i++) {
+                               GPU_vertbuf_attr_set(vbo_curves_pos, attr_id.pos, v_idx, &((float(*)[3])dl->verts)[i]);
+                       }
+               }
+       }
        BLI_assert(v_idx == vert_len);
 }
 
@@ -601,7 +610,19 @@ static void curve_create_curves_lines(CurveRenderData *rdata, GPUIndexBuf *ibo_c
                GPU_indexbuf_add_primitive_restart(&elb);
                v_idx += bl->nr;
        }
-
+       for (const DispList *dl = rdata->ob_curve_cache->disp.first; dl; dl = dl->next) {
+               if (ELEM(dl->type, DL_SEGM, DL_POLY)) {
+                       const bool is_cyclic = dl->type == DL_POLY;
+                       if (is_cyclic) {
+                               GPU_indexbuf_add_generic_vert(&elb, v_idx + (dl->nr - 1));
+                       }
+                       for (int i = 0; i < dl->nr; i++) {
+                               GPU_indexbuf_add_generic_vert(&elb, v_idx + i);
+                       }
+                       GPU_indexbuf_add_primitive_restart(&elb);
+                       v_idx += dl->nr;
+               }
+       }
        GPU_indexbuf_build_in_place(&elb, ibo_curve_lines);
 }
 
@@ -641,7 +662,7 @@ static void curve_create_edit_curves_nor(CurveRenderData *rdata, GPUVertBuf *vbo
                        GPUPackedNormal pnor = GPU_normal_convert_i10_v3(nor);
                        GPUPackedNormal ptan = GPU_normal_convert_i10_v3(bevp->dir);
 
-                       /* Only set attribs for one vertex. */
+                       /* Only set attributes for one vertex. */
                        GPU_vertbuf_attr_set(vbo_curves_nor, attr_id.pos, vbo_len_used, bevp->vec);
                        GPU_vertbuf_attr_set(vbo_curves_nor, attr_id.rad, vbo_len_used, &bevp->radius);
                        GPU_vertbuf_attr_set(vbo_curves_nor, attr_id.nor, vbo_len_used, &pnor);
@@ -728,8 +749,8 @@ static void curve_create_edit_data_and_handles(
                                        GPU_indexbuf_add_point_vert(elbp_verts, vbo_len_used + 1);
                                }
                                if (elbp_lines) {
-                                       GPU_indexbuf_add_line_verts(elbp_lines, vbo_len_used + 0, vbo_len_used + 1);
-                                       GPU_indexbuf_add_line_verts(elbp_lines, vbo_len_used + 0, vbo_len_used + 2);
+                                       GPU_indexbuf_add_line_verts(elbp_lines, vbo_len_used + 1, vbo_len_used + 0);
+                                       GPU_indexbuf_add_line_verts(elbp_lines, vbo_len_used + 1, vbo_len_used + 2);
                                }
                                if (vbo_data) {
                                        char vflag[3] = {
@@ -803,7 +824,6 @@ static void curve_create_edit_data_and_handles(
 /** \} */
 
 /* -------------------------------------------------------------------- */
-
 /** \name Public Object/Curve API
  * \{ */
 
@@ -874,10 +894,10 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
 {
        BLI_assert(ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT));
 
-       Curve *me = (Curve *)ob->data;
-       CurveBatchCache *cache = curve_batch_cache_get(me);
+       Curve *cu = ob->data;
+       CurveBatchCache *cache = curve_batch_cache_get(cu);
 
-       /* Verify that all surface batches have needed attrib layers. */
+       /* Verify that all surface batches have needed attribute layers. */
        /* TODO(fclem): We could be a bit smarter here and only do it per material. */
        for (int i = 0; i < cache->mat_len; ++i) {
                if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) {
@@ -887,7 +907,10 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
                        memset(cache->surf_per_mat[i], 0, sizeof(*cache->surf_per_mat[i]));
                }
        }
-       cache->cd_used = cache->cd_needed;
+       if ((cache->cd_used & cache->cd_needed) != cache->cd_needed) {
+               cache->cd_used |= cache->cd_needed;
+               cache->cd_needed = 0;
+       }
 
        /* Init batches and request VBOs & IBOs */
        if (DRW_batch_requested(cache->batch.surfaces, GPU_PRIM_TRIS)) {
@@ -954,7 +977,7 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
                DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->surf_per_mat_tris[i], CU_DATATYPE_SURFACE);
        }
 
-       CurveRenderData *rdata = curve_render_data_create(me, ob->runtime.curve_cache, mr_flag);
+       CurveRenderData *rdata = curve_render_data_create(cu, ob->runtime.curve_cache, mr_flag);
 
        /* DispLists */
        ListBase *lb = &rdata->ob_curve_cache->disp;
@@ -968,7 +991,7 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
        }
 
        if (DRW_vbo_requested(cache->tess.pos_nor) ||
-               DRW_vbo_requested(cache->tess.uv))
+           DRW_vbo_requested(cache->tess.uv))
        {
                DRW_displist_vertbuf_create_pos_and_nor_and_uv_tess(lb, cache->tess.pos_nor, cache->tess.uv);
        }
@@ -999,17 +1022,14 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
                curve_create_edit_curves_nor(rdata, cache->edit.curves_nor);
        }
 
+       curve_render_data_free(rdata);
+
 #ifdef DEBUG
        /* Make sure all requested batches have been setup. */
        for (int i = 0; i < sizeof(cache->batch) / sizeof(void *); ++i) {
-               GPUBatch **batch = (GPUBatch **)&cache->batch;
-               if (batch[i] != NULL) {
-                       BLI_assert(batch[i]->verts[0] != NULL);
-               }
+               BLI_assert(!DRW_batch_requested(((GPUBatch **)&cache->batch)[i], 0));
        }
 #endif
-
-       curve_render_data_free(rdata);
 }
 
 /** \} */