/////////////////////////////////////////////////////////////////////////////
// Glut_BCC.h
// Copyright (c) 10/26/2021 by BCCSkelton
// 参考：https://mitani.cs.tsukuba.ac.jp/lecture/old2015/cg/03/03_slides.pdf
/////////////////////////////////////////////////////////////////////////////
#include	<stdio.h>
//BCCSkeltonのヘッダー−これに必要なヘッダーが入っている
#include	"BCCSkelton.h"
//リソースIDのヘッダー
#include	"ResGlut_BCC.h"
//CGLクラスのヘッダー
#include	"CGLUT.h"

/////////////////////////////////////////////////////////////////////
//CMyWndクラスをCDLGクラスから派生させ、メッセージ用の関数を宣言する
/////////////////////////////////////////////////////////////////////
class CMyWnd : public CDLG
{
public:	//以下はコールバック関数マクロと関連している
	//２重起動防止用のMutex用ID名称
	CMyWnd(char* UName) : CDLG(UName) {}
	//メニュー項目、ダイアログコントロール関連
	bool OnSelected(WPARAM);
	bool OnSelCol();
	bool OnCreate();
	bool OnSetLA();
	bool OnSelProj(WPARAM);
	bool OnSetProj();
	bool OnRotate();
	bool OnEndXChanged(WPARAM);
	bool OnEndYChanged(WPARAM);
	bool OnEndZChanged(WPARAM);
	bool OnLight();
	bool OnLightXChanged(WPARAM);
	bool OnLightYChanged(WPARAM);
	bool OnLightZChanged(WPARAM);
	bool OnSelLight(WPARAM);
	bool OnIdok();
	//ウィンドウメッセージ関連
	bool OnInit(WPARAM, LPARAM);
	bool OnHScroll(WPARAM, LPARAM);
	bool OnClose(WPARAM, LPARAM);
	bool OnDestroy(WPARAM, LPARAM);
	//ユーザー定義関数
	GLdouble GetDouble(UINT);	//テキストボックスからGLDouble値を取得する
	void SetControlState(int);
};

////////////////////////////////////////////////////////////////////////
//派生させたCMyWndクラスのインスタンスとコールバック関数(マクロ）の作成
//主ウィンドウはダイアログと違い、コールバック関数は一つしか作れない
////////////////////////////////////////////////////////////////////////
CMyWnd Glut_BCC("Glut_BCC");	//ウィンドウクラスインスタンスの生成

BEGIN_MODELESSDLGMSG(ModelessProc, Glut_BCC)	//コールバック関数名は主ウィンドウの場合ModelessProcにしている
	//メニュー項目、ダイアログコントロール関連
	ON_COMMAND(Glut_BCC, IDC_SELOBJ, OnSelected(wParam))
	ON_COMMAND(Glut_BCC, IDC_COLOR, OnSelCol())
	ON_COMMAND(Glut_BCC, IDC_CREATE, OnCreate())
	ON_COMMAND(Glut_BCC, IDC_SETLA, OnSetLA())
	ON_COMMAND(Glut_BCC, IDC_SELPROJ, OnSelProj(wParam))
	ON_COMMAND(Glut_BCC, IDC_SETPROJ, OnSetProj())
	ON_COMMAND(Glut_BCC, IDC_ROTATE, OnRotate())
	ON_COMMAND(Glut_BCC, IDC_ENDX, OnEndXChanged(wParam))
	ON_COMMAND(Glut_BCC, IDC_ENDY, OnEndYChanged(wParam))
	ON_COMMAND(Glut_BCC, IDC_ENDZ, OnEndZChanged(wParam))
	ON_COMMAND(Glut_BCC, IDC_LIGHT, OnLight())
	ON_COMMAND(Glut_BCC, IDC_LIGHTX, OnLightXChanged(wParam))
	ON_COMMAND(Glut_BCC, IDC_LIGHTY, OnLightYChanged(wParam))
	ON_COMMAND(Glut_BCC, IDC_LIGHTZ, OnLightZChanged(wParam))
	ON_COMMAND(Glut_BCC, IDC_SELLIGHT, OnSelLight(wParam))
	ON_COMMAND(Glut_BCC, IDOK, OnIdok())
	//ウィンドウメッセージ関連
	//自動的にダイアログ作成時にOnInit()、終了時にOnClose()を呼びます
	ON_HSCROLL(Glut_BCC)
	ON_DESTROY(Glut_BCC)
