//------------------------------------------------------------------------------
// 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
 * Lamp for Maya 実装
 *
 * "Test/LampForMayaUnitTestBuildFlag.h"のLAMP_FOR_MAYA_UNIT_TEST_BUILD_FLAG
 * フラグを立てるとユニットテストをビルドします。<br>
 * 実行後Maya上で以下のコマンドを実行するとユニットテスト開始します。<br>
 * 「LampForMayaTest; unloadPlugin LampForMaya;」<br>
 * プラグインのアンロードはメモリリークを誤判定しないために必要です。<br>
 * <br>
 * プロジェクト設定<br>
 * 構成プロパティ->デバッグ->動作->コマンドに「maya.exe」<br>
 * 構成プロパティ->デバッグ->動作->コマンド引数に<br>
 * 「-command "LampForMayaTestInitialize;"」<br>
 * <br>
 * Mayaのファイルパス<br>
 * 「Lamp/LampForMaya/plug-ins」にプラグインパスを通す必要がある。<br>
 * 「Lamp/LampForMaya/scripts」にスクリプトパスを通す必要がある。<br>
 * 「Lamp/LampForMaya/icons」にアイコンパスを通す必要がある。<br>
 * Maya.envに以下の三行を付け加えるとよい。<br>
 *  MAYA_PLUG_IN_PATH = D:/Lamp/LampForMaya/plug-ins<br>
 *  MAYA_SCRIPT_PATH = D:/Lamp/LampForMaya/scripts<br>
 *  XBMLANGPATH = D:/Lamp/LampForMaya/icons<br>
 * @author Junpee
 */

/** @namespace LampForMaya Lamp用Mayaプラグイン
 *
 * 3DグラフィックスライブラリLampのMayaプラグイン用ネームスペースです。
 */

#include "System/stdafx.h"
#include <maya/MFnPlugin.h>
#include "Translator/Core/LampTextTranslator.h"
#include "Translator/Core/LampBinaryTranslator.h"
#include "Material/Basic/LampBasicMaterial.h"

#include "Test/LampForMayaUnitTestBuildFlag.h"
#if LAMP_FOR_MAYA_UNIT_TEST_BUILD_FLAG
#include "Test/LampForMayaTest.h"
#endif

using namespace LampForMaya;

//------------------------------------------------------------------------------
/**
 * プラグイン初期化
 * @param object プラグインオブジェクト
 * @return プラグインの初期化に成功すればMStatus::kSuccess
 */
MStatus initializePlugin(MObject object){
	//--------------------------------------------------------------------------
	// システム初期化
	//--------------------------------------------------------------------------
	// Lamp初期化
	LampCore::initialize();
	// Mayaエラー出力初期化
	MayaErrorOutput::initialize();

	//--------------------------------------------------------------------------
	MStatus result;

	MFnPlugin plugin(object, "Nemunekoya", "0.1", "Any");

	// サーフェースシェーダ分類
	MString surfaceShaderClassify("shader/surface");

	// 基本マテリアルの登録
	result = plugin.registerNode(
		"LampBasicMaterial",			// プラグイン名
		LampBasicMaterial::id,			// タイプID
		LampBasicMaterial::creator,		// 生成メソッド
		LampBasicMaterial::initialize,	// 初期化メソッド
		MPxNode::kHwShaderNode,			// ノードの種類を指定
		&surfaceShaderClassify);		// シェーダ分類
	MayaStatusCheck(result);

	// テキストファイル出力プラグインの登録
	result = plugin.registerFileTranslator(
		"LampTextTranslator",			// プラグイン名
		"LampTextTranslator.xpm",		// アイコンファイル名
		LampTextTranslator::creator,	// 生成メソッド
		"LampTranslatorOptions",		// オプションMELスクリプト名
		"",								// デフォルトオプション
		true);							// MEL使用フラグ
	MayaStatusCheck(result);

	// バイナリファイル出力プラグインの登録
	result = plugin.registerFileTranslator(
		"LampBinaryTranslator",			// プラグイン名
		"LampBinaryTranslator.xpm",		// アイコンファイル名
		LampBinaryTranslator::creator,	// 生成メソッド
		"LampTranslatorOptions",		// オプションMELスクリプト名
		"",								// デフォルトオプション
		true);							// MEL使用フラグ
	MayaStatusCheck(result);

#if LAMP_FOR_MAYA_UNIT_TEST_BUILD_FLAG
	// テストコマンドプラグインの登録
	result = plugin.registerCommand(
		"LampForMayaTest", LampForMayaTest::creator);
	MayaStatusCheck(result);
#endif

	return result;
}
//------------------------------------------------------------------------------
/**
 * プラグイン後始末
 * @param object プラグインオブジェクト
 * @return プラグインの後始末に成功すればMStatus::kSuccess
 */
MStatus uninitializePlugin(MObject object){
	MStatus result;
	MFnPlugin plugin(object);

#if LAMP_FOR_MAYA_UNIT_TEST_BUILD_FLAG
	// テストコマンドプラグインの登録解除
	result = plugin.deregisterCommand ("LampForMayaTest");
	MayaStatusCheck(result);
#endif

	// バイナリファイル出力プラグインの登録解除
	result = plugin.deregisterFileTranslator("LampBinaryTranslator");
	MayaStatusCheck(result);

	// テキストファイル出力プラグインの登録解除
	result = plugin.deregisterFileTranslator("LampTextTranslator");
	MayaStatusCheck(result);

	// 基本マテリアルの登録解除
	result = plugin.deregisterNode(LampBasicMaterial::id);
	MayaStatusCheck(result);

	// Lamp後始末
	LampCore::finalize();

	//--------------------------------------------------------------------------
	return result;
}
//------------------------------------------------------------------------------
