/* * Copyright (C) 2012 Gyver * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.gyver.matrixmover.core; import com.gyver.matrixmover.effect.*; import com.gyver.matrixmover.generator.*; import com.gyver.matrixmover.generator.enums.GeneratorName; import com.gyver.matrixmover.mixer.*; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; /** * Visual setup holds a Setup various Generators, Effects and Mixer. * * @author Gyver */ public class VisualSetup implements Serializable { /** The log. */ private static final Logger LOG = Logger.getLogger(VisualSetup.class.getName()); private List<Generator> generatorList = null; private List<Effect> effectList = null; private List<Mixer> mixerList = null; private List<Integer> intensityList = null; private boolean changed = false; public VisualSetup(MatrixData md) { generatorList = new ArrayList<Generator>(); generatorList.add(new SimpleColorGenerator(md)); effectList = new ArrayList<Effect>(); effectList.add(new PassThru(md)); mixerList = new ArrayList<Mixer>(); mixerList.add(new PassThruMixer()); intensityList = new ArrayList<Integer>(); intensityList.add(255); } public int getNumberOfGenerators(){ return generatorList.size(); } /** * Sets a new Generator and replaces the old one at position n. * @param g the new generator * @param n the position in the list */ public void setGenerator(Generator g, int n) { LOG.log(Level.FINER, "New Generator for Generator {0}", n); if (n < generatorList.size()) { generatorList.set(n, g); } } public void setEffect(Effect e, int n) { LOG.log(Level.FINER, "New Effect for Effect {0}", n); if (n < effectList.size()) { effectList.set(n, e); } } public void setMixer(Mixer m, int n) { LOG.log(Level.FINER, "New Mixer for Mixer {0}", n); if (n < mixerList.size()) { mixerList.set(n, m); } } public void setGeneratorIntensity(int value, int n) { if (n < intensityList.size()) { intensityList.set(n, value); } } public Generator getGenerator(int n){ return generatorList.get(n); } public Effect getEffect(int n){ return effectList.get(n); } public Mixer getMixer(int n){ return mixerList.get(n); } public int getGeneratorIntensity(int n){ return intensityList.get(n); } /** * Adds a whole generator setup to the visualSetup */ public void addGeneratorSetup(MatrixData md) { generatorList.add(new SimpleColorGenerator(md)); effectList.add(new PassThru(md)); mixerList.add(new PassThruMixer()); intensityList.add(255); } /** * Remove a whole generator setup at position n. Last setup cannot be removed * @param n the position in the list */ public void removeGeneratorSetup(int n) { if (n < generatorList.size() && n > 0) { generatorList.remove(n); effectList.remove(n); mixerList.remove(n); intensityList.remove(n); } } public void removeLastVisualSetup() { if(this.getNumberOfGenerators() > 1){ removeGeneratorSetup(this.getNumberOfGenerators()-1); } } public void clear() { MatrixData md = Controller.getControllerInstance().getMatrixData(); generatorList = new ArrayList<Generator>(); generatorList.add(new SimpleColorGenerator(md)); effectList = new ArrayList<Effect>(); effectList.add(new PassThru(md)); mixerList = new ArrayList<Mixer>(); mixerList.add(new PassThruMixer()); intensityList = new ArrayList<Integer>(); intensityList.add(255); } public void sceneChanged(boolean changed) { this.changed = changed; } public boolean isSceneChanged() { return changed; } public int[] getSceneOutput() { int[] buffer = null; for (int i = 0; i < generatorList.size(); i++) { generatorList.get(i).update(); int[] tempBuffer = generatorList.get(i).getBuffer(); tempBuffer = effectList.get(i).getBuffer(tempBuffer); tempBuffer = applyIntensity(tempBuffer, intensityList.get(i)); if (i == 0) { buffer = tempBuffer; } else { buffer = mixerList.get(i).getBuffer(tempBuffer, buffer); } } return buffer; } private int[] applyIntensity(int[] src, int value) { int[] ret = new int[src.length]; short red, green, blue; int col; float ratio = (value / 255f); for (int i = 0; i < src.length; i++) { col = src[i]; red = (short) (Math.round(((col >> 16) & 255) * ratio)); green = (short) (Math.round(((col >> 8) & 255) * ratio)); blue = (short) (Math.round((col & 255) * ratio)); ret[i] = (red << 16) | (green << 8) | blue; } return ret; } /** * Sets a generator to a Visual * @param nr Whether generator1 or generator 2 should be set * @param generatorString String describing the generator (see GeneratorName constants) */ public void setGeneratorFromString(int nr, String generatorString) { Generator newGen = null; MatrixData md = Controller.getControllerInstance().getMatrixData(); if (generatorString.equals(GeneratorName.SIMPLE_COLOR_GENERATOR.toString())) { newGen = new SimpleColorGenerator(md); } else if (generatorString.equals(GeneratorName.COLOR_FADE.toString())) { newGen = new ColorFade(md, null); } else if (generatorString.equals(GeneratorName.COLOR_SCROLL.toString())) { newGen = new ColorScroll(md, null); } else if (generatorString.equals(GeneratorName.PLASMA.toString())) { newGen = new Plasma(md, null); } else if (generatorString.equals(GeneratorName.FIRE.toString())) { newGen = new Fire(md); } else if (generatorString.equals(GeneratorName.RAIN.toString())) { newGen = new Rain(md); } else if (generatorString.equals(GeneratorName.SHAPES.toString())) { newGen = new Shapes(md); } else if (generatorString.equals(GeneratorName.METABALLS.toString())) { newGen = new MetaBalls(md); } else if (generatorString.equals(GeneratorName.TEXTWRITER.toString())) { newGen = new Textwriter(md); } else if (generatorString.equals(GeneratorName.ANALYSER.toString())) { newGen = new Analyser(md); } else if (generatorString.equals(GeneratorName.AUDIO_STROBE.toString())) { newGen = new AudioStrobe(md); } else { newGen = new SimpleColorGenerator(md); } setGenerator(newGen, nr); } /** * Sets a Effect to a Visual * @param nr Whether effect1 or effect 2 should be set * @param effectString String describing the Effect (see EffectName constants) */ public void setEffectFromString(int nr, String effectString) { Effect newEff = null; MatrixData md = Controller.getControllerInstance().getMatrixData(); if (effectString.equals(Effect.EffectName.STRING_PASSTHRU)) { newEff = new PassThru(md); } else if (effectString.equals(Effect.EffectName.STRING_INVERTER)) { newEff = new Inverter(md); } else if (effectString.equals(Effect.EffectName.STRING_EMBOSS)) { newEff = new Emboss(md); } else if (effectString.equals(Effect.EffectName.STRING_MONOCROME)) { newEff = new Monocrome(md); } else if (effectString.equals(Effect.EffectName.STRING_MONOCROME_INVERS)) { newEff = new MonocromeInvers(md); } else { newEff = new PassThru(md); } setEffect(newEff, nr); } public void setMixerFromString(int nr, String mixerString) { Mixer mix = null; if (mixerString.equals(Mixer.MixerName.STRING_PASSTHRU)) { mix = new PassThruMixer(); } else if (mixerString.equals(Mixer.MixerName.STRING_MULTIPLY)) { mix = new Multiply(); } else if (mixerString.equals(Mixer.MixerName.STRING_ADDSAT)) { mix = new AddSat(); } else if (mixerString.equals(Mixer.MixerName.STRING_MIX)) { mix = new Mix(); } else if (mixerString.equals(Mixer.MixerName.STRING_NEGATIVE_MULTIPLY)) { mix = new NegativeMultiply(); } else if (mixerString.equals(Mixer.MixerName.STRING_XOR)) { mix = new Xor(); } else if (mixerString.equals(Mixer.MixerName.STRING_MINUS_HALF)) { mix = new MinusHalf(); } else if (mixerString.equals(Mixer.MixerName.STRING_EITHER)) { mix = new Either(); } else if (mixerString.equals(Mixer.MixerName.STRING_MAX)) { mix = new Max(); } else { mix = new PassThruMixer(); } setMixer(mix, nr); } }