END_DLGMSG

/////////////////////////////
//Glutクラス（CGL）外部変数
/////////////////////////////
CGLUT gl;

/////////////////////////////
//GLUT描画オブジェクト名配列
/////////////////////////////
char* g_ObjName[18] = {	"ワイアーティーポット",	"ソリッドティーポット",
						"ワイアー直方体",		"ソリッド直方体",
						"ワイアー球体",			"ソリッド球体",
						"ワイアー円錐", 		"ソリッド円錐",
						"ワイアー円環",			"ソリッド円環",
						"ワイアー四面体", 		"ソリッド四面体",
						"ワイアー八面体", 		"ソリッド八面体",
						"ワイアー十二面体", 	"ソリッド十二面体",
						"ワイアー二十面体", 	"ソリッド二十面体"};

/////////////////////
//GLUT投影方法名配列
/////////////////////
char* g_ProjName[3] = {"透視投影(gluPerspective)", "透視投影(glFrustum)", "平行投影(glOrtho)"};


////////////////////
//glLight照光名配列
////////////////////
char* g_LightName[3] = {"環境光(ambient)", "拡散光(diffuse)", "鏡面光(specular)"};

//外部変数
bool g_rotate = TRUE;											//常時回転フラグ
bool g_light = FALSE;											//Light使用フラグ
int g_prjctrls = 0;												//投影方式ID（0−gluPerspective、1−glFrustum、2−glOrtho）
GLdouble g_Red = 1.0, g_Green = 0, g_Blue = 0, g_Alpha = 1.0;	//描画色
GLdouble g_r = 0.0;												//回転角度
GLdouble g_x = 0.0, g_y = 1.0, g_z = 0.0;						//回転軸（起点（0, 0, 0））の軸端座標

GLfloat g_lightpos[4] = {50.0, 50.0, 0.0, 1.0};					//光源の座標（初期値(50.0, 50.0, 0.0）
int g_selected = 0;												//ライト、光属性とRGBA強度配列用添字
const GLenum g_lightno[3] = {GL_LIGHT0, GL_LIGHT1, GL_LIGHT2};	//ライト識別子
const GLenum g_kind[3] = {GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR};	//光属性（GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR）
/*
const GLfloat g_lightcolor[3][4] = {{0.0, 0.0, 0.0, 1.0},		//RGBA強度(環境光）−GL_LIGHT0
									{0.5, 0.5, 0.5, 1.0},		//RGBA強度(拡散光）−GL_LIGHT1
									{0.5, 0.5, 0.5, 1.0}};		//RGBA強度(鏡面光）−GL_LIGHT2
*/
const GLfloat g_lightcolor[3][4] = {{1.0, 1.0, 1.0, 1.0},		//RGBA強度(環境光）−GL_LIGHT0
									{1.0, 1.0, 1.0, 1.0},		//RGBA強度(拡散光）−GL_LIGHT1
									{1.0, 1.0, 1.0, 1.0}};		//RGBA強度(鏡面光）−GL_LIGHT2
/*
const GLfloat g_lightcolor[3][4] = {{0.0, 0.0, 0.0, 1.0},		//RGBA強度(環境光）−GL_LIGHT0
									{0.0, 0.0, 0.0, 1.0},		//RGBA強度(拡散光）−GL_LIGHT1
									{0.0, 0.0, 0.0, 1.0}};		//RGBA強度(鏡面光）−GL_LIGHT2
*/
