#pragma once
#include <FK/FK.h>

class fkut_SpriteModel : public fk_Model {
private:
	friend class fkut_SimpleWindow;

	fk_RectTexture	texShape;
	fk_Material		absMate;
	fk_Model		pixelBase;

	fk_UniStr		textStr;
	bool			fontReady;

	static double	distPut;

public:
	// スプライトの変数.text.〜とすることでテキストの細かな装飾が設定できます
	// 詳細はFKリファレンスマニュアルのfk_TextImageを参照してください
	fk_TextImage	text;

	fkut_SpriteModel(void);
	~fkut_SpriteModel(void);

	// [FKUT使用時は使わない - ここから]
	// (暫定仕様)この関数をprivateからpublicに変更し、シーンにエントリーする前に
	// 表示したいWindowとSceneのポインタを渡してください
	void		MakePixelBase(fk_Window *argWin, fk_Scene *argScn);

	// 最初にエントリーする時は、こちらの関数を使ってください
	// シーンにはカメラがセット済みである必要があります
	// ウィンドウサイズ・カメラ・射影を変更した場合はもう一度呼ばないとサイズがおかしくなります
	bool		entryFirst(fk_Window *argWin, fk_Scene *argScn, fk_Model *argCam = NULL);
	// [ここまで - FKUT使用時は使わない]

	// 画像を読み込みます(PNGのみ透過画像に対応しています)
	bool		readBMP(const string argFileName);
	bool		readPNG(const string argFileName);
	bool		readJPG(const string argFileName);

	// 別途用意したfk_Imageを使用したい場合はこれでセットします
	void		setImage(fk_Image &argImg);
	// 現在使用されている画像を参照します(あまり変にいじくると落ちるかもしれません)
	fk_Image *	getImage(void);

	// 指定した座標が左上になるように位置を変更します
	void		setPositionLT(double x, double y);

	// 画像の一部分だけを表示領域として切り出します
	// 指定する数値は画像の座標系です(一般的なテクスチャ座標系を敢えて隠蔽しています)
	void		setSpriteArea(double left, double top, double width, double height);

	// 画像の表示サイズを変更します
	// 通常は画像の設定時に自動調整を行っていますので、敢えてそこからサイズを変更したい時に使います
	void		setSpriteSize(double width = -1.0, double height = -1.0);
	fk_TexCoord	getSpriteSize(void);

	// 画像の表示方法を変更します
	// 初期状態でtrue(滑らかモード)にしてありますが、文字やフォントの場合はfalseの方が見やすい場合もあります
	void		setSpriteSmoothMode(bool flag);
	bool		getSpriteSmoothMode(void);

	// 文字表示のための初期化を行います
	// 引数には使いたいフォントのファイル名を指定します
	// Vista以降であればメイリオが扱いやすいので、おすすめです(ファイルパスは"C:/WINDOWS/Fonts/Meiryo.ttc"です)
	bool		initFont(const string argFontFile);

	// 文字の表示を行います
	// 引数に表示したい文字を指定します
	// 第2引数にbool値を渡す関数では、trueを渡すとこれまでに入力した文字列を初期化し、
	// falseを渡すとこれまでに入力した文字列への付け足しを行います。bool値を渡さないバージョンは、
	// falseを渡したのと同じ処理になります。文字コードはWindows環境でなら省略で構いません)
	// 表示方法を変更したい場合は事前に「スプライトの変数.text.〜」で設定します
	void		drawText(const string argStr, fk_StringCode argCode = FK_STR_SJIS);
	void		drawText(const string argStr, bool clearFlag, fk_StringCode argCode = FK_STR_SJIS);

	// これまでに渡した文字列をクリアします
	void		clearText(void);
};
