Skip to content

Commit

Permalink
Refactor|Materials: Various Materials collection cleanup refactorings
Browse files Browse the repository at this point in the history
- Relocated public API functions to api_material.cpp
- Updated engine internal code to use App_Materials() directly
- Added typedef for MaterialManifest as Materials::Manifest
  • Loading branch information
danij-deng committed Jan 18, 2013
1 parent e0bdf3b commit a5364e9
Show file tree
Hide file tree
Showing 11 changed files with 138 additions and 155 deletions.
8 changes: 4 additions & 4 deletions doomsday/engine/api/api_material.h
@@ -1,8 +1,8 @@
/** @file api_material.h Public API for materials.
* @ingroup resource
*
* @authors Copyright © 2013 Jaakko Keränen <jaakko.keranen@iki.fi>
* @authors Copyright © 2013 Daniel Swanson <danij@dengine.net>
* @author Copyright &copy; 2013 Jaakko Keränen <jaakko.keranen@iki.fi>
* @author Copyright &copy; 2013 Daniel Swanson <danij@dengine.net>
*
* @par License
* GPL: http://www.gnu.org/licenses/gpl.html
Expand Down Expand Up @@ -37,8 +37,8 @@ DENG_API_TYPEDEF(Material)

Material *(*ForTextureUri)(Uri const *textureUri);
Uri *(*ComposeUri)(materialid_t materialId);
materialid_t (*ResolveUri)(const Uri* uri);
materialid_t (*ResolveUriCString)(const char* path);
materialid_t (*ResolveUri)(Uri const *uri);
materialid_t (*ResolveUriCString)(char const *path);

}
DENG_API_T(Material);
Expand Down
15 changes: 7 additions & 8 deletions doomsday/engine/include/resource/material.h
Expand Up @@ -181,7 +181,7 @@ class Material : public de::MapElement
* prepared for a new render frame. Typically the only time force
* is needed is when the material variant has changed since.
*
* @return Snapshot for the chosen and prepared variant of Material.
* @return Snapshot for the prepared context variant.
*
* @see Material::chooseVariant(), Material::prepare()
*/
Expand Down Expand Up @@ -428,20 +428,19 @@ class Material : public de::MapElement
bool hasGlow() const;

/**
* Choose/create a variant of thematerial which fulfills @a spec and then
* Choose/create a variant of the material which fulfills @a spec and then
* immediately prepare it for render (e.g., upload textures if necessary).
*
* @note A convenient shorthand of the call tree:
* <pre>
* chooseVariant( @a spec, @c true )->prepare( @a forceSnapshotUpdate )
* </pre>
*
* @param spec Specification for the derivation of @a material.
* @param forceSnapshotUpdate @c true= Force an update of the variant's state
* snapshot. The snapshot is automatically updated
* when first prepared for a new render frame.
* Typically the only time force is needed is when
* the material variant has changed since.
* @param spec Specification for the derivation of @a material.
* @param forceSnapshotUpdate @c true= Force an update of the variant's
* state snapshot. The snapshot is automatically updated when first
* prepared for a new render frame. Typically the only time force is
* needed is when the material variant has changed since.
*
* @return Snapshot for the chosen and prepared variant of Material.
*
Expand Down
20 changes: 6 additions & 14 deletions doomsday/engine/include/resource/materials.h
Expand Up @@ -57,6 +57,7 @@ class Materials
{
public:
typedef class MaterialScheme Scheme;
typedef class MaterialManifest Manifest;

/**
* Defines a group of one or more materials.
Expand Down Expand Up @@ -251,7 +252,7 @@ class Materials
* @param search The search term.
* @return Found material manifest.
*/
MaterialManifest &find(Uri const &search) const;
Manifest &find(Uri const &search) const;

/**
* Update @a material according to the supplied definition @a def.
Expand All @@ -274,7 +275,7 @@ class Materials
*/
Material *newFromDef(ded_material_t &def);

MaterialManifest &newManifest(MaterialScheme &scheme, Path const &path);
Manifest &newManifest(Scheme &scheme, Path const &path);

/**
* Prepare a material variant specification in accordance to the specified
Expand Down Expand Up @@ -319,9 +320,6 @@ class Materials
*/
void resetAllMaterialAnimations();

