[Bf-blender-cvs] [48e17cea96b] soc-2018-npr: Adding software render functions. don't compile!

Nick Wu noreply at git.blender.org
Tue Jun 19 05:29:08 CEST 2018


Commit: 48e17cea96b786e037914418c2d39a7efbe8454a
Author: Nick Wu
Date:   Tue Jun 19 11:27:53 2018 +0800
Branches: soc-2018-npr
https://developer.blender.org/rB48e17cea96b786e037914418c2d39a7efbe8454a

Adding software render functions. don't compile!

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

M	source/blender/draw/engines/lanpr/lanpr_all.h
A	source/blender/draw/engines/lanpr/lanpr_software_render.c
M	source/blender/editors/render/render_intern.h
M	source/blender/editors/render/render_ops.c
M	source/blender/makesdna/DNA_lanpr_types.h
M	source/blender/makesdna/DNA_scene_types.h

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 64fc27b7407..f1cde2176cf 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -222,11 +222,110 @@ typedef struct tnsRenderTaskInfo {
 
 } tnsRenderTaskInfo;
 
+/* Below ported from NUL_TNS.h */
+
+struct LANPR_RenderBuffer {
+	LANPR_RenderBuffer *prev, *next;
+
+	nSafeString*       Name;
+
+	tnsFrameBuffer*    FrameBuffer;
+
+	tnsBoundingArea*   InitialBoundingAreas;
+	//u32bit             BoundingAreaCount;
+	//u32bit             BaVBO;
+	//u32bit           BaFillVBO;
+
+	ListBase           VertexBufferPointers;
+	ListBase           TriangleBufferPointers;
+	
+	ListBase           AllRenderLines;
+
+	//nListHandle     IntersectingVertexBuffer;
+
+    /* BLI_xx equ? */
+	nStaticMemoryPool  RenderDataPool;
+
+	//render status
+
+	real            ViewVector[3];
+
+	int             TriangleSize;
+
+	u32bit          ContourCount;
+	u32bit          ContourProcessed;
+	nListItemPointer* ContourManaged;
+	ListBase        Contours;
+
+	u32bit          IntersectionCount;
+	u32bit          IntersectionProcessed;
+	nListItemPointer* IntersectionManaged;
+	ListBase        IntersectionLines;
+
+	u32bit          CreaseCount;
+	u32bit          CreaseProcessed;
+	nListItemPointer* CreaseManaged;
+	ListBase        CreaseLines;
+
+	u32bit          MaterialLineCount;
+	u32bit          MaterialProcessed;
+	nListItemPointer* MaterialManaged;
+	ListBase        MaterialLines;
+
+	//CRITICAL_SECTION csInfo;
+	//CRITICAL_SECTION csData;
+	//CRITICAL_SECTION csManagement;
+
+	//settings
+
+	//int             OutputTransparent;
+	//real            BackgroundColor[4];
+
+	int             MaxOccludeLevel;
+	real            CreaseAngle;
+	real            CreaseCos;
+	int             CreaseAllowOverride;
+	int             ThreadCount;
+	
+	real            OverallProgress;
+	int             CalculationStatus;
+
+	int             DrawMaterialPreview;
+	real            MaterialTransparency;
+
+	int             ShowLine;
+	int             ShowFast;
+	int             ShowMaterial;
+	int             OverrideDisplay;
+
+	ListBase        DrawCommands;
+
+	//tnsRenderBufferPreviewNode RenderPreview[32];
+
+	Scene*          Scene;
+	//tnsCamera* Camera;
+
+	//tnsRenderTriangles are in mesh object.
+}LANPR_RenderBuffer;
+
 
 extern RenderEngineType DRW_engine_viewport_lanpr_type;
 
 
 
+#define LANPR_MASTER_MODE_DPIX         0
+#define LANPR_MASTER_MODE_SNAKE        1
+
+#define LANPR_POST_PROCESSING_DISABLED 0
+#define LANPR_POST_PROCESSING_ENABLED  1
+
+#define LANPR_USE_DIFFERENT_TAPER      0
+#define LANPR_USE_SAME_TAPER           1
+
+#define LANPR_DISABLE_TIP_EXTEND       0
+#define LANPR_ENABLE_TIP_EXTEND        1
+
+
 
 #define TNS_TILE(tile,r,c,CCount)\
 tile[r*CCount+c]
