[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12455] branches/qdune/blender: Added support for subsurf orco coords, but still doesn't work properly

Alfredo de Greef eeshlo at yahoo.com
Fri Nov 2 09:42:04 CET 2007


Revision: 12455
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12455
Author:   eeshlo
Date:     2007-11-02 09:42:04 +0100 (Fri, 02 Nov 2007)

Log Message:
-----------
Added support for subsurf orco coords, but still doesn't work properly
yet. Some problem in Blender, qdune itself seems to work correctly
with vertex/varying (but still only linear interpolation though).
Multi UV textures now work correctly on subsurf too.

Modified Paths:
--------------
    branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
    branches/qdune/blender/extern/qdune/core/qdVector.h
    branches/qdune/blender/extern/qdune/mpgrid/MicroPolygonGrid.cpp
    branches/qdune/blender/extern/qdune/primitives/CCSubdivision.cpp
    branches/qdune/blender/extern/qdune/primitives/CCSubdivision.h
    branches/qdune/blender/extern/qdune/primitives/Curves.cpp
    branches/qdune/blender/extern/qdune/primitives/Polygons.cpp
    branches/qdune/blender/extern/qdune/primitives/Primitive.cpp
    branches/qdune/blender/extern/qdune/primitives/Primitive.h
    branches/qdune/blender/extern/qdune/qdtl/qdtl.h
    branches/qdune/blender/extern/qdune/ribparse/ribInterface.cpp
    branches/qdune/blender/extern/qdune/svm/ImageTextures.cpp
    branches/qdune/blender/extern/qdune/svm/shaderVM.cpp
    branches/qdune/blender/source/blender/render/intern/source/convertblender.c
    branches/qdune/blender/source/blender/render/intern/source/qdinterface.c

Modified: branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp	2007-11-02 03:00:35 UTC (rev 12454)
+++ branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp	2007-11-02 08:42:04 UTC (rev 12455)
@@ -47,8 +47,7 @@
 	RtVector *win = NULL, *windu = NULL, *windv = NULL;
 	RtVector *sticky = NULL, *stickydu = NULL, *stickydv = NULL;
 	RtFloat *stress = NULL;
-	//RtVector *uv[8], *uvdu[8], *uvdv[8];
-	RtFloat *uv_s[8], *uv_t[8], *uv_s_du[8], *uv_s_dv[8], *uv_t_du[8], *uv_t_dv[8];
+	RtVector *uv[8], *uvdu[8], *uvdv[8];
 	float du, dv, *material;
 	char uvtoken[128];
 	int a, i, n, texco, mode, xdim, ydim, matidx;
@@ -119,7 +118,6 @@
 		grid->DvF(dystrand, strandco);
 	}
 
-	/*
 	memset(uv, 0, sizeof(RtVector*)*8);
 	memset(uvdu, 0, sizeof(RtVector*)*8);
 	memset(uvdv, 0, sizeof(RtVector*)*8);
@@ -140,44 +138,7 @@
 			}
 		}
 	}
-	*/
-	memset(uv_s, 0, sizeof(RtFloat*)*8);
-	memset(uv_t, 0, sizeof(RtFloat*)*8);
-	memset(uv_s_du, 0, sizeof(RtFloat*)*8);
-	memset(uv_s_dv, 0, sizeof(RtFloat*)*8);
-	memset(uv_t_du, 0, sizeof(RtFloat*)*8);
-	memset(uv_t_dv, 0, sizeof(RtFloat*)*8);
-	if(texco & TEXCO_UV) {
-		for(a=0; a<8; a++) {
-			// very temporary hack, so that uv works when using one uv tex. (subd.mesh currently only knows 's' & 't' names)
-			if (a == 0)
-				sprintf(uvtoken, "s");
-			else
-				sprintf(uvtoken, "s%d", a);
-			uv_s[a] = grid->findVariable(uvtoken);
-			if (a == 0)
-				sprintf(uvtoken, "t");
-			else
-				sprintf(uvtoken, "t%d", a);
-			uv_t[a] = grid->findVariable(uvtoken);
 
-			if ((uv_s[a] == NULL) || (uv_t[a] == NULL))
-				break;
-
-			if(shi.osatex) {
-				uv_s_du[a] = new RtFloat[n];
-				uv_s_dv[a] = new RtFloat[n];
-				uv_t_du[a] = new RtFloat[n];
-				uv_t_dv[a] = new RtFloat[n];
-
-				grid->DuF(uv_s_du[a], uv_s[a]);
-				grid->DvF(uv_s_dv[a], uv_s[a]);
-				grid->DuF(uv_t_du[a], uv_t[a]);
-				grid->DvF(uv_t_dv[a], uv_t[a]);
-			}
-		}
-	}
-
 	if(texco & TEXCO_STRESS)
 		stress = (float*)grid->findVariable("stress");
 
