/*==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 "plOneShotComponent.h" #include "resource.h" #include "plComponent.h" #include "plComponentReg.h" #include "../MaxMain/plMaxNode.h" #if 0 #include "../MaxConvert/hsConverterUtils.h" #include "../pnSceneObject/plSceneObject.h" #include "plgDispatch.h" #include "../plScene/plSceneNode.h" #include "../MaxConvert/hsConverterUtils.h" #include "../MaxConvert/hsControlConverter.h" #include "../pnKeyedObject/plKey.h" #include "../PubUtilLib/plResMgr/plLoc.h" #include "../MaxMain/plPlasmaRefMsgs.h" #include "../pnMessage/plNodeRefMsg.h" #include "../pnMessage/plObjRefMsg.h" #include "../pnMessage/plIntRefMsg.h" #include "plMaxAnimUtils.h" #include "tempAnim.h" #include "../plInterp/plController.h" #include "../plHavok1/plHKPhysical.h" #include "../plAvatar/plAvatarMod.h" #include "../plModifier/plAliasModifier.h" #include "../plAudible/plWinAudible.h" #include "../pnSceneObject/plAudioInterface.h" #include "../pnSceneObject/plCoordinateInterface.h" #endif #include "hsResMgr.h" #include "../plAvatar/plOneShotMod.h" #include void DummyCodeIncludeFuncSingleSht() {} // // Enum field for OneShot // Never delete a field in this enum. Order is necessary for backward compatability. // Append only. // enum { kAnimName, // Insert in v1 kStartPtBool_DEAD, // Insert in v1 // obsolete kStartPt_DEAD, // Insert in v1 // obsolete kTriggerVolBool, // Insert in v1 kTriggerVolume, // Insert in v1 kPlayBackwardsBool, // Insert in v1 kControlSpeedBool, // Insert in v1 kSeekTimeFloat, // Insert in v2 kSmartSeekBool, // Insert in v3 kNoSeekBool }; // // OneShot class // Functions of PreConvert and Convert are currently empty and ready to be filled // when functionality is in. // class plOneShotComponent : public plComponent { public: plOneShotComponent(); // 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 *node, plErrorMsg *pErrMsg); hsBool PreConvert(plMaxNode *node, plErrorMsg *pErrMsg); hsBool Convert(plMaxNode* node,plErrorMsg *pErrMsg); plKey GetOneShotKey(plMaxNode *node); protected: std::map fMods; bool IsValid(); }; plKey OneShotComp::GetOneShotKey(plComponentBase *oneShotComp, plMaxNodeBase *target) { if (oneShotComp->ClassID() == ONESHOTCLASS_ID) { plOneShotComponent *comp = (plOneShotComponent*)oneShotComp; return comp->GetOneShotKey((plMaxNode*)target); } return nil; } // // Macro for creation of Components. // CLASS_DESC(plOneShotComponent, gOneShotDesc, "(ex)One Shot", "OneShot", COMP_TYPE_AVATAR, ONESHOTCLASS_ID) // // OneShot Paramblock2 // If functionality is no longer necessary, remove it here. Don't touch the // order of the Enum field mentioned above. // ParamBlockDesc2 gOneShotBlock ( plComponent::kBlkComp, _T("(ex)One Shot Comp"), 0, &gOneShotDesc, P_AUTO_CONSTRUCT + P_AUTO_UI, plComponent::kRefComp, //Rollout data IDD_COMP_ONESHOT, IDS_COMP_ONESHOTS, 0, 0, NULL, //params kAnimName, _T("AnimationName"), TYPE_STRING, 0, 0, p_ui, TYPE_EDITBOX, IDC_COMP_ONESHOT_ANIM_TEXTBOX, end, kPlayBackwardsBool, _T("PlayBackwardsBool"), TYPE_BOOL, 0, 0, p_default, FALSE, p_ui, TYPE_SINGLECHEKBOX, IDC_COMP_ONESHOT_PLAY_BACK_BOOL, end, kControlSpeedBool, _T("ControlSpeedBool"), TYPE_BOOL, 0, 0, p_default, FALSE, p_ui, TYPE_SINGLECHEKBOX, IDC_COMP_ONESHOT_CONT_SPEED_BOOL, end, kSeekTimeFloat, _T("SeekTimeFloat"), TYPE_FLOAT, 0, 0, p_default, 1.0f, p_ui, TYPE_SPINNER, EDITTYPE_POS_FLOAT, IDC_COMP_ONESHOT_SEEK_FIELD_EDIT, IDC_COMP_ONESHOT_SEEK_FIELD_SPIN, .1f, end, kSmartSeekBool, _T("SmartSeekBool"), TYPE_BOOL, 0, 0, p_default, FALSE, p_ui, TYPE_SINGLECHEKBOX, IDC_SMART_SEEK, end, kNoSeekBool, _T("NoSeekBool"), TYPE_BOOL, 0, 0, p_default, FALSE, p_ui, TYPE_SINGLECHEKBOX, IDC_NO_SEEK, end, end ); plOneShotComponent::plOneShotComponent() { fClassDesc = &gOneShotDesc; fClassDesc->MakeAutoParamBlocks(this); } plKey plOneShotComponent::GetOneShotKey(plMaxNode *node) { if (fMods.find(node) != fMods.end()) return fMods[node]->GetKey(); return nil; } bool plOneShotComponent::IsValid() { const char *animName = fCompPB->GetStr(kAnimName); return (animName && *animName != '\0'); } hsBool plOneShotComponent::SetupProperties(plMaxNode *node, plErrorMsg *pErrMsg) { fMods.clear(); if (IsValid()) { node->SetForceLocal(true); return true; } else { if (pErrMsg->Set(true, "One-Shot", "One-shot component on '%s' has no animation name, and will not be included. Abort this export?", node->GetName()).Ask()) pErrMsg->Set(true, "", ""); else pErrMsg->Set(false); // Don't want to abort return false; } } // // PreConvert done below // hsBool plOneShotComponent::PreConvert(plMaxNode *node, plErrorMsg *pErrMsg) { if (IsValid()) { plOneShotMod *mod = TRACKED_NEW plOneShotMod; hsgResMgr::ResMgr()->NewKey(IGetUniqueName(node), mod, node->GetLocation()); fMods[node] = mod; } return true; } // // Convert Done below // hsBool plOneShotComponent::Convert(plMaxNode* node, plErrorMsg *pErrMsg) { if (fMods.find(node) != fMods.end()) { const char *animName = fCompPB->GetStr(kAnimName); hsBool drivable = fCompPB->GetInt(kControlSpeedBool); hsBool reversable = fCompPB->GetInt(kPlayBackwardsBool); float seekDuration = fCompPB->GetFloat(kSeekTimeFloat); hsBool smartSeek = fCompPB->GetInt(kSmartSeekBool); hsBool noSeek = fCompPB->GetInt(kNoSeekBool); plOneShotMod *mod = fMods[node]; mod->Init(animName, drivable, reversable, seekDuration, smartSeek, noSeek); node->AddModifier(mod, IGetUniqueName(node)); return true; } return false; }