package mods.eln.misc;
import mods.eln.misc.Obj3D.Obj3DPart;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.security.CodeSource;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* Utility class used to load all eln models and corresponding obj files.
*/
public class Obj3DFolder {
private Map<String, Obj3D> nameToObjHash = new HashMap<String, Obj3D>();
/**
* Load all obj models available in the release mod asset folder.
*/
public void loadAllElnModels() {
try {
// Find location of electrical age jar file.
CodeSource codeSource = Obj3DFolder.class.getProtectionDomain().getCodeSource();
if (codeSource != null) {
String jarFilePath = codeSource.getLocation().getPath();
if (jarFilePath.contains("!")) {
jarFilePath = jarFilePath.substring(5, jarFilePath.indexOf("!"));
JarFile jarFile = new JarFile(URLDecoder.decode(jarFilePath, "UTF-8"));
Enumeration<JarEntry> entries = jarFile.entries();
int modelCount = 0;
while (entries.hasMoreElements()) {
String filename = entries.nextElement().getName();
if (filename.startsWith("assets/eln/model/") && filename.toLowerCase().endsWith(".obj")) {
filename = filename.substring(filename.indexOf("/model/") + 7, filename.length());
Utils.println(String.format("Loading model %03d '%s'", ++modelCount, filename));
loadObj(filename);
}
}
} else {
Integer modelCount = 0;
File modelFolder = new File(mods.eln.Eln.class.getResource("/assets/eln/model").toURI());
if (modelFolder.isDirectory()) {
loadModelsRecursive(modelFolder, modelCount);
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
private void loadModelsRecursive(File folder, Integer modelCount) {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
loadModelsRecursive(file, modelCount);
} else if (file.getName().toLowerCase().endsWith(".obj")) {
String filename = file.getPath().replaceAll("\\\\", "/");
filename = filename.substring(filename.indexOf("/model/") + 7, filename.length());
Utils.println(String.format("Loading model %03d '%s'", ++modelCount, filename));
loadObj(filename);
}
}
}
/**
* Load an obj file of a model.
*
* @param modelPath path inside model folder (ex. Vumeter/Vumeter.obj)
*/
private void loadObj(String modelPath) {
Obj3D obj = new Obj3D();
if (obj.loadFile(modelPath)) {
String tag = modelPath.replaceAll(".obj", "").replaceAll(".OBJ", "");
tag = tag.substring(tag.lastIndexOf('/') + 1, tag.length());
if (nameToObjHash.containsKey(tag)) {
Utils.println("Double load of model " + tag);
}
nameToObjHash.put(tag, obj); // name of the file, without extension
Utils.println(String.format(" - model '%s' loaded", modelPath));
} else {
Utils.println(String.format(" - unable to load model '%s'", modelPath));
}
}
public Obj3D getObj(String obj3DName) {
return nameToObjHash.get(obj3DName);
}
public Obj3DPart getPart(String objName, String partName) {
Obj3D obj = getObj(objName);
if (obj == null) return null;
return obj.getPart(partName);
}
public void draw(String objName, String partName) {
Obj3DPart part = getPart(objName, partName);
if (part != null) part.draw();
}
}