@@ -309,7 +270,6 @@
 		if(texco & TEXCO_UV) {
 			shi.totuv= 0;
 
-			/*
 			for(a=0; a<8; a++) {
 				if(uv[a]) {
 					ShadeInputUV *suv= &shi.uv[a];
@@ -332,30 +292,7 @@
 					}
 				}
 			}
-			*/
-			for(a=0; a<8; a++) {
-				if (uv_s[a] && uv_t[a]) {
-					ShadeInputUV *suv = &shi.uv[a];
 
-					shi.totuv++;
-					suv->name= "";
-
-					suv->uv[0]= -1.0f + 2.0f*uv_s[a][i];
-					suv->uv[1]= -1.0f + 2.0f*uv_t[a][i];
-					suv->uv[2]= 0.0f;
-
-					if(shi.osatex) {
-						suv->dxuv[0]= 2.0f*uv_s_du[a][i]*du;
-						suv->dxuv[1]= 2.0f*uv_t_du[a][i]*du;
-						suv->dxuv[2]= 0.0f;
-
-						suv->dyuv[0]= 2.0f*uv_s_dv[a][i]*dv;
-						suv->dyuv[1]= 2.0f*uv_t_dv[a][i]*dv;
-						suv->dyuv[2]= 0.0f;
-					}
-				}
-			}
-
 			if(shi.totuv == 0) {
 				ShadeInputUV *suv= &shi.uv[0];
 				float u, v;
@@ -469,14 +406,8 @@
 	if(dystrand) delete [] dystrand;
 
 	for(a=0; a<8; a++) {
-		if (uv_s_du[a]) {
-			delete [] uv_s_du[a];
-			delete [] uv_s_dv[a];
-		}
-		if (uv_t_du[a]) {
-			delete [] uv_t_du[a];
-			delete [] uv_t_dv[a];
-		}
+		if (uvdu[a]) delete[] uvdu[a];
+		if (uvdv[a]) delete[] uvdv[a];
 	}
 #endif
 }

Modified: branches/qdune/blender/extern/qdune/core/qdVector.h
===================================================================
--- branches/qdune/blender/extern/qdune/core/qdVector.h	2007-11-02 03:00:35 UTC (rev 12454)
+++ branches/qdune/blender/extern/qdune/core/qdVector.h	2007-11-02 08:42:04 UTC (rev 12455)
@@ -17,6 +17,8 @@
 	Vector():x(0), y(0), z(0) {}
 	explicit Vector(float a):x(a), y(a), z(a) {}
 	explicit Vector(float a, float b, float c):x(a), y(b), z(c) {}
+	// ctor from array (RtVec/etc)
+	Vector(float* va) : x(va[0]), y(va[1]), z(va[2]) {}
 	Vector(const Vector &v):x(v.x), y(v.y), z(v.z) {}
 	// dtor
 	~Vector() {}
@@ -32,7 +34,6 @@
 	}
 	float lengthSquared() const { return x*x + y*y + z*z; }
 
-
 	// dotproduct, also as operator* below
 	float operator|(const Vector &v) const { return x*v.x + y*v.y + z*v.z; }
 	float dot(const Vector &v) const { return x*v.x + y*v.y + z*v.z; }
@@ -100,6 +101,7 @@
 	Vector scale(const Vector &v) const { return Vector(v.x*x, v.y*y, v.z*z); }
 
 	// access as array
