/*
 * Created on Oct 3, 2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package org.nondot.mesh;

/**
 @author bljones1
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public abstract class VertexDescription {
  public abstract Vertex createVertex();
  
  public static VertexDescription createUntransformedVertexDescription() {
    return new UntransformedVertexDescription();
  }
  
  public static VertexDescription createTransformedVertexDescription() {
      return new TransformedVertexDescription();
  }
  
  public VertexDescription addNormal() {
    return new NormalVertexDescription(this)
  }
  
  public VertexDescription addPointSize() {
    return new PointSizeVertexDescription(this);
  }
  
  public VertexDescription addDiffuseColor() {
    return new DiffuseColorVertexDescription(this);
  }
  
  public VertexDescription addSpecularColor() {
    return new SpecularColorVertexDescription(this);
  }
  
  public VertexDescription add1DTextureCoordinate() {
    return new TextureCoordinate1DVertexDescription(this);
  }
  
  public VertexDescription add2DTextureCoordinate() {
    return new TextureCoordinate2DVertexDescription(this);
  }
  
  public VertexDescription add3DTextureCoordinate() {
    return new TextureCoordinate3DVertexDescription(this);
  }
  
  public VertexDescription add4DTextureCoordinate() {
    return new TextureCoordinate4DVertexDescription(this);
  }
}

class UntransformedVertexDescription extends VertexDescription {
  public Vertex createVertex() {
    return new UntransformedVertex();  
  }
}

class TransformedVertexDescription extends VertexDescription {
  public Vertex createVertex() {
    return new TransformedVertex();
  }
}

abstract class AttributeVertexDescription extends VertexDescription {
  AttributeVertexDescription(VertexDescription parent) {
    this.parent = parent;
  }
  
  protected VertexDescription parent;
}

class NormalVertexDescription extends AttributeVertexDescription
{
  NormalVertexDescription(VertexDescription parent) {
    super(parent);  
  }
  
  public Vertex createVertex() {
    return new NormalVertex(parent.createVertex());
  }
}

class PointSizeVertexDescription extends AttributeVertexDescription
{
  PointSizeVertexDescription(VertexDescription parent) {
    super(parent);  
  }
  
  public Vertex createVertex() {
    return new PointSizeVertex(parent.createVertex());
  }
}

class DiffuseColorVertexDescription extends AttributeVertexDescription
{
  DiffuseColorVertexDescription(VertexDescription parent) {
    super(parent);  
  }
  
  public Vertex createVertex() {
    return new DiffuseColorVertex(parent.createVertex());
  }
}

class SpecularColorVertexDescription extends AttributeVertexDescription
{
    SpecularColorVertexDescription(VertexDescription parent) {
      super(parent);
    }
    
    public Vertex createVertex() {
      return new SpecularColorVertex(parent.createVertex());
    }
}

class TextureCoordinate1DVertexDescription extends AttributeVertexDescription
{
    TextureCoordinate1DVertexDescription(VertexDescription parent) {
      super(parent);
    }
    
    public Vertex createVertex() {
      return new TextureCoordinate1DVertex(parent.createVertex());
    }
}

class TextureCoordinate2DVertexDescription extends AttributeVertexDescription
{
    TextureCoordinate2DVertexDescription(VertexDescription parent) {
      super(parent);
    }
    
    public Vertex createVertex() {
      return new TextureCoordinate2DVertex(parent.createVertex());
    }
}

class TextureCoordinate3DVertexDescription extends AttributeVertexDescription
{
    TextureCoordinate3DVertexDescription(VertexDescription parent) {
      super(parent);
    }
    
    public Vertex createVertex() {
      return new TextureCoordinate3DVertex(parent.createVertex());
    }
}

class TextureCoordinate4DVertexDescription extends AttributeVertexDescription
{
    TextureCoordinate4DVertexDescription(VertexDescription parent) {
      super(parent);
    }
    
    public Vertex createVertex() {
      return new TextureCoordinate4DVertex(parent.createVertex());
    }
}