[Bf-blender-cvs] [45a2126cc18] soc-2018-npr: Offline intersection and occlusion test code complete.

Nick Wu noreply at git.blender.org
Fri Jun 22 10:56:17 CEST 2018


Commit: 45a2126cc1805f8fc512991ba689325a3f8a6730
Author: Nick Wu
Date:   Fri Jun 22 16:55:05 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB45a2126cc1805f8fc512991ba689325a3f8a6730

Offline intersection and occlusion test code complete.

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

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 03d2b6a8057..5f4fc68b0bf 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -286,8 +286,8 @@ typedef struct LANPR_RenderBuffer {
 	//u32bit           BaFillVBO;
 
 	nListHandle           VertexBufferPointers;
+	nListHandle           LineBufferPointers;
 	nListHandle           TriangleBufferPointers;
-	
 	nListHandle           AllRenderLines;
 
 	nListHandle     IntersectingVertexBuffer;
@@ -723,6 +723,20 @@ __inline real tMatDirectionToRad(tnsVector2d Dir) {
 }
 
 
+__inline void tMatVectorConvert4fd(tnsVector4f from, tnsVector4d to) {
+	to[0] = from[0];
+	to[1] = from[1];
+	to[2] = from[2];
+	to[3] = from[3];
+}
+
+__inline void tMatVectorConvert3fd(tnsVector3f from, tnsVector3d to) {
+	to[0] = from[0];
+	to[1] = from[1];
+	to[2] = from[2];
+}
+
+
 int lanpr_PointInsideTrianglef(tnsVector2d v, tnsVector2d v0, tnsVector2d v1, tnsVector2d v2);
 real lanpr_LinearInterpolate(real L, real R, real T);
 void lanpr_LinearInterpolate2dv(real* L, real* R, real T, real* Result);
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index b8da9b19fcb..6e1263e5adb 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -8,6 +8,7 @@
 #include "BKE_object.h"
 #include "DNA_mesh_types.h"
 #include "DNA_camera_types.h"
+#include "DNA_modifier_types.h"
 #include "GPU_immediate.h"
 #include "GPU_immediate_util.h"
 #include "GPU_framebuffer.h"
@@ -15,6 +16,7 @@
 #include "DNA_meshdata_types.h"
 #include "BKE_customdata.h"
 #include "DEG_depsgraph_query.h"
+#include "BKE_camera.h"
 #include "GPU_draw.h"
 
 #include "GPU_batch.h"
@@ -23,6 +25,8 @@
 #include "GPU_uniformbuffer.h"
 #include "GPU_viewport.h"
 #include "bmesh.h"
+#include "bmesh_class.h"
+#include "bmesh_tools.h"
 
 #include "WM_types.h"
 #include "WM_api.h"
@@ -40,7 +44,7 @@ Author(s):WuYiming - xp8110 at outlook.com
 struct Object;
 
 
-int lanpr_TriangleLineImageSpaceIntersectTestOnlyV2(LANPR_RenderTriangle* rt, LANPR_RenderLine* rl, Camera* cam, tnsMatrix44d vp, double* From, double* To);
+int lanpr_TriangleLineImageSpaceIntersectTestOnlyV2(LANPR_RenderTriangle* rt, LANPR_RenderLine* rl, Camera* cam, tnsMatrix44d vp, real* CameraDir, double* From, double* To);
 
 
 /* ====================================== base structures =========================================== */
@@ -179,6 +183,10 @@ void lanpr_ConnectNewBoundingAreas(LANPR_RenderBuffer* rb, LANPR_BoundingArea* R
 void lanpr_AssociateTriangleWithBoundingArea(LANPR_RenderBuffer* rb, LANPR_BoundingArea* RootBoundingArea, LANPR_RenderTriangle* rt, real* LRUB, int Recursive);
 int lanpr_TriangleCalculateIntersectionsInTile(LANPR_RenderBuffer* rb, LANPR_RenderTriangle* rt, LANPR_BoundingArea* ba);
 
+int lanpr_GetRenderTriangleSize(LANPR_RenderBuffer* rb) {
+	return sizeof(LANPR_RenderTriangle) + (sizeof(LANPR_RenderLine*)*rb->ThreadCount);
+}
+
 void lanpr_SplitBoundingArea(LANPR_RenderBuffer* rb, LANPR_BoundingArea* Root) {
 	LANPR_BoundingArea* ba = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_BoundingArea) * 4);
 	LANPR_RenderTriangle* rt;
@@ -341,7 +349,7 @@ int lanpr_GetTriangleBoundingTile(LANPR_RenderBuffer* rb, LANPR_RenderTriangle*
 void lanpr_AddTriangles(LANPR_RenderBuffer* rb) {
 	LANPR_RenderElementLinkNode* reln;
 	LANPR_RenderTriangle* rt;
-	tnsMatrix44d VP;
+	//tnsMatrix44d VP;
 	Camera* c = ((Camera*)rb->Scene->camera);
 	int i, lim;
 	int x1, x2, y1, y2;
@@ -388,7 +396,7 @@ void lanpr_AddTriangles(LANPR_RenderBuffer* rb) {
 }
 LANPR_BoundingArea* lanpr_GetNextBoundingArea(LANPR_BoundingArea* This, LANPR_RenderLine* rl, real x, real y, real k, int PositiveX, int PositiveY, real* NextX, real* NextY) {
 	real rx, ry, ux, uy, lx, ly, bx, by;
-	real r1, r2, r;
+	real r1, r2;
 	LANPR_BoundingArea* ba; nListItemPointer* lip;
 	if (PositiveX) {
 		rx = This->R;
@@ -522,8 +530,6 @@ void lanpr_CutLineIntegrated(LANPR_RenderBuffer* rb, LANPR_RenderLine* rl, real
 	LANPR_RenderLineSegment* rls = rl->Segments.pFirst, *irls;
 	LANPR_RenderLineSegment *BeginSegment = 0, *EndSegment = 0;
 	LANPR_RenderLineSegment *ns = 0, *ns2 = 0;
-	LANPR_RenderLineSegment *BeforeBegin, *AfterEnd;
-	LANPR_RenderLineSegment *Next;
 
 	if (TNS_DOUBLE_CLOSE_ENOUGH(Begin, End)) return;
 
@@ -694,7 +700,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((void*)rt, rl, c, rb->ViewProjection, &l, &r)) {
+			if (lanpr_TriangleLineImageSpaceIntersectTestOnlyV2((void*)rt, rl, c, rb->ViewProjection, rb->ViewVector, &l, &r)) {
 				lanpr_CutLineIntegrated(rb, rl, l, r);
 			}
 		}
@@ -896,7 +902,7 @@ int lanpr_PointInsideTriangle3de(tnsVector3d v, tnsVector3d v0, tnsVector3d v1,
 LANPR_RenderElementLinkNode* lanpr_NewCullTriangleSpace64(LANPR_RenderBuffer* rb) {
 	LANPR_RenderElementLinkNode* reln;
 
-	LANPR_RenderTriangle* RenderTriangles = calloc(64, rb->TriangleSize);//CreateNewBuffer(LANPR_RenderTriangle, 64);
+	LANPR_RenderTriangle* RenderTriangles = MEM_callocN(64 * rb->TriangleSize,"render triangle space");//CreateNewBuffer(LANPR_RenderTriangle, 64);
 
 	reln = lstAppendPointerStaticSized(&rb->TriangleBufferPointers, &rb->RenderDataPool, RenderTriangles,
 		sizeof(LANPR_RenderElementLinkNode));
@@ -908,7 +914,7 @@ LANPR_RenderElementLinkNode* lanpr_NewCullTriangleSpace64(LANPR_RenderBuffer* rb
 LANPR_RenderElementLinkNode* lanpr_NewCullPointSpace64(LANPR_RenderBuffer* rb) {
 	LANPR_RenderElementLinkNode* reln;
 
-	LANPR_RenderVert* RenderVertices = CreateNewBuffer(LANPR_RenderVert, 64);
+	LANPR_RenderVert* RenderVertices = MEM_callocN(sizeof(LANPR_RenderVert) * 64,"render vert space");//CreateNewBuffer(LANPR_RenderVert, 64);
 
 	reln = lstAppendPointerStaticSized(&rb->VertexBufferPointers, &rb->RenderDataPool, RenderVertices,
 		sizeof(LANPR_RenderElementLinkNode));
@@ -1408,10 +1414,10 @@ void lanpr_PerspectiveDivision(LANPR_RenderBuffer* rb) {
 	}
 }
 
-void lanpr_TransformRenderVert(BMVert* V, LANPR_RenderVert* RVBuf, real* MVMat, real* MVPMat, Camera* Camera) {//real HeightMultiply, real clipsta, real clipend) {
-	LANPR_RenderVert* rv = &RVBuf[V->I];
-	rv->V = V;
-	V->RV = rv;
+void lanpr_TransformRenderVert(BMVert* V, int index, LANPR_RenderVert* RVBuf, real* MVMat, real* MVPMat, Camera* Camera) {//real HeightMultiply, real clipsta, real clipend) {
+	LANPR_RenderVert* rv = &RVBuf[index];
+	//rv->V = V;
+	//V->RV = rv;
 	tMatApplyTransform43df(rv->GLocation, MVMat, V->co);
 	tMatApplyTransform43df(rv->FrameBufferCoord, MVPMat, V->co);
 
@@ -1426,98 +1432,136 @@ void lanpr_CalculateRenderTriangleNormal(LANPR_RenderTriangle* rt) {
 	tMatVectorCross3d(rt->GN, L, R);
 	tMatNormalizeSelf3d(rt->GN);
 }
-void lanpr_MakeRenderGeometryBuffersObject(Object* o, real* MVMat, real* MVPMat, LANPR_RenderBuffer* rb, real HeightMultiply) {
+void lanpr_MakeRenderGeometryBuffersObject(Object* o, real* MVMat, real* MVPMat, LANPR_RenderBuffer* rb) {
 	Object* oc;
 	Mesh* mo;
+	BMesh* bm;
 	BMVert* v;
 	BMFace* f;
 	BMEdge* e;
+	BMLoop* loop;
+	LANPR_RenderLine* rl;
 	LANPR_RenderTriangle* rt;
 	tnsMatrix44d NewMVP;
 	tnsMatrix44d NewMV;
-	LANPR_RenderBuffer* fb = rb->FrameBuffer;
+	tnsMatrix44d SelfTransform;
 	LANPR_RenderElementLinkNode* reln;
-	Camera* c = rb->Scene->camera->data;
+	Object* cam_object = rb->Scene->camera;
+	Camera* c = cam_object->data;
 	Material* m;
+	LANPR_RenderVert* orv;
+	LANPR_RenderLine* orl;
+	LANPR_RenderTriangle* ort;
+	int i;
+
 
-	//if (o->RenderTriangles) FreeMem(o->RenderTriangles);
-	//if (o->RenderVertices) FreeMem(o->RenderVertices);
+	if (o->type == OB_MESH) {
 
-	tMatMultiply44d(NewMVP, MVPMat, o->SelfTransform);
-	tMatMultiply44d(NewMV, MVMat, o->SelfTransform);
+		tMatObmatTo16d(o->obmat, SelfTransform);
 
-	if (o->Type == TNS_OBJECT_MESH) {
-		mo = o;
-		o->RenderVertices = CreateNewBuffer(LANPR_RenderVert, mo->totvert);
-		o->RenderTriangles = calloc(mo->TriangleCount, rb->TriangleSize);//CreateNewBuffer(LANPR_RenderTriangle, mo->TriangleCount);
-																		 //o->RenderLines = CreateNewBuffer(LANPR_RenderLine, mo->TriangulatedEdgeCount);
+		tMatMultiply44d(NewMVP, MVPMat, SelfTransform);
+		tMatMultiply44d(NewMV, MVMat, SelfTransform);
 
-		reln = lstAppendPointerStaticSized(&rb->VertexBufferPointers, &rb->RenderDataPool, o->RenderVertices,
+		const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(((Mesh*)(o->data)));
+		bm = BM_mesh_create(&allocsize,
+			&((struct BMeshCreateParams) { .use_toolflags = true, }));
+		BM_mesh_bm_from_me(bm, o->data, &((struct BMeshFromMeshParams) { .calc_face_normal = true, }));
+		BM_mesh_triangulate(bm, MOD_TRIANGULATE_QUAD_BEAUTY, MOD_TRIANGULATE_NGON_EARCLIP, false, NULL, NULL, NULL);
+		BM_mesh_elem_table_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
+		
+		orv = MEM_callocN(sizeof(LANPR_RenderVert)*bm->totvert,"object render verts");
+		ort = MEM_callocN(bm->totface*rb->TriangleSize,"object render triangles");//CreateNewBuffer(LANPR_RenderTriangle, mo->TriangleCount);
+		orl = MEM_callocN(sizeof(LANPR_RenderLine)*bm->totedge, "object render edge");
+
+		reln = lstAppendPointerStaticSized(&rb->VertexBufferPointers, &rb->RenderDataPool, orv,
+			sizeof(LANPR_RenderElementLinkNode));
+		reln->ElementCount = bm->totvert;
+		reln->ObjectRef = o;
+
+		reln = lstAppendPointerStaticSized(&rb->LineBufferPointers, &rb->RenderDataPool, orl,
 			sizeof(LANPR_RenderElementLinkNode));
-		reln->ElementCount = mo->totvert;
-		reln->ObjectRef = mo;
+		reln->ElementCount = bm->totedge;
+		reln->ObjectRef = o;
 
-		reln = lstAppendPointerStaticSized(&rb->TriangleBufferPointers, &rb->RenderDataPool, o->RenderTriangles,
+		reln = lstAppendPointerStaticSized(&rb->TriangleBufferPointers, &rb->RenderDataPool, ort,
 			sizeof(LANPR_RenderElementLinkNode));
-		reln->ElementCount = mo->TriangleCount;
-		reln->ObjectRef = mo;
+		reln->ElementCount = bm->totface;
+		reln->ObjectRef = o;
 
-		for 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list