[Bf-blender-cvs] [a63777b8795] soc-2018-npr: Fixed normal matrix error. obmat needs double to produce better result.

Nick Wu noreply at git.blender.org
Fri Jun 29 06:02:13 CEST 2018


Commit: a63777b879525ede2c0e8adf05d46373969bf64b
Author: Nick Wu
Date:   Thu Jun 28 12:30:58 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rBa63777b879525ede2c0e8adf05d46373969bf64b

Fixed normal matrix error. obmat needs double to produce better result.

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

M	release/scripts/startup/bl_ui/properties_scene.py
M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_engine.c
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
M	source/blender/draw/engines/lanpr/shaders/lanpr_software_line_width.geometry
M	source/blender/makesdna/DNA_lanpr_types.h
M	source/blender/makesrna/intern/rna_lanpr.c

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

diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 504e55b89e4..14fbae0ccf4 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -623,16 +623,26 @@ class SCENE_PT_lanpr(SceneButtonsPanel, PropertyPanel, Panel):
                     else:
                         row.label(text="OFF")
 
-                    layout.prop(lanpr, "crease_threshold")
-                    layout.prop(lanpr, "crease_fade_threshold")
-
-                    split = layout.split()
+                    split = layout.split(align=True)
                     col = split.column()
-                    col.prop(lanpr, "depth_width_influence")
-                    col.prop(lanpr, "depth_alpha_influence")
+                    layout.prop(active_layer, "qi_begin")
                     col = split.column()
-                    col.prop(lanpr, "depth_width_curve")
-                    col.prop(lanpr, "depth_alpha_curve")
+                    layout.prop(active_layer, "qi_end")
+                
+                
+                layout.prop(lanpr, "crease_threshold")
+
+                layout.label(text="Below INOP in software:")
+
+                layout.prop(lanpr, "crease_fade_threshold")
+
+                split = layout.split()
+                col = split.column()
+                col.prop(lanpr, "depth_width_influence")
+                col.prop(lanpr, "depth_alpha_influence")
+                col = split.column()
+                col.prop(lanpr, "depth_width_curve")
+                col.prop(lanpr, "depth_alpha_curve")
             
         else:
             layout.label(text="Snake:")
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 74daaa98ffd..82a7d355c81 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -422,6 +422,8 @@ typedef struct LANPR_RenderVert {
 	char EdgeUsed;                    //                      <|		       |>
 }LANPR_RenderVert;
 
