
com.threerings.media.tile.bundle.BundledTileSetRepository Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of nenya Show documentation
Show all versions of nenya Show documentation
Facilities for making networked multiplayer games.
The newest version!
//
// Nenya library - tools for developing networked games
// Copyright (C) 2002-2012 Three Rings Design, Inc., All Rights Reserved
// https://github.com/threerings/nenya
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package com.threerings.media.tile.bundle;
import java.util.HashMap;
import java.util.Iterator;
import com.google.common.collect.Maps;
import com.samskivert.io.PersistenceException;
import com.samskivert.util.HashIntMap;
import com.samskivert.util.IntMap;
import com.threerings.resource.ResourceBundle;
import com.threerings.resource.ResourceManager;
import com.threerings.media.image.ImageManager;
import com.threerings.media.tile.IMImageProvider;
import com.threerings.media.tile.NoSuchTileSetException;
import com.threerings.media.tile.TileSet;
import com.threerings.media.tile.TileSetRepository;
import static com.threerings.media.Log.log;
/**
* Loads tileset data from a set of resource bundles.
*
* @see ResourceManager
*/
public class BundledTileSetRepository
implements TileSetRepository
{
/**
* Constructs a repository which will obtain its resource set from the
* supplied resource manager.
*
* @param rmgr the resource manager from which to obtain our resource
* set.
* @param imgr the image manager through which we will configure the
* tile sets to load their images, or null
if image tiles
* should not be loaded (only the tile metadata)
* @param name the name of the resource set from which we will be
* loading our tile data.
*/
public BundledTileSetRepository (final ResourceManager rmgr,
final ImageManager imgr,
final String name)
{
_imgr = imgr;
// unpack our bundles in the background
new Thread(new Runnable() {
public void run () {
initBundles(rmgr, name);
}
}).start();
}
/**
* Initializes our bundles,
*/
protected void initBundles (ResourceManager rmgr, String name)
{
// first we obtain the resource set from which we will load up our
// tileset bundles
ResourceBundle[] rbundles = rmgr.getResourceSet(name);
// sanity check
if (rbundles == null) {
log.warning("Unable to fetch tileset resource set " +
"[name=" + name + "]. Perhaps it's not defined " +
"in the resource manager config?");
return;
}
HashIntMap idmap = new HashIntMap();
HashMap namemap = Maps.newHashMap();
// iterate over the resource bundles in the set, loading up the
// tileset bundles in each resource bundle
for (ResourceBundle rbundle : rbundles) {
addBundle(idmap, namemap, rbundle);
}
// fill in our bundles array and wake up any waiters
synchronized (this) {
_idmap = idmap;
_namemap = namemap;
notifyAll();
}
}
/**
* Registers the bundle with the tileset repository, overriding any
* bundle with the same id or name.
*/
public void addBundle (ResourceBundle bundle)
{
addBundle(_idmap, _namemap, bundle);
}
/**
* Extracts the tileset bundle from the supplied resource bundle
* and registers it.
*/
protected void addBundle (HashIntMap idmap, HashMap namemap,
ResourceBundle bundle)
{
try {
TileSetBundle tsb = BundleUtil.extractBundle(bundle);
// initialize it and add it to the list
tsb.init(bundle);
addBundle(idmap, namemap, tsb);
} catch (Exception e) {
log.warning("Unable to load tileset bundle '" + BundleUtil.METADATA_PATH +
"' from resource bundle [rbundle=" + bundle + "].", e);
}
}
/**
* Adds the tilesets in the supplied bundle to our tileset mapping
* tables. Any tilesets with the same name or id will be overwritten.
*/
protected void addBundle (HashIntMap idmap, HashMap namemap,
TileSetBundle bundle)
{
IMImageProvider improv = (_imgr == null) ?
null : new IMImageProvider(_imgr, bundle);
// map all of the tilesets in this bundle
for (IntMap.IntEntry entry : bundle.intEntrySet()) {
Integer tsid = entry.getKey();
TileSet tset = entry.getValue();
tset.setImageProvider(improv);
idmap.put(tsid.intValue(), tset);
namemap.put(tset.getName(), tsid);
}
}
// documentation inherited from interface
public Iterator enumerateTileSetIds ()
throws PersistenceException
{
waitForBundles();
return _idmap.keySet().iterator();
}
// documentation inherited from interface
public Iterator enumerateTileSets ()
throws PersistenceException
{
waitForBundles();
return _idmap.values().iterator();
}
// documentation inherited from interface
public TileSet getTileSet (int tileSetId)
throws NoSuchTileSetException, PersistenceException
{
waitForBundles();
TileSet tset = _idmap.get(tileSetId);
if (tset == null) {
throw new NoSuchTileSetException(tileSetId);
}
return tset;
}
// documentation inherited from interface
public int getTileSetId (String setName)
throws NoSuchTileSetException, PersistenceException
{
waitForBundles();
Integer tsid = _namemap.get(setName);
if (tsid != null) {
return tsid.intValue();
}
throw new NoSuchTileSetException(setName);
}
// documentation inherited from interface
public TileSet getTileSet (String setName)
throws NoSuchTileSetException, PersistenceException
{
waitForBundles();
Integer tsid = _namemap.get(setName);
if (tsid != null) {
return getTileSet(tsid.intValue());
}
throw new NoSuchTileSetException(setName);
}
/** Used to allow bundle unpacking to proceed asynchronously. */
protected synchronized void waitForBundles ()
{
while (_idmap == null) {
try {
wait();
} catch (InterruptedException ie) {
log.warning("Interrupted waiting for bundles " + ie);
}
}
}
/** The image manager via which we load our images. */
protected ImageManager _imgr;
/** A mapping from tileset id to tileset. */
protected HashIntMap _idmap;
/** A mapping from tileset name to tileset id. */
protected HashMap _namemap;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy