[Bf-blender-cvs] [801d0378029] soc-2018-npr: Render process ok. spin lock ok. DON'T COMPILE
Nick Wu
noreply at git.blender.org
Thu Jun 21 15:28:36 CEST 2018
Commit: 801d03780297a02092ba70566f896aa032ab06e5
Author: Nick Wu
Date: Thu Jun 21 21:27:36 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB801d03780297a02092ba70566f896aa032ab06e5
Render process ok. spin lock ok. DON'T COMPILE
===================================================================
M source/blender/draw/engines/lanpr/lanpr_all.h
M source/blender/draw/engines/lanpr/lanpr_ops.c
M source/blender/draw/engines/lanpr/lanpr_util.c
M source/blender/draw/engines/lanpr/lanpr_util.h
===================================================================
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 6cf5686a08d..03d2b6a8057 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -22,6 +22,8 @@
#include "DEG_depsgraph_query.h"
#include "GPU_draw.h"
+#include "BLI_threads.h"
+
#include "GPU_batch.h"
#include "GPU_framebuffer.h"
#include "GPU_shader.h"
@@ -293,6 +295,8 @@ typedef struct LANPR_RenderBuffer {
/* use own-implemented one */
nStaticMemoryPool RenderDataPool;
+ Material *MaterialPointers[2048];
+
//render status
real ViewVector[3];
@@ -319,9 +323,9 @@ typedef struct LANPR_RenderBuffer {
nListItemPointer* MaterialManaged;
nListHandle MaterialLines;
- //CRITICAL_SECTION csInfo;
- //CRITICAL_SECTION csData;
- //CRITICAL_SECTION csManagement;
+ SpinLock csInfo;
+ SpinLock csData;
+ SpinLock csManagement;
//settings
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index c1be3220778..b8da9b19fcb 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -341,7 +341,6 @@ int lanpr_GetTriangleBoundingTile(LANPR_RenderBuffer* rb, LANPR_RenderTriangle*
void lanpr_AddTriangles(LANPR_RenderBuffer* rb) {
LANPR_RenderElementLinkNode* reln;
LANPR_RenderTriangle* rt;
- LANPR_RenderTile* tile;
tnsMatrix44d VP;
Camera* c = ((Camera*)rb->Scene->camera);
int i, lim;
@@ -607,8 +606,8 @@ int lanpr_MakeNextOcclusionTaskInfo(LANPR_RenderBuffer* rb, LANPR_RenderTaskInfo
int i;
int res = 0;
- //EnterCriticalSection(&rb->csManagement);
-
+ BLI_spin_lock(&rb->csManagement);
+
if (rb->ContourManaged) {
p = rb->ContourManaged;
rti->Contour = (void*)p;
@@ -673,7 +672,7 @@ int lanpr_MakeNextOcclusionTaskInfo(LANPR_RenderBuffer* rb, LANPR_RenderTaskInfo
rti->Material = 0;
}
- //LeaveCriticalSection(&rb->csManagement);
+ BLI_spin_unlock(&rb->csManagement);
return res;
}
@@ -683,7 +682,6 @@ void lanpr_CalculateSingleLineOcclusion(LANPR_RenderBuffer* rb, LANPR_RenderLine
LANPR_BoundingArea* nba = ba;
LANPR_RenderTriangleThread* rt;
nListItemPointer* lip;
- LANPR_RenderVert* rv;
Camera* c = rb->Scene->camera->data;
real l, r;
real k = (rl->R->FrameBufferCoord[1] - rl->L->FrameBufferCoord[1]) / (rl->R->FrameBufferCoord[0] - rl->L->FrameBufferCoord[0] + 1e-30);
@@ -696,7 +694,7 @@ void lanpr_CalculateSingleLineOcclusion(LANPR_RenderBuffer* rb, LANPR_RenderLine
rt = lip->p;
//if (rt->Testing[ThreadID] == rl || rl->L->IntersectWith == rt || rl->R->IntersectWith == rt) continue;
rt->Testing[ThreadID] = rl;
- if (lanpr_TriangleLineImageSpaceIntersectTestOnlyV2(rt, rl, c, rb->ViewProjection, &l, &r)) {
+ if (lanpr_TriangleLineImageSpaceIntersectTestOnlyV2((void*)rt, rl, c, rb->ViewProjection, &l, &r)) {
lanpr_CutLineIntegrated(rb, rl, l, r);
}
}
@@ -706,7 +704,6 @@ void lanpr_CalculateSingleLineOcclusion(LANPR_RenderBuffer* rb, LANPR_RenderLine
void THREAD_CalculateLineOcclusion(LANPR_RenderTaskInfo* rti) {
LANPR_RenderBuffer* rb = rti->RenderBuffer;
int ThreadId = rti->ThreadID;
- LANPR_RenderLine* rl;
nListItemPointer* lip;
int count = 0;
@@ -774,67 +771,6 @@ int lanpr_BoundBoxCrosses(tnsVector4d xxyy1, tnsVector4d xxyy2) {
return 1;
}
-int lanpr_LineCrossesTile(LANPR_RenderBuffer* fb, tnsVector2d L, tnsVector2d R, LANPR_RenderTile* Tile) {
- real vx, vy;
- tnsVector4d Converted;
- real c1, c;
-
- if ((Converted[0] = (real)Tile->SubX - (real)fb->W / 2) > TNS_MAX2(L[0], R[0])) return 0;
- if ((Converted[1] = (real)Tile->SubXLim - (real)fb->W / 2) < TNS_MIN2(L[0], R[0])) return 0;
- if ((Converted[2] = (real)Tile->SubY - (real)fb->H / 2) > TNS_MAX2(L[1], R[1])) return 0;
- if ((Converted[3] = (real)Tile->SubYLim - (real)fb->H / 2) < TNS_MIN2(L[1], R[1])) return 0;
-
- //LineBoundBox[0] = L[0];
- //LineBoundBox[1] = R[0];
- //LineBoundBox[2] = L[1];
- //LineBoundBox[3] = R[1];
-
- //if (!lanpr_BoundBoxCrosses(Converted, LineBoundBox))return 0;
-
- //tMatVectorMinus2d(vec, L, R);
- vx = L[0] - R[0];
- vy = L[1] - R[1];
-
- c1 = vx * (Converted[2] - L[1]) - vy * (Converted[0] - L[0]);
- c = c1;
-
- c1 = vx * (Converted[2] - L[1]) - vy * (Converted[1] - L[0]);
- if (c1*c <= 0)return 1;
- else c = c1;
-
- c1 = vx * (Converted[3] - L[1]) - vy * (Converted[0] - L[0]);
- if (c1*c <= 0)return 1;
- else c = c1;
-
- c1 = vx * (Converted[3] - L[1]) - vy * (Converted[1] - L[0]);
- if (c1*c <= 0)return 1;
- else c = c1;
-
- //c1 = vec[0] * (Converted[2] - L[1]) - vec[1] * (Converted[0] - L[0]);
- //if (c1*c < 0)return 1;
-
- //test[0] = Converted[1]; test[1] = Converted[2];
- //tMatVectorMinus2d(test, test, L);
- //tMatVectorCrossOnly3d(CrossResult, vec, test);
- //if (tMatDot3d(CrossResult, CrossResultSave, 0) < 0)
- // return 1;
- //else tMatVectorCopy3d(CrossResult, CrossResultSave);
-
- //test[0] = Converted[0]; test[1] = Converted[3];
- //tMatVectorMinus2d(test, test, L);
- //tMatVectorCrossOnly3d(CrossResult, vec, test);
- //if (tMatDot3d(CrossResult, CrossResultSave, 0) < 0)
- // return 1;
- //else tMatVectorCopy3d(CrossResult, CrossResultSave);
- //
- //test[0] = Converted[1]; test[1] = Converted[3];
- //tMatVectorMinus2d(test, test, L);
- //tMatVectorCrossOnly3d(CrossResult, vec, test);
- //if (tMatDot3d(CrossResult, CrossResultSave, 0) < 0)
- // return 1;
-
- return 0;
-}
int lanpr_PointInsideTrianglef(tnsVector2d v, tnsVector2d v0, tnsVector2d v1, tnsVector2d v2) {
double cl, c;
@@ -889,7 +825,6 @@ int lanpr_PointTriangleRelation(tnsVector2d v, tnsVector2d v0, tnsVector2d v1, t
return 2;
}
int lanpr_PointInsideTriangle3d(tnsVector3d v, tnsVector3d v0, tnsVector3d v1, tnsVector3d v2) {
- real cl, c;
tnsVector3d L, R;
tnsVector3d N1, N2;
@@ -997,7 +932,6 @@ void lanpr_CullTriangles(LANPR_RenderBuffer* rb) {
LANPR_RenderVert* rv;
LANPR_RenderElementLinkNode* reln, *veln, *teln;
LANPR_RenderLineSegment* rls;
- tnsVector4d p1, p2;
real* MVInverse = rb->VPInverse;
int i;
real a;
@@ -1492,7 +1426,7 @@ void lanpr_CalculateRenderTriangleNormal(LANPR_RenderTriangle* rt) {
tMatVectorCross3d(rt->GN, L, R);
tMatNormalizeSelf3d(rt->GN);
}
-void lanpr_MakeRenderGeometryBuffersRecursive(Object* o, real* MVMat, real* MVPMat, LANPR_RenderBuffer* rb, real HeightMultiply) {
+void lanpr_MakeRenderGeometryBuffersObject(Object* o, real* MVMat, real* MVPMat, LANPR_RenderBuffer* rb, real HeightMultiply) {
Object* oc;
Mesh* mo;
BMVert* v;
@@ -1557,19 +1491,20 @@ void lanpr_MakeRenderGeometryBuffersRecursive(Object* o, real* MVMat, real* MVPM
}
for (oc = o->ChildObjects.pFirst; oc; oc = oc->Item.pNext) {
- lanpr_MakeRenderGeometryBuffersRecursive(oc, NewMV, NewMVP, rb, HeightMultiply);
+ lanpr_MakeRenderGeometryBuffersRecursive(oc, NewMV, NewMVP, rb);
}
}
-void tnsMakeRenderGeometryBuffers(Scene* s, Camera* c, LANPR_RenderBuffer* rb, int HeightMultiply) {
+void lanpr_MakeRenderGeometryBuffers(Scene* s, Object* c/*camera*/, LANPR_RenderBuffer* rb) {
Object* o;
+ Collection* collection;
+ CollectionObject* co;
+ tnsMatrix44d obmat16;
tnsMatrix44d proj, view, result, inv;
- LANPR_RenderBuffer* fb = rb;
-
if (!c) return;
- memset(rb->Scene->MaterialPointers, 0, sizeof(void*) * 2048);
+ memset(rb->MaterialPointers, 0, sizeof(void*) * 2048);
- real asp = ((real)fb->W / (real)fb->H);
+ real asp = ((real)rb->W / (real)rb->H);
if (c->type == CAM_PERSP) {
tMatMakePerspectiveMatrix44d(proj, c->FOV, asp, c->clipsta, c->clipend);
@@ -1582,20 +1517,23 @@ void tnsMakeRenderGeometryBuffers(Scene* s, Camera* c, LANPR_RenderBuffer* rb, i
//tObjApplySelfTransformMatrix(c, 0);
//tObjApplyGlobalTransformMatrixReverted(c);
- tMatInverse44d(inv, c->Base.GlobalTransform);
+ tMatObmatTo16d(c->obmat, obmat16)
+ tMatInverse44d(inv, obmat16);
tMatMultiply44d(result, proj, inv);
memcpy(proj, result, sizeof(tnsMatrix44d));
- memcpy(fb->ViewProjection, proj, sizeof(tnsMatrix44d));
+ memcpy(rb->ViewProjection, proj, sizeof(tnsMatrix44d));
- tMatInverse44d(fb->VPInverse, fb->ViewProjection);
+ tMatInverse44d(rb->VPInverse, rb->ViewProjection);
void* a;
while (a = lstPopPointer(&rb->TriangleBufferPointers)) FreeMem(a);
while (a = lstPopPointer(&rb->VertexBufferPointers)) FreeMem(a);
- for (o = s->Objects.pFirst; o; o = o->Item.pNext) {
- //tObjApplyGlobalTransformMatrixRecursive(o);
- lanpr_MakeRenderGeometryBuffersRecursive(o, view, proj, rb, (real)HeightMultiply);
+ for (collection = s->master_collection.first; collection; collection = collection->ID.next) {
+ for (co = collection->gobject.first; co; co = co->next) {
+ //tObjApplyGlobalTransformMatrixRecursive(o);
+ lanpr_MakeRenderGeometryBuffersObject(o, view, proj, rb);
+ }
}
}
@@ -2247,8 +2185,8 @@ LANPR_RenderVert* lanpr_TriangleLineIntersectionTest(LANPR_RenderLine* rl, LANPR
//Result->IntersectingOnFace = Testing;
Result->EdgeUsed = 1;
//Result->IntersectL = L;
- Result->V = R; //Caution!
- //Result->IntersectWith = rt;
+ Result->V = (void*)R; //Caution!
+ //Result->IntersectWith = rt;
tMatVectorCopy3d(GLocation, Result->GLocation);
lstAppendItem(&Testing->IntersectingVerts, Result);
@@ -2579,6 +2517,11 @@ LANPR_RenderBuffer* lanpr_CreateRenderBuffer(SceneLANPR* lanpr) {
lanpr->render_buffer = rb;
+ BLI_spin_init(&rb->csData);
+ BLI_spin_init(&rb->csInfo);
+ BLI_spin_init(&rb->csManagement);
+ BLI_spin_init(&rb->RenderDataPool.csMem);
+
return rb;
}
@@ -2597,8 +2540,17 @@ static int lanpr_compute_feature_lines_exec(struct bContext *C, struct wmOperato
rb = lanpr_CreateRenderBuffer(lanpr);
+ lanpr_MakeRenderGeometryBuffers(scene,scene->camera,rb);
+
+ lanpr_CullTriangles(rb);
+
+ lanpr_PerspectiveDivision(rb);
+
lanpr_MakeInitialBoundingAreas(rb);
+ lanpr_ComputeSceneContours(rb);
+
+ lanpr_AddTriangles(rb);
return OPERATOR_FINISHED;
}
diff --git a/source/blender/draw/engines/lanpr/lanpr_util.c b/source/blender/draw/engines/lanpr/lanpr_util.c
index d89c072d79c..c59b1556310 100644
--- a/source/blender/draw/engines/lanpr/lanpr_util.c
+++ b/source/blender/draw/engines/lanpr/lanpr_util.c
@@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list