/* update blots, adjusting the offsets and rotation factors. */ static void updateWithFeeling (struct nerverotstate *st) { int n, i, j; /* pick a new model if the time is right */ st->itersTillNext--; if ((st->please_num!=-1)&&(st->cur_num!=st->please_num)) { commandBlots (st); setupSegs (st); renderSegs (st); } if (st->itersTillNext < 0) { st->itersTillNext = RAND_FLOAT_01 * st->maxIters; randomBlots (st); setupSegs (st); renderSegs (st); } /* update the rotation factors by moving them a bit toward the targets */ st->xRot = st->xRot + (st->xRotTarget - st->xRot) * st->iterAmt; st->yRot = st->yRot + (st->yRotTarget - st->yRot) * st->iterAmt; st->zRot = st->zRot + (st->zRotTarget - st->zRot) * st->iterAmt; /* similarly the scale factor */ st->curScale = st->curScale + (st->scaleTarget - st->curScale) * st->iterAmt; /* and similarly the light position */ st->lightX = st->lightX + (st->lightXTarget - st->lightX) * st->iterAmt; st->lightY = st->lightY + (st->lightYTarget - st->lightY) * st->iterAmt; st->lightZ = st->lightZ + (st->lightZTarget - st->lightZ) * st->iterAmt; /* for each blot... */ for (n = 0; n < st->blotCount; n++) { /* add a bit of random jitter to xoff/yoff */ for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { FLOAT newOff; newOff = st->blots[n].xoff[i][j] + RAND_FLOAT_PM1 * st->nervousness; if (newOff < -1) newOff = -(newOff + 1) - 1; else if (newOff > 1) newOff = -(newOff - 1) + 1; st->blots[n].xoff[i][j] = newOff; newOff = st->blots[n].yoff[i][j] + RAND_FLOAT_PM1 * st->nervousness; if (newOff < -1) newOff = -(newOff + 1) - 1; else if (newOff > 1) newOff = -(newOff - 1) + 1; st->blots[n].yoff[i][j] = newOff; } } } #include "factors" }
/* set up the system */ static void setup (struct state *st) { XWindowAttributes xgwa; XGetWindowAttributes (st->dpy, st->window, &xgwa); st->windowWidth = xgwa.width; st->windowHeight = xgwa.height; st->centerX = st->windowWidth / 2; st->centerY = st->windowHeight / 2; st->baseScale = (xgwa.height < xgwa.width) ? xgwa.height : xgwa.width; if (st->doubleBuffer) { st->drawable = XCreatePixmap (st->dpy, st->window, xgwa.width, xgwa.height, xgwa.depth); } else { st->drawable = st->window; } setupColormap (st, &xgwa); setupBlots (st); setupSegs (st); /* set up the initial rotation, scale, and light values as random, but * with the targets equal to where it is */ st->xRot = st->xRotTarget = RAND_FLOAT_01 * M_PI; st->yRot = st->yRotTarget = RAND_FLOAT_01 * M_PI; st->zRot = st->zRotTarget = RAND_FLOAT_01 * M_PI; st->curScale = st->scaleTarget = RAND_FLOAT_01 * (st->maxScale - st->minScale) + st->minScale; st->lightX = st->lightXTarget = RAND_FLOAT_PM1; st->lightY = st->lightYTarget = RAND_FLOAT_PM1; st->lightZ = st->lightZTarget = RAND_FLOAT_PM1; st->itersTillNext = RAND_FLOAT_01 * st->maxIters; }
/* set up the system */ static void setup (struct nerverotstate *st,int w,int h) { st->colorCount = 2000; st->windowWidth = w; st->windowHeight = h; st->centerX = st->windowWidth / 2; st->centerY = st->windowHeight / 2; st->baseScale = (st->windowHeight < st->windowWidth) ? st->windowHeight : st->windowWidth; /* setupColormap (st, &xgwa);*/ randomBlots (st); setupSegs (st); /* set up the initial rotation, scale, and light values as random, but * with the targets equal to where it is */ st->xRot = st->xRotTarget = RAND_FLOAT_01 * M_PI; st->yRot = st->yRotTarget = RAND_FLOAT_01 * M_PI; st->zRot = st->zRotTarget = RAND_FLOAT_01 * M_PI; st->curScale = st->scaleTarget = RAND_FLOAT_01 * (st->maxScale - st->minScale) + st->minScale; st->lightX = st->lightXTarget = RAND_FLOAT_PM1; st->lightY = st->lightYTarget = RAND_FLOAT_PM1; st->lightZ = st->lightZTarget = RAND_FLOAT_PM1; st->itersTillNext = RAND_FLOAT_01 * st->maxIters; }
/* update blots, adjusting the offsets and rotation factors. */ static void updateWithFeeling (struct state *st) { int n, i, j; /* pick a new model if the time is right */ st->itersTillNext--; if (st->itersTillNext < 0) { st->itersTillNext = RAND_FLOAT_01 * st->maxIters; setupBlots (st); setupSegs (st); renderSegs (st); } /* update the rotation factors by moving them a bit toward the targets */ st->xRot = st->xRot + (st->xRotTarget - st->xRot) * st->iterAmt; st->yRot = st->yRot + (st->yRotTarget - st->yRot) * st->iterAmt; st->zRot = st->zRot + (st->zRotTarget - st->zRot) * st->iterAmt; /* similarly the scale factor */ st->curScale = st->curScale + (st->scaleTarget - st->curScale) * st->iterAmt; /* and similarly the light position */ st->lightX = st->lightX + (st->lightXTarget - st->lightX) * st->iterAmt; st->lightY = st->lightY + (st->lightYTarget - st->lightY) * st->iterAmt; st->lightZ = st->lightZ + (st->lightZTarget - st->lightZ) * st->iterAmt; /* for each blot... */ for (n = 0; n < st->blotCount; n++) { /* add a bit of random jitter to xoff/yoff */ for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { FLOAT newOff; newOff = st->blots[n].xoff[i][j] + RAND_FLOAT_PM1 * st->nervousness; if (newOff < -1) newOff = -(newOff + 1) - 1; else if (newOff > 1) newOff = -(newOff - 1) + 1; st->blots[n].xoff[i][j] = newOff; newOff = st->blots[n].yoff[i][j] + RAND_FLOAT_PM1 * st->nervousness; if (newOff < -1) newOff = -(newOff + 1) - 1; else if (newOff > 1) newOff = -(newOff - 1) + 1; st->blots[n].yoff[i][j] = newOff; } } } /* depending on random chance, update one or more factors */ if (RAND_FLOAT_01 <= st->eventChance) { int which = RAND_FLOAT_01 * 14; switch (which) { case 0: { st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2; break; } case 1: { st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2; break; } case 2: { st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2; break; } case 3: { st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2; st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2; break; } case 4: { st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2; st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2; break; } case 5: { st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2; st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2; break; } case 6: { st->xRotTarget = RAND_FLOAT_PM1 * M_PI * 2; st->yRotTarget = RAND_FLOAT_PM1 * M_PI * 2; st->zRotTarget = RAND_FLOAT_PM1 * M_PI * 2; break; } case 7: { st->centerXOff = RAND_FLOAT_PM1 * st->maxRadius; break; } case 8: { st->centerYOff = RAND_FLOAT_PM1 * st->maxRadius; break; } case 9: { st->centerXOff = RAND_FLOAT_PM1 * st->maxRadius; st->centerYOff = RAND_FLOAT_PM1 * st->maxRadius; break; } case 10: { st->scaleTarget = RAND_FLOAT_01 * (st->maxScale - st->minScale) + st->minScale; break; } case 11: { st->curScale = RAND_FLOAT_01 * (st->maxScale - st->minScale) + st->minScale; break; } case 12: { st->lightX = RAND_FLOAT_PM1; st->lightY = RAND_FLOAT_PM1; st->lightZ = RAND_FLOAT_PM1; break; } case 13: { st->lightXTarget = RAND_FLOAT_PM1; st->lightYTarget = RAND_FLOAT_PM1; st->lightZTarget = RAND_FLOAT_PM1; break; } } } }