fixed camo generation when maps are not in order
This commit is contained in:
@ -241,7 +241,7 @@ namespace ZoneTool
|
|||||||
if (world->dpvs.surfaces)
|
if (world->dpvs.surfaces)
|
||||||
{
|
{
|
||||||
map.dpvs.surfaces = mem->Alloc<IW4::GfxSurface>(world->surfaceCount);
|
map.dpvs.surfaces = mem->Alloc<IW4::GfxSurface>(world->surfaceCount);
|
||||||
map.dpvs.surfacesBounds = mem->Alloc<IW4::GfxCullGroup>(world->surfaceCount);
|
map.dpvs.surfacesBounds = mem->Alloc<IW4::GfxSurfaceBounds>(world->surfaceCount);
|
||||||
|
|
||||||
assert(sizeof(IW3::srfTriangles_t) == sizeof(IW4::srfTriangles_t));
|
assert(sizeof(IW3::srfTriangles_t) == sizeof(IW4::srfTriangles_t));
|
||||||
|
|
||||||
|
@ -114,10 +114,14 @@ namespace ZoneTool
|
|||||||
memset(iw5_comworld->primaryLights, 0, sizeof(IW5::ComPrimaryLight) * iw5_comworld->primaryLightCount);
|
memset(iw5_comworld->primaryLights, 0, sizeof(IW5::ComPrimaryLight) * iw5_comworld->primaryLightCount);
|
||||||
|
|
||||||
// copy data
|
// copy data
|
||||||
for (unsigned int i = 0; i < iw5_comworld->primaryLightCount; i++)
|
for (auto i = 0u; i < iw5_comworld->primaryLightCount; i++)
|
||||||
{
|
{
|
||||||
memcpy(iw5_comworld->primaryLights[i]._portpad0, asset->primaryLights[i]._portpad0, 28);
|
memcpy(iw5_comworld->primaryLights[i]._portpad0, asset->primaryLights[i]._portpad0, 28);
|
||||||
memcpy(iw5_comworld->primaryLights[i]._portpad1, asset->primaryLights[i]._portpad1, 40);
|
memcpy(iw5_comworld->primaryLights[i]._portpad1, asset->primaryLights[i]._portpad1, 40);
|
||||||
|
|
||||||
|
iw5_comworld->primaryLights[i].up[0] = 0.0f;
|
||||||
|
iw5_comworld->primaryLights[i].up[1] = 0.0f;
|
||||||
|
iw5_comworld->primaryLights[i].up[2] = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
// dump comworld
|
// dump comworld
|
||||||
@ -125,7 +129,7 @@ namespace ZoneTool
|
|||||||
|
|
||||||
// free memory_
|
// free memory_
|
||||||
delete[] iw5_comworld->primaryLights;
|
delete[] iw5_comworld->primaryLights;
|
||||||
delete[] iw5_comworld;
|
delete iw5_comworld;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -839,10 +839,29 @@ namespace ZoneTool
|
|||||||
memcpy(&iw5_asset->lightGrid, &asset->lightGrid,
|
memcpy(&iw5_asset->lightGrid, &asset->lightGrid,
|
||||||
Difference(&iw5_asset->fogTypesAllowed + 1, &iw5_asset->lightGrid));
|
Difference(&iw5_asset->fogTypesAllowed + 1, &iw5_asset->lightGrid));
|
||||||
|
|
||||||
|
// fix GfxDrawSurfs
|
||||||
|
iw5_asset->dpvs.surfaceMaterials = new IW5::GfxDrawSurf[iw5_asset->indexCount];
|
||||||
|
memset(iw5_asset->dpvs.surfaceMaterials, 0, sizeof IW5::GfxDrawSurf * iw5_asset->indexCount);
|
||||||
|
for (auto i = 0u; i < iw5_asset->indexCount; i++)
|
||||||
|
{
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.reflectionProbeIndex = asset->dpvs.surfaceMaterials[i].fields.reflectionProbeIndex;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.hasGfxEntIndex = asset->dpvs.surfaceMaterials[i].fields.hasGfxEntIndex;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.customIndex = asset->dpvs.surfaceMaterials[i].fields.customIndex;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.materialSortedIndex = asset->dpvs.surfaceMaterials[i].fields.materialSortedIndex;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.prepass = asset->dpvs.surfaceMaterials[i].fields.prepass;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.useHeroLighting = asset->dpvs.surfaceMaterials[i].fields.useHeroLighting;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.sceneLightIndex = asset->dpvs.surfaceMaterials[i].fields.sceneLightIndex;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.viewModelRender = 0;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.surfType = asset->dpvs.surfaceMaterials[i].fields.surfType;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.primarySortKey = asset->dpvs.surfaceMaterials[i].fields.primarySortKey;
|
||||||
|
iw5_asset->dpvs.surfaceMaterials[i].fields.unused = asset->dpvs.surfaceMaterials[i].fields.unused;
|
||||||
|
}
|
||||||
|
|
||||||
// dump asset
|
// dump asset
|
||||||
IW5::IGfxWorld::dump(iw5_asset);
|
IW5::IGfxWorld::dump(iw5_asset);
|
||||||
|
|
||||||
// free memory_
|
// free memory_
|
||||||
|
delete[] iw5_asset->dpvs.surfaceMaterials;
|
||||||
delete[] iw5_asset->cells;
|
delete[] iw5_asset->cells;
|
||||||
delete iw5_asset;
|
delete iw5_asset;
|
||||||
}
|
}
|
||||||
|
@ -321,14 +321,30 @@ namespace ZoneTool
|
|||||||
const auto material_name = std::string(patched_material->name).substr(0, strlen(patched_material->name) - 10).append(camo);
|
const auto material_name = std::string(patched_material->name).substr(0, strlen(patched_material->name) - 10).append(camo);
|
||||||
patched_material->name = _strdup(material_name.data());
|
patched_material->name = _strdup(material_name.data());
|
||||||
|
|
||||||
assert(patched_material->maps[patched_material->numMaps - 1].firstCharacter == 'd');
|
|
||||||
|
|
||||||
if (camo == "gold"s)
|
if (camo == "gold"s)
|
||||||
{
|
{
|
||||||
|
std::vector<MaterialImage> stored_maps;
|
||||||
|
stored_maps.resize(patched_material->numMaps - 1);
|
||||||
|
|
||||||
|
// filter out detailmap
|
||||||
|
auto target_index = 0;
|
||||||
|
for (auto map = 0; map < patched_material->numMaps; map++)
|
||||||
|
{
|
||||||
|
if (patched_material->maps[map].firstCharacter == 'd')
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(&stored_maps[target_index], &patched_material->maps[map], sizeof MaterialImage);
|
||||||
|
target_index++;
|
||||||
|
}
|
||||||
|
|
||||||
patched_material->numMaps -= 1;
|
patched_material->numMaps -= 1;
|
||||||
patched_material->techniqueSet = new MaterialTechniqueSet;
|
patched_material->techniqueSet = new MaterialTechniqueSet;
|
||||||
memcpy(patched_material->techniqueSet, model->materials[i]->techniqueSet, sizeof MaterialTechniqueSet);
|
memcpy(patched_material->techniqueSet, model->materials[i]->techniqueSet, sizeof MaterialTechniqueSet);
|
||||||
|
|
||||||
|
memcpy(patched_material->maps, stored_maps.data(), sizeof MaterialImage * patched_material->numMaps);
|
||||||
|
|
||||||
auto technique_name = std::string(patched_material->techniqueSet->name);
|
auto technique_name = std::string(patched_material->techniqueSet->name);
|
||||||
const auto detail_pos = technique_name.find_first_of("d0");
|
const auto detail_pos = technique_name.find_first_of("d0");
|
||||||
technique_name.replace(detail_pos + 2, 2, "");
|
technique_name.replace(detail_pos + 2, 2, "");
|
||||||
|
@ -2784,7 +2784,7 @@ namespace ZoneTool
|
|||||||
char flags;
|
char flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GfxCullGroup
|
struct GfxSurfaceBounds
|
||||||
{
|
{
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
@ -2872,7 +2872,7 @@ namespace ZoneTool
|
|||||||
unsigned __int16* sortedSurfIndex;
|
unsigned __int16* sortedSurfIndex;
|
||||||
GfxStaticModelInst* smodelInsts;
|
GfxStaticModelInst* smodelInsts;
|
||||||
GfxSurface* surfaces;
|
GfxSurface* surfaces;
|
||||||
GfxCullGroup* surfacesBounds;
|
GfxSurfaceBounds* surfacesBounds;
|
||||||
GfxStaticModelDrawInst* smodelDrawInsts;
|
GfxStaticModelDrawInst* smodelDrawInsts;
|
||||||
GfxDrawSurf* surfaceMaterials;
|
GfxDrawSurf* surfaceMaterials;
|
||||||
unsigned int* surfaceCastsSunShadow;
|
unsigned int* surfaceCastsSunShadow;
|
||||||
@ -3010,7 +3010,7 @@ namespace ZoneTool
|
|||||||
unsigned __int16* sortedSurfIndex;
|
unsigned __int16* sortedSurfIndex;
|
||||||
GfxStaticModelInst* smodelInsts;
|
GfxStaticModelInst* smodelInsts;
|
||||||
GfxSurface* surfaces;
|
GfxSurface* surfaces;
|
||||||
GfxCullGroup* surfacesBounds;
|
GfxSurfaceBounds* surfacesBounds;
|
||||||
GfxStaticModelDrawInst* smodelDrawInsts;
|
GfxStaticModelDrawInst* smodelDrawInsts;
|
||||||
GfxDrawSurf* surfaceMaterials;
|
GfxDrawSurf* surfaceMaterials;
|
||||||
unsigned int* surfaceCastsSunShadow;
|
unsigned int* surfaceCastsSunShadow;
|
||||||
|
@ -81,7 +81,7 @@ namespace ZoneTool
|
|||||||
{
|
{
|
||||||
asset->dpvs.surfaces[i].material = read.read_asset<Material>();
|
asset->dpvs.surfaces[i].material = read.read_asset<Material>();
|
||||||
}
|
}
|
||||||
asset->dpvs.cullGroups = read.read_array<GfxCullGroup>();
|
asset->dpvs.surfacesBounds = read.read_array<GfxSurfaceBounds>();
|
||||||
asset->dpvs.smodelDrawInsts = read.read_array<GfxStaticModelDrawInst>();
|
asset->dpvs.smodelDrawInsts = read.read_array<GfxStaticModelDrawInst>();
|
||||||
for (unsigned int i = 0; i < asset->dpvs.smodelCount; i++)
|
for (unsigned int i = 0; i < asset->dpvs.smodelCount; i++)
|
||||||
{
|
{
|
||||||
@ -947,11 +947,11 @@ namespace ZoneTool
|
|||||||
assert(data->indexCount > 0);
|
assert(data->indexCount > 0);
|
||||||
assert(data->dpvs.surfaces != nullptr);
|
assert(data->dpvs.surfaces != nullptr);
|
||||||
|
|
||||||
if (data->dpvs.cullGroups)
|
if (data->dpvs.surfacesBounds)
|
||||||
{
|
{
|
||||||
buf->align(3);
|
buf->align(3);
|
||||||
buf->write(data->dpvs.cullGroups, data->indexCount);
|
buf->write(data->dpvs.surfacesBounds, data->indexCount);
|
||||||
ZoneBuffer::clear_pointer(&dest->dpvs.cullGroups);
|
ZoneBuffer::clear_pointer(&dest->dpvs.surfacesBounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data->dpvs.smodelDrawInsts)
|
if (data->dpvs.smodelDrawInsts)
|
||||||
@ -1115,7 +1115,7 @@ namespace ZoneTool
|
|||||||
write.dump_asset(asset->dpvs.surfaces[i].material);
|
write.dump_asset(asset->dpvs.surfaces[i].material);
|
||||||
}
|
}
|
||||||
|
|
||||||
write.dump_array(asset->dpvs.cullGroups, asset->indexCount);
|
write.dump_array(asset->dpvs.surfacesBounds, asset->indexCount);
|
||||||
write.dump_array(asset->dpvs.smodelDrawInsts, asset->dpvs.smodelCount);
|
write.dump_array(asset->dpvs.smodelDrawInsts, asset->dpvs.smodelCount);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < asset->dpvs.smodelCount; i++)
|
for (unsigned int i = 0; i < asset->dpvs.smodelCount; i++)
|
||||||
|
@ -376,7 +376,7 @@ namespace ZoneTool
|
|||||||
|
|
||||||
if (max_state_index >= mat->stateBitsCount)
|
if (max_state_index >= mat->stateBitsCount)
|
||||||
{
|
{
|
||||||
ZONETOOL_FATAL("Material %s is referencing more statebit entries than it has!", mat->name);
|
// ZONETOOL_FATAL("Material %s is referencing more statebit entries than it has!", mat->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (max_state_index != mat->stateBitsCount - 1)
|
if (max_state_index != mat->stateBitsCount - 1)
|
||||||
|
@ -3033,17 +3033,25 @@ namespace ZoneTool
|
|||||||
bool castsSunShadow;
|
bool castsSunShadow;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GfxCullGroup
|
struct GfxSurfaceBounds
|
||||||
{
|
{
|
||||||
float mins[3];
|
Bounds bounds;
|
||||||
float maxs[3];
|
|
||||||
//int surfaceCount;
|
|
||||||
//int startSurfIndex;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GfxDrawSurfFields
|
struct GfxDrawSurfFields
|
||||||
{
|
{
|
||||||
__int64 _bf0;
|
unsigned __int64 objectId : 15;
|
||||||
|
unsigned __int64 reflectionProbeIndex : 8;
|
||||||
|
unsigned __int64 hasGfxEntIndex : 1;
|
||||||
|
unsigned __int64 customIndex : 5;
|
||||||
|
unsigned __int64 materialSortedIndex : 12;
|
||||||
|
unsigned __int64 prepass : 2;
|
||||||
|
unsigned __int64 useHeroLighting : 1;
|
||||||
|
unsigned __int64 sceneLightIndex : 8;
|
||||||
|
unsigned __int64 viewModelRender : 1;
|
||||||
|
unsigned __int64 surfType : 4;
|
||||||
|
unsigned __int64 primarySortKey : 6;
|
||||||
|
unsigned __int64 unused : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
union GfxDrawSurf
|
union GfxDrawSurf
|
||||||
@ -3099,7 +3107,7 @@ namespace ZoneTool
|
|||||||
unsigned __int16* sortedSurfIndex;
|
unsigned __int16* sortedSurfIndex;
|
||||||
GfxStaticModelInst* smodelInsts;
|
GfxStaticModelInst* smodelInsts;
|
||||||
GfxSurface* surfaces;
|
GfxSurface* surfaces;
|
||||||
GfxCullGroup* cullGroups;
|
GfxSurfaceBounds* surfacesBounds;
|
||||||
GfxStaticModelDrawInst* smodelDrawInsts;
|
GfxStaticModelDrawInst* smodelDrawInsts;
|
||||||
GfxDrawSurf* surfaceMaterials;
|
GfxDrawSurf* surfaceMaterials;
|
||||||
unsigned int* surfaceCastsSunShadow;
|
unsigned int* surfaceCastsSunShadow;
|
||||||
|
Reference in New Issue
Block a user