11 #include <muParser/muParser.h>
20 "title" :
"VuoMeshParametric",
23 "VuoMathExpressionParser",
33 VuoMesh 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)
35 if (uSubdivisions < 2 || vSubdivisions < 2 || !xExp || !yExp || !zExp)
38 mu::Parser xParser, yParser, zParser;
40 xParser.SetExpr(xExp);
41 yParser.SetExpr(yExp);
42 zParser.SetExpr(zExp);
44 mu::value_type uVar = 0;
45 mu::value_type vVar = 0;
47 xParser.DefineVar(
"u", &uVar); xParser.DefineVar(
"U", &uVar);
48 yParser.DefineVar(
"u", &uVar); yParser.DefineVar(
"U", &uVar);
49 zParser.DefineVar(
"u", &uVar); zParser.DefineVar(
"U", &uVar);
50 xParser.DefineVar(
"v", &vVar); xParser.DefineVar(
"V", &vVar);
51 yParser.DefineVar(
"v", &vVar); yParser.DefineVar(
"V", &vVar);
52 zParser.DefineVar(
"v", &vVar); zParser.DefineVar(
"V", &vVar);
54 mu::value_type iVar = 0;
55 mu::value_type jVar = 0;
57 xParser.DefineVar(
"i", &iVar); xParser.DefineVar(
"I", &iVar);
58 yParser.DefineVar(
"i", &iVar); yParser.DefineVar(
"I", &iVar);
59 zParser.DefineVar(
"i", &iVar); zParser.DefineVar(
"I", &iVar);
60 xParser.DefineVar(
"j", &jVar); xParser.DefineVar(
"J", &jVar);
61 yParser.DefineVar(
"j", &jVar); yParser.DefineVar(
"J", &jVar);
62 zParser.DefineVar(
"j", &jVar); zParser.DefineVar(
"J", &jVar);
64 xParser.DefineConst(
"time", (
double)time); xParser.DefineConst(
"Time", (
double)time); xParser.DefineConst(
"TIME", (
double)time);
65 yParser.DefineConst(
"time", (
double)time); yParser.DefineConst(
"Time", (
double)time); yParser.DefineConst(
"TIME", (
double)time);
66 zParser.DefineConst(
"time", (
double)time); zParser.DefineConst(
"Time", (
double)time); zParser.DefineConst(
"TIME", (
double)time);
77 for (
unsigned long i = 0; i < constantCount; ++i)
79 xParser.DefineConst(constantKeys[i], constantValues[i]);
80 yParser.DefineConst(constantKeys[i], constantValues[i]);
81 zParser.DefineConst(constantKeys[i], constantValues[i]);
85 int width = uSubdivisions;
86 int height = vSubdivisions;
88 float ustep = 1./(width-1.), vstep = 1./(height-1.);
90 int vertexCount = width * height;
92 VuoPoint4d *positions = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d)*vertexCount);
93 VuoPoint4d *normals = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d)*vertexCount);
94 VuoPoint4d *textures = (VuoPoint4d *)malloc(
sizeof(VuoPoint4d)*vertexCount);
100 for(
int y = 0; y < height; y++)
102 vVar =
VuoReal_lerp(vMin, vMax, (closeV && y==height-1) ? 0 : v);
103 for(
int x = 0; x < width; x++)
105 uVar =
VuoReal_lerp(uMin, uMax, (closeU && x==width-1) ? 0 : u);
110 positions[i].x = xParser.Eval();
111 positions[i].y = yParser.Eval();
112 positions[i].z = zParser.Eval();
133 catch (mu::Parser::exception_type &e)
135 VUserLog(
"Error: %s", e.GetMsg().c_str());
144 width = uSubdivisions-1;
145 height = vSubdivisions-1;
147 unsigned int triangleCount = (width*height)*3*2;
148 unsigned int *triangles = (
unsigned int *)malloc(
sizeof(
unsigned int)*triangleCount);
151 unsigned int* normalCount = (
unsigned int*)calloc(
sizeof(
unsigned int) * vertexCount,
sizeof(
unsigned int));
152 for (
int i=0;i<vertexCount;++i)
156 int one, two, three, four;
160 int stride = width+1;
162 for(
int y=0;y<height;++y)
164 for(
int x=0;x<width;++x)
168 three = x+row+stride;
169 four = x+row+stride+1;
181 normalCount[three]++;
184 if(closeU && x == width-1)
193 normals[row+stride] =
VuoPoint4d_add(normals[row+stride], faceNormal);
198 normalCount[row+stride]++;
201 if(closeV && y==height-1)
210 normalCount[three]++;
219 triangles[index+0] = three;
220 triangles[index+1] = one;
221 triangles[index+2] = two;
222 triangles[index+3] = two;
223 triangles[index+4] = four;
224 triangles[index+5] = three;
232 for(
int i = 0; i < vertexCount; i++)
239 positions, normals, NULL, NULL, textures,