diff --git a/doomsday/engine/include/resource/material.h b/doomsday/engine/include/resource/material.h index 6e9c5b9915..40d4a76995 100644 --- a/doomsday/engine/include/resource/material.h +++ b/doomsday/engine/include/resource/material.h @@ -32,13 +32,11 @@ extern "C" { struct materialvariant_s; /** - * Initialize. Note that Material expects that initialization is done - * but once during construction and that the owner will not attempt to - * re-initialize later on. + * Construct a new material. */ -void Material_Initialize(material_t* mat); +material_t* Material_New(); -void Material_Destroy(material_t* mat); +void Material_Delete(material_t* mat); /** * Process a system tick event. diff --git a/doomsday/engine/src/resource/material.cpp b/doomsday/engine/src/resource/material.cpp index 05a6df147d..60f40ff827 100644 --- a/doomsday/engine/src/resource/material.cpp +++ b/doomsday/engine/src/resource/material.cpp @@ -54,21 +54,22 @@ static void destroyVariants(material_t *mat) mat->_prepared = 0; } -void Material_Initialize(material_t *mat) +material_t *Material_New() { - DENG2_ASSERT(mat); - std::memset(mat, 0, sizeof *mat); + material_t *mat = (material_t *) M_Calloc(sizeof(*mat)); mat->header.type = DMU_MATERIAL; mat->_envClass = MEC_UNKNOWN; mat->_size = Size2_New(); + return mat; } -void Material_Destroy(material_t *mat) +void Material_Delete(material_t *mat) { DENG2_ASSERT(mat); Material_DestroyVariants(mat); Size2_Delete(mat->_size); mat->_size = 0; + M_Free(mat); } void Material_Ticker(material_t *mat, timespan_t time) diff --git a/doomsday/engine/src/resource/materials.cpp b/doomsday/engine/src/resource/materials.cpp index e47cee7658..c07fbc600b 100644 --- a/doomsday/engine/src/resource/materials.cpp +++ b/doomsday/engine/src/resource/materials.cpp @@ -43,7 +43,6 @@ #include #include #include -#include #include #include @@ -52,9 +51,6 @@ #include "resource/materials.h" #include "resource/materialsnapshot.h" -/// Number of materials to block-allocate. -#define MATERIALS_BLOCK_ALLOC (32) - /// Number of elements to block-allocate in the material index to materialbind map. #define MATERIALS_BINDINGMAP_BLOCK_ALLOC (32) @@ -180,7 +176,6 @@ struct Materials::Instance * 5) Super-fast look up by public material identifier. * 6) Fast look up by material name (hashing is used). */ - blockset_t *materialsBlockSet; MaterialList *materials; uint materialCount; @@ -195,7 +190,6 @@ struct Materials::Instance Instance() : numgroups(0), groups(0), variantSpecs(0), variantCacheQueue(0), - materialsBlockSet(BlockSet_New(sizeof(material_t), MATERIALS_BLOCK_ALLOC)), materials(0), materialCount(0), bindingCount(0), bindingIdMapSize(0), bindingIdMap(0) {} @@ -223,16 +217,11 @@ struct Materials::Instance while(materials) { MaterialListNode *next = materials->next; - Material_Destroy(materials->mat); + Material_Delete(materials->mat); M_Free(materials); materials = next; } - if(materialsBlockSet) - { - BlockSet_Delete(materialsBlockSet); materialsBlockSet = 0; - } - materialCount = 0; } @@ -357,14 +346,6 @@ struct Materials::Instance return bindingIdMap[id-1]; } - material_t *allocMaterial() - { - material_t *mat = (material_t *)BlockSet_Allocate(materialsBlockSet); - Material_Initialize(mat); - materialCount++; - return mat; - } - /** * Link the material into the global list of materials. * @pre material is NOT already present in the global list. @@ -718,12 +699,16 @@ material_t *Materials::newFromDef(ded_material_t *def) if(!tex) return 0; // A new Material. - material_t *mat = d->linkMaterialToGlobalList(d->allocMaterial()); - mat->_flags = def->flags; - mat->_isCustom = tex->flags().testFlag(Texture::Custom); - mat->_def = def; + d->materialCount++; + material_t *mat = Material_New(); + + d->linkMaterialToGlobalList(mat); + + mat->_flags = def->flags; + mat->_isCustom = tex->flags().testFlag(Texture::Custom); + mat->_def = def; Size2_SetWidthHeight(mat->_size, MAX_OF(0, def->width), MAX_OF(0, def->height)); - mat->_envClass = S_MaterialEnvClassForUri(reinterpret_cast(&uri)); + mat->_envClass = S_MaterialEnvClassForUri(reinterpret_cast(&uri)); if(!bind) {