From a2de07a501ed31eafc8c4cd3ca9729eed7171176 Mon Sep 17 00:00:00 2001 From: danij Date: Wed, 16 Jan 2013 01:06:17 +0000 Subject: [PATCH] Refactor: Added C++ material_t class Note that the class was not named Material to try and minimize the number of potential conflicts in branch 'revise-texture-animation'. --- doomsday/engine/api/api_gl.h | 85 ++++++++++--------- doomsday/engine/api/api_map.h | 3 + doomsday/engine/api/api_material.h | 2 +- doomsday/engine/api/api_materialarchive.h | 4 +- doomsday/engine/api/dd_share.h | 2 +- doomsday/engine/api/dd_types.h | 2 - doomsday/engine/include/gl/gl_main.h | 9 +- doomsday/engine/include/render/sprite.h | 2 +- doomsday/engine/include/resource/material.h | 25 +++++- .../engine/include/resource/materialarchive.h | 6 +- doomsday/engine/include/resource/materials.h | 2 +- .../engine/include/resource/materialvariant.h | 4 +- doomsday/engine/include/server/sv_def.h | 2 +- doomsday/engine/include/ui/dd_ui.h | 10 ++- doomsday/engine/src/client/cl_world.cpp | 4 +- doomsday/engine/src/map/p_dmu.cpp | 14 ++- doomsday/engine/src/resource/api_material.cpp | 3 +- doomsday/engine/src/resource/material.cpp | 42 ++++++--- .../engine/src/resource/materialarchive.cpp | 4 +- doomsday/engine/src/resource/materials.cpp | 2 +- 20 files changed, 136 insertions(+), 91 deletions(-) diff --git a/doomsday/engine/api/api_gl.h b/doomsday/engine/api/api_gl.h index 1787f3a200..7aba17744c 100644 --- a/doomsday/engine/api/api_gl.h +++ b/doomsday/engine/api/api_gl.h @@ -25,6 +25,7 @@ #include #include "dd_share.h" +#include "api_map.h" // material_t #ifdef __cplusplus extern "C" { @@ -272,10 +273,10 @@ DENG_API_TYPEDEF(GL) void (*DeleteLists)(DGLuint list, int range); void (*SetNoMaterial)(void); - void (*SetMaterialUI)(struct material_s* mat, DGLint wrapS, DGLint wrapT); + void (*SetMaterialUI)(material_t *mat, DGLint wrapS, DGLint wrapT); void (*SetPatch)(patchid_t id, DGLint wrapS, DGLint wrapT); - void (*SetPSprite)(struct material_s* mat); - void (*SetPSprite2)(struct material_s* mat, int tclass, int tmap); + void (*SetPSprite)(material_t *mat); + void (*SetPSprite2)(material_t *mat, int tclass, int tmap); void (*SetRawImage)(lumpnum_t lumpNum, DGLint wrapS, DGLint wrapT); void (*BlendOp)(int op); @@ -345,52 +346,52 @@ DENG_API_T(GL); #ifndef DENG_NO_API_MACROS_GL #define DGL_Enable _api_GL.Enable #define DGL_Disable _api_GL.Disable -#define DGL_GetIntegerv _api_GL.GetIntegerv -#define DGL_GetInteger _api_GL.GetInteger -#define DGL_SetInteger _api_GL.SetInteger -#define DGL_GetFloatv _api_GL.GetFloatv -#define DGL_GetFloat _api_GL.GetFloat -#define DGL_SetFloat _api_GL.SetFloat +#define DGL_GetIntegerv _api_GL.GetIntegerv +#define DGL_GetInteger _api_GL.GetInteger +#define DGL_SetInteger _api_GL.SetInteger +#define DGL_GetFloatv _api_GL.GetFloatv +#define DGL_GetFloat _api_GL.GetFloat +#define DGL_SetFloat _api_GL.SetFloat #define DGL_Ortho _api_GL.Ortho #define DGL_Scissor _api_GL.Scissor -#define DGL_SetScissor _api_GL.SetScissor -#define DGL_SetScissor2 _api_GL.SetScissor2 -#define DGL_MatrixMode _api_GL.MatrixMode -#define DGL_PushMatrix _api_GL.PushMatrix -#define DGL_PopMatrix _api_GL.PopMatrix -#define DGL_LoadIdentity _api_GL.LoadIdentity -#define DGL_Translatef _api_GL.Translatef +#define DGL_SetScissor _api_GL.SetScissor +#define DGL_SetScissor2 _api_GL.SetScissor2 +#define DGL_MatrixMode _api_GL.MatrixMode +#define DGL_PushMatrix _api_GL.PushMatrix +#define DGL_PopMatrix _api_GL.PopMatrix +#define DGL_LoadIdentity _api_GL.LoadIdentity +#define DGL_Translatef _api_GL.Translatef #define DGL_Rotatef _api_GL.Rotatef #define DGL_Scalef _api_GL.Scalef #define DGL_Begin _api_GL.Begin #define DGL_End _api_GL.End #define DGL_NewList _api_GL.NewList #define DGL_EndList _api_GL.EndList -#define DGL_CallList _api_GL.CallList -#define DGL_DeleteLists _api_GL.DeleteLists -#define DGL_SetNoMaterial _api_GL.SetNoMaterial -#define DGL_SetMaterialUI _api_GL.SetMaterialUI -#define DGL_SetPatch _api_GL.SetPatch -#define DGL_SetPSprite _api_GL.SetPSprite -#define DGL_SetPSprite2 _api_GL.SetPSprite2 -#define DGL_SetRawImage _api_GL.SetRawImage +#define DGL_CallList _api_GL.CallList +#define DGL_DeleteLists _api_GL.DeleteLists +#define DGL_SetNoMaterial _api_GL.SetNoMaterial +#define DGL_SetMaterialUI _api_GL.SetMaterialUI +#define DGL_SetPatch _api_GL.SetPatch +#define DGL_SetPSprite _api_GL.SetPSprite +#define DGL_SetPSprite2 _api_GL.SetPSprite2 +#define DGL_SetRawImage _api_GL.SetRawImage #define DGL_BlendOp _api_GL.BlendOp -#define DGL_BlendFunc _api_GL.BlendFunc -#define DGL_BlendMode _api_GL.BlendMode -#define DGL_Color3ub _api_GL.Color3ub -#define DGL_Color3ubv _api_GL.Color3ubv -#define DGL_Color4ub _api_GL.Color4ub -#define DGL_Color4ubv _api_GL.Color4ubv +#define DGL_BlendFunc _api_GL.BlendFunc +#define DGL_BlendMode _api_GL.BlendMode +#define DGL_Color3ub _api_GL.Color3ub +#define DGL_Color3ubv _api_GL.Color3ubv +#define DGL_Color4ub _api_GL.Color4ub +#define DGL_Color4ubv _api_GL.Color4ubv #define DGL_Color3f _api_GL.Color3f -#define DGL_Color3fv _api_GL.Color3fv +#define DGL_Color3fv _api_GL.Color3fv #define DGL_Color4f _api_GL.Color4f -#define DGL_Color4fv _api_GL.Color4fv -#define DGL_TexCoord2f _api_GL.TexCoord2f -#define DGL_TexCoord2fv _api_GL.TexCoord2fv -#define DGL_Vertex2f _api_GL.Vertex2f -#define DGL_Vertex2fv _api_GL.Vertex2fv -#define DGL_Vertex3f _api_GL.Vertex3f -#define DGL_Vertex3fv _api_GL.Vertex3fv +#define DGL_Color4fv _api_GL.Color4fv +#define DGL_TexCoord2f _api_GL.TexCoord2f +#define DGL_TexCoord2fv _api_GL.TexCoord2fv +#define DGL_Vertex2f _api_GL.Vertex2f +#define DGL_Vertex2fv _api_GL.Vertex2fv +#define DGL_Vertex3f _api_GL.Vertex3f +#define DGL_Vertex3fv _api_GL.Vertex3fv #define DGL_Vertices2ftv _api_GL.Vertices2ftv #define DGL_Vertices3ftv _api_GL.Vertices3ftv #define DGL_Vertices3fctv _api_GL.Vertices3fctv @@ -401,11 +402,11 @@ DENG_API_T(GL); #define DGL_DrawRectf2 _api_GL.DrawRectf2 #define DGL_DrawRectf2Color _api_GL.DrawRectf2Color #define DGL_DrawRectf2Tiled _api_GL.DrawRectf2Tiled -#define DGL_DrawCutRectfTiled _api_GL.DrawCutRectfTiled -#define DGL_DrawCutRectf2Tiled _api_GL.DrawCutRectf2Tiled +#define DGL_DrawCutRectfTiled _api_GL.DrawCutRectfTiled +#define DGL_DrawCutRectf2Tiled _api_GL.DrawCutRectf2Tiled #define DGL_DrawQuadOutline _api_GL.DrawQuadOutline -#define DGL_DrawQuad2Outline _api_GL.DrawQuad2Outline -#define DGL_NewTextureWithParams _api_GL.NewTextureWithParams +#define DGL_DrawQuad2Outline _api_GL.DrawQuad2Outline +#define DGL_NewTextureWithParams _api_GL.NewTextureWithParams #define DGL_Bind _api_GL.Bind #define DGL_DeleteTextures _api_GL.DeleteTextures #define GL_UseFog _api_GL.UseFog diff --git a/doomsday/engine/api/api_map.h b/doomsday/engine/api/api_map.h index 2c70a15923..69ac9ee57a 100644 --- a/doomsday/engine/api/api_map.h +++ b/doomsday/engine/api/api_map.h @@ -130,6 +130,7 @@ struct plane_s; struct sector_s; struct sidedef_s; struct vertex_s; +struct material_s; typedef struct bspleaf_s BspLeaf; typedef struct bspnode_s BspNode; @@ -139,6 +140,7 @@ typedef struct plane_s Plane; typedef struct sector_s Sector; typedef struct sidedef_s SideDef; typedef struct vertex_s Vertex; +typedef struct material_s material_t; #elif defined __cplusplus @@ -146,6 +148,7 @@ typedef struct vertex_s Vertex; class BspLeaf; class LineDef; class Sector; +class material_t; #endif diff --git a/doomsday/engine/api/api_material.h b/doomsday/engine/api/api_material.h index a8530b22e1..c6722c77f8 100644 --- a/doomsday/engine/api/api_material.h +++ b/doomsday/engine/api/api_material.h @@ -38,7 +38,7 @@ DENG_API_TYPEDEF(Material) { de_api_t api; - struct material_s *(*ForTextureUri)(Uri const *textureUri); + material_t *(*ForTextureUri)(Uri const *textureUri); Uri *(*ComposeUri)(materialid_t materialId); materialid_t (*ResolveUri)(const Uri* uri); materialid_t (*ResolveUriCString)(const char* path); diff --git a/doomsday/engine/api/api_materialarchive.h b/doomsday/engine/api/api_materialarchive.h index f4e63613c0..fcfd2fcd73 100644 --- a/doomsday/engine/api/api_materialarchive.h +++ b/doomsday/engine/api/api_materialarchive.h @@ -59,7 +59,7 @@ DENG_API_TYPEDEF(MaterialArchive) /** * @return A new (unused) SerialId for the specified material. */ - materialarchive_serialid_t (*FindUniqueSerialId)(MaterialArchive const *arc, struct material_s *mat); + materialarchive_serialid_t (*FindUniqueSerialId)(MaterialArchive const *arc, material_t *mat); /** * Finds and returns a material with the identifier @a serialId. @@ -70,7 +70,7 @@ DENG_API_TYPEDEF(MaterialArchive) * * @return Pointer to a material instance. Ownership not given. */ - struct material_s *(*Find)(MaterialArchive const *arc, materialarchive_serialid_t serialId, int group); + material_t *(*Find)(MaterialArchive const *arc, materialarchive_serialid_t serialId, int group); /** * Returns the number of materials in the archive. diff --git a/doomsday/engine/api/dd_share.h b/doomsday/engine/api/dd_share.h index 444a7f9413..39d55b7a87 100644 --- a/doomsday/engine/api/dd_share.h +++ b/doomsday/engine/api/dd_share.h @@ -960,7 +960,7 @@ typedef struct { /// Sprite Info typedef struct { - struct material_s* material; + material_t *material; int flip; RectRaw geometry; float texCoord[2]; // Prepared texture coordinates. diff --git a/doomsday/engine/api/dd_types.h b/doomsday/engine/api/dd_types.h index 159ab895dd..723a56abd1 100644 --- a/doomsday/engine/api/dd_types.h +++ b/doomsday/engine/api/dd_types.h @@ -65,8 +65,6 @@ typedef void (*con_textfilter_t) (char* text); // Forward declarations for map data types. struct polyblock_s; struct polyobj_s; -struct surface_s; -struct material_s; #include #include diff --git a/doomsday/engine/include/gl/gl_main.h b/doomsday/engine/include/gl/gl_main.h index 06bc304d46..ba9f04e19e 100644 --- a/doomsday/engine/include/gl/gl_main.h +++ b/doomsday/engine/include/gl/gl_main.h @@ -30,10 +30,11 @@ #include "render/r_main.h" struct colorpalette_s; -struct material_s; struct colorpalette_s; struct ColorRawf_s; +class material_t; + #define MAX_TEX_UNITS 2 // More aren't currently used. DENG_EXTERN_C int numTexUnits; @@ -173,10 +174,10 @@ void GL_CallList(DGLuint list); void GL_DeleteLists(DGLuint list, int range); -void GL_SetMaterialUI2(struct material_s *mat, int wrapS, int wrapT); -void GL_SetMaterialUI(struct material_s *mat); +void GL_SetMaterialUI2(material_t *mat, int wrapS, int wrapT); +void GL_SetMaterialUI(material_t *mat); -void GL_SetPSprite(struct material_s *mat, int tclass, int tmap); +void GL_SetPSprite(material_t *mat, int tclass, int tmap); void GL_SetRawImage(lumpnum_t lumpNum, int wrapS, int wrapT); diff --git a/doomsday/engine/include/render/sprite.h b/doomsday/engine/include/render/sprite.h index 921d20a578..b18f347b19 100644 --- a/doomsday/engine/include/render/sprite.h +++ b/doomsday/engine/include/render/sprite.h @@ -32,7 +32,7 @@ typedef struct rendpspriteparams_s float pos[2]; // {X, Y} Screen-space position. float width, height; - struct material_s* mat; + material_t *mat; float texOffset[2]; boolean texFlip[2]; // {X, Y} Flip along the specified axis. diff --git a/doomsday/engine/include/resource/material.h b/doomsday/engine/include/resource/material.h index 2e502c7845..0a2df733d9 100644 --- a/doomsday/engine/include/resource/material.h +++ b/doomsday/engine/include/resource/material.h @@ -21,6 +21,11 @@ #ifndef LIBDENG_RESOURCE_MATERIAL_H #define LIBDENG_RESOURCE_MATERIAL_H +#ifndef __cplusplus +# error "resource/material.h requires C++" +#endif + +#include "MapElement" #include "map/p_mapdata.h" #include "map/p_dmu.h" @@ -38,8 +43,15 @@ typedef enum { struct material_variantlist_node_s; -typedef struct material_s { - runtime_mapdata_header_t header; +struct material_s; // Opaque type + +/** + * Logical material resource. + * @todo Rename as Material + */ +class material_t : public de::MapElement +{ +public: struct ded_material_s* _def; struct material_variantlist_node_s* _variants; material_env_class_t _envClass; // Environmental sound class. @@ -57,7 +69,14 @@ typedef struct material_s { float _shinyStrength; struct texture_s* _shinyMaskTex; byte _prepared; -} material_t; + + material_t(); + ~material_t(); + + operator material_s &() { + return (material_s &) *this; + } +}; #ifdef __cplusplus diff --git a/doomsday/engine/include/resource/materialarchive.h b/doomsday/engine/include/resource/materialarchive.h index 2df75feba5..33a24d9d1d 100644 --- a/doomsday/engine/include/resource/materialarchive.h +++ b/doomsday/engine/include/resource/materialarchive.h @@ -30,7 +30,7 @@ #include #include -struct material_s; +class material_t; namespace de { @@ -51,7 +51,7 @@ class MaterialArchive /** * @return A new (unused) SerialId for the specified material. */ - materialarchive_serialid_t findUniqueSerialId(struct material_s *mat) const; + materialarchive_serialid_t findUniqueSerialId(material_t *mat) const; /** * Finds and returns a material with the identifier @a serialId. @@ -61,7 +61,7 @@ class MaterialArchive * * @return Pointer to a material instance. Ownership not given. */ - struct material_s *find(materialarchive_serialid_t serialId, int group) const; + material_t *find(materialarchive_serialid_t serialId, int group) const; /** * Returns the number of materials in the archive. diff --git a/doomsday/engine/include/resource/materials.h b/doomsday/engine/include/resource/materials.h index fe9aeb9f80..4cf637134a 100644 --- a/doomsday/engine/include/resource/materials.h +++ b/doomsday/engine/include/resource/materials.h @@ -373,7 +373,7 @@ void Materials_Shutdown(void); void Materials_Ticker(timespan_t elapsed); uint Materials_Size(void); -materialid_t Materials_Id(material_t *material); +materialid_t Materials_Id(material_t const *material); material_t *Materials_ToMaterial(materialid_t materialId); struct uri_s *Materials_ComposeUri(materialid_t materialId); materialid_t Materials_ResolveUri(struct uri_s const *uri); diff --git a/doomsday/engine/include/resource/materialvariant.h b/doomsday/engine/include/resource/materialvariant.h index 721e3caa64..c5de3c0653 100644 --- a/doomsday/engine/include/resource/materialvariant.h +++ b/doomsday/engine/include/resource/materialvariant.h @@ -132,7 +132,7 @@ class MaterialVariant DENG2_ERROR(InvalidLayerError); public: - MaterialVariant(struct material_s &generalCase, MaterialVariantSpec const &spec, + MaterialVariant(material_t &generalCase, MaterialVariantSpec const &spec, ded_material_t const &def); ~MaterialVariant(); @@ -158,7 +158,7 @@ class MaterialVariant void resetAnim(); /// @return Material from which this variant is derived. - struct material_s &generalCase() const; + material_t &generalCase() const; /// @return MaterialVariantSpec from which this variant is derived. MaterialVariantSpec const &spec() const; diff --git a/doomsday/engine/include/server/sv_def.h b/doomsday/engine/include/server/sv_def.h index a2a73e7e8e..48de534fab 100644 --- a/doomsday/engine/include/server/sv_def.h +++ b/doomsday/engine/include/server/sv_def.h @@ -109,7 +109,7 @@ boolean Sv_CanTrustClientPos(int plrNum); /** * Returns a unique id for material @a mat that can be passed on to clients. */ -unsigned int Sv_IdForMaterial(struct material_s* mat); +unsigned int Sv_IdForMaterial(material_t *mat); #ifdef __cplusplus } // extern "C" diff --git a/doomsday/engine/include/ui/dd_ui.h b/doomsday/engine/include/ui/dd_ui.h index 5454e3df57..8e43be9c26 100644 --- a/doomsday/engine/include/ui/dd_ui.h +++ b/doomsday/engine/include/ui/dd_ui.h @@ -30,6 +30,8 @@ #include "api_fontrender.h" #include "api_svg.h" +#include "resource/material.h" + /** * @defgroup gui GUI */ @@ -141,7 +143,7 @@ typedef struct fi_page_s { struct fi_page_s *previous; struct fi_page_background_s { - struct material_s *material; + material_t *material; animatorvector4_t topColor; animatorvector4_t bottomColor; } _bg; @@ -172,7 +174,7 @@ struct fi_object_s *FIPage_RemoveObject(fi_page_t *page, struct fi_object_s *obj boolean FIPage_HasObject(fi_page_t *page, struct fi_object_s *obj); /// Current background Material. -struct material_s *FIPage_BackgroundMaterial(fi_page_t *page); +material_t *FIPage_BackgroundMaterial(fi_page_t *page); /// Sets the 'is-visible' state. void FIPage_MakeVisible(fi_page_t *page, boolean yes); @@ -181,7 +183,7 @@ void FIPage_MakeVisible(fi_page_t *page, boolean yes); void FIPage_Pause(fi_page_t *page, boolean yes); /// Sets the background Material. -void FIPage_SetBackgroundMaterial(fi_page_t *page, struct material_s *mat); +void FIPage_SetBackgroundMaterial(fi_page_t *page, material_t *mat); /// Sets the background top color. void FIPage_SetBackgroundTopColor(fi_page_t *page, float red, float green, float blue, int steps); @@ -238,7 +240,7 @@ typedef struct fidata_pic_frame_s { char flip:1; } flags; union { - struct material_s *material; + material_t *material; patchid_t patch; lumpnum_t lumpNum; DGLuint tex; diff --git a/doomsday/engine/src/client/cl_world.cpp b/doomsday/engine/src/client/cl_world.cpp index 979b247f5b..2995aebc6e 100644 --- a/doomsday/engine/src/client/cl_world.cpp +++ b/doomsday/engine/src/client/cl_world.cpp @@ -147,7 +147,7 @@ void Cl_ReadServerMobjStateIDs(void) StringArray_Delete(ar); } -static material_t* Cl_FindLocalMaterial(materialarchive_serialid_t archId) +static material_t *Cl_FindLocalMaterial(materialarchive_serialid_t archId) { if(!serverMaterials) { @@ -155,7 +155,7 @@ static material_t* Cl_FindLocalMaterial(materialarchive_serialid_t archId) Con_Message("Cl_FindLocalMaterial: Cannot translate serial id %i, server has not sent its materials!\n", archId); return 0; } - return MaterialArchive_Find(serverMaterials, archId, 0); + return (material_t *)MaterialArchive_Find(serverMaterials, archId, 0); } int Cl_LocalMobjType(int serverMobjType) diff --git a/doomsday/engine/src/map/p_dmu.cpp b/doomsday/engine/src/map/p_dmu.cpp index ae91d9fe37..a04f0d2944 100644 --- a/doomsday/engine/src/map/p_dmu.cpp +++ b/doomsday/engine/src/map/p_dmu.cpp @@ -280,6 +280,7 @@ int P_DummyType(void const *dummy) return elem->type(); } +#undef P_DummyExtraData void *P_DummyExtraData(void *dummy) { if(P_IsDummy(dummy)) @@ -290,6 +291,7 @@ void *P_DummyExtraData(void *dummy) return 0; } +#undef P_ToIndex uint P_ToIndex(void const *ptr) { if(!ptr) return 0; @@ -324,8 +326,7 @@ uint P_ToIndex(void const *ptr) return GET_PLANE_IDX(elem->castTo()); case DMU_MATERIAL: - DENG2_ASSERT(false); // TODO: update this! - //return Materials_Id(elem->castTo()); + return Materials_Id(elem->castTo()); default: /// @todo Throw exception. @@ -334,9 +335,7 @@ uint P_ToIndex(void const *ptr) } } -/** - * Convert index to pointer. - */ +#undef P_ToPtr void *P_ToPtr(int type, uint index) { switch(type) @@ -369,7 +368,6 @@ void *P_ToPtr(int type, uint index) return 0; /* Unreachable. */ } case DMU_MATERIAL: - // TODO: update! return Materials_ToMaterial(index); default: { @@ -380,6 +378,7 @@ void *P_ToPtr(int type, uint index) } } +#undef P_Iteratep int P_Iteratep(void *elPtr, uint prop, void *context, int (*callback) (void *p, void *ctx)) { de::MapElement *elem = IN_ELEM(elPtr); @@ -1055,8 +1054,7 @@ static int setProperty(void *ptr, void *context) break; case DMU_MATERIAL: - // TODO: Update this when Material is derived from de::MapElement! - //Material_SetProperty(elem->castTo(), args); + Material_SetProperty(elem->castTo(), args); break; case DMU_BSPNODE: { diff --git a/doomsday/engine/src/resource/api_material.cpp b/doomsday/engine/src/resource/api_material.cpp index 5ae840e66a..8f19ae946d 100644 --- a/doomsday/engine/src/resource/api_material.cpp +++ b/doomsday/engine/src/resource/api_material.cpp @@ -4,7 +4,8 @@ #include "de_resource.h" #include "api_material.h" -struct material_s *DD_MaterialForTextureUri(uri_s const *textureUri) +#undef DD_MaterialForTextureUri +material_t *DD_MaterialForTextureUri(uri_s const *textureUri) { if(!textureUri) return 0; // Not found. diff --git a/doomsday/engine/src/resource/material.cpp b/doomsday/engine/src/resource/material.cpp index ff797bc116..fb04464a36 100644 --- a/doomsday/engine/src/resource/material.cpp +++ b/doomsday/engine/src/resource/material.cpp @@ -203,6 +203,33 @@ typedef struct material_variantlist_node_s { MaterialVariant *variant; } material_variantlist_node_t; +material_t::material_t() : de::MapElement(DMU_MATERIAL) +{ + _def = 0; + _variants = 0; + _envClass = MEC_UNKNOWN; + _primaryBind = 0; + _size = Size2_New(); + _flags = 0; + _inAnimGroup = false; + _isCustom = false; + _detailTex = 0; + _detailScale = 0; + _detailStrength = 0; + _shinyTex = 0; + _shinyBlendmode = blendmode_t(0); + memset(_shinyMinColor, 0, sizeof(_shinyMinColor)); + _shinyStrength = 0; + _shinyMaskTex = 0; + _prepared = 0; +} + +material_t::~material_t() +{ + Material_DestroyVariants(this); + Size2_Delete(_size); +} + static void destroyVariants(material_t *mat) { DENG2_ASSERT(mat); @@ -218,20 +245,15 @@ static void destroyVariants(material_t *mat) material_t *Material_New() { - material_t *mat = (material_t *) M_Calloc(sizeof(*mat)); - mat->header.type = DMU_MATERIAL; - mat->_envClass = MEC_UNKNOWN; - mat->_size = Size2_New(); - return mat; + return new material_t(); } void Material_Delete(material_t *mat) { - DENG2_ASSERT(mat); - Material_DestroyVariants(mat); - Size2_Delete(mat->_size); - mat->_size = 0; - M_Free(mat); + if(mat) + { + delete mat; + } } void Material_Ticker(material_t *mat, timespan_t time) diff --git a/doomsday/engine/src/resource/materialarchive.cpp b/doomsday/engine/src/resource/materialarchive.cpp index 8628ece7b2..4844945dda 100644 --- a/doomsday/engine/src/resource/materialarchive.cpp +++ b/doomsday/engine/src/resource/materialarchive.cpp @@ -384,14 +384,14 @@ void MaterialArchive_Delete(MaterialArchive *arc) } #undef MaterialArchive_FindUniqueSerialId -materialarchive_serialid_t MaterialArchive_FindUniqueSerialId(MaterialArchive const *arc, struct material_s *mat) +materialarchive_serialid_t MaterialArchive_FindUniqueSerialId(MaterialArchive const *arc, material_t *mat) { SELF_CONST(arc); return self->findUniqueSerialId(mat); } #undef MaterialArchive_Find -struct material_s *MaterialArchive_Find(MaterialArchive const *arc, materialarchive_serialid_t serialId, int group) +material_t *MaterialArchive_Find(MaterialArchive const *arc, materialarchive_serialid_t serialId, int group) { SELF_CONST(arc); return self->find(serialId, group); diff --git a/doomsday/engine/src/resource/materials.cpp b/doomsday/engine/src/resource/materials.cpp index c7c4d8bb49..1477ebcebc 100644 --- a/doomsday/engine/src/resource/materials.cpp +++ b/doomsday/engine/src/resource/materials.cpp @@ -1309,7 +1309,7 @@ uint Materials_Size() return App_Materials()->size(); } -materialid_t Materials_Id(material_t *material) +materialid_t Materials_Id(material_t const *material) { if(!material) return NOMATERIALID; return Material_PrimaryBind(material);