diff --git a/source/blender/draw/engines/lanpr/lanpr_software_render.c b/source/blender/draw/engines/lanpr/lanpr_software_render.c
new file mode 100644
index 00000000000..9986b922af2
--- /dev/null
+++ b/source/blender/draw/engines/lanpr/lanpr_software_render.c
@@ -0,0 +1,158 @@
+#include "NUL4.h"
+#include "NUL_Util.h"
+#include "NUL_TNS.h"
+#include "tinycthread.h"
+#include "png.h"
+
+#include <math.h>
+
+/*
+
+Ported from NUL4.0
+
+Author(s):WuYiming - xp8110 at outlook.com
+
+*/
+
+void lanpr_make_render_buffers_recursive(tns3DObject* o,real* MVMat,real* MVPMat,tnsRenderBuffer* rb, real HeightMultiply){
+	tns3DObject* oc;
+	tnsMeshObject* mo;
+	tnsVert* v;
+	tnsFace* f;
+	tnsEdge* e;
+	tnsRenderTriangle* rt;
+	tnsMatrix44d NewMVP;
+	tnsMatrix44d NewMV;
+	tnsFrameBuffer* fb = rb->FrameBuffer;
+	tnsRenderElementLinkNode* reln;
+	tnsCamera* c = rb->Scene->ActiveCamera;
+	tnsMaterial* m;
+
+	//if (o->RenderTriangles) FreeMem(o->RenderTriangles);
+	//if (o->RenderVertices) FreeMem(o->RenderVertices);
+
+	tMatMultiply44d(NewMVP, MVPMat, o->SelfTransform);
+	tMatMultiply44d(NewMV, MVMat, o->SelfTransform);
+
+	if (o->Type == TNS_OBJECT_MESH) {
+		mo = o;
+		o->RenderVertices = CreateNewBuffer(tnsRenderVert, mo->numV);
+		o->RenderTriangles = calloc(mo->TriangleCount, rb->TriangleSize);//CreateNewBuffer(tnsRenderTriangle, mo->TriangleCount);
+		//o->RenderLines = CreateNewBuffer(tnsRenderLine, mo->TriangulatedEdgeCount);
+
+		reln = lstAppendPointerStaticSized(&rb->VertexBufferPointers, &rb->RenderDataPool, o->RenderVertices,
+			sizeof(tnsRenderElementLinkNode));
+		reln->ElementCount = mo->numV;
+		reln->ObjectRef = mo;
+
+		reln = lstAppendPointerStaticSized(&rb->TriangleBufferPointers, &rb->RenderDataPool, o->RenderTriangles,
+			sizeof(tnsRenderElementLinkNode));
+		reln->ElementCount = mo->TriangleCount;
+		reln->ObjectRef = mo;
+
+		for (v = mo->V.pFirst; v; v = v->Item.pNext) {
+			tRdrTransformRenderVert(v, o->RenderVertices, NewMV, NewMVP,c);//,HeightMultiply,c->ZMin,c->ZMax);
+			tObjRecalculateVertNormal(v);
+		}
+
+		for (e = mo->E.pFirst; e; e = e->Item.pNext) {
+			tnsRenderLine* rl = memStaticAquire(&rb->RenderDataPool, sizeof(tnsRenderLine));
+			rl->L = e->VL->RV;
+			rl->R = e->VR->RV;
+			e->RenderLine = rl;
+			tnsRenderLineSegment* rls = memStaticAquire(&rb->RenderDataPool, sizeof(tnsRenderLineSegment));
+			lstAppendItem(&rl->Segments, rls);
+			lstAppendItem(&rb->AllRenderLines, rl);
+		}
+
+
+		rt = o->RenderTriangles;
+		for (f = mo->F.pFirst; f; f = f->Item.pNext) {
+			tObjRecalculateFaceAverageNormal(f);
+			tObjSimpleTriangulateRender(f, rt, rb->TriangleSize, o->RenderVertices, &rb->AllRenderLines, &rt, &rb->RenderDataPool);
+			// already done in the func above. tRdrCalculateRenderTriangleNormal(rt);
+			tMatApplyNormalTransform43d(f->GNormal, MVMat, f->FaceNormal);
+			tMatNormalizeSelf3d(f->GNormal);
+			m = tnsGetIndexedMaterial(rb->Scene, f->MaterialID);
+			//if(m) m->PreviewVCount += (f->TriangleCount*3);
+		}
+	}
+
+	for (oc = o->ChildObjects.pFirst; oc; oc = oc->Item.pNext) {
+		tRdrMakeRenderGeometryBuffersRecursive(oc, NewMV, NewMVP, rb, HeightMultiply);
+	}
+}
+void lanpr_make_render_buffers(tnsScene* s,tnsCamera* c, tnsRenderBuffer* rb, int HeightMultiply) {
+	tns3DObject* o;
+	tnsMatrixStackItem* tmsi = tKnlGetCurrentMatStackItem();
+	tnsShader* current_shader = 0;
+	tnsMatrix44d proj,view,result, inv;
+	tnsFrameBuffer* fb = rb->FrameBuffer;
+
+	if (!c) return;
+
+	memset(rb->Scene->MaterialPointers, 0, sizeof(void*) * 2048);
+
+	real asp = ((real)fb->W / (real)fb->H);
+
+	if (c->CameraType == TNS_CAMERA_PERSPECTIVE) {
+		tMatMakePerspectiveMatrix44d(proj, c->FOV, asp, c->ZMin, c->ZMax);
+	}elif(c->CameraType == TNS_CAMERA_ORTHO) {
+		real w = c->OrthScale;
+		tMatMakeOrthographicMatrix44d(proj, -w, w, -w / asp, w / asp, c->ZMin, c->ZMax);
+	}
+
+	tMatLoadIdentity44d(view);
+
+	tObjApplySelfTransformMatrix(c, 0);
+	tObjApplyGlobalTransformMatrixReverted(c);
+	tMatInverse44d(inv, c->Base.GlobalTransform);
+	tMatMultiply44d(result, proj, inv);
+	memcpy(proj, result, sizeof(tnsMatrix44d));
+	memcpy(fb->ViewProjection, proj, sizeof(tnsMatrix44d));
+
+	tMatInverse44d(fb->VPInverse, fb->ViewProjection);
+
+	void* a;
+	while (a = lstPopPointer(&rb->TriangleBufferPointers)) FreeMem(a);
+	while (a = lstPopPointer(&rb->VertexBufferPointers)) FreeMem(a);
+
+	for (o = s->Objects.pFirst; o; o = o->Item.pNext) {
+		//tObjApplyGlobalTransformMatrixRecursive(o);
+		lanpr_make_render_buffers_recursive(o, view, proj, rb, (real)HeightMultiply);
+	}
+}
+
+static int lanpr_compute_feature_lines_exec(bContext *C, wmOperator *op, const wmEvent *event){
+	tnsRenderBuffer* rb = a->This->EndInstance;
+	thrd_t SeperateThread;
+
+	if (!rb || !rb->Scene || !rb->Scene->ActiveCamera) {
+		return OPERATOR_CANCELLED;
+	}
+
+	rb->TriangleSize = tRdrGetRenderTriangleSize(rb);
+
+	thrd_create(&SeperateThread, THREAD_ComputeFeatureLines, rb);
+
+	return OPERATOR_FINISHED;
+}
+
+static void lanpr_compute_feature_lines_cancel(bContext *C, wmOperator *op){
+    return;
+}
+
+
+void SCENE_OT_lanpr_calculate_feature_lines(struct wmOperatorType* ot){
+
+	/* identifiers */
+	ot->name = "Calculate Feature Lines";
+	ot->description = "LANPR calculates feature line in current scene";
+	ot->idname = "SCENE_OT_lanpr_calculate";
+
+	/* api callbacks */
+	//ot->invoke = screen_render_invoke; /* why we need both invoke and exec? */
+	//ot->modal = screen_render_modal;
+	ot->cancel = lanpr_compute_feature_lines_cancel;
+	ot->exec = lanpr_compute_feature_lines;
+}
\ No newline at end of file
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h
index d7b92c00ed4..b2a2ecaf9b5 100644
--- a/source/blender/editors/render/render_intern.h
+++ b/source/blender/editors/render/render_intern.h
@@ -79,6 +79,9 @@ void SCENE_OT_freestyle_modifier_copy(struct wmOperatorType *ot);
 void SCENE_OT_freestyle_stroke_material_create(struct wmOperatorType *ot);
 #endif
 
