42VuoMesh VuoMeshParametric_generate(
VuoReal time,
VuoText xExp,
VuoText yExp,
VuoText zExp,
VuoInteger uSubdivisions,
VuoInteger vSubdivisions,
bool closeU,
VuoReal uMin,
VuoReal uMax,
bool closeV,
VuoReal vMin,
VuoReal vMax,
VuoDictionary_VuoText_VuoReal *constants)
47 mu::Parser xParser, yParser, zParser;
49 xParser.SetExpr(xExp);
50 yParser.SetExpr(yExp);
51 zParser.SetExpr(zExp);
53 mu::value_type uVar = 0;
54 mu::value_type vVar = 0;
56 xParser.DefineVar(
"u", &uVar); xParser.DefineVar(
"U", &uVar);
57 yParser.DefineVar(
"u", &uVar); yParser.DefineVar(
"U", &uVar);
58 zParser.DefineVar(
"u", &uVar); zParser.DefineVar(
"U", &uVar);
59 xParser.DefineVar(
"v", &vVar); xParser.DefineVar(
"V", &vVar);
60 yParser.DefineVar(
"v", &vVar); yParser.DefineVar(
"V", &vVar);
61 zParser.DefineVar(
"v", &vVar); zParser.DefineVar(
"V", &vVar);
63 mu::value_type iVar = 0;
64 mu::value_type jVar = 0;
66 xParser.DefineVar(
"i", &iVar); xParser.DefineVar(
"I", &iVar);
67 yParser.DefineVar(
"i", &iVar); yParser.DefineVar(
"I", &iVar);
68 zParser.DefineVar(
"i", &iVar); zParser.DefineVar(
"I", &iVar);
69 xParser.DefineVar(
"j", &jVar); xParser.DefineVar(
"J", &jVar);
70 yParser.DefineVar(
"j", &jVar); yParser.DefineVar(
"J", &jVar);
71 zParser.DefineVar(
"j", &jVar); zParser.DefineVar(
"J", &jVar);
73 xParser.DefineConst(
"time", (
double)time); xParser.DefineConst(
"Time", (
double)time); xParser.DefineConst(
"TIME", (
double)time);
74 yParser.DefineConst(
"time", (
double)time); yParser.DefineConst(
"Time", (
double)time); yParser.DefineConst(
"TIME", (
double)time);
75 zParser.DefineConst(
"time", (
double)time); zParser.DefineConst(
"Time", (
double)time); zParser.DefineConst(
"TIME", (
double)time);
86 for (
unsigned long i = 0; i < constantCount; ++i)
88 xParser.DefineConst(constantKeys[i], constantValues[i]);
89 yParser.DefineConst(constantKeys[i], constantValues[i]);
90 zParser.DefineConst(constantKeys[i], constantValues[i]);
94 int width = uSubdivisions;
95 int height = vSubdivisions;
97 float ustep = 1./(width-1.), vstep = 1./(height-1.);
99 int vertexCount = width * height;
101 unsigned int elementCount = ((uSubdivisions-1)*(vSubdivisions-1))*3*2;
102 float *positions, *normals, *textureCoordinates;
103 unsigned int *elements;
105 bzero(normals,
sizeof(
float) * 3 * vertexCount);
110 float u = 0., v = 0.;
111 for(
int y = 0; y < height; y++)
113 vVar =
VuoReal_lerp(vMin, vMax, (closeV && y==height-1) ? 0 : v);
114 for(
int x = 0; x < width; x++)
116 uVar =
VuoReal_lerp(uMin, uMax, (closeU && x==width-1) ? 0 : u);
121 positions[i * 3 ] = xParser.Eval();
122 positions[i * 3 + 1] = yParser.Eval();
123 positions[i * 3 + 2] = zParser.Eval();
125 textureCoordinates[i * 2 ] = u;
126 textureCoordinates[i * 2 + 1] = v;
136 catch (mu::Parser::exception_type &e)
138 VUserLog(
"Error: %s", e.GetMsg().c_str());
141 free(textureCoordinates);
147 width = uSubdivisions-1;
148 height = vSubdivisions-1;
151 unsigned int* normalCount = (
unsigned int*)calloc(
sizeof(
unsigned int) * vertexCount,
sizeof(
unsigned int));
154 int one, two, three, four;
158 int stride = width+1;
160 for(
int y=0;y<height;++y)
162 for(
int x=0;x<width;++x)
166 three = x+row+stride;
167 four = x+row+stride+1;
175 add(normals, one, faceNormal);
176 add(normals, two, faceNormal);
177 add(normals, three, faceNormal);
178 add(normals, four, faceNormal);
182 normalCount[three]++;
185 if(closeU && x == width-1)
193 add(normals, two, uNrm);
194 add(normals, four, uNrm);
196 add(normals, row, faceNormal);
197 add(normals, row + stride, faceNormal);
202 normalCount[row+stride]++;
205 if(closeV && y==height-1)
212 add(normals, three, vNrm);
213 add(normals, four, vNrm);
214 add(normals, x, faceNormal);
215 add(normals, x + 1, faceNormal);
217 normalCount[three]++;
226 elements[index ] = three;
227 elements[index + 1] = one;
228 elements[index + 2] = two;
229 elements[index + 3] = two;
230 elements[index + 4] = four;
231 elements[index + 5] = three;
239 for(
int i = 0; i < vertexCount; i++)
241 normals[i * 3 ] /= normalCount[i];
242 normals[i * 3 + 1] /= normalCount[i];
243 normals[i * 3 + 2] /= normalCount[i];
248 positions, normals, textureCoordinates,
nullptr,