| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program 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 General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : Max2W3d *
- * *
- * $Archive:: /Commando/Code/Tools/max2w3d/GMaxMtlDlg.cpp $*
- * *
- * Author:: Moumine Ballo *
- * *
- * $Modtime:: 4/05/02 11:10a $*
- * *
- * $Revision:: 11 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #if defined W3D_GMAXDEV
- #include <Max.h>
- #include <gport.h>
- #include <hsv.h>
- #include <bmmlib.h>
- #include "GMaxMtlDlg.h"
- #include "GameMtl.h"
- #include "GameMtlPassDlg.h"
- #include "dllmain.h"
- #include "resource.h"
- #include "w3d_file.h"
- #include "prsht.h"
- #include "gameMtlForm.h"
- extern GMaxMtlDlg * GMaxMaterialDialog;
- #include <pshpack1.h>
- typedef struct DLGTEMPLATEEX{
- WORD dlgVer;
- WORD signature;
- DWORD helpID;
- DWORD exStyle;
- DWORD style;
- WORD cDlgItems;
- short x;
- short y;
- short cx;
- short cy;
- } DLGTEMPLATEEX, *LPDLGTEMPLATEEX;
- #include <poppack.h>
- //============================================================================================
- #define WM_USER_UPDATE_MULTIMTL (WM_USER+141)
- static BOOL CALLBACK DisplacementMapDlgProc(HWND hwndDlg, UINT msg, WPARAM wPara,LPARAM lParam);
- static BOOL CALLBACK SurfaceTypePanelDlgProc(HWND hwndDlg, UINT msg, WPARAM wPara,LPARAM lParam);
- static BOOL CALLBACK PassCountPanelDlgProc(HWND hwndDlg, UINT msg, WPARAM wPara,LPARAM lParam);
- static BOOL CALLBACK PassCountDialogDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam,LPARAM lParam);
- static _Num_Of_NoNames(0); //Tracks the number addded to new material name
- GameMtl* ConvertStdMtl(Mtl* stdmtl);
- bool _UsingLargeFonts(false);
- // GMaxMtlDlg::GMaxMtlDlg -- constructor *
- //============================================================================================
- GMaxMtlDlg::GMaxMtlDlg(HWND hwMtlEdit, IMtlParams *imp, GameMtl *m)
- {
- Ip = GetCOREInterface();
- HwndEdit = hwMtlEdit;
- HwndPassCount = NULL;
- HwndSurfaceType = NULL;
- HwndDisplacementMap = NULL;
- HpalOld = NULL;
- Game_multi_mtl = NULL;
- if(imp){
- Game_multi_mtl = ((FakeIMtlParams*)imp)->Multi_mtl_list;
- }
- HGetMtlBmp = NULL;
- HBrowseMtlBmp = NULL;
- HAssignMtlBmp = NULL;
- HDeleteMtlBmp = NULL;
- HNewMtlBmp = NULL;
- HPreviousSiblingBmp = NULL;
- HNextSiblingBmp = NULL;
- DontShowMtlType = false;
- DontShowDeleteAll = false;
- fpMatNav.SetIFPMatNavCallback( this );
- for (int i=0; i<MAX_PASSES; i++) {
- PassDialog[i] = NULL;
- }
- TheMtl = m;
- IParams = imp;
- IsActive = 0;
- Build_Dialog(hwMtlEdit);
- }
- // GMaxMtlDlg::~GMaxMtlDlg -- destructor!
- //============================================================================================
- GMaxMtlDlg::~GMaxMtlDlg() {
- for (int i=0; i<MAX_PASSES; i++) {
- if (PassDialog[i]) {
- delete PassDialog[i];
- PassDialog[i] = NULL;
- }
- }
- TheMtl->SetParamDlg(NULL);
- }
- // GMaxMtlDlg::ClassID -- Returns the ClassID of GameMtl
- //============================================================================================
- Class_ID GMaxMtlDlg::ClassID(){
- return GameMaterialClassID;
- }
- // GMaxMtlDlg::SetThing -- Sets the material to be edited
- //============================================================================================
- void GMaxMtlDlg::SetThing(ReferenceTarget *m)
- {
- assert (m);
- assert (m->SuperClassID()==MATERIAL_CLASS_ID);
- assert ((m->ClassID()==GameMaterialClassID) || (m->ClassID()==PS2GameMaterialClassID));
- assert (TheMtl);
- int pass;
- // destroy our old pass dialogs
- for (pass=0; pass<TheMtl->Get_Pass_Count();pass++) {
- delete PassDialog[pass];
- PassDialog[pass] = NULL;
- }
- // install the new material
- TheMtl->SetParamDlg(NULL);
- TheMtl = (GameMtl *)m;
- TheMtl->SetParamDlg(this);
- // build a new set of pass dialogs
- for (pass=0; pass<TheMtl->Get_Pass_Count(); pass++) {
- PassDialog[pass] = new GameMtlPassDlg(HwndEdit, IParams, TheMtl, pass);
- }
- // refresh the contents of the dialogs
- ReloadDialog();
- }
- // GMaxMtlDlg::SetTime -- Sets the time value, updates the material and the dialog
- //============================================================================================
- void GMaxMtlDlg::SetTime(TimeValue t)
- {
- if (t!=CurTime) {
- CurTime = t;
- // TheMtl->Update(Ip->GetTime(),Valid);
- ReloadDialog();
- }
- }
-
- // GMaxMtlDlg::ReloadDialog -- Updates the values in all of the dialog's controls
- //============================================================================================
- void GMaxMtlDlg::ReloadDialog()
- {
- //Init the pass count panel
- assert(TheMtl && HwndPassCount && HwndSurfaceType);
- // Init the surface count panel
- ::SendMessage (HwndSurfaceType, WM_USER+101, 0, 0L);
- #ifdef WANT_DISPLACEMENT_MAPS
- ::SendMessage (HwndDisplacementMap, WM_USER+101, 0, 0L);
- #endif //WANT_DISPLACEMENT_MAPS
- // Init the pass count panel
- char a[10];
- sprintf(a, "%d", TheMtl->Get_Pass_Count());
- SetWindowText(GetDlgItem(HwndPassCount, IDC_GAMEMTL_PASSCOUNT_STATIC), a);
- //Init each pass panel
- for(int i = 0; i < TheMtl->Get_Pass_Count(); i++){
- PassDialog[i]->ReloadDialog();
- }
- }
- // GMaxMtlDlg::ActivateDlg -- Activates and deactivates the dialog
- //============================================================================================
- void GMaxMtlDlg::ActivateDlg(BOOL onoff){
- for(int i = 0; i < TheMtl->Get_Pass_Count(); i++){
- assert(PassDialog[i]);
- PassDialog[i]->ActivateDlg(onoff);
- }
- }
- // GMaxMtlDlg::Invalidate -- causes the dialog to be redrawn
- //============================================================================================
- void GMaxMtlDlg::Invalidate(){
- InvalidateRect(HwndSurfaceType,NULL,0);
- #ifdef WANT_DISPLACEMENT_MAPS
- InvalidateRect(HwndDisplacementMap,NULL,0);
- #endif //WANT_DISPLACEMENT_MAPS
- InvalidateRect(HwndPassCount,NULL,0);
- }
- BOOL GMaxMtlDlg::DisplacementMapProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
- switch (message){
- case WM_INITDIALOG:
- case WM_USER + 101:{
- SetDlgItemInt (hDlg, IDC_AMOUNT_EDIT, TheMtl->Get_Displacement_Amount () * 100, TRUE);
- SetupIntSpinner(hDlg, IDC_AMOUNT_SPIN, IDC_AMOUNT_EDIT, -999, 999, TheMtl->Get_Displacement_Amount () * 100);
- Texmap *map = TheMtl->Get_Displacement_Map ();
- if (map != NULL) {
- SetDlgItemText (hDlg, IDC_TEXTURE_BUTTON, map->GetFullName ());
- }
- break;
- }
- case CC_SPINNER_CHANGE:{
- ISpinnerControl *control = (ISpinnerControl *)lParam;
- TheMtl->Set_Displacement_Amount (((float)control->GetIVal ()) / 100.0F);
- break;
- }
- case WM_COMMAND:
- switch(LOWORD(wParam)){
- case IDC_TEXTURE_BUTTON:
- if(HIWORD(wParam) == BN_CLICKED){
- PostMessage(HwndEdit, WM_TEXMAP_BUTTON, TheMtl->Get_Displacement_Map_Index (), (LPARAM)TheMtl);
- }
- break;
- }
- }
- return FALSE;
- }
- //============================================================================================
- BOOL GMaxMtlDlg::SurfaceTypeProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
- switch (message){
- case WM_INITDIALOG:{
- // Fill the combobox with the names of the different surface types
- for (int index = 0; index < SURFACE_TYPE_MAX; index ++){
- ::SendDlgItemMessage ( hDlg,IDC_SURFACE_TYPE_COMBO,CB_ADDSTRING,0,(LPARAM)SURFACE_TYPE_STRINGS[index]);
- }
- // Limit the range of the static sort level spinner to 0 - MAX_SORT_LEVEL.
- int sort_level = TheMtl->Get_Sort_Level();
- SetupIntSpinner(hDlg, IDC_SORT_LEVEL_SPIN, IDC_SORT_LEVEL, 0, MAX_SORT_LEVEL, sort_level);
- // Check the checkbox if sort_level is not SORT_LEVEL_NONE.
- ::SendDlgItemMessage(hDlg, IDC_ENABLE_SORT_LEVEL, BM_SETCHECK,
- sort_level == SORT_LEVEL_NONE ? BST_UNCHECKED : BST_CHECKED, 0);
- LoadButtonBitmaps(hDlg);
- //Show Hide the sub mat controls
- ShowHideControls();
- TSTR name_str = TheMtl->GetName();
- //SetDlgItemText(hDlg, IDC_MTLNAME, dbg_txt);//name_str.data());
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_MTLNAME));
- pEdit->SetText(name_str.data());
- ReleaseICustEdit(pEdit);
- //Multi mat name
- if(Game_multi_mtl != NULL){
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(hDlg, IDC_MULTIMTLNAME));
- pEdit->GetText(name_str.data(), MAX_PATH);
- ReleaseICustEdit(pEdit);
- Game_multi_mtl->SetName(name_str);
- }
- }
- case WM_USER + 101:{
- // Select the current surface type
- ::SendDlgItemMessage ( hDlg,IDC_SURFACE_TYPE_COMBO,CB_SETCURSEL,(WPARAM)TheMtl->Get_Surface_Type (), 0L);
- // Set the correct sort level
- int sort_level = TheMtl->Get_Sort_Level();
- ISpinnerControl *spinner = GetISpinner(::GetDlgItem(hDlg, IDC_SORT_LEVEL_SPIN));
- assert(spinner);
- spinner->SetValue(sort_level, FALSE);
- ::SendDlgItemMessage(hDlg, IDC_ENABLE_SORT_LEVEL, BM_SETCHECK,
- sort_level == SORT_LEVEL_NONE ? BST_UNCHECKED : BST_CHECKED, 0);
- break;
- }
- case WM_USER_UPDATE_MULTIMTL:{
- //Show Hide the sub mat controls
- ShowHideControls();
- break;
- }
- case WM_USER+140:{
- ShowWindow(HwndEdit, SW_HIDE);
- return TRUE;
- }
- case WM_NOTIFY:{
- NMHDR * header = (NMHDR *)lParam;
- switch(header->code) {
- case PSN_SETACTIVE:{
- SetCurrentPage(0);
- return TRUE;
- }
- case PSN_RESET:{
- SetWindowLong(hDlg,DWL_MSGRESULT,FALSE);
- ::SendMessage(hDlg, WM_USER+140,0,0);
- return TRUE;
- }
-
- }
- break;
- }
- case WM_COMMAND:{
- switch(LOWORD(wParam)){
- case IDC_SURFACE_TYPE_COMBO:{
- if(HIWORD(wParam) == CBN_SELCHANGE){
- unsigned int type = ::SendDlgItemMessage (hDlg, IDC_SURFACE_TYPE_COMBO, CB_GETCURSEL, 0, 0L);
- TheMtl->Set_Surface_Type (type);
- }
- break;
- }
- case IDC_ENABLE_SORT_LEVEL:{
- if (HIWORD(wParam) == BN_CLICKED){
- // If the 'enable' checkbox was unchecked, set the sort level to NONE.
- int state = ::IsDlgButtonChecked(hDlg, IDC_ENABLE_SORT_LEVEL);
- ISpinnerControl *spinner = GetISpinner(::GetDlgItem(hDlg, IDC_SORT_LEVEL_SPIN));
- assert(spinner);
- if (state == BST_UNCHECKED){
- spinner->SetValue(SORT_LEVEL_NONE, FALSE);
- TheMtl->Set_Sort_Level(SORT_LEVEL_NONE);
- }else{
- if(state == BST_CHECKED){
- // Sort level was enabled, so set it's level to 1 if it was NONE before.
- if (spinner->GetIVal() == SORT_LEVEL_NONE){
- spinner->SetValue(1, FALSE);
- TheMtl->Set_Sort_Level(1);
- }
- }
- }
- }
- break;
- }
- case IDC_SETPASSCOUNT:{
- if(HIWORD(wParam) == BN_CLICKED){
- Set_Pass_Count_Dialog();
- }
- break;
- }
- case IDC_ASSIGN:{
- ApplyToSelection(TheMtl);
- break;
- }
- case IDC_NEWMTL:{
- DoNewMaterial();
- break;
- }
- case IDC_MTLNAME:{
- if(HIWORD(wParam) == EN_CHANGE){
- TSTR name_str;
- char str[MAX_PATH];
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(hDlg, IDC_MTLNAME));
- pEdit->GetText(str, MAX_PATH);
- ReleaseICustEdit(pEdit);
- name_str = str;
- TheMtl->SetName(name_str);
- }
- break;
- }
- case IDC_MULTIMTLNAME:{
- if(HIWORD(wParam) == EN_CHANGE){
- TSTR name_str;
- char str[MAX_PATH];
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(hDlg, IDC_MULTIMTLNAME));
- pEdit->GetText(str, MAX_PATH);
- ReleaseICustEdit(pEdit);
- name_str = str;
- Game_multi_mtl->SetName(name_str);
- }
- break;
- }
- case IDC_NAVIGATOR:{
- DoMaterialNavigator();
- break;
- }
- case IDC_GETMTL:{
- DoGetMaterial();
- break;
- }
- case IDC_DELETEMTL:{
- DeleteMtl();
- break;
- }
- case IDC_DELETEALL:{
- DeleteAllSceneMtl();
- break;
- }
- case IDC_SUBMTL_NUM:{
- if(HIWORD(wParam) == EN_CHANGE){
- if(HwndPassCount != NULL){ //Only after initializations
- // (gth) MATERIAL BEING CHANGED, user edited the current submtl index
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_SUBMTL_NUM));
- Current_Submtl_Index = pEdit->GetInt()-1 ;
- ReleaseICustEdit(pEdit);
- Mtl * new_mtl = Game_multi_mtl->GetSubMtl(Current_Submtl_Index);
- if(NULL != new_mtl && new_mtl != TheMtl && new_mtl->ClassID() == GameMaterialClassID) {
- Reinitialize((GameMtl*)new_mtl, false);
- }
- }
- }
- break;
- }
- case IDC_NEXTSIBLING:{
- NextSibling();
- break;
- }
- case IDC_PREVIOUSSIBLING:{
- PreviousSibling();
- break;
- }
- }
- break;
- }
- case CC_SPINNER_CHANGE:{
- ISpinnerControl *spinner = (ISpinnerControl*)lParam;
- switch(LOWORD(wParam)){
- case IDC_SORT_LEVEL_SPIN:{
- // Check the 'enabled' checkbox if sort level != SORT_LEVEL_NONE, uncheck it otherwise.
- ::SendDlgItemMessage(hDlg, IDC_ENABLE_SORT_LEVEL, BM_SETCHECK,
- spinner->GetIVal() == SORT_LEVEL_NONE ? BST_UNCHECKED : BST_CHECKED, 0);
- TheMtl->Set_Sort_Level(spinner->GetIVal());
- break;
- }
- }
- break;
- }
- }
- return FALSE;
- }
- //============================================================================================
- BOOL GMaxMtlDlg::PassCountProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){
- switch (message){
- case WM_INITDIALOG:
- break;
- case WM_COMMAND:{
- switch(LOWORD(wParam)){
- case IDC_SETPASSCOUNT:{
- if(HIWORD(wParam) == BN_CLICKED){
- Set_Pass_Count_Dialog();
- }
- break;
- }
- }
- break;
- }
- }
- return FALSE;
- }
- //============================================================================================
- static BOOL CALLBACK DisplacementMapDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam,LPARAM lParam){
- GMaxMtlDlg * theDlg;
- if (msg == WM_INITDIALOG) {
- lParam = ((PROPSHEETPAGE*)lParam)->lParam;
- theDlg = (GMaxMtlDlg*)lParam;
- theDlg->HwndDisplacementMap = hwndDlg;
- SetWindowLong(hwndDlg, GWL_USERDATA,(LPARAM)theDlg);
- } else {
- if ((theDlg = (GMaxMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) {
- return FALSE;
- }
- }
- theDlg->IsActive = 1;
- BOOL res = theDlg->DisplacementMapProc(hwndDlg,msg,wParam,lParam);
- theDlg->IsActive = 0;
- return res;
- }
- //============================================================================================
- static BOOL CALLBACK SurfaceTypePanelDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam,LPARAM lParam){
- GMaxMtlDlg * theDlg;
- if (msg == WM_INITDIALOG) {
- lParam = ((PROPSHEETPAGE*)lParam)->lParam;
- theDlg = (GMaxMtlDlg*)lParam;
- theDlg->HwndSurfaceType = hwndDlg;
- SetWindowLong(hwndDlg, GWL_USERDATA,(LPARAM)theDlg);
- // Set HwndPassCount to HwndSurfaceType
- theDlg->HwndPassCount = theDlg->HwndSurfaceType;
- PropSheet_Changed(GetParent(hwndDlg), hwndDlg); //Enable the "Apply" at all time
- } else {
- if ((theDlg = (GMaxMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) {
- return FALSE;
- }
- }
- theDlg->IsActive = 1;
- BOOL res = theDlg->SurfaceTypeProc(hwndDlg,msg,wParam,lParam);
- theDlg->IsActive = 0;
- return res;
- }
- //============================================================================================
- static BOOL CALLBACK PassCountPanelDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam,LPARAM lParam){
- GMaxMtlDlg * theDlg = (GMaxMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA);
- switch(msg){
- case WM_INITDIALOG: {
- lParam = ((PROPSHEETPAGE*)lParam)->lParam;
- theDlg = (GMaxMtlDlg*)lParam;
- theDlg->HwndPassCount = hwndDlg;
- SetWindowLong(hwndDlg, GWL_USERDATA,(LPARAM)theDlg);
- return FALSE;
- }
- }
- if ((theDlg = (GMaxMtlDlg *)GetWindowLong(hwndDlg, GWL_USERDATA) ) == NULL) {
- return FALSE;
- }
- theDlg->IsActive = 1;
- BOOL res = theDlg->PassCountProc(hwndDlg,msg,wParam,lParam);
- theDlg->IsActive = 0;
- return res;
- }
- //============================================================================================
- void GMaxMtlDlg::Set_Pass_Count_Dialog(void){
- int res = DialogBoxParam(
- AppInstance,
- MAKEINTRESOURCE(IDD_GAMEMTL_PASS_COUNT_DIALOG),
- HwndPassCount,
- PassCountDialogDlgProc,
- (LPARAM)TheMtl->Get_Pass_Count());
- if (res>=0){
- if(res<=0){
- res = 1;
- }
- if(res>4){
- res = 4;
- }
- char a[10];
- sprintf(a, "%d", res);
- SetWindowText(GetDlgItem(HwndPassCount, IDC_GAMEMTL_PASSCOUNT_STATIC), a);
- if(TheMtl->Get_Pass_Count() != res){
- int npass(TheMtl->Get_Pass_Count());
- if(res > npass){ //Add pages
- for(int i = npass; i < res; i++){
- PassDialog[i] = new GameMtlPassDlg(HwndEdit, IParams, TheMtl, i);
- }
- }else{//Remove pages
- for(int i = npass; i > res; i--){
- PropSheet_RemovePage(HwndEdit, i,NULL);
- PassDialog[i] = NULL;//new GameMtlPassDlg(HwndEdit, IParams, TheMtl, i-1);
- }
- }
- TheMtl->Set_Pass_Count(res);
- }
- }
- }
- //============================================================================================
- static BOOL CALLBACK PassCountDialogDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam,LPARAM lParam){
- switch (msg){
- case WM_INITDIALOG:{
- ISpinnerControl *spin = SetupIntSpinner(hwndDlg,IDC_PASSCOUNT_SPIN, IDC_PASSCOUNT_EDIT,1,4,(int)lParam);
- ReleaseISpinner(spin);
- CenterWindow(hwndDlg,GetParent(hwndDlg));
- break;
- }
- case WM_COMMAND:
- switch (LOWORD(wParam)){
- case IDOK:{
- ISpinnerControl *spin = GetISpinner(GetDlgItem(hwndDlg,IDC_PASSCOUNT_SPIN));
- EndDialog(hwndDlg,spin->GetIVal());
- ReleaseISpinner(spin);
- break;
- }
- case IDCANCEL:{
- EndDialog(hwndDlg,-1);
- break;
- }
- break;
- }
- default:
- return FALSE;
- }
- return TRUE;
- }
- /***********************************************************************************************
- * GMaxMtlDlg::Build_Dialog -- Adds the dialog to the material editor *
- * *
- * INPUT: *
- * *
- * OUTPUT: *
- * *
- * WARNINGS: *
- * *
- * HISTORY: *
- * 06/26/1997 GH : Created. *
- *=============================================================================================*/
- void GMaxMtlDlg::Build_Dialog(HWND hParent)// = NULL
- {
- //Need to initialize this global here
- if(GMaxMaterialDialog == NULL){
- GMaxMaterialDialog = this;
- }
- Make_PropertySheet(hParent);
- ReloadDialog();
- }
- //================================================
- int CALLBACK GameMtl_PropSheetProc( HWND hDlg, UINT msg, LPARAM lParam){
- switch(msg){
- case PSCB_INITIALIZED:{
- ShowWindow(GetDlgItem(hDlg,IDCANCEL), SW_HIDE);
- ShowWindow(GetDlgItem(hDlg,IDOK), SW_HIDE);
- return TRUE;
- }
- case PSCB_PRECREATE:{
- if (((LPDLGTEMPLATEEX)lParam)->signature == 0xFFFF){
- ((LPDLGTEMPLATEEX)lParam)->style &= ~DS_CONTEXTHELP;
- }
- else {
- ((LPDLGTEMPLATE)lParam)->style &= ~DS_CONTEXTHELP;
- }
- return TRUE;
- }
- }
- return FALSE;
- }
- //================================================
- void GMaxMtlDlg::Make_PropertySheet(HWND hParent){
- PROPSHEETPAGE ps_Pages[3];
- int pos(0);
- NONCLIENTMETRICS nc_metrics;
- nc_metrics.cbSize = sizeof(NONCLIENTMETRICS);
- //nc_metrics.lfMessageFont.lfHeight = -1;
- SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&nc_metrics,0);
- _UsingLargeFonts = (ABS(nc_metrics.lfMessageFont.lfHeight) > 12);
- //Surface type
- ps_Pages[pos].dwSize = sizeof(PROPSHEETPAGE);
- ps_Pages[pos].dwFlags = PSP_USEICONID | PSP_USETITLE ;
- ps_Pages[pos].hInstance = AppInstance;
- if(_UsingLargeFonts){
- ps_Pages[pos].pszTemplate = MAKEINTRESOURCE(IDD_GMAXMTL_SURFACE_TYPE);
- }else{
- ps_Pages[pos].pszTemplate = MAKEINTRESOURCE(IDD_GMAXMTL_SURFACE_TYPE_SMALL);
- }
- ps_Pages[pos].pszIcon = MAKEINTRESOURCE(IDI_ICONW3D);
- ps_Pages[pos].pfnDlgProc = SurfaceTypePanelDlgProc;
- ps_Pages[pos].pszTitle = MAKEINTRESOURCE(IDS_GMAXSURFACE_TYPE);
- ps_Pages[pos].lParam = (LPARAM)this;
- ps_Pages[pos].pfnCallback = NULL;
- pos++;
- #ifdef WANT_DISPLACEMENT_MAPS
- //Displacement type
- ps_Pages[pos].dwSize = sizeof(PROPSHEETPAGE);
- ps_Pages[pos].dwFlags = PSP_USEICONID | PSP_USETITLE;
- ps_Pages[pos].hInstance = AppInstance;
- ps_Pages[pos].pszTemplate = MAKEINTRESOURCE(IDD_GMAXMTL_DISPLACEMENT_MAP);
- ps_Pages[pos].pszIcon = MAKEINTRESOURCE(IDI_ICONW3D);
- ps_Pages[pos].pfnDlgProc = DisplacementMapDlgProc;
- ps_Pages[pos].pszTitle = MAKEINTRESOURCE(IDS_DISPLACEMENT_MAP);
- ps_Pages[pos].lParam = (LPARAM)this;
- ps_Pages[pos].pfnCallback = NULL;
- pos++;
- #endif //WANT_DISPLACEMENT_MAPS
- //Create the PropSheet
- PROPSHEETHEADER ps_Header;
- memset(&ps_Header, 0, sizeof(ps_Header));
- ps_Header.dwSize = sizeof(PROPSHEETHEADER);
- ps_Header.dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS | PSH_USECALLBACK | PSH_USEICONID | PSH_NOAPPLYNOW;// ;
- ps_Header.hwndParent = hParent;//GetCOREInterface()->GetMAXHWnd();
- ps_Header.hInstance = AppInstance;
- ps_Header.pszIcon = MAKEINTRESOURCE(IDI_ICONW3D);
- ps_Header.pszCaption = MAKEINTRESOURCE(IDS_W3DMATEDITOR);
- ps_Header.nPages = pos ;
- ps_Header.nStartPage = 0;
- ps_Header.ppsp = (LPCPROPSHEETPAGE) &ps_Pages;
- ps_Header.pfnCallback = GameMtl_PropSheetProc;
- HwndEdit = (HWND)PropertySheet(&ps_Header);
- //Crop out the area for "OK" "Apply"...
- RECT wind_rect;
- GetWindowRect(HwndEdit, &wind_rect);
- MoveWindow(HwndEdit, wind_rect.left, wind_rect.top,wind_rect.right - wind_rect.left,
- wind_rect.bottom - wind_rect.top -40, TRUE);
- // Position beneath the toolbar and slightly to the right
- SlideWindow(HwndEdit, 50,150);
- PropSheet_SetCurSel(HwndEdit,NULL, pos -1);//Force WM_INITDLG for the page
- HWND hwnd = PropSheet_IndexToHwnd(HwndEdit, 1);
- PropSheet_Changed(HwndEdit, hwnd); //Enable the "Apply" at all time
- for (int i=0; i<TheMtl->Get_Pass_Count(); i++) {
- PassDialog[i] = new GameMtlPassDlg(HwndEdit, IParams, TheMtl, i);
- PropSheet_SetCurSel(HwndEdit,NULL, i+pos);//Force WM_INITDLG for the page
- }
- PropSheet_SetCurSel(HwndEdit,NULL, 0);
- }
- //================================================
- static BOOL CALLBACK GmaxMaterialDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam,LPARAM lParam){
- return FALSE;
- }
- //================================================
- void GMaxMtlDlg::Reinitialize(GameMtl* new_mtl, bool update_multimtl){// = false
- //Delete pages
- int npages(0);
- if(TheMtl){
- npages = TheMtl->Get_Pass_Count();
- }
- //save
- int cur_page = CurrentPage;
- for (int i(npages); i > 0; i--) {
- PropSheet_RemovePage(HwndEdit, i,NULL);
- delete PassDialog[i];
- PassDialog[i] = NULL;
- }
- //Let know that ht material is no longer in the dialog
- if(TheMtl){
- TheMtl->SetParamDlg(NULL);
- }
- //Add new pages
- new_mtl->SetParamDlg(this);
- TheMtl = new_mtl;
- npages = TheMtl->Get_Pass_Count();
- for(i=0; i < npages; i++) {
- PassDialog[i] = new GameMtlPassDlg(HwndEdit, IParams, TheMtl, i);
- PropSheet_SetCurSel(HwndEdit,NULL, i+1);//Force WM_INITDLG for the page
- }
- //Make sure cur_page is not out of range for a new material
- if(cur_page > npages){
- cur_page = npages;
- }
- //====HwndSurfaceType Spinner
- int sort_level = TheMtl->Get_Sort_Level();
- SetupIntSpinner(HwndSurfaceType, IDC_SORT_LEVEL_SPIN, IDC_SORT_LEVEL, 0, MAX_SORT_LEVEL, sort_level);
- // Check the checkbox if sort_level is not SORT_LEVEL_NONE.
- ::SendDlgItemMessage(HwndSurfaceType, IDC_ENABLE_SORT_LEVEL, BM_SETCHECK,
- sort_level == SORT_LEVEL_NONE ? BST_UNCHECKED : BST_CHECKED, 0);
- //Surfface type combo
- ::SendDlgItemMessage (HwndSurfaceType,IDC_SURFACE_TYPE_COMBO,CB_SETCURSEL,(WPARAM)TheMtl->Get_Surface_Type (),0L);
- //==== ShowHide multimaterial stuff
- if(update_multimtl){
- ::SendMessage(HwndSurfaceType, WM_USER_UPDATE_MULTIMTL, 0, 0);
- }
- //Update name field
- TSTR name_str = TheMtl->GetName();
- char* dbg_txt = name_str.data();
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_MTLNAME));
- pEdit->SetText(dbg_txt);
- ReleaseICustEdit(pEdit);
- //Multi
- if(Game_multi_mtl != NULL){
- name_str = Game_multi_mtl->GetName();
- pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_MULTIMTLNAME));
- pEdit->SetText(name_str.data());
- ReleaseICustEdit(pEdit); //==== HwndPassCount
- }
- char a[10];
- sprintf(a, "%d", TheMtl->Get_Pass_Count());
- SetWindowText(GetDlgItem(HwndSurfaceType, IDC_GAMEMTL_PASSCOUNT_STATIC), a);
- PropSheet_SetCurSel(HwndEdit,NULL, cur_page);//Force WM_INITDLG for the page
- ReloadDialog();
- }
- //============================================================================================
- void GMaxMtlDlg::Reset(GameMtl* new_mtl){
- Reinitialize(new_mtl);
- ShowWindow(HwndEdit, SW_SHOW);
- }
- //============================================================================================
- //Adds a tooltip to a control
- void GMaxMtlDlg::AddToolTip(HWND hControl, UINT strID){
- char str[MAX_PATH];
- TOOLINFO ti;
- ti.cbSize = sizeof(TOOLINFO);
- ti.uFlags = TTF_SUBCLASS ;
- ti.hwnd = hControl;
- ti.uId = 0;
- ti.hinst = AppInstance;
- LoadString(AppInstance, strID,str , MAX_PATH);
- ti.lpszText = str;
- GetClientRect(hControl, &ti.rect);
- HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
- CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, hControl,NULL ,AppInstance, NULL );
- SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
- int res = SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
- }
- //============================================================================================
- void GMaxMtlDlg::LoadButtonBitmaps(HWND hDlg){
- //Get
- if(NULL == HGetMtlBmp){
- HGetMtlBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_GETMTL));
- }
- if(NULL != HGetMtlBmp){
- SendDlgItemMessage(hDlg,IDC_GETMTL, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HGetMtlBmp);
- AddToolTip(GetDlgItem(hDlg,IDC_GETMTL), IDS_GETMTL);
- }
- //Browse
- if(NULL == HBrowseMtlBmp){
- HBrowseMtlBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_BROWSE));
- }
- if(NULL != HBrowseMtlBmp){
- SendDlgItemMessage(hDlg,IDC_NAVIGATOR, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HBrowseMtlBmp);
- AddToolTip(GetDlgItem(hDlg,IDC_NAVIGATOR), IDS_NAVIGATOR);
- }
- //Assign
- if(NULL == HAssignMtlBmp){
- HAssignMtlBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_ASSIGN));
- }
- if(NULL != HAssignMtlBmp){
- SendDlgItemMessage(hDlg,IDC_ASSIGN, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HAssignMtlBmp);
- AddToolTip(GetDlgItem(hDlg,IDC_ASSIGN), IDS_ASSIGNMTL);
- }
- //Delete
- if(NULL == HDeleteMtlBmp){
- HDeleteMtlBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_DELETEMTL));
- }
- if(NULL != HDeleteMtlBmp){
- SendDlgItemMessage(hDlg,IDC_DELETEMTL, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HDeleteMtlBmp);
- AddToolTip(GetDlgItem(hDlg,IDC_DELETEMTL), IDS_DELETEMTL);
- }
- //New
- if(NULL == HNewMtlBmp){
- HNewMtlBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_NEWMTL));
- }
- if(NULL != HNewMtlBmp){
- SendDlgItemMessage(hDlg,IDC_NEWMTL, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HNewMtlBmp);
- AddToolTip(GetDlgItem(hDlg,IDC_NEWMTL), IDS_NEWMTL);
- }
- //Next Siblling
- if(NULL == HNextSiblingBmp){
- HNextSiblingBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_NEXTSIBLING));
- }
- if(NULL != HNextSiblingBmp){
- SendDlgItemMessage(hDlg,IDC_NEXTSIBLING, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HNextSiblingBmp);
- AddToolTip(GetDlgItem(hDlg,IDC_NEXTSIBLING), IDS_NEXTSIBLING);
- }
- //Previous Siblling
- if(NULL == HPreviousSiblingBmp){
- HPreviousSiblingBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_PREVIOUSSIBLING));
- }
- if(NULL != HPreviousSiblingBmp){
- SendDlgItemMessage(hDlg,IDC_PREVIOUSSIBLING, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HPreviousSiblingBmp);
- AddToolTip(GetDlgItem(hDlg,IDC_PREVIOUSSIBLING), IDS_PREVIOUSSIBLING);
- }
- /*
- //havoc Siblling
- if(NULL == HHavocBmp){
- HHavocBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_HAVOC));
- }
- if(NULL != HHavocBmp){
- SendDlgItemMessage(hDlg,IDC_HAVOC, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HHavocBmp);
- }
- //Banner Siblling
- if(NULL == HBannerBmp){
- HBannerBmp = LoadBitmap(AppInstance, MAKEINTRESOURCE(IDB_BANNER));
- }
- if(NULL != HHavocBmp){
- SendDlgItemMessage(hDlg,IDC_BANNER, BM_SETIMAGE,(WPARAM) IMAGE_BITMAP, (LPARAM)HBannerBmp);
- }
- */
- }
- //============================================================================================
- //Bring up the navigator
- void GMaxMtlDlg::DoMaterialNavigator(){
- Ip->ExecuteMAXCommand( MAXCOM_TOOLS_MTLMAPBROWSER );
- }
- //============================================================================================
- void GMaxMtlDlg::DoNewMaterial(){
- GameMtl *new_mtl = CreateNewGameMtl();
- Game_multi_mtl = NULL;
- Reinitialize(new_mtl);
- }
- //============================================================================================
- void GMaxMtlDlg::DoGetMaterial(){
- GameMtl* new_mtl = GetMtlFromSelection();
- if(NULL != new_mtl){// && new_mtl != TheMtl){
- Reinitialize(new_mtl);
- }
- }
- //============================================================================================
- void GMaxMtlDlg::ApplyToSelection(GameMtl* mtl){
- theHold.Begin ();
- int selcount = Ip->GetSelNodeCount();
- for(int i(0); i < selcount; i++){
- INode* node = Ip->GetSelNode(i);
- //if(node->NumMtls() < 2){ //?
- if(NULL == Game_multi_mtl){
- node->SetMtl(mtl);
- }else{
- node->SetMtl(Game_multi_mtl);
- }
- }
- Ip->ForceCompleteRedraw(TRUE);
- theHold.Accept(IDS_APPLYGAMEMTL);
- }
- //============================================================================================
- void GMaxMtlDlg::DeleteNodeMaterial(INode* node, MtlBase* mtl){
- Mtl* node_mtl;
- if((node_mtl = node->GetMtl()) == mtl){
- node->SetMtl(NULL);
- }
- //Multi/sub
- if(node_mtl){
- int num_subs(node_mtl->NumSubMtls());
- if( num_subs > 0){
- for(int i(0); i < num_subs; i++){
- if(mtl == node_mtl->GetSubMtl(i)){
- node_mtl->SetSubMtl(i,NULL);
- }
- }
- }
- }
- int node_count = node->NumberOfChildren();
- for(int i(0); i < node_count; i++){
- INode* node_i = node->GetChildNode(i);
- DeleteNodeMaterial(node_i, mtl);
- }
- }
- //============================================================================================
- void GMaxMtlDlg::DeleteMtl(){
- theHold.Begin ();
- MtlBaseLib* scene_mtls = Ip->GetSceneMtls();
- INode* root_node = Ip->GetRootNode();
- if(NULL != scene_mtls && NULL != root_node){
- DeleteNodeMaterial(root_node, TheMtl);
- //Remove from scene
- scene_mtls->Remove(TheMtl);
- //Reset
- DestroyDialog();
- GMaxMaterialDialog = NULL;
- }
- Ip->ForceCompleteRedraw(TRUE);
- theHold.Accept(IDS_APPLYGAMEMTL);
- }
- //============================================================================================
- void GMaxMtlDlg::DeleteAllSceneMtl(){
- MtlBaseLib* scene_mtls = Ip->GetSceneMtls();
- if(scene_mtls){
- if(!DontShowDeleteAll){
- DWORD ret;
- char msg[MAX_PATH];
- char title[MAX_PATH];
- LoadString(AppInstance, IDS_DELETE_ALLMTLS, msg, MAX_PATH);
- LoadString(AppInstance, IDS_W3DMSGCAPTION, title, MAX_PATH);
- if(IDYES == MaxMsgBox(Ip->GetMAXHWnd(), msg, title,MB_YESNO | MB_ICONINFORMATION, MAX_MB_DONTSHOWAGAIN, &ret)){
- scene_mtls->Empty();
- }
- if(ret & MAX_MB_DONTSHOWAGAIN){
- DontShowDeleteAll = true;
- }
- }else{
- scene_mtls->Empty();
- //Force Refresh navigator
- Ip->ExecuteMAXCommand( MAXCOM_TOOLS_MTLMAPBROWSER );
- }
- }
- }
- //============================================================================================
- GameMtl* CreateNewGameMtl(){
- Interface * Ip = GetCOREInterface();
- MtlBaseLib* scene_mtls = Ip->GetSceneMtls();
- GameMtl* mtl = new GameMtl();
- char namebuf[MAX_PATH] = {0};
- LoadString(AppInstance,IDS_DEFAULTGAMEMTL_NAME, namebuf, MAX_PATH);
- TSTR str = namebuf;
- int index = scene_mtls->FindMtl(mtl);
- if(index == -1){
- char tempbuf[32];
- itoa(_Num_Of_NoNames++, tempbuf, 10);
- str += tempbuf;
- mtl->SetName(str);
- }
- scene_mtls->AddMtl(mtl);
- return mtl;
- }
- //============================================================================================
- void GMaxMtlDlg::ShowHideControls(){
- if(NULL == Game_multi_mtl){
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_SUBMTL_SPIN), SW_HIDE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_SUBMTL_STATIC), SW_HIDE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_SUBMTL_NUM), SW_HIDE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_MULTIMTLNAME),SW_HIDE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_MULTI_STATIC),SW_HIDE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_NAME_STATIC),SW_SHOW);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_NEXTSIBLING),SW_HIDE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_PREVIOUSSIBLING),SW_HIDE);
- }else{
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_SUBMTL_SPIN), SW_SHOW);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_SUBMTL_STATIC), SW_SHOW);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_SUBMTL_NUM), SW_SHOW);
- int n_subs = Game_multi_mtl->NumSubMtls();
- SendDlgItemMessage(HwndSurfaceType,IDC_SUBMTL_SPIN, UDM_SETRANGE,(WPARAM)0, MAKELONG(n_subs, 1));
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_SUBMTL_NUM));
- pEdit->SetText(1);
- ReleaseICustEdit(pEdit);
- //SetDlgItemInt(HwndSurfaceType,IDC_SUBMTL_NUM, 1, FALSE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_MULTIMTLNAME),SW_SHOW);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_MULTI_STATIC),SW_SHOW);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_NAME_STATIC),SW_HIDE);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_NEXTSIBLING),SW_SHOW);
- ShowWindow(GetDlgItem(HwndSurfaceType,IDC_PREVIOUSSIBLING),SW_SHOW);
- }
- }
- //============================================================================================
- void GMaxMtlDlg::NextSibling(){
- // (gth) MATERIAL BEING CHANGED, user clicked the "next sibling" button
- if(HwndPassCount != NULL && Game_multi_mtl){ //Only after initializations
- int num_subs = Game_multi_mtl->NumSubMtls();
- Current_Submtl_Index = ++Current_Submtl_Index % num_subs;
- Mtl * new_mtl = Game_multi_mtl->GetSubMtl(Current_Submtl_Index);
- if(NULL != new_mtl){
- if(new_mtl->ClassID() == GameMaterialClassID){// && new_mtl != TheMtl){
- Reinitialize((GameMtl*)new_mtl, false);
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_SUBMTL_NUM));
- pEdit->SetText(Current_Submtl_Index+1);
- ReleaseICustEdit(pEdit);
- }else{
- if(!DontShowMtlType){
- DWORD ret;
- char msg[MAX_PATH];
- char title[MAX_PATH];
- LoadString(AppInstance, IDS_NOTAGAMEMTL, msg, MAX_PATH);
- LoadString(AppInstance, IDS_W3DMSGCAPTION, title, MAX_PATH);
- MaxMsgBox(HwndSurfaceType, msg, title,MB_OK | MB_ICONINFORMATION, MAX_MB_DONTSHOWAGAIN, &ret);
- if(ret & MAX_MB_DONTSHOWAGAIN){
- DontShowMtlType = true;
- }
- }
- }
- }
- }
- }
- //============================================================================================
- void GMaxMtlDlg::PreviousSibling(){
- // (gth) MATERIAL BEING CHANGED, user clicked the "prev sibling" button
- if(HwndPassCount != NULL && Game_multi_mtl){ //Only after initializations
- int num_subs = Game_multi_mtl->NumSubMtls();
- if(Current_Submtl_Index > 0){
- Current_Submtl_Index --;
- }else{
- Current_Submtl_Index = Game_multi_mtl->NumSubMtls()-1;
- }
-
- Mtl* new_mtl = (GameMtl*)(Game_multi_mtl->GetSubMtl(Current_Submtl_Index));
-
- if(NULL != new_mtl){
- if(new_mtl->ClassID() == GameMaterialClassID){// && new_mtl != TheMtl){
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_SUBMTL_NUM));
- pEdit->SetText(Current_Submtl_Index + 1);
- ReleaseICustEdit(pEdit);
- Reinitialize((GameMtl*)new_mtl, false);
- }else{
- if(!DontShowMtlType){
- DWORD ret;
- char msg[MAX_PATH];
- char title[MAX_PATH];
- LoadString(AppInstance, IDS_NOTAGAMEMTL, msg, MAX_PATH);
- LoadString(AppInstance, IDS_W3DMSGCAPTION, title, MAX_PATH);
- MaxMsgBox(HwndSurfaceType, msg, title,MB_OK | MB_ICONINFORMATION, MAX_MB_DONTSHOWAGAIN, &ret);
- if(ret & MAX_MB_DONTSHOWAGAIN){
- DontShowMtlType = true;
- }
- }
- }
- }
- }
- }
- //============================================================================================
- BOOL CALLBACK GameMtlMainProc(HWND hMainDlg, UINT msg, WPARAM wParam, LPARAM lParam){
- switch(msg){
- case WM_INITDIALOG:{
- break;
- }
- }
- return FALSE;
- }
- //============================================================================================
- GameMtl* GetMtlFromSelection(){
- // (gth) MATERIAL BEING CHANGED, user clicked the "get from selection" button
- // bool found_gamemtl(false);
- Mtl* mtl = NULL;
- GameMtl* game_mtl = NULL;
- IMtlParams* mtl_params = NULL;
- Interface* ip = GetCOREInterface();
- int nsel;
- if((nsel = ip->GetSelNodeCount()) < 1){
- return NULL;
- }else{
- INode* node = ip->GetSelNode(0);
- mtl = node->GetMtl();
- if(NULL == mtl){// Node has no mtl
- return NULL;
- }else{
- GMaxMaterialDialog->SetMultimaterial(NULL);
- int n_subs = mtl->NumSubMtls() ;
- if(n_subs > 0){
- //case MultiMtl
- //found_gamemtl = true;
- //Set for multimaterial
- GMaxMaterialDialog->SetMultimaterial(mtl);
- for(int sub_i(0); sub_i < n_subs/* && ! found_gamemtl*/; sub_i ++){
- Mtl* sub_mtl = mtl->GetSubMtl(sub_i);
- if(sub_mtl->ClassID() == GameMaterialClassID){
- game_mtl = (GameMtl*)sub_mtl;
- }else{
- game_mtl = GMaxMaterialDialog->ConvertStdMtl(sub_mtl);
- //replace the submtl by the converted
- mtl->SetSubMtl(sub_i,game_mtl );
- }
- }
- }else{
- // No submtls
- if(mtl->ClassID() == GameMaterialClassID){
- game_mtl = (GameMtl*) mtl;
- }else{
- game_mtl = GMaxMaterialDialog->ConvertStdMtl(mtl);
- }
- }
- }
- }
- return game_mtl;
- }
- //============================================================================================
- //============================================================================================
- //============================================================================================
- void GMaxMtlDlg::Launch()
- {
- }
- void GMaxMtlDlg::SetMultiMaterialTabBySlot( int iSlot, int iSubMtlTexIndex, int iElement ) {
- SetMultiMaterialBySlot(iSlot,iSubMtlTexIndex);
- }
- //============================================================================================
- void GMaxMtlDlg::SetMaterialTabBySlot( int iSlot, int iElement ) {
- SetMaterialBySlot(iSlot);
- }
- //============================================================================================
- void GMaxMtlDlg::SetMultiMaterialBySlot( int iSlot, int iIndex ) {
- // (gth) MATERIAL BEING CHANGED, user double clicked a member of a multi-material in the navagator
- MtlBase * mtl_base = GetMtlEditInterface()->GetCurMtl();
- if ((mtl_base->IsMultiMtl()) && (IsMtl(mtl_base))) {
-
- Mtl * mtl = (Mtl*)mtl_base;
- // Sub material iIndex is "1-based" but the sdk is "0-based"
- if ((iIndex > 0) && (iIndex <= mtl->NumSubMtls())) {
- MtlBase * sub_mtl = ((Mtl*)mtl)->GetSubMtl(iIndex - 1);
- if ((sub_mtl != NULL) && (sub_mtl->ClassID() == GameMaterialClassID)) {
- Game_multi_mtl = (Mtl*)mtl;
- Reinitialize((GameMtl*)(sub_mtl));
- ICustEdit* pEdit = GetICustEdit(GetDlgItem(HwndSurfaceType, IDC_SUBMTL_NUM));
- Current_Submtl_Index = iIndex-1 ;
- pEdit->SetText(iIndex);
- ReleaseICustEdit(pEdit);
- }
- }
- }
- ShowWindow(HwndEdit, SW_SHOW);
- }
- //============================================================================================
- void GMaxMtlDlg::SetMaterialBySlot( int iSlot ){
- // (gth) MATERIAL BEING CHANGED, user double clicked a material in the navagator
- MtlBase * mtl_base = GetMtlEditInterface()->GetCurMtl();
- Class_ID clsid = mtl_base->ClassID();
- if(clsid == GameMaterialClassID){
- Game_multi_mtl = NULL;
- Reinitialize((GameMtl*)mtl_base);
- } else if ((mtl_base->IsMultiMtl()) && (IsMtl(mtl_base))) {
- SetMultiMaterialBySlot( iSlot, 1 );
- }
- ShowWindow(HwndEdit, SW_SHOW);
- }
- //============================================================================================
- void GMaxMtlDlg::DestroyDialog()
- {
- ShowWindow(HwndEdit, SW_HIDE);
- DeleteThis();
- }
- //============================================================================================
- GameMtl* GMaxMtlDlg::ConvertStdMtl(Mtl* stdmtl){
- GameMtl* gmtl = CreateNewGameMtl();
- gmtl->Set_Ambient(0,Ip->GetTime(), stdmtl->GetAmbient());
- gmtl->Set_Diffuse(0,Ip->GetTime(), stdmtl->GetDiffuse());
- gmtl->Set_Specular(0,Ip->GetTime(), stdmtl->GetSpecular());
- gmtl->Set_Shininess(0,Ip->GetTime(), stdmtl->GetShininess());
- float opacity = 1-stdmtl->GetXParency();
- gmtl->Set_Opacity(0,Ip->GetTime(),opacity);
- Texmap* tmap = (Texmap*)stdmtl->GetActiveTexmap();
- if(tmap != NULL){
- gmtl->Set_Texture(0,0,tmap);
- gmtl->Set_Texture_Enable(0,0,true);
- gmtl->Set_Texture_Display(0,0,true);
- gmtl->Set_Texture_Frame_Rate(0,0,0);
- gmtl->Set_Texture_Frame_Count(0,0,0);
- gmtl->Set_Texture_Display(0,0,true);
- gmtl->Set_Map_Channel(0,0,1);
- }
- return gmtl;
- }
- #endif
|