diff --git a/framework/content/typereadermanager.cpp b/framework/content/typereadermanager.cpp index 08ced0f..92e9a0a 100644 --- a/framework/content/typereadermanager.cpp +++ b/framework/content/typereadermanager.cpp @@ -11,7 +11,7 @@ namespace xna { std::vector newTypeReaders; for (size_t index = 0; index < typeCount; ++index) - { + { const auto readerTypeName = contentReader->ReadString(); const auto xnaType = readerTypeName.substr(0, readerTypeName.find(",")); @@ -24,15 +24,15 @@ namespace xna { return std::vector(); } - contentTypeReaderArray[index] = typeReader; + contentTypeReaderArray[index] = typeReader; + } - if (!newTypeReaders.empty()) { - auto manager = std::shared_ptr(new ContentTypeReaderManager(contentReader)); + if (!newTypeReaders.empty()) { + auto manager = std::shared_ptr(new ContentTypeReaderManager(contentReader)); - for (size_t i = 0; i < newTypeReaders.size(); ++i) { - auto& contentTypeReader = newTypeReaders[i]; - contentTypeReader->Initialize(manager); - } + for (size_t i = 0; i < newTypeReaders.size(); ++i) { + auto& contentTypeReader = newTypeReaders[i]; + contentTypeReader->Initialize(manager); } } @@ -44,14 +44,7 @@ namespace xna { if (!targetType) { xna_error_apply(err, XnaErrorCode::ARGUMENT_IS_NULL); return nullptr; - } - - //sptr typeReader = nullptr; - - /*if (!ContentTypeReaderManager::targetTypeToReader.contains(targetType)) { - xna_error_apply(err, XnaErrorCode::ARGUMENT_OUT_OF_RANGE); - return nullptr; - } */ + } for (auto const& item : ContentTypeReaderManager::targetTypeToReader) { auto firstHashCode = item.first->GetHashCode(); @@ -123,7 +116,6 @@ namespace xna { } ContentTypeReaderManager::targetTypeToReader.insert({ targetType, reader }); - //ContentTypeReaderManager::readerTypeToReader.insert({ reader->GetType(), reader }); ContentTypeReaderManager::readerTypeToReader.insert({ typeof(*reader), reader}); ContentTypeReaderManager::nameToReader.insert({ readerTypeName, reader }); } @@ -146,9 +138,7 @@ namespace xna { if (targetTypeToReader.empty() && readerTypeToReader.empty()) { auto typeReader = New(); auto contentTypeReader = reinterpret_pointer_cast(typeReader); - - //targetTypeToReader.insert({ typeReader->TargetType(), contentTypeReader}); - //readerTypeToReader.insert({ typeReader->GetType(), contentTypeReader}); + targetTypeToReader.insert({ typeof(), contentTypeReader}); readerTypeToReader.insert({ typeof(), contentTypeReader}); } diff --git a/framework/platform-dx/sprite.cpp b/framework/platform-dx/sprite.cpp index 6f36e61..f750a3a 100644 --- a/framework/platform-dx/sprite.cpp +++ b/framework/platform-dx/sprite.cpp @@ -25,7 +25,7 @@ namespace xna { sptr const& texture, std::vector const& glyphs, std::vector const& cropping, - std::vector const& charMap, + std::vector const& charMap, Int lineSpacing, float spacing, std::vector const& kerning, @@ -37,7 +37,7 @@ namespace xna { if (!texture) throw std::invalid_argument("SpriteFont: texture is null."); - std::vector dxGlyps(glyphs.size()); + std::vector dxGlyps(glyphs.size()); for (size_t i = 0; i < dxGlyps.size(); ++i) { DxGlyph g; @@ -45,8 +45,13 @@ namespace xna { g.Subrect.right = glyphs[i].Right(); g.Subrect.bottom = glyphs[i].Bottom(); g.Subrect.top = glyphs[i].Top(); - } - + g.Character = static_cast(charMap[i]); + g.XOffset = kerning[i].X; + g.YOffset = kerning[i].Y; + g.XAdvance = kerning[i].Z; + dxGlyps[i] = g; + } + impl = uNew(); impl->_dxSpriteFont = unew( //ID3D11ShaderResourceView* texture @@ -63,6 +68,9 @@ namespace xna { const auto defChar = static_cast(defaultCharacter.value()); impl->_dxSpriteFont->SetDefaultCharacter(defChar); } + else { + impl->_dxSpriteFont->SetDefaultCharacter(charMap[0]); + } } SpriteFont::~SpriteFont() { diff --git a/framework/platform-dx/texture.cpp b/framework/platform-dx/texture.cpp index 3b73c0d..58202ae 100644 --- a/framework/platform-dx/texture.cpp +++ b/framework/platform-dx/texture.cpp @@ -271,6 +271,7 @@ namespace xna { impl->dxShaderResource = nullptr; } + impl->dxShaderDescription.Format = impl->dxDescription.Format; impl->dxShaderDescription.Texture2D.MipLevels = impl->dxDescription.MipLevels; hr = m_device->impl->_device->CreateShaderResourceView(resource, &impl->dxShaderDescription, &impl->dxShaderResource); diff --git a/inc/content/reader.hpp b/inc/content/reader.hpp index f6c9204..241467e 100644 --- a/inc/content/reader.hpp +++ b/inc/content/reader.hpp @@ -89,7 +89,7 @@ namespace xna { auto reader = typeReaders[index]; //Verificação necessária pois a depender da situação é encontrado um reader errado - auto typeT = typeof(); + /*auto typeT = typeof(); auto typeThash = typeT->GetHashCode(); auto readerType = reader->TargetType(); @@ -103,7 +103,7 @@ namespace xna { if(reader->TargetType()->GetHashCode() != typeThash) throw std::runtime_error("ContentReader::ReadObjectInternal: wrong reader!"); - } + } */ return InvokeReader(*reader, existingInstance, err); } diff --git a/inc/content/readers/audio.hpp b/inc/content/readers/audio.hpp index 77560b1..a3988d8 100644 --- a/inc/content/readers/audio.hpp +++ b/inc/content/readers/audio.hpp @@ -10,7 +10,9 @@ namespace xna { class SoundEffectReader : public ContentTypeReaderT { public: - SoundEffectReader() : ContentTypeReaderT(typeof()) {} + SoundEffectReader() : ContentTypeReaderT(typeof()) { + ContentTypeReader::TargetIsValueType = false; + } PSoundEffect Read(ContentReader& input, PSoundEffect& existingInstance) override { const auto count1 = input.ReadInt32(); diff --git a/inc/content/readers/default.hpp b/inc/content/readers/default.hpp index 51ba7b7..3d42d16 100644 --- a/inc/content/readers/default.hpp +++ b/inc/content/readers/default.hpp @@ -235,7 +235,7 @@ namespace xna { } void Initialize(sptr const& manager) override { - elementReader = manager->GetTypeReader(typeof>()); + elementReader = manager->GetTypeReader(typeof()); } private: diff --git a/inc/content/readers/graphics.hpp b/inc/content/readers/graphics.hpp index 7a1c0df..dbaca67 100644 --- a/inc/content/readers/graphics.hpp +++ b/inc/content/readers/graphics.hpp @@ -12,7 +12,9 @@ namespace xna { class Texture2DReader : public ContentTypeReaderT { public: - Texture2DReader() : ContentTypeReaderT(typeof()) {} + Texture2DReader() : ContentTypeReaderT(typeof()) { + ContentTypeReader::TargetIsValueType = false; + } PTexture2D Read(ContentReader& input, PTexture2D& existingInstance) override { const auto format = static_cast(input.ReadInt32()); @@ -41,13 +43,15 @@ namespace xna { class SpriteFontReader : public ContentTypeReaderT { public: - SpriteFontReader() : ContentTypeReaderT(typeof()) {} + SpriteFontReader() : ContentTypeReaderT(typeof()) { + ContentTypeReader::TargetIsValueType = false; + } PSpriteFont Read(ContentReader& input, PSpriteFont& existingInstance) override { auto texture = input.ReadObject(); auto glyphs = input.ReadObject>(); auto cropping = input.ReadObject>(); - auto charMap = input.ReadObject>(); + auto charMap = input.ReadObject>(); auto lineSpacing = input.ReadInt32(); auto spacing = input.ReadSingle(); auto kerning = input.ReadObject>(); diff --git a/inc/content/typereadermanager.hpp b/inc/content/typereadermanager.hpp index c06f2e6..f188370 100644 --- a/inc/content/typereadermanager.hpp +++ b/inc/content/typereadermanager.hpp @@ -22,10 +22,14 @@ namespace xna { protected: ContentTypeReader(sptr const& targetType) : _targetType(targetType) - {} + { + //TargetIsValueType = targetType->IsValueType(); + } public: - bool TargetIsValueType{ false }; + //Vamos admitir que primariamente o alvo é tipo valor + //caso não seja deve ser setado manualmente para falso + bool TargetIsValueType{ true }; private: sptr _targetType = nullptr; diff --git a/inc/csharp/type.hpp b/inc/csharp/type.hpp index 55a375d..089e7bd 100644 --- a/inc/csharp/type.hpp +++ b/inc/csharp/type.hpp @@ -15,6 +15,7 @@ namespace xna { constexpr bool IsEnum() const { return isEnum; } constexpr bool IsValueType() const { return isValueType; } constexpr bool IsPrimitive() const { return isPrimitive; } + constexpr bool IsPointer() const { return isPointer; } virtual size_t GetHashCode() const; @@ -24,6 +25,7 @@ namespace xna { && isClass == other.isClass && isEnum == other.isEnum && isValueType == other.isValueType + && isPointer == other.isPointer && isPrimitive == other.isPrimitive; } @@ -43,6 +45,7 @@ namespace xna { bool isEnum{ false }; bool isValueType{ false }; bool isPrimitive{ false }; + bool isPointer { false }; }; template @@ -63,6 +66,13 @@ namespace xna { return enumType; } + if (std::is_pointer::value) { + auto pointerType = New(); + pointerType->fullName = typeid(T).name(); + pointerType->isPointer = true; + return pointerType; + } + if (std::is_class::value) { auto classType = New(); classType->fullName = typeid(T).name(); diff --git a/inc/graphics/sprite.hpp b/inc/graphics/sprite.hpp index 505073d..46258d5 100644 --- a/inc/graphics/sprite.hpp +++ b/inc/graphics/sprite.hpp @@ -87,7 +87,7 @@ namespace xna { sptr const& texture, std::vector const& glyphs, std::vector const& cropping, - std::vector const& charMap, + std::vector const& charMap, Int lineSpacing, float spacing, std::vector const& kerning, @@ -100,7 +100,7 @@ namespace xna { sptr textureValue = nullptr; std::vector glyphData; std::vector croppingData; - std::vector characterMap; + std::vector characterMap; Int lineSpacing{0}; float spacing{0}; std::vector kerning; diff --git a/samples/02_PlatfformerStarterKit/game.cpp b/samples/02_PlatfformerStarterKit/game.cpp index 3412d4b..8d14a35 100644 --- a/samples/02_PlatfformerStarterKit/game.cpp +++ b/samples/02_PlatfformerStarterKit/game.cpp @@ -59,8 +59,8 @@ namespace PlatformerStarterKit { spriteBatch->Begin(); level->Draw(gameTime, *spriteBatch); - - //DrawHud(); + + DrawHud(); spriteBatch->End(); @@ -126,8 +126,7 @@ namespace PlatformerStarterKit { auto center = Vector2(titleSafeArea.X + titleSafeArea.Width / 2.0f, titleSafeArea.Y + titleSafeArea.Height / 2.0f); - //string timeString = "TIME: " + to_string(level->TimeRemaining().Minutes()) + ":" + to_string(level->TimeRemaining().Seconds()); - string timeString = "TIME"; + string timeString = "TIME: " + to_string(level->TimeRemaining().Minutes()) + ":" + to_string(level->TimeRemaining().Seconds()); Color timeColor; if (level->TimeRemaining() > WarningTime || level->ReachedExit() ||