1
0
mirror of https://github.com/borgesdan/xn65 synced 2024-12-29 21:54:47 +01:00

Implementações em String e Texture

This commit is contained in:
Danilo 2024-05-31 22:30:45 -03:00
parent fcb6ed41bd
commit 4be6f4abcc
11 changed files with 57 additions and 39 deletions

View File

@ -11,7 +11,7 @@ namespace xna {
std::vector<PContentTypeReader> newTypeReaders; std::vector<PContentTypeReader> newTypeReaders;
for (size_t index = 0; index < typeCount; ++index) for (size_t index = 0; index < typeCount; ++index)
{ {
const auto readerTypeName = contentReader->ReadString(); const auto readerTypeName = contentReader->ReadString();
const auto xnaType = readerTypeName.substr(0, readerTypeName.find(",")); const auto xnaType = readerTypeName.substr(0, readerTypeName.find(","));
@ -24,15 +24,15 @@ namespace xna {
return std::vector<PContentTypeReader>(); return std::vector<PContentTypeReader>();
} }
contentTypeReaderArray[index] = typeReader; contentTypeReaderArray[index] = typeReader;
}
if (!newTypeReaders.empty()) { if (!newTypeReaders.empty()) {
auto manager = std::shared_ptr<ContentTypeReaderManager>(new ContentTypeReaderManager(contentReader)); auto manager = std::shared_ptr<ContentTypeReaderManager>(new ContentTypeReaderManager(contentReader));
for (size_t i = 0; i < newTypeReaders.size(); ++i) { for (size_t i = 0; i < newTypeReaders.size(); ++i) {
auto& contentTypeReader = newTypeReaders[i]; auto& contentTypeReader = newTypeReaders[i];
contentTypeReader->Initialize(manager); contentTypeReader->Initialize(manager);
}
} }
} }
@ -44,14 +44,7 @@ namespace xna {
if (!targetType) { if (!targetType) {
xna_error_apply(err, XnaErrorCode::ARGUMENT_IS_NULL); xna_error_apply(err, XnaErrorCode::ARGUMENT_IS_NULL);
return nullptr; return nullptr;
} }
//sptr<ContentTypeReader> typeReader = nullptr;
/*if (!ContentTypeReaderManager::targetTypeToReader.contains(targetType)) {
xna_error_apply(err, XnaErrorCode::ARGUMENT_OUT_OF_RANGE);
return nullptr;
} */
for (auto const& item : ContentTypeReaderManager::targetTypeToReader) { for (auto const& item : ContentTypeReaderManager::targetTypeToReader) {
auto firstHashCode = item.first->GetHashCode(); auto firstHashCode = item.first->GetHashCode();
@ -123,7 +116,6 @@ namespace xna {
} }
ContentTypeReaderManager::targetTypeToReader.insert({ targetType, reader }); ContentTypeReaderManager::targetTypeToReader.insert({ targetType, reader });
//ContentTypeReaderManager::readerTypeToReader.insert({ reader->GetType(), reader });
ContentTypeReaderManager::readerTypeToReader.insert({ typeof(*reader), reader}); ContentTypeReaderManager::readerTypeToReader.insert({ typeof(*reader), reader});
ContentTypeReaderManager::nameToReader.insert({ readerTypeName, reader }); ContentTypeReaderManager::nameToReader.insert({ readerTypeName, reader });
} }
@ -146,9 +138,7 @@ namespace xna {
if (targetTypeToReader.empty() && readerTypeToReader.empty()) { if (targetTypeToReader.empty() && readerTypeToReader.empty()) {
auto typeReader = New<ObjectReader>(); auto typeReader = New<ObjectReader>();
auto contentTypeReader = reinterpret_pointer_cast<ContentTypeReader>(typeReader); auto contentTypeReader = reinterpret_pointer_cast<ContentTypeReader>(typeReader);
//targetTypeToReader.insert({ typeReader->TargetType(), contentTypeReader});
//readerTypeToReader.insert({ typeReader->GetType(), contentTypeReader});
targetTypeToReader.insert({ typeof<Object>(), contentTypeReader}); targetTypeToReader.insert({ typeof<Object>(), contentTypeReader});
readerTypeToReader.insert({ typeof<ObjectReader>(), contentTypeReader}); readerTypeToReader.insert({ typeof<ObjectReader>(), contentTypeReader});
} }

View File

@ -25,7 +25,7 @@ namespace xna {
sptr<Texture2D> const& texture, sptr<Texture2D> const& texture,
std::vector<Rectangle> const& glyphs, std::vector<Rectangle> const& glyphs,
std::vector<Rectangle> const& cropping, std::vector<Rectangle> const& cropping,
std::vector<char> const& charMap, std::vector<Char> const& charMap,
Int lineSpacing, Int lineSpacing,
float spacing, float spacing,
std::vector<Vector3> const& kerning, std::vector<Vector3> const& kerning,
@ -37,7 +37,7 @@ namespace xna {
if (!texture) if (!texture)
throw std::invalid_argument("SpriteFont: texture is null."); throw std::invalid_argument("SpriteFont: texture is null.");
std::vector<DxGlyph> dxGlyps(glyphs.size()); std::vector<DxGlyph> dxGlyps(glyphs.size());
for (size_t i = 0; i < dxGlyps.size(); ++i) { for (size_t i = 0; i < dxGlyps.size(); ++i) {
DxGlyph g; DxGlyph g;
@ -45,8 +45,13 @@ namespace xna {
g.Subrect.right = glyphs[i].Right(); g.Subrect.right = glyphs[i].Right();
g.Subrect.bottom = glyphs[i].Bottom(); g.Subrect.bottom = glyphs[i].Bottom();
g.Subrect.top = glyphs[i].Top(); g.Subrect.top = glyphs[i].Top();
} g.Character = static_cast<Uint>(charMap[i]);
g.XOffset = kerning[i].X;
g.YOffset = kerning[i].Y;
g.XAdvance = kerning[i].Z;
dxGlyps[i] = g;
}
impl = uNew<PlatformImplementation>(); impl = uNew<PlatformImplementation>();
impl->_dxSpriteFont = unew<DxSpriteFont>( impl->_dxSpriteFont = unew<DxSpriteFont>(
//ID3D11ShaderResourceView* texture //ID3D11ShaderResourceView* texture
@ -63,6 +68,9 @@ namespace xna {
const auto defChar = static_cast<wchar_t>(defaultCharacter.value()); const auto defChar = static_cast<wchar_t>(defaultCharacter.value());
impl->_dxSpriteFont->SetDefaultCharacter(defChar); impl->_dxSpriteFont->SetDefaultCharacter(defChar);
} }
else {
impl->_dxSpriteFont->SetDefaultCharacter(charMap[0]);
}
} }
SpriteFont::~SpriteFont() { SpriteFont::~SpriteFont() {

View File

@ -271,6 +271,7 @@ namespace xna {
impl->dxShaderResource = nullptr; impl->dxShaderResource = nullptr;
} }
impl->dxShaderDescription.Format = impl->dxDescription.Format;
impl->dxShaderDescription.Texture2D.MipLevels = impl->dxDescription.MipLevels; impl->dxShaderDescription.Texture2D.MipLevels = impl->dxDescription.MipLevels;
hr = m_device->impl->_device->CreateShaderResourceView(resource, &impl->dxShaderDescription, &impl->dxShaderResource); hr = m_device->impl->_device->CreateShaderResourceView(resource, &impl->dxShaderDescription, &impl->dxShaderResource);

View File

@ -89,7 +89,7 @@ namespace xna {
auto reader = typeReaders[index]; auto reader = typeReaders[index];
//Verificação necessária pois a depender da situação é encontrado um reader errado //Verificação necessária pois a depender da situação é encontrado um reader errado
auto typeT = typeof<T>(); /*auto typeT = typeof<T>();
auto typeThash = typeT->GetHashCode(); auto typeThash = typeT->GetHashCode();
auto readerType = reader->TargetType(); auto readerType = reader->TargetType();
@ -103,7 +103,7 @@ namespace xna {
if(reader->TargetType()->GetHashCode() != typeThash) if(reader->TargetType()->GetHashCode() != typeThash)
throw std::runtime_error("ContentReader::ReadObjectInternal: wrong reader!"); throw std::runtime_error("ContentReader::ReadObjectInternal: wrong reader!");
} } */
return InvokeReader<T>(*reader, existingInstance, err); return InvokeReader<T>(*reader, existingInstance, err);
} }

View File

@ -10,7 +10,9 @@
namespace xna { namespace xna {
class SoundEffectReader : public ContentTypeReaderT<PSoundEffect> { class SoundEffectReader : public ContentTypeReaderT<PSoundEffect> {
public: public:
SoundEffectReader() : ContentTypeReaderT(typeof<PSoundEffect>()) {} SoundEffectReader() : ContentTypeReaderT(typeof<PSoundEffect>()) {
ContentTypeReader::TargetIsValueType = false;
}
PSoundEffect Read(ContentReader& input, PSoundEffect& existingInstance) override { PSoundEffect Read(ContentReader& input, PSoundEffect& existingInstance) override {
const auto count1 = input.ReadInt32(); const auto count1 = input.ReadInt32();

View File

@ -235,7 +235,7 @@ namespace xna {
} }
void Initialize(sptr<ContentTypeReaderManager> const& manager) override { void Initialize(sptr<ContentTypeReaderManager> const& manager) override {
elementReader = manager->GetTypeReader(typeof<std::vector<T>>()); elementReader = manager->GetTypeReader(typeof<T>());
} }
private: private:

View File

@ -12,7 +12,9 @@
namespace xna { namespace xna {
class Texture2DReader : public ContentTypeReaderT<PTexture2D> { class Texture2DReader : public ContentTypeReaderT<PTexture2D> {
public: public:
Texture2DReader() : ContentTypeReaderT(typeof<PTexture2D>()) {} Texture2DReader() : ContentTypeReaderT(typeof<PTexture2D>()) {
ContentTypeReader::TargetIsValueType = false;
}
PTexture2D Read(ContentReader& input, PTexture2D& existingInstance) override { PTexture2D Read(ContentReader& input, PTexture2D& existingInstance) override {
const auto format = static_cast<SurfaceFormat>(input.ReadInt32()); const auto format = static_cast<SurfaceFormat>(input.ReadInt32());
@ -41,13 +43,15 @@ namespace xna {
class SpriteFontReader : public ContentTypeReaderT<PSpriteFont> { class SpriteFontReader : public ContentTypeReaderT<PSpriteFont> {
public: public:
SpriteFontReader() : ContentTypeReaderT(typeof<PSpriteFont>()) {} SpriteFontReader() : ContentTypeReaderT(typeof<PSpriteFont>()) {
ContentTypeReader::TargetIsValueType = false;
}
PSpriteFont Read(ContentReader& input, PSpriteFont& existingInstance) override { PSpriteFont Read(ContentReader& input, PSpriteFont& existingInstance) override {
auto texture = input.ReadObject<PTexture2D>(); auto texture = input.ReadObject<PTexture2D>();
auto glyphs = input.ReadObject<std::vector<Rectangle>>(); auto glyphs = input.ReadObject<std::vector<Rectangle>>();
auto cropping = input.ReadObject<std::vector<Rectangle>>(); auto cropping = input.ReadObject<std::vector<Rectangle>>();
auto charMap = input.ReadObject<std::vector<char>>(); auto charMap = input.ReadObject<std::vector<Char>>();
auto lineSpacing = input.ReadInt32(); auto lineSpacing = input.ReadInt32();
auto spacing = input.ReadSingle(); auto spacing = input.ReadSingle();
auto kerning = input.ReadObject<std::vector<Vector3>>(); auto kerning = input.ReadObject<std::vector<Vector3>>();

View File

@ -22,10 +22,14 @@ namespace xna {
protected: protected:
ContentTypeReader(sptr<Type> const& targetType) : _targetType(targetType) ContentTypeReader(sptr<Type> const& targetType) : _targetType(targetType)
{} {
//TargetIsValueType = targetType->IsValueType();
}
public: 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: private:
sptr<Type> _targetType = nullptr; sptr<Type> _targetType = nullptr;

View File

@ -15,6 +15,7 @@ namespace xna {
constexpr bool IsEnum() const { return isEnum; } constexpr bool IsEnum() const { return isEnum; }
constexpr bool IsValueType() const { return isValueType; } constexpr bool IsValueType() const { return isValueType; }
constexpr bool IsPrimitive() const { return isPrimitive; } constexpr bool IsPrimitive() const { return isPrimitive; }
constexpr bool IsPointer() const { return isPointer; }
virtual size_t GetHashCode() const; virtual size_t GetHashCode() const;
@ -24,6 +25,7 @@ namespace xna {
&& isClass == other.isClass && isClass == other.isClass
&& isEnum == other.isEnum && isEnum == other.isEnum
&& isValueType == other.isValueType && isValueType == other.isValueType
&& isPointer == other.isPointer
&& isPrimitive == other.isPrimitive; && isPrimitive == other.isPrimitive;
} }
@ -43,6 +45,7 @@ namespace xna {
bool isEnum{ false }; bool isEnum{ false };
bool isValueType{ false }; bool isValueType{ false };
bool isPrimitive{ false }; bool isPrimitive{ false };
bool isPointer { false };
}; };
template <class T> template <class T>
@ -63,6 +66,13 @@ namespace xna {
return enumType; return enumType;
} }
if (std::is_pointer<T>::value) {
auto pointerType = New<Type>();
pointerType->fullName = typeid(T).name();
pointerType->isPointer = true;
return pointerType;
}
if (std::is_class<T>::value) { if (std::is_class<T>::value) {
auto classType = New<Type>(); auto classType = New<Type>();
classType->fullName = typeid(T).name(); classType->fullName = typeid(T).name();

View File

@ -87,7 +87,7 @@ namespace xna {
sptr<Texture2D> const& texture, sptr<Texture2D> const& texture,
std::vector<Rectangle> const& glyphs, std::vector<Rectangle> const& glyphs,
std::vector<Rectangle> const& cropping, std::vector<Rectangle> const& cropping,
std::vector<char> const& charMap, std::vector<Char> const& charMap,
Int lineSpacing, Int lineSpacing,
float spacing, float spacing,
std::vector<Vector3> const& kerning, std::vector<Vector3> const& kerning,
@ -100,7 +100,7 @@ namespace xna {
sptr<Texture2D> textureValue = nullptr; sptr<Texture2D> textureValue = nullptr;
std::vector<Rectangle> glyphData; std::vector<Rectangle> glyphData;
std::vector<Rectangle> croppingData; std::vector<Rectangle> croppingData;
std::vector<char> characterMap; std::vector<Char> characterMap;
Int lineSpacing{0}; Int lineSpacing{0};
float spacing{0}; float spacing{0};
std::vector<Vector3> kerning; std::vector<Vector3> kerning;

View File

@ -59,8 +59,8 @@ namespace PlatformerStarterKit {
spriteBatch->Begin(); spriteBatch->Begin();
level->Draw(gameTime, *spriteBatch); level->Draw(gameTime, *spriteBatch);
//DrawHud(); DrawHud();
spriteBatch->End(); spriteBatch->End();
@ -126,8 +126,7 @@ namespace PlatformerStarterKit {
auto center = Vector2(titleSafeArea.X + titleSafeArea.Width / 2.0f, auto center = Vector2(titleSafeArea.X + titleSafeArea.Width / 2.0f,
titleSafeArea.Y + titleSafeArea.Height / 2.0f); titleSafeArea.Y + titleSafeArea.Height / 2.0f);
//string timeString = "TIME: " + to_string(level->TimeRemaining().Minutes()) + ":" + to_string(level->TimeRemaining().Seconds()); string timeString = "TIME: " + to_string(level->TimeRemaining().Minutes()) + ":" + to_string(level->TimeRemaining().Seconds());
string timeString = "TIME";
Color timeColor; Color timeColor;
if (level->TimeRemaining() > WarningTime || if (level->TimeRemaining() > WarningTime ||
level->ReachedExit() || level->ReachedExit() ||