/// @todo Refactor away -ds
MaterialManifest *toMaterialManifest(materialid_t id);

/**
* Lookup a material group by unique @a number.
*/
Expand Down Expand Up @@ -350,6 +348,9 @@ class Materials
return allGroups().count();
}

/// @todo Refactor away -ds
Manifest *toManifest(materialid_t id);

private:
struct Instance;
Instance *d;
Expand All @@ -374,15 +375,6 @@ void Materials_Init(void);
/// Shutdown this module.
void Materials_Shutdown(void);

void Materials_Ticker(timespan_t elapsed);
uint Materials_Count(void);
Material *Materials_ToMaterial(materialid_t id);
struct uri_s *Materials_ComposeUri(materialid_t id);
materialid_t Materials_ResolveUri(struct uri_s const *uri);

/// Same as Materials::resolveUri except @a uri is a C-string.
materialid_t Materials_ResolveUriCString(char const *uri);

#ifdef __cplusplus
} // extern "C"
#endif
Expand Down
13 changes: 10 additions & 3 deletions doomsday/engine/src/map/p_dmu.cpp
Expand Up @@ -360,7 +360,12 @@ void *P_ToPtr(int type, uint index)
return 0; /* Unreachable. */ }

case DMU_MATERIAL:
return Materials_ToMaterial(index);
if(Materials::Manifest *manifest = App_Materials()->toManifest(index))
{
return manifest->material();
}
/// @todo Throw exception?
return 0;

