#include "StageEditor_Object.h" #include "StageEditor_TopButton.h" #include "StageEditor_MoveButton.h" #include "StageData.h" #include "ToolLib.h" // オブジェクト配置リストの座標と幅と高さ #define LIST_X (4) #define LIST_Y (TOPBUTTON_Y + TOPBUTTON_H + TOOL_WINDOW_NAME_HEIGHT + 4) #define LIST_W (256) #define LIST_H (256) // オブジェクト操作ボタンの基準座標 #define BUTTONS_X (0) #define BUTTONS_Y (4 + TOOL_SCROLLBAR_WIDTH + g_OEData.ButtonSpace.SpaceStart) // オブジェクトの操作ボタンを配置する範囲の高さ #define BUTTONS_H (197) // オブジェクトの移動ボタンの配置座標 #define MOVE_X (4) #define MOVE_Y (BUTTONS_Y + 112) // オブジェクトリストの座標と幅と高さ #define MODEL_LIST_X (LIST_X) #define MODEL_LIST_Y (4) #define MODEL_LIST_W (256) #define MODEL_LIST_H (183) // オブジェクト配置編集情報 typedef struct _SObjectEditData { // 編集対象のオブジェクトの配置番号 int Target; // スペース管理情報ハンドル int TSpaceManage; // 編集モード切替ボタン部分用のスペース情報 SToolSpace TopSpace; // オブジェクト配置リスト表示用ウインドウのハンドル int ListTWindow; // オブジェクト配置リストのハンドル int TList; // 操作ボタン部分用のスペース情報 SToolSpace ButtonSpace; // 配置オブジェクト追加ボタンのハンドル int AddTButton; // 配置オブジェクト削除ボタンのハンドル int DelTButton; // 配置オブジェクトの数が0の場合に非表示にするボタンなどの表示状態情報ハンドル int ZeroTVisible; // 選択オブジェクトの角度操作用ボタン int AngleResetTButton; int AngleXPlusTButton; int AngleXMinusTButton; int AngleYPlusTButton; int AngleYMinusTButton; int AngleZPlusTButton; int AngleZMinusTButton; // 選択オブジェクトの拡大率操作用ボタン int ScaleResetTButton; int ScaleXPlusTButton; int ScaleXMinusTButton; int ScaleYPlusTButton; int ScaleYMinusTButton; int ScaleZPlusTButton; int ScaleZMinusTButton; int ScaleAllPlusTButton; int ScaleAllMinusTButton; // 選択オブジェクトの移動ボタンの情報 SMoveButtonData MoveButton; // 選択オブジェクトが使用する3Dモデルのリスト表示用ウインドウのハンドル int ModelListTWindow; // 選択オブジェクトが使用する3Dモデルのリストのハンドル int ModelTList; } SObjectEditData; extern SObjectEditData g_OEData; SObjectEditData g_OEData; // オブジェクトの配置情報を追加する // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_Object_Add( void ); // 選択中のオブジェクトの配置情報を削除する // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_Object_Del( void ); // オブジェクト配置リストをセットアップする // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_Object_SetupList( void ); // オブジェクトリストの選択対象をセットアップする static void StageEditor_Object_SetupInfo( void ); // オブジェクト配置情報編集処理の初期化を行う // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) bool StageEditor_Object_Initialize( void ) { int VisibleHandle; SStageObjectModelInfo *OMInfo; MV1_REF_POLYGONLIST RefPolyList; int i; // スペース管理情報の作成 g_OEData.TSpaceManage = ToolSpaceManage_Create( SCREEN_HEIGHT ); if( g_OEData.TSpaceManage == -1 ) { return false; } // 編集モード切替ボタン部分用のスペース情報を追加 if( !ToolSpaceManage_AddSpace( g_OEData.TSpaceManage, &g_OEData.TopSpace, TOPSPACE, true ) ) { return false; } // オブジェクト配置リスト表示用ウインドウの作成 g_OEData.ListTWindow = ToolWindow_Create( g_OEData.TSpaceManage, false, true, false, "オブジェクト一覧", LIST_X, LIST_Y, LIST_W, LIST_H, LIST_W, LIST_H ); if( g_OEData.ListTWindow == -1 ) { return false; } // オブジェクト配置リストの作成 g_OEData.TList = ToolList_Create(); if( g_OEData.TList == -1 ) { return false; } // オブジェクト配置リストを初期化 ToolList_Initialize( g_OEData.TList, g_OEData.ListTWindow ); // 操作ボタン部分用のスペース情報を追加 if( !ToolSpaceManage_AddSpace( g_OEData.TSpaceManage, &g_OEData.ButtonSpace, BUTTONS_H, true ) ) { return false; } // 配置オブジェクト追加ボタンの作成 g_OEData.AddTButton = ToolButton_Create( false, "オブジェクト追加", BUTTONS_X + 4, BUTTONS_Y + 0, 85, BUTTON_H ); if( g_OEData.AddTButton == -1 ) { return false; } // 配置オブジェクト削除ボタンの作成 g_OEData.DelTButton = ToolButton_Create( false, "オブジェクト削除", BUTTONS_X + 89, BUTTONS_Y + 0, 85, BUTTON_H ); if( g_OEData.DelTButton == -1 ) { return false; } // 配置オブジェクトの数が0の場合に非表示にするボタンなどの表示状態情報ハンドルの作成 g_OEData.ZeroTVisible = ToolVisible_Create(); if( g_OEData.ZeroTVisible == -1 ) { return false; } // 初期状態では表示状態にする ToolVisible_SetVisible( g_OEData.ZeroTVisible, true ); // 選択オブジェクトの角度操作用ボタンの作成 g_OEData.AngleResetTButton = ToolButton_Create( false, "向きリセット", BUTTONS_X + 162, BUTTONS_Y + 26, 65, BUTTON_H ); if( g_OEData.AngleResetTButton == -1 ) { return false; } g_OEData.AngleXPlusTButton = ToolButton_Create( false, "向きX+", BUTTONS_X + 4, BUTTONS_Y + 26, 50, BUTTON_H ); if( g_OEData.AngleXPlusTButton == -1 ) { return false; } g_OEData.AngleXMinusTButton = ToolButton_Create( false, "向きX-", BUTTONS_X + 4, BUTTONS_Y + 46, 50, BUTTON_H ); if( g_OEData.AngleXMinusTButton == -1 ) { return false; } g_OEData.AngleYPlusTButton = ToolButton_Create( false, "向きY+", BUTTONS_X + 56, BUTTONS_Y + 26, 50, BUTTON_H ); if( g_OEData.AngleYPlusTButton == -1 ) { return false; } g_OEData.AngleYMinusTButton = ToolButton_Create( false, "向きY-", BUTTONS_X + 56, BUTTONS_Y + 46, 50, BUTTON_H ); if( g_OEData.AngleYMinusTButton == -1 ) { return false; } g_OEData.AngleZPlusTButton = ToolButton_Create( false, "向きZ+", BUTTONS_X + 108, BUTTONS_Y + 26, 50, BUTTON_H ); if( g_OEData.AngleZPlusTButton == -1 ) { return false; } g_OEData.AngleZMinusTButton = ToolButton_Create( false, "向きZ-", BUTTONS_X + 108, BUTTONS_Y + 46, 50, BUTTON_H ); if( g_OEData.AngleZMinusTButton == -1 ) { return false; } // 選択オブジェクトの拡大率操作用ボタンの作成 g_OEData.ScaleResetTButton = ToolButton_Create( false, "スケールリセット", BUTTONS_X + 214, BUTTONS_Y + 68, 65, BUTTON_H ); if( g_OEData.ScaleResetTButton == -1 ) { return false; } g_OEData.ScaleXPlusTButton = ToolButton_Create( false, "スケールX+", BUTTONS_X + 4, BUTTONS_Y + 68, 50, BUTTON_H ); if( g_OEData.ScaleXPlusTButton == -1 ) { return false; } g_OEData.ScaleXMinusTButton = ToolButton_Create( false, "スケールX-", BUTTONS_X + 4, BUTTONS_Y + 88, 50, BUTTON_H ); if( g_OEData.ScaleXMinusTButton == -1 ) { return false; } g_OEData.ScaleYPlusTButton = ToolButton_Create( false, "スケールY+", BUTTONS_X + 56, BUTTONS_Y + 68, 50, BUTTON_H ); if( g_OEData.ScaleYPlusTButton == -1 ) { return false; } g_OEData.ScaleYMinusTButton = ToolButton_Create( false, "スケールY-", BUTTONS_X + 56, BUTTONS_Y + 88, 50, BUTTON_H ); if( g_OEData.ScaleYMinusTButton == -1 ) { return false; } g_OEData.ScaleZPlusTButton = ToolButton_Create( false, "スケールZ+", BUTTONS_X + 108, BUTTONS_Y + 68, 50, BUTTON_H ); if( g_OEData.ScaleZPlusTButton == -1 ) { return false; } g_OEData.ScaleZMinusTButton = ToolButton_Create( false, "スケールZ-", BUTTONS_X + 108, BUTTONS_Y + 88, 50, BUTTON_H ); if( g_OEData.ScaleZMinusTButton == -1 ) { return false; } g_OEData.ScaleAllPlusTButton = ToolButton_Create( false, "スケール+", BUTTONS_X + 160, BUTTONS_Y + 68, 50, BUTTON_H ); if( g_OEData.ScaleAllPlusTButton == -1 ) { return false; } g_OEData.ScaleAllMinusTButton = ToolButton_Create( false, "スケール-", BUTTONS_X + 160, BUTTONS_Y + 88, 50, BUTTON_H ); if( g_OEData.ScaleAllMinusTButton == -1 ) { return false; } // 選択オブジェクト移動用ボタン情報の初期化 if( !MoveButton_Initialize( &g_OEData.MoveButton, MOVE_X, MOVE_Y ) ) { return false; } // 選択オブジェクトが使用する3Dモデルのリスト表示用ウインドウを作成 g_OEData.ModelListTWindow = ToolWindow_Create( g_OEData.TSpaceManage, false, true, false, "オブジェクトモデル一覧", MODEL_LIST_X, MODEL_LIST_Y, MODEL_LIST_W, MODEL_LIST_H, MODEL_LIST_W, MODEL_LIST_H ); if( g_OEData.ModelListTWindow == -1 ) { return false; } // 選択オブジェクトが使用する3Dモデルのリストを作成 g_OEData.ModelTList = ToolList_Create(); if( g_OEData.ModelTList == -1 ) { return false; } // 3Dモデルのリストを初期化 ToolList_Initialize( g_OEData.ModelTList, g_OEData.ModelListTWindow ); // リストにオブジェクトに使用できる3Dモデルを追加する OMInfo = g_StageData.ObjectModelInfo; for( i = 0; i < STAGE_OBJECT_MODEL_MAX_NUM; i++, OMInfo++ ) { if( OMInfo->Load == false ) { break; } RefPolyList = MV1GetReferenceMesh( OMInfo->ModelHandle, -1, FALSE ); ToolList_AddObj( g_OEData.ModelTList, "No:%d ポリゴン数:%d", i, RefPolyList.PolygonNum ); } // オブジェクト配置編集処理用の表示状態情報ハンドルを取得 VisibleHandle = StageEditor_TopButton_GetEditModeVisibleHandle(EEditMode_ObjectEdit); // オブジェクト配置編集で使用するウインドウやボタンと表示状態情報ハンドルを関連付ける ToolWindow_SetVisibleHandle( g_OEData.ListTWindow, VisibleHandle ); ToolButton_SetVisibleHandle( g_OEData.AddTButton, VisibleHandle ); ToolButton_SetVisibleHandle( g_OEData.DelTButton, VisibleHandle ); ToolVisible_SetParent( g_OEData.ZeroTVisible, VisibleHandle ); // 配置オブジェクト数が0の場合に非表示にするボタンと表示状態情報ハンドルを関連付ける ToolButton_SetVisibleHandle( g_OEData.AngleResetTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.AngleXPlusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.AngleXMinusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.AngleYPlusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.AngleYMinusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.AngleZPlusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.AngleZMinusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleResetTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleXPlusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleXMinusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleYPlusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleYMinusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleZPlusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleZMinusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleAllPlusTButton, g_OEData.ZeroTVisible ); ToolButton_SetVisibleHandle( g_OEData.ScaleAllMinusTButton, g_OEData.ZeroTVisible ); MoveButton_SetVisibleHandle( &g_OEData.MoveButton, g_OEData.ZeroTVisible ); ToolWindow_SetVisibleHandle( g_OEData.ModelListTWindow, g_OEData.ZeroTVisible ); // 正常終了 return true; } // オブジェクト配置情報編集処理のステージ読み込み後の初期化処理を行う // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) bool StageEditor_Object_StageLoadInitialize( void ) { // 選択対象を初期化 g_OEData.Target = 0; // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } // 配置オブジェクトの数が0の場合に非表示にする表示状態を設定 ToolVisible_SetVisible(g_OEData.ZeroTVisible,g_StageData.Header.ObjectInfoNum != 0 ); // 正常終了 return true; } // オブジェクト配置情報編集処理で選択されているオブジェクトの座標を取得する // 戻り値 : 座標の取得に成功したかどうか( true:成功した false:失敗した ) bool StagaEditor_Object_GetTargetPos( // 座標を代入する変数のアドレス VECTOR *TargetPos ) { // 配置オブジェクトが一つも無い場合は何もせずに終了 if( g_StageData.Header.ObjectInfoNum == 0 ) { return false; } *TargetPos = g_StageData.ObjectInfo[ g_OEData.Target ].Position; // 正常終了 return true; } // オブジェクトの配置情報を追加する // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_Object_Add( void ) { SStageObjectInfo *OInfo; // オブジェクト配置情報の数が既に最大数に達していたら何もせずに終了 if( g_StageData.Header.ObjectInfoNum == STAGE_OBJECT_MAX_NUM ) { return true; } // 新しいオブジェクト配置情報の初期化 OInfo = &g_StageData.ObjectInfo[ g_StageData.Header.ObjectInfoNum ]; OInfo->Position = VAdd( g_SEData.Camera.Position, VScale( g_SEData.Camera.Direction, ADD_UNIT_DISTANCE ) ); OInfo->Angle = VGet( 0.0f, 0.0f, 0.0f ); OInfo->Scale = VGet( 1.0f, 1.0f, 1.0f ); // 選択しているオブジェクト配置情報を追加したオブジェクト配置情報にする g_OEData.Target = g_StageData.Header.ObjectInfoNum; // オブジェクト配置情報の数を増やす g_StageData.Header.ObjectInfoNum++; // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } // 配置オブジェクトの数が0の場合に非表示にする表示状態を『表示』の状態にする ToolVisible_SetVisible( g_OEData.ZeroTVisible, true ); // 正常終了 return true; } // 選択中のオブジェクトの配置情報を削除する // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_Object_Del( void ) { // 配置されているオブジェクトの数が一つも無い場合は何もせずに終了 if( g_StageData.Header.ObjectInfoNum == 0 ) { return true; } // オブジェクト配置情報の数を減らす g_StageData.Header.ObjectInfoNum--; // 削除処理後の選択対象のオブジェクト配置情報を決定 if( g_OEData.Target == g_StageData.Header.ObjectInfoNum ) { g_OEData.Target = g_StageData.Header.ObjectInfoNum - 1; if( g_OEData.Target < 0 ) { g_OEData.Target = 0; } } else { // 削除対象が配列の途中だった場合は情報を詰める memmove( &g_StageData.ObjectInfo[ g_OEData.Target ], &g_StageData.ObjectInfo[ g_OEData.Target + 1 ], sizeof( SStageObjectInfo ) * ( g_StageData.Header.ObjectInfoNum - g_OEData.Target ) ); } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } // 配置オブジェクトの数が0の場合に非表示にする表示状態を設定 ToolVisible_SetVisible(g_OEData.ZeroTVisible,g_StageData.Header.ObjectInfoNum != 0 ); // 正常終了 return true; } // オブジェクト配置情報編集処理の状態推移処理を行う // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) bool StageEditor_Object_Step( void ) { SStageObjectInfo *OInfo; SStageObjectModelInfo *OMInfo; int MouseClickObject; bool MouseClickObjectEnable; float MouseClickObjectDistanceSq; int i; float DistanceSq; MV1_COLL_RESULT_POLY CollResultPoly; // 画面上に表示されているオブジェクトがマウスカーソルでクリックされたかどうかを調べる if( ( g_SEData.Mouse.EdgeInput & MOUSE_INPUT_LEFT ) != 0 && Tool_GetBaseRightX() < g_SEData.Mouse.ClickPosX ) { // クリックされた座標で最も近いオブジェクトを割り出す MouseClickObjectEnable = false; MouseClickObjectDistanceSq = 0.0f; OInfo = g_StageData.ObjectInfo; for( i = 0; i < g_StageData.Header.ObjectInfoNum; i++, OInfo++ ) { OMInfo = &g_StageData.ObjectModelInfo[ OInfo->ModelID ]; MV1SetPosition( OMInfo->ModelHandle, OInfo->Position ); MV1SetRotationXYZ( OMInfo->ModelHandle, OInfo->Angle ); MV1SetScale( OMInfo->ModelHandle, OInfo->Scale ); MV1RefreshCollInfo( OMInfo->ModelHandle ); CollResultPoly = MV1CollCheck_Line( OMInfo->ModelHandle, -1, g_SEData.Mouse.ClickPosNear, g_SEData.Mouse.ClickPosFar ); // 当たっているか判定 if( CollResultPoly.HitFlag ) { DistanceSq = VSquareSize( VSub( CollResultPoly.HitPosition, g_SEData.Mouse.ClickPosNear ) ); // 当たっていたら、今まで当たったオブジェクトが居なかったか、 // 又は今まで当たったオブジェクトより近かったら記録 if( MouseClickObjectEnable == false || DistanceSq < MouseClickObjectDistanceSq ) { MouseClickObjectEnable = true; MouseClickObject = i; MouseClickObjectDistanceSq = DistanceSq; } } } // オブジェクトがクリックされた場合は編集対象のオブジェクトの変更処理を行う if( MouseClickObjectEnable ) { g_OEData.Target = MouseClickObject; // オブジェクト配置リストの選択行を変更する ToolList_SetSelectIndex( g_OEData.TList, g_OEData.Target ); // 選択オブジェクトが使用している3Dモデルの情報を更新 StageEditor_Object_SetupInfo(); } } // オブジェクト配置リストの状態が変化した場合は新しい編集対象を取得する if( ToolList_GetChange( g_OEData.TList, true ) ) { g_OEData.Target = ToolList_GetSelectIndex( g_OEData.TList ); // 選択オブジェクトが使用している3Dモデルの情報を更新 StageEditor_Object_SetupInfo(); // カメラを選択オブジェクトが見える位置に移動する SetupTargetLookAtCamera(); } // 配置オブジェクトが一つでもある場合のみオブジェクト編集ボタンのチェックをする if( g_StageData.Header.ObjectInfoNum > 0 ) { OInfo = &g_StageData.ObjectInfo[ g_OEData.Target ]; // 選択オブジェクトの移動ボタンによる移動処理を行う if( MoveButton_Step( &g_OEData.MoveButton, &OInfo->Position, MOVE_BASE_SPEED * g_SEData.MoveSpeedF ) ) { // 移動が行われた場合はオブジェクト配置リストの情報更新を行う if( !StageEditor_Object_SetupList() ) { return false; } } // 配置オブジェクトが使用する3Dモデルのリストの選択行が変化した場合は // 配置オブジェクトが使用する3Dモデルを変更する if( ToolList_GetChange( g_OEData.ModelTList, true ) ) { OInfo->ModelID = ToolList_GetSelectIndex( g_OEData.ModelTList ); // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } // 選択オブジェクトの角度操作ボタンが押された場合はオブジェクトの向きを変更する if( ToolButton_GetRepeatBottom( g_OEData.AngleResetTButton ) ) { OInfo->Angle = VGet( 0.0f, 0.0f, 0.0f ); // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.AngleXMinusTButton ) ) { OInfo->Angle.x -= ANGLE_BASE_SPEED * g_SEData.AngleSpeedF; if( OInfo->Angle.x < 0.0f ) { OInfo->Angle.x += DX_PI_F * 2.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.AngleXPlusTButton ) ) { OInfo->Angle.x += ANGLE_BASE_SPEED * g_SEData.AngleSpeedF; if( OInfo->Angle.x >= DX_PI_F * 2.0f ) { OInfo->Angle.x -= DX_PI_F * 2.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.AngleYMinusTButton ) ) { OInfo->Angle.y -= ANGLE_BASE_SPEED * g_SEData.AngleSpeedF; if( OInfo->Angle.y < 0.0f ) { OInfo->Angle.y += DX_PI_F * 2.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.AngleYPlusTButton ) ) { OInfo->Angle.y += ANGLE_BASE_SPEED * g_SEData.AngleSpeedF; if( OInfo->Angle.y >= DX_PI_F * 2.0f ) { OInfo->Angle.y -= DX_PI_F * 2.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.AngleZMinusTButton ) ) { OInfo->Angle.z -= ANGLE_BASE_SPEED * g_SEData.AngleSpeedF; if( OInfo->Angle.z < 0.0f ) { OInfo->Angle.z += DX_PI_F * 2.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.AngleZPlusTButton ) ) { OInfo->Angle.z += ANGLE_BASE_SPEED * g_SEData.AngleSpeedF; if( OInfo->Angle.z >= DX_PI_F * 2.0f ) { OInfo->Angle.z -= DX_PI_F * 2.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } // 選択オブジェクトの拡大率操作ボタンが押された場合は // オブジェクトの拡大率を変更する if( ToolButton_GetRepeatBottom( g_OEData.ScaleResetTButton ) ) { OInfo->Scale = VGet( 1.0f, 1.0f, 1.0f ); // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleXMinusTButton ) ) { OInfo->Scale.x -= SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.x < 0.01f ) { OInfo->Scale.x = 0.01f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleXPlusTButton ) ) { OInfo->Scale.x += SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.x > 100.0f ) { OInfo->Scale.x = 100.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleYMinusTButton ) ) { OInfo->Scale.y -= SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.y < 0.01f ) { OInfo->Scale.y = 0.01f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleYPlusTButton ) ) { OInfo->Scale.y += SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.y > 100.0f ) { OInfo->Scale.y = 100.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleZMinusTButton ) ) { OInfo->Scale.z -= SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.z < 0.01f ) { OInfo->Scale.z = 0.01f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleZPlusTButton ) ) { OInfo->Scale.z += SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.z > 100.0f ) { OInfo->Scale.z = 100.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleAllMinusTButton ) ) { OInfo->Scale.x -= SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.x < 0.01f ) { OInfo->Scale.x = 0.01f; } OInfo->Scale.y -= SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.y < 0.01f ) { OInfo->Scale.y = 0.01f; } OInfo->Scale.z -= SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.z < 0.01f ) { OInfo->Scale.z = 0.01f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } if( ToolButton_GetRepeatBottom( g_OEData.ScaleAllPlusTButton ) ) { OInfo->Scale.x += SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.x > 100.0f ) { OInfo->Scale.x = 100.0f; } OInfo->Scale.y += SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.y > 100.0f ) { OInfo->Scale.y = 100.0f; } OInfo->Scale.z += SCALE_BASE_SPEED * g_SEData.ScaleSpeedF; if( OInfo->Scale.z > 100.0f ) { OInfo->Scale.z = 100.0f; } // オブジェクト配置リストの情報を更新 if( !StageEditor_Object_SetupList() ) { return false; } } } // 配置オブジェクトを追加するボタンが押されたら配置オブジェクトを追加する if( ToolButton_GetClick( g_OEData.AddTButton, true ) ) { StageEditor_Object_Add(); } // 配置オブジェクトを削除するボタンが押されたら選択されているオブジェクトを削除する if( ToolButton_GetClick( g_OEData.DelTButton, true ) ) { if( !StageEditor_Object_Del() ) { return false; } } // 正常終了 return true; } // オブジェクト配置情報編集処理の描画処理を行う void StageEditor_Object_Render( void ) { int i; int j; SStageObjectInfo *OInfo; SStageObjectModelInfo *OMInfo; // 配置オブジェクトを描画 for( j = 0; j < 2; j++ ) { switch( j ) { case 0: // 1ループ目は半透明要素の無い部分を描画 MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_NOT_SEMITRANS_ONLY ); break; case 1: // 2ループ目は半透明要素のある部分を描画 MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_SEMITRANS_ONLY ); break; } OInfo = g_StageData.ObjectInfo; for( i = 0; i < g_StageData.Header.ObjectInfoNum; i++, OInfo++ ) { OMInfo = &g_StageData.ObjectModelInfo[ OInfo->ModelID ]; MV1SetPosition( OMInfo->ModelHandle, OInfo->Position ); MV1SetRotationXYZ( OMInfo->ModelHandle, OInfo->Angle ); MV1SetScale( OMInfo->ModelHandle, OInfo->Scale ); if( g_SEData.EditMode == EEditMode_ObjectEdit && g_OEData.Target == i ) { MV1SetDifColorScale( OMInfo->ModelHandle, g_SEData.BrinkColor ); } else { MV1SetDifColorScale( OMInfo->ModelHandle,GetColorF(1.0f,1.0f,1.0f,1.0f)); } MV1DrawModel( OMInfo->ModelHandle ); } } // 設定を元に戻す MV1SetSemiTransDrawMode( DX_SEMITRANSDRAWMODE_ALWAYS ); } // オブジェクト配置リストをセットアップする // 戻り値 : 処理が正常に終了したかどうか(true:正常に終了した false:エラーが発生した) static bool StageEditor_Object_SetupList( void ) { int i; SStageObjectInfo *OInfo; // オブジェクト配置リストを初期化する ToolList_Initialize( g_OEData.TList, g_OEData.ListTWindow ); // 配置オブジェクトが一つも無い場合はここで終了 if( g_StageData.Header.ObjectInfoNum == 0 ) { return true; } // 配置オブジェクトの情報をリストに追加する OInfo = g_StageData.ObjectInfo; for( i = 0; i < g_StageData.Header.ObjectInfoNum; i++, OInfo++ ) { ToolList_AddObj( g_OEData.TList, "No:%d Model:%d Pos:( %.1f, %.1f, %.1f ) Angle:( %.1f, %.1f, %.1f )", i, OInfo->ModelID, OInfo->Position.x, OInfo->Position.y, OInfo->Position.z, OInfo->Angle.x * 180.0f / DX_PI_F, OInfo->Angle.y * 180.0f / DX_PI_F, OInfo->Angle.z * 180.0f / DX_PI_F ); } // 編集対象のオブジェクトの行を選択状態にする ToolList_SetSelectIndex( g_OEData.TList, g_OEData.Target ); // 選択オブジェクトが使用している3Dモデルの情報を更新 StageEditor_Object_SetupInfo(); // 正常終了 return true; } // オブジェクトリストの選択対象をセットアップする static void StageEditor_Object_SetupInfo( void ) { SStageObjectInfo *OInfo; // 配置オブジェクトが一つも無い場合は何もせずに終了 if( g_StageData.Header.ObjectInfoNum == 0 ) { return; } OInfo = &g_StageData.ObjectInfo[ g_OEData.Target ]; // 編集対象のオブジェクトが使用している3Dモデルの行を選択状態にする ToolList_SetSelectIndex( g_OEData.ModelTList, OInfo->ModelID ); }