[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