[IFxEffectDef] Add nullpointer check for material preloading

This commit is contained in:
momo5502 2016-11-29 08:32:15 +01:00
parent d596cdc97b
commit 5489fa2461

View File

@ -1,343 +1,350 @@
#include <STDInclude.hpp> #include <STDInclude.hpp>
namespace Assets namespace Assets
{ {
void IFxEffectDef::markFxElemVisuals(Game::FxElemVisuals* visuals, char elemType, Components::ZoneBuilder::Zone* builder) void IFxEffectDef::markFxElemVisuals(Game::FxElemVisuals* visuals, char elemType, Components::ZoneBuilder::Zone* builder)
{ {
switch (elemType) switch (elemType)
{ {
case 7: case 7:
{ {
if (visuals->xmodel) if (visuals->xmodel)
{ {
builder->loadAsset(Game::XAssetType::ASSET_TYPE_XMODEL, visuals->xmodel->name); builder->loadAsset(Game::XAssetType::ASSET_TYPE_XMODEL, visuals->xmodel->name);
} }
break; break;
} }
case 8: case 8:
case 9: case 9:
break; break;
case 0xA: case 0xA:
{ {
// TODO: Load sound here as soon as soundaliases are supported! // TODO: Load sound here as soon as soundaliases are supported!
break; break;
} }
case 0xC: case 0xC:
{ {
if (visuals->effectDef) if (visuals->effectDef)
{ {
builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, visuals->effectDef->name); builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, visuals->effectDef->name);
} }
break; break;
} }
default: default:
{ {
if (visuals->material) if (visuals->material)
{ {
builder->loadAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, visuals->material->name); builder->loadAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, visuals->material->name);
} }
break; break;
} }
} }
} }
void IFxEffectDef::mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) void IFxEffectDef::mark(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
{ {
Game::FxEffectDef* asset = header.fx; Game::FxEffectDef* asset = header.fx;
for (int i = 0; i < (asset->elemDefCountEmission + asset->elemDefCountLooping + asset->elemDefCountOneShot); ++i) for (int i = 0; i < (asset->elemDefCountEmission + asset->elemDefCountLooping + asset->elemDefCountOneShot); ++i)
{ {
Game::FxElemDef* elemDef = &asset->elemDefs[i]; Game::FxElemDef* elemDef = &asset->elemDefs[i];
{ {
if (elemDef->elemType == 11) if (elemDef->elemType == 11)
{ {
if (elemDef->visuals.markArray) if (elemDef->visuals.markArray)
{ {
for (char j = 0; j < elemDef->visualCount; ++j) for (char j = 0; j < elemDef->visualCount; ++j)
{ {
builder->loadAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[0]->name); if (elemDef->visuals.markArray[j].data[0])
builder->loadAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[1]->name); {
} builder->loadAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[0]->name);
} }
}
else if (elemDef->visualCount > 1) if (elemDef->visuals.markArray[j].data[1])
{ {
if (elemDef->visuals.array) builder->loadAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[1]->name);
{ }
for (char j = 0; j < elemDef->visualCount; ++j) }
{ }
this->markFxElemVisuals(&elemDef->visuals.array[j], elemDef->elemType, builder); }
} else if (elemDef->visualCount > 1)
} {
} if (elemDef->visuals.array)
else {
{ for (char j = 0; j < elemDef->visualCount; ++j)
this->markFxElemVisuals(&elemDef->visuals.instance, elemDef->elemType, builder); {
} this->markFxElemVisuals(&elemDef->visuals.array[j], elemDef->elemType, builder);
} }
}
if (elemDef->effectOnImpact) }
{ else
builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, elemDef->effectOnImpact->name); {
} this->markFxElemVisuals(&elemDef->visuals.instance, elemDef->elemType, builder);
}
if (elemDef->effectOnDeath) }
{
builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, elemDef->effectOnDeath->name); if (elemDef->effectOnImpact)
} {
builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, elemDef->effectOnImpact->name);
if (elemDef->effectEmitted) }
{
builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, elemDef->effectEmitted->name); if (elemDef->effectOnDeath)
} {
} builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, elemDef->effectOnDeath->name);
} }
void IFxEffectDef::saveFxElemVisuals(Game::FxElemVisuals* visuals, Game::FxElemVisuals* destVisuals, char elemType, Components::ZoneBuilder::Zone* builder) if (elemDef->effectEmitted)
{ {
Utils::Stream* buffer = builder->getBuffer(); builder->loadAsset(Game::XAssetType::ASSET_TYPE_FX, elemDef->effectEmitted->name);
}
switch (elemType) }
{ }
case 7:
{ void IFxEffectDef::saveFxElemVisuals(Game::FxElemVisuals* visuals, Game::FxElemVisuals* destVisuals, char elemType, Components::ZoneBuilder::Zone* builder)
if (visuals->xmodel) {
{ Utils::Stream* buffer = builder->getBuffer();
destVisuals->xmodel = builder->requireAsset(Game::XAssetType::ASSET_TYPE_XMODEL, visuals->xmodel->name).model;
} switch (elemType)
{
break; case 7:
} {
if (visuals->xmodel)
case 8: {
case 9: destVisuals->xmodel = builder->requireAsset(Game::XAssetType::ASSET_TYPE_XMODEL, visuals->xmodel->name).model;
break; }
case 0xA: break;
{ }
if (visuals->soundName)
{ case 8:
buffer->saveString(visuals->soundName); case 9:
Utils::Stream::ClearPointer(&destVisuals->soundName); break;
}
case 0xA:
break; {
} if (visuals->soundName)
{
case 0xC: buffer->saveString(visuals->soundName);
{ Utils::Stream::ClearPointer(&destVisuals->soundName);
if (visuals->effectDef) }
{
buffer->saveString(visuals->effectDef->name); break;
Utils::Stream::ClearPointer(&destVisuals->effectDef); }
}
case 0xC:
break; {
} if (visuals->effectDef)
{
buffer->saveString(visuals->effectDef->name);
Utils::Stream::ClearPointer(&destVisuals->effectDef);
}
break;
}
default: default:
{ {
if (visuals->material) if (visuals->material)
{ {
destVisuals->material = builder->requireAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, visuals->material->name).material; destVisuals->material = builder->requireAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, visuals->material->name).material;
} }
break; break;
} }
} }
} }
void IFxEffectDef::save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder) void IFxEffectDef::save(Game::XAssetHeader header, Components::ZoneBuilder::Zone* builder)
{ {
AssertSize(Game::FxEffectDef, 32); AssertSize(Game::FxEffectDef, 32);
Utils::Stream* buffer = builder->getBuffer(); Utils::Stream* buffer = builder->getBuffer();
Game::FxEffectDef* asset = header.fx; Game::FxEffectDef* asset = header.fx;
Game::FxEffectDef* dest = buffer->dest<Game::FxEffectDef>(); Game::FxEffectDef* dest = buffer->dest<Game::FxEffectDef>();
buffer->save(asset); buffer->save(asset);
buffer->pushBlock(Game::XFILE_BLOCK_VIRTUAL); buffer->pushBlock(Game::XFILE_BLOCK_VIRTUAL);
if (asset->name) if (asset->name)
{ {
buffer->saveString(builder->getAssetName(this->getType(), asset->name)); buffer->saveString(builder->getAssetName(this->getType(), asset->name));
Utils::Stream::ClearPointer(&dest->name); Utils::Stream::ClearPointer(&dest->name);
} }
if (asset->elemDefs) if (asset->elemDefs)
{ {
AssertSize(Game::FxElemDef, 252); AssertSize(Game::FxElemDef, 252);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
Game::FxElemDef* destElemDefs = buffer->dest<Game::FxElemDef>(); Game::FxElemDef* destElemDefs = buffer->dest<Game::FxElemDef>();
buffer->saveArray(asset->elemDefs, asset->elemDefCountEmission + asset->elemDefCountLooping + asset->elemDefCountOneShot); buffer->saveArray(asset->elemDefs, asset->elemDefCountEmission + asset->elemDefCountLooping + asset->elemDefCountOneShot);
for (int i = 0; i < (asset->elemDefCountEmission + asset->elemDefCountLooping + asset->elemDefCountOneShot); ++i) for (int i = 0; i < (asset->elemDefCountEmission + asset->elemDefCountLooping + asset->elemDefCountOneShot); ++i)
{ {
Game::FxElemDef* destElemDef = &destElemDefs[i]; Game::FxElemDef* destElemDef = &destElemDefs[i];
Game::FxElemDef* elemDef = &asset->elemDefs[i]; Game::FxElemDef* elemDef = &asset->elemDefs[i];
if (elemDef->velSamples) if (elemDef->velSamples)
{ {
AssertSize(Game::FxElemVelStateSample, 96); AssertSize(Game::FxElemVelStateSample, 96);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
buffer->saveArray(elemDef->velSamples, elemDef->velIntervalCount + 1); buffer->saveArray(elemDef->velSamples, elemDef->velIntervalCount + 1);
Utils::Stream::ClearPointer(&destElemDef->velSamples); Utils::Stream::ClearPointer(&destElemDef->velSamples);
} }
if (elemDef->visSamples) if (elemDef->visSamples)
{ {
AssertSize(Game::FxElemVisStateSample, 48); AssertSize(Game::FxElemVisStateSample, 48);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
buffer->saveArray(elemDef->visSamples, elemDef->visStateIntervalCount + 1); buffer->saveArray(elemDef->visSamples, elemDef->visStateIntervalCount + 1);
Utils::Stream::ClearPointer(&destElemDef->visSamples); Utils::Stream::ClearPointer(&destElemDef->visSamples);
} }
// Save_FxElemDefVisuals // Save_FxElemDefVisuals
{ {
if (elemDef->elemType == 11) if (elemDef->elemType == 11)
{ {
if (elemDef->visuals.markArray) if (elemDef->visuals.markArray)
{ {
AssertSize(Game::FxElemMarkVisuals, 8); AssertSize(Game::FxElemMarkVisuals, 8);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
Game::FxElemMarkVisuals* destMarkArray = buffer->dest<Game::FxElemMarkVisuals>(); Game::FxElemMarkVisuals* destMarkArray = buffer->dest<Game::FxElemMarkVisuals>();
buffer->saveArray(elemDef->visuals.markArray, elemDef->visualCount); buffer->saveArray(elemDef->visuals.markArray, elemDef->visualCount);
for (char j = 0; j < elemDef->visualCount; ++j) for (char j = 0; j < elemDef->visualCount; ++j)
{ {
if (elemDef->visuals.markArray[j].data[0]) if (elemDef->visuals.markArray[j].data[0])
{ {
destMarkArray[j].data[0] = builder->requireAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[0]->name).material; destMarkArray[j].data[0] = builder->requireAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[0]->name).material;
} }
if (elemDef->visuals.markArray[j].data[1]) if (elemDef->visuals.markArray[j].data[1])
{ {
destMarkArray[j].data[1] = builder->requireAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[1]->name).material; destMarkArray[j].data[1] = builder->requireAsset(Game::XAssetType::ASSET_TYPE_MATERIAL, elemDef->visuals.markArray[j].data[1]->name).material;
} }
} }
Utils::Stream::ClearPointer(&destElemDef->visuals.markArray); Utils::Stream::ClearPointer(&destElemDef->visuals.markArray);
} }
} }
else if(elemDef->visualCount > 1) else if(elemDef->visualCount > 1)
{ {
if (elemDef->visuals.array) if (elemDef->visuals.array)
{ {
AssertSize(Game::FxElemVisuals, 4); AssertSize(Game::FxElemVisuals, 4);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
Game::FxElemVisuals* destVisuals = buffer->dest<Game::FxElemVisuals>(); Game::FxElemVisuals* destVisuals = buffer->dest<Game::FxElemVisuals>();
buffer->saveArray(elemDef->visuals.array, elemDef->visualCount); buffer->saveArray(elemDef->visuals.array, elemDef->visualCount);
for (char j = 0; j < elemDef->visualCount; ++j) for (char j = 0; j < elemDef->visualCount; ++j)
{ {
this->saveFxElemVisuals(&elemDef->visuals.array[j], &destVisuals[j], elemDef->elemType, builder); this->saveFxElemVisuals(&elemDef->visuals.array[j], &destVisuals[j], elemDef->elemType, builder);
} }
Utils::Stream::ClearPointer(&destElemDef->visuals.array); Utils::Stream::ClearPointer(&destElemDef->visuals.array);
} }
} }
else else
{ {
this->saveFxElemVisuals(&elemDef->visuals.instance, &destElemDef->visuals.instance, elemDef->elemType, builder); this->saveFxElemVisuals(&elemDef->visuals.instance, &destElemDef->visuals.instance, elemDef->elemType, builder);
} }
} }
if (elemDef->effectOnImpact) if (elemDef->effectOnImpact)
{ {
buffer->saveString(elemDef->effectOnImpact->name); buffer->saveString(elemDef->effectOnImpact->name);
Utils::Stream::ClearPointer(&destElemDef->effectOnImpact); Utils::Stream::ClearPointer(&destElemDef->effectOnImpact);
} }
if (elemDef->effectOnDeath) if (elemDef->effectOnDeath)
{ {
buffer->saveString(elemDef->effectOnDeath->name); buffer->saveString(elemDef->effectOnDeath->name);
Utils::Stream::ClearPointer(&destElemDef->effectOnDeath); Utils::Stream::ClearPointer(&destElemDef->effectOnDeath);
} }
if (elemDef->effectEmitted) if (elemDef->effectEmitted)
{ {
buffer->saveString(elemDef->effectEmitted->name); buffer->saveString(elemDef->effectEmitted->name);
Utils::Stream::ClearPointer(&destElemDef->effectEmitted); Utils::Stream::ClearPointer(&destElemDef->effectEmitted);
} }
// Save_FxElemExtendedDefPtr // Save_FxElemExtendedDefPtr
{ {
AssertSize(Game::FxElemExtendedDef, 4); AssertSize(Game::FxElemExtendedDef, 4);
if (elemDef->elemType == 3) if (elemDef->elemType == 3)
{ {
// Save_FxTrailDef // Save_FxTrailDef
{ {
if (elemDef->extendedDef.trailDef) if (elemDef->extendedDef.trailDef)
{ {
AssertSize(Game::FxTrailDef, 36); AssertSize(Game::FxTrailDef, 36);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
Game::FxTrailDef* trailDef = elemDef->extendedDef.trailDef; Game::FxTrailDef* trailDef = elemDef->extendedDef.trailDef;
Game::FxTrailDef* destTrailDef = buffer->dest<Game::FxTrailDef>(); Game::FxTrailDef* destTrailDef = buffer->dest<Game::FxTrailDef>();
buffer->save(trailDef); buffer->save(trailDef);
if (trailDef->verts) if (trailDef->verts)
{ {
AssertSize(Game::FxTrailVertex, 20); AssertSize(Game::FxTrailVertex, 20);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
buffer->saveArray(trailDef->verts, trailDef->vertCount); buffer->saveArray(trailDef->verts, trailDef->vertCount);
Utils::Stream::ClearPointer(&destTrailDef->verts); Utils::Stream::ClearPointer(&destTrailDef->verts);
} }
if (trailDef->inds) if (trailDef->inds)
{ {
buffer->align(Utils::Stream::ALIGN_2); buffer->align(Utils::Stream::ALIGN_2);
buffer->saveArray(trailDef->inds, trailDef->indCount); buffer->saveArray(trailDef->inds, trailDef->indCount);
Utils::Stream::ClearPointer(&destTrailDef->inds); Utils::Stream::ClearPointer(&destTrailDef->inds);
} }
Utils::Stream::ClearPointer(&destElemDef->extendedDef.trailDef); Utils::Stream::ClearPointer(&destElemDef->extendedDef.trailDef);
} }
} }
} }
else if (elemDef->elemType == 6) else if (elemDef->elemType == 6)
{ {
if (elemDef->extendedDef.sparkFountain) if (elemDef->extendedDef.sparkFountain)
{ {
AssertSize(Game::FxSparkFountain, 52); AssertSize(Game::FxSparkFountain, 52);
buffer->align(Utils::Stream::ALIGN_4); buffer->align(Utils::Stream::ALIGN_4);
buffer->save(elemDef->extendedDef.sparkFountain); buffer->save(elemDef->extendedDef.sparkFountain);
Utils::Stream::ClearPointer(&destElemDef->extendedDef.sparkFountain); Utils::Stream::ClearPointer(&destElemDef->extendedDef.sparkFountain);
} }
} }
else else
{ {
if (elemDef->extendedDef.unknownBytes) if (elemDef->extendedDef.unknownBytes)
{ {
buffer->save(elemDef->extendedDef.unknownBytes); buffer->save(elemDef->extendedDef.unknownBytes);
Utils::Stream::ClearPointer(&destElemDef->extendedDef.unknownBytes); Utils::Stream::ClearPointer(&destElemDef->extendedDef.unknownBytes);
} }
} }
} }
} }
Utils::Stream::ClearPointer(&dest->elemDefs); Utils::Stream::ClearPointer(&dest->elemDefs);
} }
buffer->popBlock(); buffer->popBlock();
} }
} }