[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