Java tutorial
/******************************************************************************* * This file is part of TERMINAL RECALL * Copyright (c) 2012-2014 Chuck Ritola * Part of the jTRFP.org project * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * chuck - initial API and implementation ******************************************************************************/ package org.jtrfp.trcl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.commons.math3.exception.MathArithmeticException; import org.apache.commons.math3.geometry.euclidean.threed.Vector3D; import org.jtrfp.trcl.core.TR; import org.jtrfp.trcl.file.DEFFile; import org.jtrfp.trcl.file.DEFFile.EnemyDefinition; import org.jtrfp.trcl.file.DEFFile.EnemyDefinition.EnemyLogic; import org.jtrfp.trcl.file.DEFFile.EnemyPlacement; import org.jtrfp.trcl.flow.LoadingProgressReporter; import org.jtrfp.trcl.gpu.Model; import org.jtrfp.trcl.gui.Reporter; import org.jtrfp.trcl.obj.DEFObject; import org.jtrfp.trcl.obj.EnemyIntro; import org.jtrfp.trcl.obj.ObjectDirection; import org.jtrfp.trcl.obj.ObjectPlacer; import org.jtrfp.trcl.obj.WorldObject; public class DEFObjectPlacer implements ObjectPlacer { private DEFFile def; private List<DEFObject> defList; private Vector3D headingOverride = null; private final LoadingProgressReporter rootReporter; private final ArrayList<EnemyIntro> enemyIntros = new ArrayList<EnemyIntro>(); private final HashMap<EnemyDefinition, WorldObject> enemyPlacementMap = new HashMap<EnemyDefinition, WorldObject>(); private final TR tr; public DEFObjectPlacer(DEFFile def, TR tr, LoadingProgressReporter reporter) { this.def = def; this.tr = tr; this.rootReporter = reporter; } public DEFObjectPlacer(DEFFile defFile, TR tr, List<DEFObject> defList, LoadingProgressReporter defObjectReporter) { this(defFile, tr, defObjectReporter); this.defList = defList; }//end constructor @Override public void placeObjects(RenderableSpacePartitioningGrid target, Vector3D positionOffset) { final List<EnemyDefinition> defs = def.getEnemyDefinitions(); final List<EnemyPlacement> places = def.getEnemyPlacements(); final Model[] models = new Model[defs.size()]; //final TR tr = world.getTr(); final LoadingProgressReporter[] defReporters = rootReporter.generateSubReporters(defs.size()); final LoadingProgressReporter[] placementReporters = rootReporter.generateSubReporters(places.size()); for (int i = 0; i < defs.size(); i++) { defReporters[i].complete(); final int index = i;//??? final EnemyDefinition def = defs.get(index); try { models[index] = tr.getResourceManager().getBINModel(def.getComplexModelFile(), tr.getGlobalPaletteVL(), null, tr.gpu.get().getGl()); } catch (Exception e) { e.printStackTrace(); } if (models[index] == null) System.out.println( "Failed to get a model from BIN " + def.getComplexModelFile() + " at index " + index); final Reporter reporter = tr.getReporter(); reporter.report("org.jtrfp.trcl.DEFObjectPlacer.def." + defs.get(i).getDescription().replace('.', ' ') + ".complexModelFile", defs.get(i).getComplexModelFile()); reporter.report("org.jtrfp.trcl.DEFObjectPlacer.def." + defs.get(i).getDescription().replace('.', ' ') + ".logic", defs.get(i).getLogic()); reporter.report("org.jtrfp.trcl.DEFObjectPlacer.def." + defs.get(i).getDescription().replace('.', ' ') + ".simpleModelFile", defs.get(i).getSimpleModel()); } //end for(i:defs) int placementReporterIndex = 0; for (EnemyPlacement pl : places) { placementReporters[placementReporterIndex++].complete(); Model model = models[pl.getDefIndex()]; if (model != null) { final EnemyDefinition def = defs.get(pl.getDefIndex()); final DEFObject obj = new DEFObject(tr, model, def, pl); if (defList != null) defList.add(obj); if (def.isShowOnBriefing() && !enemyPlacementMap.containsKey(def)) { enemyPlacementMap.put(def, obj); } //end //USING z,x coords final double[] objPos = obj.getPosition(); objPos[0] = TR.legacy2Modern(pl.getLocationOnMap().getZ()) + positionOffset.getX(); objPos[1] = (TR.legacy2Modern(pl.getLocationOnMap().getY()) / TR.mapWidth) * 16. * tr.getWorld().sizeY + positionOffset.getY(); objPos[2] = TR.legacy2Modern(pl.getLocationOnMap().getX()) + positionOffset.getZ(); obj.notifyPositionChange(); if (def.getLogic() == EnemyLogic.groundStaticRuin) { //Spawn a second, powerup-free model using the simplemodel Model simpleModel = null; try { simpleModel = tr.getResourceManager().getBINModel(def.getSimpleModel(), tr.getGlobalPaletteVL(), null, tr.gpu.get().getGl()); } catch (Exception e) { e.printStackTrace(); } EnemyDefinition ed = new EnemyDefinition(); ed.setLogic(EnemyLogic.groundDumb); ed.setDescription("auto-generated enemy rubble def"); ed.setPowerupProbability(0); EnemyPlacement simplePlacement = pl.clone(); final DEFObject ruin = new DEFObject(tr, simpleModel, ed, simplePlacement); ruin.setVisible(false); ruin.setIsRuin(true); obj.setRuinObject(ruin); ruin.setPosition(obj.getPosition()); try { ruin.setDirection(new ObjectDirection(pl.getRoll(), pl.getPitch(), pl.getYaw() + 65536)); } catch (MathArithmeticException e) { e.printStackTrace(); } target.add(ruin); } //end if(groundStaticRuin) if (pl.getRoll() != 0 || pl.getPitch() != 0 || pl.getYaw() != 0)//Only set if not 0,0,0 try { obj.setDirection(new ObjectDirection(pl.getRoll(), pl.getPitch(), pl.getYaw() + 65536)); } catch (MathArithmeticException e) { e.printStackTrace(); } if (headingOverride != null) { final double[] headingArray = obj.getHeadingArray(); headingArray[0] = headingOverride.getX(); headingArray[1] = headingOverride.getY(); headingArray[2] = headingOverride.getZ(); } //end if(headingOverride) target.add(obj); } //end if(model!=null) else { System.out.println("Skipping triangle list at index " + pl.getDefIndex()); } } //end for(places) for (EnemyDefinition ed : enemyPlacementMap.keySet()) { enemyIntros.add(new EnemyIntro(enemyPlacementMap.get(ed), ed.getDescription())); } }//end placeObjects /** * @return the headingOverride */ public Vector3D getHeadingOverride() { return headingOverride; } /** * @param headingOverride the headingOverride to set */ public DEFObjectPlacer setHeadingOverride(Vector3D headingOverride) { this.headingOverride = headingOverride; return this; } public List<EnemyIntro> getEnemyIntros() { return enemyIntros; } }//end DEFObjectPlacer