Skip to content

Commit

Permalink
Cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
danij-deng committed Jan 6, 2013
1 parent 2a80984 commit 241a9cb
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 55 deletions.
4 changes: 2 additions & 2 deletions doomsday/engine/api/api_materialarchive.h
Expand Up @@ -91,11 +91,11 @@ DENG_API_TYPEDEF(MaterialArchive)
* Deserializes the state of the archive from @a reader.
*
* @param arc MaterialArchive instance.
* @param reader Reader instance.
* @param forcedVersion Version to interpret as, not actual format version. Use -1 to use whatever
* version is encountered.
* @param reader Reader instance.
*/
void (*Read)(MaterialArchive *arc, int forcedVersion, Reader *reader);
void (*Read)(MaterialArchive *arc, Reader *reader, int forcedVersion);
}
DENG_API_T(MaterialArchive);

Expand Down
6 changes: 3 additions & 3 deletions doomsday/engine/include/resource/materialarchive.h
Expand Up @@ -86,11 +86,11 @@ namespace de {
/**
* Deserializes the state of the archive from @a reader.
*
* @param forcedVersion Version to interpret as, not actual format version. Use -1 to use whatever
* version is encountered.
* @param reader Reader instance.
* @param forcedVersion Version to interpret as, not actual format version.
* Use -1 to use whatever version is encountered.
*/
void read(int forcedVersion, reader_s &reader);
void read(reader_s &reader, int forcedVersion = -1);

private:
struct Instance;
Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/src/client/cl_world.c
Expand Up @@ -75,7 +75,7 @@ void Cl_ReadServerMaterials(void)
{
serverMaterials = MaterialArchive_NewEmpty(false /*no segment check*/);
}
MaterialArchive_Read(serverMaterials, -1, msgReader);
MaterialArchive_Read(serverMaterials, msgReader, -1 /*no forced version*/);

#ifdef _DEBUG
Con_Message("Cl_ReadServerMaterials: Received %i materials.\n", MaterialArchive_Count(serverMaterials));
Expand Down
90 changes: 42 additions & 48 deletions doomsday/engine/src/resource/materialarchive.cpp
Expand Up @@ -84,6 +84,35 @@ static void readArchivedUri(Uri &uri, int version, reader_s &reader)
}
}

/**
* Mappings between URI and material_t.
* The pointer user value holds a pointer to the resolved Material (if found).
* The integer user value tracks whether a material has yet been looked up.
*/
typedef StringPool Records;
typedef StringPool::Id SerialId;

static material_t *findRecordMaterial(Records &records, SerialId id)
{
// Time to lookup the material for the record's URI?
if(!records.userValue(id))
{
material_t *material = 0;
try
{
material = App_Materials()->find(Uri(records.stringRef(id), RC_NULL)).material();
}
catch(Materials::NotFoundError const &)
{} // Ignore this error.

records.setUserPointer(id, material);
records.setUserValue(id, true);
return material;
}

return (material_t *) records.userPointer(id);
}

struct MaterialArchive::Instance
{
/// Logical version number of the archive.
Expand All @@ -92,12 +121,8 @@ struct MaterialArchive::Instance
/// Segment id assertion (Hexen saves).
bool useSegments;

/**
* Mappings between URI and material_t.
* The pointer user value holds a pointer to the resolved Material (if found).
* The integer user value tracks whether a material has yet been looked up.
*/
StringPool records;
/// Mappings between URI and material_t.
Records records;

/// Used with older versions.
int numFlats;
Expand All @@ -107,7 +132,7 @@ struct MaterialArchive::Instance
useSegments(_useSegments), numFlats(0)
{}

inline StringPool::Id insertRecord(Uri const &uri)
inline SerialId insertRecord(Uri const &uri)
{
return records.intern(uri.compose());
}
Expand All @@ -125,7 +150,7 @@ struct MaterialArchive::Instance
for(uint i = 1; i < num + 1; ++i)
{
MaterialBind *bind = App_Materials()->toMaterialBind(i);
StringPool::Id id = insertRecord(bind->composeUri());
SerialId id = insertRecord(bind->composeUri());
records.setUserPointer(id, bind->material());
records.setUserValue(id, true);
}
Expand Down Expand Up @@ -208,31 +233,16 @@ MaterialArchive::~MaterialArchive()
}

