//package com.jmex.effects.particles; import java.io.IOException; import com.jme.renderer.ColorRGBA; import com.jme.util.export.InputCapsule; import com.jme.util.export.JMEExporter; import com.jme.util.export.JMEImporter; import com.jme.util.export.OutputCapsule; import com.jme.util.export.Savable; /** * RampEntry defines an entry for a ParticleAppearanceRamp. * * @author Joshua Slack * @see ParticleAppearanceRamp */ public class RampEntry implements Savable { public static final float DEFAULT_OFFSET = 0.05f; // (5% of lifetime) public static final float DEFAULT_SIZE = -1; // special case -> negative = no size change at this entry public static final float DEFAULT_SPIN = Float.MAX_VALUE; // special case -> no spin change public static final float DEFAULT_MASS = Float.MAX_VALUE; // special case -> no mass change public static final ColorRGBA DEFAULT_COLOR = null; // special case -> no color change protected float offset = DEFAULT_OFFSET; protected ColorRGBA color = DEFAULT_COLOR; // no color change at this entry protected float size = DEFAULT_SIZE; protected float spin = DEFAULT_SPIN; protected float mass = DEFAULT_MASS; public RampEntry() { } /** * Construct new addition to color ramp * @param offset amount of time (as a percent of total lifetime) between the last appearance and this one. */ public RampEntry(float offset) { setOffset(offset); } public ColorRGBA getColor() { return color; } public void setColor(ColorRGBA color) { this.color = color; } public boolean hasColorSet() { return color != DEFAULT_COLOR; } public float getSize() { return size; } public void setSize(float size) { this.size = size; } public boolean hasSizeSet() { return size != DEFAULT_SIZE; } public float getSpin() { return spin; } public void setSpin(float spin) { this.spin = spin; } public boolean hasSpinSet() { return spin != DEFAULT_SPIN; } public float getMass() { return mass; } public void setMass(float mass) { this.mass = mass; } public boolean hasMassSet() { return mass != DEFAULT_MASS; } public float getOffset() { return offset; } public void setOffset(float offset) { this.offset = offset; } public Class getClassTag() { return getClass(); } public void read(JMEImporter im) throws IOException { InputCapsule capsule = im.getCapsule(this); offset = capsule.readFloat("offsetMS", DEFAULT_OFFSET); size = capsule.readFloat("size", DEFAULT_SIZE); spin = capsule.readFloat("spin", DEFAULT_SPIN); mass = capsule.readFloat("mass", DEFAULT_MASS); color = (ColorRGBA) capsule.readSavable("color", DEFAULT_COLOR); } public void write(JMEExporter ex) throws IOException { OutputCapsule capsule = ex.getCapsule(this); capsule.write(offset, "offsetMS", DEFAULT_OFFSET); capsule.write(size, "size", DEFAULT_SIZE); capsule.write(spin, "spin", DEFAULT_SPIN); capsule.write(mass, "mass", DEFAULT_MASS); capsule.write(color, "color", DEFAULT_COLOR); } private static String convColorToHex(ColorRGBA color) { if (color == null) return null; String sRed = Integer.toHexString((int)(color.r*255+.5f)); if (sRed.length() == 1) sRed = "0" + sRed; String sGreen = Integer.toHexString((int)(color.g*255+.5f)); if (sGreen.length() == 1) sGreen = "0" + sGreen; String sBlue = Integer.toHexString((int)(color.b*255+.5f)); if (sBlue.length() == 1) sBlue = "0" + sBlue; return "#" + sRed + sGreen + sBlue; } @Override public String toString() { StringBuilder builder = new StringBuilder(); if (offset > 0) { builder.append("prev+"); builder.append((int)(offset*100)); builder.append("% age..."); } if (color != DEFAULT_COLOR) { builder.append(" color:"); builder.append(convColorToHex(color).toUpperCase()); builder.append(" a: "); builder.append((int)(color.a*100)); builder.append("%"); } if (size != DEFAULT_SIZE) { builder.append(" size: "+size); } if (mass != DEFAULT_MASS) { builder.append(" mass: "+spin); } if (spin != DEFAULT_SPIN) { builder.append(" spin: "+spin); } return builder.toString(); } }