⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 animcontrol.cpp

📁 wowmodelview魔兽世界的模型查看工具。下了看看吧
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					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 + -