void Graphics_Imp::Reload() { Texture2DContainer->Reload([this](std::shared_ptr<ResourceContainer<Texture2D_Imp>::LoadingInformation> o, uint8_t* data, int32_t size) -> void { o->ResourcePtr->Reload(data, size); }); EffectContainer->Reload([this](std::shared_ptr<ResourceContainer<Effect_Imp>::LoadingInformation> o, uint8_t* data, int32_t size) -> void { o->ResourcePtr->Reload(o->LoadedPath.c_str(), m_effectSetting, data, size); }); ModelContainer->ReloadWithVector([this](std::shared_ptr<ResourceContainer<Model_Imp>::LoadingInformation> o, const std::vector<uint8_t>& data) -> void { o->ResourcePtr->Reload(data, o->LoadedPath.c_str()); }); FontContainer->ReloadWithVector([this](std::shared_ptr<ResourceContainer<Font_Imp>::LoadingInformation> o, const std::vector<uint8_t>& data) -> void { o->ResourcePtr->Reload(o->LoadedPath.c_str(), data); }); for (auto& r : EffectContainer->GetAllResources()) { auto e = r.second; e->ReloadResources(r.first.c_str()); } }
void Effkseer_DeviceRestore(void* data) { if(GetUseDirect3DDevice9() == NULL) return; // DXライブラリは回復時に内部でデバイスを再生成するので新しく設定する。 LPDIRECT3DDEVICE9 device = (LPDIRECT3DDEVICE9) GetUseDirect3DDevice9(); auto renderer2d = (EffekseerRendererDX9::Renderer*)g_renderer2d; auto renderer3d = (EffekseerRendererDX9::Renderer*)g_renderer3d; renderer2d->ChangeDevice(device); renderer3d->ChangeDevice(device); // エフェクトのリソースを再読み込みする。 for (auto e : effectHandleToEffect) { auto effect = e.second; effect->ReloadResources(); } // デバイスが復帰するときに呼ぶ g_renderer2d->OnResetDevice(); g_renderer3d->OnResetDevice(); }
//---------------------------------------------------------------------------------- // //---------------------------------------------------------------------------------- void EffectImplemented::Load( void* pData, int size, float mag, const EFK_CHAR* materialPath ) { EffekseerPrintDebug("** Create : Effect\n"); uint8_t* pos = (uint8_t*)pData; // EFKS int head = 0; memcpy( &head, pos, sizeof(int) ); if( memcmp( &head, "SKFE", 4 ) != 0 ) return; pos += sizeof( int ); memcpy( &m_version, pos, sizeof(int) ); pos += sizeof(int); // 画像 memcpy( &m_ImageCount, pos, sizeof(int) ); pos += sizeof(int); if( m_ImageCount > 0 ) { m_ImagePaths = new EFK_CHAR*[ m_ImageCount ]; m_pImages = new void*[ m_ImageCount ]; for( int i = 0; i < m_ImageCount; i++ ) { int length = 0; memcpy( &length, pos, sizeof(int) ); pos += sizeof(int); m_ImagePaths[i] = new EFK_CHAR[ length ]; memcpy( m_ImagePaths[i], pos, length * sizeof(EFK_CHAR) ); pos += length * sizeof(EFK_CHAR); m_pImages[i] = NULL; } } if (m_version >= 9) { // 画像 memcpy(&m_normalImageCount, pos, sizeof(int)); pos += sizeof(int); if (m_normalImageCount > 0) { m_normalImagePaths = new EFK_CHAR*[m_normalImageCount]; m_normalImages = new void*[m_normalImageCount]; for (int i = 0; i < m_normalImageCount; i++) { int length = 0; memcpy(&length, pos, sizeof(int)); pos += sizeof(int); m_normalImagePaths[i] = new EFK_CHAR[length]; memcpy(m_normalImagePaths[i], pos, length * sizeof(EFK_CHAR)); pos += length * sizeof(EFK_CHAR); m_normalImages[i] = NULL; } } // 画像 memcpy(&m_distortionImageCount, pos, sizeof(int)); pos += sizeof(int); if (m_distortionImageCount > 0) { m_distortionImagePaths = new EFK_CHAR*[m_distortionImageCount]; m_distortionImages = new void*[m_distortionImageCount]; for (int i = 0; i < m_distortionImageCount; i++) { int length = 0; memcpy(&length, pos, sizeof(int)); pos += sizeof(int); m_distortionImagePaths[i] = new EFK_CHAR[length]; memcpy(m_distortionImagePaths[i], pos, length * sizeof(EFK_CHAR)); pos += length * sizeof(EFK_CHAR); m_distortionImages[i] = NULL; } } } if( m_version >= 1 ) { // ウェーブ memcpy( &m_WaveCount, pos, sizeof(int) ); pos += sizeof(int); if( m_WaveCount > 0 ) { m_WavePaths = new EFK_CHAR*[ m_WaveCount ]; m_pWaves = new void*[ m_WaveCount ]; for( int i = 0; i < m_WaveCount; i++ ) { int length = 0; memcpy( &length, pos, sizeof(int) ); pos += sizeof(int); m_WavePaths[i] = new EFK_CHAR[ length ]; memcpy( m_WavePaths[i], pos, length * sizeof(EFK_CHAR) ); pos += length * sizeof(EFK_CHAR); m_pWaves[i] = NULL; } } } if( m_version >= 6 ) { /* モデル */ memcpy( &m_modelCount, pos, sizeof(int) ); pos += sizeof(int); if( m_modelCount > 0 ) { m_modelPaths = new EFK_CHAR*[ m_modelCount ]; m_pModels = new void*[ m_modelCount ]; for( int i = 0; i < m_modelCount; i++ ) { int length = 0; memcpy( &length, pos, sizeof(int) ); pos += sizeof(int); m_modelPaths[i] = new EFK_CHAR[ length ]; memcpy( m_modelPaths[i], pos, length * sizeof(EFK_CHAR) ); pos += length * sizeof(EFK_CHAR); m_pModels[i] = NULL; } } } // 拡大率 if( m_version >= 2 ) { memcpy( &m_maginification, pos, sizeof(float) ); pos += sizeof(float); m_maginification *= mag; m_maginificationExternal = mag; } // カリング if( m_version >= 9 ) { memcpy( &(Culling.Shape), pos, sizeof(int32_t) ); pos += sizeof(int32_t); if(Culling.Shape == CullingShape::Sphere) { memcpy( &(Culling.Sphere.Radius), pos, sizeof(float) ); pos += sizeof(float); memcpy( &(Culling.Location.X), pos, sizeof(float) ); pos += sizeof(float); memcpy( &(Culling.Location.Y), pos, sizeof(float) ); pos += sizeof(float); memcpy( &(Culling.Location.Z), pos, sizeof(float) ); pos += sizeof(float); } } // ノード m_pRoot = EffectNode::Create( this, NULL, pos ); // リロード用にmaterialPathを記録しておく if (materialPath) m_materialPath = materialPath; ReloadResources( materialPath ); }