[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