package speiger.src.coreengine.rendering.models.loader; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.List; import java.util.UUID; import com.google.gson.JsonObject; import speiger.src.collections.objects.lists.ObjectArrayList; import speiger.src.collections.objects.utils.ObjectLists; import speiger.src.coreengine.assets.AssetLocation; import speiger.src.coreengine.assets.AssetManager; import speiger.src.coreengine.assets.IAsset; import speiger.src.coreengine.math.misc.ColorUtils; import speiger.src.coreengine.utils.collections.iterators.IterableWrapper; import speiger.src.coreengine.utils.helpers.JsonUtil; public class ModelLoader { public static List readModelData(AssetLocation location, AssetManager manager) { try(IAsset asset = manager.getAsset(location)) { List result = new ObjectArrayList<>(); JsonObject obj = asset.getJsonObject(); JsonUtil.iterate(obj.get("models"), T -> { JsonObject info = T.getAsJsonObject("info"); JsonObject format = T.getAsJsonObject("format"); JsonObject data = T.getAsJsonObject("data"); List entries = VertexLoader.loadVertexFormat(format); ByteBuffer buffer = VertexLoader.parseVertexData(data, info.get("vertecies").getAsInt(), entries, true); result.add(new SimpleModelData(info.get("name").getAsString(), UUID.fromString(info.get("id").getAsString()), buffer.array(), JsonUtil.parseIntArray(data.getAsJsonArray("indecies")))); }); return result; } catch(Exception e) { e.printStackTrace(); } return ObjectLists.empty(); } public static List readLegacyModelData(AssetLocation location, AssetManager manager) { List resultModels = new ObjectArrayList(); ByteBuffer buffer = null; int[] indexes = null; String currentName = null; try(IAsset asset = manager.getAsset(location)) { boolean flag = false; for(String line : IterableWrapper.wrap(asset.getStringReader())) { if(line.startsWith("{")) { if(currentName != null) { resultModels.add(new SimpleModelData(currentName, null, buffer.array(), indexes)); currentName = null; } currentName = line.substring(1, line.length() - 1); flag = true; } else if(flag) { flag = false; String[] bounds = line.split(";"); buffer = ByteBuffer.allocate(Integer.parseInt(bounds[0]) * 28).order(ByteOrder.nativeOrder()); indexes = new int[Integer.parseInt(bounds[1])]; } else if(line.startsWith("<")) { String[] data = line.substring(1, line.length() - 1).split(" "); String[] position = data[0].split(";"); String[] normal = data[2].split(";"); buffer.putFloat(Float.parseFloat(position[0])).putFloat(Float.parseFloat(position[1])).putFloat(Float.parseFloat(position[2])); ColorUtils.write(Integer.parseInt(data[1]), true, buffer); buffer.putFloat(Float.parseFloat(normal[0])).putFloat(Float.parseFloat(normal[1])).putFloat(Float.parseFloat(normal[2])); } else if(line.startsWith("[")) { String[] data = line.substring(1, line.length() - 1).split(";"); for(int j = 0;j