void Fretboard::LoadFretboard(const char *pImage) { if(pFretboard) MFMaterial_Release(pFretboard); pFretboard = MFMaterial_Create(MFStr("Fretboards/%s", pImage)); if(pFretboard) { int zRead = MFMaterial_GetParameterIndexFromName(pFretboard, "zread"); int zWrite = MFMaterial_GetParameterIndexFromName(pFretboard, "zwrite"); int off = 0; MFMaterial_SetParameterI(pFretboard, zRead, 0, 0); MFMaterial_SetParameterI(pFretboard, zWrite, 0, 0); } }
MF_API MFParticleSystem* MFParticleSystem_Create(MFParticleParameters *pParticleParams) { MFParticleSystem *pSystem = (MFParticleSystem*)MFHeap_Alloc(sizeof(MFParticleSystem)); pSystem->params = *pParticleParams; if(!pParticleParams->pMaterial) pSystem->pMaterial = MFMaterial_Create("_None"); else { pSystem->pMaterial = MFMaterial_Create(pParticleParams->pMaterial); // int additive = MFMaterial_GetParameterIndexFromName(pSystem->pMaterial, "additive"); MFMaterial_SetParameterI(pSystem->pMaterial, MFMatStandard_ZWrite, 0, 0); } pSystem->particles.Init("ParticleSystem", pSystem->params.maxActiveParticles); return pSystem; }
MFInitStatus MFMaterial_InitModule() { MFCALLSTACK; gMaterialRegistry.Init("Material Registry", gDefaults.material.maxMaterialTypes); gMaterialDefList.Init("Material Definitions List", gDefaults.material.maxMaterialDefs); gMaterialList.Init("Material List", gDefaults.material.maxMaterials); DebugMenu_AddItem("Material Browser", "Fuji Options", &matBrowser); MFMat_Standard_Register(); MFMat_Effect_Register(); if(MFFileSystem_Exists("Materials.ini") && MFMaterial_AddDefinitionsFile("Materials", "Materials")) { MFDebug_Warn(3, "Failed to load Materials.ini"); } #if MF_RENDERER == MF_DRIVER_D3D11 || defined(MF_RENDERPLUGIN_D3D11) // HACK? MFTexture *pSysLogoLargeTexture = MFTexture_Create("_None"); MFTexture *pSysLogoSmallTexture = MFTexture_Create("_None"); #else // create the logo textures from raw data MFTexture *pSysLogoLargeTexture = MFTexture_CreateFromRawData("SysLogoLarge", SysLogo256_data, SysLogo256_width, SysLogo256_height, (MFImageFormat)SysLogo256_format, SysLogo256_flags); MFTexture *pSysLogoSmallTexture = MFTexture_CreateFromRawData("SysLogoSmall", SysLogo64_data, SysLogo64_width, SysLogo64_height, (MFImageFormat)SysLogo64_format, SysLogo64_flags); #endif // create standard materials pNoneMaterial = MFMaterial_Create("_None"); pWhiteMaterial = MFMaterial_Create("_White"); pSysLogoLarge = MFMaterial_Create("SysLogoLarge"); pSysLogoSmall = MFMaterial_Create("SysLogoSmall"); // disable backface cullign on the default materials MFMaterial_SetParameterI(pNoneMaterial, MFMatStandard_CullMode, 0, MFMatStandard_Cull_None); MFMaterial_SetParameterI(pWhiteMaterial, MFMatStandard_CullMode, 0, MFMatStandard_Cull_None); // release a reference to the logo textures MFTexture_Destroy(pSysLogoLargeTexture); MFTexture_Destroy(pSysLogoSmallTexture); #if defined(_PSP) // create PSP specific stock materials MFTexture *pConnectedTexture = MFTexture_CreateFromRawData("connected", connected_data, connected_width, connected_height, (MFImageFormat)connected_format, connected_flags); MFTexture *pDisconnectedTexture = MFTexture_CreateFromRawData("disconnected", disconnected_data, disconnected_width, disconnected_height, (MFImageFormat)disconnected_format, disconnected_flags); MFTexture *pPowerTexture = MFTexture_CreateFromRawData("power", power_data, power_width, power_height, (MFImageFormat)power_format, power_flags); MFTexture *pChargingTexture = MFTexture_CreateFromRawData("charging", charging_data, charging_width, charging_height, (MFImageFormat)charging_format, charging_flags); MFTexture *pUSBTexture = MFTexture_CreateFromRawData("usb_icon", usb_icon_data, usb_icon_width, usb_icon_height, (MFImageFormat)usb_icon_format, usb_icon_flags); pConnected = MFMaterial_Create("connected"); pDisconnected = MFMaterial_Create("disconnected"); pPower = MFMaterial_Create("power"); pCharging = MFMaterial_Create("charging"); pUSB = MFMaterial_Create("usb_icon"); MFTexture_Destroy(pConnectedTexture); MFTexture_Destroy(pDisconnectedTexture); MFTexture_Destroy(pPowerTexture); MFTexture_Destroy(pChargingTexture); MFTexture_Destroy(pUSBTexture); #endif return MFAIC_Succeeded; }
void MaterialInternal_InitialiseFromDefinition(MFIni *pDefIni, MFMaterial *pMat, const char *pDefinition) { MFCALLSTACK; MFIniLine *pLine = pDefIni->GetFirstLine()->FindEntry("section", pDefinition); if(pLine) { pLine = pLine->Sub(); if(pLine && pLine->IsString(0, "type")) { pMat->pType = MaterialInternal_GetMaterialType(pLine->GetString(1)); if(!pMat->pType) pMat->pType = MaterialInternal_GetMaterialType("Standard"); pLine = pLine->Next(); } else { pMat->pType = MaterialInternal_GetMaterialType("Standard"); } if(pMat->pType->materialCallbacks.pCreateInstance) pMat->pType->materialCallbacks.pCreateInstance(pMat); while(pLine) { if(pLine->IsString(0,"type")) { MFDebug_Warn(2, MFStr("'type' MUST be the first parameter in a material definition... Ignored, Using type '%s'.", pMat->pType->pTypeName)); } else if(pLine->IsString(0,"alias")) { MFDebug_Warn(2, "'alias' MUST be the first parameter in a material definition... Ignored."); MFDebug_Assert(false, "Fix Me!!!"); // const char *pAlias = pLine->GetString(1); // MaterialInternal_InitialiseFromDefinition(pDefIni, pMat, pAlias); } else { const char *pParam = pLine->GetString(0); MFMaterialParameterInfo *pInfo = MFMaterial_GetParameterInfoFromName(pMat, pParam); int lineArg = 1; int param = pInfo->parameterIndex; int argIndex = 0; switch(pInfo->argIndex.type) { case MFParamType_Int: argIndex = pLine->GetInt(lineArg++); break; case MFParamType_Enum: argIndex = pLine->GetEnum(lineArg++, pInfo->argIndex.pEnumKeys); break; default: argIndex = pInfo->argIndex.defaultValue; break; } switch(pInfo->argIndexHigh.type) { case MFParamType_Int: argIndex |= pLine->GetInt(lineArg++) << 16; break; case MFParamType_Enum: argIndex |= pLine->GetEnum(lineArg++, pInfo->argIndexHigh.pEnumKeys) << 16; break; default: argIndex |= pInfo->argIndexHigh.defaultValue << 16; break; } if(pInfo->numValues == 1) { switch(pInfo->pValues[0].type) { case MFParamType_Constant: { MFMaterial_SetParameterI(pMat, param, argIndex, pInfo->pValues[0].defaultValue); break; } case MFParamType_String: { const char *pString = pLine->GetString(lineArg); MFMaterial_SetParameterS(pMat, param, argIndex, pString); break; } case MFParamType_Float: { float value = pLine->GetFloat(lineArg); MFMaterial_SetParameterF(pMat, param, argIndex, value); break; } case MFParamType_Int: { int value = pLine->GetStringCount() > lineArg ? pLine->GetInt(lineArg) : pInfo->pValues[0].defaultValue; MFMaterial_SetParameterI(pMat, param, argIndex, value); break; } case MFParamType_Enum: { int value; if(pLine->GetStringCount() > lineArg) value = pLine->GetEnum(lineArg, pInfo->pValues[0].pEnumKeys); else value = pInfo->pValues[0].defaultValue; MFMaterial_SetParameterI(pMat, param, argIndex, value); break; } case MFParamType_Bool: { bool value = pLine->GetStringCount() > lineArg ? pLine->GetBool(lineArg) : !!pInfo->pValues[0].defaultValue; MFMaterial_SetParameterI(pMat, param, argIndex, value ? 1 : 0); break; } case MFParamType_Colour: { MFVector vector = pLine->GetColour(lineArg); MFMaterial_SetParameterV(pMat, param, argIndex, vector); break; } case MFParamType_Vector3: { MFVector vector = pLine->GetVector3(lineArg); MFMaterial_SetParameterV(pMat, param, argIndex, vector); break; } case MFParamType_Vector4: { MFVector vector = pLine->GetVector4(lineArg); MFMaterial_SetParameterV(pMat, param, argIndex, vector); break; } case MFParamType_Matrix: { MFDebug_Assert(false, "Cant read a matrix from an ini file... yet..."); break; } default: MFDebug_Assert(false, "Unknown parameter type.."); } } else if(pInfo->numValues > 1) { // produce a struct representing the args MFALIGN_BEGIN(16) char argBuffer[256] MFALIGN_END(16); int offset = 0; for(int a=0; a<pInfo->numValues; a++) { switch(pInfo->pValues[a].type) { case MFParamType_Constant: { offset = MFALIGN(offset, sizeof(int)); (int&)argBuffer[offset] = pInfo->pValues[a].defaultValue; offset += sizeof(int); break; } case MFParamType_String: { offset = MFALIGN(offset, sizeof(const char *)); (const char *&)argBuffer[offset] = pLine->GetString(lineArg++); offset += sizeof(const char *); break; } case MFParamType_Float: { offset = MFALIGN(offset, sizeof(float)); (float&)argBuffer[offset] = pLine->GetFloat(lineArg++); offset += sizeof(float); break; } case MFParamType_Int: { offset = MFALIGN(offset, sizeof(int)); (int&)argBuffer[offset] = pLine->GetInt(lineArg++); offset += sizeof(int); break; } case MFParamType_Enum: { offset = MFALIGN(offset, sizeof(int)); (int&)argBuffer[offset] = pLine->GetEnum(lineArg++, pInfo->pValues[a].pEnumKeys); offset += sizeof(int); break; } case MFParamType_Bool: { offset = MFALIGN(offset, sizeof(bool)); (bool&)argBuffer[offset] = pLine->GetBool(lineArg++); offset += sizeof(bool); break; } case MFParamType_Colour: case MFParamType_Vector3: case MFParamType_Vector4: case MFParamType_Matrix: { MFDebug_Assert(false, "Cant read type into structure... yet..."); break; } default: MFDebug_Assert(false, "Unknown parameter type.."); } } MFMaterial_SetParameter(pMat, param, argIndex, (uintp)argBuffer); } } pLine = pLine->Next(); } }
Fretboard::Fretboard() { pFretboard = NULL; // create materials MFTexture *pFretTex = MFTexture_Find("frets"); if(!pFretTex) pFretTex = MFTexture_CreateBlank("frets", MFVector::one); pFrets = MFMaterial_Create("frets"); MFTexture_Release(pFretTex); int zRead = MFMaterial_GetParameterIndexFromName(pFrets, "zread"); int zWrite = MFMaterial_GetParameterIndexFromName(pFrets, "zwrite"); int additive = MFMaterial_GetParameterIndexFromName(pFrets, "additive"); pEdge = MFMaterial_Create("edge"); pBar = MFMaterial_Create("bar"); pRing = MFMaterial_Create("ring"); pColourRing[0] = MFMaterial_Create("green"); pColourRing[1] = MFMaterial_Create("red"); pColourRing[2] = MFMaterial_Create("yellow"); pColourRing[3] = MFMaterial_Create("blue"); pColourRing[4] = MFMaterial_Create("orange"); pButtonMat[0] = MFMaterial_Create("button-green"); pButtonMat[1] = MFMaterial_Create("button-red"); pButtonMat[2] = MFMaterial_Create("button-yellow"); pButtonMat[3] = MFMaterial_Create("button-blue"); pButtonMat[4] = MFMaterial_Create("button-orange"); pButtonRing[0] = MFMaterial_Create("button-green-ring"); pButtonRing[1] = MFMaterial_Create("button-red-ring"); pButtonRing[2] = MFMaterial_Create("button-yellow-ring"); pButtonRing[3] = MFMaterial_Create("button-blue-ring"); pButtonRing[4] = MFMaterial_Create("button-orange-ring"); MFParticleParameters params; params.colour = MakeVector(1, 0, 1, 1); params.force.Set(0.f, 0.f, 0.f); params.life = .3f; params.size = .15f; params.fadeDelay = 0.2f; params.rotationRate = 2.f; params.scaleRate = -.1f; params.maxActiveParticles = 1000; params.pMaterial = "Notes/sparkles"; pParticles = MFParticleSystem_Create(¶ms); MFParticleEmitterParameters emitter; emitter.position.SetTranslation(MakeVector(0, 0, 0)); emitter.startVector.Set(0, 1.f, 0); emitter.pParticleSystem = pParticles; emitter.type = MFET_Disc; emitter.behaviour = MFEB_Direction; emitter.radius = 0.25f; emitter.velocity = 3.f; emitter.velocityScatter = 1.f; emitter.directionScatter = .3f; emitter.emitRate = 100.f; pEmitter = MFParticleSystem_CreateEmitter(&emitter); MFMaterial_SetParameterI(pFrets, zRead, 0, 0); MFMaterial_SetParameterI(pFrets, zWrite, 0, 0); MFMaterial_SetParameterI(pEdge, zRead, 0, 0); MFMaterial_SetParameterI(pEdge, zWrite, 0, 0); MFMaterial_SetParameterI(pBar, zRead, 0, 0); MFMaterial_SetParameterI(pBar, zWrite, 0, 0); MFMaterial_SetParameterI(pRing, zWrite, 0, 0); for(int a=0; a<5; ++a) MFMaterial_SetParameterI(pColourRing[a], additive, 0, 1); // load models pButton = MFModel_Create("Notes/button"); }