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

📄 charcontrol.cpp

📁 wowmodelview魔兽世界的模型查看工具。下了看看吧
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	} catch (NPCDB::NotFound) {}

	// Equip our npc
	try {
		cd.equipment[CS_HEAD] = items.getItemNum(npcrec.getUInt(NPCDB::HelmID));
		cd.equipment[CS_SHOULDER] = items.getItemNum(npcrec.getUInt(NPCDB::ShoulderID));
		cd.equipment[CS_SHIRT] = items.getItemNum(npcrec.getUInt(NPCDB::ShirtID));
		cd.equipment[CS_CHEST] = items.getItemNum(npcrec.getUInt(NPCDB::ChestID));
		cd.equipment[CS_BELT] = items.getItemNum(npcrec.getUInt(NPCDB::BeltID));
		cd.equipment[CS_PANTS] = items.getItemNum(npcrec.getUInt(NPCDB::PantsID));
		cd.equipment[CS_BOOTS] = items.getItemNum(npcrec.getUInt(NPCDB::BootsID));
		cd.equipment[CS_BRACERS] = items.getItemNum(npcrec.getUInt(NPCDB::BracersID));
		cd.equipment[CS_GLOVES] = items.getItemNum(npcrec.getUInt(NPCDB::GlovesID));
		cd.equipment[CS_TABARD] = items.getItemNum(npcrec.getUInt(NPCDB::TabardID));
		if (cd.equipment[CS_TABARD] != 0) 
			cd.geosets[12] = 2;
	} catch (...) {}

	if (cd.maxFaceType==0) cd.maxFaceType = 1;
	if (cd.maxSkinColor==0) cd.maxSkinColor = 1;
	if (cd.maxHairColor==0) cd.maxHairColor = 1;
	if (cd.maxHairStyle==0) cd.maxHairStyle = 1;
	if (cd.maxFacialHair==0) cd.maxFacialHair = 1;
	spins[0]->SetRange(0, cd.maxSkinColor-1);
	spins[1]->SetRange(0, cd.maxFaceType-1);
	spins[2]->SetRange(0, cd.maxHairColor-1);
	spins[3]->SetRange(0, cd.maxHairStyle-1);
	spins[4]->SetRange(0, cd.maxFacialHair-1);
	spins[5]->SetRange(0, cd.maxHairColor-1);


	spins[SPIN_SKIN_COLOR]->SetValue(cd.skinColor);
	spins[SPIN_FACE_TYPE]->SetValue(cd.faceType);
	spins[SPIN_HAIR_COLOR]->SetValue(cd.hairColor);
	spins[SPIN_HAIR_STYLE]->SetValue(cd.hairStyle);
	spins[SPIN_FACIAL_HAIR]->SetValue(cd.facialHair);
	spins[SPIN_FACIAL_COLOR]->SetValue(cd.facialColor);

	tabardSpins[SPIN_TABARD_ICON]->SetValue(td.Icon);
	tabardSpins[SPIN_TABARD_ICONCOLOR]->SetValue(td.IconColor);
	tabardSpins[SPIN_TABARD_BORDER]->SetValue(td.Border);
	tabardSpins[SPIN_TABARD_BORDERCOLOR]->SetValue(td.BorderColor);
	tabardSpins[SPIN_TABARD_BACKGROUND]->SetValue(td.Background);

	tabardSpins[SPIN_TABARD_ICON]->SetRange(0, td.maxIcon);
	tabardSpins[SPIN_TABARD_ICONCOLOR]->SetRange(0, td.maxIconColor);
	tabardSpins[SPIN_TABARD_BORDER]->SetRange(0, td.maxBorder);
	tabardSpins[SPIN_TABARD_BORDERCOLOR]->SetRange(0, td.maxBorderColor);
	tabardSpins[SPIN_TABARD_BACKGROUND]->SetRange(0, td.maxBackground);

	for (int i=0; i<NUM_SPIN_BTNS; i++) spins[i]->Refresh(false);
	for (int i=0; i<NUM_TABARD_BTNS; i++) tabardSpins[i]->Refresh(false);

	for (int i=0; i<NUM_CHAR_SLOTS; i++) {
		if (labels[i]) labels[i]->SetLabel(_T("---- None ----"));
	}

	if (gobtex)
		texturemanager.del(gobtex);
	gobtex = 0;
}

