import java.io.File; import java.io.FileNotFoundException; import java.io.FilenameFilter; import java.util.Formatter; import java.util.Scanner; public class Convert { private static final String DEFAULT_OUT_FILE = "out.FBX"; private static final String DEFAULT_ANIMATION_FOLDER = "animation"; private static final String DEFAULT_BASE_FILE = "base.FBX"; private static StringBuilder baseFileBegin = new StringBuilder(""); private static StringBuilder baseFileEnd = new StringBuilder(""); private static StringBuilder alltakes = new StringBuilder(""); private static String firstTake; /** * main method. Called once the program starts * @param args */ public static void main(String[] args) { //args[0] - base file //args[1] - animation folder //args[2] - output file //defualt is : args[0] = base.FBX // args[1] = animation // args[2] = out.FBX String baseFile; String animationFolder; String outFile; //get the application parameters try{ baseFile = args[0]; }catch(Exception e){ baseFile = DEFAULT_BASE_FILE; } try{ animationFolder = args[1]; }catch(Exception e) {animationFolder = DEFAULT_ANIMATION_FOLDER;} try{ outFile = args[2]; }catch(Exception e) {outFile = DEFAULT_OUT_FILE;} try { processBaseFile(baseFile); File directory = new File(animationFolder); for(File f : directory.listFiles(new ExtensionFilter())){ System.out.println(f.getName()); processAnimation(animationFolder, f.getName()); } writeFile(outFile); } catch (FileNotFoundException e) { System.err.println("Error: "+e.getMessage()); e.printStackTrace(); } } private static void processBaseFile(String baseFile) throws FileNotFoundException { //load all the data but the takes Scanner fileScanner = new Scanner(new File(baseFile)); boolean begin = true; boolean takes = false; int brackets = 0; while(fileScanner.hasNextLine()){ String line = fileScanner.nextLine(); //ignore comments if(line.length() > 0 && line.charAt(0) != ';') { if(line.contains("Takes: {")){ takes = true; brackets++; begin = false; baseFileBegin.append(line + "\n"); continue; } if(takes && line.contains("{")) brackets++; if(takes && line.contains("}")) brackets--; if(takes && brackets == 0) takes = false; } if(!takes && begin) baseFileBegin.append(line + "\n"); else if (!takes && !begin) baseFileEnd.append(line + "\n"); } } private static void processAnimation(String folder, String file) throws FileNotFoundException{ Scanner fileScanner = new Scanner(new File(folder + File.separator + file)); boolean takes = false; int brackets = 0; String takeName = file.substring(0, file.length()-4); if(firstTake == null) firstTake = takeName; while(fileScanner.hasNextLine()){ String line = fileScanner.nextLine(); //ignore comments if(line.length() > 0 && line.charAt(0) != ';') { //skip the current line if(brackets == 1 && line.contains("Current:")) continue; //check if we are in takes already if(line.contains("Takes: {")){ takes = true; brackets++; continue; } //rename the take if(brackets == 1 && line.contains("Take:")) { //rename the take to the file name without the suffix line = " Take: \""+ takeName +"\" " + '{'; } //rename the fileName if(brackets == 2 && line.contains("FileName:")) { //rename the take to the file name without the suffix line = " FileName: \""+ takeName +".tak\""; } if(takes && line.contains("{")) brackets++; if(takes && line.contains("}")) brackets--; if(takes && brackets == 0) takes = false; } if(takes) alltakes.append(line + "\n"); } } private static void writeFile(String file) throws FileNotFoundException{ Formatter formatter = new Formatter(file); formatter.format("%s", baseFileBegin); formatter.format(" Current: \"%s\"%n", firstTake); formatter.format("%s", alltakes); formatter.format("%s", baseFileEnd); formatter.close(); } private static class ExtensionFilter implements FilenameFilter{ @Override public boolean accept(File arg0, String arg1) { if(arg1.contains(".FBX")) return true; return false; } } }