[IGfxWorld] Test pointer duplication

This commit is contained in:
momo5502 2017-04-18 19:28:00 +02:00
parent 85d519b7b0
commit dbe0af988f
5 changed files with 34 additions and 23 deletions

View File

@ -31,25 +31,6 @@ namespace Assets
}
}
/*
std::sort(surfs.begin(), surfs.end(), [](Game::GfxSurface* a, Game::GfxSurface* b)
{
if (a->material->name == nullptr && b->material->name == nullptr) return false;
if (a->material->name == nullptr && b->material->name != nullptr) return true;
if (a->material->name != nullptr && b->material->name == nullptr) return false;
return strcmp(a->material->name, b->material->name) == 0;
});
Game::GfxSurface* tmpBuffer = builder->getAllocator()->allocateArray<Game::GfxSurface>(world->surfaceCount);
for (unsigned int i = 0; i < world->surfaceCount; ++i)
{
std::memcpy(&tmpBuffer[i], surfs[i], sizeof(Game::GfxSurface));
}
asset->surfaces = tmpBuffer;
*/
if (asset->surfacesBounds)
{
asset->surfacesBounds = reader->readArray<Game::GfxSurfaceBounds>(world->surfaceCount);
@ -66,7 +47,6 @@ namespace Assets
if (model->model)
{
model->model = Components::AssetHandler::FindAssetForZone(Game::XAssetType::ASSET_TYPE_XMODEL, reader->readString().data(), builder).model;
//reader->readString(); model->model = Components::AssetHandler::FindOriginalAsset(Game::XAssetType::ASSET_TYPE_XMODEL, "void").model; // Use red-fx for now
}
}
}
@ -997,6 +977,8 @@ namespace Assets
Utils::Stream::ClearPointer(&dest->baseName);
}
//buffer->setPointerAssertion(true);
if (asset->skies)
{
AssertSize(Game::GfxSky, 16);
@ -1364,6 +1346,7 @@ namespace Assets
Utils::Stream::ClearPointer(&dest->heroOnlyLights);
}
//buffer->setPointerAssertion(false);
buffer->popBlock();
SaveLogExit();
}

View File

@ -1,5 +1,4 @@
#include "STDInclude.hpp"
#include <glm/glm.hpp>
namespace Components
{

View File

@ -87,7 +87,7 @@ namespace Utils
return this->pointerMap.find(pointer) != this->pointerMap.end();
}
Stream::Stream() : criticalSectionState(0)
Stream::Stream() : ptrAssertion(false), criticalSectionState(0)
{
memset(this->blockSize, 0, sizeof(this->blockSize));
@ -122,6 +122,25 @@ namespace Utils
return this->buffer.capacity();
}
void Stream::assertPointer(const void* pointer, size_t length)
{
if (!this->ptrAssertion) return;
for (auto& entry : this->ptrList)
{
unsigned int ePtr = reinterpret_cast<unsigned int>(entry.first);
unsigned int tPtr = reinterpret_cast<unsigned int>(pointer);
if(Utils::HasIntercection(ePtr, entry.second, tPtr, length))
{
MessageBoxA(nullptr, "Duplicate data written!", "ERROR", MB_ICONERROR);
__debugbreak();
}
}
this->ptrList.push_back({ pointer, length });
}
char* Stream::save(const void* _str, size_t size, size_t count)
{
return this->save(this->getCurrentBlock(), _str, size, count);
@ -155,6 +174,7 @@ namespace Utils
}
this->increaseBlockSize(stream, size * count);
this->assertPointer(_str, size * count);
return this->at() - (size * count);
}

View File

@ -15,6 +15,9 @@ namespace Utils
class Stream
{
private:
bool ptrAssertion;
std::vector<std::pair<const void*, size_t>> ptrList;
int criticalSectionState;
unsigned int blockSize[Game::MAX_XFILE_COUNT];
std::vector<Game::XFILE_BLOCK_TYPES> streamStack;
@ -133,6 +136,12 @@ namespace Utils
*object = reinterpret_cast<T*>(-1);
}
void setPointerAssertion(bool value)
{
this->ptrAssertion = value;
}
void assertPointer(const void* pointer, size_t length);
void toBuffer(std::string& outBuffer);
std::string toBuffer();

View File

@ -81,6 +81,6 @@ namespace Utils
bool HasIntercection(unsigned int base1, unsigned int len1, unsigned int base2, unsigned int len2)
{
return !((base1 + len1) < base2 || (base2 + len2) < base1);
return !(base1 + len1 <= base2 || base2 + len2 <= base1);
}
}