Skip to content

Commit

Permalink
Improved CubeConverter implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
RaphiMC committed Sep 5, 2024
1 parent 82bb90c commit 058d871
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 84 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ dependencies {
exclude group: "com.google.guava"
}
api "org.lz4:lz4-pure-java:1.8.0"
api("com.github.Oryxel:CubeConverter:b382f23e8a") {
api("com.github.Oryxel:CubeConverter:126b3424a6") {
transitive = false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,7 @@ public void setPosition(final Position3f position) {
public void setRotation(final Position3f rotation) {
super.setRotation(rotation);

if (!this.spawned) {
this.spawned = true;
this.spawn();
} else {
if (this.spawned) {
this.partEntities.forEach(ItemDisplayEntity::updatePositionAndRotation);
}
}
Expand Down Expand Up @@ -106,6 +103,7 @@ private void spawn() {

final float scale = (float) resourcePacksStorage.getConverterData().get("ce_" + this.entityDefinition.identifier() + "_default_" + i + "_scale");
javaEntityData.add(new EntityData(partEntity.getJavaEntityDataIndex("SCALE"), Types1_21.ENTITY_DATA_TYPES.vector3FType, new Vector3f(scale, scale, scale)));
javaEntityData.add(new EntityData(partEntity.getJavaEntityDataIndex("TRANSLATION"), Types1_21.ENTITY_DATA_TYPES.vector3FType, new Vector3f(0F, scale * 0.5F, 0F)));

final PacketWrapper addEntity = PacketWrapper.create(ClientboundPackets1_21.ADD_ENTITY, user);
addEntity.write(Types.VAR_INT, partEntity.javaId()); // entity id
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
*/
package net.raphimc.viabedrock.api.model.resourcepack;

import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import com.viaversion.viaversion.util.Key;
import net.raphimc.viabedrock.ViaBedrock;
import net.raphimc.viabedrock.protocol.storage.ResourcePacksStorage;
import org.oryxel.cube.model.bedrock.BedrockEntityData;
import org.oryxel.cube.parser.bedrock.BedrockEntitySerializer;

import java.util.Collections;
import java.util.HashMap;
Expand All @@ -37,22 +37,9 @@ public EntityDefinitions(final ResourcePacksStorage resourcePacksStorage) {
for (ResourcePack pack : resourcePacksStorage.getPackStackBottomToTop()) {
for (String entityPath : pack.content().getFilesDeep("entity/", ".json")) {
try {
final JsonObject description = pack.content().getJson(entityPath).getAsJsonObject("minecraft:client_entity").getAsJsonObject("description");
final String identifier = Key.namespaced(description.get("identifier").getAsString());
final EntityDefinition entityDefinition = new EntityDefinition(identifier, pack.content().getString(entityPath));
if (description.has("geometry")) {
final JsonObject geometry = description.getAsJsonObject("geometry");
for (Map.Entry<String, JsonElement> entry : geometry.entrySet()) {
entityDefinition.models.put(entry.getKey(), entry.getValue().getAsString());
}
}
if (description.has("textures")) {
final JsonObject textures = description.getAsJsonObject("textures");
for (Map.Entry<String, JsonElement> entry : textures.entrySet()) {
entityDefinition.textures.put(entry.getKey(), entry.getValue().getAsString());
}
}
this.entities.put(identifier, entityDefinition);
final BedrockEntityData bedrockEntityData = BedrockEntitySerializer.deserialize(pack.content().getString(entityPath));
final String identifier = Key.namespaced(bedrockEntityData.identifier());
this.entities.put(identifier, new EntityDefinition(identifier, bedrockEntityData));
} catch (Throwable e) {
ViaBedrock.getPlatform().getLogger().log(Level.WARNING, "Failed to parse entity definition " + entityPath + " in pack " + pack.packId(), e);
}
Expand All @@ -71,29 +58,19 @@ public Map<String, EntityDefinition> entities() {
public static class EntityDefinition {

private final String identifier;
private final Map<String, String> models = new HashMap<>();
private final Map<String, String> textures = new HashMap<>();
private final String jsonForCubeConverter;
private final BedrockEntityData entityData;

public EntityDefinition(final String identifier, final String jsonForCubeConverter) {
public EntityDefinition(final String identifier, final BedrockEntityData entityData) {
this.identifier = identifier;
this.jsonForCubeConverter = jsonForCubeConverter;
this.entityData = entityData;
}

public String identifier() {
return this.identifier;
}

public Map<String, String> models() {
return Collections.unmodifiableMap(this.models);
}

public Map<String, String> textures() {
return Collections.unmodifiableMap(this.textures);
}

public String jsonForCubeConverter() {
return this.jsonForCubeConverter;
public BedrockEntityData entityData() {
return this.entityData;
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
*/
package net.raphimc.viabedrock.api.model.resourcepack;

import com.viaversion.viaversion.libs.gson.JsonElement;
import com.viaversion.viaversion.libs.gson.JsonObject;
import net.raphimc.viabedrock.ViaBedrock;
import net.raphimc.viabedrock.protocol.storage.ResourcePacksStorage;
import org.oryxel.cube.model.bedrock.BedrockGeometry;
import org.oryxel.cube.parser.bedrock.BedrockGeometrySerializer;

import java.util.Collections;
import java.util.HashMap;
Expand All @@ -29,18 +29,15 @@

public class ModelDefinitions {

private final Map<String, ModelDefinition> entityModels = new HashMap<>();
private final Map<String, BedrockGeometry> entityModels = new HashMap<>();

public ModelDefinitions(final ResourcePacksStorage resourcePacksStorage) {
for (ResourcePack pack : resourcePacksStorage.getPackStackBottomToTop()) {
for (String modelPath : pack.content().getFilesDeep("models/", ".json")) {
try {
for (JsonElement geometryElement : pack.content().getJson(modelPath).getAsJsonArray("minecraft:geometry")) {
final JsonObject description = geometryElement.getAsJsonObject().getAsJsonObject("description");
final String name = description.get("identifier").getAsString();
final ModelDefinition modelDefinition = new ModelDefinition(name, pack.content().getString(modelPath));
for (BedrockGeometry bedrockGeometry : BedrockGeometrySerializer.deserialize(pack.content().getString(modelPath))) {
if (modelPath.startsWith("models/entity/")) {
this.entityModels.put(name, modelDefinition);
this.entityModels.put(bedrockGeometry.identifier(), bedrockGeometry);
}
}
} catch (Throwable e) {
Expand All @@ -50,32 +47,12 @@ public ModelDefinitions(final ResourcePacksStorage resourcePacksStorage) {
}
}

public ModelDefinition getEntityModel(final String name) {
public BedrockGeometry getEntityModel(final String name) {
return this.entityModels.get(name);
}

public Map<String, ModelDefinition> entityModels() {
public Map<String, BedrockGeometry> entityModels() {
return Collections.unmodifiableMap(this.entityModels);
}

public static class ModelDefinition {

private final String name;
private final String jsonForCubeConverter;

public ModelDefinition(final String name, final String jsonForCubeConverter) {
this.name = name;
this.jsonForCubeConverter = jsonForCubeConverter;
}

public String name() {
return this.name;
}

public String jsonForCubeConverter() {
return this.jsonForCubeConverter;
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,13 @@
import com.viaversion.viaversion.libs.gson.JsonArray;
import com.viaversion.viaversion.libs.gson.JsonObject;
import net.raphimc.viabedrock.api.model.resourcepack.EntityDefinitions;
import net.raphimc.viabedrock.api.model.resourcepack.ModelDefinitions;
import net.raphimc.viabedrock.api.model.resourcepack.ResourcePack;
import net.raphimc.viabedrock.api.util.StringUtil;
import net.raphimc.viabedrock.protocol.storage.ResourcePacksStorage;
import org.oryxel.cube.converter.FormatConverter;
import org.oryxel.cube.converter.enums.OverflowFixType;
import org.oryxel.cube.model.bedrock.BedrockGeometry;
import org.oryxel.cube.model.java.ItemModelData;
import org.oryxel.cube.parser.bedrock.BedrockGeometrySerializer;
import org.oryxel.cube.parser.java.JavaModelSerializer;

import java.awt.image.BufferedImage;
Expand All @@ -45,7 +43,7 @@ public static void apply(final ResourcePacksStorage resourcePacksStorage, final
final Map<Integer, JsonObject> overridesMap = new TreeMap<>();

for (Map.Entry<String, EntityDefinitions.EntityDefinition> entityEntry : resourcePacksStorage.getEntities().entities().entrySet()) {
for (String bedrockPath : entityEntry.getValue().textures().values()) {
for (String bedrockPath : entityEntry.getValue().entityData().textures().values()) {
final String javaPath = "entity_texture/" + StringUtil.makeIdentifierValueSafe(bedrockPath.replace("textures/", ""));
for (ResourcePack pack : resourcePacksStorage.getPackStackTopToBottom()) {
final ResourcePack.Content bedrockContent = pack.content();
Expand All @@ -58,25 +56,21 @@ public static void apply(final ResourcePacksStorage resourcePacksStorage, final
}

final EntityDefinitions.EntityDefinition entityDefinition = entityEntry.getValue();
for (Map.Entry<String, String> modelEntry : entityDefinition.models().entrySet()) {
final ModelDefinitions.ModelDefinition modelDefinition = resourcePacksStorage.getModels().entityModels().get(modelEntry.getValue());
if (modelDefinition == null) continue;
for (Map.Entry<String, String> modelEntry : entityDefinition.entityData().geometries().entrySet()) {
final BedrockGeometry bedrockGeometry = resourcePacksStorage.getModels().entityModels().get(modelEntry.getValue());
if (bedrockGeometry == null) continue;
if (!entityDefinition.entityData().textures().containsKey(modelEntry.getKey())) continue;

if (!modelEntry.getKey().equals("default")) continue; // CubeConverter only supports one model per entity
if (!entityDefinition.textures().containsKey(modelEntry.getKey())) continue;
final String javaTexturePath = "entity_texture/" + StringUtil.makeIdentifierValueSafe(entityDefinition.entityData().textures().get(modelEntry.getKey()).replace("textures/", ""));

final String javaTexturePath = "entity_texture/" + StringUtil.makeIdentifierValueSafe(entityDefinition.textures().get(modelEntry.getKey()).replace("textures/", ""));

final BedrockGeometry cubeConverterGeometry = BedrockGeometrySerializer.deserialize(modelDefinition.jsonForCubeConverter());
final List<ItemModelData> cubeConverterItemModels = Lists.newArrayList(FormatConverter.bedrockToJava("viabedrock:item/" + javaTexturePath, cubeConverterGeometry, OverflowFixType.CLAMP));
final List<ItemModelData> cubeConverterItemModels = Lists.newArrayList(FormatConverter.bedrockToJava("viabedrock:item/" + javaTexturePath, bedrockGeometry, OverflowFixType.SCALING));
final String key = entityEntry.getKey() + "_" + modelEntry.getKey();
resourcePacksStorage.getConverterData().put("ce_" + key, cubeConverterItemModels.size());
for (int i = 0; i < cubeConverterItemModels.size(); i++) {
final ItemModelData cubeConverterItemModel = cubeConverterItemModels.get(i);
final String javaModelName = StringUtil.makeIdentifierValueSafe(key + "_" + i);
final int javaModelData = getCustomModelData(key + "_" + i);
// resourcePacksStorage.getConverterData().put("ce_" + key + "_" + i + "_scale", (float) cubeConverterItemModel.scale());
resourcePacksStorage.getConverterData().put("ce_" + key + "_" + i + "_scale", 1F);
resourcePacksStorage.getConverterData().put("ce_" + key + "_" + i + "_scale", (float) cubeConverterItemModel.scale());

javaContent.putString("assets/viabedrock/models/" + javaModelName + ".json", JavaModelSerializer.serialize(cubeConverterItemModel).toString());

Expand All @@ -85,7 +79,9 @@ public static void apply(final ResourcePacksStorage resourcePacksStorage, final
final JsonObject predicate = new JsonObject();
predicate.addProperty("custom_model_data", javaModelData);
override.add("predicate", predicate);
overridesMap.put(javaModelData, override);
if (overridesMap.put(javaModelData, override) != null) {
throw new IllegalStateException("Duplicate custom model data: " + override);
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ public static void apply(final ResourcePacksStorage resourcePacksStorage, final
final JsonObject predicate = new JsonObject();
predicate.addProperty("custom_model_data", javaModelData);
override.add("predicate", predicate);
overridesMap.put(javaModelData, override);
if (overridesMap.put(javaModelData, override) != null) {
throw new IllegalStateException("Duplicate custom model data: " + override);
}
break;
}
}
Expand Down

0 comments on commit 058d871

Please sign in to comment.