mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-25 00:20:16 +00:00
Add per-expansion asset overlay system and fix CharSections DBC layout
Expansion overlays allow each expansion to supplement the base asset data via an assetManifest field in expansion.json, loaded at priority 50 (below HD packs). The asset extractor gains --reference-manifest for delta-only extraction. Also fixes CharSections field indices (VariationIndex=4, ColorIndex=5, Texture1=6) across all DBC layout references.
This commit is contained in:
parent
85864ab05b
commit
886f4daf2e
13 changed files with 151 additions and 46 deletions
|
|
@ -167,19 +167,24 @@ bool CharacterPreview::loadCharacter(game::Race race, game::Gender gender,
|
|||
|
||||
const auto* csL = pipeline::getActiveDBCLayout() ? pipeline::getActiveDBCLayout()->getLayout("CharSections") : nullptr;
|
||||
|
||||
uint32_t fRace = csL ? (*csL)["RaceID"] : 1;
|
||||
uint32_t fSex = csL ? (*csL)["SexID"] : 2;
|
||||
uint32_t fBase = csL ? (*csL)["BaseSection"] : 3;
|
||||
uint32_t fVar = csL ? (*csL)["VariationIndex"] : 4;
|
||||
uint32_t fColor = csL ? (*csL)["ColorIndex"] : 5;
|
||||
for (uint32_t r = 0; r < charSectionsDbc->getRecordCount(); r++) {
|
||||
uint32_t raceId = charSectionsDbc->getUInt32(r, csL ? (*csL)["RaceID"] : 1);
|
||||
uint32_t sexId = charSectionsDbc->getUInt32(r, csL ? (*csL)["SexID"] : 2);
|
||||
uint32_t baseSection = charSectionsDbc->getUInt32(r, csL ? (*csL)["BaseSection"] : 3);
|
||||
uint32_t variationIndex = charSectionsDbc->getUInt32(r, csL ? (*csL)["VariationIndex"] : 8);
|
||||
uint32_t colorIndex = charSectionsDbc->getUInt32(r, csL ? (*csL)["ColorIndex"] : 9);
|
||||
uint32_t raceId = charSectionsDbc->getUInt32(r, fRace);
|
||||
uint32_t sexId = charSectionsDbc->getUInt32(r, fSex);
|
||||
uint32_t baseSection = charSectionsDbc->getUInt32(r, fBase);
|
||||
uint32_t variationIndex = charSectionsDbc->getUInt32(r, fVar);
|
||||
uint32_t colorIndex = charSectionsDbc->getUInt32(r, fColor);
|
||||
|
||||
if (raceId != targetRaceId || sexId != targetSexId) continue;
|
||||
|
||||
// Section 0: Body skin (variation=0, colorIndex = skin color)
|
||||
if (baseSection == 0 && !foundSkin &&
|
||||
variationIndex == 0 && colorIndex == static_cast<uint32_t>(skin)) {
|
||||
std::string tex1 = charSectionsDbc->getString(r, csL ? (*csL)["Texture1"] : 4);
|
||||
std::string tex1 = charSectionsDbc->getString(r, csL ? (*csL)["Texture1"] : 6);
|
||||
if (!tex1.empty()) {
|
||||
bodySkinPath_ = tex1;
|
||||
foundSkin = true;
|
||||
|
|
@ -189,8 +194,8 @@ bool CharacterPreview::loadCharacter(game::Race race, game::Gender gender,
|
|||
else if (baseSection == 1 && !foundFace &&
|
||||
variationIndex == static_cast<uint32_t>(face) &&
|
||||
colorIndex == static_cast<uint32_t>(skin)) {
|
||||
std::string tex1 = charSectionsDbc->getString(r, csL ? (*csL)["Texture1"] : 4);
|
||||
std::string tex2 = charSectionsDbc->getString(r, csL ? (*csL)["Texture2"] : 5);
|
||||
std::string tex1 = charSectionsDbc->getString(r, csL ? (*csL)["Texture1"] : 6);
|
||||
std::string tex2 = charSectionsDbc->getString(r, csL ? (*csL)["Texture2"] : 7);
|
||||
if (!tex1.empty()) faceLowerPath = tex1;
|
||||
if (!tex2.empty()) faceUpperPath = tex2;
|
||||
foundFace = true;
|
||||
|
|
@ -199,7 +204,7 @@ bool CharacterPreview::loadCharacter(game::Race race, game::Gender gender,
|
|||
else if (baseSection == 3 && !foundHair &&
|
||||
variationIndex == static_cast<uint32_t>(hairStyle) &&
|
||||
colorIndex == static_cast<uint32_t>(hairColor)) {
|
||||
std::string tex1 = charSectionsDbc->getString(r, csL ? (*csL)["Texture1"] : 4);
|
||||
std::string tex1 = charSectionsDbc->getString(r, csL ? (*csL)["Texture1"] : 6);
|
||||
if (!tex1.empty()) {
|
||||
hairScalpPath = tex1;
|
||||
foundHair = true;
|
||||
|
|
@ -208,7 +213,7 @@ bool CharacterPreview::loadCharacter(game::Race race, game::Gender gender,
|
|||
// Section 4: Underwear (variation=0, colorIndex = skin color)
|
||||
else if (baseSection == 4 && !foundUnderwear &&
|
||||
variationIndex == 0 && colorIndex == static_cast<uint32_t>(skin)) {
|
||||
uint32_t texBase = csL ? (*csL)["Texture1"] : 4;
|
||||
uint32_t texBase = csL ? (*csL)["Texture1"] : 6;
|
||||
for (uint32_t f = texBase; f <= texBase + 2; f++) {
|
||||
std::string tex = charSectionsDbc->getString(r, f);
|
||||
if (!tex.empty()) {
|
||||
|
|
@ -220,14 +225,9 @@ bool CharacterPreview::loadCharacter(game::Race race, game::Gender gender,
|
|||
}
|
||||
}
|
||||
|
||||
LOG_INFO("CharPreview tex lookup: bodySkin=", bodySkinPath_, " faceLower=", faceLowerPath,
|
||||
" faceUpper=", faceUpperPath, " hairScalp=", hairScalpPath,
|
||||
" underwear=", underwearPaths.size());
|
||||
|
||||
// Assign texture filenames on model before GPU upload
|
||||
for (size_t ti = 0; ti < model.textures.size(); ti++) {
|
||||
auto& tex = model.textures[ti];
|
||||
LOG_INFO(" model.textures[", ti, "]: type=", tex.type, " filename=", tex.filename);
|
||||
if (tex.type == 1 && tex.filename.empty() && !bodySkinPath_.empty()) {
|
||||
tex.filename = bodySkinPath_;
|
||||
} else if (tex.type == 6 && tex.filename.empty() && !hairScalpPath.empty()) {
|
||||
|
|
@ -256,9 +256,6 @@ bool CharacterPreview::loadCharacter(game::Race race, game::Gender gender,
|
|||
LOG_WARNING("CharacterPreview: failed to load model to GPU");
|
||||
return false;
|
||||
}
|
||||
LOG_INFO("CharPreview: model loaded to GPU, textureLookup size=", model.textureLookup.size(),
|
||||
" materials=", model.materials.size(), " batches=", model.batches.size());
|
||||
|
||||
// Composite body skin + face + underwear overlays
|
||||
if (!bodySkinPath_.empty()) {
|
||||
std::vector<std::string> layers;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue