/*
 * ExplosionPool.java
 *
 * Created on 14. Juli 2000, 15:27
 */
 
package game.action.fx;

import game.util3d.*;
import game.*;
import java.util.*;

import javax.media.j3d.*;
import javax.vecmath.*;
/** 
 *
 * @author  markus
 * @version 
 */
public class ExplosionPool extends Object
{
    private static MultiTexture textures;
    private List list;
    
    private final BranchGroup group=new BranchGroup();
    
    /** Creates new ImageShapePool */
    public ExplosionPool(BranchGroup scene, int num)
    {
        if(textures==null) textures=new MultiTexture("media/explosion/explode0",".png",30,1,2);
        list=new LinkedList();
        for(int i=0;i<num;i++)
        {
            list.add(createElement());
        }

        group.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
        group.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
        group.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
        scene.addChild(group);
    }
    private Explosion createElement()
    {
        return new Explosion(this,textures);
    }
    public synchronized void startExplosion(Vector3d position, float scaleFactor,Informable informMe)
    {
        Explosion ex;
        if(list.isEmpty()) ex=createElement();
        else ex=(Explosion)list.remove(0);
        ex.reset(position,scaleFactor,informMe);
        BranchGroup exBG=ex.getBranchGroup();
        //if(exBG.isLive()) exBG.detach();  // Does work
        group.addChild(exBG);
    }
    protected synchronized void finishedExplosion(Explosion ex)
    {
        BranchGroup exBG=ex.getBranchGroup();
        if(exBG.isLive()) exBG.detach();  // Does NOT work!!
        list.add(ex);
    }
  
}