[Bf-blender-cvs] [cadd0dacf08] temp-lineart-contained: Merge remote-tracking branch 'origin/master' into temp-lineart-contained

YimingWu noreply at git.blender.org
Sat May 22 13:54:22 CEST 2021


Commit: cadd0dacf083943c657df2d927b2b531dd5a8c57
Author: YimingWu
Date:   Sat May 22 19:23:11 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBcadd0dacf083943c657df2d927b2b531dd5a8c57

Merge remote-tracking branch 'origin/master' into temp-lineart-contained

===================================================================



===================================================================

diff --cc source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index ab3affb595c,52f7d3652a7..d0c64928830
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@@ -320,36 -314,6 +320,36 @@@ BLI_INLINE bool lineart_occlusion_is_ad
            (v2->base.flag && v2->intersecting_with == rt));
  }
  
 +static void lineart_bounding_area_triangle_add(LineartRenderBuffer *rb,
 +                                               LineartBoundingArea *ba,
 +                                               LineartTriangle *rt)
 +{
 +  if (ba->triangle_count >= ba->max_triangle_count) {
-     LineartTriangle **new_array = lineart_mem_aquire(
++    LineartTriangle **new_array = lineart_mem_acquire(
 +        &rb->render_data_pool, sizeof(LineartTriangle *) * ba->max_triangle_count * 2);
 +    memcpy(new_array, ba->linked_triangles, sizeof(LineartTriangle *) * ba->max_triangle_count);
 +    ba->max_triangle_count *= 2;
 +    ba->linked_triangles = new_array;
 +  }
 +  ba->linked_triangles[ba->triangle_count] = rt;
 +  ba->triangle_count++;
 +}
 +
 +static void lineart_bounding_area_line_add(LineartRenderBuffer *rb,
 +                                           LineartBoundingArea *ba,
 +                                           LineartEdge *rl)
 +{
 +  if (ba->line_count >= ba->max_line_count) {
-     LineartEdge **new_array = lineart_mem_aquire(&rb->render_data_pool,
-                                                  sizeof(LineartEdge *) * ba->max_line_count * 2);
++    LineartEdge **new_array = lineart_mem_acquire(&rb->render_data_pool,
++                                                  sizeof(LineartEdge *) * ba->max_line_count * 2);
 +    memcpy(new_array, ba->linked_lines, sizeof(LineartEdge *) * ba->max_line_count);
 +    ba->max_line_count *= 2;
 +    ba->linked_lines = new_array;
 +  }
 +  ba->linked_lines[ba->line_count] = rl;
 +  ba->line_count++;
 +}
 +
  static void lineart_occlusion_single_line(LineartRenderBuffer *rb, LineartEdge *e, int thread_id)
  {
    double x = e->v1->fbcoord[0], y = e->v1->fbcoord[1];
@@@ -1671,204 -1484,209 +1671,204 @@@ static void lineart_geometry_object_loa
    LineartElementLinkNode *reln;
    LineartVert *orv;
    LineartEdge *o_la_e;
 +  LineartLineSegment *o_la_s;
    LineartTriangle *ort;
    Object *orig_ob;
 -  int CanFindFreestyle = 0;
 -  int i, global_i = (*global_vindex);
 -  Mesh *use_mesh;
 +  bool can_find_freestyle_edge = false;
 +  bool can_find_freestyle_face = false;
 +  int i;
    float use_crease = 0;
  
 -  int usage = override_usage ? override_usage : ob->lineart.usage;
 -
 -#define LRT_MESH_FINISH \
 -  BM_mesh_free(bm); \
 -  if (ob->type != OB_MESH) { \
 -    BKE_mesh_free(use_mesh); \
 -    MEM_freeN(use_mesh); \
 -  }
 -
 -  if (usage == OBJECT_LRT_EXCLUDE) {
 -    return;
 -  }
 -
 -  if (ELEM(ob->type, OB_MESH, OB_MBALL, OB_CURVE, OB_SURF, OB_FONT)) {
 +  int usage = obi->override_usage;
  
 -    if (ob->type == OB_MESH) {
 -      use_mesh = DEG_get_evaluated_object(dg, ob)->data;
 -    }
 -    else {
 -      use_mesh = BKE_mesh_new_from_object(NULL, ob, false, false);
 -    }
 -
 -    /* In case we can not get any mesh geometry data from the object */
 -    if (!use_mesh) {
 -      return;
 -    }
 +  bm = obi->original_bm;
  
 -    /* First we need to prepare the matrix used for transforming this specific object.  */
 -    mul_m4db_m4db_m4fl_uniq(new_mvp, mvp_mat, ob->obmat);
 -    mul_m4db_m4db_m4fl_uniq(new_mv, mv_mat, ob->obmat);
 +  if (rb->remove_doubles) {
 +    BMEditMesh *em = BKE_editmesh_create(bm, false);
 +    BMOperator findop, weldop;
  
 -    invert_m4_m4(imat, ob->obmat);
 -    transpose_m4(imat);
 -    copy_m4d_m4(normal, imat);
 +    /* See bmesh_opdefines.c and bmesh_operators.c for op names and argument formatting. */
 +    BMO_op_initf(bm, &findop, BMO_FLAG_DEFAULTS, "find_doubles verts=%av dist=%f", 0.0001);
  
 -    if (use_mesh->edit_mesh) {
 -      /* Do not use edit_mesh directly because we will modify it, so create a copy. */
 -      bm = BM_mesh_copy(use_mesh->edit_mesh->bm);
 -    }
 -    else {
 -      const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(((Mesh *)(use_mesh)));
 -      bm = BM_mesh_create(&allocsize,
 -                          &((struct BMeshCreateParams){
 -                              .use_toolflags = true,
 -                          }));
 -      BM_mesh_bm_from_me(bm,
 -                         use_mesh,
 -                         &((struct BMeshFromMeshParams){
 -                             .calc_face_normal = true,
 -                         }));
 -    }
 +    BMO_op_exec(bm, &findop);
  
 -    if (rb->remove_doubles) {
 -      BMEditMesh *em = BKE_editmesh_create(bm, false);
 -      BMOperator findop, weldop;
 +    /* Weld the vertices. */
 +    BMO_op_init(bm, &weldop, BMO_FLAG_DEFAULTS, "weld_verts");
 +    BMO_slot_copy(&findop, slots_out, "targetmap.out", &weldop, slots_in, "targetmap");
 +    BMO_op_exec(bm, &weldop);
  
 -      /* See bmesh_opdefines.c and bmesh_operators.c for op names and argument formatting. */
 -      BMO_op_initf(bm, &findop, BMO_FLAG_DEFAULTS, "find_doubles verts=%av dist=%f", 0.0001);
 +    BMO_op_finish(bm, &findop);
 +    BMO_op_finish(bm, &weldop);
  
 -      BMO_op_exec(bm, &findop);
 -
 -      /* Weld the vertices. */
 -      BMO_op_init(bm, &weldop, BMO_FLAG_DEFAULTS, "weld_verts");
 -      BMO_slot_copy(&findop, slots_out, "targetmap.out", &weldop, slots_in, "targetmap");
 -      BMO_op_exec(bm, &weldop);
 -
 -      BMO_op_finish(bm, &findop);
 -      BMO_op_finish(bm, &weldop);
 -
 -      MEM_freeN(em);
 -    }
 -
 -    BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE, BM_ELEM_TAG, false);
 -    BM_mesh_triangulate(
 -        bm, MOD_TRIANGULATE_QUAD_FIXED, MOD_TRIANGULATE_NGON_BEAUTY, 4, false, NULL, NULL, NULL);
 -    BM_mesh_normals_update(bm);
 -    BM_mesh_elem_table_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
 -    BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
 -
 -    if (CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) {
 -      CanFindFreestyle = 1;
 -    }
 -
 -    /* Only allocate memory for verts and tris as we don't know how many lines we will generate
 -     * yet. */
 -    orv = lineart_mem_acquire(&rb->render_data_pool, sizeof(LineartVert) * bm->totvert);
 -    ort = lineart_mem_acquire(&rb->render_data_pool, bm->totface * rb->triangle_size);
 -
 -    orig_ob = ob->id.orig_id ? (Object *)ob->id.orig_id : ob;
 -
 -    reln = lineart_list_append_pointer_pool_sized(
 -        &rb->vertex_buffer_pointers, &rb->render_data_pool, orv, sizeof(LineartElementLinkNode));
 -    reln->element_count = bm->totvert;
 -    reln->object_ref = orig_ob;
 +    MEM_freeN(em);
 +  }
  
 -    if (ob->lineart.flags & OBJECT_LRT_OWN_CREASE) {
 -      use_crease = cosf(M_PI - ob->lineart.crease_threshold);
 -    }
 -    else {
 -      use_crease = rb->crease_threshold;
 -    }
 +  BM_mesh_elem_hflag_disable_all(bm, BM_FACE | BM_EDGE, BM_ELEM_TAG, false);
 +  BM_mesh_triangulate(
 +      bm, MOD_TRIANGULATE_QUAD_FIXED, MOD_TRIANGULATE_NGON_BEAUTY, 4, false, NULL, NULL, NULL);
 +  BM_mesh_normals_update(bm);
 +  BM_mesh_elem_table_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
 +  BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
  
 -    /* FIXME(Yiming): Hack for getting clean 3D text, the seam that extruded text object creates
 -     * erroneous detection on creases. Future configuration should allow options. */
 -    if (ob->type == OB_FONT) {
 -      reln->flags |= LRT_ELEMENT_BORDER_ONLY;
 -    }
 +  if (CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) {
 +    can_find_freestyle_edge = true;
 +  }
 +  if (CustomData_has_layer(&bm->pdata, CD_FREESTYLE_FACE)) {
 +    can_find_freestyle_face = true;
 +  }
  
 -    reln = lineart_list_append_pointer_pool_sized(
 -        &rb->triangle_buffer_pointers, &rb->render_data_pool, ort, sizeof(LineartElementLinkNode));
 -    reln->element_count = bm->totface;
 -    reln->object_ref = orig_ob;
 -    reln->flags |= (usage == OBJECT_LRT_NO_INTERSECTION ? LRT_ELEMENT_NO_INTERSECTION : 0);
 +  /* Only allocate memory for verts and tris as we don't know how many lines we will generate
 +   * yet. */
-   orv = lineart_mem_aquire_thread(&rb->render_data_pool, sizeof(LineartVert) * bm->totvert);
-   ort = lineart_mem_aquire_thread(&rb->render_data_pool, bm->totface * rb->triangle_size);
++  orv = lineart_mem_acquire_thread(&rb->render_data_pool, sizeof(LineartVert) * bm->totvert);
++  ort = lineart_mem_acquire_thread(&rb->render_data_pool, bm->totface * rb->triangle_size);
  
 -    /* Note this memory is not from pool, will be deleted after culling. */
 -    orta = MEM_callocN(sizeof(LineartTriangleAdjacent) * bm->totface, "LineartTriangleAdjacent");
 -    /* Link is minimal so we use pool anyway. */
 -    lineart_list_append_pointer_pool(&rb->triangle_adjacent_pointers, &rb->render_data_pool, orta);
 +  orig_ob = obi->original_ob;
  
 -    for (i = 0; i < bm->totvert; i++) {
 -      v = BM_vert_at_index(bm, i);
 -      lineart_vert_transform(v, i, orv, new_mv, new_mvp);
 -      orv[i].index = i + global_i;
 -    }
 -    /* Register a global index increment. See #lineart_triangle_share_edge() and
 -     * #lineart_main_load_geometries() for detailed. It's okay that global_vindex might eventually
 -     * overflow, in such large scene it's virtually impossible for two vertex of the same numeric
 -     * index to come close together. */
 -    (*global_vindex) += bm->totvert;
 -
 -    rt = ort;
 -    for (i = 0; i < bm->totface; i++) {
 -      f = BM_face_at_index(bm, i);
 +  BLI_spin_lock(&rb->lock_task);
 +  reln = lineart_list_append_pointer_pool_sized_thread(
 +      &rb->vertex_buffer_pointers, &rb->render_data_pool, orv, sizeof(LineartElementLinkNode));
 +  BLI_spin_unlock(&rb->lock_task);
  
 -      loop = f->l_first;
 -      rt->v[0] = &orv[BM_elem_index_get(loop->v)];
 -      loop = loop->next;
 -      rt->v[1] = &orv[BM_elem_index_get(loop->v)];
 -      loop = loop->next;
 -      rt->v[2] = &orv[BM_elem_index_get(loop->v)];
 +  reln->element_count = bm->totvert;
 +  reln->object_ref = orig_ob;
 +  obi->v_reln = reln;
  
 -      /* Transparency b

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list