From f3344fc5441012f46700ae7c5c9435d7d32a39c3 Mon Sep 17 00:00:00 2001 From: Joseph Davies Date: Wed, 1 Jun 2011 12:54:30 -0700 Subject: [PATCH] Add new plClientResMgr for graphic resources external to client executable. --- .../Plasma/Apps/AllClient/AllClient.sln | 18 +++ .../plClientResMgr/plClientResMgr.vcproj | 139 ++++++++++++++++++ .../plClientResMgr/plClientResMgr.cpp | 132 +++++++++++++++++ .../plClientResMgr/plClientResMgr.h | 50 +++++++ 4 files changed, 339 insertions(+) create mode 100644 MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.vcproj create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.cpp create mode 100644 MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.h diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln index 19ca25f6..2f8248d2 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/Apps/AllClient/AllClient.sln @@ -121,6 +121,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClient", "..\plClient\plC {6CB8A937-3C28-447E-B753-081E275E58FF} = {6CB8A937-3C28-447E-B753-081E275E58FF} {C28B9838-04AE-4EBD-A93F-A94A64230887} = {C28B9838-04AE-4EBD-A93F-A94A64230887} {46B6473A-BD67-4DB8-9479-3C26B8626CFA} = {46B6473A-BD67-4DB8-9479-3C26B8626CFA} + {17A0AA3A-8445-4C66-FE58-0A5C222CC474} = {17A0AA3A-8445-4C66-FE58-0A5C222CC474} {65A72F3C-FE82-4014-81A3-4647938F40AA} = {65A72F3C-FE82-4014-81A3-4647938F40AA} {A58C3644-55E7-44EB-BE85-0D53773B8BA9} = {A58C3644-55E7-44EB-BE85-0D53773B8BA9} {28E5E146-D581-4492-9DD7-D56247A9F027} = {28E5E146-D581-4492-9DD7-D56247A9F027} @@ -189,6 +190,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClientKey", "..\plClientK ProjectSection(ProjectDependencies) = postProject EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plClientResMgr", "..\..\PubUtilLib\plClientResMgr\plClientResMgr.vcproj", "{17A0AA3A-8445-4C66-FE58-0A5C222CC474}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plCompression", "..\..\PubUtilLib\plCompression\plCompression.vcproj", "{EF33BFC0-C38B-4BA6-B5B7-E7F90323956F}" ProjectSection(ProjectDependencies) = postProject EndProjectSection @@ -488,6 +493,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plPageOptimizer", "..\plPag {5CB24835-47C1-4AE7-900E-70CBD1CC1DEA} = {5CB24835-47C1-4AE7-900E-70CBD1CC1DEA} {6CB8A937-3C28-447E-B753-081E275E58FF} = {6CB8A937-3C28-447E-B753-081E275E58FF} {46B6473A-BD67-4DB8-9479-3C26B8626CFA} = {46B6473A-BD67-4DB8-9479-3C26B8626CFA} + {17A0AA3A-8445-4C66-FE58-0A5C222CC474} = {17A0AA3A-8445-4C66-FE58-0A5C222CC474} {65A72F3C-FE82-4014-81A3-4647938F40AA} = {65A72F3C-FE82-4014-81A3-4647938F40AA} {A58C3644-55E7-44EB-BE85-0D53773B8BA9} = {A58C3644-55E7-44EB-BE85-0D53773B8BA9} {28E5E146-D581-4492-9DD7-D56247A9F027} = {28E5E146-D581-4492-9DD7-D56247A9F027} @@ -896,6 +902,18 @@ Global {CE472632-E2F1-446C-ABAB-1CE5BD9F367B}.Release_Patcher.Build.0 = Release|Win32 {CE472632-E2F1-446C-ABAB-1CE5BD9F367B}.Release_Server.ActiveCfg = Release|Win32 {CE472632-E2F1-446C-ABAB-1CE5BD9F367B}.Release_Server.Build.0 = Release|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Debug.ActiveCfg = Debug|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Debug.Build.0 = Debug|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Debug_Patcher.ActiveCfg = Debug|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Debug_Patcher.Build.0 = Debug|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Debug_Server.ActiveCfg = Debug|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Debug_Server.Build.0 = Debug|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Release.ActiveCfg = Release|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Release.Build.0 = Release|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Release_Patcher.ActiveCfg = Release|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Release_Patcher.Build.0 = Release|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Release_Server.ActiveCfg = Release|Win32 + {17A0AA3A-8445-4C66-FE58-0A5C222CC474}.Release_Server.Build.0 = Release|Win32 {EF33BFC0-C38B-4BA6-B5B7-E7F90323956F}.Debug.ActiveCfg = Debug|Win32 {EF33BFC0-C38B-4BA6-B5B7-E7F90323956F}.Debug.Build.0 = Debug|Win32 {EF33BFC0-C38B-4BA6-B5B7-E7F90323956F}.Debug_Patcher.ActiveCfg = Debug_Patcher|Win32 diff --git a/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.vcproj b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.vcproj new file mode 100644 index 00000000..eb0ae51e --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/MsDevProjects/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.vcproj @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.cpp new file mode 100644 index 00000000..2b0b7a0e --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.cpp @@ -0,0 +1,132 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#include "hsTypes.h" +#include "hsUtils.h" +#include "hsStream.h" +#include "hsResMgr.h" +#include "plJPEG/plJPEG.h" +#include "plGImage/plPNG.h" +#include "plGImage/plMipmap.h" + +#include "plClientResMgr.h" + + +//// Singleton Instance /////////////////////////////////////////////////////// + +plClientResMgr& plClientResMgr::Instance(void) +{ + static plClientResMgr theInstance; + return theInstance; +} + +plClientResMgr::plClientResMgr() +{ + this->ClientResources = TRACKED_NEW std::map; +} + +plClientResMgr::~plClientResMgr() +{ + if (this->ClientResources) { + std::map::iterator it; + + for (it = this->ClientResources->begin(); it != this->ClientResources->end(); ++it) { + it->second->UnRef(); + } + + delete this->ClientResources; + } +} + +void plClientResMgr::ILoadResources(const char* resfile) +{ + if (!resfile) { + return; + } + + wchar* wFilename = hsStringToWString(resfile); + hsUNIXStream in; + + if (in.Open(wFilename, L"rb")) { + UInt32 header = in.ReadSwap32(); + UInt32 version = in.ReadSwap32(); + UInt32 num_resources = 0; + + switch (version) { + case 1: + num_resources = in.ReadSwap32(); + + for (int i = 0; i < num_resources; i++) { + plMipmap* res_data = NULL; + UInt32 res_size = 0; + char* tmp_name = in.ReadSafeStringLong(); + std::string res_name = std::string(tmp_name); + std::string res_type = res_name.substr(res_name.length() - 4, 4); + delete tmp_name; + + // Version 1 doesn't encode format, so we'll try some simple + // extension sniffing + if (res_type == ".png") { + // Read resource stream size, but the PNG has that info in the header + // so it's not needed + res_size = in.ReadSwap32(); + res_data = plPNG::Instance().ReadFromStream(&in); + } else if (res_type == ".jpg") { + // Don't read resource stream size, as plJPEG's reader will need it + res_data = plJPEG::Instance().ReadFromStream(&in); + } else { + // Original Myst5 format only is known to support Targa, + // so default fallback is targa + // TODO - Add plTarga::ReadFromStream() + } + + (*this->ClientResources)[res_name] = res_data; + } + + break; + default: + break; + } + + in.Close(); + } + + delete wFilename; +} + +plMipmap* plClientResMgr::getResource(const char* resname) +{ + plMipmap* resmipmap = NULL; + std::map::iterator it = this->ClientResources->find(resname); + + if (it != this->ClientResources->end()) { + resmipmap = it->second; + } else { + hsAssert(resmipmap, "Unknown client resource requested."); + } + + return resmipmap; +} diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.h new file mode 100644 index 00000000..15e08028 --- /dev/null +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plClientResMgr/plClientResMgr.h @@ -0,0 +1,50 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#ifndef _plClientResMgr_h +#define _plClientResMgr_h + +#include +#include + +class plMipmap; + +class plClientResMgr { +protected: + std::map* ClientResources; + +public: + plClientResMgr(); + ~plClientResMgr(); + + void ILoadResources(const char* resfile); + + plMipmap* getResource(const char* resname); + + static plClientResMgr& Instance(void); +}; + +#endif // _plClientResMgr_