// 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.shadervm;

import static net.cellcomputing.himawari.library.EqIntIndex.*;
import net.cellcomputing.himawari.accessory.STLVector;
import net.cellcomputing.himawari.accessory.primitive.p_boolean;
import net.cellcomputing.himawari.accessory.primitive.p_float;
import net.cellcomputing.himawari.library.CqStats;
import net.cellcomputing.himawari.library.EqVariableType;
import net.cellcomputing.himawari.library.IqShaderData;

/**
 * CqShaderUniformを継承したFloatを扱うクラス
 * @author NTT DATA Corporation
 */
public strictfp class CqShaderVariableUniformFloat extends CqShaderVariableUniform<p_float> {
	/**
	 * コンストラクタ
	 *
	 */
	public CqShaderVariableUniformFloat( )
	{
		super(new EqVariableType(EqVariableType.type_float));
		m_Value = new p_float();
		CqStats.STATS_INC( SHD_var_uniform_float );
		
	}
	/**
	 * コンストラクタ
	 * 
	 * @param strName
	 * @param fParameter
	 */
	public CqShaderVariableUniformFloat( final String strName, boolean fParameter)
	{
		super( strName, fParameter,new EqVariableType(EqVariableType.type_float));
		m_Value = new p_float();
		CqStats.STATS_INC( SHD_var_uniform_float );
	}
	
	/**
	 * コピーコンストラクタ
	 * @param val
	 */
	public CqShaderVariableUniformFloat(CqShaderVariableUniformFloat val){
		super(val,new EqVariableType(EqVariableType.type_float));
	}
	
	/**
	 * コンストラクタ
	 * @param strName
	 */
	public CqShaderVariableUniformFloat(final String strName){
		this(strName,false);
	}
	/**
	 * 引数に、自分の持つ値をコピーする
	 * @param res コピー先
	 * @param index 使用しない
	 */
	public void GetFloat(p_float res, int index)
	{
		res.value = m_Value.value;
	}
	
	/**
	 * 引数に自分の持つ値のポインタを挿入する
	 * メソッドの呼び出し側で値を変更した場合、
	 * 自分自身の値も影響を受ける。
	 * 
	 * @param res ポインタを格納するvector
	 */
	public	void GetFloatPtr( final STLVector<p_float> res )
	{
		if(res.size() < 1)
			res.add(m_Value);
		else
			res.setElementAt(m_Value,0);
	}
	
	/**
	 * 自分の持つ値に引数の値をコピーする
	 * 
	 * @param f コピーする値
	 */
	public void	SetFloat( final float f )
	{
		m_Value.value = f;
	}
	
	/**
	 * 引数にboolean値を代入する。
	 * 自分が持つ値が0であればtrue
	 * 自分が持つ値が1であればfalse
	 * を代入する。
	 * 
	 * @param res 結果を代入する先
	 * @param index 使用しない
	 */
	public void	GetBool( p_boolean res, int index)
	{
		res.value = m_Value.value != 0.0f;
	}
	
	/**
	 * 引数により、自分自身の持つ値を変更する。
	 * 引数がtrueであれば１が
	 * 引数がfalseであれば0が
	 * 代入される
	 * 
	 * @param val 
	 */
	public void	SetBool( final boolean val )
	{
		
//		m_Value.value = val.value;
		if(val){
			m_Value.value = 1.0f;//true
		}else{
			m_Value.value =0;
		}
	}
	/**
	 * 引数により、自分自身の持つ値を変更する。
	 * 引数がtrueであれば１が
	 * 引数がfalseであれば0が
	 * 代入される
	 * 
	 * @param val
	 * @param index 使用しない
	 */
	public void	SetBool( final boolean val, int index )
	{
//		m_Value.value = val.value;
		if(val){
			m_Value.value = 1.0f;//true
		}else{
			m_Value.value =0;
		}
	}
	/** 
	 * Copy the values from the passed variable into this, taking into account any class differences.
	 *
	 * 引数で与えられたインスタンスの持つm_Valueの値を自分自身にコピーする。
	 * GetFloatを呼び出すことで実現している。
	 * @param pVal コピー元の変数 / The variable to copy from.
	 */
	public void	SetValueFromVariable( final IqShaderData pVal )
	{
		pVal.GetFloat( m_Value );
	}
	
	/**
	 * 自分自身のコピーを返す
	 * @return 自分と同じ値を持つIqShaderData
	 */
	public IqShaderData Clone()
	{
		CqShaderVariableUniformFloat newVar = new CqShaderVariableUniformFloat( this );
		newVar.SetSize( (int)Size() );
		newVar.SetValueFromVariable( this );
		return ( newVar );
	}
	
}
