MF_API void MFMaterial_RegisterMaterialType(const char *pName, const MFMaterialCallbacks *pCallbacks) { MFCALLSTACK; MFMaterialType *pMatType; pMatType = (MFMaterialType*)MFHeap_Alloc(sizeof(MFMaterialType) + MFString_Length(pName) + 1); pMatType->pTypeName = (char*)&pMatType[1]; MFString_Copy(pMatType->pTypeName, pName); MFDebug_Assert(pCallbacks->pBegin, "Material must supply Begin() callback."); MFCopyMemory(&pMatType->materialCallbacks, pCallbacks, sizeof(MFMaterialCallbacks)); gMaterialRegistry.Create(pMatType); pCallbacks->pRegisterMaterial(NULL); }
MF_API MFMaterial* MFMaterial_Create(const char *pName) { MFCALLSTACK; MFMaterial *pMat = MFMaterial_Find(pName); if(!pMat) { pMat = (MFMaterial*)MFHeap_Alloc(sizeof(MFMaterial) + MFString_Length(pName) + 1); MFZeroMemory(pMat, sizeof(MFMaterial)); pMat->pName = (char*)&pMat[1]; MFString_Copy(pMat->pName, pName); gMaterialList.Create(pMat); MaterialDefinition *pDef = pDefinitionRegistry; while(pDef) { MFIniLine *pLine = pDef->pIni->GetFirstLine()->FindEntry("section",pName); if (pLine) { MaterialInternal_InitialiseFromDefinition(pDef->pIni, pMat, pName); break; } pDef = pDef->pNextDefinition; } if(!pDef) { // assign material type pMat->pType = MaterialInternal_GetMaterialType("Standard"); pMat->pType->materialCallbacks.pCreateInstance(pMat); // set diffuse map parameter MFMaterial_SetParameterS(pMat, MFMatStandard_Texture, MFMatStandard_Tex_DifuseMap, pName); } } pMat->refCount++; return pMat; }
MFCollisionItem* MFCollision_CreateCollisionItem() { MFCollisionItem *pItem = (MFCollisionItem*)MFHeap_Alloc(sizeof(MFCollisionItem)); gItemList.Create(pItem); return pItem; }