void CharControl::OnSpin(wxSpinEvent &event)
{
	if (canvas->modelType == MT_NPC)
		return;

	if (event.GetId()==ID_SKIN_COLOR) cd.skinColor = event.GetPosition();
	if (event.GetId()==ID_FACE_TYPE) cd.faceType = event.GetPosition();
	if (event.GetId()==ID_HAIR_COLOR) {
		cd.hairColor = event.GetPosition();
		cd.facialColor = event.GetPosition();
	}
	if (event.GetId()==ID_HAIR_STYLE) cd.hairStyle = event.GetPosition();
	if (event.GetId()==ID_FACIAL_HAIR) cd.facialHair = event.GetPosition();
	if (event.GetId()==ID_FACIAL_COLOR) cd.facialColor = event.GetPosition();

	RefreshModel();
}

void CharControl::OnCheck(wxCommandEvent &event)
{
	if (event.GetId()==ID_SHOW_UNDERWEAR) cd.showUnderwear = event.IsChecked();
	if (event.GetId()==ID_SHOW_HAIR) cd.showHair = event.IsChecked();
	if (event.GetId()==ID_SHOW_FACIALHAIR) cd.showFacialHair = event.IsChecked();
	if (event.GetId()==ID_SHOW_EARS) cd.showEars = event.IsChecked();
	if (event.GetId()==ID_SHEATHE) bSheathe = event.IsChecked();
	if (event.GetId()==ID_USENPCSKINS) cd.useNPC = event.IsChecked();

	RefreshEquipment();
	RefreshModel();
}

bool slotHasModel(int i)
{
	return (i==CS_HEAD || i==CS_SHOULDER || i==CS_HAND_LEFT || i==CS_HAND_RIGHT);
}

void CharControl::RefreshEquipment()
{
	for (int i=0; i<NUM_CHAR_SLOTS; i++) {
		if (slotHasModel(i)) 
			RefreshItem(i);
		if (labels[i])
			labels[i]->SetLabel(wxString(items.get(cd.equipment[i]).name.c_str(), *wxConvCurrent));
	}
}