+	float* asArray() { return xyz; }
 	float operator[](int i) const { return xyz[i]; }
 	float& operator[](int i) { return xyz[i]; }
 	// data

Modified: branches/qdune/blender/extern/qdune/mpgrid/MicroPolygonGrid.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/mpgrid/MicroPolygonGrid.cpp	2007-11-02 03:00:35 UTC (rev 12454)
+++ branches/qdune/blender/extern/qdune/mpgrid/MicroPolygonGrid.cpp	2007-11-02 08:42:04 UTC (rev 12455)
@@ -541,6 +541,7 @@
 						if (globit & (GB_s | GB_t | GB_u | GB_v | GB_du | GB_dv)) {
 							float uvl[4];
 							parent->get_uvlim(uvl);
+							const float ud = (uvl[1] - uvl[0]), vd = (uvl[3] - uvl[2]);
 							if (globit & (GB_s | GB_t | GB_u | GB_v)) {
 								const float du = 1.f/float(xdim), dv = 1.f/float(ydim);
 								unsigned int ug, vg, idx = 0;
@@ -548,17 +549,17 @@
 									float u;
 									for (vg=0; vg<=ydim; ++vg)
 										for (ug=0, u=0.f; ug<=xdim; ++ug, u+=du, ++idx)
-											fg[idx] = uvl[0] + u*(uvl[1] - uvl[0]);
+											fg[idx] = uvl[0] + u*ud;
 								}
 								else {	// GB_t | GB_v
 									float v;
 									for (vg=0, v=0.f; vg<=ydim; ++vg, v+=dv)
 										for (ug=0; ug<=xdim; ++ug, ++idx)
-											fg[idx] = uvl[2] + v*(uvl[3] - uvl[2]);
+											fg[idx] = uvl[2] + v*vd;
 								}
 							}
 							else {	// du | dv (currently are actually uniform per grid, not varying TODO)
-								const float du = (uvl[1] - uvl[0])/float(xdim), dv = (uvl[3] - uvl[2])/float(ydim);
+								const float du = ud/float(xdim), dv = vd/float(ydim);
 								for (unsigned int i=0; i<nverts; ++i)
 									fg[i] = (globit & GB_du) ? du : dv;
 							}

Modified: branches/qdune/blender/extern/qdune/primitives/CCSubdivision.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/primitives/CCSubdivision.cpp	2007-11-02 03:00:35 UTC (rev 12454)
+++ branches/qdune/blender/extern/qdune/primitives/CCSubdivision.cpp	2007-11-02 08:42:04 UTC (rev 12455)
@@ -95,64 +95,70 @@
 typedef fsArray_t<ccEdge>::iterator EdgeIter;
 typedef fsArray_t<ccEdge>::const_iterator EdgeConstIter;
 
-// ugly macros... needs better implementation TODO
-
-// macro to make new edgelist in rebuildList() and makeExplicitSDPatch()
+// helper function to make new edgelist in rebuildList() and makeExplicitSDPatch()
 // Also updates edge ptrs in vert_list, face ptrs in edge_list,
-// vice versa, edges in face list as well, but as indices,
-// this makes mesh recontruction simpler,
+// vice versa, edges in face list as well, but as indices, this makes mesh recontruction simpler,
 // (in face list, verts & edges are in ccw order)
