//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser 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
//------------------------------------------------------------------------------

/** @file
 * レベルオブディティールシーンノードヘッダ
 * @author Junpee
 */

#ifndef LOD_SCENE_NODE_H_
#define LOD_SCENE_NODE_H_

#include <Graphics/SceneNode/SceneNode.h>

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * レベルオブディティールシーンノード
 */
class LODSceneNode : public SceneNode{
friend class SceneObjectManagerTemplate<SceneNode>;
friend class SceneNodeManager;
public:
	//--------------------------------------------------------------------------
	/**
	 * コピー
	 * @param copyMask コピーマスク
	 * @return コピーされたシーンノード
	 */
	virtual SceneNode* copy(u_int copyMask = 0) const{
		return copyLODSceneNode(copyMask);
	}

	//--------------------------------------------------------------------------
	/**
	 * レベルオブディティールシーンノードコピー
	 * @param copyMask コピーマスク
	 * @return コピーされたレベルオブディティールシーンノード
	 */
	virtual LODSceneNode* copyLODSceneNode(u_int copyMask = 0) const;

	//--------------------------------------------------------------------------
	// LOD
	//--------------------------------------------------------------------------
	/**
	 * LOD分割数の設定
	 * @param lodThresholdCount LOD分割数
	 */
	virtual void setLODThresholdCount(int lodThresholdCount){
		Assert(lodThresholdCount >= 0);
		lodThresholdCount_ = lodThresholdCount;
		SafeArrayDelete(lodThreshold_);
		if(lodThresholdCount_ > 0){
			lodThreshold_ = new float[lodThresholdCount_];
			for(int i = 0; i < lodThresholdCount_; i++){
				lodThreshold_[i] = 0.f;
			}
		}
	}

	/**
	 * LOD分割数の取得
	 * @return LOD分割数
	 */
	virtual int getLODThresholdCount() const{ return lodThresholdCount_; }

	//--------------------------------------------------------------------------
	/**
	 * LOD分割値の設定
	 * @param index インデックス
	 * @param lodThreshold LOD分割値
	 */
	virtual void setLODThreshold(int index, float lodThreshold){
		Assert(index >= 0);
		Assert(index < lodThresholdCount_);
		lodThreshold_[index] = lodThreshold;
	}

	/**
	 * LOD分割値の取得
	 * @param index インデックス
	 * @return LOD分割値
	 */
	virtual float getLODThreshold(int index) const{
		Assert(index >= 0);
		Assert(index < lodThresholdCount_);
		return lodThreshold_[index];
	}

	//--------------------------------------------------------------------------
	// RTTI
	//--------------------------------------------------------------------------
	/**
	 * レベルオブディティールシーンノードかどうか
	 * @return レベルオブディティールシーンノードならtrue
	 */
	virtual bool isLODSceneNode() const{ return true; }

protected:
	//--------------------------------------------------------------------------
	/**
	 * コンストラクタ
	 * @param name 名前
	 * @param scene シーン
	 */
	LODSceneNode(const String& name, Scene* scene);

	/**
	 * デストラクタ
	 */
	virtual ~LODSceneNode();

	//--------------------------------------------------------------------------
	/**
	 * 走査
	 * @param parentMatrix 親行列
	 * @param cameraPosition カメラ位置
	 * @param parentEnabled 親が有効か
	 * @param parentScaled 親がスケールを使用しているか
	 * @param parentChanged 親に変更があったか
	 */
	virtual void traverse(const Matrix34& parentMatrix,
		const Vector3& cameraPosition, bool parentEnabled, bool parentScaled,
		bool parentChanged);

private:
	//--------------------------------------------------------------------------
	// LOD分割数
	int lodThresholdCount_;
	// LOD分割値
	float* lodThreshold_;

};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of LOD_SCENE_NODE_H_
//------------------------------------------------------------------------------
