/*==LICENSE==* CyanWorlds.com Engine - MMOG client, server and tools Copyright (C) 2011 Cyan Worlds, 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 . You can contact Cyan Worlds, Inc. by email legal@cyan.com or by snail mail at: Cyan Worlds, Inc. 14617 N Newport Hwy Mead, WA 99021 *==LICENSE==*/ #include "HeadSpin.h" #include "max.h" #include "resource.h" #include "plComponent.h" #include "plMiscComponents.h" #include "plComponentReg.h" #include "../MaxMain/plPlasmaRefMsgs.h" #include "../MaxMain/plMaxNode.h" #include "../pnSceneObject/plSceneObject.h" #include "../pnSceneObject/plCoordinateInterface.h" #include "../pnSceneObject/plDrawInterface.h" #include "../plMessage/plSimStateMsg.h" #include "../pnMessage/plEnableMsg.h" #include "../MaxMain/plPluginResManager.h" void DummyCodeIncludeFuncIgnore() {} ///////////////////////////////////////////////////////////////////////////////////////////////// // // Ignore Component // // //Class that accesses the paramblock below. class plIgnoreComponent : public plComponent { public: plIgnoreComponent(); // SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading // of properties on the MaxNode, as it's still indeterminant. hsBool SetupProperties(plMaxNode *pNode, plErrorMsg *pErrMsg); hsBool Convert(plMaxNode *node, plErrorMsg *pErrMsg); virtual void CollectNonDrawables(INodeTab& nonDrawables); }; //Max desc stuff necessary below. CLASS_DESC(plIgnoreComponent, gIgnoreDesc, "Ignore", "Ignore", COMP_TYPE_IGNORE, Class_ID(0x48326288, 0x528a3dea)) enum { kIgnoreMeCheckBx }; ParamBlockDesc2 gIgnoreBk ( plComponent::kBlkComp, _T("Ignore"), 0, &gIgnoreDesc, P_AUTO_CONSTRUCT + P_AUTO_UI, plComponent::kRefComp, IDD_COMP_IGNORE, IDS_COMP_IGNORES, 0, 0, NULL, kIgnoreMeCheckBx, _T("Ignore"), TYPE_BOOL, 0, 0, p_default, TRUE, p_ui, TYPE_SINGLECHEKBOX, IDC_COMP_IGNORE_CKBX, end, end ); plIgnoreComponent::plIgnoreComponent() { fClassDesc = &gIgnoreDesc; fClassDesc->MakeAutoParamBlocks(this); } void plIgnoreComponent::CollectNonDrawables(INodeTab& nonDrawables) { if (fCompPB->GetInt(kIgnoreMeCheckBx)) { AddTargetsToList(nonDrawables); } } // SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading // of properties on the MaxNode, as it's still indeterminant. hsBool plIgnoreComponent::SetupProperties(plMaxNode *pNode, plErrorMsg *pErrMsg) { if (fCompPB->GetInt(kIgnoreMeCheckBx)) pNode->SetCanConvert(false); return true; } hsBool plIgnoreComponent::Convert(plMaxNode *node, plErrorMsg *pErrMsg) { return true; } ///////////////////////////////////////////////////////////////////////////////////////////////// // // IgnoreLite Component // // //Class that accesses the paramblock below. class plIgnoreLiteComponent : public plComponent { public: enum { kSelectedOnly }; enum LightState { kTurnOn, kTurnOff, kToggle }; public: plIgnoreLiteComponent(); void SetState(LightState s); // SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading // of properties on the MaxNode, as it's still indeterminant. hsBool SetupProperties(plMaxNode *pNode, plErrorMsg *pErrMsg) { return true; } hsBool PreConvert(plMaxNode *pNode, plErrorMsg *pErrMsg) { return true; } hsBool Convert(plMaxNode *node, plErrorMsg *pErrMsg) { return true; } }; class plIgnoreLiteProc : public ParamMap2UserDlgProc { public: BOOL DlgProc(TimeValue t, IParamMap2 *map, HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: if( (HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) == IDC_COMP_IGNORELITE_ON) ) { plIgnoreLiteComponent* ilc = (plIgnoreLiteComponent*)map->GetParamBlock()->GetOwner(); ilc->SetState(plIgnoreLiteComponent::kTurnOn); return TRUE; } if( (HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) == IDC_COMP_IGNORELITE_OFF) ) { plIgnoreLiteComponent* ilc = (plIgnoreLiteComponent*)map->GetParamBlock()->GetOwner(); ilc->SetState(plIgnoreLiteComponent::kTurnOff); return TRUE; } if( (HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) == IDC_COMP_IGNORELITE_TOGGLE) ) { plIgnoreLiteComponent* ilc = (plIgnoreLiteComponent*)map->GetParamBlock()->GetOwner(); ilc->SetState(plIgnoreLiteComponent::kToggle); return TRUE; } break; } return false; } void DeleteThis() {} }; static plIgnoreLiteProc gIgnoreLiteProc; //Max desc stuff necessary below. CLASS_DESC(plIgnoreLiteComponent, gIgnoreLiteDesc, "Control Max Light", "ControlLite", COMP_TYPE_IGNORE, IGNORELITE_CID) ParamBlockDesc2 gIgnoreLiteBk ( plComponent::kBlkComp, _T("IgnoreLite"), 0, &gIgnoreLiteDesc, P_AUTO_CONSTRUCT + P_AUTO_UI, plComponent::kRefComp, IDD_COMP_IGNORELITE, IDS_COMP_IGNORELITES, 0, 0, &gIgnoreLiteProc, plIgnoreLiteComponent::kSelectedOnly, _T("SelectedOnly"), TYPE_BOOL, 0, 0, p_default, FALSE, p_ui, TYPE_SINGLECHEKBOX, IDC_COMP_IGNORELITE_SELECTED, end, end ); plIgnoreLiteComponent::plIgnoreLiteComponent() { fClassDesc = &gIgnoreLiteDesc; fClassDesc->MakeAutoParamBlocks(this); } void plIgnoreLiteComponent::SetState(LightState s) { BOOL selectedOnly = fCompPB->GetInt(kSelectedOnly); int numTarg = NumTargets(); int i; for( i = 0; i < numTarg; i++ ) { plMaxNodeBase* targ = GetTarget(i); if( targ ) { if( selectedOnly && !targ->Selected() ) continue; Object *obj = targ->EvalWorldState(TimeValue(0)).obj; if (obj && (obj->SuperClassID() == SClass_ID(LIGHT_CLASS_ID))) { LightObject* liObj = (LightObject*)obj; switch( s ) { case kTurnOn: liObj->SetUseLight(true); break; case kTurnOff: liObj->SetUseLight(false); break; case kToggle: liObj->SetUseLight(!liObj->GetUseLight()); break; } } } } } ///////////////////////////////////////////////////////////////////////////////////////////////// // // Barney Component // // //Class that accesses the paramblock below. class plBarneyComponent : public plComponent { public: plBarneyComponent(); // SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading // of properties on the MaxNode, as it's still indeterminant. hsBool SetupProperties(plMaxNode *pNode, plErrorMsg *pErrMsg); hsBool Convert(plMaxNode *node, plErrorMsg *pErrMsg); }; //Max desc stuff necessary below. CLASS_DESC(plBarneyComponent, gBarneyDesc, "Barney", "Barney", COMP_TYPE_IGNORE, Class_ID(0x376955dc, 0x2fec50ae)) ParamBlockDesc2 gBarneyBk ( plComponent::kBlkComp, _T("Barney"), 0, &gBarneyDesc, P_AUTO_CONSTRUCT + P_AUTO_UI, plComponent::kRefComp, IDD_COMP_BARNEY, IDS_COMP_BARNEYS, 0, 0, NULL, end ); plBarneyComponent::plBarneyComponent() { fClassDesc = &gBarneyDesc; fClassDesc->MakeAutoParamBlocks(this); } // SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading // of properties on the MaxNode, as it's still indeterminant. hsBool plBarneyComponent::SetupProperties(plMaxNode *pNode, plErrorMsg *pErrMsg) { pNode->SetCanConvert(false); pNode->SetIsBarney(true); return true; } hsBool plBarneyComponent::Convert(plMaxNode *node, plErrorMsg *pErrMsg) { return true; } ///////////////////////////////////////////////////////////////////////////////////////////////// // // NoShow Component // // //Class that accesses the paramblock below. class plNoShowComponent : public plComponent { public: enum { kShowable, kAffectDraw, kAffectPhys }; public: plNoShowComponent(); virtual void CollectNonDrawables(INodeTab& nonDrawables); // SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading // of properties on the MaxNode, as it's still indeterminant. hsBool SetupProperties(plMaxNode *pNode, plErrorMsg *pErrMsg); hsBool Convert(plMaxNode *node, plErrorMsg *pErrMsg); }; const Class_ID COMP_NOSHOW_CID(0x41cb2b85, 0x615932c6); //Max desc stuff necessary below. CLASS_DESC(plNoShowComponent, gNoShowDesc, "NoShow", "NoShow", COMP_TYPE_IGNORE, COMP_NOSHOW_CID) ParamBlockDesc2 gNoShowBk ( plComponent::kBlkComp, _T("NoShow"), 0, &gNoShowDesc, P_AUTO_CONSTRUCT + P_AUTO_UI, plComponent::kRefComp, IDD_COMP_NOSHOW, IDS_COMP_NOSHOW, 0, 0, NULL, plNoShowComponent::kShowable, _T("Showable"), TYPE_BOOL, 0, 0, p_default, FALSE, p_ui, TYPE_SINGLECHEKBOX, IDC_COMP_NOSHOW_SHOWABLE, end, plNoShowComponent::kAffectDraw, _T("AffectDraw"), TYPE_BOOL, 0, 0, p_default, TRUE, p_ui, TYPE_SINGLECHEKBOX, IDC_COMP_NOSHOW_AFFECTDRAW, end, plNoShowComponent::kAffectPhys, _T("AffectPhys"), TYPE_BOOL, 0, 0, p_default, FALSE, p_ui, TYPE_SINGLECHEKBOX, IDC_COMP_NOSHOW_AFFECTPHYS, end, end ); plNoShowComponent::plNoShowComponent() { fClassDesc = &gNoShowDesc; fClassDesc->MakeAutoParamBlocks(this); } // SetupProperties - Internal setup and write-only set properties on the MaxNode. No reading // of properties on the MaxNode, as it's still indeterminant. hsBool plNoShowComponent::SetupProperties(plMaxNode *pNode, plErrorMsg *pErrMsg) { if( !fCompPB->GetInt(kShowable) ) { if( fCompPB->GetInt(kAffectDraw) ) pNode->SetDrawable(false); if( fCompPB->GetInt(kAffectPhys) ) pNode->SetPhysical(false); } return true; } hsBool plNoShowComponent::Convert(plMaxNode *node, plErrorMsg *pErrMsg) { plSceneObject* obj = node->GetSceneObject(); if( !obj ) return true; if( fCompPB->GetInt(kShowable) ) { if( fCompPB->GetInt(kAffectDraw) ) { plEnableMsg* eMsg = TRACKED_NEW plEnableMsg(nil, plEnableMsg::kDisable, plEnableMsg::kDrawable); eMsg->AddReceiver(obj->GetKey()); eMsg->Send(); } if( fCompPB->GetInt(kAffectPhys) ) { hsAssert(0, "Who uses this?"); // plEventGroupEnableMsg* pMsg = TRACKED_NEW plEventGroupEnableMsg; // pMsg->SetFlags(plEventGroupEnableMsg::kCollideOff | plEventGroupEnableMsg::kReportOff); // pMsg->AddReceiver(obj->GetKey()); // pMsg->Send(); } #if 0 plDrawInterface* di = node->GetDrawInterface(); if( di && { di->SetProperty(plDrawInterface::kDisable, true); } #endif } return true; } void plNoShowComponent::CollectNonDrawables(INodeTab& nonDrawables) { if( fCompPB->GetInt(kAffectDraw) ) AddTargetsToList(nonDrawables); }