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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs