[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