diff --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;