// Aqsis
// Copyright (c) 1997 - 2001, Paul C. Gregory
//
// Contact: pgregory@aqsis.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 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
// General Public License for more details.
//
// You should have received a copy of the GNU 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

/**
 * Copyright (C) 2006-2007  NTT DATA CORPORATION
 * 
 * Version: 1.0.0 2007/04/01
 *  
 */
package net.cellcomputing.himawari.library;


/**
 * 値のタイプと、idのタイプでテンプレート化された、頂点情報のパラメータタイプ。
 * @author NTT DATA Corporation
 */
public strictfp class CqParameterTypedVertex<T,SLT> extends CqParameterTypedVarying<T,SLT> {
	
	 /**
	  * コンストラクタ
	  * @param str 名前
	  * @param count サイズ
	  * @param I Generics I
	  * @param TClass Generics TのClass
	  * @param SLTClass Generics SLTのClass
	  */
	 public CqParameterTypedVertex(final String str,int count,EqVariableType I,Class<? extends T> TClass,Class<? extends SLT> SLTClass){
		 super(str,count,I,TClass,SLTClass);
	 }
	 /**
	  * コンストラクタ
	  * countを省略している。
	  * 
	  * @param str 名前
	  * @param I Generics I
	  * @param TClass Generics TのClass
	  * @param SLTClass Generics SLTのClass
	  */
	 public CqParameterTypedVertex(final String str,EqVariableType I,Class<? extends T> TClass,Class<? extends SLT> SLTClass){
		 this(str,1,I,TClass,SLTClass);
	 }
	 
	 /**
	  * コピーコンストラクタ
	  * 
	  * @param From コピー元
	  * @param I Generics I
	  */
	public CqParameterTypedVertex(final CqParameterTypedVertex<T, SLT> From ,EqVariableType I){
		super(From,I);
	}
	
	/**
	 * デストラクタ
	 * スーパークラスのメソッドを呼ぶ
	 */
	public void destruct(){
		super.destruct();
	}
	
	/**
	 * Typeの同じインスタンスを生成して返す
	 * 
	 * @param Name 名前
	 * @param Count カウント
	 * @return 新しいCqParameter
	 */
	public CqParameter CloneType(final String Name, int Count)
	{
		return ( new CqParameterTypedVertex<T, SLT>( Name, Count,I,TClass,SLTClass ) );
	}
	/**
	 * 自分自身の複製を生成して返す
	 * コピーコンストラクタを呼び出している。
	 * 
	 * @return 自分と同じ値を持つインスタンス
	 */
	public 	CqParameter Clone()
	{
		return ( new CqParameterTypedVertex<T, SLT>( this,I ) );
	}
	/**
	 * 自分のEqVariableClassを返す
	 *
	 * @return 自分のEqVariableClass
	 */
	public EqVariableClass	Class()
	{
		return (new EqVariableClass( EqVariableClass.class_vertex ));
	}
	/**
	 * pSurfaceの持つNaturalSubdivideメソッドを
	 * 自分自身と、pResult1,pResult2を引数として呼び出す。
	 * 
	 * @param pResult1 
	 * @param pResult2 
	 * @param u 利用しない
	 * @param pSurface 利用しない
	 */
	public  void	Subdivide( CqParameter pResult1, CqParameter pResult2, boolean u, IqSurface pSurface)
	{
		assert( (pResult1.Type()).getValue() == Type().getValue() && pResult2.Type().getValue() == Type().getValue() &&
				pResult1.Class().getValue() == Class().getValue() && pResult2.Class().getValue() == Class().getValue() );
		
		pSurface.NaturalSubdivide( this, pResult1, pResult2, u );
	}

	/**
	 * pSurfaceの持つNaturalDiceメソッドを呼び出す。
	 * 
	 * @param u
	 * @param v
	 * @param pResult IqShaderData
	 * @param pSurface 使用しない
	 */
	public 	void	Dice( int u, int v, IqShaderData pResult, IqSurface pSurface )
	{
		// Just promote the constant value to varying by duplication.
		assert( pResult.Type().getValue() == Type().getValue() );
		assert( null != pSurface );
		// Note it is assumed that the variable has been
		// initialised to the correct size prior to calling.
		pSurface.NaturalDice( this, u, v, pResult );
	}
	
	/**
	 * 常にエラーを起こす
	 */
	public 	void	DiceOne(int u, int v, IqShaderData pResult, IqSurface pSurface, int ArrayIndex)
	{
		assert( false );
	
		return;
	}
	
	/**
	 * static コンストラクタ
	 * コンストラクタと同様に利用できる
	 * @param strName 名前
	 * @param Count カウント
	 * @param I Generics I
	 * @param myClass Generics TのClass
	 */
     public static	<T,SLT> CqParameter	Create2( final String strName, int Count,EqVariableType I,Class<? extends T> TClass,Class<? extends SLT> SLTClass)
    {
        return ( new CqParameterTypedVertex<T,SLT>( strName, Count ,I,TClass,SLTClass) );
    }

     /**
 	 * static コンストラクタ
 	 * コンストラクタと同様に利用できる(count省略系)
	 * @param strName 名前
	 * @param I Generics I
	 * @param TClass Generics TのClass
	 * @param SLTClass Generics SLTのClass
 	 */
    public static	<T,SLT> CqParameter	Create2( final String strName,EqVariableType I,Class<? extends T> TClass,Class<? extends SLT> SLTClass)
     {
    	 return CqParameterTypedVertex.<T,SLT>Create2(strName,1,I,TClass,SLTClass);
     }

	
	
}
