content: package edu.stanford.rsl.conrad.phantom.xcat;
  
  import java.util.Iterator;
  
  import edu.stanford.rsl.conrad.geometry.AbstractShape;
  import edu.stanford.rsl.conrad.geometry.AbstractSurface;
  import edu.stanford.rsl.conrad.geometry.shapes.compound.CompoundShape;
  import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
  import edu.stanford.rsl.conrad.geometry.splines.SurfaceBSpline;
  import edu.stanford.rsl.conrad.geometry.splines.TimeVariantSurfaceBSpline;
  import edu.stanford.rsl.conrad.parallel.ParallelThread;
  import edu.stanford.rsl.conrad.utils.TessellationUtil;
  
  /**
   * Thread to tessellate a SurfaceBSpline or TimeVariantSurfaceBSpline. 
   * 
   * @author akmaier
   *
   */
  public class TessellationThread extends ParallelThread {
  
  	private Object tessellationObject;
  	private double time;
  	private CompoundShape scene;
  
  	/**
  	 * @return the mesh
  	 */
  	public CompoundShape getObjects() {
  		return scene;
  	}
  
  	public TessellationThread (Object tessellationObject, double time){
  		this.tessellationObject = tessellationObject;
  		this.time = time;
  	}
  
  	@SuppressWarnings("rawtypes")
  	@Override
  	public void execute(){
  		Object tObject = this;
  		scene = new CompoundShape();
  		while (tObject != null){ 
  			if (((Iterator)this.tessellationObject).hasNext()){
  				tObject = ((Iterator)this.tessellationObject).next();
  				int elementCountU = (int)TessellationUtil.getSamplingU((AbstractSurface) tObject);
  				int elementCountV = (int)TessellationUtil.getSamplingV((AbstractSurface) tObject);
  				if (tObject instanceof SurfaceBSpline){
  					SurfaceBSpline spline = (SurfaceBSpline)tObject;
  					scene.add(spline.tessellateMesh(elementCountU, elementCountV));
  				}
  				if (tObject instanceof TimeVariantSurfaceBSpline){
  					TimeVariantSurfaceBSpline spline = (TimeVariantSurfaceBSpline)tObject;
  					AbstractShape mesh = spline.tessellateMesh(elementCountU, elementCountV, time);
  					scene.add(mesh);			
  				}
  			} else {
  				tObject = null;
  			}
  		}
  	}
  
  	@Override
  	public String getProcessName() {
  		return "Tessellation Thread";
  	}
  
  }
  /*
   * Copyright (C) 2010-2014 Andreas Maier
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */