rendered paste bodydiff --git a/plugins/wobbly.c b/plugins/wobbly.c
index 3a80f78..991b72c 100644
--- a/plugins/wobbly.c
+++ b/plugins/wobbly.c
@@ -41,7 +41,7 @@
#define GRID_WIDTH 4
#define GRID_HEIGHT 4
-#define MODEL_MAX_SPRINGS (GRID_WIDTH * GRID_HEIGHT * 2)
+#define MODEL_MAX_SPRINGS (2 * GRID_WIDTH * GRID_HEIGHT - GRID_WIDTH - GRID_HEIGHT)
#define MASS 15.0f
@@ -1706,25 +1706,36 @@ bezierPatchEvaluate (Model *model,
float *patchX,
float *patchY)
{
- float coeffsU[4], coeffsV[4];
+ float coeffsU[GRID_WIDTH], coeffsV[GRID_HEIGHT];
float x, y;
int i, j;
+ int nextBinom;
+
+ nextBinom = 1;
+ for (i = 0; i < GRID_WIDTH; i++)
+ {
+ /*coeffsU[i] = coeffsU[i - 1] * u / (1 - u);
+ coeffsU[i] *= (float)(GRID_WIDTH - i) / i;*/
+
+ coeffsU[i] = nextBinom * pow(1 - u, GRID_WIDTH - i - 1) * pow(u, i);
+ nextBinom = nextBinom * (GRID_WIDTH - i - 1) / (i + 1);
+ }
- coeffsU[0] = (1 - u) * (1 - u) * (1 - u);
- coeffsU[1] = 3 * u * (1 - u) * (1 - u);
- coeffsU[2] = 3 * u * u * (1 - u);
- coeffsU[3] = u * u * u;
-
- coeffsV[0] = (1 - v) * (1 - v) * (1 - v);
- coeffsV[1] = 3 * v * (1 - v) * (1 - v);
- coeffsV[2] = 3 * v * v * (1 - v);
- coeffsV[3] = v * v * v;
+ nextBinom = 1;
+ for (j = 0; j < GRID_HEIGHT; j++)
+ {
+ /*coeffsV[j] = coeffsV[j - 1] * v / (1 - v);
+ coeffsV[j] *= (float)(GRID_HEIGHT - j) / j;*/
+
+ coeffsV[j] = nextBinom * pow(1 - v, GRID_HEIGHT - j - 1) * pow(v, j);
+ nextBinom = nextBinom * (GRID_WIDTH - j - 1) / (j + 1);
+ }
x = y = 0.0f;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < GRID_WIDTH; i++)
{
- for (j = 0; j < 4; j++)
+ for (j = 0; j < GRID_HEIGHT; j++)
{
x += coeffsU[i] * coeffsV[j] *
model->objects[j * GRID_WIDTH + i].position.x;