Skip to content

Commit d07d94b

Browse files
committed
feat: parallel json build
1 parent 285abec commit d07d94b

File tree

6 files changed

+41
-42
lines changed

6 files changed

+41
-42
lines changed

api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintElement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public List<BlueprintJson> buildModernJson(
160160
.filter(Cube::hasTexture)
161161
.toList();
162162
if (cubeElement.isEmpty()) return null;
163-
return new BlueprintJson(obfuscator.models().obfuscate(jsonName(parent) + "_" + number), JsonObjectBuilder.builder()
163+
return new BlueprintJson(obfuscator.models().obfuscate(jsonName(parent) + "_" + number), () -> JsonObjectBuilder.builder()
164164
.jsonObject("textures", textures -> {
165165
var index = 0;
166166
for (BlueprintTexture texture : parent.textures()) {

api/src/main/java/kr/toxicity/model/api/data/blueprint/BlueprintJson.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
import com.google.gson.JsonElement;
1010
import org.jetbrains.annotations.NotNull;
1111

12+
import java.util.function.Supplier;
13+
1214
/**
1315
* Blueprint json.
1416
* @param name json name
1517
* @param element json element
1618
*/
1719
public record BlueprintJson(
1820
@NotNull String name,
19-
@NotNull JsonElement element
21+
@NotNull Supplier<JsonElement> element
2022
) {
2123
}

api/src/main/java/kr/toxicity/model/api/data/raw/ModelAnimation.java

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import kr.toxicity.model.api.script.BlueprintScript;
2020
import kr.toxicity.model.api.script.TimeScript;
2121
import kr.toxicity.model.api.util.InterpolationUtil;
22-
import lombok.RequiredArgsConstructor;
2322
import org.jetbrains.annotations.ApiStatus;
2423
import org.jetbrains.annotations.NotNull;
2524
import org.jetbrains.annotations.Nullable;
@@ -60,13 +59,9 @@ public record ModelAnimation(
6059
animators().entrySet().stream()
6160
.filter(e -> context.availableUUIDs.contains(e.getKey()))
6261
.map(Map.Entry::getValue)
63-
.filter(ModelAnimator::isAvailable),
64-
e -> BoneTagRegistry.parse(e.name()),
65-
e -> {
66-
var builder = new Builder(context, length(), e.rotationGlobal());
67-
e.stream().forEach(builder::addFrame);
68-
return builder.build(name());
69-
}
62+
.filter(ModelAnimator::isAvailable)
63+
.map(a -> buildAnimationData(context, a)),
64+
data -> BoneTagRegistry.parse(data.name())
7065
));
7166
return new BlueprintAnimation(
7267
name(),
@@ -135,36 +130,25 @@ public Map<String, ModelAnimator> animators() {
135130
return animators != null ? animators : Collections.emptyMap();
136131
}
137132

138-
@RequiredArgsConstructor
139-
private static final class Builder {
140-
141-
private final ModelLoadContext context;
142-
private final float length;
143-
private final boolean rotationGlobal;
144-
145-
private final List<VectorPoint> transform = new ArrayList<>();
146-
private final List<VectorPoint> scale = new ArrayList<>();
147-
private final List<VectorPoint> rotation = new ArrayList<>();
148-
149-
void addFrame(@NotNull ModelKeyframe keyframe) {
150-
var time = keyframe.time();
151-
if (time > length) return;
152-
var version = context.meta.formatVersion();
133+
@NotNull
134+
private BlueprintAnimator.AnimatorData buildAnimationData(@NotNull ModelLoadContext context, @NotNull ModelAnimator animator) {
135+
var position = new ArrayList<VectorPoint>();
136+
var rotation = new ArrayList<VectorPoint>();
137+
var scale = new ArrayList<VectorPoint>();
138+
var version = context.meta.formatVersion();
139+
animator.stream().filter(keyframe -> keyframe.time() <= length()).forEach(keyframe -> {
153140
switch (keyframe.channel()) {
154-
case POSITION -> transform.add(keyframe.point(context, version::convertAnimationPosition));
141+
case POSITION -> position.add(keyframe.point(context, version::convertAnimationPosition));
155142
case ROTATION -> rotation.add(keyframe.point(context, version::convertAnimationRotation));
156143
case SCALE -> scale.add(keyframe.point(context, version::convertAnimationScale));
157144
}
158-
}
159-
160-
@NotNull BlueprintAnimator.AnimatorData build(@NotNull String name) {
161-
return new BlueprintAnimator.AnimatorData(
162-
name,
163-
transform,
164-
scale,
165-
rotation,
166-
rotationGlobal
167-
);
168-
}
145+
});
146+
return new BlueprintAnimator.AnimatorData(
147+
animator.name(),
148+
position,
149+
scale,
150+
rotation,
151+
animator.rotationGlobal()
152+
);
169153
}
170154
}

api/src/main/java/kr/toxicity/model/api/pack/PackObfuscator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import kr.toxicity.model.api.BetterModel;
1010
import org.jetbrains.annotations.NotNull;
1111

12-
import java.util.HashMap;
1312
import java.util.Map;
13+
import java.util.concurrent.ConcurrentHashMap;
1414

1515
/**
1616
* Pack obfuscator
@@ -70,7 +70,7 @@ final class Order implements PackObfuscator {
7070
};
7171
private static final int NAME_LENGTH = AVAILABLE_NAME.length;
7272

73-
private final Map<String, String> nameMap = new HashMap<>();
73+
private final Map<String, String> nameMap = new ConcurrentHashMap<>();
7474
private final StringBuilder builder = new StringBuilder();
7575

7676
/**

api/src/main/java/kr/toxicity/model/api/util/interpolator/VectorInterpolator.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
*/
2525
@ApiStatus.Internal
2626
public enum VectorInterpolator {
27+
/**
28+
* Linear
29+
*/
2730
@SerializedName("linear")
2831
LINEAR {
2932
@NotNull
@@ -41,6 +44,9 @@ public Vector3f interpolate(@NotNull List<VectorPoint> points, int p2Index, floa
4144
);
4245
}
4346
},
47+
/**
48+
* Catmullrom
49+
*/
4450
@SerializedName("catmullrom")
4551
CATMULLROM {
4652
private static @NotNull VectorPoint indexOf(@NotNull List<VectorPoint> list, int index, int relative) {
@@ -70,6 +76,9 @@ public Vector3f interpolate(@NotNull List<VectorPoint> points, int p2Index, floa
7076
);
7177
}
7278
},
79+
/**
80+
* Bezier
81+
*/
7382
@SerializedName("bezier")
7483
BEZIER {
7584
@NotNull
@@ -93,6 +102,9 @@ public Vector3f interpolate(@NotNull List<VectorPoint> points, int p2Index, floa
93102
);
94103
}
95104
},
105+
/**
106+
* Step
107+
*/
96108
@SerializedName("step")
97109
STEP {
98110
@NotNull
@@ -115,6 +127,7 @@ public boolean isContinuous() {
115127
* @param time destination time
116128
* @return interpolated vector
117129
*/
130+
@NotNull
118131
public abstract Vector3f interpolate(@NotNull List<VectorPoint> points, int p2Index, float time);
119132

120133
/**

core/src/main/kotlin/kr/toxicity/model/manager/ModelManagerImpl.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ object ModelManagerImpl : ModelManager, GlobalManager {
135135
"model" to "${CONFIG.namespace()}:item/${blueprint.name}"
136136
)
137137
pack.add("${blueprint.name}.json", size) {
138-
blueprint.element.toByteArray()
138+
blueprint.element.get().toByteArray()
139139
}
140140
},
141141
onClose = {
@@ -161,7 +161,7 @@ object ModelManagerImpl : ModelManager, GlobalManager {
161161
)
162162
blueprints.forEach { json ->
163163
pack.add("${json.name}.json", size / blueprints.size) {
164-
json.element.toByteArray()
164+
json.element.get().toByteArray()
165165
}
166166
}
167167
},
@@ -202,7 +202,7 @@ object ModelManagerImpl : ModelManager, GlobalManager {
202202
modernModel.ifAvailable {
203203
group.buildModernJson(textures.obfuscator().withModels(pack.obfuscator()), load)
204204
}?.let {
205-
modernModel.build(it, size)
205+
modernModel.build(it, size / it.size)
206206
success = true
207207
}
208208
//Legacy

0 commit comments

Comments
 (0)