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