+#define LANPR_EDGE_FLAG_EDGE_MARK 1
+
 typedef struct LANPR_RenderLine {
 	nListItem Item;
 	struct LANPR_RenderVert *L, *R;
@@ -430,6 +432,7 @@ typedef struct LANPR_RenderLine {
 	//tnsEdge*       Edge;//should be edge material
 	//tnsRenderTriangle* Testing;//Should Be tRT** Testing[NumOfThreads]
 	char MinOcclude;
+	char Flags;
 	struct Object *ObjectRef;
 	//char            IgnoreConnectedFace;
 	//char            CullStatus;
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 252c183ec0e..84522c971e3 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -328,7 +328,15 @@ static void lanpr_cache_init(void *vedata){
 		for (ll = lanpr->line_layers.first; ll; ll = ll->next) {
 			ll->shgrp = DRW_shgroup_create(OneTime.software_shader, psl->software_pass);
 			DRW_shgroup_uniform_vec4(ll->shgrp, "color", ll->color, 1);
-			DRW_shgroup_uniform_float(ll->shgrp, "line_thickness", &ll->thickness, 1);
+			DRW_shgroup_uniform_vec4(ll->shgrp, "crease_color", ll->crease_color, 1);
+			DRW_shgroup_uniform_vec4(ll->shgrp, "material_color", ll->material_color, 1);
+			DRW_shgroup_uniform_vec4(ll->shgrp, "edge_mark_color", ll->edge_mark_color, 1);
+			DRW_shgroup_uniform_vec4(ll->shgrp, "intersection_color", ll->intersection_color, 1);
+			DRW_shgroup_uniform_float(ll->shgrp, "thickness", &ll->thickness, 1);
+			DRW_shgroup_uniform_float(ll->shgrp, "thickness_crease", &ll->thickness_crease, 1);
+			DRW_shgroup_uniform_float(ll->shgrp, "thickness_material", &ll->thickness_material, 1);
+			DRW_shgroup_uniform_float(ll->shgrp, "thickness_edge_mark", &ll->thickness_edge_mark, 1);
+			DRW_shgroup_uniform_float(ll->shgrp, "thickness_intersection", &ll->thickness_intersection, 1);
 			if(ll->batch) DRW_shgroup_call_add(ll->shgrp, ll->batch, NULL);
 		}
 	}
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/source/blender/draw/engines/lanpr/lanpr_ops.c
index 67670cad3db..83a15868a0c 100644
--- a/source/blender/draw/engines/lanpr/lanpr_ops.c
+++ b/source/blender/draw/engines/lanpr/lanpr_ops.c
@@ -2,6 +2,7 @@
 #include "DRW_render.h"
 #include "BLI_listbase.h"
 #include "BLI_linklist.h"
+#include "BLI_math_matrix.h"
 #include "lanpr_all.h"
 #include "lanpr_util.h"
 #include "DRW_render.h"
@@ -1472,7 +1473,7 @@ void lanpr_TransformRenderVert(BMVert *V, int index, LANPR_RenderVert *RVBuf, re
 	//rv->V = V;
 	//V->RV = rv;
 	tMatApplyTransform43df(rv->GLocation, MVMat, V->co);
-	tMatApplyTransform43df(rv->FrameBufferCoord, MVPMat, V->co);
+	tMatApplyTransform43dfND(rv->FrameBufferCoord, MVPMat, V->co);
 
 	//if(rv->FrameBufferCoord[2]>0)tMatVectorMultiSelf3d(rv->FrameBufferCoord, (1 / rv->FrameBufferCoord[3]));
 	//else tMatVectorMultiSelf3d(rv->FrameBufferCoord, -rv->FrameBufferCoord[3]);
@@ -1498,6 +1499,7 @@ void lanpr_MakeRenderGeometryBuffersObject(Object *o, real *MVMat, real *MVPMat,
 	tnsMatrix44d NewMVP;
 	tnsMatrix44d NewMV;
 	tnsMatrix44d SelfTransform;
+	tnsMatrix44d Normal;
 	LANPR_RenderElementLinkNode *reln;
 	Object *cam_object = rb->Scene->camera;
 	Camera *c = cam_object->data;
@@ -1505,6 +1507,8 @@ void lanpr_MakeRenderGeometryBuffersObject(Object *o, real *MVMat, real *MVPMat,
 	LANPR_RenderVert *orv;
 	LANPR_RenderLine *orl;
 	LANPR_RenderTriangle *ort;
+	FreestyleEdge *fe;
+	int CanFindFreestyle = 0;
 	int i;
 
 
@@ -1515,6 +1519,11 @@ void lanpr_MakeRenderGeometryBuffersObject(Object *o, real *MVMat, real *MVPMat,
 		tMatMultiply44d(NewMVP, MVPMat, SelfTransform);
 		tMatMultiply44d(NewMV, MVMat, SelfTransform);
 
+		invert_m4_m4(o->imat, o->obmat);
+		transpose_m4(o->imat);
+		tMatObmatTo16d(o->imat, Normal);
+
+
 		const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(((Mesh *)(o->data)));
 		bm = BM_mesh_create(&allocsize,
 		                    &((struct BMeshCreateParams) {.use_toolflags = true, }));
@@ -1523,6 +1532,10 @@ void lanpr_MakeRenderGeometryBuffersObject(Object *o, real *MVMat, real *MVPMat,
 		BM_mesh_elem_table_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
 		BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
 
+		if (CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) {
+			CanFindFreestyle = 1;
+		}
+
 		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");
@@ -1550,6 +1563,10 @@ void lanpr_MakeRenderGeometryBuffersObject(Object *o, real *MVMat, real *MVPMat,
 		rl = orl;
 		for (i = 0; i < bm->totedge; i++) {
 			e = BM_edge_at_index(bm, i);
+			if (CanFindFreestyle) {
+				fe = CustomData_bmesh_get(&bm->edata, e->head.data, CD_FREESTYLE_EDGE);
+				if (fe->flag & FREESTYLE_EDGE_MARK)rl->Flags |= LANPR_EDGE_FLAG_EDGE_MARK;
+			}
 			rl->L = &orv[BM_elem_index_get(e->v1)];
 			rl->R = &orv[BM_elem_index_get(e->v2)];
 			LANPR_RenderLineSegment *rls = memStaticAquire(&rb->RenderDataPool, sizeof(LANPR_RenderLineSegment));
@@ -1572,7 +1589,7 @@ void lanpr_MakeRenderGeometryBuffersObject(Object *o, real *MVMat, real *MVPMat,
 			rt->V[2] = &orv[BM_elem_index_get(loop->v)];
 			rt->RL[2] = &orl[BM_elem_index_get(loop->e)];
 
-			//rt->F = F;
+			rt->F = f;
 			rt->GN[0] = f->no[0];
 			rt->GN[1] = f->no[1];
 			rt->GN[2] = f->no[2];
@@ -1581,7 +1598,7 @@ void lanpr_MakeRenderGeometryBuffersObject(Object *o, real *MVMat, real *MVPMat,
 			tMatVectorAccum3d(rt->GC, rt->V[1]->FrameBufferCoord);
 			tMatVectorAccum3d(rt->GC, rt->V[2]->FrameBufferCoord);
 			tMatVectorMultiSelf3d(rt->GC, 1.0f / 3.0f);
-			tMatApplyNormalTransform43df(rt->GN, MVMat, f->no);
+			tMatApplyNormalTransform43df(rt->GN, Normal, f->no);
 			tMatNormalizeSelf3d(rt->GN);
 			lanpr_AssignRenderLineWithTriangle(rt);
 			//m = tnsGetIndexedMaterial(rb->Scene, f->MaterialID);
@@ -2017,8 +2034,8 @@ int lanpr_TriangleLineImageSpaceIntersectTestOnlyV2(LANPR_RenderTriangle *rt, LA
 	//}
 
 
-	DotLA = fabs(DotL); if (DotLA < DBL_EPSILON) { DotLA = 0; DotL = 0; }
-	DotRA = fabs(DotR); if (DotRA < DBL_EPSILON) { DotRA = 0; DotR = 0; }
+	DotLA = fabs(DotL); if (DotLA < 0) { DotLA = 0; DotL = 0; }
+	DotRA = fabs(DotR); if (DotRA < 0) { DotRA = 0; DotR = 0; }
 	if (DotL - DotR == 0) Cut = 100000;
 	else if (DotL * DotR <= 0) {
 		Cut = DotLA / fabs(DotL - DotR);
@@ -2397,7 +2414,7 @@ int lanpr_LineCrossesFrame(tnsVector2d L, tnsVector2d R) {
 }
 
 void lanpr_ComputeViewVector(LANPR_RenderBuffer *rb) {
-	tnsVector3d Direction = { 0, 0, -1 };
+	tnsVector3d Direction = { 0, 0, 1 };
 	tnsVector3d Trans;
 	tnsMatrix44d inv;
 	tnsMatrix44d obmat;
@@ -2438,6 +2455,11 @@ void lanpr_ComputeSceneContours(LANPR_RenderBuffer *rb) {
 		//if (!lanpr_LineCrossesFrame(rl->L->FrameBufferCoord, rl->R->FrameBufferCoord))
 		//	continue;
 
+		if (rl->Flags & LANPR_EDGE_FLAG_EDGE_MARK) {
+			lstAppendPointerStatic(&rb->EdgeMarks, &rb->RenderDataPool, rl);
+			continue;
+		}
+
 		Add = 0; Dot1 = 0; Dot2 = 0;
 
 		if (c->type == CAM_PERSP) {
@@ -2525,10 +2547,19 @@ void lanpr_DestroyRenderData(LANPR_RenderBuffer *rb) {
 		FreeMem(reln->Pointer);
 	}
 
+	while (reln = lstPopItem(&rb->LineBufferPointers)) {
+		FreeMem(reln->Pointer);
+	}
+
 	while (reln = lstPopItem(&rb->TriangleBufferPointers)) {
 		FreeMem(reln->Pointer);
 	}
 
+	BLI_spin_end(&rb->csData);
+	BLI_spin_end(&rb->csInfo);
+	BLI_spin_end(&rb->csManagement);
+	BLI_spin_end(&rb->RenderDataPool.csMem);
+
 	memStaticDestroy(&rb->RenderDataPool);
 }
 
@@ -2698,7 +2729,7 @@ long lanpr_CountIntersectionSegmentCount(LANPR_RenderBuffer *rb) {
 	}
 	return Count;
 }
-void *lanpr_MakeLeveledEdgeVertexArray(LANPR_RenderBuffer *rb, nListHandle *LineList, float *VertexArray, int qi_begin, int qi_end) {
+void *lanpr_MakeLeveledEdgeVertexArray(LANPR_RenderBuffer *rb, nListHandle *LineList, float *VertexArray, int qi_begin, int qi_end,float componet_id) {
 	nListItemPointer *lip;
 	LANPR_RenderLine *rl;
 	LANPR_RenderLineSegment *rls, *irls;
@@ -2720,97 +2751,19 @@ void *lan

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list