diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt index ee514a7..9d2d114 100644 --- a/framework/CMakeLists.txt +++ b/framework/CMakeLists.txt @@ -5,16 +5,14 @@ # Add source to this project's executable. add_library (Xn65 STATIC "csharp/stream.cpp" +"csharp/binary.cpp" +"csharp/type.cpp" "game/component.cpp" +"game/servicecontainer.cpp" "content/manager.cpp" "content/reader.cpp" -"csharp/binary.cpp" "content/lzx/decoder.cpp" - "content/typereadermanager.cpp" -"csharp/object.cpp" -"csharp/type.cpp" -"game/servicecontainer.cpp" "common/color.cpp" "common/collision.cpp" "common/gjk.cpp" @@ -29,7 +27,6 @@ add_library (Xn65 STATIC "platform-dx/blendstate.cpp" "platform-dx/game.cpp" "platform-dx/gdevicemanager.cpp" - "platform-dx/rasterizerstate.cpp" "platform-dx/samplerstate.cpp" "platform-dx/sprite.cpp" @@ -40,8 +37,10 @@ add_library (Xn65 STATIC "platform-dx/soundeffect.cpp" "platform-dx/displaymode.cpp" "platform-dx/init.cpp" - -"platform-dx/audioengine.cpp" "graphics/gresource.cpp" "platform-dx/effect.cpp" "platform-dx/impl.cpp") +"platform-dx/audioengine.cpp" +"graphics/gresource.cpp" +"platform-dx/effect.cpp" + "exception.cpp") if (CMAKE_VERSION VERSION_GREATER 3.12) set_property(TARGET Xn65 PROPERTY CXX_STANDARD 20) @@ -53,6 +52,6 @@ find_package(directxtk CONFIG REQUIRED) target_link_libraries( Xn65 D3d11.lib dxgi.lib dxguid.lib d3dcompiler.lib Microsoft::DirectXTK dxguid.lib - "${PROJECT_INCLUDES_DIR}/libmspack/mspack.lib" - "${PROJECT_INCLUDES_DIR}/effects11/Effects11.lib" + #"${PROJECT_INCLUDES_DIR}/libmspack/mspack.lib" + #"${PROJECT_INCLUDES_DIR}/effects11/Effects11.lib" ) diff --git a/framework/content/manager.cpp b/framework/content/manager.cpp index c20cb6d..79bce6e 100644 --- a/framework/content/manager.cpp +++ b/framework/content/manager.cpp @@ -2,11 +2,8 @@ namespace xna { sptr ContentManager::OpenStream(String const& assetName) const { - const String filePath = _rootDirectory + "\\" + assetName + contentExtension; - const auto stream = snew(filePath, FileMode::Open); - - if (stream->IsClosed()) - return nullptr; + const String filePath = rootDirectory + "\\" + assetName + contentExtension; + const auto stream = snew(filePath, FileMode::Open); return reinterpret_pointer_cast(stream); } diff --git a/framework/csharp/binary.cpp b/framework/csharp/binary.cpp index c5639a7..dba28e0 100644 --- a/framework/csharp/binary.cpp +++ b/framework/csharp/binary.cpp @@ -2,6 +2,13 @@ #include "xna/csharp/buffer.hpp" namespace xna { + BinaryReader::BinaryReader(sptr const& input) { + Exception::ThrowIfNull(input, nameof(input)); + + stream = input; + buffer = std::vector(bufferLength); + } + Int BinaryReader::PeekChar() { const auto position = stream->Position(); @@ -256,7 +263,7 @@ namespace xna { void BinaryReader::FillBuffer(Int numBytes) { if (numBytes < 0 || numBytes > buffer.size()) { - throw std::out_of_range("numBytes"); + Exception::Throw(Exception::OUT_OF_BOUNDS); } Int bytesRead = 0; @@ -266,7 +273,7 @@ namespace xna { n = stream->ReadByte(); if (n == -1){ - throw std::runtime_error("End of file."); + Exception::Throw(Exception::END_OF_FILE); } buffer[0] = static_cast(n); @@ -277,7 +284,7 @@ namespace xna { n = stream->Read(buffer, bytesRead, numBytes - bytesRead); if (n == 0) { - throw std::runtime_error("End of file."); + Exception::Throw(Exception::END_OF_FILE); } bytesRead += n; @@ -432,50 +439,58 @@ namespace xna { //Binary Writer + BinaryWriter::BinaryWriter(sptr const& stream) { + Exception::ThrowIfNull(stream, nameof(stream)); + + OutStream = stream; + _buffer = std::vector(16); + } + Long BinaryWriter::Seek(Int offset, SeekOrigin origin) { - return _stream->Seek(offset, origin); + return OutStream->Seek(offset, origin); } void BinaryWriter::Write(bool value) { - _buffer[0] = value ? (Byte)1 : (Byte)0; - _stream->Write(_buffer, 0, 1); + _buffer[0] = value ? static_cast(1) : static_cast(0); + OutStream->Write(_buffer, 0, 1); } void BinaryWriter::Write(Byte value) { - _stream->WriteByte(value); + OutStream->WriteByte(value); } void BinaryWriter::Write(Sbyte value) { - _stream->WriteByte(static_cast(value)); + OutStream->WriteByte(static_cast(value)); } void BinaryWriter::Write(Byte const* buffer, Int bufferLength) { - _stream->Write(buffer, bufferLength, 0, bufferLength); + OutStream->Write(buffer, bufferLength, 0, bufferLength); } void BinaryWriter::Write(std::vector const& buffer) { - _stream->Write(buffer, 0, static_cast(buffer.size())); + OutStream->Write(buffer, 0, static_cast(buffer.size())); } + void BinaryWriter::Write(Byte const* buffer, Int bufferLength, Int index, Int count) { - _stream->Write(buffer, bufferLength, index, count); + OutStream->Write(buffer, bufferLength, index, count); } void BinaryWriter::Write(std::vector const& buffer, Int index, Int count) { - _stream->Write(buffer, index, count); + OutStream->Write(buffer, index, count); } void BinaryWriter::Write(Char ch) { _buffer[0] = static_cast(ch); - _stream->Write(_buffer, 0, 1); + OutStream->Write(_buffer, 0, 1); } void BinaryWriter::Write(double value) @@ -490,21 +505,21 @@ namespace xna { _buffer[6] = static_cast(num >> 48); _buffer[7] = static_cast(num >> 56); - _stream->Write(_buffer, 0, 8); + OutStream->Write(_buffer, 0, 8); } void BinaryWriter::Write(Short value) { _buffer[0] = static_cast(value); _buffer[1] = static_cast((Uint)value >> 8); - _stream->Write(_buffer, 0, 2); + OutStream->Write(_buffer, 0, 2); } void BinaryWriter::Write(Ushort value) { _buffer[0] = static_cast(value); _buffer[1] = static_cast((Uint)value >> 8); - _stream->Write(_buffer, 0, 2); + OutStream->Write(_buffer, 0, 2); } void BinaryWriter::Write(Int value) @@ -513,7 +528,7 @@ namespace xna { _buffer[1] = static_cast(value >> 8); _buffer[2] = static_cast(value >> 16); _buffer[3] = static_cast(value >> 24); - _stream->Write(_buffer, 0, 4); + OutStream->Write(_buffer, 0, 4); } void BinaryWriter::Write(Uint value) @@ -522,7 +537,7 @@ namespace xna { _buffer[1] = static_cast(value >> 8); _buffer[2] = static_cast(value >> 16); _buffer[3] = static_cast(value >> 24); - _stream->Write(_buffer, 0, 4); + OutStream->Write(_buffer, 0, 4); } void BinaryWriter::Write(Ulong value) @@ -535,7 +550,7 @@ namespace xna { _buffer[5] = static_cast(value >> 40); _buffer[6] = static_cast(value >> 48); _buffer[7] = static_cast(value >> 56); - _stream->Write(_buffer, 0, 8); + OutStream->Write(_buffer, 0, 8); } void BinaryWriter::Write(float value) @@ -545,7 +560,7 @@ namespace xna { _buffer[1] = static_cast(num >> 8); _buffer[2] = static_cast(num >> 16); _buffer[3] = static_cast(num >> 24); - _stream->Write(_buffer, 0, 4); + OutStream->Write(_buffer, 0, 4); } void BinaryWriter::Write(std::string const& value) @@ -557,7 +572,7 @@ namespace xna { { Write7BitEncodedInt(static_cast(stringLength)); const auto b = reinterpret_cast(_string); - _stream->Write(b, static_cast(stringLength), 0, static_cast(stringLength)); + OutStream->Write(b, static_cast(stringLength), 0, static_cast(stringLength)); } void BinaryWriter::Write7BitEncodedInt(Int value) @@ -579,6 +594,6 @@ namespace xna { _buffer[5] = static_cast(value >> 40); _buffer[6] = static_cast(value >> 48); _buffer[7] = static_cast(value >> 56); - _stream->Write(_buffer, 0, 8); + OutStream->Write(_buffer, 0, 8); } } \ No newline at end of file diff --git a/framework/csharp/object.cpp b/framework/csharp/object.cpp deleted file mode 100644 index ed87573..0000000 --- a/framework/csharp/object.cpp +++ /dev/null @@ -1,12 +0,0 @@ -#include "xna/csharp/object.hpp" -#include "xna/csharp/type.hpp" - -namespace xna { - size_t Object::GetHashCode() const - { - size_t seed = 0; - XnaHelper::HashCombine(seed, this); - - return seed; - } -} \ No newline at end of file diff --git a/framework/csharp/stream.cpp b/framework/csharp/stream.cpp index 17782e0..09b2dd1 100644 --- a/framework/csharp/stream.cpp +++ b/framework/csharp/stream.cpp @@ -32,8 +32,6 @@ namespace xna { return -1; } - assertm(_position >= 0, "position >= 0"); - _position = static_cast(p); return _position; } @@ -170,14 +168,13 @@ namespace xna { _fstream.open(path.c_str(), flags); if (!_fstream.good()) - _closed = true; + Exception::Throw("Failed to open file: " + path); } FileStream::FileStream(String const& path) { int flags = std::fstream::in | std::fstream::out | std::fstream::binary; - //| std::fstream::ate; const auto exists = std::filesystem::exists(path); @@ -187,7 +184,7 @@ namespace xna { _fstream.open(path.c_str(), flags); if (!_fstream.good()) - _closed = true; + Exception::Throw("Failed to open file: " + path); } Int FileStream::Length() { diff --git a/framework/exception.cpp b/framework/exception.cpp new file mode 100644 index 0000000..9fca374 --- /dev/null +++ b/framework/exception.cpp @@ -0,0 +1,37 @@ +#include "xna/exception.hpp" + +namespace xna { + void Exception::Throw(std::string const& message, std::source_location const& location) { + std::string error; + + error.append("Exception in: "); +#if _DEBUG + error.append(location.file_name()); + error.append("("); + error.append(std::to_string(location.line())); + error.append(":"); + error.append(std::to_string(location.column())); + error.append(") "); +#endif + error.append("': "); + error.append(location.function_name()); + error.append("': "); + error.append(message); + error.append("\n"); + + throw std::runtime_error(error); + } + + void Exception::ThrowIfNull(void const* argument, std::string const& argumentName, std::source_location const& location) { + if (argument) + return; + + std::string error; + + error.append("The value of "); + error.append(argumentName); + error.append(" is null."); + + Throw(error); + } +} \ No newline at end of file diff --git a/framework/platform-dx/adapter.cpp b/framework/platform-dx/adapter.cpp index fca35b9..a5e4132 100644 --- a/framework/platform-dx/adapter.cpp +++ b/framework/platform-dx/adapter.cpp @@ -1,7 +1,7 @@ #include "xna/graphics/adapter.hpp" #include "xna/graphics/displaymode.hpp" #include "xna/game/gdevicemanager.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { static size_t getDisplayModesCount(IDXGIAdapter* adapter); @@ -15,7 +15,7 @@ namespace xna { comptr pFactory = nullptr; if FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)pFactory.GetAddressOf())) - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); comptr pAdapter = nullptr; @@ -35,7 +35,7 @@ namespace xna { comptr pFactory = nullptr; if FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)pFactory.GetAddressOf())) - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); comptr pAdapter = nullptr; UINT count = 0; diff --git a/framework/platform-dx/audioengine.cpp b/framework/platform-dx/audioengine.cpp index fe6b877..56f8226 100644 --- a/framework/platform-dx/audioengine.cpp +++ b/framework/platform-dx/audioengine.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { void AudioEngine::Initialize() { diff --git a/framework/platform-dx/blendstate.cpp b/framework/platform-dx/blendstate.cpp index 73a4de7..74ffe21 100644 --- a/framework/platform-dx/blendstate.cpp +++ b/framework/platform-dx/blendstate.cpp @@ -1,6 +1,6 @@ #include "xna/graphics/blendstate.hpp" #include "xna/graphics/gresource.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { BlendState::BlendState() : BlendState(nullptr) {} @@ -98,7 +98,7 @@ namespace xna { bool BlendState::Initialize() { if (!m_device || !m_device->impl->_device) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } if (impl->dxBlendState) { @@ -110,7 +110,7 @@ namespace xna { impl->dxBlendState.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } return true; @@ -118,11 +118,11 @@ namespace xna { bool BlendState::Apply() { if (!m_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::ApplyComponent); + Exception::Throw(Exception::FAILED_TO_APPLY); } if (!impl->dxBlendState) { - Exception::Throw(ExMessage::UnintializedComponent); + Exception::Throw(Exception::INVALID_OPERATION); } m_device->impl->_context->OMSetBlendState( diff --git a/framework/platform-dx/depthstencilstate.cpp b/framework/platform-dx/depthstencilstate.cpp index 98b5013..2aa4e6b 100644 --- a/framework/platform-dx/depthstencilstate.cpp +++ b/framework/platform-dx/depthstencilstate.cpp @@ -1,5 +1,5 @@ #include "xna/graphics/depthstencilstate.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { static D3D11_DEPTH_STENCIL_DESC defaultDesc() { @@ -38,7 +38,7 @@ namespace xna { bool DepthStencilState::Initialize() { if (!m_device || !m_device->impl->_device) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } if (impl->dxDepthStencil) { @@ -50,7 +50,7 @@ namespace xna { impl->dxDepthStencil.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } return true; @@ -59,11 +59,11 @@ namespace xna { bool DepthStencilState::Apply() { if (!m_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } if (!impl->dxDepthStencil) { - Exception::Throw(ExMessage::UnintializedComponent); + Exception::Throw(Exception::INVALID_OPERATION); } m_device->impl->_context->OMSetDepthStencilState(impl->dxDepthStencil.Get(), 0); diff --git a/framework/platform-dx/device.cpp b/framework/platform-dx/device.cpp index 5e3804c..2ee9001 100644 --- a/framework/platform-dx/device.cpp +++ b/framework/platform-dx/device.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" #include "xna/game/gdevicemanager.hpp" namespace xna { @@ -53,7 +53,7 @@ namespace xna { impl._context.GetAddressOf()); if FAILED(hr) - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } } @@ -107,7 +107,7 @@ namespace xna { auto hr = CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&impl->_factory); if FAILED(hr) - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); const auto bounds = impl->_gameWindow->ClientBounds(); @@ -128,7 +128,7 @@ namespace xna { hr = impl->_factory->MakeWindowAssociation(impl->_gameWindow->impl->WindowHandle(), DXGI_MWA_NO_ALT_ENTER); if (FAILED(hr)) - Exception::Throw(ExMessage::MakeWindowAssociation); + Exception::Throw(Exception::FAILED_TO_MAKE_WINDOW_ASSOCIATION); impl->_renderTarget2D = snew(_this); @@ -185,10 +185,10 @@ namespace xna { switch (options) { case xna::ClearOptions::DepthBuffer: - Exception::Throw(ExMessage::NotImplemented); + Exception::Throw(Exception::NOT_IMPLEMENTED); break; case xna::ClearOptions::Stencil: - Exception::Throw(ExMessage::NotImplemented); + Exception::Throw(Exception::NOT_IMPLEMENTED); break; case xna::ClearOptions::Target: Clear(color); diff --git a/framework/platform-dx/displaymode.cpp b/framework/platform-dx/displaymode.cpp index d749fc6..fbebf57 100644 --- a/framework/platform-dx/displaymode.cpp +++ b/framework/platform-dx/displaymode.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" #include "xna/graphics/displaymode.hpp" namespace xna { diff --git a/framework/platform-dx/effect.cpp b/framework/platform-dx/effect.cpp index 2ae99e0..28c3311 100644 --- a/framework/platform-dx/effect.cpp +++ b/framework/platform-dx/effect.cpp @@ -1,5 +1,5 @@ #include "xna/graphics/effect.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" #include "xna/common/math.hpp" using DxBasicEffect = DirectX::BasicEffect; @@ -100,7 +100,7 @@ namespace xna { void BasicEffect::Texture(sptr const& value) { if (!value || !value->impl || !value->impl->dxShaderResource) - Exception::Throw(ExMessage::ArgumentIsNull); + Exception::Throw(Exception::ARGUMENT_IS_NULL); impl->dxBasicEffect->SetTexture(value->impl->dxShaderResource.Get()); } diff --git a/framework/platform-dx/game.cpp b/framework/platform-dx/game.cpp index 0c598dc..6892f0b 100644 --- a/framework/platform-dx/game.cpp +++ b/framework/platform-dx/game.cpp @@ -1,10 +1,4 @@ -#include "xna/content/manager.hpp" -#include "xna/csharp/type.hpp" -#include "xna/game/component.hpp" -#include "xna/game/gdevicemanager.hpp" -#include "xna/game/servicecontainer.hpp" -#include "xna/game/time.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { Game::Game() { @@ -12,7 +6,7 @@ namespace xna { services = snew(); auto iservice = reinterpret_pointer_cast(services); _contentManager = snew(services, ""); - _contentManager->_gameServices = iservice; + _contentManager->mainGameService = iservice; _gameWindow = snew(); _gameWindow->impl->Color(146, 150, 154); diff --git a/framework/platform-dx/gamepad.cpp b/framework/platform-dx/gamepad.cpp index 16035f8..23bf0d1 100644 --- a/framework/platform-dx/gamepad.cpp +++ b/framework/platform-dx/gamepad.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" #include "xna/input/gamepad.hpp" namespace xna { diff --git a/framework/platform-dx/gdevicemanager.cpp b/framework/platform-dx/gdevicemanager.cpp index 551e724..0c0f447 100644 --- a/framework/platform-dx/gdevicemanager.cpp +++ b/framework/platform-dx/gdevicemanager.cpp @@ -1,7 +1,7 @@ #include "xna/game/gdevicemanager.hpp" #include "xna/graphics/presentparams.hpp" #include "xna/graphics/swapchain.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { GraphicsDeviceManager::GraphicsDeviceManager(sptr const& game) : _game(game) diff --git a/framework/platform-dx/impl.cpp b/framework/platform-dx/impl.cpp deleted file mode 100644 index e75b09b..0000000 --- a/framework/platform-dx/impl.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "xna/platform-dx/dx.hpp" - -namespace xna { - -} \ No newline at end of file diff --git a/framework/platform-dx/init.cpp b/framework/platform-dx/init.cpp index 0351eba..7f69ee8 100644 --- a/framework/platform-dx/init.cpp +++ b/framework/platform-dx/init.cpp @@ -1,10 +1,9 @@ -#include "xna/platform-dx/init.hpp" #include "xna/csharp/type.hpp" #include "xna/content/readers/graphics.hpp" #include "xna/content/readers/audio.hpp" #include "xna/content/typereadermanager.hpp" #include "xna/content/readers/default.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { void Platform::Init() { diff --git a/framework/platform-dx/keyboard.cpp b/framework/platform-dx/keyboard.cpp index d373fe5..867ca54 100644 --- a/framework/platform-dx/keyboard.cpp +++ b/framework/platform-dx/keyboard.cpp @@ -1,5 +1,5 @@ #include "xna/input/keyboard.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { KeyboardState Keyboard::GetState() { diff --git a/framework/platform-dx/mouse.cpp b/framework/platform-dx/mouse.cpp index 87614c8..039a37d 100644 --- a/framework/platform-dx/mouse.cpp +++ b/framework/platform-dx/mouse.cpp @@ -1,5 +1,4 @@ -#include "xna/input/mouse.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { MouseState Mouse::GetState() { diff --git a/framework/platform-dx/rasterizerstate.cpp b/framework/platform-dx/rasterizerstate.cpp index 8a0f635..039ae67 100644 --- a/framework/platform-dx/rasterizerstate.cpp +++ b/framework/platform-dx/rasterizerstate.cpp @@ -1,5 +1,5 @@ #include "xna/graphics/rasterizerstate.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { @@ -18,7 +18,7 @@ namespace xna { bool RasterizerState::Initialize() { if (!impl || !m_device || !m_device->impl->_device) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } if (impl->dxRasterizerState) { @@ -30,7 +30,7 @@ namespace xna { impl->dxRasterizerState.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } return true; @@ -39,11 +39,11 @@ namespace xna { bool RasterizerState::Apply() { if (!impl || !m_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } if (!impl->dxRasterizerState) { - Exception::Throw(ExMessage::UnintializedComponent); + Exception::Throw(Exception::INVALID_OPERATION); } m_device->impl->_context->RSSetState(impl->dxRasterizerState.Get()); diff --git a/framework/platform-dx/rendertarget.cpp b/framework/platform-dx/rendertarget.cpp index e166b0d..d154417 100644 --- a/framework/platform-dx/rendertarget.cpp +++ b/framework/platform-dx/rendertarget.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { RenderTarget2D::RenderTarget2D() : Texture2D() { @@ -15,7 +15,7 @@ namespace xna { bool RenderTarget2D::Initialize() { if (!impl || !m_device || !m_device->impl->_device) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } if (!m_device->impl->_swapChain->impl->GetBackBuffer(impl->dxTexture2D)) @@ -26,7 +26,7 @@ namespace xna { const auto hr = dxdevice->CreateRenderTargetView(impl->dxTexture2D.Get(), NULL, render_impl->_renderTargetView.ReleaseAndGetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } return true; @@ -34,11 +34,11 @@ namespace xna { bool RenderTarget2D::Apply() { if (!m_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::ApplyComponent); + Exception::Throw(Exception::FAILED_TO_APPLY); } if(!render_impl->_renderTargetView) - Exception::Throw(ExMessage::UnintializedComponent); + Exception::Throw(Exception::INVALID_OPERATION); auto& context = m_device->impl->_context; context->OMSetRenderTargets(1, render_impl->_renderTargetView.GetAddressOf(), nullptr); diff --git a/framework/platform-dx/samplerstate.cpp b/framework/platform-dx/samplerstate.cpp index 1d62321..f624144 100644 --- a/framework/platform-dx/samplerstate.cpp +++ b/framework/platform-dx/samplerstate.cpp @@ -1,6 +1,6 @@ #include "xna/graphics/samplerstate.hpp" #include "xna/graphics/samplerstate.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { SamplerState::SamplerState() : SamplerState(nullptr){} @@ -12,7 +12,7 @@ namespace xna { bool SamplerState::Initialize() { if (!impl || !m_device || !m_device->impl->_device) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } if (impl->_samplerState) { @@ -24,7 +24,7 @@ namespace xna { impl->_samplerState.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } return true; @@ -33,11 +33,11 @@ namespace xna { bool SamplerState::Apply() { if (!impl || !m_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } if (!impl->_samplerState) { - Exception::Throw(ExMessage::UnintializedComponent); + Exception::Throw(Exception::INVALID_OPERATION); } m_device->impl->_context->PSSetSamplers(0, 1, impl->_samplerState.GetAddressOf()); @@ -50,7 +50,7 @@ namespace xna { return; if (!device.impl || !device.impl->_device || !device.impl->_context) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } std::vector states(samplers.size()); @@ -59,7 +59,7 @@ namespace xna { const auto& current = samplers[0]; if (!current || !current->impl || !current->impl->_samplerState) - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); states[i] = current->impl->_samplerState.Get(); states[i]->AddRef(); diff --git a/framework/platform-dx/soundeffect.cpp b/framework/platform-dx/soundeffect.cpp index da984aa..82c19e6 100644 --- a/framework/platform-dx/soundeffect.cpp +++ b/framework/platform-dx/soundeffect.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" #include "xna/csharp/stream.hpp" using DxSoundEffect = DirectX::SoundEffect; diff --git a/framework/platform-dx/sprite.cpp b/framework/platform-dx/sprite.cpp index 71e26f9..5bae260 100644 --- a/framework/platform-dx/sprite.cpp +++ b/framework/platform-dx/sprite.cpp @@ -6,7 +6,7 @@ #include "xna/graphics/viewport.hpp" #include "xna/graphics/blendstate.hpp" #include "xna/graphics/depthstencilstate.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" #include using DxSpriteBatch = DirectX::SpriteBatch; diff --git a/framework/platform-dx/swapchain.cpp b/framework/platform-dx/swapchain.cpp index e86941b..19aacb3 100644 --- a/framework/platform-dx/swapchain.cpp +++ b/framework/platform-dx/swapchain.cpp @@ -1,6 +1,6 @@ #include "xna/graphics/adapter.hpp" #include "xna/graphics/swapchain.hpp" -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" #include "xna/graphics/device.hpp" namespace xna { @@ -51,7 +51,7 @@ namespace xna { bool SwapChain::Initialize() { if (!impl || !m_device || !m_device->impl->_device) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } const auto parameters = m_device->impl->_presentationParameters; diff --git a/framework/platform-dx/texture.cpp b/framework/platform-dx/texture.cpp index f38cce0..3f54d5a 100644 --- a/framework/platform-dx/texture.cpp +++ b/framework/platform-dx/texture.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { Texture2D::~Texture2D() { @@ -40,26 +40,26 @@ namespace xna { bool Texture2D::Initialize() { if (!m_device || !m_device->impl->_device) { - Exception::Throw(ExMessage::InitializeComponent); + Exception::Throw(Exception::UNABLE_TO_INITIALIZE); } auto hr = m_device->impl->_device->CreateTexture2D(&impl->dxDescription, nullptr, impl->dxTexture2D.ReleaseAndGetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } comptr resource = nullptr; hr = impl->dxTexture2D->QueryInterface(IID_ID3D11Resource, (void**)resource.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } hr = m_device->impl->_device->CreateShaderResourceView(resource.Get(), &impl->dxShaderDescription, &impl->dxShaderResource); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } return true; @@ -112,7 +112,7 @@ namespace xna { auto hr = device.impl->_device->CreateTexture2D(&impl.dxDescription, nullptr, impl.dxTexture2D.ReleaseAndGetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } } @@ -120,7 +120,7 @@ namespace xna { auto hr = impl.dxTexture2D->QueryInterface(IID_ID3D11Resource, (void**)resource.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } constexpr int R8G8B8A8U_BYTE_SIZE = 4; @@ -130,7 +130,7 @@ namespace xna { hr = device.impl->_device->CreateShaderResourceView(resource.Get(), &impl.dxShaderDescription, impl.dxShaderResource.ReleaseAndGetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } impl.dxTexture2D->GetDesc(&impl.dxDescription); @@ -141,7 +141,7 @@ namespace xna { void Texture2D::SetData(std::vector const& data, size_t startIndex, size_t elementCount) { if (!impl || !m_device || !m_device->impl->_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } internalSetData(*impl, *m_device, data.data()); @@ -150,7 +150,7 @@ namespace xna { void Texture2D::SetData(std::vector const& data, size_t startIndex, size_t elementCount) { if (!m_device || !m_device->impl->_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } std::vector finalData(elementCount / 4); @@ -171,7 +171,7 @@ namespace xna { void Texture2D::SetData(Int level, Rectangle* rect, std::vector const& data, size_t startIndex, size_t elementCount) { if (!m_device || !m_device->impl->_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } std::vector finalData(elementCount / 4); @@ -190,7 +190,7 @@ namespace xna { auto hr = m_device->impl->_device->CreateTexture2D(&impl->dxDescription, nullptr, impl->dxTexture2D.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } } @@ -198,7 +198,7 @@ namespace xna { auto hr = impl->dxTexture2D->QueryInterface(IID_ID3D11Resource, (void**)resource.GetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } D3D11_BOX box{}; @@ -220,7 +220,7 @@ namespace xna { hr = m_device->impl->_device->CreateShaderResourceView(resource.Get(), &impl->dxShaderDescription, impl->dxShaderResource.ReleaseAndGetAddressOf()); if (FAILED(hr)) { - Exception::Throw(ExMessage::CreateComponent); + Exception::Throw(Exception::FAILED_TO_CREATE); } impl->dxTexture2D->GetDesc(&impl->dxDescription); @@ -229,7 +229,7 @@ namespace xna { void Texture2D::SetData(std::vector const& data, size_t startIndex, size_t elementCount) { if (!m_device || !m_device->impl->_device || !m_device->impl->_context) { - Exception::Throw(ExMessage::InvalidOperation); + Exception::Throw(Exception::INVALID_OPERATION); } std::vector finalData(elementCount); diff --git a/framework/platform-dx/window.cpp b/framework/platform-dx/window.cpp index 3e734f6..99ea44f 100644 --- a/framework/platform-dx/window.cpp +++ b/framework/platform-dx/window.cpp @@ -1,4 +1,4 @@ -#include "xna/platform-dx/dx.hpp" +#include "xna/xna-dx.hpp" namespace xna { GameWindow::GameWindow() { diff --git a/inc/xna/content/manager.hpp b/inc/xna/content/manager.hpp index 810a12a..ec70e7d 100644 --- a/inc/xna/content/manager.hpp +++ b/inc/xna/content/manager.hpp @@ -5,35 +5,34 @@ #include "../csharp/stream.hpp" #include "../default.hpp" #include "reader.hpp" -#include namespace xna { //The run-time component which loads managed objects from the binary files produced by the design time content pipeline. class ContentManager : public std::enable_shared_from_this { public: ContentManager(sptr const& services) : - _rootDirectory("") { - _services = services; + rootDirectory("") { + serviceProvider = services; }; ContentManager(sptr const& services, String const& rootDirectory) : - _rootDirectory(rootDirectory){ - _services = services; + rootDirectory(rootDirectory){ + serviceProvider = services; }; //Gets the service provider associated with the ContentManager. sptr ServiceProvider() const { - return _services; + return serviceProvider; } //Gets or sets the root directory associated with this ContentManager. constexpr String RootDirectory() const { - return _rootDirectory; + return rootDirectory; } //Gets or sets the root directory associated with this ContentManager. void RootDirectory(String const& value) { - _rootDirectory = value; + rootDirectory = value; } //Loads an asset that has been processed by the Content Pipeline. @@ -45,8 +44,8 @@ namespace xna { if constexpr (XnaHelper::is_shared_ptr::value) { - if (_loadedAssets.contains(assetName)) { - auto& voidAsset = _loadedAssets[assetName]; + if (loadedAssets.contains(assetName)) { + auto& voidAsset = loadedAssets[assetName]; using TYPE = T::element_type; auto asset = reinterpret_pointer_cast(voidAsset); return asset; @@ -58,7 +57,7 @@ namespace xna { if constexpr (XnaHelper::is_shared_ptr::value) { if(obj2) - _loadedAssets.emplace( assetName, obj2 ); + loadedAssets.emplace( assetName, obj2 ); } return obj2; @@ -66,12 +65,12 @@ namespace xna { //Disposes all data that was loaded by this ContentManager. void Unload() { - _loadedAssets.clear(); + loadedAssets.clear(); } //Gets the service provider associated with the main Game. static sptr GameServiceProvider() { - return _gameServices; + return mainGameService; } protected: @@ -95,11 +94,11 @@ namespace xna { friend class ContentReader; friend class Game; - String _rootDirectory; - sptr _services = nullptr; - std::map> _loadedAssets; + String rootDirectory; + sptr serviceProvider = nullptr; + std::map> loadedAssets; - inline static sptr _gameServices = nullptr; + inline static sptr mainGameService = nullptr; inline const static String contentExtension = ".xnb"; }; } diff --git a/inc/xna/content/reader.hpp b/inc/xna/content/reader.hpp index 7a71182..a96f6d1 100644 --- a/inc/xna/content/reader.hpp +++ b/inc/xna/content/reader.hpp @@ -21,7 +21,7 @@ namespace xna { // Reads a single object from the current stream. template - auto ReadObject(T existingInstance); + auto ReadObject(T& existingInstance); // Reads a single object from the current stream. template @@ -29,7 +29,7 @@ namespace xna { // Reads a single object from the current stream. template - auto ReadObject(ContentTypeReader& typeReader, T existingInstance); + auto ReadObject(ContentTypeReader& typeReader, T& existingInstance); //Reads a Vector2 value from the current stream. Vector2 ReadVector2(); @@ -44,9 +44,9 @@ namespace xna { //Reads a Color value from the currently open stream. Color ReadColor(); //Reads a float value from the currently open stream. - float ReadSingle(); + float ReadSingle() override; //Reads a double value from the currently open stream. - double ReadDouble(); + double ReadDouble() override; //Gets the name of the asset currently being read by this ContentReader. constexpr String AssetName() const { @@ -77,10 +77,10 @@ namespace xna { auto ReadObjectInternal(std::any& existingInstance); template - auto ReadObjectInternal(ContentTypeReader& typeReader, std::any& existingInstance); + auto ReadObjectInternal(ContentTypeReader& typeReader, Object& existingInstance); template - auto InvokeReader(ContentTypeReader& reader, std::any& existingInstance); + auto InvokeReader(ContentTypeReader& reader, Object& existingInstance); private: sptr _contentManager = nullptr; @@ -93,10 +93,13 @@ namespace xna { static constexpr Ushort XnbCompressedVersion = 32773; static constexpr Ushort XnbVersion = 5; static constexpr Int XnbVersionProfileShift = 8; + static constexpr Char PlatformLabel = 'w'; + static constexpr Int XnbPrologueSize = 10; + static constexpr Int XnbCompressedPrologueSize = 14; }; template - inline auto ContentReader::ReadObjectInternal(std::any& existingInstance) + inline auto ContentReader::ReadObjectInternal(Object& existingInstance) { const auto num = Read7BitEncodedInt(); @@ -107,16 +110,16 @@ namespace xna { const auto index = num - 1; if (index >= typeReaders.size()) { - throw std::runtime_error("ContentReader::ReadObjectInternal: Bad xbn."); + Exception::Throw(Exception::BAD_XNB); } - auto reader = typeReaders[index]; + auto& reader = typeReaders[index]; return InvokeReader(*reader, existingInstance); } template - inline auto ContentReader::InvokeReader(ContentTypeReader& reader, std::any& existingInstance) + inline auto ContentReader::InvokeReader(ContentTypeReader& reader, Object& existingInstance) { auto contentTypeReader = reinterpret_cast*>(&reader); T objB; @@ -126,6 +129,9 @@ namespace xna { objB = contentTypeReader->Read(*this, existingInstance1); return objB; } + else { + Exception::Throw(Exception::NOT_IMPLEMENTED); + } return XnaHelper::ReturnDefaultOrNull(); } @@ -146,9 +152,9 @@ namespace xna { } template - inline auto ContentReader::ReadObject(T existingInstance) + inline auto ContentReader::ReadObject(T& existingInstance) { - return ReadObjectInternal(std::any(existingInstance)); + return ReadObjectInternal(Object(existingInstance)); } template @@ -159,17 +165,18 @@ namespace xna { } template - inline auto ContentReader::ReadObject(ContentTypeReader& typeReader, T existingInstance) + inline auto ContentReader::ReadObject(ContentTypeReader& typeReader, T& existingInstance) { return ReadObjectInternal(typeReader, std::any(existingInstance)); } template - inline auto ContentReader::ReadObjectInternal(ContentTypeReader& typeReader, std::any& existingInstance) + inline auto ContentReader::ReadObjectInternal(ContentTypeReader& typeReader, Object& existingInstance) { - return typeReader.TargetIsValueType - ? InvokeReader(typeReader, existingInstance) - : ReadObjectInternal(existingInstance); + if (typeReader.TargetIsValueType) + return InvokeReader(typeReader, existingInstance); + + ReadObjectInternal(existingInstance); } } diff --git a/inc/xna/content/readers/default.hpp b/inc/xna/content/readers/default.hpp index 8f820f7..7f5c5fa 100644 --- a/inc/xna/content/readers/default.hpp +++ b/inc/xna/content/readers/default.hpp @@ -8,11 +8,13 @@ #include "../reader.hpp" namespace xna { - class ObjectReader : public ContentTypeReaderT { + class ObjectReader : public ContentTypeReader { public: - ObjectReader() : ContentTypeReaderT(typeof()) {} + ObjectReader() : ContentTypeReader(typeof()) {} virtual Object Read(ContentReader& input, Object& existingInstance) override { + Exception::Throw(Exception::NOT_IMPLEMENTED); + return Object(); } }; diff --git a/inc/xna/csharp/binary.hpp b/inc/xna/csharp/binary.hpp index 08a7d3c..c81b5cb 100644 --- a/inc/xna/csharp/binary.hpp +++ b/inc/xna/csharp/binary.hpp @@ -8,53 +8,47 @@ namespace xna { //A simplified port of the System.IO.BinaryReader class. class BinaryReader { public: - BinaryReader(sptr const& input) { - if (!input) - throw std::invalid_argument("input is null."); - - stream = input; - buffer = std::vector(bufferLength); - } + BinaryReader(sptr const& input); //Returns the next available character and does not advance the byte or character position. Int PeekChar(); //Reads bytes from the underlying stream and advances the current position of the stream. - Int Read(); + virtual Int Read(); //Reads a Boolean value from the current stream and advances the current position of the stream by one byte. - bool ReadBoolean(); + virtual bool ReadBoolean(); //Reads the next byte from the current stream and advances the current position of the stream by one byte. - Byte ReadByte(); + virtual Byte ReadByte(); //Reads a signed byte from this stream and advances the current position of the stream by one byte. - Sbyte ReadSByte(); + virtual Sbyte ReadSByte(); //Reads the next character from the current stream and advances the current position of the stream. - Char ReadChar(); + virtual Char ReadChar(); //Reads a 2-byte signed integer from the current stream and advances the current position of the stream by two bytes. - Short ReadInt16(); + virtual Short ReadInt16(); //Reads a 2-byte unsigned integer from the current stream and advances the position of the stream by two bytes. - Ushort ReadUInt16(); + virtual Ushort ReadUInt16(); //Reads a 4-byte signed integer from the current stream and advances the current position of the stream by four bytes. - Int ReadInt32(); + virtual Int ReadInt32(); //Reads a 4-byte unsigned integer from the current stream and advances the position of the stream by four bytes. - Uint ReadUInt32(); + virtual Uint ReadUInt32(); //Reads a 8-byte signed integer from the current stream and advances the current position of the stream by eight bytes. - Long ReadInt64(); + virtual Long ReadInt64(); //Reads a 8-byte unsigned integer from the current stream and advances the position of the stream by eight bytes. - Ulong ReadUInt64(); + virtual Ulong ReadUInt64(); //Reads a 4-byte floating point value from the current stream and advances the current position of the stream by four bytes. - float ReadSingle(); + virtual float ReadSingle(); //Reads an 8-byte floating point value from the current stream and advances the current position of the stream by eight bytes. - double ReadDouble(); + virtual double ReadDouble(); //Reads a string from the current stream. - std::string ReadString(); + virtual std::string ReadString(); //Reads chars from the underlying stream and advances the current position of the stream. - Int Read(std::vector& buffer, size_t index, size_t count); + virtual Int Read(std::vector& buffer, size_t index, size_t count); //Reads bytes from the underlying stream and advances the current position of the stream. - Int Read(std::vector& buffer, size_t index, size_t count); + virtual Int Read(std::vector& buffer, size_t index, size_t count); // Reads the specified number of bytes from the current stream into a byte array // and advances the current position by that number of bytes. - std::vector ReadBytes(size_t count); + virtual std::vector ReadBytes(size_t count); // Reads a 32-bit integer in compressed format. // This function may throw a std::format_error exception. @@ -64,6 +58,16 @@ namespace xna { // This function may throw a std::format_error exception. Long Read7BitEncodedInt64(); + //Exposes access to the underlying stream of the BinaryReader. + virtual inline sptr BaseStream() const { + return stream; + } + + //Closes the current reader and the underlying stream. + virtual inline void Close() { + stream = nullptr; + } + protected: Int InternalReadOneChar(); void FillBuffer(Int numBytes); @@ -79,18 +83,15 @@ namespace xna { std::vector charBuffer; //bool m2BytesPerChar{ false }; - }; + }; //A simplified port of the System.IO.BinaryWriter class. class BinaryWriter { public: - BinaryWriter(sptr const& stream) { - if (!stream) - throw std::invalid_argument("stream is null."); + BinaryWriter(sptr const& stream); - _stream = stream; - _buffer = std::vector(16); - } + protected: + BinaryWriter() = default; //Sets the position within the current stream. Long Seek(Int offset, SeekOrigin origin); @@ -99,32 +100,56 @@ namespace xna { // Writes a value to the current stream. // - void Write(bool value); - void Write(Byte value); - void Write(Sbyte value); - void Write(Byte const* buffer, Int bufferLength); - void Write(std::vector const& buffer); - void Write(Byte const* buffer, Int bufferLength, Int index, Int count); - void Write(std::vector const& buffer, Int index, Int count); - void Write(Char ch); - void Write(double value); - void Write(Short value); - void Write(Ushort value); - void Write(Int value); - void Write(Uint value); - void Write(Long value); - void Write(Ulong value); - void Write(float value); - void Write(std::string const& value); - void Write(const char* _string, size_t stringLength); + //Writes a value to the current stream. + virtual void Write(bool value); + //Writes a value to the current stream. + virtual void Write(Byte value); + //Writes a value to the current stream. + virtual void Write(Sbyte value); + //Writes a value to the current stream. + virtual void Write(Byte const* buffer, Int bufferLength); + //Writes a value to the current stream. + virtual void Write(std::vector const& buffer); + //Writes a value to the current stream. + virtual void Write(Byte const* buffer, Int bufferLength, Int index, Int count); + //Writes a value to the current stream. + virtual void Write(std::vector const& buffer, Int index, Int count); + //Writes a value to the current stream. + virtual void Write(Char ch); + //Writes a value to the current stream. + virtual void Write(double value); + //Writes a value to the current stream. + virtual void Write(Short value); + //Writes a value to the current stream. + virtual void Write(Ushort value); + //Writes a value to the current stream. + virtual void Write(Int value); + //Writes a value to the current stream. + virtual void Write(Uint value); + //Writes a value to the current stream. + virtual void Write(Long value); + //Writes a value to the current stream. + virtual void Write(Ulong value); + //Writes a value to the current stream. + virtual void Write(float value); + //Writes a value to the current stream. + virtual void Write(std::string const& value); + //Writes a value to the current stream. + virtual void Write(const char* _string, size_t stringLength); + + //Exposes access to the underlying stream of the BinaryWriter. + virtual inline sptr BaseStream() const { + return OutStream; + } //Writes a 32-bit integer in a compressed format. void Write7BitEncodedInt(Int value); //void Write7BitEncodedInt64(Long value); + protected: + sptr OutStream = nullptr; private: - sptr _stream = nullptr; std::vector _buffer; }; } diff --git a/inc/xna/csharp/object.hpp b/inc/xna/csharp/object.hpp deleted file mode 100644 index 6fedc8c..0000000 --- a/inc/xna/csharp/object.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef XNA_CSHARP_OBJECT_HPP -#define XNA_CSHARP_OBJECT_HPP - -#include "../default.hpp" - -namespace xna { - class Object { - public: - virtual size_t GetHashCode() const; - }; -} - -#endif \ No newline at end of file diff --git a/inc/xna/csharp/stream.hpp b/inc/xna/csharp/stream.hpp index 8e8d4b7..4e33bfe 100644 --- a/inc/xna/csharp/stream.hpp +++ b/inc/xna/csharp/stream.hpp @@ -1,12 +1,15 @@ #ifndef XNA_CSHARP_STREAM_HPP #define XNA_CSHARP_STREAM_HPP -#include "../types.hpp" -#include "../enums.hpp" -#include -#include +#include "../default.hpp" namespace xna { + enum class SeekOrigin { + Begin, + Current, + End, + }; + //A simplified port of the System.IO.Stream. //Provides a generic view of a sequence of bytes. This is an abstract class. class Stream { @@ -18,23 +21,20 @@ namespace xna { virtual Long Position() = 0; //Closes the current stream and releases any resources virtual void Close() = 0; - virtual bool IsClosed() = 0; //Sets the position within the current stream. virtual Long Seek(Long offset, SeekOrigin const& origin) = 0; - // //Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. - // virtual Int Read(Byte* buffer, Int bufferLength, Int offset, Int count) = 0; + //Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. virtual Int Read(std::vector& buffer, Int offset, Int count) = 0; //Reads a byte from the stream and advances the position within the stream by one byte, or returns -1 if at the end of the stream. virtual Int ReadByte() = 0; - // - //When overridden in a derived class, writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. - // + //Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. virtual void Write(Byte const* buffer, Int bufferLength, Int offset, Int count) = 0; + //Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. virtual void Write(std::vector const& buffer, Int offset, Int count) = 0; //Writes a byte to the current position in the stream and advances the position within the stream by one byte. @@ -49,6 +49,10 @@ namespace xna { constexpr MemoryStream(std::vector const& bytes): _buffer(bytes), _length(bytes.size()){} + ~MemoryStream() override { + Close(); + } + constexpr MemoryStream(Int capacity) : _buffer(static_cast(capacity)), _length(capacity > 0 ? capacity : 0){} @@ -70,11 +74,7 @@ namespace xna { virtual constexpr void Close() override { _closed = true; _buffer = std::vector(); - } - - virtual constexpr bool IsClosed() override { - return _closed; - } + } virtual Long Seek(Long offset, SeekOrigin const& origin) override; virtual Int Read(Byte* buffer, Int bufferLength, Int offset, Int count) override; @@ -90,6 +90,7 @@ namespace xna { public: std::vector _buffer; + private: Int _position{ 0 }; Int _origin{ 0 }; @@ -103,7 +104,7 @@ namespace xna { FileStream(String const& path, FileMode fileMode); FileStream(String const& path); - ~FileStream() { + ~FileStream() override { Close(); } @@ -115,11 +116,7 @@ namespace xna { if(_fstream.is_open()) _fstream.close(); - } - - inline virtual constexpr bool IsClosed() override { - return _closed; - } + } virtual Long Seek(Long offset, SeekOrigin const& origin) override; virtual Int Read(Byte* buffer, Int bufferLength, Int offset, Int count) override; diff --git a/inc/xna/csharp/type.hpp b/inc/xna/csharp/type.hpp index 934ee84..7313cc3 100644 --- a/inc/xna/csharp/type.hpp +++ b/inc/xna/csharp/type.hpp @@ -2,13 +2,12 @@ #define XNA_CSHARP_TYPE_HPP #include "../default.hpp" -#include "object.hpp" #include #include #include namespace xna { - class Type : public Object { + class Type { public: constexpr String FullName() const { return fullName; } constexpr bool IsClass() const { return isClass; } @@ -17,7 +16,7 @@ namespace xna { constexpr bool IsPrimitive() const { return isPrimitive; } constexpr bool IsPointer() const { return isPointer; } - virtual size_t GetHashCode() const; + size_t GetHashCode() const; constexpr bool operator==(const Type& other) const { return diff --git a/inc/xna/default.hpp b/inc/xna/default.hpp index 634624e..86f50a1 100644 --- a/inc/xna/default.hpp +++ b/inc/xna/default.hpp @@ -1,5 +1,201 @@ -#include "types.hpp" -#include "forward.hpp" -#include "enums.hpp" +#ifndef XNA_DEFAULT_HPP +#define XNA_DEFAULT_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "enumerations.hpp" +#include "exception.hpp" #include "helpers.hpp" -#include "exception.hpp" \ No newline at end of file + +namespace xna { + + // + //C# nameof + // +#define nameof(name) std::string(#name) + + // + // C# standard types + // + + using Sbyte = int8_t; + using Byte = uint8_t; + using Short = int16_t; + using Ushort = uint16_t; + using Int = int32_t; + using Uint = uint32_t; + using Long = int64_t; + using Ulong = uint64_t; + using Char = char16_t; + + // + // C# Min and Max Value + // + + constexpr Sbyte SbyteMaxValue = (std::numeric_limits::max)(); + constexpr Sbyte SbyteMinValue = (std::numeric_limits::min)(); + constexpr Byte ByteMaxValue = (std::numeric_limits::max)(); + constexpr Byte ByteMinValue = (std::numeric_limits::min)(); + constexpr Short ShortMaxValue = (std::numeric_limits::max)(); + constexpr Short ShortMinValue = (std::numeric_limits::min)(); + constexpr Ushort UshortMaxValue = (std::numeric_limits::max)(); + constexpr Ushort UshortMinValue = (std::numeric_limits::min)(); + constexpr Int IntMaxValue = (std::numeric_limits::max)(); + constexpr Int IntMinValue = (std::numeric_limits::min)(); + constexpr Uint UintMaxValue = (std::numeric_limits::max)(); + constexpr Uint UintMinValue = (std::numeric_limits::min)(); + constexpr Long LongMaxValue = (std::numeric_limits::max)(); + constexpr Long LongMinValue = (std::numeric_limits::min)(); + constexpr Ulong UlongMaxValue = (std::numeric_limits::max)(); + constexpr Ulong UlongMinValue = (std::numeric_limits::min)(); + constexpr Char CharMaxValue = (std::numeric_limits::max)(); + constexpr Char CharMinValue = (std::numeric_limits::min)(); + constexpr float FloatMaxValue = (std::numeric_limits::max)(); + constexpr float FloatMinValue = (std::numeric_limits::min)(); + constexpr double DoubleMaxValue = (std::numeric_limits::max)(); + constexpr double DoubleMinValue = (std::numeric_limits::min)(); + + // + // C# Object + // + + //Same as std::any + using Object = std::any; + + // + // About strings: https://stackoverflow.com/questions/402283/stdwstring-vs-stdstring + // + + //Same as std::string + using String = std::string; + //Same as std::wstring + using WString = std::wstring; + + //Same as std::shared_ptr + template + using sptr = std::shared_ptr; + //Same as std::weak_ptr + template + using wptr = std::weak_ptr; + //Same as std::unique_ptr + template + using uptr = std::unique_ptr; + + //Same as std::make_shared + template + inline std::shared_ptr<_Ty> snew(_Types&&... _Args) { + return std::make_shared<_Ty>(std::forward<_Types>(_Args)...); + } + + //Same as std::make_unique + template + inline std::unique_ptr<_Ty> unew(_Types&&... _Args) { + return std::make_unique<_Ty>(std::forward<_Types>(_Args)...); + } + + // + // Forward + // + + //Audio + class SoundEffect; + struct SoundEffectInstance; + class AudioEngine; + struct WaveFormat; + + //CShap + struct TimeSpan; + class Stream; + class FileStream; + class MemoryStream; + class Type; + + //Content + class ContentManager; + class ContentReader; + class ContentTypeReader; + class ContentTypeReaderManager; + + //Common + struct BoundingBox; + struct BoundingFrustum; + struct BoundingSphere; + struct Color; + struct Curve; + struct CurveKey; + struct CurveKeyCollection; + struct Matrix; + struct Plane; + struct Point; + struct Quaternion; + struct Ray; + struct Rectangle; + struct Vector2; + struct Vector3; + struct Vector4; + + //Game + class Game; + class GameComponent; + class GameClock; + class GameTime; + class GameWindow; + class GraphicsDeviceInformation; + class GraphicsDeviceManager; + class IGameTime; + class IGameComponent; + class GameServiceContainer; + class GameComponentCollection; + + //Graphics + class BlendState; + class ConstantBuffer; + class DataBuffer; + class DepthStencilState; + class DisplayMode; + class DisplayModeCollection; + class Effect; + class GraphicsAdapter; + class GraphicsDevice; + class GraphicsDeviceInformation; + struct PresentationParameters; + class RenderTarget2D; + class SwapChain; + class Texture; + class Texture2D; + class Texture3D; + class TextureCube; + class RasterizerState; + class SamplerState; + class SamplerStateCollection; + class Shader; + class SpriteBatch; + class SpriteFont; + struct VertexPositionColor; + class VertexShader; + struct Viewport; + + //Input + struct GamePadTriggers; + struct GamePadThumbSticks; + struct GamePadDPad; + struct GamePadCapabilities; + struct GamePadButtons; + struct GamePadState; + struct KeyboardState; + struct MouseState; +} + + +#endif \ No newline at end of file diff --git a/inc/xna/enums.hpp b/inc/xna/enumerations.hpp similarity index 70% rename from inc/xna/enums.hpp rename to inc/xna/enumerations.hpp index 3bd7aaf..51bf886 100644 --- a/inc/xna/enums.hpp +++ b/inc/xna/enumerations.hpp @@ -1,5 +1,5 @@ -#ifndef XNA_ENUMS_HPP -#define XNA_ENUMS_HPP +#ifndef XNA_ENUMERATIONS_HPP +#define XNA_ENUMERATIONS_HPP namespace xna { enum class AudioChannels @@ -43,35 +43,35 @@ namespace xna { Max }; - enum class Blend { - Zero, - One, - SourceColor, - InverseSourceColor, - SourceAlpha, - InverseSourceAlpha, - DestinationAlpha, - InverseDestinationAlpha, - DestinationColor, - InverseDestinationColor, - SourceAlphaSaturation, - BlendFactor, - InverseBlendFactor, - Source1Color, - InverseSource1Color, - Source1Alpha, - InverseSource1Alpha - }; + enum class Blend { + Zero, + One, + SourceColor, + InverseSourceColor, + SourceAlpha, + InverseSourceAlpha, + DestinationAlpha, + InverseDestinationAlpha, + DestinationColor, + InverseDestinationColor, + SourceAlphaSaturation, + BlendFactor, + InverseBlendFactor, + Source1Color, + InverseSource1Color, + Source1Alpha, + InverseSource1Alpha + }; - enum class BlendFunction { - Add = 0, - Subtract = 1, - ReverseSubtract = 2, - Min = 3, - Max = 4, - }; + enum class BlendFunction { + Add = 0, + Subtract = 1, + ReverseSubtract = 2, + Min = 3, + Max = 4, + }; - using BlendOperation = BlendFunction; + using BlendOperation = BlendFunction; enum class BufferUsage { Default, @@ -120,14 +120,14 @@ namespace xna { Target, }; - enum class ColorWriteChannels { - Red, - Green, - Blue, - Alpha, - All, + enum class ColorWriteChannels { + Red, + Green, + Blue, + Alpha, + All, None - }; + }; enum class ContainmentType { Disjoint, @@ -135,19 +135,19 @@ namespace xna { Intersects, }; - enum class ComparisonFunction { - Never, - Less, - Equal, - LessEquals, - Greater, - NotEqual, - GreaterEqual, - Always - }; + enum class ComparisonFunction { + Never, + Less, + Equal, + LessEquals, + Greater, + NotEqual, + GreaterEqual, + Always + }; using CompareFunction = ComparisonFunction; - + enum class CurveContinuity { Smooth, Step, @@ -168,30 +168,30 @@ namespace xna { Linear, }; - enum class CullMode { - None, - CullClockwiseFace, - CullCounterClockwiseFace, - }; + enum class CullMode { + None, + CullClockwiseFace, + CullCounterClockwiseFace, + }; - enum class DepthFormat { - None, - Depth16, - Depth24, - Depth24Stencil8 - }; + enum class DepthFormat { + None, + Depth16, + Depth24, + Depth24Stencil8 + }; - enum class DepthWriteMask { - Zero, - All - }; + enum class DepthWriteMask { + Zero, + All + }; - enum class DisplayOrientation { - Default = 0, - LandscapeLeft = 1, - LandscapeRight = 2, - Portrait = 4, - }; + enum class DisplayOrientation { + Default = 0, + LandscapeLeft = 1, + LandscapeRight = 2, + Portrait = 4, + }; enum class DisplayModeScanlineOrder { Unspecified = 0, @@ -236,11 +236,11 @@ namespace xna { Truncate }; - enum class FillMode - { - WireFrame, + enum class FillMode + { + WireFrame, Solid, - }; + }; enum class GameComponentType { Updatable, @@ -268,12 +268,12 @@ namespace xna { None, }; - enum class GraphicsProfile { - Reach, - HiDef - }; + enum class GraphicsProfile { + Reach, + HiDef + }; - enum class Keys : unsigned char{ + enum class Keys : unsigned char { None = 0, Back = 0x8, @@ -473,12 +473,12 @@ namespace xna { Four, }; - enum class PresentInterval { - Default, - One, - Two, - Immediate - }; + enum class PresentInterval { + Default, + One, + Two, + Immediate + }; enum class PrimitiveType { @@ -488,69 +488,65 @@ namespace xna { LineStrip, }; - enum RenderTargetUsage { - DiscardContents, - PreserveContents, - PlatformContents - }; + enum RenderTargetUsage { + DiscardContents, + PreserveContents, + PlatformContents + }; - enum class SeekOrigin { - Begin, - Current, - End, - }; + - enum class SpriteEffects { - None = 0, - FlipHorizontally = 1, - FlipVertically = 2, - Both = FlipHorizontally | FlipVertically - }; + enum class SpriteEffects { + None = 0, + FlipHorizontally = 1, + FlipVertically = 2, + Both = FlipHorizontally | FlipVertically + }; - enum class SpriteSortMode - { - Deferred, - Immediate, - Texture, - BackToFront, - FrontToBack, - }; + enum class SpriteSortMode + { + Deferred, + Immediate, + Texture, + BackToFront, + FrontToBack, + }; - enum class StencilOperation - { - Keep, - Zero, - Replace, - IncrementSaturation, - DecrementSaturation, - Invert, - Increment, - Decrement, - }; + enum class StencilOperation + { + Keep, + Zero, + Replace, + IncrementSaturation, + DecrementSaturation, + Invert, + Increment, + Decrement, + }; - enum class SurfaceFormat { - Color = 0, - Bgr565 = 1, - Bgra5551 = 2, - Bgra4444 = 3, - Dxt1 = 4, - Dxt3 = 5, - Dxt5 = 6, - NormalizedByte2 = 7, - NormalizedByte4 = 8, - Rgba1010102 = 9, - Rg32 = 10, - Rgba64 = 11, - Alpha8 = 12, - Single = 13, - Vector2 = 14, - Vector4 = 15, - HalfSingle = 16, - HalfVector2 = 17, - HalfVector4 = 18, - HdrBlendable = 19, + enum class SurfaceFormat { + Color = 0, + Bgr565 = 1, + Bgra5551 = 2, + Bgra4444 = 3, + Dxt1 = 4, + Dxt3 = 5, + Dxt5 = 6, + NormalizedByte2 = 7, + NormalizedByte4 = 8, + Rgba1010102 = 9, + Rg32 = 10, + Rgba64 = 11, + Alpha8 = 12, + Single = 13, + Vector2 = 14, + Vector4 = 15, + HalfSingle = 16, + HalfVector2 = 17, + HalfVector4 = 18, + HdrBlendable = 19, Unknown, - }; + }; enum class SwapEffect { Discard, @@ -559,29 +555,27 @@ namespace xna { FlipDiscard }; - enum class TextureAddressMode { - Wrap, - Mirror, - Clamp, - Border, - MirrorOnce - }; + enum class TextureAddressMode { + Wrap, + Mirror, + Clamp, + Border, + MirrorOnce + }; - enum class TextureFilter { - Linear, - Point, - Anisotropic, - LinearMipPoint, - PointMipLinear, - MinLinearMagPointMipLinear, - MinLinearMagPointMipPoint, - MinPointMagLinearMipLinear, - MinPointMagLinearMipPoint, - }; + enum class TextureFilter { + Linear, + Point, + Anisotropic, + LinearMipPoint, + PointMipLinear, + MinLinearMagPointMipLinear, + MinLinearMagPointMipPoint, + MinPointMagLinearMipLinear, + MinPointMagLinearMipPoint, + }; - - - constexpr int SURFACE_FORMAT_COUNT = 19; + constexpr int SURFACE_FORMAT_COUNT = 19; } #endif \ No newline at end of file diff --git a/inc/xna/exception.hpp b/inc/xna/exception.hpp index 9fa7285..4dffea3 100644 --- a/inc/xna/exception.hpp +++ b/inc/xna/exception.hpp @@ -4,47 +4,36 @@ #include #include #include +#include namespace xna { - - //A list of standard exceptions - struct ExMessage { - inline static const std::string InvalidOperation = "An invalid operation occurred."; - inline static const std::string InitializeComponent = "Unable to initialize component"; - inline static const std::string CreateComponent = "Failed to create component"; - inline static const std::string ApplyComponent = "Failed to apply component"; - inline static const std::string UnintializedComponent = "Component is not initialized"; - inline static const std::string MakeWindowAssociation = "Failed to create association with window"; - inline static const std::string BuildObject = "Unable to build object"; - inline static const std::string NotImplemented = "Not Implemented"; - inline static const std::string ArgumentIsNull = "The argument is null or one of its values."; - }; - //Structure for throwing exceptions with a message and information from the source file struct Exception { - //Raises an exception with a message. Source file information is automatically captured. - static void Throw(std::string const& message, const std::source_location location = std::source_location::current()) { - std::string error; + static void Throw(std::string const& message = "", std::source_location const& location = std::source_location::current()); - error.append("Exception in: "); -#if _DEBUG - error.append(location.file_name()); - error.append("("); - error.append(std::to_string(location.line())); - error.append(":"); - error.append(std::to_string(location.column())); - error.append(") "); -#endif - error.append("'"); - error.append(location.function_name()); - error.append("': "); - error.append(message); - error.append("\n"); - - throw std::runtime_error(error); + inline static void ThrowIfNull(std::shared_ptr const& argument, std::string const& argumentName, std::source_location const& location = std::source_location::current()) { + ThrowIfNull(&argument, argumentName, location); } - }; + + inline static void ThrowIfNull(std::unique_ptr const& argument, std::string const& argumentName, std::source_location const& location = std::source_location::current()) { + ThrowIfNull(&argument, argumentName, location); + } + + static void ThrowIfNull(void const* argument, std::string const& argumentName, std::source_location const& location = std::source_location::current()); + + inline static const std::string FAILED_TO_CREATE = "Failed to create component."; + inline static const std::string FAILED_TO_APPLY = "Failed to apply component."; + inline static const std::string FAILED_TO_MAKE_WINDOW_ASSOCIATION = "Failed to create association with window."; + inline static const std::string UNABLE_TO_INITIALIZE = "Unable to initialize component."; + inline static const std::string UNABLE_TO_BUILD_OBJECT = "Unable to build object."; + inline static const std::string NOT_IMPLEMENTED = "Not Implemented."; + inline static const std::string ARGUMENT_IS_NULL = "The argument is null or one of its values."; + inline static const std::string INVALID_OPERATION = "An invalid operation occurred."; + inline static const std::string BAD_XNB = "Bad xnb file"; + inline static const std::string OUT_OF_BOUNDS = "Out of bounds."; + inline static const std::string END_OF_FILE = "End of file."; + }; } #endif \ No newline at end of file diff --git a/inc/xna/forward.hpp b/inc/xna/forward.hpp deleted file mode 100644 index 85adeeb..0000000 --- a/inc/xna/forward.hpp +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef XNA_FORWARD_HPP -#define XNA_FORWARD_HPP - -#include "types.hpp" - -namespace xna { - //Audio - class SoundEffect; - struct SoundEffectInstance; - class AudioEngine; - struct WaveFormat; - - //CShap - struct TimeSpan; - class Stream; - class FileStream; - class MemoryStream; - class Object; - class Type; - - //Content - class ContentManager; - class ContentReader; - class ContentTypeReader; - class ContentTypeReaderManager; - - //Common - struct BoundingBox; - struct BoundingFrustum; - struct BoundingSphere; - struct Color; - struct Curve; - struct CurveKey; - struct CurveKeyCollection; - struct Matrix; - struct Plane; - struct Point; - struct Quaternion; - struct Ray; - struct Rectangle; - struct Vector2; - struct Vector3; - struct Vector4; - - //Game - class Game; - class GameComponent; - class GameClock; - class GameTime; - class GameWindow; - class GraphicsDeviceInformation; - class GraphicsDeviceManager; - class IGameTime; - class IGameComponent; - class GameServiceContainer; - class GameComponentCollection; - - //Graphics - class BlendState; - class ConstantBuffer; - class DataBuffer; - class DepthStencilState; - class DisplayMode; - class DisplayModeCollection; - class Effect; - class GraphicsAdapter; - class GraphicsDevice; - class GraphicsDeviceInformation; - struct PresentationParameters; - class RenderTarget2D; - class SwapChain; - class Texture; - class Texture2D; - class Texture3D; - class TextureCube; - class RasterizerState; - class SamplerState; - class SamplerStateCollection; - class Shader; - class SpriteBatch; - class SpriteFont; - struct VertexPositionColor; - class VertexShader; - struct Viewport; - - //Input - struct GamePadTriggers; - struct GamePadThumbSticks; - struct GamePadDPad; - struct GamePadCapabilities; - struct GamePadButtons; - struct GamePadState; - struct KeyboardState; - struct MouseState; -} - -#endif \ No newline at end of file diff --git a/inc/xna/game/time.hpp b/inc/xna/game/time.hpp index 6488cac..474eb89 100644 --- a/inc/xna/game/time.hpp +++ b/inc/xna/game/time.hpp @@ -1,8 +1,7 @@ #ifndef XNA_GAME_TIME_HPP #define XNA_GAME_TIME_HPP -#include "../forward.hpp" -#include "../types.hpp" +#include "../default.hpp" #include "../csharp/timespan.hpp" namespace xna { diff --git a/inc/xna/graphics/sprite.hpp b/inc/xna/graphics/sprite.hpp index b21c456..f25cf66 100644 --- a/inc/xna/graphics/sprite.hpp +++ b/inc/xna/graphics/sprite.hpp @@ -1,10 +1,9 @@ #ifndef XNA_GRAPHICS_SPRITE_HPP #define XNA_GRAPHICS_SPRITE_HPP -#include "../default.hpp" -#include "../common/numerics.hpp" #include "../common/color.hpp" -#include +#include "../common/numerics.hpp" +#include "../default.hpp" #include "../graphics/gresource.hpp" namespace xna { @@ -13,7 +12,47 @@ namespace xna { public: SpriteBatch(sptr const& device); - //Begins a sprite batch operation. + //Begins a sprite batch operation. + void Begin( + std::optional sortMode, + uptr blendState, + uptr samplerState, + uptr depthStencil, + uptr rasterizerState, + uptr effect, + Matrix const& transformMatrix = Matrix::Identity() + ) { + Begin( + !sortMode.has_value() ? SpriteSortMode::Deferred : sortMode.value(), + blendState.get(), + samplerState.get(), + depthStencil.get(), + rasterizerState.get(), + effect.get(), + transformMatrix + ); + } + + void Begin( + std::optional sortMode, + sptr blendState, + sptr samplerState, + sptr depthStencil, + sptr rasterizerState, + sptr effect, + Matrix const& transformMatrix = Matrix::Identity() + ) { + Begin( + !sortMode.has_value() ? SpriteSortMode::Deferred : sortMode.value(), + blendState.get(), + samplerState.get(), + depthStencil.get(), + rasterizerState.get(), + effect.get(), + transformMatrix + ); + } + void Begin( SpriteSortMode sortMode = SpriteSortMode::Deferred, BlendState* blendState = nullptr, diff --git a/inc/xna/helpers.hpp b/inc/xna/helpers.hpp index b14afec..46fe92e 100644 --- a/inc/xna/helpers.hpp +++ b/inc/xna/helpers.hpp @@ -1,9 +1,7 @@ #ifndef XNA_HELPERS_HPP #define XNA_HELPERS_HPP -#include -#include -#include "exception.hpp" +#include "default.hpp" namespace xna { //Class for helper functions @@ -15,6 +13,16 @@ namespace xna { template struct is_shared_ptr : std::false_type {}; template struct is_shared_ptr> : std::true_type {}; + template struct is_weak_ptr : std::false_type {}; + template struct is_weak_ptr> : std::true_type {}; + template struct is_unique_ptr : std::false_type {}; + template struct is_unique_ptr> : std::true_type {}; + + //Returns true if the type is a smart pointer + template + static constexpr bool IsSmartPoint() { + return is_shared_ptr::value || is_unique_ptr::value || is_weak_ptr::value; + } //Convert a string to wstring static inline std::wstring ToWString(const std::string& str) @@ -47,12 +55,12 @@ namespace xna { //Throws an exception if the object cannot be created template static inline auto ReturnDefaultOrNull(const std::source_location location = std::source_location::current()) { - if constexpr (is_shared_ptr::value) + if constexpr (IsSmartPoint()) return (T)nullptr; - else if (std::is_default_constructible::value) + else if constexpr (std::is_default_constructible::value) return T(); else - Exception::Throw(ExMessage::BuildObject, location); + Exception::Throw(Exception::UNABLE_TO_BUILD_OBJECT, location); } }; } diff --git a/inc/xna/input/gamepad.hpp b/inc/xna/input/gamepad.hpp index 9e52515..0dfd0ff 100644 --- a/inc/xna/input/gamepad.hpp +++ b/inc/xna/input/gamepad.hpp @@ -247,15 +247,15 @@ namespace xna { static GamePadCapabilities GetCapabilities(PlayerIndex index); //Sets the vibration motor speeds on an Xbox 360 Controller. static bool SetVibration(PlayerIndex index, float leftMotor, float rightMotor, float leftTrigger = 0, float rightTrigger = 0); - - GamePad() = delete; - GamePad(GamePad&) = delete; - GamePad(GamePad&&) = delete; private: friend class Game; static void Initialize(); + GamePad() = default; + GamePad(GamePad&) = default; + GamePad(GamePad&&) = default; + public: struct PlatformImplementation; inline static uptr impl = nullptr; diff --git a/inc/xna/input/keyboard.hpp b/inc/xna/input/keyboard.hpp index 7957664..67fd58b 100644 --- a/inc/xna/input/keyboard.hpp +++ b/inc/xna/input/keyboard.hpp @@ -219,16 +219,16 @@ namespace xna { public: //Returns the current keyboard or Chatpad state. static KeyboardState GetState(); - static bool IsConnected(); - - Keyboard() = delete; - Keyboard(Keyboard&) = delete; - Keyboard(Keyboard&&) = delete; + static bool IsConnected(); private: friend class Game; static void Initialize(); + Keyboard() = default; + Keyboard(Keyboard&) = default; + Keyboard(Keyboard&&) = default; + public: struct PlatformImplementation; inline static uptr impl = nullptr; diff --git a/inc/xna/input/mouse.hpp b/inc/xna/input/mouse.hpp index 2f8277f..8686291 100644 --- a/inc/xna/input/mouse.hpp +++ b/inc/xna/input/mouse.hpp @@ -24,16 +24,16 @@ namespace xna { static bool IsConnected(); static bool IsVisible(); static void IsVisible(bool value); - static void ResetScrollWheel(); - - Mouse() = delete; - Mouse(Mouse&) = delete; - Mouse(Mouse&&) = delete; + static void ResetScrollWheel(); private: friend class Game; static void Initialize(); + Mouse() = default; + Mouse(Mouse&) = default; + Mouse(Mouse&&) = default; + public: struct PlatformImplementation; inline static uptr impl = nullptr; diff --git a/inc/xna/platform-dx/init.hpp b/inc/xna/platform-dx/init.hpp deleted file mode 100644 index b047fe9..0000000 --- a/inc/xna/platform-dx/init.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef XNA_PLATFORM_INIT_HPP -#define XNA_PLATFORM_INIT_HPP - -#include "../default.hpp" -#include "../csharp/type.hpp" -#include "../content/typereadermanager.hpp" -#include "../platforminit.hpp" - -namespace xna { - struct PlatformInit { - static void Init() { - InitRegisteredTypes(); - InitActivadors(); - } - - static void InitRegisteredTypes(); - static void InitActivadors(); - - private: - template - static void insertRegisteredReader(String const& readerName) { - const auto reader = typeof(); - //Type::NameOfRegisteredTypes.insert({ "xna::" + readerName, reader }); - Type::NameOfRegisteredTypes.insert({ reader->FullName(), reader }); - Type::NameOfRegisteredTypes.insert({ "Microsoft.Xna.Framework.Content." + readerName, reader }); - } - - template - static void insertRegisteredReader(String const& readerName, String const& microsoftNameFullName) { - const auto reader = typeof(); - //Type::NameOfRegisteredTypes.insert({ "xna::" + readerName, reader }); - Type::NameOfRegisteredTypes.insert({ reader->FullName(), reader }); - Type::NameOfRegisteredTypes.insert({ microsoftNameFullName, reader }); - } - - template - static void insertActivadorReader() { - ContentTypeReaderActivador::SetActivador(typeof(), []() -> sptr { - auto obj = snew(); - return reinterpret_pointer_cast(obj); - }); - } - }; -} - -#endif \ No newline at end of file diff --git a/inc/xna/platforminit.hpp b/inc/xna/platforminit.hpp deleted file mode 100644 index 10071c6..0000000 --- a/inc/xna/platforminit.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef XNA_PLATFORMINIT_HPP -#define XNA_PLATFORMINIT_HPP - -namespace xna { - //Exposes functions that must be implemented by the platform - struct Platform { - //Initialization function, which must be implemented by the platform, - //and be called before the game is executed - static void Init(); - }; -} - -#endif \ No newline at end of file diff --git a/inc/xna/types.hpp b/inc/xna/types.hpp deleted file mode 100644 index 2fffd95..0000000 --- a/inc/xna/types.hpp +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef XNA_TYPES_HPP -#define XNA_TYPES_HPP - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace xna { - - // - // C# standard types - // - - using Sbyte = int8_t; - using Byte = uint8_t; - using Short = int16_t; - using Ushort = uint16_t; - using Int = int32_t; - using Uint = uint32_t; - using Long = int64_t; - using Ulong = uint64_t; - using Char = char16_t; - - // - // C# Min and Max Value - // - - constexpr Sbyte SbyteMaxValue = (std::numeric_limits::max)(); - constexpr Sbyte SbyteMinValue = (std::numeric_limits::min)(); - constexpr Byte ByteMaxValue = (std::numeric_limits::max)(); - constexpr Byte ByteMinValue = (std::numeric_limits::min)(); - constexpr Short ShortMaxValue = (std::numeric_limits::max)(); - constexpr Short ShortMinValue = (std::numeric_limits::min)(); - constexpr Ushort UshortMaxValue = (std::numeric_limits::max)(); - constexpr Ushort UshortMinValue = (std::numeric_limits::min)(); - constexpr Int IntMaxValue = (std::numeric_limits::max)(); - constexpr Int IntMinValue = (std::numeric_limits::min)(); - constexpr Uint UintMaxValue = (std::numeric_limits::max)(); - constexpr Uint UintMinValue = (std::numeric_limits::min)(); - constexpr Long LongMaxValue = (std::numeric_limits::max)(); - constexpr Long LongMinValue = (std::numeric_limits::min)(); - constexpr Ulong UlongMaxValue = (std::numeric_limits::max)(); - constexpr Ulong UlongMinValue = (std::numeric_limits::min)(); - constexpr Char CharMaxValue = (std::numeric_limits::max)(); - constexpr Char CharMinValue = (std::numeric_limits::min)(); - constexpr float FloatMaxValue = (std::numeric_limits::max)(); - constexpr float FloatMinValue = (std::numeric_limits::min)(); - constexpr double DoubleMaxValue = (std::numeric_limits::max)(); - constexpr double DoubleMinValue = (std::numeric_limits::min)(); - - // - // About strings: https://stackoverflow.com/questions/402283/stdwstring-vs-stdstring - // - - //Same as std::string - using String = std::string; - - //Same as std::wstring - using WString = std::wstring; - - //Same as std::shared_ptr - template - using sptr = std::shared_ptr; - - //Same as std::weak_ptr - template - using wptr = std::weak_ptr; - - //Same as std::unique_ptr - template - using uptr = std::unique_ptr; - - //Same as std::make_shared - template - inline std::shared_ptr<_Ty> snew(_Types&&... _Args) { - return std::make_shared<_Ty>(std::forward<_Types>(_Args)...); - } - - //Same as std::make_unique - template - inline std::unique_ptr<_Ty> unew(_Types&&... _Args) { - return std::make_unique<_Ty>(std::forward<_Types>(_Args)...); - } - -//See ref: https://en.cppreference.com/w/cpp/error/assert -#define assertm(exp, msg) assert(((void)msg, exp)) -} - -#endif \ No newline at end of file diff --git a/inc/xna/platform-dx/dx.hpp b/inc/xna/xna-dx.hpp similarity index 93% rename from inc/xna/platform-dx/dx.hpp rename to inc/xna/xna-dx.hpp index 321acc8..75944f6 100644 --- a/inc/xna/platform-dx/dx.hpp +++ b/inc/xna/xna-dx.hpp @@ -1,9 +1,7 @@ #ifndef XNA_PLATFORMDX_DX_HPP #define XNA_PLATFORMDX_DX_HPP -//--------------------------------// -// DX INCLUDES -//--------------------------------// +//---------------- DX INCLUDES ----------------// //DirectX #if defined(_XBOX_ONE) && defined(_TITLE) @@ -48,55 +46,19 @@ #include #include -//--------------------------------// -// USINGS -//--------------------------------// +//---------------- USINGS ----------------// template using comptr = Microsoft::WRL::ComPtr; -//--------------------------------// -// OTHERS INCLUDES -//--------------------------------// +//---------------- INCLUDES ----------------// -#include "../default.hpp" -#include "../exception.hpp" -#include "../graphics/blendstate.hpp" -#include "../graphics/adapter.hpp" -#include "../graphics/device.hpp" -#include "../graphics/adapter.hpp" -#include "../graphics/blendstate.hpp" -#include "../graphics/depthstencilstate.hpp" -#include "../graphics/displaymode.hpp" -#include "../graphics/sprite.hpp" -#include "../graphics/effect.hpp" -#include "../graphics/samplerstate.hpp" -#include "../input/gamepad.hpp" -#include "../input/keyboard.hpp" -#include "../input/mouse.hpp" -#include "../graphics/rasterizerstate.hpp" -#include "../graphics/presentparams.hpp" -#include "../graphics/swapchain.hpp" -#include "../graphics/texture.hpp" -#include "../graphics/rendertarget.hpp" -#include "../game/window.hpp" -#include "../audio/audioengine.hpp" -#include "../audio/soundeffect.hpp" -#include "../graphics/viewport.hpp" -#include "../common/color.hpp" -#include "../game/game.hpp" -#include -#include -#include +#include "xna.hpp" -//--------------------------------// -// CLASSES -//--------------------------------// +//---------------- CLASSES ----------------// namespace xna { - //==============================================// - //================ DXHELPERS ================// - //==============================================// + //---------------- HELPERS ----------------// struct DxHelpers { static constexpr DirectX::XMVECTOR VectorToDx(Vector2 const& value) { @@ -378,12 +340,43 @@ namespace xna { static constexpr TextureAddressMode TextureAddresModeToXna(D3D11_TEXTURE_ADDRESS_MODE value) { return static_cast(value - 1); } + }; + + struct PlatformInit { + static void Init() { + InitRegisteredTypes(); + InitActivadors(); + } + + static void InitRegisteredTypes(); + static void InitActivadors(); + + private: + template + static void insertRegisteredReader(String const& readerName) { + const auto reader = typeof(); + //Type::NameOfRegisteredTypes.insert({ "xna::" + readerName, reader }); + Type::NameOfRegisteredTypes.insert({ reader->FullName(), reader }); + Type::NameOfRegisteredTypes.insert({ "Microsoft.Xna.Framework.Content." + readerName, reader }); + } + + template + static void insertRegisteredReader(String const& readerName, String const& microsoftNameFullName) { + const auto reader = typeof(); + //Type::NameOfRegisteredTypes.insert({ "xna::" + readerName, reader }); + Type::NameOfRegisteredTypes.insert({ reader->FullName(), reader }); + Type::NameOfRegisteredTypes.insert({ microsoftNameFullName, reader }); + } + + template + static void insertActivadorReader() { + ContentTypeReaderActivador::SetActivador(typeof(), []() -> sptr { + auto obj = snew(); + return reinterpret_pointer_cast(obj); + }); + } }; - - //==============================================// - //================ STEPTIMER ================// - //==============================================// - + // Helper class for animation and simulation timing. class StepTimer { @@ -561,10 +554,7 @@ namespace xna { uint64_t m_targetElapsedTicks; }; - - //==============================================// - //================ IMPL ================// - //==============================================// + //---------------- IMPL ----------------// struct SpriteFont::PlatformImplementation { uptr _dxSpriteFont{ nullptr }; diff --git a/inc/xna/xna.hpp b/inc/xna/xna.hpp index 5f017df..427eb79 100644 --- a/inc/xna/xna.hpp +++ b/inc/xna/xna.hpp @@ -1,3 +1,6 @@ +#ifndef XNA_XNA_HPP +#define XNA_XNA_HPP + #define NOMINMAX #include "audio/audioengine.hpp" #include "audio/soundeffect.hpp" @@ -16,12 +19,10 @@ #include "content/typereadermanager.hpp" #include "csharp/binary.hpp" #include "csharp/buffer.hpp" -#include "csharp/object.hpp" #include "csharp/service.hpp" #include "csharp/stream.hpp" #include "csharp/timespan.hpp" #include "csharp/type.hpp" -#include "enums.hpp" #include "exception.hpp" #include "game/component.hpp" #include "game/game.hpp" @@ -35,6 +36,7 @@ #include "graphics/depthstencilstate.hpp" #include "graphics/device.hpp" #include "graphics/displaymode.hpp" +#include "graphics/effect.hpp" #include "graphics/gresource.hpp" #include "graphics/presentparams.hpp" #include "graphics/rasterizerstate.hpp" @@ -49,6 +51,14 @@ #include "input/gamepad.hpp" #include "input/keyboard.hpp" #include "input/mouse.hpp" -#include "platforminit.hpp" -#include "types.hpp" -#include "xna/platform-dx/dx.hpp" \ No newline at end of file + +namespace xna { + //Exposes functions that must be implemented by the platform + struct Platform { + //Initialization function, which must be implemented by the platform, + //and be called before the game is executed + static void Init(); + }; +} + +#endif \ No newline at end of file diff --git a/samples/01_blank/xna.cpp b/samples/01_blank/xna.cpp index c14c086..dc97e81 100644 --- a/samples/01_blank/xna.cpp +++ b/samples/01_blank/xna.cpp @@ -2,6 +2,7 @@ // #include "xna/xna.hpp" +#include "xna/xna-dx.hpp" using namespace std; using namespace xna; @@ -26,7 +27,6 @@ namespace xna { void LoadContent() override { spriteBatch = snew(graphicsDevice); - auto texture = Content()->Load("Idle"); Game::LoadContent(); } diff --git a/samples/02_PlatfformerStarterKit/animation.hpp b/samples/02_PlatfformerStarterKit/animation.hpp index 6dc2209..28f80ad 100644 --- a/samples/02_PlatfformerStarterKit/animation.hpp +++ b/samples/02_PlatfformerStarterKit/animation.hpp @@ -1,7 +1,7 @@ #ifndef PLATFORMSTARTERKIT_ANIMATION_HPP #define PLATFORMSTARTERKIT_ANIMATION_HPP -#include "xna/xna.hpp" +#include "headers.hpp" namespace PlatformerStarterKit { /* diff --git a/samples/02_PlatfformerStarterKit/circle.hpp b/samples/02_PlatfformerStarterKit/circle.hpp index d3146fa..8fbc889 100644 --- a/samples/02_PlatfformerStarterKit/circle.hpp +++ b/samples/02_PlatfformerStarterKit/circle.hpp @@ -1,7 +1,7 @@ #ifndef PLATFORMSTARTERKIT_CIRCLE_HPP #define PLATFORMSTARTERKIT_CIRCLE_HPP -#include "xna/xna.hpp" +#include "headers.hpp" namespace PlatformerStarterKit { //Represents a 2D circle. diff --git a/samples/02_PlatfformerStarterKit/enemy.hpp b/samples/02_PlatfformerStarterKit/enemy.hpp index 9a1aef9..64c48f8 100644 --- a/samples/02_PlatfformerStarterKit/enemy.hpp +++ b/samples/02_PlatfformerStarterKit/enemy.hpp @@ -1,7 +1,7 @@ #ifndef PLATFORMSTARTERKIT_ENEMY_HPP #define PLATFORMSTARTERKIT_ENEMY_HPP -#include "xna/xna.hpp" +#include "headers.hpp" #include "animation.hpp" namespace PlatformerStarterKit { diff --git a/samples/02_PlatfformerStarterKit/game.cpp b/samples/02_PlatfformerStarterKit/game.cpp index d7ee920..958688f 100644 --- a/samples/02_PlatfformerStarterKit/game.cpp +++ b/samples/02_PlatfformerStarterKit/game.cpp @@ -1,7 +1,7 @@ // xna.cpp : Defines the entry point for the application. // -#include "xna/xna.hpp" +#include "headers.hpp" #include "player.hpp" #include "enemy.hpp" #include "level.hpp" diff --git a/samples/02_PlatfformerStarterKit/gem.hpp b/samples/02_PlatfformerStarterKit/gem.hpp index 949a31b..df98bdc 100644 --- a/samples/02_PlatfformerStarterKit/gem.hpp +++ b/samples/02_PlatfformerStarterKit/gem.hpp @@ -1,7 +1,7 @@ #ifndef PLATFORMSTARTERKIT_GEM_HPP #define PLATFORMSTARTERKIT_GEM_HPP -#include "xna/xna.hpp" +#include "headers.hpp" #include "circle.hpp" #include "tile.hpp" diff --git a/samples/02_PlatfformerStarterKit/headers.hpp b/samples/02_PlatfformerStarterKit/headers.hpp new file mode 100644 index 0000000..951642e --- /dev/null +++ b/samples/02_PlatfformerStarterKit/headers.hpp @@ -0,0 +1,2 @@ +#include "xna/xna.hpp" +#include "xna/xna-dx.hpp" \ No newline at end of file diff --git a/samples/02_PlatfformerStarterKit/level.hpp b/samples/02_PlatfformerStarterKit/level.hpp index 4261614..7c84557 100644 --- a/samples/02_PlatfformerStarterKit/level.hpp +++ b/samples/02_PlatfformerStarterKit/level.hpp @@ -1,7 +1,7 @@ #ifndef PLATFORMSTARTERKIT_LEVEL_HPP #define PLATFORMSTARTERKIT_LEVEL_HPP -#include "xna/xna.hpp" +#include "headers.hpp" #include "tile.hpp" namespace PlatformerStarterKit { diff --git a/samples/02_PlatfformerStarterKit/player.hpp b/samples/02_PlatfformerStarterKit/player.hpp index 684efd6..8872554 100644 --- a/samples/02_PlatfformerStarterKit/player.hpp +++ b/samples/02_PlatfformerStarterKit/player.hpp @@ -1,7 +1,7 @@ #ifndef PLATFORMSTARTERKIT_PLAYER_HPP #define PLATFORMSTARTERKIT_PLAYER_HPP -#include "xna/xna.hpp" +#include "headers.hpp" #include "animation.hpp" namespace PlatformerStarterKit { diff --git a/samples/02_PlatfformerStarterKit/tile.hpp b/samples/02_PlatfformerStarterKit/tile.hpp index f2374a7..bf24a9c 100644 --- a/samples/02_PlatfformerStarterKit/tile.hpp +++ b/samples/02_PlatfformerStarterKit/tile.hpp @@ -1,6 +1,8 @@ #ifndef PLATFORMSTARTERKIT_TILE_HPP #define PLATFORMSTARTERKIT_TILE_HPP +#include "headers.hpp" + namespace PlatformerStarterKit { // Controls the collision detection and response behavior of a tile. enum class TileCollision {