struct findUniqueSerialIdWorker_params {
StringPool *table;
Records *records;
material_t *material;
};

static int findUniqueSerialIdWorker(StringPool::Id id, void *parameters)
static int findUniqueSerialIdWorker(SerialId id, void *parameters)
{
findUniqueSerialIdWorker_params *parm = (findUniqueSerialIdWorker_params*) parameters;

// Time to lookup the material for the record's URI?
if(!parm->table->userValue(id))
{
material_t *material = 0;
try
{
material = App_Materials()->find(Uri(parm->table->stringRef(id), RC_NULL)).material();
}
catch(Materials::NotFoundError const &)
{} // Ignore this error.

parm->table->setUserPointer(id, material);
parm->table->setUserValue(id, true);
}

// Is this the material we are looking for?
if(parm->table->userPointer(id) == parm->material)
if(findRecordMaterial(*parm->records, id) == parm->material)
return id;

return 0; // Continue iteration.
Expand All @@ -243,10 +253,10 @@ materialarchive_serialid_t MaterialArchive::findUniqueSerialId(material_t *mater
if(!material) return 0; // Invalid.

findUniqueSerialIdWorker_params parm;
parm.table = &d->records;
parm.records = &d->records;
parm.material = material;

StringPool::Id found = d->records.iterate(findUniqueSerialIdWorker, &parm);
SerialId found = d->records.iterate(findUniqueSerialIdWorker, &parm);
if(found) return found; // Yes. Return existing serial.

return d->records.size() + 1;
Expand All @@ -271,23 +281,7 @@ material_t *MaterialArchive::find(materialarchive_serialid_t serialId, int group
return 0;
}

// Time to lookup the material for the record's URI?
if(!d->records.userValue(serialId))
{
material_t *material = 0;
try
{
material = App_Materials()->find(Uri(d->records.stringRef(serialId), RC_NULL)).material();
}
catch(Materials::NotFoundError const &)
{} // Ignore this error.

d->records.setUserPointer(serialId, material);
d->records.setUserValue(serialId, true);
return material;
}

return (material_t *) d->records.userPointer(serialId);
return findRecordMaterial(d->records, serialId);
}

int MaterialArchive::count() const
Expand All @@ -301,7 +295,7 @@ void MaterialArchive::write(writer_s &writer) const
d->writeGroup(writer);
}

void MaterialArchive::read(int forcedVersion, reader_s &reader)
void MaterialArchive::read(reader_s &reader, int forcedVersion)
{
d->records.clear();

Expand Down Expand Up @@ -418,10 +412,10 @@ void MaterialArchive_Write(MaterialArchive const *arc, Writer *writer)
}

#undef MaterialArchive_Read
void MaterialArchive_Read(MaterialArchive *arc, int forcedVersion, Reader *reader)
void MaterialArchive_Read(MaterialArchive *arc, Reader *reader, int forcedVersion)
{
SELF(arc);
self->read(forcedVersion, *reader);
self->read(*reader, forcedVersion);
}

DENG_DECLARE_API(MaterialArchive) =
Expand Down
2 changes: 1 addition & 1 deletion doomsday/plugins/common/src/p_saveg.c
Expand Up @@ -2949,7 +2949,7 @@ static void P_UnArchiveWorld(void)
#endif
{
Reader* svReader = SV_NewReader();
MaterialArchive_Read(materialArchive, matArchiveVer, svReader);
MaterialArchive_Read(materialArchive, svReader, matArchiveVer);
Reader_Delete(svReader);
}

Expand Down

0 comments on commit 241a9cb

Please sign in to comment.