[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20840] branches/nurbs/blender: First pass of Laurynas's Trimming Curve system.

Emmanuel Stone emmanuel.stone at gmail.com
Fri Jun 12 23:02:18 CEST 2009


Revision: 20840
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20840
Author:   eman
Date:     2009-06-12 23:02:17 +0200 (Fri, 12 Jun 2009)

Log Message:
-----------
First pass of Laurynas's Trimming Curve system.
This is incomplete, and does not expose any new functionality (yet).

Modified Paths:
--------------
    branches/nurbs/blender/intern/nurbana/CMakeLists.txt
    branches/nurbs/blender/intern/nurbana/extern/nurbana.h
    branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.cpp
    branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.h
    branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp
    branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.h
    branches/nurbs/blender/intern/nurbana/intern/blenderNurbsStruct.h
    branches/nurbs/blender/intern/nurbana/intern/libNurbana.cpp
    branches/nurbs/blender/source/blender/blenkernel/BKE_displist.h
    branches/nurbs/blender/source/blender/blenkernel/intern/curve.c
    branches/nurbs/blender/source/blender/blenkernel/intern/displist.c
    branches/nurbs/blender/source/blender/blenkernel/intern/mesh.c
    branches/nurbs/blender/source/blender/makesdna/DNA_curve_types.h
    branches/nurbs/blender/source/blender/render/intern/source/convertblender.c
    branches/nurbs/blender/source/blender/src/drawobject.c

Added Paths:
-----------
    branches/nurbs/blender/intern/nurbana/intern/nbGridTessellator.cpp
    branches/nurbs/blender/intern/nurbana/intern/nbGridTessellator.h
    branches/nurbs/blender/intern/nurbana/intern/nbTessellator.cpp
    branches/nurbs/blender/intern/nurbana/intern/nbTessellator.h
    branches/nurbs/blender/intern/nurbana/intern/nbTrimTessellator.cpp
    branches/nurbs/blender/intern/nurbana/intern/nbTrimTessellator.h
    branches/nurbs/blender/intern/nurbana/intern/trim/
    branches/nurbs/blender/intern/nurbana/intern/trim/nbSubDiv.cpp
    branches/nurbs/blender/intern/nurbana/intern/trim/nbSubDiv.h
    branches/nurbs/blender/intern/nurbana/intern/trim/nbTessGrid.cpp
    branches/nurbs/blender/intern/nurbana/intern/trim/nbTessGrid.h
    branches/nurbs/blender/intern/nurbana/intern/trim/nbTrimPatch.cpp
    branches/nurbs/blender/intern/nurbana/intern/trim/nbTrimPatch.h

Modified: branches/nurbs/blender/intern/nurbana/CMakeLists.txt
===================================================================
--- branches/nurbs/blender/intern/nurbana/CMakeLists.txt	2009-06-12 19:13:52 UTC (rev 20839)
+++ branches/nurbs/blender/intern/nurbana/CMakeLists.txt	2009-06-12 21:02:17 UTC (rev 20840)
@@ -28,8 +28,9 @@
 
 SET(INC include)
 
