📄 animcontrol.cpp
字号:
grp.tex[0] = "DwarfMaleWarriorLightSkin2";
grp.base = 11;
grp.count = 1;
skins.insert(grp);
}
if (fn == "Creature\\FaerieDragon\\FaerieDragon_Ghost.mdx") {
TextureGroup grp;
grp.tex[0] = "FaerieDragon_Ghost";
grp.tex[1] = "faeriewing_Ghost";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
}
if (fn == "Creature\\FelBat\\FelBat.mdx") {
TextureGroup grp;
grp.tex[0] = "BatSkin01";
grp.tex[1] = "BatSkin02";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
grp.tex[0] = "BatSkinBrown01";
grp.tex[1] = "BatSkinBrown02";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
grp.tex[0] = "BatSkinViolet01";
grp.tex[1] = "BatSkinViolet02";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
grp.tex[0] = "BatSkinWhite01";
grp.tex[1] = "BatSkinWhite02";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
}
if (fn == "Creature\\HighElf\\HighElfMale_Priest.mdx") {
TextureGroup grp;
grp.tex[0] = "HighElfMalePriest";
grp.base = 11;
grp.count = 1;
skins.insert(grp);
}
if (fn == "Creature\\OrcMaleWarriorHeavy\\OrcMaleWarriorHeavy.mdx") {
TextureGroup grp;
grp.tex[1] = "OrcMaleSamuHairSkin";
grp.tex[0] = "OrcNPCSkin";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
}
if (fn == "Creature\\SeaGiant\\SeaGiant.mdx") {
TextureGroup grp;
grp.tex[0] = "SeaGiantSkin01";
grp.tex[1] = "SeaGiantSkin02";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
}
if (fn == "Creature\\SeaLion\\SeaLion.mdx") {
TextureGroup grp;
grp.tex[0] = "SeaLionSkin";
grp.base = 11;
grp.count = 1;
skins.insert(grp);
}
if (fn == "Creature\\StormCrow\\StormCrow.mdx") {
TextureGroup grp;
grp.tex[0] = "StormCrowSkin";
grp.base = 11;
grp.count = 1;
skins.insert(grp);
}
}
return FillSkinSelector(skins);
} else return false;
} catch (CreatureModelDB::NotFound) {
// Try hardcoding some fixes for missing model info from the DBC
if(fn == "Creature\\DwarfMaleWarriorLight\\DwarfMaleWarriorLight_Ghost.mdx") {
TextureGroup grp;
grp.tex[0] = "DwarfMaleWarriorLightSkin_Ghost";
grp.base = 11;
grp.count = 1;
skins.insert(grp);
return FillSkinSelector(skins);
}
if(fn == "Creature\\MountedDemonKnight\\MountedDemonKnight.mdx") {
TextureGroup grp;
grp.tex[0] = "MountedDemonKnightBlack_01";
grp.tex[1] = "MountedDemonKnightBlack_02";
grp.tex[2] = "MountedDemonKnightBlack_03";
grp.base = 11;
grp.count = 3;
skins.insert(grp);
return FillSkinSelector(skins);
}
if(fn == "Creature\\OrcFemaleWarriorLight\\OrcFemale.mdx") {
TextureGroup grp;
grp.tex[0] = "OrcFemaleSkin";
grp.tex[1] = "OrcFemaleSkin";
grp.base = 11;
grp.count = 2;
skins.insert(grp);
return FillSkinSelector(skins);
}
if(fn == "Creature\\ReinDeer\\ReinDeer.mdx") {
TextureGroup grp;
grp.tex[0] = "ReinDeer";
grp.base = 11;
grp.count = 1;
skins.insert(grp);
return FillSkinSelector(skins);
}
if(fn == "Creature\\ReinDeer\\ReinDeerMount.mdx") {
TextureGroup grp;
grp.tex[0] = "ReinDeerMount";
grp.base = 11;
grp.count = 1;
skins.insert(grp);
return FillSkinSelector(skins);
}
return false;
}
}
bool AnimControl::UpdateItemModel(Model *m)
{
std::string fn = m->name;
if (fn[fn.length()-1]=='2') {
fn[fn.length()-1] = 'd';
fn.append("x");
}
size_t p = fn.find_last_of('\\');
fn = fn.substr(p+1);
TextureSet skins;
for (ItemDisplayDB::Iterator it = itemdb->begin(); it != itemdb->end(); ++it) {
if (!strcmp(it->getString(ItemDisplayDB::Model), fn.c_str())) {
TextureGroup grp;
grp.base = 2;
grp.count = 1;
const char *skin = it->getString(ItemDisplayDB::Skin);
grp.tex[0] = skin;
if (grp.tex[0].length() > 0) skins.insert(grp);
}
if (!strcmp(it->getString(ItemDisplayDB::Model2), fn.c_str())) {
TextureGroup grp;
grp.base = 2;
grp.count = 1;
const char *skin = it->getString(ItemDisplayDB::Skin2);
grp.tex[0] = skin;
if (grp.tex[0].length() > 0) skins.insert(grp);
}
}
return FillSkinSelector(skins);
}
bool AnimControl::FillSkinSelector(TextureSet &skins)
{
if (skins.size() > 0) {
int num = 0;
// fill our skin selector
for (TextureSet::iterator it = skins.begin(); it != skins.end(); ++it) {
skinList->Append(wxString(it->tex[0].c_str(), *wxConvCurrent));
TextureGroup *grp = new TextureGroup(*it);
skinList->SetClientData(num++, grp);
}
int mySkin = randomSkins ? randint(0,(int)skins.size()-1) : 0;
SetSkin(mySkin);
skinList->Select(mySkin);
return (skins.size() > 1);
} else return false;
}
void AnimControl::OnButton(wxCommandEvent &event)
{
if (!model)
return;
int id = event.GetId();
if (id == ID_PLAY) {
canvas->model->currentAnim = canvas->model->animManager->GetAnim();
canvas->model->animManager->Play();
} else if (id == ID_PAUSE) {
canvas->model->animManager->Pause();
} else if (id == ID_STOP) {
canvas->model->animManager->Stop();
} else if (id == ID_CLEARANIM) {
canvas->model->animManager->Clear();
} else if (id == ID_ADDANIM) {
canvas->model->animManager->AddAnim(selectedAnim, loopList->GetSelection());
} else if (id == ID_PREVANIM) {
canvas->model->animManager->PrevFrame();
SetAnimFrame(canvas->model->animManager->GetFrame());
} else if (id == ID_NEXTANIM) {
canvas->model->animManager->NextFrame();
SetAnimFrame(canvas->model->animManager->GetFrame());
}
}
void AnimControl::OnCheck(wxCommandEvent &event)
{
if (event.GetId() == ID_OLDSTYLE)
bOldStyle = event.IsChecked();
}
void AnimControl::OnAnim(wxCommandEvent &event)
{
if (model) {
selectedAnim = event.GetSelection();
if (bOldStyle == true) {
model->currentAnim = selectedAnim;
canvas->model->animManager->Stop();
canvas->model->animManager->Set(0, selectedAnim, loopList->GetSelection());
canvas->model->animManager->Play();
frameSlider->SetRange(model->anims[selectedAnim].timeStart, model->anims[selectedAnim].timeEnd);
frameSlider->SetTickFreq(model->anims[selectedAnim].playSpeed, 1);
}
}
//canvas->resetTime();
}
void AnimControl::OnSkin(wxCommandEvent &event)
{
if (model) {
int sel = event.GetSelection();
SetSkin(sel);
}
}
void AnimControl::OnItemSet(wxCommandEvent &event)
{
if (wmo) {
int sel = event.GetSelection();
// -1 for no doodads
wmo->showDoodadSet(sel - 1);
}
}
void AnimControl::OnSliderUpdate(wxCommandEvent &event)
{
if (event.GetId() == ID_SPEED)
SetAnimSpeed(speedSlider->GetValue() / 10.0f);
else if (event.GetId() == ID_FRAME)
SetAnimFrame(frameSlider->GetValue());
}
void AnimControl::OnLoop(wxCommandEvent &event)
{
if (bOldStyle == true) {
canvas->model->animManager->Stop();
canvas->model->animManager->Set(0, selectedAnim, loopList->GetSelection());
canvas->model->animManager->Play();
}
}
void AnimControl::SetSkin(int num)
{
TextureGroup *grp = (TextureGroup*) skinList->GetClientData(num);
for (int i=0; i<grp->count; i++) {
if (model->useReplaceTextures[grp->base+i]) {
texturemanager.del(model->replaceTextures[grp->base+i]);
TextureID def = texturemanager.add(makeSkinTexture(model->name.c_str(),grp->tex[i].c_str()));
model->replaceTextures[grp->base+i] = def;
}
}
}
std::string AnimControl::makeSkinTexture(const char *texfn, const char *skin)
{
std::string res = texfn;
size_t i = res.find_last_of('\\');
res = res.substr(0,i+1);
res.append(skin);
res.append(".blp");
return res;
}
void AnimControl::SetAnimSpeed(float speed)
{
animSpeed = speed;
char buf[64];
sprintf(buf, _("Speed: %.1fx"), animSpeed);
speedLabel->SetLabel(wxString(buf,*wxConvCurrent));
}
void AnimControl::SetAnimFrame(int frame)
{
if (!canvas->model || !canvas->model->animManager)
return;
canvas->model->animManager->SetFrame((unsigned int) frame);
int frameNum = (frame - model->anims[model->currentAnim].timeStart);
char buf[64];
sprintf(buf, _("Frame: %i"), frameNum);
frameLabel->SetLabel(wxString(buf,*wxConvCurrent));
frameSlider->SetValue(frame);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -