{ "name": "BottleRandomizerClassy", "id": "4amog3LttPqTrq7Wx", "sources": { "main": "var selectorWidth // selector light pulse width in pixels\nvar state0SelectorWidth = 201\nvar state1SelectorWidth = 5\nvar dwellSelectorWidth = 3\nvar speed\nvar stateDwellTime\n\nvar white_h = .07\nvar white_s = .7\n\nvar jiggleFactor = 3 // The number of LED indicies to move when the user presses the button during dwell\n\nvar timeInState\n\nvar waveStartIndex = -selectorWidth\n\nvar state = 0\nvar state_max = 3\n\nvar alreadyJiggled = 0\n\nbeforeRenderStates = array(state_max+1)\nrenderStates = array(state_max+1)\n\n// States:\n// 0: Continuous Animation.\n// In this state, we scroll a wide white selector around the back of the bottles.\nfunction beforeRenderState0(delta){\n speed = .09\n selectorWidth = state0SelectorWidth\n if (readAdc() <.5) {\n // Code to transition from state 0 to state 1\n state = 1\n stateDwellTime = 3000+random(8000)\n timeInState = 0\n waveStartIndex = waveStartIndex + selectorWidth/2\n waveStartIndex = waveStartIndex - state1SelectorWidth\n }\n \n waveStartIndex += delta * speed\n if (waveStartIndex > pixelCount){\n waveStartIndex = -selectorWidth\n }\n}\nbeforeRenderStates[0] = beforeRenderState0\n\nfunction renderState0(index){\n v=0\n if (index > waveStartIndex){\n selectorIndex = index-waveStartIndex\n if (selectorIndex < selectorWidth){\n v = wave(selectorIndex/(selectorWidth*2))*2-1\n v = pow(v, 2)\n }\n }\n // soft white, intensity animation\n hsv(white_h, white_s, v)\n // hsv(v*.33, 1, 1)\n}\nrenderStates[0] = renderState0\n\n\n// 1: Fast Search\n// In this state, the selector gets narrow and moves faster through the bottles. Maybe bouncing back and forth?\n// Time in this state should be randomized between 3 and 7 seconds.\nfunction beforeRenderState1(delta){\n selectorWidth = state1SelectorWidth\n // speed = \n \n timeInState += delta\n // change state if we've been here too long\n if (timeInState > stateDwellTime){\n state = 2\n stateDwellTime = 4000\n timeInState = 0\n //speed = 0\n }\n \n if (waveStartIndex < 0){\n waveStartIndex = 0\n }\n waveStartIndex += delta * speed\n if (waveStartIndex > pixelCount){\n waveStartIndex = -selectorWidth\n }\n}\nbeforeRenderStates[1] = beforeRenderState1\n\nfunction renderState1(index){\n v=0\n if (index > waveStartIndex){\n selectorIndex = index-waveStartIndex\n if (selectorIndex < selectorWidth){\n v = wave(selectorIndex/(selectorWidth*2))*2-1\n v = pow(v, 2)\n }\n }\n hsv(white_h, white_s, v)\n}\nrenderStates[1] = renderState1\n\n// 2: Wind-down\n// In this state, the scroll speed slows down at a randomized deceleration\nfunction beforeRenderState2(delta){\n selectorWidth = state1SelectorWidth\n // speed = \n \n timeInState += delta\n if (timeInState > stateDwellTime){\n state = 3\n stateDwellTime = 15000\n timeInState = 0\n }\n // No time in state calc, since we exit this state once speed = 0\n speed -= (speed/60) // Exponential decay = we have to time out.\n \n waveStartIndex += delta * speed\n if ((waveStartIndex - (selectorWidth/2)) > pixelCount){\n waveStartIndex = -selectorWidth\n }\n}\nbeforeRenderStates[2] = beforeRenderState2\n\nfunction renderState2(index){\n v=0\n if (index > waveStartIndex){\n selectorIndex = index-waveStartIndex\n if (selectorIndex < selectorWidth){\n v = wave(selectorIndex/(selectorWidth*2))*2-1\n v = pow(v, 2)\n }\n }\n hsv(white_h, white_s, v)\n}\nrenderStates[2] = renderState2\n\n// 3: Dwell\n// In this state, we just hang out for 15 seconds to clearly indicate the bottle.\nfunction beforeRenderState3(delta){\n selectorWidth = dwellSelectorWidth\n if (readAdc() < .5 &! alreadyJiggled){\n // User pushed the button to jiggle the result\n direction = -1\n if (random(1) > .5){\n direction = 1\n }\n waveStartIndex += jiggleFactor*direction\n alreadyJiggled = 1\n }\n timeInState += delta\n // change state if we've been here too long\n if (timeInState > stateDwellTime){\n state = 0\n selectorWidth = state0SelectorWidth\n waveStartIndex = -selectorWidth\n timeInState = 0\n alreadyJiggled = 0\n }\n \n}\nbeforeRenderStates[3] = beforeRenderState3\n\nfunction renderState3(index){\n v=0\n if (index > waveStartIndex){\n selectorIndex = index-waveStartIndex\n if (selectorIndex < selectorWidth){\n v = wave(selectorIndex/(selectorWidth*2))*2-1\n v = pow(v, 2)\n }\n }\n //if (index < selectorWidth){\n // v = selector[index]\n //}\n hsv(.33, 1, v)\n}\nrenderStates[3] = renderState3\n\nexport function beforeRender(delta) {\n beforeRenderStates[state](delta)\n}\nexport function render(index) {\n renderStates[state](index)\n}" }, "preview": "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" }