[Bf-blender-cvs] [44f0f142326] soc-2018-npr: Fixed software triangle and render line culling bug. (crappy, but works correctly)
Nick Wu
noreply at git.blender.org
Wed Aug 1 17:21:38 CEST 2018
Commit: 44f0f1423264f6ad8249325f5c41f1c83bdc565d
Author: Nick Wu
Date: Wed Aug 1 23:19:44 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB44f0f1423264f6ad8249325f5c41f1c83bdc565d
Fixed software triangle and render line culling bug. (crappy, but works correctly)
===================================================================
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 b23e39b5353..0916c2a7065 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -424,7 +424,7 @@ void lanpr_add_triangles(LANPR_RenderBuffer *rb) {
lim = reln->ElementCount;
for (i = 0; i < lim; i++) {
if (rt->CullStatus) {
- (void *)(((BYTE *)rt) + rb->TriangleSize); continue;
+ rt = (void *)(((BYTE *)rt) + rb->TriangleSize); continue;
}
if (lanpr_get_triangle_bounding_areas(rb, rt, &y1, &y2, &x1, &x2)) {
for (co = x1; co <= x2; co++) {
@@ -1058,9 +1058,13 @@ void lanpr_post_triangle(LANPR_RenderTriangle *rt, LANPR_RenderTriangle *orig) {
tMatVectorCopy3d(orig->GN, rt->GN);
}
+
+#define RT_AT(head, rb, offset) \
+ ((BYTE *)head + offset * rb->TriangleSize)
+
void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
LANPR_RenderLine *rl;
- LANPR_RenderTriangle *rt, *rt1;
+ LANPR_RenderTriangle *rt, *rt1, *rt2;
LANPR_RenderVert *rv;
LANPR_RenderElementLinkNode *reln, *veln, *teln;
LANPR_RenderLineSegment *rls;
@@ -1082,9 +1086,9 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
for (i; i < reln->ElementCount; i++) {
int In1 = 0, In2 = 0, In3 = 0;
rt = (void *)(((BYTE *)reln->Pointer) + rb->TriangleSize * i);
- if (rt->V[0]->FrameBufferCoord[3] < 0) In1 = 1;
- if (rt->V[1]->FrameBufferCoord[3] < 0) In2 = 1;
- if (rt->V[2]->FrameBufferCoord[3] < 0) In3 = 1;
+ if (rt->V[0]->FrameBufferCoord[2] < 0) In1 = 1;
+ if (rt->V[1]->FrameBufferCoord[2] < 0) In2 = 1;
+ if (rt->V[2]->FrameBufferCoord[2] < 0) In3 = 1;
rt->RL[0]->ObjectRef = o;
rt->RL[1]->ObjectRef = o;
@@ -1109,7 +1113,8 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
}
rv = &((LANPR_RenderVert *)veln->Pointer)[v_count];
- rt1 = &((LANPR_RenderTriangle *)teln->Pointer)[t_count];
+ rt1 = (void *)(((BYTE *)teln->Pointer) + rb->TriangleSize * t_count);
+ rt2 = (void *)(((BYTE *)teln->Pointer) + rb->TriangleSize * (t_count + 1));
switch (In1 + In2 + In3) {
@@ -1117,6 +1122,9 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
continue;
case 3:
rt->CullStatus = TNS_CULL_DISCARD;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]); rt->RL[0]->Item.pNext = rt->RL[0]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]); rt->RL[1]->Item.pNext = rt->RL[1]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]); rt->RL[2]->Item.pNext = rt->RL[2]->Item.pPrev = 0;
continue;
case 2:
rt->CullStatus = TNS_CULL_USED;
@@ -1135,9 +1143,9 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rv[1].FrameBufferCoord[3] = (1 - a) * rt->V[0]->FrameBufferCoord[3] + a * rt->V[1]->FrameBufferCoord[3];
tMatApplyTransform44dTrue(rv[1].GLocation, mv_inverse, rv[1].FrameBufferCoord);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]);
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]); rt->RL[0]->Item.pNext = rt->RL[0]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]); rt->RL[1]->Item.pNext = rt->RL[1]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]); rt->RL[2]->Item.pNext = rt->RL[2]->Item.pPrev = 0;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1193,9 +1201,9 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rv[1].FrameBufferCoord[3] = (1 - a) * rt->V[2]->FrameBufferCoord[3] + a * rt->V[1]->FrameBufferCoord[3];
tMatApplyTransform44dTrue(rv[1].GLocation, mv_inverse, rv[1].FrameBufferCoord);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]);
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]); rt->RL[0]->Item.pNext = rt->RL[0]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]); rt->RL[1]->Item.pNext = rt->RL[1]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]); rt->RL[2]->Item.pNext = rt->RL[2]->Item.pPrev = 0;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1251,9 +1259,9 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rv[1].FrameBufferCoord[3] = (1 - a) * rt->V[1]->FrameBufferCoord[3] + a * rt->V[2]->FrameBufferCoord[3];
tMatApplyTransform44dTrue(rv[1].GLocation, mv_inverse, rv[1].FrameBufferCoord);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]);
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]); rt->RL[0]->Item.pNext = rt->RL[0]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]); rt->RL[1]->Item.pNext = rt->RL[1]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]); rt->RL[2]->Item.pNext = rt->RL[2]->Item.pPrev = 0;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1312,8 +1320,8 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rv[1].FrameBufferCoord[3] = (1 - a) * rt->V[0]->FrameBufferCoord[3] + a * rt->V[1]->FrameBufferCoord[3];
tMatApplyTransform44dTrue(rv[1].GLocation, mv_inverse, rv[1].FrameBufferCoord);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]);
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]); rt->RL[0]->Item.pNext = rt->RL[0]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[2]); rt->RL[2]->Item.pNext = rt->RL[2]->Item.pPrev = 0;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1322,7 +1330,7 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rl->L = &rv[1];
rl->R = &rv[0];
rl->TL = rt1;
- rt1[0].RL[1] = rl;
+ rt1->RL[1] = rl;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1330,10 +1338,10 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
BLI_addtail(&rb->AllRenderLines, rl);
rl->L = &rv[0];
rl->R = rt->V[1];
- rl->TL = &rt1[0];
- rl->TR = &rt1[1];
- rt1[0].RL[2] = rl;
- rt1[1].RL[0] = rl;
+ rl->TL = rt1;
+ rl->TR = rt2;
+ rt1->RL[2] = rl;
+ rt2->RL[0] = rl;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1343,11 +1351,11 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rl->R = &rv[1];
rl->TL = rt->RL[0]->TL == rt ? rt1 : rt->RL[0]->TL;
rl->TR = rt->RL[0]->TR == rt ? rt1 : rt->RL[0]->TR;
- rt1[0].RL[0] = rl;
+ rt1->RL[0] = rl;
- rt1[0].V[0] = rt->V[1];
- rt1[0].V[1] = &rv[1];
- rt1[0].V[2] = &rv[0];
+ rt1->V[0] = rt->V[1];
+ rt1->V[1] = &rv[1];
+ rt1->V[2] = &rv[0];
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1357,15 +1365,15 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rl->R = &rv[0];
rl->TL = rt->RL[2]->TL == rt ? rt1 : rt->RL[2]->TL;
rl->TR = rt->RL[2]->TR == rt ? rt1 : rt->RL[2]->TR;
- rt1[1].RL[2] = rl;
- rt1[1].RL[1] = rt->RL[1];
+ rt2->RL[2] = rl;
+ rt2->RL[1] = rt->RL[1];
- rt1[1].V[0] = &rv[0];
- rt1[1].V[1] = rt->V[1];
- rt1[1].V[2] = rt->V[2];
+ rt2->V[0] = &rv[0];
+ rt2->V[1] = rt->V[1];
+ rt2->V[2] = rt->V[2];
- lanpr_post_triangle(&rt1[0], rt);
- lanpr_post_triangle(&rt1[1], rt);
+ lanpr_post_triangle(rt1, rt);
+ lanpr_post_triangle(rt2, rt);
v_count += 2;
t_count += 2;
@@ -1386,8 +1394,8 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rv[1].FrameBufferCoord[3] = (1 - a) * rt->V[1]->FrameBufferCoord[3] + a * rt->V[2]->FrameBufferCoord[3];
tMatApplyTransform44dTrue(rv[1].GLocation, mv_inverse, rv[1].FrameBufferCoord);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]);
- BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]);
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[0]); rt->RL[0]->Item.pNext = rt->RL[0]->Item.pPrev = 0;
+ BLI_remlink(&rb->AllRenderLines, (void *)rt->RL[1]); rt->RL[1]->Item.pNext = rt->RL[1]->Item.pPrev = 0;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1396,7 +1404,7 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
rl->L = &rv[1];
rl->R = &rv[0];
rl->TL = rt1;
- rt1[0].RL[1] = rl;
+ rt1->RL[1] = rl;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1404,10 +1412,10 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb) {
BLI_addtail(&rb->AllRenderLines, rl);
rl->L = &rv[0];
rl->R = rt->V[2];
- rl->TL = &rt1[0];
- rl->TR = &rt1[1];
- rt1[0].RL[2] = rl;
- rt1[1].RL[0] = rl;
+ rl->TL = rt1;
+ rl->TR = rt2;
+ rt1->RL[2] = rl;
+ rt2->RL[0] = rl;
rl = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLine));
rls = mem_static_aquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1417,11 +1425,11 @@ void lanpr_cull_triangles(LANPR_RenderBuffer *rb)
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list