+/* lanpr: lanpr_software_render.c */
+void SCENE_OT_lanpr_calculate_feature_lines(struct wmOperatorType* ot);
+
 
 void TEXTURE_OT_slot_copy(struct wmOperatorType *ot);
 void TEXTURE_OT_slot_paste(struct wmOperatorType *ot);
diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c
index dd5ed5b78f1..b466e9e1277 100644
--- a/source/blender/editors/render/render_ops.c
+++ b/source/blender/editors/render/render_ops.c
@@ -82,6 +82,9 @@ void ED_operatortypes_render(void)
 	WM_operatortype_append(SCENE_OT_freestyle_stroke_material_create);
 #endif
 
+    /* lanpr:  */
+    WM_operatortype_append(SCENE_OT_lanpr_calculate_feature_lines);
+
 	WM_operatortype_append(TEXTURE_OT_slot_copy);
 	WM_operatortype_append(TEXTURE_OT_slot_paste);
 	WM_operatortype_append(TEXTURE_OT_slot_move);
diff --git a/source/blender/makesdna/DNA_lanpr_types.h b/source/blender/makesdna/DNA_lanpr_types.h
index 0db9b999e92..e35311039ab 100644
--- a/source/blender/makesdna/DNA_lanpr_types.h
+++ b/source/blender/makesdna/DNA_lanpr_types.h
@@ -35,29 +35,39 @@
 //#include "DNA_listBase.h"
 //#include "DNA_ID.h"
 
-#define LANPR_MASTER_MODE_DPIX         0
-#define LANPR_MASTER_MODE_SNAKE        1
+struct Object;
+struct Material;
+struct Collection;
 
-#define LANPR_POST_PROCESSING_DISABLED 0
-#define LANPR_POST_PROCESSING_ENABLED  1
+typedef struct LANP

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list