void CharControl::OnButton(wxCommandEvent &event)
{
	bool needRefresh = true;

	if (event.GetId()==ID_SAVE_EQUIPMENT) {
		needRefresh = false;
		wxFileDialog dialog(this, _("Save equipment"), wxEmptyString, wxEmptyString, _T("Equipment files (*.eq)|*.eq"), wxSAVE|wxOVERWRITE_PROMPT);
		dialog.SetDirectory(".");
		if (dialog.ShowModal()==wxID_OK) {
			wxString s(dialog.GetPath());
			cd.save(s, &td);
		}
	} 
	else if (event.GetId()==ID_LOAD_EQUIPMENT) {
		wxFileDialog dialog(this, _("Load equipment"), wxEmptyString, wxEmptyString, _T("Equipment files (*.eq)|*.eq"), wxOPEN|wxFILE_MUST_EXIST);
		dialog.SetDirectory(".");
		if (dialog.ShowModal()==wxID_OK) {
			for (int i=0; i<NUM_CHAR_SLOTS; i++) cd.equipment[i] = 0;
			wxString s(dialog.GetPath());
			if (cd.load(s, &td)) {
				spins[SPIN_SKIN_COLOR]->SetValue(cd.skinColor);
				spins[SPIN_FACE_TYPE]->SetValue(cd.faceType);
				spins[SPIN_HAIR_COLOR]->SetValue(cd.hairColor);
				spins[SPIN_HAIR_STYLE]->SetValue(cd.hairStyle);
				spins[SPIN_FACIAL_HAIR]->SetValue(cd.facialHair);
				spins[SPIN_FACIAL_COLOR]->SetValue(cd.hairColor);
				for (int i=0; i<NUM_SPIN_BTNS; i++) spins[i]->Refresh(false);
			}
			RefreshEquipment();
		}
	}
	else if (event.GetId()==ID_CLEAR_EQUIPMENT) {
		for (int i=0; i<NUM_CHAR_SLOTS; i++) cd.equipment[i] = 0;
		RefreshEquipment();
	}
	else if (event.GetId()==ID_LOAD_SET) {
		selectSet();
	}
	else if (event.GetId()==ID_LOAD_START) {
		selectStart();
	}
	else if (event.GetId()==ID_MOUNT) {
		selectMount();
	}
	else {
		needRefresh = false;
		for (int i=0; i<NUM_CHAR_SLOTS; i++) {
			if (buttons[i] && (wxButton*)event.GetEventObject()==buttons[i]) {
				selectItem(i, cd.equipment[i], buttons[i]->GetLabel().GetData());
				break;
			}
		}
	}

	if (canvas->modelType == MT_NPC)
		RefreshNPCModel();
	else
		RefreshModel();
}


const char* regionPaths[NUM_REGIONS] =
{
	"",
	"Item\\TextureComponents\\ArmUpperTexture\\",
	"Item\\TextureComponents\\ArmLowerTexture\\",
	"Item\\TextureComponents\\HandTexture\\",
	"",
	"",
	"Item\\TextureComponents\\TorsoUpperTexture\\",
	"Item\\TextureComponents\\TorsoLowerTexture\\",
	"Item\\TextureComponents\\LegUpperTexture\\",
	"Item\\TextureComponents\\LegLowerTexture\\",
	"Item\\TextureComponents\\FootTexture\\"
};

int slotOrder[] = {	
	CS_SHIRT,
	CS_HEAD,
	CS_NECK,
	CS_SHOULDER,
	CS_PANTS,
	CS_BOOTS,
	CS_CHEST,
	CS_TABARD,
	CS_BELT,
	CS_BRACERS,
	CS_GLOVES,
	CS_HAND_RIGHT,
	CS_HAND_LEFT,
	CS_CAPE
};

int slotOrderWithRobe[] = {
	CS_SHIRT,
	CS_HEAD,
	CS_NECK,
	CS_SHOULDER,
	CS_BOOTS,
	CS_PANTS,
	CS_CHEST,
	CS_TABARD,
	CS_BELT,
	CS_BRACERS,
	CS_GLOVES,
	CS_HAND_RIGHT,
	CS_HAND_LEFT,
	CS_CAPE
};

