159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Copyright (c) 2009-2012 jMonkeyEngine 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * All rights reserved. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Redistribution and use in source and binary forms, with or without 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * modification, are permitted provided that the following conditions are 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * met: 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions of source code must retain the above copyright 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer. 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Redistributions in binary form must reproduce the above copyright 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * notice, this list of conditions and the following disclaimer in the 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * documentation and/or other materials provided with the distribution. 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * may be used to endorse or promote products derived from this software 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * without specific prior written permission. 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.scene.plugins.blender; 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.ArrayList; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.EmptyStackException; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.HashMap; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.List; 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Map; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Stack; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.animation.Skeleton; 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetManager; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.BlenderKey; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.material.Material; 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.ColorRGBA; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.animations.BoneContext; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.animations.Ipo; 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.constraints.Constraint; 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.file.BlenderInputStream; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.file.DnaBlockData; 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.file.FileBlockHeader; 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.file.Structure; 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.materials.MaterialContext; 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.meshes.MeshContext; 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.blender.modifiers.Modifier; 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.plugins.ogre.AnimData; 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The class that stores temporary data and manages it during loading the belnd 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * file. This class is intended to be used in a single loading thread. It holds 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the state of loading operations. 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Marcin Roguski (Kaelthas) 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class BlenderContext { 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger LOGGER = Logger.getLogger(BlenderContext.class.getName()); 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The blender file version. */ 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int blenderVersion; 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The blender key. */ 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private BlenderKey blenderKey; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The header of the file block. */ 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private DnaBlockData dnaBlockData; 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The input stream of the blend file. */ 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private BlenderInputStream inputStream; 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** The asset manager. */ 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private AssetManager assetManager; 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * A map containing the file block headers. The key is the old pointer 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * address. 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<Long, FileBlockHeader> fileBlockHeadersByOma = new HashMap<Long, FileBlockHeader>(); 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A map containing the file block headers. The key is the block code. */ 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<Integer, List<FileBlockHeader>> fileBlockHeadersByCode = new HashMap<Integer, List<FileBlockHeader>>(); 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This map stores the loaded features by their old memory address. The 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * first object in the value table is the loaded structure and the second - 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the structure already converted into proper data. 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<Long, Object[]> loadedFeatures = new HashMap<Long, Object[]>(); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This map stores the loaded features by their name. Only features with ID 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * structure can be stored here. The first object in the value table is the 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * loaded structure and the second - the structure already converted into 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * proper data. 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<String, Object[]> loadedFeaturesByName = new HashMap<String, Object[]>(); 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A stack that hold the parent structure of currently loaded feature. */ 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Stack<Structure> parentStack = new Stack<Structure>(); 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * A map storing loaded ipos. The key is the ipo's owner old memory address 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * and the value is the ipo. 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<Long, Ipo> loadedIpos = new HashMap<Long, Ipo>(); 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A list of modifiers for the specified object. */ 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Map<Long, List<Modifier>> modifiers = new HashMap<Long, List<Modifier>>(); 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A list of constraints for the specified object. */ 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Map<Long, List<Constraint>> constraints = new HashMap<Long, List<Constraint>>(); 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** Anim data loaded for features. */ 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<Long, AnimData> animData = new HashMap<Long, AnimData>(); 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** Loaded skeletons. */ 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<Long, Skeleton> skeletons = new HashMap<Long, Skeleton>(); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A map of mesh contexts. */ 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Map<Long, MeshContext> meshContexts = new HashMap<Long, MeshContext>(); 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A map of bone contexts. */ 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Map<Long, BoneContext> boneContexts = new HashMap<Long, BoneContext>(); 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A map of material contexts. */ 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Map<Material, MaterialContext> materialContexts = new HashMap<Material, MaterialContext>(); 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** A map og helpers that perform loading. */ 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private Map<String, AbstractBlenderHelper> helpers = new HashMap<String, AbstractBlenderHelper>(); 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the blender file version. 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param blenderVersion 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the blender file version 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBlenderVersion(String blenderVersion) { 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.blenderVersion = Integer.parseInt(blenderVersion); 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the blender file version 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int getBlenderVersion() { 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return blenderVersion; 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the blender key. 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param blenderKey 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the blender key 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBlenderKey(BlenderKey blenderKey) { 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.blenderKey = blenderKey; 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the blender key. 15459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 15559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the blender key 15659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 15759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BlenderKey getBlenderKey() { 15859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return blenderKey; 15959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 16059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 16159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 16259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the dna block data. 16359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 16459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param dnaBlockData 16559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the dna block data 16659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 16759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBlockData(DnaBlockData dnaBlockData) { 16859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.dnaBlockData = dnaBlockData; 16959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 17159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 17259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the dna block data. 17359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 17459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the dna block data 17559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 17659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public DnaBlockData getDnaBlockData() { 17759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return dnaBlockData; 17859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 17959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 18159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the asset manager. 18259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 18359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the asset manager 18459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 18559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public AssetManager getAssetManager() { 18659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return assetManager; 18759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 18859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 18959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 19059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the asset manager. 19159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 19259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param assetManager 19359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the asset manager 19459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 19559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setAssetManager(AssetManager assetManager) { 19659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.assetManager = assetManager; 19759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 19859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 19959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 20059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the input stream of the blend file. 20159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 20259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the input stream of the blend file 20359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 20459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BlenderInputStream getInputStream() { 20559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return inputStream; 20659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 20759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 20859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 20959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the input stream of the blend file. 21059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 21159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param inputStream 21259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the input stream of the blend file 21359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 21459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setInputStream(BlenderInputStream inputStream) { 21559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.inputStream = inputStream; 21659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 21759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 21859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 21959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method adds a file block header to the map. Its old memory address 22059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * is the key. 22159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 22259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param oldMemoryAddress 22359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the address of the block header 22459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param fileBlockHeader 22559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the block header to store 22659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 22759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void addFileBlockHeader(Long oldMemoryAddress, FileBlockHeader fileBlockHeader) { 22859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fileBlockHeadersByOma.put(oldMemoryAddress, fileBlockHeader); 22959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<FileBlockHeader> headers = fileBlockHeadersByCode.get(Integer.valueOf(fileBlockHeader.getCode())); 23059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (headers == null) { 23159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta headers = new ArrayList<FileBlockHeader>(); 23259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fileBlockHeadersByCode.put(Integer.valueOf(fileBlockHeader.getCode()), headers); 23359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta headers.add(fileBlockHeader); 23559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 23659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 23759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 23859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the block header of a given memory address. If the 23959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * header is not present then null is returned. 24059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 24159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param oldMemoryAddress 24259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the address of the block header 24359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return loaded header or null if it was not yet loaded 24459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 24559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public FileBlockHeader getFileBlock(Long oldMemoryAddress) { 24659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return fileBlockHeadersByOma.get(oldMemoryAddress); 24759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 24859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 24959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 25059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns a list of file blocks' headers of a specified code. 25159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 25259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param code 25359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the code of file blocks 25459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return a list of file blocks' headers of a specified code 25559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 25659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public List<FileBlockHeader> getFileBlocks(Integer code) { 25759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return fileBlockHeadersByCode.get(code); 25859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 25959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method clears the saved block headers stored in the features map. 26259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 26359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void clearFileBlocks() { 26459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fileBlockHeadersByOma.clear(); 26559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta fileBlockHeadersByCode.clear(); 26659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 26759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 26859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 26959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method adds a helper instance to the helpers' map. 27059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 27159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param <T> 27259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the type of the helper 27359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param clazz 27459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * helper's class definition 27559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param helper 27659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the helper instance 27759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 27859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public <T> void putHelper(Class<T> clazz, AbstractBlenderHelper helper) { 27959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta helpers.put(clazz.getSimpleName(), helper); 28059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @SuppressWarnings("unchecked") 28359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public <T> T getHelper(Class<?> clazz) { 28459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (T) helpers.get(clazz.getSimpleName()); 28559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 28659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 28759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 28859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method adds a loaded feature to the map. The key is its unique old 28959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * memory address. 29059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 29159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param oldMemoryAddress 29259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the address of the feature 29359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param featureName 29459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the name of the feature 29559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param structure 29659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the filled structure of the feature 29759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param feature 29859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the feature we want to store 29959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 30059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void addLoadedFeatures(Long oldMemoryAddress, String featureName, Structure structure, Object feature) { 30159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (oldMemoryAddress == null || structure == null || feature == null) { 30259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalArgumentException("One of the given arguments is null!"); 30359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Object[] storedData = new Object[] { structure, feature }; 30559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta loadedFeatures.put(oldMemoryAddress, storedData); 30659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (featureName != null) { 30759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta loadedFeaturesByName.put(featureName, storedData); 30859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 30959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 31059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 31159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 31259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the feature of a given memory address. If the feature 31359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * is not yet loaded then null is returned. 31459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 31559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param oldMemoryAddress 31659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the address of the feature 31759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param loadedFeatureDataType 31859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the type of data we want to retreive it can be either filled 31959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * structure or already converted feature 32059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return loaded feature or null if it was not yet loaded 32159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 32259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Object getLoadedFeature(Long oldMemoryAddress, LoadedFeatureDataType loadedFeatureDataType) { 32359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Object[] result = loadedFeatures.get(oldMemoryAddress); 32459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (result != null) { 32559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result[loadedFeatureDataType.getIndex()]; 32659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 32859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 32959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 33059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 33159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the feature of a given name. If the feature is not 33259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * yet loaded then null is returned. 33359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 33459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param featureName 33559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the name of the feature 33659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param loadedFeatureDataType 33759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the type of data we want to retreive it can be either filled 33859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * structure or already converted feature 33959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return loaded feature or null if it was not yet loaded 34059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 34159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Object getLoadedFeature(String featureName, LoadedFeatureDataType loadedFeatureDataType) { 34259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Object[] result = loadedFeaturesByName.get(featureName); 34359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (result != null) { 34459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result[loadedFeatureDataType.getIndex()]; 34559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 34759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 34859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 34959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 35059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method clears the saved features stored in the features map. 35159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 35259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void clearLoadedFeatures() { 35359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta loadedFeatures.clear(); 35459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 35559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 35659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 35759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method adds the structure to the parent stack. 35859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 35959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param parent 36059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the structure to be added to the stack 36159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 36259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void pushParent(Structure parent) { 36359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta parentStack.push(parent); 36459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 36559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 36659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 36759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method removes the structure from the top of the parent's stack. 36859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 36959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the structure that was removed from the stack 37059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 37159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Structure popParent() { 37259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 37359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return parentStack.pop(); 37459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (EmptyStackException e) { 37559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 37659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 37859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 37959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 38059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method retreives the structure at the top of the parent's stack but 38159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * does not remove it. 38259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 38359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the structure from the top of the stack 38459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 38559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Structure peekParent() { 38659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 38759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return parentStack.peek(); 38859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (EmptyStackException e) { 38959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 39059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 39159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 39259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 39359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 39459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method adds new ipo curve for the feature. 39559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 39659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ownerOMA 39759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the OMA of blender feature that owns the ipo 39859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ipo 39959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the ipo to be added 40059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 40159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void addIpo(Long ownerOMA, Ipo ipo) { 40259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta loadedIpos.put(ownerOMA, ipo); 40359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 40459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 40559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 40659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method removes the ipo curve from the feature. 40759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 40859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ownerOma 40959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the OMA of blender feature that owns the ipo 41059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 41159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Ipo removeIpo(Long ownerOma) { 41259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return loadedIpos.remove(ownerOma); 41359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 41459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 41559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 41659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the ipo curve of the feature. 41759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 41859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ownerOMA 41959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the OMA of blender feature that owns the ipo 42059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 42159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Ipo getIpo(Long ownerOMA) { 42259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return loadedIpos.get(ownerOMA); 42359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 42459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 42559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 42659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method adds a new modifier to the list. 42759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 42859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ownerOMA 42959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the owner's old memory address 43059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param modifier 43159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the object's modifier 43259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 43359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void addModifier(Long ownerOMA, Modifier modifier) { 43459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<Modifier> objectModifiers = this.modifiers.get(ownerOMA); 43559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (objectModifiers == null) { 43659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objectModifiers = new ArrayList<Modifier>(); 43759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.modifiers.put(ownerOMA, objectModifiers); 43859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 43959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objectModifiers.add(modifier); 44059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 44159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 44259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 44359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns modifiers for the object specified by its old memory 44459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * address and the modifier type. If no modifiers are found - empty list is 44559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returned. If the type is null - all modifiers for the object are 44659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * returned. 44759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 44859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param objectOMA 44959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * object's old memory address 45059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param type 45159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the type of the modifier 45259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the list of object's modifiers 45359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 45459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public List<Modifier> getModifiers(Long objectOMA, String type) { 45559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<Modifier> result = new ArrayList<Modifier>(); 45659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<Modifier> readModifiers = modifiers.get(objectOMA); 45759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (readModifiers != null && readModifiers.size() > 0) { 45859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (Modifier modifier : readModifiers) { 45959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (type == null || type.isEmpty() || modifier.getType().equals(type)) { 46059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta result.add(modifier); 46159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return result; 46559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 46659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 46759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 46859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method adds a new modifier to the list. 46959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 47059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ownerOMA 47159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the owner's old memory address 47259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param constraints 47359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the object's constraints 47459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 47559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void addConstraints(Long ownerOMA, List<Constraint> constraints) { 47659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta List<Constraint> objectConstraints = this.constraints.get(ownerOMA); 47759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (objectConstraints == null) { 47859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objectConstraints = new ArrayList<Constraint>(); 47959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.constraints.put(ownerOMA, objectConstraints); 48059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 48159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta objectConstraints.addAll(constraints); 48259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 48359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 48459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 48559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns constraints for the object specified by its old 48659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * memory address. If no modifiers are found - <b>null</b> is returned. 48759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 48859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param objectOMA 48959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * object's old memory address 49059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the list of object's modifiers or null 49159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 49259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public List<Constraint> getConstraints(Long objectOMA) { 49359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return objectOMA == null ? null : constraints.get(objectOMA); 49459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 49559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 49659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 49759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the anim data for the specified OMA of its owner. 49859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 49959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ownerOMA 50059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the owner's old memory address 50159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param animData 50259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the animation data for the feature specified by ownerOMA 50359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 50459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setAnimData(Long ownerOMA, AnimData animData) { 50559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.animData.put(ownerOMA, animData); 50659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 50759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 50859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 50959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the animation data for the specified owner. 51059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 51159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param ownerOMA 51259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the old memory address of the animation data owner 51359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the animation data or null if none exists 51459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 51559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public AnimData getAnimData(Long ownerOMA) { 51659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return this.animData.get(ownerOMA); 51759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 51859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 51959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 52059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the skeleton for the specified OMA of its owner. 52159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 52259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param skeletonOMA 52359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the skeleton's old memory address 52459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param skeleton 52559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the skeleton specified by the given OMA 52659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 52759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setSkeleton(Long skeletonOMA, Skeleton skeleton) { 52859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.skeletons.put(skeletonOMA, skeleton); 52959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 53059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 53159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 53259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the skeleton for the specified OMA of its owner. 53359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 53459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param skeletonOMA 53559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the skeleton's old memory address 53659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the skeleton specified by the given OMA 53759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 53859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Skeleton getSkeleton(Long skeletonOMA) { 53959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return this.skeletons.get(skeletonOMA); 54059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 54159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 54259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 54359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the mesh context for the given mesh old memory address. 54459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * If the context is already set it will be replaced. 54559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 54659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param meshOMA 54759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the mesh's old memory address 54859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param meshContext 54959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the mesh's context 55059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 55159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setMeshContext(Long meshOMA, MeshContext meshContext) { 55259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.meshContexts.put(meshOMA, meshContext); 55359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 55459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 55559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 55659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the mesh context for the given mesh old memory 55759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * address. If no context exists then <b>null</b> is returned. 55859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 55959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param meshOMA 56059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the mesh's old memory address 56159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return mesh's context 56259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 56359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public MeshContext getMeshContext(Long meshOMA) { 56459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return this.meshContexts.get(meshOMA); 56559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 56659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 56759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 56859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the bone context for the given bone old memory address. 56959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * If the context is already set it will be replaced. 57059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 57159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param boneOMA 57259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the bone's old memory address 57359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param boneContext 57459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the bones's context 57559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 57659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setBoneContext(Long boneOMA, BoneContext boneContext) { 57759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.boneContexts.put(boneOMA, boneContext); 57859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 57959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 58059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 58159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the bone context for the given bone old memory 58259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * address. If no context exists then <b>null</b> is returned. 58359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 58459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param boneOMA 58559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the bone's old memory address 58659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return bone's context 58759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 58859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public BoneContext getBoneContext(Long boneOMA) { 58959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return boneContexts.get(boneOMA); 59059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 59159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 59259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 59359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method sets the material context for the given material. If the 59459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * context is already set it will be replaced. 59559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 59659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param material 59759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the material 59859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param materialContext 59959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the material's context 60059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 60159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setMaterialContext(Material material, MaterialContext materialContext) { 60259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.materialContexts.put(material, materialContext); 60359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 60459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 60559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 60659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This method returns the material context for the given material. If no 60759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * context exists then <b>null</b> is returned. 60859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 60959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param material 61059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * the material 61159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return material's context 61259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 61359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public MaterialContext getMaterialContext(Material material) { 61459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return materialContexts.get(material); 61559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 61659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 61759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 61859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This metod returns the default material. 61959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 62059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @return the default material 62159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 62259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public synchronized Material getDefaultMaterial() { 62359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (blenderKey.getDefaultMaterial() == null) { 62459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta Material defaultMaterial = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); 62559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta defaultMaterial.setColor("Color", ColorRGBA.DarkGray); 62659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta blenderKey.setDefaultMaterial(defaultMaterial); 62759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 62859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return blenderKey.getDefaultMaterial(); 62959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 63059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 63159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void dispose() { 63259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 63359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta inputStream.close(); 63459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (IOException e) { 63559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LOGGER.log(Level.SEVERE, e.getLocalizedMessage(), e); 63659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 63759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta loadedFeatures.clear(); 63859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta loadedFeaturesByName.clear(); 63959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 64059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 64159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 64259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * This enum defines what loaded data type user wants to retreive. It can be 64359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * either filled structure or already converted data. 64459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 64559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Marcin Roguski 64659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 64759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public static enum LoadedFeatureDataType { 64859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 64959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta LOADED_STRUCTURE(0), LOADED_FEATURE(1); 65059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int index; 65159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 65259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private LoadedFeatureDataType(int index) { 65359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.index = index; 65459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 65559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 65659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int getIndex() { 65759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return index; 65859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 65959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 66059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 661