You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

251 lines
5.5 KiB

/*==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 <http://www.gnu.org/licenses/>.
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 "plNotetrackAnim.h"
#include "plComponentBase.h"
#include "MaxMain/plMaxNodeBase.h"
plNotetrackAnim::plNotetrackAnim() : fSegMap(nil)
{
}
plNotetrackAnim::plNotetrackAnim(Animatable *anim, plErrorMsg *pErrMsg)
{
if (anim->SuperClassID() == HELPER_CLASS_ID &&
((Object*)anim)->CanConvertToType(COMPONENT_CLASSID))
{
plComponentBase *comp = (plComponentBase*)anim;
std::vector<Animatable*> targs;
for (int i = 0; i < comp->NumTargets(); i++)
{
plMaxNodeBase *node = comp->GetTarget(i);
if (node)
targs.push_back(node);
}
fSegMap = GetSharedAnimSegmentMap(targs, pErrMsg);
}
else
{
fSegMap = GetAnimSegmentMap(anim, pErrMsg);
}
if (fSegMap)
fAnimIt = fSegMap->begin();
}
plNotetrackAnim::~plNotetrackAnim()
{
DeleteSegmentMap(fSegMap);
}
const char *plNotetrackAnim::GetNextAnimName()
{
if (!fSegMap)
return nil;
while (fAnimIt != fSegMap->end())
{
SegmentSpec *spec = fAnimIt->second;
fAnimIt++;
if (spec->fType == SegmentSpec::kAnim)
return spec->fName;
}
fAnimIt = fSegMap->begin();
return nil;
}
plAnimInfo plNotetrackAnim::GetAnimInfo(const char *animName)
{
if (!fSegMap)
return plAnimInfo();
if (!animName || *animName == '\0' || fSegMap->find(animName) == fSegMap->end())
return plAnimInfo(fSegMap, nil);
else
return plAnimInfo(fSegMap, animName);
return plAnimInfo();
}
////////////////////////////////////////////////////////////////////////////////
plAnimInfo::plAnimInfo(SegmentMap *segMap, const char *animName)
{
fSegMap = segMap;
fAnimSpec = animName ? (*fSegMap)[animName] : nil;
if (fSegMap)
{
fLoopIt = fSegMap->begin();
fMarkerIt = fSegMap->begin();
fStopPointIt = fSegMap->begin();
}
}
const char *plAnimInfo::GetAnimName()
{
return fAnimSpec ? fAnimSpec->fName : nil;
}
float plAnimInfo::GetAnimStart()
{
return fAnimSpec ? fAnimSpec->fStart : -1;
}
float plAnimInfo::GetAnimEnd()
{
return fAnimSpec ? fAnimSpec->fEnd : -1;
}
float plAnimInfo::GetAnimInitial()
{
return fAnimSpec ? fAnimSpec->fInitial : -1;
}
const char *plAnimInfo::GetNextLoopName()
{
if (!fSegMap)
return nil;
while (fLoopIt != fSegMap->end())
{
SegmentSpec *spec = fLoopIt->second;
fLoopIt++;
if (spec->fType == SegmentSpec::kLoop &&
(!fAnimSpec || fAnimSpec->Contains(spec)))
return spec->fName;
}
fLoopIt = fSegMap->begin();
return nil;
}
float plAnimInfo::GetLoopStart(const char *loopName)
{
if (!fSegMap || loopName == nil)
return -1;
if (fSegMap->find(loopName) != fSegMap->end())
{
SegmentSpec *spec = (*fSegMap)[loopName];
if (spec->fStart == -1)
return -1;//GetAnimStart();
else
return spec->fStart;
}
return -1;
}
float plAnimInfo::GetLoopEnd(const char *loopName)
{
if (!fSegMap || loopName == nil)
return -1;
if (fSegMap->find(loopName) != fSegMap->end())
{
SegmentSpec *spec = (*fSegMap)[loopName];
if (spec->fEnd == -1)
return -1;//GetAnimEnd();
else
return spec->fEnd;
}
return -1;
}
const char *plAnimInfo::GetNextMarkerName()
{
if (!fSegMap)
return nil;
while (fMarkerIt != fSegMap->end())
{
SegmentSpec *spec = fMarkerIt->second;
fMarkerIt++;
if (spec->fType == SegmentSpec::kMarker &&
(!fAnimSpec || fAnimSpec->Contains(spec)))
return spec->fName;
}
fMarkerIt = fSegMap->begin();
return nil;
}
float plAnimInfo::GetMarkerTime(const char *markerName)
{
if (!fSegMap)
return -1;
if (fSegMap->find(markerName) != fSegMap->end())
{
SegmentSpec *spec = (*fSegMap)[markerName];
return spec->fStart;
}
return -1;
}
float plAnimInfo::GetNextStopPoint()
{
if (!fSegMap)
return -1;
while (fStopPointIt != fSegMap->end())
{
SegmentSpec *spec = fStopPointIt->second;
fStopPointIt++;
if (spec->fType == SegmentSpec::kStopPoint &&
(!fAnimSpec || fAnimSpec->Contains(spec)))
return spec->fStart;
}
fStopPointIt = fSegMap->begin();
return -1;
}
bool plAnimInfo::IsSuppressed(const char *animName)
{
if (!fSegMap || animName == nil)
return false;
if (fSegMap->find(animName) != fSegMap->end())
{
SegmentSpec *spec = (*fSegMap)[animName];
if (spec->fType == SegmentSpec::kSuppress)
return true;
}
return false;
}