-FILE(GLOB SRC intern/*.cpp intern/opennurbs/*.cpp intern/opennurbs/*.c intern/opennurbs/zlib/*.c)
+FILE(GLOB SRC intern/*.cpp intern/opennurbs/*.cpp intern/opennurbs/*.c intern/opennurbs/zlib/*.c intern/trim/*.cpp)
 
-INCLUDE_DIRECTORIES(../../intern/guardedalloc ./opennurbs ./opennurbs/zlib)
+
+INCLUDE_DIRECTORIES(../../intern/guardedalloc ./opennurbs ./opennurbs/zlib intern/trim)
 BLENDERLIB(bf_nurbana "${SRC}" "${INC}")
 #, libtype=['intern','game','game2','player'], priority = [15, 55, 100, 135] )

Modified: branches/nurbs/blender/intern/nurbana/extern/nurbana.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/extern/nurbana.h	2009-06-12 19:13:52 UTC (rev 20839)
+++ branches/nurbs/blender/intern/nurbana/extern/nurbana.h	2009-06-12 21:02:17 UTC (rev 20840)
@@ -109,6 +109,7 @@
 //extern NurbanaObj_ptr NRB_addObject(Point3d** CtlPts, short* numCPu, short* numCPv, short* orderU, short* orderV, nbReal** knotsU, nbReal** knotsV,  short* cyclicU,  short* cyclicV, short* knottypeu, short* knottypev,  short* resolu,  short* resolv, short* isores, short* isoden, short* isovis) ;
 extern NurbanaObj_ptr NRB_addObject(BlenderNurbs_ptr bNurbs);
 
+
 //extern NurbanaObj_ptr NRB_allocate();
 //extern void NRB_deallocate(NurbanaObj_ptr nop);
 extern void NRB_init(NurbanaObj_ptr nop);
@@ -120,8 +121,10 @@
 
 extern void NRB_changeCyclic(NurbanaObj_ptr nop,int uv);
 
+extern void NRB_getTriangleNormals(float v0[], float v1[], float v2[], float n0[], float n1[], float n2[]);
+extern void NRB_getTrimTess(NurbanaObj_ptr surface, float** vertex, int** index, int* totindex, float** norm);
+extern void NRB_addTrimCurve(NurbanaObj_ptr surface, void* curve);
 
-
 extern void NRB_ResChanged(NurbanaObj_ptr nop );
 extern void NRB_SizeChanged(NurbanaObj_ptr nop, int newU, int newV);
 extern void NRB_UpdateSize(NurbanaObj_ptr nop);
@@ -155,6 +158,13 @@
 extern void NRB_setIsoDensity(NurbanaObj_ptr nop,int den);
 extern nbReal* NRB_getIsoPoints(NurbanaObj_ptr nop, nbReal* buffer);
 
+
+extern int NRB_getTrianIndexCount(NurbanaObj_ptr nop);
+extern int NRB_getQuadIndexCount(NurbanaObj_ptr nop);
+extern void NRB_getTrianIndexes(NurbanaObj_ptr nop, int* indexes);
+extern void NRB_getQuadIndexes(NurbanaObj_ptr nop, int* indexes);
+extern void NRB_getNormals(NurbanaObj_ptr nop, int* qIndexes, int* tIndexes, nbReal* verts, nbReal* nors);
+extern int NRB_getVertexCount(NurbanaObj_ptr nop);
 //extern nbReal* NRB_GenerateSurface(NurbanaObj_ptr nop, nbReal* buffer, int dim );
 extern nbReal* NRB_GenerateSurface(NurbanaObj_ptr nop, nbReal* buffer, int resU, int resV, int dim);
 

Modified: branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.cpp	2009-06-12 19:13:52 UTC (rev 20839)
+++ branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.cpp	2009-06-12 21:02:17 UTC (rev 20840)
@@ -214,3 +214,91 @@
     free(M);
   } //fi
 } //eof NurbanaMath::MultMatrix()
+
+void NurbanaMath::crossProd(nbReal c[], nbReal a[], nbReal b[]) {
+	c[0] = a[1] * b[2] - a[2] * b[1];
+	c[1] = a[2] * b[0] - a[0] * b[2];
+	c[2] = a[0] * b[1] - a[1] * b[0];
+}
+
+void NurbanaMath::calcNormal(nbReal n[], const nbReal o[], const nbReal a[], const nbReal b[]) {
+	nbReal v0[3];
+	nbReal v1[3];
+	//nbReal dotProd[3];
+	nbReal dP = 0;
+	for (int i = 0; i < 3; i++) {
+		v0[i] = a[i] - o[i];
+		v1[i] = b[i] - o[i];
+	}
+	crossProd(n, v1, v0);
+	normalize(n);
+}
+
+float NurbanaMath::getAngleSinSquare(const nbReal o[], const nbReal a[], const nbReal b[]) {
+	nbReal v0[3];
+	nbReal v1[3];
+	//nbReal dotProd[3];
+	nbReal dP = 0;
+	for (int i = 0; i < 3; i++) {
+		v0[i] = a[i] - o[i];
+		v1[i] = b[i] - o[i];
+	}
+	NurbanaMath::normalize(v0);
+	NurbanaMath::normalize(v1);
+	for (int i = 0; i < 3; i++)
+	    dP += v0[i] * v1[i];
+	return 1 - dP * dP;
+}
+
+void NurbanaMath::vectAdd(nbReal to[], const nbReal vect[]) {
+	to[0] += vect[0];
+	to[1] += vect[1];
+	to[2] += vect[2];
+}
+void NurbanaMath::normalize(nbReal a[]) {
+	//TODO take code from blender
+	nbReal d = a[0] * a[0] + a[1] * a[1] + a[2] * a[2];
+	if(d>1.0e-15F) {
+		d = (nbReal)sqrt(d);
+		a[0] /= d;
+		a[1] /= d;
+		a[2] /= d;
+	} else {
+		a[0] = a[1] = a[2] = 0;
+		printf("zero normal\n");
+	}
+}
+
+void NurbanaMath::getTriangleNormals(const float v0[], const float v1[], const float v2[], float n0[], float n1[], float n2[]) {
+	const nbReal* corners[3] = {&v0[0], &v1[0], &v2[0]};//, verts + indexes[i + 3] * 3};
+	nbReal *(normals[3]) = {n0, n1, n2};
+	nbReal normal[3];
+	NurbanaMath::calcNormal(normal, corners[0], corners[2], corners[1]);
+	for (unsigned corner = 0; corner < 3; corner++) {
+		nbReal coef = NurbanaMath::getAngleSinSquare(corners[0], corners[2], corners[1]);
+		for (int j = 0; j < 3; j++)
+			normals[corner][j]+=normal[j]*coef;
+
+		const nbReal *tmp = corners[0];
+		for (unsigned j = 1; j < 3; j++)
+			corners[j - 1] = corners[j];
+		corners[2] = tmp;
+	}	
+}
+
+void NurbanaMath::getQuadNormals(const float v0[], const float v1[], const float v2[], const float v3[], float n0[], float n1[], float n2[], float n3[]) {
+	const nbReal* corners[4] = {&v0[0], &v1[0], &v2[0], &v3[0]};//, verts + indexes[i + 3] * 3};
+	nbReal *(normals[4]) = {n0, n1, n2, n3};
+	nbReal normal[3];
+	for (unsigned corner = 0; corner < 4; corner++) {
+		NurbanaMath::calcNormal(normal, corners[0], corners[2], corners[1]);
+		nbReal coef = 1;//NurbanaMath::getAngleSinSquare(corners[0], corners[2], corners[1]);
+		for (int j = 0; j < 3; j++)
+			normals[corner][j]+=normal[j]*coef;
+
+		const nbReal *tmp = corners[0];
+		for (unsigned j = 1; j < 4; j++)
+			corners[j - 1] = corners[j];
+		corners[3] = tmp;
+	}	
+}

Modified: branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.h
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.h	2009-06-12 19:13:52 UTC (rev 20839)
+++ branches/nurbs/blender/intern/nurbana/intern/NurbanaMath.h	2009-06-12 21:02:17 UTC (rev 20840)
@@ -45,6 +45,14 @@
     
     static  void convertTo4D(nbReal4& point);
     static  void projectTo3D(nbReal4& point);
+    
+    static void crossProd(nbReal c[], nbReal a[], nbReal b[]);
+	static void calcNormal(nbReal n[], const nbReal o[], const nbReal a[], const nbReal b[]);
+	static void vectAdd(nbReal to[], const nbReal vect[]);
+	static void normalize(nbReal a[]);
+	static float getAngleSinSquare(const nbReal o[], const nbReal a[], const nbReal b[]);
+	static void getTriangleNormals(const float v0[], const float v1[], const float v2[], float n0[], float n1[], float n2[]);
+	static void getQuadNormals(const float v0[], const float v1[], const float v2[], const float v3[], float n0[], float n1[], float n2[], float n3[]);
 
     static	void	IdentityMatrix(nbReal *M, int S);
     static	void	InvertMatrix(nbReal *M, int S);

Modified: branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp
===================================================================
--- branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp	2009-06-12 19:13:52 UTC (rev 20839)
+++ branches/nurbs/blender/intern/nurbana/intern/Object_NURBS.cpp	2009-06-12 21:02:17 UTC (rev 20840)
@@ -1,26 +1,9 @@
 #include "Object_NURBS.h"
-/*
-Object_NURBS::Object_NURBS(Point3d** CtlPts, short* numCPu, short* numCPv, short *orderU, short *orderV, nbReal** knotsU, nbReal** knotsV,short* flagU, short* flagV, short* knotTypeU, short* knotTypeV, short* resolu, short* resolv, short* isores, short* isoden, short* isovis) {//: Object_Base(CtlPts, numCPu, numCPv, resolu, resolv, isores, isoden) {
-//	int	i;
-	m_recalculateKnotVectorU = m_recalculateKnotVectorU = false;
-	m_change[0]= m_change[1]= 0;
-	m_recalculateKnotVector= 0;//_FlagUV[0]= _FlagUV[1]= 0;
-	
-	m_sumIPC[0] = NULL;
-	m_sumIPC[1] = NULL;
-	
-	m_ctlPtsOld = NULL;
-	m_oldBuffer = NULL;
-	m_sum = NULL;
-	
-	if (m_blenderData->m_pntsuv[0] + m_blenderData->m_pntsuv[1]) {
-		SetCacheBuffer();
-		ResetIsoLines();
-	}
-	//_Normals= (nbReal3*)MEM_callocN(sizeof(nbReal3)*(2*OBJECT_MAX_DENSITY*OBJECT_MAX_DENSITY),"_Normals");
 
-} //eof Object_NURBS::Object_NURBS()
-*/
+#include "nbGridTessellator.h"
+#include "nbTrimTessellator.h"
+
+
 Object_NURBS::Object_NURBS(){
 	m_blenderData = NULL;
 /*	m_next = NULL;
@@ -65,6 +48,7 @@
 	m_sumIPC[0] = NULL;
 	m_sumIPC[1] = NULL;
 }
+
 Object_NURBS::Object_NURBS(BlenderNurbs *bNurbs){
 	m_blenderData = bNurbs;
 	/*m_next = bNurbs->m_next;
@@ -114,7 +98,46 @@
 		ResetIsoLines();
 	}
 
+	//m_trimCurve = (Nurb**)trimCurve;
+	if (m_blenderData->m_trimCurve) { 
+		tsslltr = new nbTrimTessellator(*this);
+		tsslltr->update();
+	} else {
+		tsslltr = new nbGridTessellator(*this);
+	}
 }
+
+
+
+
+
+nbPolygon& Object_NURBS::getTess(nbPolygon& p) {
+	unsigned int c2[][3]= {
+//			{0.5, 0.5}, {0.7, 0.5}, {0.7, 0.7}, {0.5, 0.7}
+			{-1, -1}, {10, -1}, {10, 10}, {-1, 10}
+	};
+	nbPolygon p2;
+	unsigned pntCount = getLength(0, false) * m_blenderData->m_resoluv[0];
+	float (*array)[3] = new float[pntCount][3];
+	float *tess = &array[0][0];
+	NURBS_Generate::Curve(this, tess, NULL, NULL, pntCount, false);
+	p2.setCoords(array, pntCount);
+	p2.close();
+	p.merge(p2);
+	return p; //FIXME eman check correct
+}
+
+void Object_NURBS::addTrimCurve(Nurb* curve) {
+	if (!m_blenderData->m_trimCurve) {
+		if (tsslltr)
+			delete tsslltr;
+		tsslltr = new nbTrimTessellator(*this);
+	} else {
+		//TODO reomove old curve
+	}
+	m_blenderData->m_trimCurve = curve;
+}
+
 Object_NURBS::~Object_NURBS() {
 /*  if(m_sum)
 		MEM_freeN(m_sum);
@@ -130,11 +153,13 @@
 
 void Object_NURBS::ResetIsoLines()
 {
+
 	if(m_sumIPC[0])
 		MEM_freeN(m_sumIPC[0]);	
 	if(m_sumIPC[1])
 		MEM_freeN(m_sumIPC[1]);	
 
+
 	if(m_blenderData->m_isovis)
 	{
 		m_sumIPC[0] = (nbReal*)MEM_mallocN(sizeof(nbReal)*IPCTotPts(), "m_sumIPC[0]");
@@ -156,15 +181,17 @@
 		if(m_blenderData->m_knotsuv[0])
 			MEM_freeN(m_blenderData->m_knotsuv[0]);
 		m_blenderData->m_knotsuv[0] = newKnotVector;
-	}	
+	}
 }
 
 void Object_NURBS::SetCacheBuffer() {
 	int U = iGetLength(0);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list