From 70a1778d2226c3a0411c4f38967cf5509f213f5b Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 11 Mar 2019 20:32:13 +0300 Subject: [PATCH] 2019.3 --- .gitignore | 47 ++- RendererDirect3D12/RendererDirect3D12.cpp | 6 - RendererDirect3D12/RendererDirect3D12.vcxproj | 20 +- .../RendererDirect3D12.vcxproj.filters | 29 +- RendererDirect3D12/dllmain.cpp | 19 -- RendererDirect3D12/src/CGI/CGI.h | 3 + RendererDirect3D12/src/CGI/RendererD3D12.cpp | 285 ++++++++++++++++++ RendererDirect3D12/src/CGI/RendererD3D12.h | 61 ++++ RendererDirect3D12/src/main.cpp | 41 +++ RendererDirect3D12/{ => src}/stdafx.cpp | 0 RendererDirect3D12/src/stdafx.h | 6 + RendererDirect3D12/stdafx.h | 16 - RendererDirect3D12/targetver.h | 8 - RendererVulkan/RendererVulkan.cpp | 6 - RendererVulkan/RendererVulkan.vcxproj | 17 +- RendererVulkan/RendererVulkan.vcxproj.filters | 21 +- RendererVulkan/dllmain.cpp | 19 -- RendererVulkan/src/main.cpp | 49 +++ RendererVulkan/{ => src}/stdafx.cpp | 0 RendererVulkan/src/stdafx.h | 4 + RendererVulkan/stdafx.h | 16 - RendererVulkan/targetver.h | 8 - Verus/Verus.vcxproj | 9 +- Verus/Verus.vcxproj.filters | 21 ++ Verus/src/Anim/Skeleton.h | 2 +- Verus/src/CGI/BaseRenderer.cpp | 25 ++ Verus/src/CGI/BaseRenderer.h | 54 ++++ Verus/src/CGI/CGI.cpp | 13 + Verus/src/CGI/CGI.h | 9 + Verus/src/CGI/Renderer.cpp | 66 ++++ Verus/src/CGI/Renderer.h | 39 +++ Verus/src/Game/BaseGame.cpp | 58 ++-- Verus/src/Game/BaseGame.h | 1 + Verus/src/Global/EngineInit.cpp | 130 ++++---- Verus/src/Global/EngineInit.h | 8 +- Verus/src/Global/Global.h | 1 + Verus/src/Global/GlobalVarsClipboard.cpp | 21 ++ Verus/src/Global/GlobalVarsClipboard.h | 22 ++ Verus/src/Global/Macros.h | 9 + Verus/src/Global/QuickRefs.h | 54 ++-- Verus/src/Global/Timer.cpp | 6 +- Verus/src/Global/Utils.cpp | 2 +- Verus/src/IO/Json.cpp | 2 +- Verus/src/verus.h | Bin 7540 -> 7920 bytes 44 files changed, 951 insertions(+), 282 deletions(-) delete mode 100644 RendererDirect3D12/RendererDirect3D12.cpp delete mode 100644 RendererDirect3D12/dllmain.cpp create mode 100644 RendererDirect3D12/src/CGI/CGI.h create mode 100644 RendererDirect3D12/src/CGI/RendererD3D12.cpp create mode 100644 RendererDirect3D12/src/CGI/RendererD3D12.h create mode 100644 RendererDirect3D12/src/main.cpp rename RendererDirect3D12/{ => src}/stdafx.cpp (100%) create mode 100644 RendererDirect3D12/src/stdafx.h delete mode 100644 RendererDirect3D12/stdafx.h delete mode 100644 RendererDirect3D12/targetver.h delete mode 100644 RendererVulkan/RendererVulkan.cpp delete mode 100644 RendererVulkan/dllmain.cpp create mode 100644 RendererVulkan/src/main.cpp rename RendererVulkan/{ => src}/stdafx.cpp (100%) create mode 100644 RendererVulkan/src/stdafx.h delete mode 100644 RendererVulkan/stdafx.h delete mode 100644 RendererVulkan/targetver.h create mode 100644 Verus/src/CGI/BaseRenderer.cpp create mode 100644 Verus/src/CGI/BaseRenderer.h create mode 100644 Verus/src/CGI/CGI.cpp create mode 100644 Verus/src/CGI/Renderer.cpp create mode 100644 Verus/src/CGI/Renderer.h create mode 100644 Verus/src/Global/GlobalVarsClipboard.cpp create mode 100644 Verus/src/Global/GlobalVarsClipboard.h diff --git a/.gitignore b/.gitignore index 8e930f5..4d29707 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files +*.rsuser *.suo *.user *.userosscache @@ -12,6 +13,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# Mono auto generated files +mono_crash.* + # Build results [Dd]ebug/ [Dd]ebugPublic/ @@ -19,6 +23,8 @@ [Rr]eleases/ x64/ x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ @@ -52,7 +58,6 @@ BenchmarkDotNet.Artifacts/ project.lock.json project.fragment.lock.json artifacts/ -**/Properties/launchSettings.json # StyleCop StyleCopReport.xml @@ -60,12 +65,14 @@ StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c -*_i.h +*_h.h *.ilk *.meta *.obj +*.iobj *.pch *.pdb +*.ipdb *.pgc *.pgd *.rsp @@ -75,6 +82,7 @@ StyleCopReport.xml *.tlh *.tmp *.tmp_proj +*_wpftmp.csproj *.log *.vspscc *.vssscc @@ -201,12 +209,14 @@ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx +*.appxbundle +*.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache -!*.[Cc]ache/ +!?*.[Cc]ache/ # Others ClientBin/ @@ -219,13 +229,15 @@ ClientBin/ *.publishsettings orleans.codegen.cs -# Including strong name files can present a security risk +# Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk # Since there are multiple workflows, uncomment next line to ignore bower_components # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) #bower_components/ +# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true +**/wwwroot/lib/ # RIA/Silverlight projects Generated_Code/ @@ -238,6 +250,7 @@ Backup*/ UpgradeLog*.XML UpgradeLog*.htm ServiceFabricBackup/ +*.rptproj.bak # SQL Server files *.mdf @@ -248,6 +261,8 @@ ServiceFabricBackup/ *.rdl.data *.bim.layout *.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl # Microsoft Fakes FakesAssemblies/ @@ -283,12 +298,8 @@ paket-files/ # FAKE - F# Make .fake/ -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush -.cr/ +# CodeRush personal settings +.cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ @@ -313,9 +324,23 @@ __pycache__/ # OpenCover UI analysis results OpenCover/ -# Azure Stream Analytics local run output +# Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log *.binlog +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ diff --git a/RendererDirect3D12/RendererDirect3D12.cpp b/RendererDirect3D12/RendererDirect3D12.cpp deleted file mode 100644 index e95862c..0000000 --- a/RendererDirect3D12/RendererDirect3D12.cpp +++ /dev/null @@ -1,6 +0,0 @@ -// RendererDirect3D12.cpp : Defines the exported functions for the DLL application. -// - -#include "stdafx.h" - - diff --git a/RendererDirect3D12/RendererDirect3D12.vcxproj b/RendererDirect3D12/RendererDirect3D12.vcxproj index 0d3c9a2..b4eca36 100644 --- a/RendererDirect3D12/RendererDirect3D12.vcxproj +++ b/RendererDirect3D12/RendererDirect3D12.vcxproj @@ -38,16 +38,20 @@ + + true + $(ProjectDir)src;$(IncludePath) false + $(ProjectDir)src;$(IncludePath) @@ -82,13 +86,19 @@ - - + + {b154d670-e4b1-4d8a-885c-69546a5bd833} + - - - + + + + + + + + Create Create diff --git a/RendererDirect3D12/RendererDirect3D12.vcxproj.filters b/RendererDirect3D12/RendererDirect3D12.vcxproj.filters index 2c8dcf7..4dca2f7 100644 --- a/RendererDirect3D12/RendererDirect3D12.vcxproj.filters +++ b/RendererDirect3D12/RendererDirect3D12.vcxproj.filters @@ -13,24 +13,33 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {67b732c1-b652-4393-b74b-d4836b3df718} + + + {8cd5524f-64b4-4674-ae77-6a7cf86b4449} + - - Header Files + + src - - Header Files + + src\CGI + + + src\CGI - - Source Files + + src - - Source Files + + src - - Source Files + + src\CGI \ No newline at end of file diff --git a/RendererDirect3D12/dllmain.cpp b/RendererDirect3D12/dllmain.cpp deleted file mode 100644 index 465ae72..0000000 --- a/RendererDirect3D12/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "stdafx.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - diff --git a/RendererDirect3D12/src/CGI/CGI.h b/RendererDirect3D12/src/CGI/CGI.h new file mode 100644 index 0000000..ca4e44b --- /dev/null +++ b/RendererDirect3D12/src/CGI/CGI.h @@ -0,0 +1,3 @@ +#pragma once + +#include "RendererD3D12.h" diff --git a/RendererDirect3D12/src/CGI/RendererD3D12.cpp b/RendererDirect3D12/src/CGI/RendererD3D12.cpp new file mode 100644 index 0000000..5c25351 --- /dev/null +++ b/RendererDirect3D12/src/CGI/RendererD3D12.cpp @@ -0,0 +1,285 @@ +#include "stdafx.h" + +using namespace verus; +using namespace verus::CGI; + +RendererD3D12::RendererD3D12() +{ +} + +RendererD3D12::~RendererD3D12() +{ + Done(); +} + +void RendererD3D12::ReleaseMe() +{ + Free(); + TestAllocCount(); +} + +void RendererD3D12::Init() +{ + VERUS_INIT(); + + InitD3D(); +} + +void RendererD3D12::Done() +{ + VERUS_DONE(RendererD3D12); +} + +void RendererD3D12::EnableDebugLayer() +{ + CComPtr pDebug; + if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDebug)))) + pDebug->EnableDebugLayer(); +} + +CComPtr RendererD3D12::CreateDXGIFactory() +{ + HRESULT hr = 0; + CComPtr pFactory; + UINT flags = 0; +#if defined(_DEBUG) || defined(VERUS_DEBUG) + flags = DXGI_CREATE_FACTORY_DEBUG; +#endif + if (FAILED(hr = CreateDXGIFactory2(flags, IID_PPV_ARGS(&pFactory)))) + throw VERUS_RUNTIME_ERROR << "CreateDXGIFactory2(), hr=" << VERUS_HR(hr); + return pFactory; +} + +CComPtr RendererD3D12::GetAdapter(CComPtr pFactory) +{ + HRESULT hr = 0; + CComPtr pAdapter; + if (FAILED(hr = pFactory->EnumAdapterByGpuPreference(0, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(&pAdapter)))) + throw VERUS_RUNTIME_ERROR << "EnumAdapterByGpuPreference(), hr=" << VERUS_HR(hr); + return pAdapter; +} + +bool RendererD3D12::CheckFeatureSupportAllowTearing(CComPtr pFactory) +{ + BOOL data = FALSE; + if (FAILED(pFactory->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &data, sizeof(data)))) + data = FALSE; + return data == TRUE; +} + +void RendererD3D12::CreateSwapChainBuffersRTVs() +{ + HRESULT hr = 0; + _swapChainBuffersRTVs = CreateDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE_RTV, _swapChainDesc.BufferCount); + _vSwapChainBuffers.resize(_swapChainDesc.BufferCount); + auto dh = _swapChainBuffersRTVs->GetCPUDescriptorHandleForHeapStart(); + VERUS_U_FOR(i, _swapChainDesc.BufferCount) + { + CComPtr pBuffer; + if (FAILED(hr = _pSwapChain->GetBuffer(i, IID_PPV_ARGS(&pBuffer)))) + throw VERUS_RUNTIME_ERROR << "GetBuffer(), hr=" << VERUS_HR(hr); + _pDevice->CreateRenderTargetView(pBuffer, nullptr, dh); + _vSwapChainBuffers[i] = pBuffer; + dh.ptr += _descHandleIncSizeRTV; + } +} + +void RendererD3D12::InitD3D() +{ + VERUS_QREF_SETTINGS; + + HRESULT hr = 0; + +#if defined(_DEBUG) || defined(VERUS_DEBUG) + EnableDebugLayer(); +#endif + + CComPtr pFactory = CreateDXGIFactory(); + + CComPtr pAdapter = GetAdapter(pFactory); + + if (FAILED(hr = D3D12CreateDevice(pAdapter, D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&_pDevice)))) + throw VERUS_RUNTIME_ERROR << "D3D12CreateDevice(), hr=" << VERUS_HR(hr); + + _pCommandQueue = CreateCommandQueue(D3D12_COMMAND_LIST_TYPE_DIRECT); + + _swapChainDesc.Width = settings._screenSizeWidth; + _swapChainDesc.Height = settings._screenSizeHeight; + _swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + _swapChainDesc.Stereo = FALSE; + _swapChainDesc.SampleDesc.Count = 1; + _swapChainDesc.SampleDesc.Quality = 0; + _swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + _swapChainDesc.BufferCount = 2; + _swapChainDesc.Scaling = DXGI_SCALING_STRETCH; + _swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + _swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; + _swapChainDesc.Flags = CheckFeatureSupportAllowTearing(pFactory) ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0; + + CComPtr pSwapChain1; + if (FAILED(hr = pFactory->CreateSwapChainForHwnd(_pCommandQueue, GetActiveWindow(), &_swapChainDesc, nullptr, nullptr, &pSwapChain1))) + throw VERUS_RUNTIME_ERROR << "CreateSwapChainForHwnd(), hr=" << VERUS_HR(hr); + if (FAILED(hr = pSwapChain1.QueryInterface(&_pSwapChain))) + throw VERUS_RUNTIME_ERROR << "QueryInterface(), hr=" << VERUS_HR(hr); + + _descHandleIncSizeRTV = _pDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + + _currentBackBufferIndex = _pSwapChain->GetCurrentBackBufferIndex(); + + CreateSwapChainBuffersRTVs(); + + _vCommandAllocators.resize(_swapChainDesc.BufferCount); + VERUS_U_FOR(i, _swapChainDesc.BufferCount) + _vCommandAllocators[i] = CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT); + + _pCommandList = CreateCommandList(D3D12_COMMAND_LIST_TYPE_DIRECT, _vCommandAllocators[_currentBackBufferIndex]); + + _pFence = CreateFence(); + _hFence = CreateEvent(nullptr, FALSE, FALSE, nullptr); + _vFenceValues.resize(_swapChainDesc.BufferCount); +} + +CComPtr RendererD3D12::CreateCommandQueue(D3D12_COMMAND_LIST_TYPE type) +{ + HRESULT hr = 0; + CComPtr pCommandQueue; + D3D12_COMMAND_QUEUE_DESC desc = {}; + desc.Type = type; + desc.Priority = D3D12_COMMAND_QUEUE_PRIORITY_NORMAL; + desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + if (FAILED(hr = _pDevice->CreateCommandQueue(&desc, IID_PPV_ARGS(&pCommandQueue)))) + throw VERUS_RUNTIME_ERROR << "CreateCommandQueue(), hr=" << VERUS_HR(hr); + return pCommandQueue; +} + +CComPtr RendererD3D12::CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE type) +{ + HRESULT hr = 0; + CComPtr pCommandAllocator; + if (FAILED(hr = _pDevice->CreateCommandAllocator(type, IID_PPV_ARGS(&pCommandAllocator)))) + throw VERUS_RUNTIME_ERROR << "CreateCommandAllocator(), hr=" << VERUS_HR(hr); + return pCommandAllocator; +} + +CComPtr RendererD3D12::CreateCommandList(D3D12_COMMAND_LIST_TYPE type, CComPtr pCommandAllocator) +{ + HRESULT hr = 0; + CComPtr pGraphicsCommandList; + if (FAILED(hr = _pDevice->CreateCommandList(0, type, pCommandAllocator, nullptr, IID_PPV_ARGS(&pGraphicsCommandList)))) + throw VERUS_RUNTIME_ERROR << "CreateCommandList(), hr=" << VERUS_HR(hr); + if (FAILED(hr = pGraphicsCommandList->Close())) + throw VERUS_RUNTIME_ERROR << "Close(), hr=" << VERUS_HR(hr); + return pGraphicsCommandList; +} + +CComPtr RendererD3D12::CreateDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE type, UINT num) +{ + HRESULT hr = 0; + CComPtr pDescriptorHeap; + D3D12_DESCRIPTOR_HEAP_DESC desc = {}; + desc.Type = type; + desc.NumDescriptors = num; + if (FAILED(hr = _pDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&pDescriptorHeap)))) + throw VERUS_RUNTIME_ERROR << "CreateDescriptorHeap(), hr=" << VERUS_HR(hr); + return pDescriptorHeap; +} + +CComPtr RendererD3D12::CreateFence() +{ + HRESULT hr = 0; + CComPtr pFence; + if (FAILED(hr = _pDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&pFence)))) + throw VERUS_RUNTIME_ERROR << "CreateFence(), hr=" << VERUS_HR(hr); + return pFence; +} + +UINT64 RendererD3D12::Signal() +{ + HRESULT hr = 0; + const UINT64 value = ++_fenceValue; + if (FAILED(hr = _pCommandQueue->Signal(_pFence, value))) + throw VERUS_RUNTIME_ERROR << "Signal(), hr=" << VERUS_HR(hr); + return value; +} + +void RendererD3D12::WaitForFenceValue(UINT64 value) +{ + HRESULT hr = 0; + if (_pFence->GetCompletedValue() < value) + { + if (FAILED(hr = _pFence->SetEventOnCompletion(value, _hFence))) + throw VERUS_RUNTIME_ERROR << "SetEventOnCompletion(), hr=" << VERUS_HR(hr); + WaitForSingleObject(_hFence, INFINITE); + } +} + +void RendererD3D12::Flush() +{ + const UINT64 value = Signal(); + WaitForFenceValue(value); +} + +D3D12_RESOURCE_BARRIER RendererD3D12::MakeResourceBarrierTransition(ID3D12Resource* pResource, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after) +{ + D3D12_RESOURCE_BARRIER rb = {}; + rb.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + rb.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + rb.Transition.pResource = pResource; + rb.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + rb.Transition.StateBefore = before; + rb.Transition.StateAfter = after; + return rb; +} + +void RendererD3D12::PrepareDraw() +{ + auto pBackBuffer = _vSwapChainBuffers[_currentBackBufferIndex]; + auto pCommandAllocator = _vCommandAllocators[_currentBackBufferIndex]; + + pCommandAllocator->Reset(); + _pCommandList->Reset(pCommandAllocator, nullptr); + + const auto rb = MakeResourceBarrierTransition(pBackBuffer, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); + _pCommandList->ResourceBarrier(1, &rb); +} + +void RendererD3D12::Clear(UINT32 flags) +{ + static float x = 0; + x += 0.0001f; + x = fmod(x, 1.f); + FLOAT clearColor[] = { x, 0.5f, 0.25f, 1.0f }; + + auto dh = _swapChainBuffersRTVs->GetCPUDescriptorHandleForHeapStart(); + dh.ptr += _currentBackBufferIndex * _descHandleIncSizeRTV; + + _pCommandList->ClearRenderTargetView(dh, clearColor, 0, nullptr); +} + +void RendererD3D12::Present() +{ + HRESULT hr = 0; + + bool g_VSync = false; + bool g_TearingSupported = false; + + auto pBackBuffer = _vSwapChainBuffers[_currentBackBufferIndex]; + + const auto rb = MakeResourceBarrierTransition(pBackBuffer, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + _pCommandList->ResourceBarrier(1, &rb); + + if (FAILED(hr = _pCommandList->Close())) + throw VERUS_RUNTIME_ERROR << "Close(), hr=" << VERUS_HR(hr); + + ID3D12CommandList* ppCommandLists[] = { _pCommandList }; + _pCommandQueue->ExecuteCommandLists(VERUS_ARRAY_LENGTH(ppCommandLists), ppCommandLists); + + _vFenceValues[_currentBackBufferIndex] = Signal(); + UINT syncInterval = g_VSync ? 1 : 0; + UINT flags = g_TearingSupported && !g_VSync ? DXGI_PRESENT_ALLOW_TEARING : 0; + if (FAILED(hr = _pSwapChain->Present(syncInterval, flags))) + throw VERUS_RUNTIME_ERROR << "Present(), hr=" << VERUS_HR(hr); + + _currentBackBufferIndex = _pSwapChain->GetCurrentBackBufferIndex(); + WaitForFenceValue(_vFenceValues[_currentBackBufferIndex]); +} diff --git a/RendererDirect3D12/src/CGI/RendererD3D12.h b/RendererDirect3D12/src/CGI/RendererD3D12.h new file mode 100644 index 0000000..b4b5259 --- /dev/null +++ b/RendererDirect3D12/src/CGI/RendererD3D12.h @@ -0,0 +1,61 @@ +#pragma once + +namespace verus +{ + namespace CGI + { + class RendererD3D12 : public Singleton, public BaseRenderer + { + CComPtr _pSwapChain; + CComPtr _pDevice; + CComPtr _pCommandQueue; + CComPtr _pFence; + CComPtr _swapChainBuffersRTVs; + Vector> _vSwapChainBuffers; + Vector> _vCommandAllocators; + Vector _vFenceValues; + CComPtr _pCommandList; + DXGI_SWAP_CHAIN_DESC1 _swapChainDesc = {}; + HANDLE _hFence = 0; + UINT64 _fenceValue = 0; + UINT _descHandleIncSizeRTV = 0; + UINT _currentBackBufferIndex = 0; + + public: + RendererD3D12(); + ~RendererD3D12(); + + virtual void ReleaseMe() override; + + void Init(); + void Done(); + + VERUS_P(static void EnableDebugLayer()); + VERUS_P(static CComPtr CreateDXGIFactory()); + VERUS_P(static CComPtr GetAdapter(CComPtr pFactory)); + VERUS_P(static bool CheckFeatureSupportAllowTearing(CComPtr pFactory)); + VERUS_P(void CreateSwapChainBuffersRTVs()); + VERUS_P(void InitD3D()); + + virtual Gapi GetGapi() override { return Gapi::direct3D12; } + + CComPtr CreateCommandQueue(D3D12_COMMAND_LIST_TYPE type); + CComPtr CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE type); + CComPtr CreateCommandList(D3D12_COMMAND_LIST_TYPE type, CComPtr pCommandAllocator); + CComPtr CreateDescriptorHeap(D3D12_DESCRIPTOR_HEAP_TYPE type, UINT num); + CComPtr CreateFence(); + UINT64 Signal(); + void WaitForFenceValue(UINT64 value); + void Flush(); + + static D3D12_RESOURCE_BARRIER MakeResourceBarrierTransition(ID3D12Resource* pResource, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after); + + virtual void PrepareDraw() override; + virtual void Clear(UINT32 flags) override; + virtual void Present() override; + }; + VERUS_TYPEDEFS(RendererD3D12); + } +} + +#define VERUS_QREF_RENDERER_D3D12 CGI::PRendererD3D12 pRendererD3D12 = CGI::RendererD3D12::P() diff --git a/RendererDirect3D12/src/main.cpp b/RendererDirect3D12/src/main.cpp new file mode 100644 index 0000000..53e7265 --- /dev/null +++ b/RendererDirect3D12/src/main.cpp @@ -0,0 +1,41 @@ +#include "stdafx.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +extern "C" +{ + VERUS_DLL_EXPORT verus::CGI::PBaseRenderer VerusCreateRenderer(UINT32 version, verus::CGI::PBaseRendererDesc pDesc) + { + using namespace verus; + + if (VERUS_SDK_VERSION != version) + { + VERUS_RT_FAIL("VerusCreateRenderer(), Wrong version"); + return nullptr; + } + + pDesc->_gvc.Paste(); + + CGI::RendererD3D12::Make(); + VERUS_QREF_RENDERER_D3D12; + + pRendererD3D12->SetDesc(*pDesc); + pRendererD3D12->Init(); + + return pRendererD3D12; + } +} diff --git a/RendererDirect3D12/stdafx.cpp b/RendererDirect3D12/src/stdafx.cpp similarity index 100% rename from RendererDirect3D12/stdafx.cpp rename to RendererDirect3D12/src/stdafx.cpp diff --git a/RendererDirect3D12/src/stdafx.h b/RendererDirect3D12/src/stdafx.h new file mode 100644 index 0000000..5307074 --- /dev/null +++ b/RendererDirect3D12/src/stdafx.h @@ -0,0 +1,6 @@ +#pragma once + +#define VERUS_INCLUDE_D3D12 +#include + +#include "CGI/CGI.h" diff --git a/RendererDirect3D12/stdafx.h b/RendererDirect3D12/stdafx.h deleted file mode 100644 index f380517..0000000 --- a/RendererDirect3D12/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files -#include - - - -// reference additional headers your program requires here diff --git a/RendererDirect3D12/targetver.h b/RendererDirect3D12/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/RendererDirect3D12/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include diff --git a/RendererVulkan/RendererVulkan.cpp b/RendererVulkan/RendererVulkan.cpp deleted file mode 100644 index ca9230f..0000000 --- a/RendererVulkan/RendererVulkan.cpp +++ /dev/null @@ -1,6 +0,0 @@ -// RendererVulkan.cpp : Defines the exported functions for the DLL application. -// - -#include "stdafx.h" - - diff --git a/RendererVulkan/RendererVulkan.vcxproj b/RendererVulkan/RendererVulkan.vcxproj index 1eb722a..00170da 100644 --- a/RendererVulkan/RendererVulkan.vcxproj +++ b/RendererVulkan/RendererVulkan.vcxproj @@ -38,16 +38,20 @@ + + true + $(ProjectDir)src;$(IncludePath) false + $(ProjectDir)src;$(IncludePath) @@ -82,13 +86,16 @@ - - + + {b154d670-e4b1-4d8a-885c-69546a5bd833} + - - - + + + + + Create Create diff --git a/RendererVulkan/RendererVulkan.vcxproj.filters b/RendererVulkan/RendererVulkan.vcxproj.filters index 2356819..67dea54 100644 --- a/RendererVulkan/RendererVulkan.vcxproj.filters +++ b/RendererVulkan/RendererVulkan.vcxproj.filters @@ -13,24 +13,21 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + {836b7e96-dc7f-4278-832a-6305a03b69e4} + - - Header Files - - - Header Files + + src - - Source Files + + src - - Source Files - - - Source Files + + src \ No newline at end of file diff --git a/RendererVulkan/dllmain.cpp b/RendererVulkan/dllmain.cpp deleted file mode 100644 index 465ae72..0000000 --- a/RendererVulkan/dllmain.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "stdafx.h" - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - case DLL_PROCESS_DETACH: - break; - } - return TRUE; -} - diff --git a/RendererVulkan/src/main.cpp b/RendererVulkan/src/main.cpp new file mode 100644 index 0000000..3657b46 --- /dev/null +++ b/RendererVulkan/src/main.cpp @@ -0,0 +1,49 @@ +#include "stdafx.h" + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} + +extern "C" +{ + VERUS_DLL_EXPORT void* VerusCreateRenderer(UINT32 version, void* pDesc) + { + return nullptr; +#if 0 + using namespace verus; + + if (VERUS_SDK_VERSION != version) + { + VERUS_RT_FAIL("FAIL: wrong version"); + return nullptr; + } + + pDesc->_pack.Paste(); + + CGI::RendererVulkan::Make(); + + VERUS_QREF_RENDERER_VULKAN; + + pRendererVulkan->SetDesc(*pDesc); + + if (pDesc->m_createWindow) + pRendererVulkan->InitWindow(); + + pRendererVulkan->Init(); + + return pRendererVulkan; +#endif + } +} diff --git a/RendererVulkan/stdafx.cpp b/RendererVulkan/src/stdafx.cpp similarity index 100% rename from RendererVulkan/stdafx.cpp rename to RendererVulkan/src/stdafx.cpp diff --git a/RendererVulkan/src/stdafx.h b/RendererVulkan/src/stdafx.h new file mode 100644 index 0000000..4503504 --- /dev/null +++ b/RendererVulkan/src/stdafx.h @@ -0,0 +1,4 @@ +#pragma once + +#define VERUS_INCLUDE_VULKAN +#include diff --git a/RendererVulkan/stdafx.h b/RendererVulkan/stdafx.h deleted file mode 100644 index f380517..0000000 --- a/RendererVulkan/stdafx.h +++ /dev/null @@ -1,16 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files -#include - - - -// reference additional headers your program requires here diff --git a/RendererVulkan/targetver.h b/RendererVulkan/targetver.h deleted file mode 100644 index 87c0086..0000000 --- a/RendererVulkan/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include diff --git a/Verus/Verus.vcxproj b/Verus/Verus.vcxproj index e63f8f2..eda7f28 100644 --- a/Verus/Verus.vcxproj +++ b/Verus/Verus.vcxproj @@ -15,7 +15,7 @@ {B154D670-E4B1-4D8A-885C-69546A5BD833} Win32Proj Verus - 10.0.16299.0 + 10.0.17763.0 @@ -106,9 +106,11 @@ + + @@ -126,6 +128,7 @@ + @@ -203,8 +206,11 @@ + + + @@ -213,6 +219,7 @@ + diff --git a/Verus/Verus.vcxproj.filters b/Verus/Verus.vcxproj.filters index ffd24eb..f9258f8 100644 --- a/Verus/Verus.vcxproj.filters +++ b/Verus/Verus.vcxproj.filters @@ -354,6 +354,15 @@ src\IO + + src\Global + + + src\CGI + + + src\CGI + @@ -545,5 +554,17 @@ src\IO + + src\Global + + + src\CGI + + + src\CGI + + + src\CGI + \ No newline at end of file diff --git a/Verus/src/Anim/Skeleton.h b/Verus/src/Anim/Skeleton.h index 8db7390..6c6ce06 100644 --- a/Verus/src/Anim/Skeleton.h +++ b/Verus/src/Anim/Skeleton.h @@ -31,7 +31,7 @@ namespace verus }; VERUS_TYPEDEFS(AlphaMotion); - struct Bone : public AllocatorAware + struct Bone : AllocatorAware { Transform3 _matToBoneSpace = Transform3::identity(); Transform3 _matFromBoneSpace = Transform3::identity(); diff --git a/Verus/src/CGI/BaseRenderer.cpp b/Verus/src/CGI/BaseRenderer.cpp new file mode 100644 index 0000000..755b324 --- /dev/null +++ b/Verus/src/CGI/BaseRenderer.cpp @@ -0,0 +1,25 @@ +#include "verus.h" + +using namespace verus; +using namespace verus::CGI; + +BaseRenderer::BaseRenderer() +{ +} + +BaseRenderer::~BaseRenderer() +{ +} + +PBaseRenderer BaseRenderer::Load(CSZ dll, RBaseRendererDesc desc) +{ +#ifdef _WIN32 + PFNVERUSCREATERENDERER VerusCreateRenderer = reinterpret_cast( + GetProcAddress(LoadLibraryA(dll), "VerusCreateRenderer")); + return VerusCreateRenderer(VERUS_SDK_VERSION, &desc); +#else + PFNVERUSCREATERENDERER VerusCreateRenderer = reinterpret_cast( + dlsym(dlopen("./libRenderOpenGL.so", RTLD_LAZY), "VerusCreateRenderer")); + return VerusCreateRenderer(VERUS_SDK_VERSION, &desc); +#endif +} diff --git a/Verus/src/CGI/BaseRenderer.h b/Verus/src/CGI/BaseRenderer.h new file mode 100644 index 0000000..eb7fa43 --- /dev/null +++ b/Verus/src/CGI/BaseRenderer.h @@ -0,0 +1,54 @@ +#pragma once + +namespace verus +{ + namespace CGI + { + enum class Gapi : int + { + unknown, + vulkan, + direct3D12 + }; + + struct BaseRendererDesc + { + GlobalVarsClipboard _gvc; + + BaseRendererDesc() + { + _gvc.Copy(); + } + }; + VERUS_TYPEDEFS(BaseRendererDesc); + + class BaseRenderer : public Object + { + protected: + BaseRendererDesc _desc; + + BaseRenderer(); + virtual ~BaseRenderer(); + + public: + static BaseRenderer* Load(CSZ dll, RBaseRendererDesc desc); + + virtual void ReleaseMe() = 0; + + void SetDesc(RBaseRendererDesc desc) { _desc = desc; } + + // Which graphics API? + virtual Gapi GetGapi() = 0; + + virtual void PrepareDraw() {} + virtual void Clear(UINT32 flags) {} + virtual void Present() {} + }; + VERUS_TYPEDEFS(BaseRenderer); + } +} + +extern "C" +{ + typedef verus::CGI::PBaseRenderer(*PFNVERUSCREATERENDERER)(UINT32 version, verus::CGI::BaseRendererDesc* pDesc); +} diff --git a/Verus/src/CGI/CGI.cpp b/Verus/src/CGI/CGI.cpp new file mode 100644 index 0000000..3213c96 --- /dev/null +++ b/Verus/src/CGI/CGI.cpp @@ -0,0 +1,13 @@ +#include "verus.h" + +namespace verus +{ + void Make_CGI() + { + CGI::Renderer::Make(); + } + void Free_CGI() + { + CGI::Renderer::Free(); + } +} diff --git a/Verus/src/CGI/CGI.h b/Verus/src/CGI/CGI.h index ab2c8f6..cc965dd 100644 --- a/Verus/src/CGI/CGI.h +++ b/Verus/src/CGI/CGI.h @@ -4,3 +4,12 @@ #include "BasePipeline.h" #include "BaseShader.h" #include "BaseTexture.h" +#include "BaseRenderer.h" + +#include "Renderer.h" + +namespace verus +{ + void Make_CGI(); + void Free_CGI(); +} diff --git a/Verus/src/CGI/Renderer.cpp b/Verus/src/CGI/Renderer.cpp new file mode 100644 index 0000000..fab8f77 --- /dev/null +++ b/Verus/src/CGI/Renderer.cpp @@ -0,0 +1,66 @@ +#include "verus.h" + +using namespace verus; +using namespace verus::CGI; + +Renderer::Renderer() +{ +} + +Renderer::~Renderer() +{ + Done(); +} + +PBaseRenderer Renderer::operator->() +{ + VERUS_RT_ASSERT(_pBaseRenderer); + return _pBaseRenderer; +} + +bool Renderer::IsLoaded() +{ + return IsValidSingleton() && !!I()._pBaseRenderer; +} + +void Renderer::Init(PRendererDelegate pDelegate) +{ + VERUS_INIT(); + + VERUS_QREF_SETTINGS; + + _pRendererDelegate = pDelegate; + + CSZ dll = "RendererDirect3D12.dll"; + BaseRendererDesc desc; + + _pBaseRenderer = BaseRenderer::Load(dll, desc); + + _gapi = _pBaseRenderer->GetGapi(); +} + +void Renderer::Done() +{ + if (_pBaseRenderer) + { + _pBaseRenderer->ReleaseMe(); + _pBaseRenderer = nullptr; + } + + VERUS_SMART_DELETE(_pRendererDelegate); + + VERUS_DONE(Renderer); +} + +void Renderer::Draw() +{ + if (_pRendererDelegate) + _pRendererDelegate->Renderer_OnDraw(); +} + +void Renderer::Present() +{ + if (_pRendererDelegate) + _pRendererDelegate->Renderer_OnPresent(); + _numFrames++; +} diff --git a/Verus/src/CGI/Renderer.h b/Verus/src/CGI/Renderer.h new file mode 100644 index 0000000..f9e7d99 --- /dev/null +++ b/Verus/src/CGI/Renderer.h @@ -0,0 +1,39 @@ +#pragma once + +namespace verus +{ + namespace CGI + { + struct RendererDelegate + { + virtual void Renderer_OnDraw() = 0; + virtual void Renderer_OnDrawOverlay() = 0; + virtual void Renderer_OnPresent() = 0; + virtual void Renderer_OnDrawCubeMap() {} + }; + VERUS_TYPEDEFS(RendererDelegate); + + class Renderer : public Singleton, public Object + { + PBaseRenderer _pBaseRenderer = nullptr; + PRendererDelegate _pRendererDelegate = nullptr; + UINT64 _numFrames = 0; + Gapi _gapi = Gapi::unknown; + + public: + Renderer(); + ~Renderer(); + + // Device-specific: + PBaseRenderer operator->(); + static bool IsLoaded(); + + void Init(PRendererDelegate pDelegate); + void Done(); + + void Draw(); + void Present(); + }; + VERUS_TYPEDEFS(Renderer); + } +} diff --git a/Verus/src/Game/BaseGame.cpp b/Verus/src/Game/BaseGame.cpp index e582576..dedf4a8 100644 --- a/Verus/src/Game/BaseGame.cpp +++ b/Verus/src/Game/BaseGame.cpp @@ -3,38 +3,37 @@ using namespace verus; using namespace verus::Game; -#if 0 -struct MyRenderDelegate : CGL::CRenderDelegate +struct MyRendererDelegate : CGI::RendererDelegate { PBaseGame _p = nullptr; - MyRenderDelegate(PBaseGame p) : _p(p) {} - ~MyRenderDelegate() {} + MyRendererDelegate(PBaseGame p) : _p(p) {} + ~MyRendererDelegate() {} - virtual void Render_OnDraw() override + virtual void Renderer_OnDraw() override { - VERUS_QREF_RENDER; - render.BindOffscreenRT(); + VERUS_QREF_RENDERER; + renderer->PrepareDraw(); + renderer->Clear(0); _p->BaseGame_Draw(); } - virtual void Render_OnDrawOverlay() override + virtual void Renderer_OnDrawOverlay() override { _p->BaseGame_DrawOverlay(); } - virtual void Render_OnPresent() override + virtual void Renderer_OnPresent() override { - VERUS_QREF_RENDER; - render->Present(); + VERUS_QREF_RENDERER; + renderer->Present(); } - virtual void Render_OnDrawCubeMap() override + virtual void Renderer_OnDrawCubeMap() override { } }; -VERUS_TYPEDEFS(MyRenderDelegate); -#endif +VERUS_TYPEDEFS(MyRendererDelegate); struct BaseGame::Pimpl : AllocatorAware { @@ -85,9 +84,9 @@ void BaseGame::Initialize(VERUS_MAIN_DEFAULT_ARGS) { VERUS_SDL_CENTERED; - //Settings::Make(); - //VERUS_QREF_SETTINGS; - //settings.ParseCommandLineArgs(argc, argv); + App::Settings::Make(); + VERUS_QREF_SETTINGS; + settings.ParseCommandLineArgs(argc, argv); //settings.LoadValidateSave(); const int ret = SDL_Init(SDL_INIT_EVERYTHING); @@ -101,8 +100,8 @@ void BaseGame::Initialize(VERUS_MAIN_DEFAULT_ARGS) //Utils::TestAll(); #endif - // Initialization: - //_engineInit.Init(this, new MyRenderDelegate(this), true); + _window.Init(); + _engineInit.Init(this, new MyRendererDelegate(this)); // Configure: //VERUS_QREF_RENDER; @@ -118,7 +117,7 @@ void BaseGame::Run() VERUS_QREF_TIMER; VERUS_QREF_KM; //VERUS_QREF_BULLET; - //VERUS_QREF_RENDER; + VERUS_QREF_RENDERER; VERUS_QREF_ASYNC; VERUS_QREF_ASYS; @@ -219,16 +218,9 @@ void BaseGame::Run() asys.Update(); // Draw current frame: - //if (render.Draw()) - { -#ifdef VERUS_DEBUG - if (_p->_debugBullet) - bullet.DebugDraw(); -#endif - //render.DrawToScreen(); - } + renderer.Draw(); km.ResetClickState(); - //render.Present(); // This can take a while. + renderer.Present(); // This can take a while. // Show FPS: if (_p->_showFPS && timer.IsEventEvery(500)) @@ -259,10 +251,10 @@ void BaseGame::Exit() void BaseGame::KeyMapper_OnMouseMove(int x, int y) { - //VERUS_QREF_CONST_SETTINGS; + VERUS_QREF_CONST_SETTINGS; - //const float fx = x * 0.006f*settings.m_inputMouseSensitivity; - //const float fy = y * 0.006f*settings.m_inputMouseSensitivity; + const float fx = x * 0.006f*settings._inputMouseSensitivity; + const float fy = y * 0.006f*settings._inputMouseSensitivity; if (_p->_defaultCameraMovement) { @@ -270,7 +262,7 @@ void BaseGame::KeyMapper_OnMouseMove(int x, int y) //_p->_cameraCharacter.TurnYaw(fx); } - //BaseGame_OnMouseMove(fx, fy); + BaseGame_OnMouseMove(fx, fy); } void BaseGame::KeyMapper_OnKey(int scancode) diff --git a/Verus/src/Game/BaseGame.h b/Verus/src/Game/BaseGame.h index 1ea38eb..67dc60a 100644 --- a/Verus/src/Game/BaseGame.h +++ b/Verus/src/Game/BaseGame.h @@ -10,6 +10,7 @@ namespace verus Pimpl* _p = nullptr; AlignedAllocator _alloc; EngineInit _engineInit; + App::Window _window; public: BaseGame(); diff --git a/Verus/src/Global/EngineInit.cpp b/Verus/src/Global/EngineInit.cpp index 8bf3f87..d49862a 100644 --- a/Verus/src/Global/EngineInit.cpp +++ b/Verus/src/Global/EngineInit.cpp @@ -4,9 +4,8 @@ using namespace verus; void EngineInit::Make() { -#if 0 - if (_makeUtils) - Make_Utils(); + if (_makeGlobal) + Make_Global(); if (_makeNet) Make_Net(); if (_makeIO) @@ -15,36 +14,34 @@ void EngineInit::Make() Make_Input(); if (_makeAudio) Make_Audio(); - if (_makeCGL) - Make_CGL(); - if (_makePhysics) - Make_Physics(); - if (_makeEffects) - Make_Effects(); - if (_makeExtra) - Make_Extra(); - if (_makeScene) - Make_Scene(); - if (_makeGUI) - Make_GUI(); -#endif + if (_makeCGI) + Make_CGI(); + //if (_makePhysics) + // Make_Physics(); + //if (_makeEffects) + // Make_Effects(); + //if (_makeExtra) + // Make_Extra(); + //if (_makeScene) + // Make_Scene(); + //if (_makeGUI) + // Make_GUI(); } void EngineInit::Free() { -#if 0 - if (_makeGUI) - Free_GUI(); - if (_makeScene) - Free_Scene(); - if (_makeExtra) - Free_Extra(); - if (_makeEffects) - Free_Effects(); - if (_makePhysics) - Free_Physics(); - if (_makeCGL) - Free_CGL(); + //if (_makeGUI) + // Free_GUI(); + //if (_makeScene) + // Free_Scene(); + //if (_makeExtra) + // Free_Extra(); + //if (_makeEffects) + // Free_Effects(); + //if (_makePhysics) + // Free_Physics(); + if (_makeCGI) + Free_CGI(); if (_makeAudio) Free_Audio(); if (_makeInput) @@ -53,70 +50,63 @@ void EngineInit::Free() Free_IO(); if (_makeNet) Free_Net(); - if (_makeUtils) - Free_Utils(); -#endif + if (_makeGlobal) + Free_Global(); } -void EngineInit::Init(Input::PKeyMapperDelegate pKeyMapperDelegate, CGI::RenderDelegate* pRenderDelegate, bool createWindow) +void EngineInit::Init(Input::PKeyMapperDelegate pKeyMapperDelegate, CGI::RendererDelegate* pRendererDelegate) { -#if 0 - if (_makeUtils) - Utils::CTimer::I().Init(); + Timer::I().Init(); if (_makeIO) - IO::CAsync::I().Init(); + IO::Async::I().Init(); // "A.P.I.": if (_makeAudio) - Audio::CAudio::I().Init(); - if (_makePhysics) - Physics::CBullet::I().Init(); + Audio::AudioSystem::I().Init(); + //if (_makePhysics) + // Physics::CBullet::I().Init(); if (_makeInput) { - Input::CKeyMapper::I().Init(); - Input::CKeyMapper::I().SetDelegate(pKeyMapperDelegate); + Input::KeyMapper::I().Init(); + Input::KeyMapper::I().SetDelegate(pKeyMapperDelegate); } - if (_makeCGL) + if (_makeCGI) { - CGL::CRender::I().Init(pRenderDelegate, createWindow); -#ifdef _WIN32 - CGL::CRender::InitWin32(_C(CUtils::I().GetWritablePath()), 101); -#endif + CGI::Renderer::I().Init(pRendererDelegate); } // Static init: - if (_makeEffects) - Effects::CParticles::InitStatic(); - if (_makeGUI) - GUI::CFont::InitStatic(); - if (_makeScene) + //if (_makeEffects) + // Effects::CParticles::InitStatic(); + //if (_makeGUI) + // GUI::CFont::InitStatic(); + //if (_makeScene) { - Scene::CMesh::InitStatic(); - Scene::CTerrain::InitStatic(); - Scene::CForest::InitStatic(); + //Scene::CMesh::InitStatic(); + //Scene::CTerrain::InitStatic(); + //Scene::CForest::InitStatic(); } // Helpers: - if (_makeCGL) - CGL::CDebugRender::I().Init(); - if (_makeScene) - Scene::CHelpers::I().Init(); + //if (_makeCGI) + // CGL::CDebugRender::I().Init(); + //if (_makeScene) + // Scene::CHelpers::I().Init(); // Effects: - if (_makeEffects) - { - Effects::CBlur::I().Init(); - Effects::CBloom::I().Init(); - Effects::CSsao::I().Init(); - } + //if (_makeEffects) + //{ + // Effects::CBlur::I().Init(); + // Effects::CBloom::I().Init(); + // Effects::CSsao::I().Init(); + //} // Materials & textures: - if (_makeScene) - Scene::CMaterialManager::I().Init(); + //if (_makeScene) + // Scene::CMaterialManager::I().Init(); - if (_makeGUI) - GUI::CGUI::I().Init(); -#endif + //if (_makeGUI) + // GUI::CGUI::I().Init(); } diff --git a/Verus/src/Global/EngineInit.h b/Verus/src/Global/EngineInit.h index 98cd223..48e71c0 100644 --- a/Verus/src/Global/EngineInit.h +++ b/Verus/src/Global/EngineInit.h @@ -8,7 +8,7 @@ namespace verus } namespace CGI { - struct RenderDelegate; + struct RendererDelegate; } } @@ -17,12 +17,12 @@ namespace verus class EngineInit { public: - bool _makeUtils = true; + bool _makeGlobal = true; bool _makeNet = true; bool _makeIO = true; bool _makeInput = true; bool _makeAudio = true; - bool _makeCGL = true; + bool _makeCGI = true; bool _makePhysics = true; bool _makeEffects = true; bool _makeExtra = false; @@ -32,7 +32,7 @@ namespace verus void Make(); void Free(); - void Init(Input::KeyMapperDelegate* pKeyMapperDelegate, CGI::RenderDelegate* pRenderDelegate, bool createWindow); + void Init(Input::KeyMapperDelegate* pKeyMapperDelegate, CGI::RendererDelegate* pRendererDelegate); }; VERUS_TYPEDEFS(EngineInit); } diff --git a/Verus/src/Global/Global.h b/Verus/src/Global/Global.h index 2e61628..cec5972 100644 --- a/Verus/src/Global/Global.h +++ b/Verus/src/Global/Global.h @@ -18,6 +18,7 @@ #include "Convert.h" #include "Timer.h" #include "EngineInit.h" +#include "GlobalVarsClipboard.h" namespace verus { diff --git a/Verus/src/Global/GlobalVarsClipboard.cpp b/Verus/src/Global/GlobalVarsClipboard.cpp new file mode 100644 index 0000000..8d17836 --- /dev/null +++ b/Verus/src/Global/GlobalVarsClipboard.cpp @@ -0,0 +1,21 @@ +#include "verus.h" + +using namespace verus; + +void GlobalVarsClipboard::Copy() +{ + _vPairs.reserve(8); + + _vPairs.push_back(Pair(0, Utils::P())); + _vPairs.push_back(Pair(1, App::Settings::P())); + _vPairs.push_back(Pair(2, CGI::Renderer::P())); + _vPairs.push_back(Pair(3, IO::Async::P())); +} + +void GlobalVarsClipboard::Paste() +{ + Utils::Assign(static_cast(_vPairs[0]._p)); + App::Settings::Assign(static_cast(_vPairs[1]._p)); + CGI::Renderer::Assign(static_cast(_vPairs[2]._p)); + IO::Async::Assign(static_cast(_vPairs[3]._p)); +} diff --git a/Verus/src/Global/GlobalVarsClipboard.h b/Verus/src/Global/GlobalVarsClipboard.h new file mode 100644 index 0000000..4f0093a --- /dev/null +++ b/Verus/src/Global/GlobalVarsClipboard.h @@ -0,0 +1,22 @@ +#pragma once + +namespace verus +{ + //! This class can transfer singleton pointers to another library. + class GlobalVarsClipboard + { + struct Pair + { + int _id; + void* _p; + + Pair(int id, void* p) : _id(id), _p(p) {} + }; + + Vector _vPairs; + + public: + void Copy(); + void Paste(); + }; +} diff --git a/Verus/src/Global/Macros.h b/Verus/src/Global/Macros.h index 4a8b3ea..b4dd795 100644 --- a/Verus/src/Global/Macros.h +++ b/Verus/src/Global/Macros.h @@ -24,6 +24,7 @@ #define _C(x) ((x).c_str()) #define VERUS_P_FOR(i, to) Parallel::For(0, to, [&](int i) +#define VERUS_U_FOR(i, to) for(UINT32 i = 0; i < to; ++i) #define VERUS_FOR(i, to) for(int i = 0; i < to; ++i) #define VERUS_FOREACH(T, v, it) for(T::iterator it=(v).begin(), itEnd=(v).end(); it!=itEnd; ++it) #define VERUS_FOREACH_CONST(T, v, it) for(T::const_iterator it=(v).begin(), itEnd=(v).end(); it!=itEnd; ++it) @@ -64,3 +65,11 @@ #else # define VERUS_SDL_CENTERED putenv("SDL_VIDEO_WINDOW_POS"); putenv("SDL_VIDEO_CENTERED=1") #endif + +#ifdef _WIN32 +# define VERUS_DLL_EXPORT __declspec(dllexport) +#else +# define VERUS_DLL_EXPORT __attribute__ ((visibility("default"))) +#endif + +#define VERUS_HR(hr) std::hex << std::uppercase << "0x" << hr diff --git a/Verus/src/Global/QuickRefs.h b/Verus/src/Global/QuickRefs.h index 91cdf72..8ad79a1 100644 --- a/Verus/src/Global/QuickRefs.h +++ b/Verus/src/Global/QuickRefs.h @@ -1,29 +1,29 @@ #pragma once -#define VERUS_QREF_ASYNC IO::RAsync async = IO::Async::I() -#define VERUS_QREF_ASYS Audio::RAudioSystem asys = Audio::AudioSystem::I() -#define VERUS_QREF_ATMO Scene::RAtmosphere atmo = Scene::Atmosphere::I() -#define VERUS_QREF_BLOOM Effects::RBloom bloom = Effects::Bloom::I() -#define VERUS_QREF_BLUR Effects::RBlur blur = Effects::Blur::I() -#define VERUS_QREF_BULLET Physics::RBullet bullet = Physics::Bullet::I() -#define VERUS_QREF_CONST_SETTINGS RcSettings settings = CSettings::IConst() -#define VERUS_QREF_DEPTH Effects::RDepth depth = Effects::Depth::I() -#define VERUS_QREF_DR CGL::RDebugRender dr = CGL::DebugRender::I() -#define VERUS_QREF_FSYS IO::RFileSys fsys = IO::FileSys::I() -#define VERUS_QREF_GAME Game::RGame game = Game::Game::I() -#define VERUS_QREF_GRASS Scene::RGrass grass = Scene::Grass::I() -#define VERUS_QREF_GUI GUI::RGUI gui = GUI::GUI::I() -#define VERUS_QREF_HELPERS Scene::RHelpers helpers = Scene::Helpers::I() -#define VERUS_QREF_KM Input::RKeyMapper km = Input::KeyMapper::I() -#define VERUS_QREF_LS Scene::RLandscape ls = Scene::Landscape::I() -#define VERUS_QREF_MM Scene::RMaterialManager mm = Scene::MaterialManager::I() -#define VERUS_QREF_MP Net::RMultiplayer mp = Net::Multiplayer::I() -#define VERUS_QREF_PHYSICS Physics::RPhysics physics = Physics::Physics::I() -#define VERUS_QREF_RENDER CGL::RRender render = CGL::Render::I() -#define VERUS_QREF_SETTINGS App::RSettings settings = App::Settings::I() -#define VERUS_QREF_SM Scene::RSceneManager sm = Scene::SceneManager::I() -#define VERUS_QREF_SSAO Effects::RSsao ssao = Effects::Ssao::I() -#define VERUS_QREF_TIMER RTimer timer = Timer::I(); const float dt = timer.GetDeltaTime() -#define VERUS_QREF_TIMER_GUI RTimer timer = Timer::I(); const float dt = timer.GetDeltaTime(Timer::Type::gui) -#define VERUS_QREF_UTILS RUtils utils = Utils::I() -#define VERUS_QREF_WATER Scene::RWater water = Scene::Water::I() +#define VERUS_QREF_ASYNC IO::RAsync async = IO::Async::I() +#define VERUS_QREF_ASYS Audio::RAudioSystem asys = Audio::AudioSystem::I() +#define VERUS_QREF_ATMO Scene::RAtmosphere atmo = Scene::Atmosphere::I() +#define VERUS_QREF_BLOOM Effects::RBloom bloom = Effects::Bloom::I() +#define VERUS_QREF_BLUR Effects::RBlur blur = Effects::Blur::I() +#define VERUS_QREF_BULLET Physics::RBullet bullet = Physics::Bullet::I() +#define VERUS_QREF_CONST_SETTINGS App::RcSettings settings = App::Settings::IConst() +#define VERUS_QREF_DEPTH Effects::RDepth depth = Effects::Depth::I() +#define VERUS_QREF_DR CGL::RDebugRender dr = CGL::DebugRender::I() +#define VERUS_QREF_FSYS IO::RFileSys fsys = IO::FileSys::I() +#define VERUS_QREF_GAME Game::RGame game = Game::Game::I() +#define VERUS_QREF_GRASS Scene::RGrass grass = Scene::Grass::I() +#define VERUS_QREF_GUI GUI::RGUI gui = GUI::GUI::I() +#define VERUS_QREF_HELPERS Scene::RHelpers helpers = Scene::Helpers::I() +#define VERUS_QREF_KM Input::RKeyMapper km = Input::KeyMapper::I() +#define VERUS_QREF_LS Scene::RLandscape ls = Scene::Landscape::I() +#define VERUS_QREF_MM Scene::RMaterialManager mm = Scene::MaterialManager::I() +#define VERUS_QREF_MP Net::RMultiplayer mp = Net::Multiplayer::I() +#define VERUS_QREF_PHYSICS Physics::RPhysics physics = Physics::Physics::I() +#define VERUS_QREF_RENDERER CGI::RRenderer renderer = CGI::Renderer::I() +#define VERUS_QREF_SETTINGS App::RSettings settings = App::Settings::I() +#define VERUS_QREF_SM Scene::RSceneManager sm = Scene::SceneManager::I() +#define VERUS_QREF_SSAO Effects::RSsao ssao = Effects::Ssao::I() +#define VERUS_QREF_TIMER RTimer timer = Timer::I(); const float dt = timer.GetDeltaTime() +#define VERUS_QREF_TIMER_GUI RTimer timer = Timer::I(); const float dt = timer.GetDeltaTime(Timer::Type::gui) +#define VERUS_QREF_UTILS RUtils utils = Utils::I() +#define VERUS_QREF_WATER Scene::RWater water = Scene::Water::I() diff --git a/Verus/src/Global/Timer.cpp b/Verus/src/Global/Timer.cpp index 2f2bfa9..5f1b9fd 100644 --- a/Verus/src/Global/Timer.cpp +++ b/Verus/src/Global/Timer.cpp @@ -13,10 +13,10 @@ Timer::~Timer() void Timer::Init() { const TTimePoint timeNow = std::chrono::high_resolution_clock::now(); - VERUS_FOR(i, +Type::count) + for (auto& data : _data) { - _data[i]._t = _data[i]._dt = 0; - _data[i]._timePrev = timeNow; + data._t = data._dt = 0; + data._timePrev = timeNow; } } diff --git a/Verus/src/Global/Utils.cpp b/Verus/src/Global/Utils.cpp index 4693356..7809f1b 100644 --- a/Verus/src/Global/Utils.cpp +++ b/Verus/src/Global/Utils.cpp @@ -16,7 +16,7 @@ void Utils::MakeEx(PBaseAllocator pAlloc) { const float mx = FLT_MAX; const UINT32 imx = *(UINT32*)&mx; - VERUS_RT_ASSERT(imx == 0x7f7fffff); + VERUS_RT_ASSERT(imx == 0x7F7FFFFF); Utils* p = static_cast(pAlloc->malloc(sizeof(Utils))); p = new(p)Utils(pAlloc); diff --git a/Verus/src/IO/Json.cpp b/Verus/src/IO/Json.cpp index 52f6ff3..3dbba2c 100644 --- a/Verus/src/IO/Json.cpp +++ b/Verus/src/IO/Json.cpp @@ -21,7 +21,7 @@ void Json::SetFilename(CSZ name) CSZ pSlash = strchr(name, '/'); if (!pSlash) { - //pathName = CUtils::I().GetWritablePath() + "/" + name; + //pathName = Utils::I().GetWritablePath() + "/" + name; //name = _C(pathName); } _pathName = name; diff --git a/Verus/src/verus.h b/Verus/src/verus.h index 412af18b315844fa088edf6172ed4f3510bf7222..8c8d229813b5598375b3ac346fd22102581e4f6c 100644 GIT binary patch delta 199 zcmexj^}%*S0^?*JCcVv*7!#N#?+_8=&tXVnNMtBxNM+Dt$Y8LW{GU^NvKgb$WDyoU zaTkV6h9aO$GD8W2F@p<(0)rug5rfs_M1En-Fa}qKAcjzeV1{@GPX<2*X9gc2&jlzN z47+kj^(mvhssaB Q&n!Cm0k_0v7Zw9a0IRJiGynhq delta 29 lcmexh`^9QQ0^{Ua%qE*BFvc-Wt`iZMti|H6c^|8hBmlDo3TyxX