-#define SET_EDGE(_edge_list, _i1, _i2, _vert_list, _face_list, _num_verts, _fc_idx)\
-{\
-	unsigned int _idx1=_i1, _idx2=_i2;\
-	if (_idx1 > _idx2) SWAP(_idx1, _idx2);\
-	unsigned int e_idx = *edge_id.find(_idx1 + (uint64)_num_verts*_idx2);\
-	ccFace* f = &_face_list[_fc_idx];\
-	f->edges.push_back(e_idx);\
-	E = &_edge_list[e_idx];\
-	E->v1 = &_vert_list[_i1], E->v2 = &_vert_list[_i2];\
-	if (E->v1->edges.size() == 0) {\
-		const array_t<int>* eiv = *edge_verts.find(E->v1);\
-		for (array_t<int>::const_iterator ei=eiv->begin(); ei!=eiv->end(); ++ei)\
-			E->v1->edges.push_back(&_edge_list[*ei]);\
-	}\
-	if (E->v2->edges.size() == 0) {\
-		const array_t<int>* eiv = *edge_verts.find(E->v2);\
-		for (array_t<int>::const_iterator ei=eiv->begin(); ei!=eiv->end(); ++ei)\
-			E->v2->edges.push_back(&_edge_list[*ei]);\
-	}\
-	E->faces.push_back(f);\
+// returns the edge corresponding to the vertex indices _i1 & _i2
+inline ccEdge* SET_EDGE(aatree_t<uint64, unsigned int>& edge_id,
+                       hashtable_t<const ccVert*, array_t<int>* >& edge_verts,
+                       const fsArray_t<ccEdge>& _edge_list, unsigned int _i1, unsigned int _i2,
+                       const fsArray_t<ccVert>& _vert_list, const fsArray_t<ccFace>& _face_list,
+                       unsigned int _num_verts, unsigned int _fc_idx)
+{
+	unsigned int _idx1=_i1, _idx2=_i2;
+	if (_idx1 > _idx2) SWAP(_idx1, _idx2);
+	unsigned int e_idx = *edge_id.find(_idx1 + (uint64)_num_verts*_idx2);
+	ccFace* f = &_face_list[_fc_idx];
+	f->edges.push_back(e_idx);
+	ccEdge* E = &_edge_list[e_idx];
+	E->v1 = &_vert_list[_i1], E->v2 = &_vert_list[_i2];
+	if (E->v1->edges.size() == 0) {
+		const array_t<int>* eiv = *edge_verts.find(E->v1);
+		for (array_t<int>::const_iterator ei=eiv->begin(); ei!=eiv->end(); ++ei)
+			E->v1->edges.push_back(&_edge_list[*ei]);
+	}
+	if (E->v2->edges.size() == 0) {
+		const array_t<int>* eiv = *edge_verts.find(E->v2);
+		for (array_t<int>::const_iterator ei=eiv->begin(); ei!=eiv->end(); ++ei)
+			E->v2->edges.push_back(&_edge_list[*ei]);
+	}
+	E->faces.push_back(f);
+	return E;
 }
 
-// macro to prepare for edge list initialization
-// determines new number of edges & initializes hashtables
-#define INIT_EDGES(_vert_list, _face_list, _num_verts, _num_faces, _num_edges)\
-	aatree_t<uint64, unsigned int> edge_id;\
-	hashtable_t<const ccVert*, array_t<int>* > edge_verts;\
-	_num_edges = 0;\
-	for (unsigned int fi=0; fi<_num_faces; ++fi) {\
-		ccFace* f = &_face_list[fi];\
-		const array_t<int>& fcverts = f->verts;\
-		const unsigned int nv = fcverts.size();\
-		for (unsigned int vi=0; vi<nv; ++vi) {\
-			unsigned int ri1 = fcverts[vi], ri2 = fcverts[(vi+1) % nv];\
-			unsigned int idx1 = ri1, idx2 = ri2;\
-			if (idx1 > idx2) SWAP(idx1, idx2);\
-			uint64 ID = idx1 + (uint64)_num_verts*idx2;\
-			if (edge_id.find(ID) == NULL) {\
-				edge_id.insert(ID, _num_edges);\
-				const ccVert *v1 = &_vert_list[ri1], *v2 = &_vert_list[ri2];\
-				array_t<int> **evi1 = edge_verts.find(v1), **evi2 = edge_verts.find(v2);\
-				if (evi1 == NULL) { edge_verts.insert(v1, new array_t<int>);  evi1 = edge_verts.find(v1); }\
-				if (evi2 == NULL) { edge_verts.insert(v2, new array_t<int>);  evi2 = edge_verts.find(v2); }\
-				(*evi1)->push_back(_num_edges);\
-				(*evi2)->push_back(_num_edges);\
-				_num_edges++;\
-			}\
-		}\
+// function to prepare for edge list initialization, also initializes hashtables
+// returns new number of edges

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list