package tk.captainsplexx.Resource.MESH;
import java.util.ArrayList;
import java.util.HashMap;
import tk.captainsplexx.Game.Core;
import tk.captainsplexx.Resource.EBX.EBXComplex;
import tk.captainsplexx.Resource.EBX.EBXExternalGUID;
import tk.captainsplexx.Resource.EBX.EBXField;
import tk.captainsplexx.Resource.EBX.EBXHandler;
import tk.captainsplexx.Resource.EBX.EBXInstance;
import tk.captainsplexx.Resource.EBX.Structure.EBXStructureFile;
import tk.captainsplexx.Resource.EBX.Structure.EBXStructureInstance;
import tk.captainsplexx.Resource.EBX.Structure.EBXStructureReader.EntryType;
import tk.captainsplexx.Resource.EBX.Structure.Entry.EBXMeshVariationDatabase;
import tk.captainsplexx.Resource.EBX.Structure.Entry.EBXMeshVariationDatabaseEntry;
import tk.captainsplexx.Resource.EBX.Structure.Entry.EBXMeshVariationDatabaseMaterial;
import tk.captainsplexx.Resource.EBX.Structure.Entry.EBXMeshVariationDatabaseRedirectEntry;
import tk.captainsplexx.Resource.EBX.Structure.Entry.EBXObjArray;
import tk.captainsplexx.Resource.EBX.Structure.Entry.EBXTextureShaderParameter;
import tk.captainsplexx.Resource.EBX.Structure.Entry.EBXTextureShaderParameter.ParameterName;
public class MeshVariationDatabaseHandler {
public ArrayList<EBXStructureFile> databases;
public void reset(){
databases = new ArrayList<>();
Core.getJavaFXHandler().getMainWindow().updateMeshvariationDatabaseComboBox(databases);
}
public void deleteDatabase(String name){
EBXStructureFile db = getDatabaseByName(name);
if (db!=null){
databases.remove(db);
Core.getJavaFXHandler().getMainWindow().updateMeshvariationDatabaseComboBox(databases);
}
}
public void addDatabase(EBXStructureFile structFile){
databases.add(structFile);
Core.getJavaFXHandler().getMainWindow().updateMeshvariationDatabaseComboBox(databases);
}
public EBXStructureFile getDatabaseByName(String name){
for (EBXStructureFile db : databases){
if (db.getStructureName().equalsIgnoreCase(name)){
return db;
}
}
return null;
}
public EBXStructureFile getDatabaseByEBXGUID(String ebxGUID){
for (EBXStructureFile db : databases){
if (db.getEBXGUID().equalsIgnoreCase(ebxGUID)){
return db;
}
}
return null;
}
public EBXMeshVariationDatabaseEntry getVariationDatabaseEntry(EBXStructureFile databaseFile, long variationAssetNameHash, EBXExternalGUID meshExternalGUID, boolean excludeRedirect){
if (variationAssetNameHash<1&&meshExternalGUID==null){
System.err.println("MeshVariationDataBaseHander can't fetch the Entry, no GUID or AssetNameHash given!");
return null;
}
EBXStructureInstance instance = databaseFile.getFirstInstance(EntryType.MeshVariationDatabase);
if (instance!=null){
EBXMeshVariationDatabase database = (EBXMeshVariationDatabase) instance.getEntry();
Object[] entries = database.getEntries().getObjects();
if (entries!=null){
if (meshExternalGUID!=null){
//Try to fetch using mesh guid
for (Object obj : entries){
EBXMeshVariationDatabaseEntry entry = (EBXMeshVariationDatabaseEntry) obj;
if (entry.getMesh().getInstanceGUID().equalsIgnoreCase(meshExternalGUID.getInstanceGUID())){
return entry;
}else{
continue;
}
}
}
else if(variationAssetNameHash>1){
//Try to fetch using AssetNameHash
for (Object obj : entries){
EBXMeshVariationDatabaseEntry entry = (EBXMeshVariationDatabaseEntry) obj;
if (entry.getVariationAssetNameHash()==variationAssetNameHash){
return entry;
}else{
continue;
}
}
}
if (!excludeRedirect){
//Try to find the redirect
EBXMeshVariationDatabaseRedirectEntry[] redirectEntries = (EBXMeshVariationDatabaseRedirectEntry[]) database.getRedirectEntries().getObjects();
if (redirectEntries!=null){
for (EBXMeshVariationDatabaseRedirectEntry redi : redirectEntries){
if (redi.getMesh().getInstanceGUID().equalsIgnoreCase(meshExternalGUID.getInstanceGUID())){
return getVariationDatabaseEntry(databaseFile, redi.getVariationAssetNameHash(), null, true);
}
}
}
}
}
}
return null;
}
public EBXMeshVariationDatabaseMaterial getVariationDatabaseMaterial(EBXMeshVariationDatabaseEntry dbEntry, EBXExternalGUID materialExternalGUID){
EBXObjArray materialsArr = dbEntry.getMaterials();
if (materialsArr!=null){
Object[] materials = materialsArr.getObjects();
if (materials!=null){
for (Object obj : materials){
EBXMeshVariationDatabaseMaterial dbMaterial = (EBXMeshVariationDatabaseMaterial) obj;
if (dbMaterial.getMaterial().getInstanceGUID().equalsIgnoreCase(materialExternalGUID.getInstanceGUID())){
return dbMaterial;
}else{
continue;
}
}
}
}
return null;
}
public EBXExternalGUID getTexture(EBXMeshVariationDatabaseMaterial material, ParameterName parameterName){
EBXObjArray parameters = material.getTextureParameters();
if (parameters!=null){
Object[] tspArr = parameters.getObjects();
if (tspArr!=null){
for (Object obj : tspArr){
EBXTextureShaderParameter parameter = (EBXTextureShaderParameter) obj;
if (parameter.getParameterName()!=null){
if (parameter.getParameterName().equalsIgnoreCase(parameterName.toString())){
return parameter.getValue();
}else{
continue;
}
}
}
}
}
return null;
}
}