From d3ceb91ca106e3e3faf357e27991fc05097cb396 Mon Sep 17 00:00:00 2001 From: Danilo Date: Mon, 6 May 2024 11:35:27 -0300 Subject: [PATCH] =?UTF-8?q?Implementa=C3=A7=C3=B5es=20em=20Content?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- framework/content/manager.hpp | 18 +++++----- framework/content/reader.hpp | 34 +++++++++---------- framework/content/typereadermanager.hpp | 6 ++-- .../content-readers/texture2Dreader-dx.hpp | 12 +++++-- framework/xna.cpp | 21 +++++------- framework/xna.h | 1 + 6 files changed, 48 insertions(+), 44 deletions(-) diff --git a/framework/content/manager.hpp b/framework/content/manager.hpp index 6c4e250..49ce509 100644 --- a/framework/content/manager.hpp +++ b/framework/content/manager.hpp @@ -15,15 +15,16 @@ namespace xna { friend class ContentReader; ContentManager(String const& rootDirectory, sptr const& services) : - _rootDirectory(rootDirectory), - _services(services), - _path(rootDirectory){}; + _rootDirectory(rootDirectory), + _path(rootDirectory){ + _services = services; + }; virtual ~ContentManager(){ Unload(); } - sptr Services() { + static sptr Services() { return _services; } @@ -44,14 +45,14 @@ namespace xna { } template - T Load(String const& assetName) { + sptr Load(String const& assetName) { if (assetName.empty()) return nullptr; if (_loadedAssets.contains(assetName)) { auto& ptr = _loadedAssets[assetName]; auto obj1 = reinterpret_pointer_cast(ptr); - return *obj1; + return obj1; } auto obj2 = ReadAsset(assetName); @@ -61,7 +62,7 @@ namespace xna { protected: template - T ReadAsset(String const& assetName) { + sptr ReadAsset(String const& assetName) { auto input = OpenStream(assetName); auto contentReader = ContentReader::Create(this, input, assetName); @@ -80,7 +81,8 @@ namespace xna { std::map> _loadedAssets; inline const static String contentExtension = ".xnb"; std::vector byteBuffer; - sptr _services = nullptr; + + inline static sptr _services = nullptr; }; } diff --git a/framework/content/reader.hpp b/framework/content/reader.hpp index 5ae62c7..8804308 100644 --- a/framework/content/reader.hpp +++ b/framework/content/reader.hpp @@ -17,13 +17,13 @@ namespace xna { static sptr Create(ContentManager* contentManager, sptr& input, String const& assetName); template - T ReadAsset(); + sptr ReadAsset(); template - T ReadObject(); + sptr ReadObject(); template - T ReadObject(T existingInstance); + sptr ReadObject(T existingInstance); Vector2 ReadVector2(); Vector3 ReadVector3(); @@ -45,10 +45,10 @@ namespace xna { Int ReadHeader(); template - T ReadObjectInternal(std::any& existingInstance, xna_error_nullarg); + sptr ReadObjectInternal(std::any& existingInstance, xna_error_nullarg); template - T InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_nullarg); + sptr InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_nullarg); private: ContentManager* _contentManager = nullptr; @@ -63,19 +63,19 @@ namespace xna { }; template - inline T ContentReader::ReadObjectInternal(std::any& existingInstance, xna_error_ptr_arg) + inline sptr ContentReader::ReadObjectInternal(std::any& existingInstance, xna_error_ptr_arg) { const auto num = Read7BitEncodedInt(); if (num == 0) { - return T(); + return New(); } const auto index = num - 1; if (index >= typeReaders.size()) { xna_error_apply(err, XnaErrorCode::ARGUMENT_OUT_OF_RANGE); - return T(); + return New(); } auto reader = typeReaders[index]; @@ -83,38 +83,38 @@ namespace xna { } template - inline T ContentReader::InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_ptr_arg) + inline sptr ContentReader::InvokeReader(ContentTypeReader& reader, std::any& existingInstance, xna_error_ptr_arg) { auto contentTypeReader = reinterpret_cast*>(&reader); - T objB = T(); + sptr objB = nullptr; if (contentTypeReader) { - T existingInstance1 = existingInstance.has_value() ? std::any_cast(existingInstance) : T(); - objB = contentTypeReader->Read(*this, existingInstance1); + auto existingInstance1 = existingInstance.has_value() ? std::any_cast>(existingInstance) : nullptr; + objB = contentTypeReader->Read(*this, *existingInstance1); return objB; } - return T(); + return New(); } template - inline T ContentReader::ReadAsset() + inline sptr ContentReader::ReadAsset() { const auto sharedResourceCount = ReadHeader(); - T obj = ReadObject(); + auto obj = ReadObject(); //this.ReadSharedResources(sharedResourceCount); return obj; } template - inline T ContentReader::ReadObject() + inline sptr ContentReader::ReadObject() { auto a = std::any(); return ReadObjectInternal(a); } template - inline T ContentReader::ReadObject(T existingInstance) + inline sptr ContentReader::ReadObject(T existingInstance) { return ReadObjectInternal(std::any(existingInstance)); } diff --git a/framework/content/typereadermanager.hpp b/framework/content/typereadermanager.hpp index 9bab3c2..12342a9 100644 --- a/framework/content/typereadermanager.hpp +++ b/framework/content/typereadermanager.hpp @@ -41,7 +41,7 @@ namespace xna { return std::any(); } - virtual T Read(ContentReader& input, T& existingInstance) = 0; + virtual sptr Read(ContentReader& input, T& existingInstance) = 0; }; //-------------------------------------------------------// @@ -175,8 +175,8 @@ namespace xna { }); } - virtual Object Read(ContentReader& input, Object& existingInstance) override { - return Object(); + virtual sptr Read(ContentReader& input, Object& existingInstance) override { + return nullptr; } }; } diff --git a/framework/platform/content-readers/texture2Dreader-dx.hpp b/framework/platform/content-readers/texture2Dreader-dx.hpp index 7ea9a05..1ae47ff 100644 --- a/framework/platform/content-readers/texture2Dreader-dx.hpp +++ b/framework/platform/content-readers/texture2Dreader-dx.hpp @@ -3,24 +3,30 @@ #include "../../content/reader.hpp" #include "../texture-dx.hpp" +#include "../../content/manager.hpp" +#include "../../csharp/type.hpp" namespace xna { class Texture2DReader : public ContentTypeReaderT { public: Texture2DReader() : ContentTypeReaderT(typeof()){} - Texture2D Read(ContentReader& input, Texture2D& existingInstance) override{ + sptr Read(ContentReader& input, Texture2D& existingInstance) override{ const auto format = static_cast(input.ReadInt32()); const auto width = input.ReadInt32(); const auto height = input.ReadInt32(); const auto mipMaps = input.ReadInt32(); - auto texture2D = Texture2D(nullptr, width, height, mipMaps, format); + + auto a_device = ContentManager::Services()->GetService(*typeof()); + auto device = std::any_cast>(a_device); + + auto texture2D = New(device.get(), width, height, mipMaps, format); for (size_t level = 0; level < mipMaps; ++level) { auto elementCount = input.ReadInt32(); std::vector data = input.ReadByteBuffer(elementCount); - texture2D.SetData(level, nullptr, data, 0, elementCount); + texture2D->SetData(level, nullptr, data, 0, elementCount); } return texture2D; diff --git a/framework/xna.cpp b/framework/xna.cpp index 3db47bb..571e62d 100644 --- a/framework/xna.cpp +++ b/framework/xna.cpp @@ -19,23 +19,18 @@ namespace xna { void Initialize() override { graphics->Initialize(); + + std::any device = _graphicsDevice; + _services->AddService(*typeof(), device); + Game::Initialize(); } void LoadContent() override { spriteBatch = New(*_graphicsDevice); - XnaErrorCode err{0}; - //texture = Texture2D::FromStream(*_graphicsDevice, "D:\\sprite.jpg", &err); - //texture = New(_graphicsDevice.get(), 256, 256); - //std::vector data(256 * 256, 4278190080U); - //std::vector data(256 * 256, 0xffffffff); - //std::vector data(256 * 256, 4278190080U); - //texture->SetData(data, 0, data.size()); - tx = contentManager->Load("Idle"); - tx.Bind(_graphicsDevice.get()); - tx.Initialize(&err); - + XnaErrorCode err{0}; + texture = contentManager->Load("Idle"); Game::LoadContent(); } @@ -50,7 +45,7 @@ namespace xna { _graphicsDevice->Clear(Colors::CornflowerBlue); spriteBatch->Begin(); - spriteBatch->Draw(tx, position, Colors::White); + spriteBatch->Draw(*texture, position, Colors::White); spriteBatch->End(); Game::Draw(gameTime); @@ -66,7 +61,7 @@ namespace xna { MouseState oldState{}; float vel = 1; int var = 0; - Texture2D tx; + //Texture2D tx; }; } diff --git a/framework/xna.h b/framework/xna.h index cd43145..eac110e 100644 --- a/framework/xna.h +++ b/framework/xna.h @@ -26,5 +26,6 @@ #include "content/manager.hpp" #include "content/decstream.hpp" #include "platform/init-dx.hpp" +#include "csharp/type.hpp" // TODO: Reference additional headers your program requires here.