void CharControl::RefreshModel()
{
	//cd.maxSkinColor = chardb.getColorsFor(race, gender, CharSectionsDB::SkinType, 0, cd.useNPC);
	//cd.maxFaceType  = chardb.getSectionsFor(race, gender, CharSectionsDB::FaceType, 0, cd.useNPC);
	//spins[0]->SetRange(0, cd.maxSkinColor-1);
	//spins[1]->SetRange(0, cd.maxFaceType-1);

	if (hairtex != 0) {
		texturemanager.del(hairtex);
		hairtex = 0;
	}
	if (furtex != 0) {
		texturemanager.del(furtex);
		furtex = 0;
	}
	if (capetex != 0) {
		texturemanager.del(capetex);
		capetex = 0;
	}

	// facial hair decorations
	for (int i=0; i<16; i++) cd.geosets[i] = 1;
		cd.geosets[1] = cd.geosets[2] = cd.geosets[3] = 0;

	// ears
	if (cd.showEars) cd.geosets[7] = 2;

	CharTexture tex;

	// base layer
	CharSectionsDB::Record rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::SkinType, 0, cd.skinColor, cd.useNPC);
	tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_BASE, 0);

	// Tauren fur
	const char *furtexname = rec.getString(CharSectionsDB::Tex2);
	if (strlen(furtexname)) furtex = texturemanager.add(furtexname);

	if (cd.showUnderwear) {
		try {
			rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::UnderwearType, 0, cd.skinColor, cd.useNPC);
			tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_PELVIS_UPPER, 1); // panties
			tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_TORSO_UPPER, 1); // bra
		} catch (CharSectionsDB::NotFound) {}
	}

	// face
	try {
		rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::FaceType, cd.faceType, cd.skinColor, cd.useNPC);
		tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_FACE_LOWER, 1);
		tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_FACE_UPPER, 1);
	} catch (CharSectionsDB::NotFound) {}

	// facial hair
	try {
		rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::FacialHairType, cd.facialHair, cd.facialColor, 0);
		tex.addLayer(rec.getString(CharSectionsDB::Tex1), CR_FACE_LOWER, 2);
		tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_FACE_UPPER, 2);
	} catch (CharSectionsDB::NotFound) {}

	// facial hair geosets
	try {
		CharFacialHairDB::Record frec = facialhairdb.getByParams(cd.race, cd.gender, cd.facialHair);
		cd.geosets[1] = frec.getUInt(CharFacialHairDB::Geoset100);
		cd.geosets[2] = frec.getUInt(CharFacialHairDB::Geoset200);
		cd.geosets[3] = frec.getUInt(CharFacialHairDB::Geoset300);
	} catch (CharFacialHairDB::NotFound) {}
	
	// hair + hair on face
	try {
		rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::HairType, cd.hairStyle, cd.hairColor, 0);
		const char* hairtexfn = rec.getString(CharSectionsDB::Tex1);
		if (strlen(hairtexfn)) 
			hairtex = texturemanager.add(hairtexfn);
		else {
			// oops, looks like we're missing a hair texture. Let's try with hair style #1.
			// (only a problem for orcs with no hair but some beard
			try {
				rec = chardb.getByParams(cd.race, cd.gender, CharSectionsDB::HairType, 1, cd.hairColor, cd.useNPC);
				hairtexfn = rec.getString(CharSectionsDB::Tex1);
				if (strlen(hairtexfn)) 
					hairtex = texturemanager.add(hairtexfn);
				else 
					hairtex = 0;
			} catch (CharSectionsDB::NotFound) {
				// oh well, give up.
				hairtex = 0; // or chartex?
			}
		}
		tex.addLayer(rec.getString(CharSectionsDB::Tex2), CR_FACE_LOWER, 3);
		tex.addLayer(rec.getString(CharSectionsDB::Tex3), CR_FACE_UPPER, 3);
	} catch (CharSectionsDB::NotFound) {
		hairtex = 0;
	}

	bool bald = false;
	bool showHair = cd.showHair;
	bool showFacialHair = cd.showFacialHair;
	/*
	// Temporary work-around - need to do more research.
	// Check to see if we are wearing a helmet - if so, we need to hide our hair
	if (cd.equipment[CS_HEAD] != 0) {
		try {
			const ItemRecord &item = items.get(cd.equipment[CS_HEAD]);
			int type = item.type;
			if (type==IT_HEAD) {
				ItemDisplayDB::Record r = itemdb.getById(item.model);
				
				int geoID;
				if(cd.gender == 0)
					geoID = r.getUInt(ItemDisplayDB::GeosetF);
				else
					geoID = r.getUInt(ItemDisplayDB::GeosetG);

				HelmGeosetDB::Record rec = helmetdb.getById(geoID);
				char c1 = rec.getByte(HelmGeosetDB::Field1);
				char c2 = rec.getByte(HelmGeosetDB::Field2);
				char c3 = rec.getByte(HelmGeosetDB::Field3);
				unsigned char c4 = rec.getByte(HelmGeosetDB::Field4);
				unsigned char c5 = rec.getByte(HelmGeosetDB::Field5);
				
				//TODO: Work out what exactly these geosets mean and act accordingly.
				// These values point to records in HelmetGeosetVisData.dbc
				// Still not sure if the 2 columns are for male / female or
				// for facial hair / normal hair
				std::cout << "----------\n" << r.getUInt(ItemDisplayDB::GeosetF) << "\t" << r.getUInt(ItemDisplayDB::GeosetG) << "\n";
				
				std::cout << (unsigned int)rec.getByte(HelmGeosetDB::Field1) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field2) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field3) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field4) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field5) << "\n";
				rec = helmetdb.getById(r.getUInt(ItemDisplayDB::GeosetG));
				std::cout << (unsigned int)rec.getByte(HelmGeosetDB::Field1) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field2) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field3) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field4) << "\t" << (unsigned int)rec.getByte(HelmGeosetDB::Field5) << "\n";
				
				
				//std::cout << (int)c1 << " " << (int)c2 << " " << (int)c3 << " " << (unsigned int)c4 << " " << (unsigned int)c5 << "\n";

				if(c1 == 1)
					showHair = false;
					
				if(c5 == 1)
					showFacialHair = false;

				//if(r.getUInt(ItemDisplayDB::GeosetG) > 265)
				//	showFacialHair = false;
			}
		} catch (...) {}
	}
	*/

	// facial hair geosets
	try {
		CharFacialHairDB::Record frec = facialhairdb.getByParams(cd.race, cd.gender, cd.facialHair);
		cd.geosets[1] = frec.getUInt(CharFacialHairDB::Geoset100);
		cd.geosets[2] = frec.getUInt(CharFacialHairDB::Geoset200);
		cd.geosets[3] = frec.getUInt(CharFacialHairDB::Geoset300);
		
	} catch (CharFacialHairDB::NotFound) {}

	if (showFacialHair == false) {
		/*
		cd.geosets[1] = 1;
		cd.geosets[2] = 1;
		cd.geosets[3] = 1;
		*/
		
		CharRacesDB::Record race = racedb.getById(cd.race);
		string tmp = race.getString(CharRacesDB::GeoType1);
		if (tmp == "NORMAL") {
			cd.geosets[1] = 1;
			cd.geosets[2] = 1;
			cd.geosets[3] = 1;
		}
    }

	// select hairstyle geoset(s)
	for (CharHairGeosetsDB::Iterator it = hairdb.begin(); it != hairdb.end(); ++it) {
		if (it->getUInt(CharHairGeosetsDB::Race)==cd.race && it->getUInt(CharHairGeosetsDB::Gender)==cd.gender) {
			unsigned int id = it->getUInt(CharHairGeosetsDB::Geoset);
			unsigned int section = it->getUInt(CharHairGeosetsDB::Section);
			if (id!=0) {
				for (size_t j=0; j<model->geosets.size(); j++) {
					if (model->geosets[j].id == id) {
						//std::cout << "Hair:\t" << id << "\t" << section << "\t" << ((cd.hairStyle==section) && cd.showHair) << "\n";
						model->showGeosets[j] = (cd.hairStyle==section) && showHair;
					}
				}
			} else if (cd.hairStyle==section) 
				bald = true;
		}
	}
	if (!showHair)
		bald = true;
	

	// check if we have a robe on
	bool hadRobe = false;
	if (cd.equipment[CS_CHEST] != 0) {
		try {
			const ItemRecord &item = items.get(cd.equipment[CS_CHEST]);
			int type = item.type;
			if (type==IT_ROBE) {
				ItemDisplayDB::Record r = itemdb.getById(item.model);
				if (r.getUInt(ItemDisplayDB::GeosetC)==1) hadRobe = true;
			}
		} catch (...) {}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -