Commit: fd49ce1d7b5866c498c1c9002ef98320d64d6907
Author: Yiming Wu
Date:   Sat Dec 29 21:31:32 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBfd49ce1d7b5866c498c1c9002ef98320d64d6907

Fixed hidden multi-thread error.

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

M       source/blender/draw/engines/lanpr/lanpr_ops.c

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c 
b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 840856502e8..08f50a89f14 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -58,11 +58,11 @@ int use_smooth_contour_modifier_contour = 0; // debug 
purpose
 /* ====================================== base structures 
=========================================== */
 
 #define TNS_BOUND_AREA_CROSSES(b1, b2) \
-       ((b1)[0] < (b2)[1] && (b1)[1] > (b2)[0] && (b1)[3] < (b2)[2] && (b1)[2] 
> (b2)[3])
+       ((b1)[0] <= (b2)[1] && (b1)[1] >= (b2)[0] && (b1)[3] <= (b2)[2] && 
(b1)[2] >= (b2)[3])
 
 void lanpr_make_initial_bounding_areas(LANPR_RenderBuffer *rb) {
-       int sp_w = 20;
-       int sp_h = rb->H / (rb->W / sp_w);
+       int sp_w = 4;//20;
+       int sp_h = 4;//rb->H / (rb->W / sp_w);
        int row, col;
        LANPR_BoundingArea *ba;
        real W = (real)rb->W;
@@ -80,7 +80,7 @@ void lanpr_make_initial_bounding_areas(LANPR_RenderBuffer 
*rb) {
 
        for (row = 0; row < sp_h; row++) {
                for (col = 0; col < sp_w; col++) {
-                       ba = &rb->InitialBoundingAreas[row * 20 + col];
+                       ba = &rb->InitialBoundingAreas[row * 4 + col];
 
                        ba->L = span_w * col - 1.0;
                        ba->R = (col == sp_w - 1) ? 1.0 : (span_w * (col + 1) - 
1.0);
@@ -91,16 +91,16 @@ void lanpr_make_initial_bounding_areas(LANPR_RenderBuffer 
*rb) {
                        ba->CY = (ba->U + ba->B) / 2;
 
                        if (row) {
-                               list_append_pointer_static(&ba->UP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[(row - 1) * 20 + col]);
+                               list_append_pointer_static(&ba->UP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[(row - 1) * 4 + col]);
                        }
                        if (col) {
-                               list_append_pointer_static(&ba->LP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[row * 20 + col - 1]);
+                               list_append_pointer_static(&ba->LP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[row * 4 + col - 1]);
                        }
                        if (row != sp_h - 1) {
-                               list_append_pointer_static(&ba->BP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[(row + 1) * 20 + col]);
+                               list_append_pointer_static(&ba->BP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[(row + 1) * 4 + col]);
                        }
                        if (col != sp_w - 1) {
-                               list_append_pointer_static(&ba->RP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[row * 20 + col + 1]);
+                               list_append_pointer_static(&ba->RP, 
&rb->RenderDataPool, &rb->InitialBoundingAreas[row * 4 + col + 1]);
                        }
                }
        }
@@ -395,7 +395,7 @@ LANPR_BoundingArea 
*lanpr_get_point_bounding_area(LANPR_RenderBuffer *rb, real x
        if (col < 0) col = 0;
        if (row < 0) row = 0;
 
-       return &rb->InitialBoundingAreas[row * 20 + col];
+       return &rb->InitialBoundingAreas[row * 4 + col];
 }
 void lanpr_add_triangles(LANPR_RenderBuffer *rb) {
        LANPR_RenderElementLinkNode *reln;
@@ -430,7 +430,7 @@ void lanpr_add_triangles(LANPR_RenderBuffer *rb) {
                        if (lanpr_get_triangle_bounding_areas(rb, rt, &y1, &y2, 
&x1, &x2)) {
                                for (co = x1; co <= x2; co++) {
                                        for (r = y1; r <= y2; r++) {
-                                               
lanpr_link_triangle_with_bounding_area(rb, &rb->InitialBoundingAreas[r * 20 + 
co], rt, 0, 1);
+                                               
lanpr_link_triangle_with_bounding_area(rb, &rb->InitialBoundingAreas[r * 4 + 
co], rt, 0, 1);
                                        }
                                }
                        }
@@ -578,7 +578,7 @@ LANPR_BoundingArea 
*lanpr_get_bounding_area(LANPR_RenderBuffer *rb, real x, real
        if (r >= rb->TileCountY) r = rb->TileCountY - 1;
        if (c >= rb->TileCountX) c = rb->TileCountX - 1;
 
-       iba = &rb->InitialBoundingAreas[r * 20 + c];
+       iba = &rb->InitialBoundingAreas[r * 4 + c];
        while (iba->Child) {
                if (x > iba->CX) {
                        if (y > iba->CY) iba = &iba->Child[0];
@@ -2115,7 +2115,7 @@ int 
lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl, LANPR_RenderTr
        tnsVector3d LV;
        tnsVector3d RV;
        tnsVector4d vd4;
-       real *CV = CameraDir;
+       real CV[3];
        real DotL, DotR, DotLA, DotRA;
        real DotF;
        LANPR_RenderVert *Result, *rv;
@@ -2145,13 +2145,9 @@ int 
lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl, LANPR_RenderTr
        if (lanpr_share_edge_direct(rt, rl))
                return 0;
 
-       // XXX: not using lock will cause very few random calculation error if 
running in multiple threads.
-       //      lanpr_LineIntersectTest2d() doesn't even write data
-       //BLI_spin_lock(spl);
        a = lanpr_LineIntersectTest2d(LFBC, RFBC, FBC0, FBC1, &is[0]);
        b = lanpr_LineIntersectTest2d(LFBC, RFBC, FBC1, FBC2, &is[1]);
        c = lanpr_LineIntersectTest2d(LFBC, RFBC, FBC2, FBC0, &is[2]);
-       //BLI_spin_unlock(spl);
 
        //printf("abc: %d %d %d\n", a,b,c);
 
@@ -2160,6 +2156,8 @@ int 
lanpr_triangle_line_imagespace_intersection_v2(SpinLock *spl, LANPR_RenderTr
        tMatVectorMinus3d(LV, rl->L->GLocation, rt->V[0]->GLocation);
        tMatVectorMinus3d(RV, rl->R->GLocation, rt->V[0]->GLocation);
 
+       tMatVectorCopy3d(CameraDir,CV);
+
        tMatVectorConvert4fd(cam->obmat[3], vd4);
        if (((Camera *)cam->data)->type == CAM_PERSP) tMatVectorMinus3d(CV, 
vd4, rt->V[0]->GLocation);
 
@@ -2497,11 +2495,13 @@ LANPR_RenderLine 
*lanpr_triangle_generate_intersection_line_only(LANPR_RenderBuf
        if (lanpr_get_line_bounding_areas(rb, Result, &r1, &r2, &c1, &c2)) {
                for (row = r1; row != r2 + 1; row++) {
                        for (col = c1; col != c2 + 1; col++) {
-                               lanpr_link_line_with_bounding_area(rb, 
&rb->InitialBoundingAreas[row * 20 + col], Result);
+                               lanpr_link_line_with_bounding_area(rb, 
&rb->InitialBoundingAreas[row * 4 + col], Result);
                        }
                }
        }
 
+       //printf("Intersection (%f %f)-(%f 
%f)\n",Result->L->FrameBufferCoord[0], 
Result->L->FrameBufferCoord[1],Result->R->FrameBufferCoord[0], 
Result->R->FrameBufferCoord[1]);
+
        //tnsglobal_TriangleIntersectionCount++;
 
        rb->IntersectionCount++;
@@ -2668,7 +2668,7 @@ void lanpr_compute_scene_contours(LANPR_RenderBuffer *rb, 
float threshold) {
                        if (lanpr_get_line_bounding_areas(rb, rl, &r1, &r2, 
&c1, &c2)) {
                                for (row = r1; row != r2 + 1; row++) {
                                        for (col = c1; col != c2 + 1; col++) {
-                                               
lanpr_link_line_with_bounding_area(rb, &rb->InitialBoundingAreas[row * 20 + 
col], rl);
+                                               
lanpr_link_line_with_bounding_area(rb, &rb->InitialBoundingAreas[row * 4 + 
col], rl);
                                        }
                                }
                        }

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to