[Bf-blender-cvs] [2c1ecc6aa65] temp-lineart-embree: LineArt: embree mesh index aligning fix wip
YimingWu
noreply at git.blender.org
Fri Mar 18 07:35:33 CET 2022
Commit: 2c1ecc6aa65acd59aba42409ef8e6c09cea5a6ab
Author: YimingWu
Date: Thu Mar 17 14:08:08 2022 +0800
Branches: temp-lineart-embree
https://developer.blender.org/rB2c1ecc6aa65acd59aba42409ef8e6c09cea5a6ab
LineArt: embree mesh index aligning fix wip
===================================================================
M release/datafiles/locale
M release/scripts/addons
M source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M source/tools
===================================================================
diff --git a/release/datafiles/locale b/release/datafiles/locale
index 2a5095eed30..c2bbd079d7d 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit 2a5095eed3028e91624d27ca93e4c65f572b809d
+Subproject commit c2bbd079d7da9cb87de52122411709405b3f09d9
diff --git a/release/scripts/addons b/release/scripts/addons
index bb62f10715a..7cdde96d329 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit bb62f10715a871d7069d2b2c74b2efc97c3c350c
+Subproject commit 7cdde96d329d6221090d1f23ea70a7b90c2b9739
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 61836c00017..e018701b780 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -208,12 +208,14 @@ enum eLineArtTileRecursiveLimit {
struct MLoopTri;
struct MLoop;
+struct LineartRenderBuffer;
typedef struct LineartPointArrayFinal {
float *points;
int numpoints;
struct MLoopTri *looptri; /* Refernce to original_me->runtime->looptri; */
struct MLoop *loop; /* Refernce to original_me->mloop; */
LineartElementLinkNode *eln_triangle;
+ struct LineartRenderBuffer *rb;
} LineartPointArrayFinal;
typedef struct LineartMeshRecord {
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 3f262732138..ad6002286ba 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -58,6 +58,8 @@ static void lineart_bounding_area_link_edge(LineartRenderBuffer *rb,
LineartBoundingArea *root_ba,
LineartEdge *e);
+static bool lineart_triangle_share_edge(const LineartTriangle *l, const LineartTriangle *r);
+
static LineartBoundingArea *lineart_bounding_area_next(LineartBoundingArea *this,
LineartEdge *e,
double x,
@@ -1910,6 +1912,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
#ifdef LINEART_USE_EMBREE
RTCGeometry geom = rtcGetGeometry(rb->rtcscene_geom, obi->embree_geom_id);
+ rtcSetGeometryUserPrimitiveCount(geom, eln->element_count);
rb->mesh_record.array[obi->embree_geom_id].eln_triangle = eln;
#endif
@@ -2268,9 +2271,16 @@ static void lineart_embree_init_mesh_record(LineartRenderBuffer *rb)
static void lineart_embree_mesh_bounds_func(const struct RTCBoundsFunctionArguments *args)
{
LineartPointArrayFinal *rec = args->geometryUserPtr;
- float *p0 = &rec->points[rec->loop[rec->looptri[args->primID].tri[0]].v * 3];
- float *p1 = &rec->points[rec->loop[rec->looptri[args->primID].tri[1]].v * 3];
- float *p2 = &rec->points[rec->loop[rec->looptri[args->primID].tri[2]].v * 3];
+ LineartTriangle *tri = rec->eln_triangle->pointer;
+ LineartTriangle *prim_triangle = (void *)(((uchar *)tri) +
+ rec->rb->triangle_size * args->primID);
+ /* Just change from here and see if it helps any. */
+ double *p0 = prim_triangle->v[0]->gloc;
+ double *p1 = prim_triangle->v[1]->gloc;
+ double *p2 = prim_triangle->v[2]->gloc;
+ // float *p0 = &rec->points[rec->loop[rec->looptri[args->primID].tri[0]].v * 3];
+ // float *p1 = &rec->points[rec->loop[rec->looptri[args->primID].tri[1]].v * 3];
+ // float *p2 = &rec->points[rec->loop[rec->looptri[args->primID].tri[2]].v * 3];
struct RTCBounds *o = args->bounds_o;
o->lower_x = MIN3(p0[0], p1[0], p2[0]);
o->upper_x = MAX3(p0[0], p1[0], p2[0]);
@@ -2321,6 +2331,7 @@ static void lineart_embree_transform_point_array(LineartRenderBuffer *rb,
* array index for convenience of lookup. */
LineartPointArrayFinal *rec = &rb->mesh_record.array[geom_id];
rb->mesh_record.next = geom_id + 1;
+ rec->rb = rb;
if (!me->runtime.looptris.array) {
BKE_mesh_runtime_looptri_recalc(me);
@@ -2335,7 +2346,7 @@ static void lineart_embree_transform_point_array(LineartRenderBuffer *rb,
}
/* Only user typed geometry supports rtcCollide(). */
- rtcSetGeometryUserPrimitiveCount(geom, me->runtime.looptris.len);
+ // rtcSetGeometryUserPrimitiveCount(geom, me->runtime.looptris.len);
/* Reduce the geom user count to 1, and when scene is destroyed the geom is destroyed
* automatically. */
rtcReleaseGeometry(geom);
@@ -2626,20 +2637,22 @@ IntersectionCollideFunc(void *userPtr,
}
LineartPointArrayFinal *geoma = &rb->mesh_record.array[collisions[i].geomID0];
LineartPointArrayFinal *geomb = &rb->mesh_record.array[collisions[i].geomID1];
- float *pa = geoma->points;
- float *pb = geomb->points;
- uint32_t *ta = geoma->looptri[collisions[i].primID0].tri;
- uint32_t *tb = geomb->looptri[collisions[i].primID1].tri;
+ float pa0[3], pa1[3], pa2[3], pb0[3], pb1[3], pb2[3];
+ LineartTriangle *tap = geoma->eln_triangle->pointer;
+ LineartTriangle *tbp = geomb->eln_triangle->pointer;
+ LineartTriangle *ta = (void *)(((uchar *)tap) + rb->triangle_size * collisions[i].primID0);
+ LineartTriangle *tb = (void *)(((uchar *)tbp) + rb->triangle_size * collisions[i].primID1);
+ if (lineart_triangle_share_edge(ta, tb)) {
+ continue;
+ }
+ copy_v3fl_v3db(pa0, ta->v[0]->gloc);
+ copy_v3fl_v3db(pa1, ta->v[1]->gloc);
+ copy_v3fl_v3db(pa2, ta->v[2]->gloc);
+ copy_v3fl_v3db(pb0, tb->v[0]->gloc);
+ copy_v3fl_v3db(pb1, tb->v[1]->gloc);
+ copy_v3fl_v3db(pb2, tb->v[2]->gloc);
float i1[3], i2[3];
- if (lineart_isect_tri_tri_v3_check_overlap(&pa[geoma->loop[ta[0]].v * 3],
- &pa[geoma->loop[ta[1]].v * 3],
- &pa[geoma->loop[ta[2]].v * 3],
- &pb[geomb->loop[tb[0]].v * 3],
- &pb[geomb->loop[tb[1]].v * 3],
- &pb[geomb->loop[tb[2]].v * 3],
- i1,
- i2)) {
-
+ if (lineart_isect_tri_tri_v3_check_overlap(pa0, pa1, pa2, pb0, pb1, pb2, i1, i2)) {
lineart_add_intersection_record_thread(rb, i1, i2);
}
}
@@ -2674,25 +2687,22 @@ OcclusionCollideFunc(void *userPtr, struct RTCCollision *collisions, unsigned in
LineartTriangle *tri = eln_triangle->pointer;
LineartTriangle *prim_triangle = (void *)(((uchar *)tri) +
rb->triangle_size * collisions[i].primID1);
- LineartPointArrayFinal *geom_triangle = &rb->mesh_record.array[collisions[i].geomID1];
+ // LineartPointArrayFinal *geom_triangle = &rb->mesh_record.array[collisions[i].geomID1];
- float pa[9];
- float *pb = geom_triangle->points;
+ float pa[9], pb[9];
+ // float *pb = geom_triangle->points;
copy_v3fl_v3db(&pa[0], prim_edge->v1->gloc);
copy_v3fl_v3db(&pa[3], prim_edge->v2->gloc);
copy_v3fl_v3db(&pa[6], eln_edge->cam_pos);
+ copy_v3fl_v3db(&pb[0], prim_triangle->v[0]->gloc);
+ copy_v3fl_v3db(&pb[3], prim_triangle->v[1]->gloc);
+ copy_v3fl_v3db(&pb[6], prim_triangle->v[2]->gloc);
- uint32_t *tb = geom_triangle->looptri[collisions[i].primID1].tri;
+ // uint32_t *tb = geom_triangle->looptri[collisions[i].primID1].tri;
float i1[3], i2[3];
- if (lineart_isect_tri_tri_v3_check_overlap(&pa[0],
- &pa[3],
- &pa[6],
- &pb[geom_triangle->loop[tb[0]].v * 3],
- &pb[geom_triangle->loop[tb[1]].v * 3],
- &pb[geom_triangle->loop[tb[2]].v * 3],
- i1,
- i2)) {
+ if (lineart_isect_tri_tri_v3_check_overlap(
+ &pa[0], &pa[3], &pa[6], &pb[0], &pb[3], &pb[6], i1, i2)) {
lineart_add_occlusion_pair_thread(rb, eln_edge, eln_triangle, prim_edge, prim_triangle);
}
}
@@ -2749,8 +2759,8 @@ static void lineart_embree_do_intersections(LineartRenderBuffer *rb)
rtcCommitGeometry(geom);
}
rtcCommitScene(rb->rtcscene_geom);
- rtcCollide(rb->rtcscene_geom, rb->rtcscene_geom, IntersectionCollideFunc, rb);
- lineart_intersection_lines_from_record(rb);
+ // rtcCollide(rb->rtcscene_geom, rb->rtcscene_geom, IntersectionCollideFunc, rb);
+ // lineart_intersection_lines_from_record(rb);
}
/**
diff --git a/source/tools b/source/tools
index 7fd2ed908b4..91c5bc34c0a 160000
--- a/source/tools
+++ b/source/tools
@@ -1 +1 @@
-Subproject commit 7fd2ed908b4f50140670caf6786e5ed245b79137
+Subproject commit 91c5bc34c0a49f89f19e1c656c195968617cff61
More information about the Bf-blender-cvs
mailing list