Skip to content

Commit 734d45f

Browse files
committed
Moar changes
1 parent 6094b4b commit 734d45f

File tree

2 files changed

+47
-11
lines changed

2 files changed

+47
-11
lines changed

src/main/java/dev/latvian/mods/klib/color/CompoundGradient.java

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
import java.util.List;
1515
import java.util.function.Function;
1616

17-
public record CompoundGradient(PositionedColor[] sorted) implements Gradient {
17+
public final class CompoundGradient implements Gradient {
1818
public static final Codec<CompoundGradient> DIRECT_CODEC = RecordCodecBuilder.create(instance -> instance.group(
19-
PositionedColor.CODEC.listOf().fieldOf("colors").forGetter(CompoundGradient::getColorList)
19+
PositionedColor.CODEC.listOf().fieldOf("colors").forGetter(c -> c.sortedList)
2020
).apply(instance, CompoundGradient::new));
2121

2222
public static CompoundGradient ofColors(List<Color> colors) {
@@ -29,12 +29,20 @@ public static CompoundGradient ofColors(List<Color> colors) {
2929
return new CompoundGradient(list);
3030
}
3131

32-
public static final Codec<CompoundGradient> CODEC = Codec.either(DIRECT_CODEC, Color.CODEC.listOf()).xmap(e -> e.map(Function.identity(), CompoundGradient::ofColors), g -> g.isSimple() ? Either.right(g.rawColors()) : Either.left(g));
33-
public static final StreamCodec<ByteBuf, CompoundGradient> STREAM_CODEC = PositionedColor.STREAM_CODEC.apply(ByteBufCodecs.list()).map(CompoundGradient::new, CompoundGradient::getColorList);
32+
public static final Codec<CompoundGradient> CODEC = Codec.either(DIRECT_CODEC, Color.CODEC.listOf()).xmap(e -> e.map(Function.identity(), CompoundGradient::ofColors), g -> g.isSimple() ? Either.right(g.getRawColors()) : Either.left(g));
33+
public static final StreamCodec<ByteBuf, CompoundGradient> STREAM_CODEC = PositionedColor.STREAM_CODEC.apply(ByteBufCodecs.list()).map(CompoundGradient::new, c -> c.sortedList);
34+
35+
private final PositionedColor[] sorted;
36+
private final List<PositionedColor> sortedList;
37+
38+
private CompoundGradient(PositionedColor[] sorted) {
39+
this.sorted = sorted;
40+
Arrays.sort(this.sorted);
41+
this.sortedList = Arrays.asList(this.sorted);
42+
}
3443

3544
public CompoundGradient(List<PositionedColor> colors) {
36-
this(colors.toArray(new PositionedColor[0]));
37-
Arrays.sort(sorted);
45+
this(colors.toArray(PositionedColor.EMPTY_ARRAY));
3846
}
3947

4048
@Override
@@ -44,7 +52,7 @@ public Color get(float delta) {
4452
} else if (delta <= 0F || sorted.length == 1) {
4553
return sorted[0].color();
4654
} else if (delta >= 1F) {
47-
return sorted[sorted.length - 1].color().get(1F);
55+
return sorted[sorted.length - 1].color();
4856
}
4957

5058
var left = sorted[0];
@@ -60,7 +68,7 @@ public Color get(float delta) {
6068
}
6169
}
6270

63-
return left.color().lerp(left.easing().ease(KMath.map(delta, left.position(), right.position(), 0F, 1F)), right.color());
71+
return left.interpolate(KMath.map(delta, left.position(), right.position(), 0F, 1F), right);
6472
}
6573

6674
@Override
@@ -88,11 +96,11 @@ public boolean isSimple() {
8896
return true;
8997
}
9098

91-
public List<PositionedColor> getColorList() {
92-
return Arrays.asList(sorted);
99+
public List<PositionedColor> getColors() {
100+
return List.copyOf(sortedList);
93101
}
94102

95-
public List<Color> rawColors() {
103+
public List<Color> getRawColors() {
96104
var list = new ArrayList<Color>(sorted.length);
97105

98106
for (var c : sorted) {
@@ -101,4 +109,20 @@ public List<Color> rawColors() {
101109

102110
return list;
103111
}
112+
113+
@Override
114+
public boolean equals(Object o) {
115+
return o == this || (o instanceof CompoundGradient c && sortedList.equals(c.sortedList));
116+
}
117+
118+
@Override
119+
public int hashCode() {
120+
return sortedList.hashCode();
121+
}
122+
123+
@Override
124+
public String toString() {
125+
return "CompoundGradient" + sortedList;
126+
}
127+
104128
}

src/main/java/dev/latvian/mods/klib/color/PositionedColor.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import org.jetbrains.annotations.NotNull;
1010

1111
public record PositionedColor(float position, Color color, Easing easing) implements Comparable<PositionedColor> {
12+
public static final PositionedColor[] EMPTY_ARRAY = new PositionedColor[0];
13+
public static final PositionedColor INVALID = new PositionedColor(Float.NaN, Color.TRANSPARENT, Easing.LINEAR);
14+
1215
public static final Codec<PositionedColor> CODEC = RecordCodecBuilder.create(instance -> instance.group(
1316
Codec.FLOAT.fieldOf("position").forGetter(PositionedColor::position),
1417
Color.CODEC.fieldOf("colors").forGetter(PositionedColor::color),
@@ -26,4 +29,13 @@ public record PositionedColor(float position, Color color, Easing easing) implem
2629
public int compareTo(@NotNull PositionedColor other) {
2730
return Float.compare(position, other.position);
2831
}
32+
33+
public Color interpolate(float delta, PositionedColor other) {
34+
return color.lerp(easing.ease(delta), other.color);
35+
}
36+
37+
@Override
38+
public boolean equals(Object o) {
39+
return o == this || o instanceof PositionedColor c && Math.abs(position - c.position) <= 0.001F && color.argb() == c.color.argb() && easing == c.easing;
40+
}
2941
}

0 commit comments

Comments
 (0)