default: {
/// @todo Throw exception.
Expand Down Expand Up @@ -522,8 +527,10 @@ int P_Callback(int type, uint index, void *context, int (*callback)(void *p, voi
return 0; /* Unreachable */ }

case DMU_MATERIAL:
if(index < Materials_Count())
return callback(Materials_ToMaterial(index), context);
if(Materials::Manifest *manifest = App_Materials()->toManifest(index))
{
return callback(manifest->material(), context);
}
break;

case DMU_LINEDEF_BY_TAG:
Expand Down
50 changes: 26 additions & 24 deletions doomsday/engine/src/map/p_particle.cpp
Expand Up @@ -1367,14 +1367,11 @@ DENG_EXTERN_C void P_SpawnDamageParticleGen(mobj_t *mo, mobj_t *inflictor, int a

static int findDefForGenerator(ptcgen_t *gen, void *parameters)
{
ded_ptcgen_t *def;
int i;

DENG_UNUSED(parameters);

// Search for a suitable definition.
def = defs.ptcGens;
for(i = 0; i < defs.count.ptcGens.num; ++i, def++)
ded_ptcgen_t *def = defs.ptcGens;
for(int i = 0; i < defs.count.ptcGens.num; ++i, def++)
{
// A type generator?
if(def->typeNum == DED_PTCGEN_ANY_MOBJ_TYPE && gen->type == DED_PTCGEN_ANY_MOBJ_TYPE)
Expand All @@ -1396,32 +1393,37 @@ static int findDefForGenerator(ptcgen_t *gen, void *parameters)
// A flat generator?
if(gen->plane && def->material)
{
Material *defMat = Materials_ToMaterial(Materials_ResolveUri(def->material));
try
{
Material *defMat = App_Materials()->find(*reinterpret_cast<de::Uri const *>(def->material)).material();

Material *mat = gen->plane->PS_material;
if(def->flags & PGF_FLOOR_SPAWN)
mat = gen->plane->sector->SP_plane(PLN_FLOOR)->PS_material;
if(def->flags & PGF_CEILING_SPAWN)
mat = gen->plane->sector->SP_plane(PLN_CEILING)->PS_material;
Material *mat = gen->plane->PS_material;
if(def->flags & PGF_FLOOR_SPAWN)
mat = gen->plane->sector->SP_plane(PLN_FLOOR)->PS_material;
if(def->flags & PGF_CEILING_SPAWN)
mat = gen->plane->sector->SP_plane(PLN_CEILING)->PS_material;

// Is this suitable?
if(mat == defMat)
{
return i + 1; // 1-based index.
}
// Is this suitable?
if(mat == defMat)
{
return i + 1; // 1-based index.
}

#if 0 /// @todo $revise-texture-animation
if(def->flags & PGF_GROUP)
{
// Generator triggered by all materials in the animation.
if(Material_IsGroupAnimated(defMat) && Material_IsGroupAnimated(mat) &&
&Material_AnimGroup(defMat) == &Material_AnimGroup(mat))
if(def->flags & PGF_GROUP)
{
// Both are in this animation! This def will do.
return i + 1; // 1-based index.
// Generator triggered by all materials in the animation.
if(Material_IsGroupAnimated(defMat) && Material_IsGroupAnimated(mat) &&
&Material_AnimGroup(defMat) == &Material_AnimGroup(mat))
{
// Both are in this animation! This def will do.
return i + 1; // 1-based index.
}
}
}
#endif
}
catch(Materials::NotFoundError const &)
{} // Ignore this error.
}

// A state generator?
Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/src/map/p_ticker.cpp
Expand Up @@ -122,7 +122,7 @@ int P_MobjTicker(thinker_t* th, void* context)
void P_Ticker(timespan_t time)
{
P_ControlTicker(time);
Materials_Ticker(time);
App_Materials()->ticker(time);

if(!theMap || !GameMap_ThinkerListInited(theMap)) return; // Not initialized yet.

Expand Down
44 changes: 39 additions & 5 deletions doomsday/engine/src/resource/api_material.cpp
Expand Up @@ -5,7 +5,7 @@
#include "api_material.h"

#undef DD_MaterialForTextureUri
Material *DD_MaterialForTextureUri(uri_s const *textureUri)
DENG_EXTERN_C Material *DD_MaterialForTextureUri(uri_s const *textureUri)
{
if(!textureUri) return 0; // Not found.

Expand Down Expand Up @@ -33,10 +33,44 @@ Material *DD_MaterialForTextureUri(uri_s const *textureUri)
return 0; // Not found.
}

// materials.cpp
DENG_EXTERN_C struct uri_s *Materials_ComposeUri(materialid_t materialId);
DENG_EXTERN_C materialid_t Materials_ResolveUri(Uri const *uri/*, quiet=!(verbose >= 1)*/);
DENG_EXTERN_C materialid_t Materials_ResolveUriCString(char const *uri/*, quiet=!(verbose >= 1)*/);
#undef Materials_ComposeUri
DENG_EXTERN_C struct uri_s *Materials_ComposeUri(materialid_t materialId)
{
de::Materials::Manifest *manifest = App_Materials()->toManifest(materialId);
if(manifest)
{
de::Uri uri = manifest->composeUri();
return Uri_Dup(reinterpret_cast<uri_s *>(&uri));
}
return Uri_New();
}

#undef Materials_ResolveUri
DENG_EXTERN_C materialid_t Materials_ResolveUri(struct uri_s const *uri)
{
try
{
return App_Materials()->find(*reinterpret_cast<de::Uri const *>(uri)).id();
}
catch(de::Materials::NotFoundError const &)
{} // Ignore this error.
return NOMATERIALID;
}

#undef Materials_ResolveUriCString
DENG_EXTERN_C materialid_t Materials_ResolveUriCString(char const *uriCString)
{
if(uriCString && uriCString[0])
{
try
{
return App_Materials()->find(de::Uri(uriCString, RC_NULL)).id();
}
catch(de::Materials::NotFoundError const &)
{} // Ignore this error.
}
return NOMATERIALID;
}

DENG_DECLARE_API(Material) =
{
Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/src/resource/material.cpp
Expand Up @@ -359,7 +359,7 @@ void Material::setPrepared(byte state)
MaterialManifest &Material::manifest() const
{
/// @todo Material should store a link to the manifest.
return *App_Materials()->toMaterialManifest(d->manifestId);
return *App_Materials()->toManifest(d->manifestId);
}

materialid_t Material::manifestId() const
Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/src/resource/materialarchive.cpp
Expand Up @@ -149,7 +149,7 @@ struct MaterialArchive::Instance
uint num = App_Materials()->count();
for(uint i = 1; i < num + 1; ++i)
{
MaterialManifest *manifest = App_Materials()->toMaterialManifest(i);
MaterialManifest *manifest = App_Materials()->toManifest(i);
SerialId id = insertRecord(manifest->composeUri());
records.setUserPointer(id, manifest->material());
records.setUserValue(id, true);
Expand Down

0 comments on commit a5364e9

Please sign in to comment.