Immutable Appearance & Decal objects. An AppearanceBuilder so they are not a pain to construct.
This commit is contained in:
parent
640cbc1179
commit
13289c423b
60
core/src/net/sf/openrocket/appearance/Appearance.java
Normal file
60
core/src/net/sf/openrocket/appearance/Appearance.java
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
package net.sf.openrocket.appearance;
|
||||||
|
|
||||||
|
import net.sf.openrocket.util.Color;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A component appearance.
|
||||||
|
* This class is immutable.
|
||||||
|
*
|
||||||
|
* @author Bill Kuker <bkuker@billkuker.com>
|
||||||
|
*/
|
||||||
|
public class Appearance {
|
||||||
|
public static final Appearance MISSING = new Appearance(new Color(0,0,0), new Color(128,128,128), new Color(255,255,255), 100, null);
|
||||||
|
|
||||||
|
private final Color ambient, diffuse, specular;
|
||||||
|
private final int shininess;
|
||||||
|
private final Decal texture;
|
||||||
|
|
||||||
|
Appearance(final Color ambient, final Color diffuse, final Color specular, final int shininess, final Decal texture){
|
||||||
|
this.ambient = ambient;
|
||||||
|
this.diffuse = diffuse;
|
||||||
|
this.specular = specular;
|
||||||
|
this.shininess = shininess;
|
||||||
|
this.texture = texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
Appearance(final Color ambient, final Color diffuse, final Color specular, final int shininess){
|
||||||
|
this.ambient = ambient;
|
||||||
|
this.diffuse = diffuse;
|
||||||
|
this.specular = specular;
|
||||||
|
this.shininess = shininess;
|
||||||
|
this.texture = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getAmbient() {
|
||||||
|
return ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getDiffuse() {
|
||||||
|
return diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getSpecular() {
|
||||||
|
return specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getShininess() {
|
||||||
|
return shininess;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Decal getTexture() {
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Appearance [ambient=" + ambient + ", diffuse=" + diffuse + ", specular=" + specular + ", shininess="
|
||||||
|
+ shininess + ", texture=" + texture + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
225
core/src/net/sf/openrocket/appearance/AppearanceBuilder.java
Normal file
225
core/src/net/sf/openrocket/appearance/AppearanceBuilder.java
Normal file
@ -0,0 +1,225 @@
|
|||||||
|
package net.sf.openrocket.appearance;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import net.sf.openrocket.appearance.Decal.EdgeMode;
|
||||||
|
import net.sf.openrocket.util.AbstractChangeSource;
|
||||||
|
import net.sf.openrocket.util.Color;
|
||||||
|
import net.sf.openrocket.util.Coordinate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this class to build an immutable Appearance object in a friendly way. Set
|
||||||
|
* the various values one at a time with the setter methods and then call
|
||||||
|
* getAppearance(). Each call to getAppearance will return a new appearance.
|
||||||
|
*
|
||||||
|
* You can use this class repeatedly and resetToDefaults() in between, or create
|
||||||
|
* a new one every time.
|
||||||
|
*
|
||||||
|
* @author Bill Kuker <bkuker@billkuker.com>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class AppearanceBuilder extends AbstractChangeSource {
|
||||||
|
|
||||||
|
private Color ambient, diffuse, specular;
|
||||||
|
private int shininess;
|
||||||
|
private double offsetU, offsetV;
|
||||||
|
private double centerU, centerV;
|
||||||
|
private double scaleU, scaleV;
|
||||||
|
private double rotation;
|
||||||
|
private URL image;
|
||||||
|
private Decal.EdgeMode edgeMode;
|
||||||
|
|
||||||
|
public AppearanceBuilder() {
|
||||||
|
resetToDefaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppearanceBuilder(Appearance a) {
|
||||||
|
resetToDefaults();
|
||||||
|
if ( a != null ){
|
||||||
|
setAmbient(a.getAmbient());
|
||||||
|
setDiffuse(a.getDiffuse());
|
||||||
|
setSpecular(a.getSpecular());
|
||||||
|
setShininess(a.getShininess());
|
||||||
|
Decal d = a.getTexture();
|
||||||
|
if ( d != null ){
|
||||||
|
setOffset(d.getOffset().x, d.getOffset().y);
|
||||||
|
setCenter(d.getCenter().x, d.getCenter().y);
|
||||||
|
setScale(d.getScale().x, d.getScale().y);
|
||||||
|
setRotation(d.getRotation());
|
||||||
|
setEdgeMode(d.getEdgeMode());
|
||||||
|
setImage(d.getImageURL());
|
||||||
|
}
|
||||||
|
// TODO Critical the rest of this!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetToDefaults() {
|
||||||
|
ambient = new Color(0, 0, 0);
|
||||||
|
diffuse = new Color(128, 128, 128);
|
||||||
|
specular = new Color(255, 255, 255);
|
||||||
|
shininess = 100;
|
||||||
|
offsetU = offsetV = 0;
|
||||||
|
centerU = centerV = 0;
|
||||||
|
scaleU = scaleV = 1;
|
||||||
|
rotation = 0;
|
||||||
|
image = null;
|
||||||
|
edgeMode = EdgeMode.REPEAT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Appearance getAppearance() {
|
||||||
|
|
||||||
|
Decal t = null;
|
||||||
|
|
||||||
|
if (image != null) {
|
||||||
|
t = new Decal( //
|
||||||
|
new Coordinate(offsetU, offsetV), //
|
||||||
|
new Coordinate(centerU, centerV), //
|
||||||
|
new Coordinate(scaleU, scaleV), //
|
||||||
|
rotation, //
|
||||||
|
image, //
|
||||||
|
edgeMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Appearance( ambient, diffuse, specular, shininess, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public Color getAmbient() {
|
||||||
|
return ambient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAmbient(Color ambient) {
|
||||||
|
this.ambient = ambient;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getDiffuse() {
|
||||||
|
return diffuse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDiffuse(Color diffuse) {
|
||||||
|
this.diffuse = diffuse;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getSpecular() {
|
||||||
|
return specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSpecular(Color specular) {
|
||||||
|
this.specular = specular;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getShininess() {
|
||||||
|
return shininess;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShininess(int shininess) {
|
||||||
|
this.shininess = shininess;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getOffsetU() {
|
||||||
|
return offsetU;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOffsetU(double offsetU) {
|
||||||
|
this.offsetU = offsetU;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getOffsetV() {
|
||||||
|
return offsetV;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOffsetV(double offsetV) {
|
||||||
|
this.offsetV = offsetV;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOffset(double u, double v) {
|
||||||
|
setOffsetU(u);
|
||||||
|
setOffsetV(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getCenterU() {
|
||||||
|
return centerU;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCenterU(double centerU) {
|
||||||
|
this.centerU = centerU;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getCenterV() {
|
||||||
|
return centerV;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCenterV(double centerV) {
|
||||||
|
this.centerV = centerV;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCenter(double u, double v) {
|
||||||
|
setCenterU(u);
|
||||||
|
setCenterV(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getScaleU() {
|
||||||
|
return scaleU;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScaleU(double scaleU) {
|
||||||
|
this.scaleU = scaleU;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getScaleV() {
|
||||||
|
return scaleV;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScaleV(double scaleV) {
|
||||||
|
this.scaleV = scaleV;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScale(double u, double v) {
|
||||||
|
setScaleU(u);
|
||||||
|
setScaleV(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getRotation() {
|
||||||
|
return rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRotation(double rotation) {
|
||||||
|
this.rotation = rotation;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public URL getImage() {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setImage(URL image) {
|
||||||
|
this.image = image;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Decal.EdgeMode getEdgeMode() {
|
||||||
|
return edgeMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEdgeMode(Decal.EdgeMode edgeMode) {
|
||||||
|
this.edgeMode = edgeMode;
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void fireChangeEvent() {
|
||||||
|
super.fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
63
core/src/net/sf/openrocket/appearance/Decal.java
Normal file
63
core/src/net/sf/openrocket/appearance/Decal.java
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package net.sf.openrocket.appearance;
|
||||||
|
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import net.sf.openrocket.util.Coordinate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A texture that can be applied by an Appearance. This class is immutable.
|
||||||
|
*
|
||||||
|
* @author Bill Kuker <bkuker@billkuker.com>
|
||||||
|
*/
|
||||||
|
public class Decal {
|
||||||
|
|
||||||
|
public static enum EdgeMode {
|
||||||
|
REPEAT, MIRROR, CLAMP;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Coordinate offset, center, scale;
|
||||||
|
private final double rotation;
|
||||||
|
private final URL image;
|
||||||
|
private final EdgeMode mode;
|
||||||
|
|
||||||
|
Decal(final Coordinate offset, final Coordinate center, final Coordinate scale, final double rotation,
|
||||||
|
final URL image, final EdgeMode mode) {
|
||||||
|
this.offset = offset;
|
||||||
|
this.center = center;
|
||||||
|
this.scale = scale;
|
||||||
|
this.rotation = rotation;
|
||||||
|
this.image = image;
|
||||||
|
this.mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Coordinate getOffset() {
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Coordinate getCenter() {
|
||||||
|
return center;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Coordinate getScale() {
|
||||||
|
return scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getRotation() {
|
||||||
|
return rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EdgeMode getEdgeMode() {
|
||||||
|
return mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public URL getImageURL() {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Texture [offset=" + offset + ", center=" + center + ", scale=" + scale + ", rotation=" + rotation
|
||||||
|
+ ", image=" + image + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user