diff --git a/js/components/MilkdropWindow/PresetOverlay.js b/js/components/MilkdropWindow/PresetOverlay.js index 87647017..e1a9aac4 100644 --- a/js/components/MilkdropWindow/PresetOverlay.js +++ b/js/components/MilkdropWindow/PresetOverlay.js @@ -28,7 +28,7 @@ class PresetOverlay extends React.Component { this.setState({ presetIdx: Math.min( this.state.presetIdx + 1, - Object.keys(this.props.presets).length - 1 + this.props.presetKeys.length - 1 ) }); e.stopPropagation(); @@ -44,7 +44,7 @@ class PresetOverlay extends React.Component { } } render() { - if (!this.props.presets) { + if (!this.props.presetKeys) { return (
{ let color; if (i + startIdx === this.props.currentPreset) { diff --git a/js/components/MilkdropWindow/index.js b/js/components/MilkdropWindow/index.js index e1951bd3..333372b5 100644 --- a/js/components/MilkdropWindow/index.js +++ b/js/components/MilkdropWindow/index.js @@ -22,14 +22,22 @@ class MilkdropWindow extends React.Component { } componentDidMount() { require.ensure( - ["butterchurn", "butterchurn-presets/lib/butterchurnPresetsMinimal.min"], + [ + "butterchurn", + "butterchurn-presets/lib/butterchurnPresetsMinimal.min", + "butterchurn-presets/lib/butterchurnPresetPackMeta.min" + ], require => { const analyserNode = this.props.analyser; const butterchurn = require("butterchurn"); - const butterchurnPresets = require("butterchurn-presets/lib/butterchurnPresetsMinimal.min"); - this.presets = butterchurnPresets.getPresets(); - this.presetKeys = Object.keys(this.presets); - const presetIdx = Math.floor(Math.random() * this.presetKeys.length); + const butterchurnMinimalPresets = require("butterchurn-presets/lib/butterchurnPresetsMinimal.min"); + const presetPackMeta = require("butterchurn-presets/lib/butterchurnPresetPackMeta.min"); + this.presets = butterchurnMinimalPresets.getPresets(); + this.minmalPresetKeys = Object.keys(this.presets); + this.presetKeys = presetPackMeta.getMainPresetMeta().presets; + const presetKey = this.minmalPresetKeys[ + Math.floor(Math.random() * this.minmalPresetKeys.length) + ]; this.visualizer = butterchurn.createVisualizer( analyserNode.context, @@ -43,7 +51,7 @@ class MilkdropWindow extends React.Component { this._canvasNode.width = this.props.width; this._canvasNode.height = this.props.height; this.visualizer.connectAudio(analyserNode); - this.visualizer.loadPreset(this.presets[this.presetKeys[presetIdx]], 0); + this.visualizer.loadPreset(this.presets[presetKey], 0); // Kick off the animation loop const loop = () => { if (this.props.status === "PLAYING") { @@ -53,7 +61,7 @@ class MilkdropWindow extends React.Component { }; loop(); - this.presetHistory = [presetIdx]; + this.presetHistory = [this.presetKeys.indexOf(presetKey)]; this.presetRandomize = true; this.presetCycle = true; this._restartCycling(); @@ -154,7 +162,23 @@ class MilkdropWindow extends React.Component { break; } } - _nextPreset(blendTime) { + async _loadMainPresetPack() { + return require.ensure( + ["butterchurn-presets"], + require => { + const butterchurnPresets = require("butterchurn-presets"); + this.presets = Object.assign( + this.presets, + butterchurnPresets.getPresets() + ); + }, + e => { + console.error("Error loading Butterchurn Presets", e); + }, + "butterchurn-presets" + ); + } + async _nextPreset(blendTime) { // The visualizer may not have initialized yet. if (this.visualizer != null) { let presetIdx; @@ -164,7 +188,12 @@ class MilkdropWindow extends React.Component { const prevPresetIdx = this.presetHistory[this.presetHistory.length - 1]; presetIdx = (prevPresetIdx + 1) % this.presetKeys.length; } - const preset = this.presets[this.presetKeys[presetIdx]]; + let preset = this.presets[this.presetKeys[presetIdx]]; + if (!preset) { + await this._loadMainPresetPack(); + preset = this.presets[this.presetKeys[presetIdx]]; + } + this.presetHistory.push(presetIdx); this.visualizer.loadPreset(preset, blendTime); this._restartCycling(); @@ -183,8 +212,12 @@ class MilkdropWindow extends React.Component { this.setState({ currentPreset: prevPreset }); } } - selectPreset(presetIdx) { - const preset = this.presets[this.presetKeys[presetIdx]]; + async selectPreset(presetIdx) { + let preset = this.presets[this.presetKeys[presetIdx]]; + if (!preset) { + await this._loadMainPresetPack(); + preset = this.presets[this.presetKeys[presetIdx]]; + } this.presetHistory.push(presetIdx); this.visualizer.loadPreset(preset, 0); this._restartCycling(); @@ -222,7 +255,7 @@ class MilkdropWindow extends React.Component { this.props.onFocusedKeyDown(listener)} selectPreset={idx => this.selectPreset(idx)} diff --git a/package.json b/package.json index 58f56f42..42ecf132 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "babel-preset-react": "^6.24.1", "babel-runtime": "^6.26.0", "butterchurn": "^2.4.3", - "butterchurn-presets": "^2.4.4", + "butterchurn-presets": "^2.4.5", "canvas-mock": "0.0.0", "cardinal-spline-js": "^2.3.6", "classnames": "^2.2.5", diff --git a/yarn.lock b/yarn.lock index 4dace8b6..40e2c41b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1269,9 +1269,9 @@ builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" -butterchurn-presets@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/butterchurn-presets/-/butterchurn-presets-2.4.4.tgz#23764b47e9d30c29caf95d974a92002f6f29c057" +butterchurn-presets@^2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/butterchurn-presets/-/butterchurn-presets-2.4.5.tgz#5e05f2c57e941ff2d24f655b0ea842ca1ff4787a" dependencies: babel-runtime "^6.26.0" ecma-proposal-math-extensions "0.0.2"