/* * Copyright (c) 2004 Covalent Software Ltd * All rights reserved. */ package net.puppygames.applet.effects; import net.puppygames.applet.Screen; import org.lwjgl.util.Color; import org.lwjgl.util.ReadableColor; import com.shavenpuppy.jglib.interpolators.ColorInterpolator; import com.shavenpuppy.jglib.interpolators.LinearInterpolator; import com.shavenpuppy.jglib.opengl.GLRenderable; import com.shavenpuppy.jglib.resources.ColorSequenceWrapper; import static org.lwjgl.opengl.GL11.*; /** * $Id: StrobeEffect.java,v 1.3 2010/03/29 22:39:43 foo Exp $ * @version $Revision: 1.3 $ * @author $Author: foo $ */ public class StrobeEffect extends Effect { /** Single instance */ private static StrobeEffect instance; private static final short[] INDICES = {0, 1, 2, 3}; /** Cached color */ private final Color cachedColor = new Color(); /** Color */ private ReadableColor color, finalColor; /** .. or color sequence */ private ColorSequenceWrapper sequence; /** Duration */ private int duration; /** Tick */ private int tick; /** * Private c'tor */ private StrobeEffect() { if (instance != null) { instance.remove(); instance = this; } } /** * C'tor */ public StrobeEffect(ReadableColor color, int duration) { this(); this.color = color; this.finalColor = new Color(color.getRed(), color.getGreen(), color.getBlue(), 0); this.duration = duration; } /** * C'tor * @param sequence */ public StrobeEffect(ColorSequenceWrapper sequence) { this(); this.sequence = sequence; } @Override public boolean isEffectActive() { if (sequence != null) { return !sequence.isFinished(tick); } else { return tick < duration; } } @Override protected void doTick() { tick ++; if (sequence == null) { ColorInterpolator.interpolate(color, finalColor, (float) tick / (float) duration, LinearInterpolator.instance, cachedColor); } else { sequence.getColor(tick, cachedColor); } } @Override protected void render() { if (!isStarted()) { return; } if ((tick & 4) == 0) { glRender(new GLRenderable() { @Override public void render() { glEnable(GL_BLEND); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_ONE, GL_ONE); } }); Screen s = getScreen(); float preMultAlpha = cachedColor.getAlpha() / 255.0f; glColor4ub((byte) (cachedColor.getRed() * preMultAlpha), (byte) (cachedColor.getGreenByte() * preMultAlpha), (byte) (cachedColor.getBlueByte() * preMultAlpha), cachedColor.getAlphaByte()); glVertex2f(0, 0); glVertex2f(s.getWidth(), 0); glVertex2f(s.getWidth(), s.getHeight()); glVertex2f(0, s.getHeight()); glRender(GL_TRIANGLE_FAN, INDICES); } } @Override public int getDefaultLayer() { return Integer.MAX_VALUE; // On top of EVERYTHING! } @Override protected void doRemove() { instance = null; } @Override public boolean isBackgroundEffect() { return true; } }