Skip to content

Commit 83b9077

Browse files
committedJun 10, 2023
Added racer project and init dx12 device with optional debug layer.
1 parent 08f64fa commit 83b9077

File tree

15 files changed

+3153
-11
lines changed

15 files changed

+3153
-11
lines changed
 

‎CMakeLists.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ if(REV_BUILD_TOOLS)
5858
endif()
5959

6060
# Compile sample projects
61-
add_subdirectory(samples/Pluto)
61+
add_subdirectory(samples/pluto)
6262
add_subdirectory(samples/ShaderToy)
63-
add_subdirectory(samples/GltfViewer)
63+
add_subdirectory(samples/gltfViewer)
64+
add_subdirectory(samples/racer)
6465

6566
if(REV_BUILD_TEST)
6667
enable_testing()

‎engine/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ target_include_directories(revGfx PUBLIC ${Vulkan_INCLUDE_DIRS})
3636
target_include_directories (revGfx PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "../include")
3737
target_link_libraries(revGfx LINK_PRIVATE revMath revCore ImGui)
3838
target_link_libraries(revGfx LINK_PRIVATE ${Vulkan_LIBRARY})
39+
target_link_libraries(revGfx LINK_PRIVATE "d3d12.lib" "dxgi.lib" "d3dcompiler.lib")
3940
set_target_properties(revGfx PROPERTIES FOLDER rev)
4041

4142
# game

‎engine/core/tools/log.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace rev { namespace core {
2323

2424
__forceinline void LogMessage(std::string_view message)
2525
{
26-
std::cout << "Error: " << message << std::endl;
26+
std::cout << message << std::endl;
2727
}
2828

2929
}} // namespace rev::core

‎engine/game/application/base3dApplication.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
#include <core/platform/fileSystem/fileSystem.h>
2727
#include <core/platform/osHandler.h>
2828

29+
#include <gfx/backend/Context.h>
30+
#include <gfx/backend/Vulkan/renderContextVulkan.h>
31+
2932
#include <input/pointingInput.h>
3033
#include <input/keyboard/keyboardInput.h>
3134

@@ -40,6 +43,7 @@ namespace rev::game {
4043
args.addOption("w", &windowSize.x());
4144
args.addOption("h", &windowSize.y());
4245
args.addFlag("fullscreen", fullScreen);
46+
args.addFlag("dx12", useDX12);
4347
}
4448

4549
//------------------------------------------------------------------------------------------------
@@ -59,7 +63,7 @@ namespace rev::game {
5963
arguments.parse(argc, argv);
6064
// Init engine
6165
initEngineCore();
62-
if (!initGraphics())
66+
if (!initGraphics(m_options.useDX12))
6367
return;
6468
// Init application
6569
init();
@@ -122,9 +126,9 @@ namespace rev::game {
122126
}
123127

124128
//------------------------------------------------------------------------------------------------
125-
bool Base3dApplication::initGraphics()
129+
bool Base3dApplication::initGraphics(bool useDX12)
126130
{
127-
if (!Context::init(name().c_str(), Context::GfxAPI::Vulkan))
131+
if (!Context::init(name().c_str(), useDX12 ? Context::GfxAPI::DX12 : Context::GfxAPI::Vulkan))
128132
{
129133
return false;
130134
}

‎engine/game/application/base3dApplication.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#pragma once
2121

2222
#include <math/algebra/vector.h>
23-
#include <gfx/backend/Vulkan/renderContextVulkan.h>
23+
#include <gfx/backend/Context.h>
2424
#include <chrono>
2525
#include <memory>
2626

@@ -45,6 +45,7 @@ namespace rev::game {
4545
math::Vec2i windowPosition { 100, 150 };
4646
math::Vec2u windowSize { 640, 480 };
4747
bool fullScreen{ false };
48+
bool useDX12 = false;
4849

4950
void registerOptions(core::CmdLineParser&);
5051
};
@@ -72,13 +73,16 @@ namespace rev::game {
7273
virtual void onResize() {}
7374

7475
private:
76+
Base3dApplication(const Base3dApplication&) = delete;
77+
Base3dApplication& operator=(const Base3dApplication&) = delete;
78+
7579
void initEngineCore();
76-
bool initGraphics();
80+
bool initGraphics(bool useDX12);
7781

7882
private:
7983
std::chrono::high_resolution_clock m_appTime;
8084
CommandLineOptions m_options;
81-
gfx::RenderContextVulkan::ResizeDelegate m_resizeDelegate;
85+
gfx::Context::ResizeDelegate m_resizeDelegate;
8286
};
8387

8488
}

‎engine/gfx/backend/Context.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "Windows/windowsPlatform.h"
2424
#include <core/platform/osHandler.h>
2525
#include "./Vulkan/renderContextVulkan.h"
26+
#include "./DX12/ContextDX12.h"
2627

2728
namespace rev::gfx
2829
{
@@ -95,6 +96,16 @@ namespace rev::gfx
9596
{
9697
case GfxAPI::DX12:
9798
{
99+
auto context12 = new ContextDX12();
100+
if (context12->init(true))
101+
{
102+
s_instance = context12;
103+
}
104+
else
105+
{
106+
delete context12;
107+
return false;
108+
}
98109
break;
99110
}
100111
case GfxAPI::Vulkan:
+148
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
//--------------------------------------------------------------------------------------------------
2+
// Revolution Engine
3+
//--------------------------------------------------------------------------------------------------
4+
// Copyright 2023 Carmelo J Fdez-Aguera
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
7+
// and associated documentation files (the "Software"), to deal in the Software without restriction,
8+
// including without limitation the rights to use, copy, modify, merge, publish, distribute,
9+
// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
10+
// furnished to do so, subject to the following conditions:
11+
//
12+
// The above copyright notice and this permission notice shall be included in all copies or
13+
// substantial portions of the Software.
14+
//
15+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
16+
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
#include "ContextDX12.h"
21+
22+
#include "d3dx12.h"
23+
#include <dxgi1_6.h>
24+
25+
#include <wrl.h>
26+
#include <core/tools/log.h>
27+
28+
template<class T>
29+
using ComPtr = Microsoft::WRL::ComPtr<T>;
30+
31+
namespace rev::gfx
32+
{
33+
bool ContextDX12::init(bool useValidationLayers)
34+
{
35+
if (!initPhysicalDevice(useValidationLayers))
36+
{
37+
return false;
38+
}
39+
40+
if (!initLogicalDevice(useValidationLayers))
41+
{
42+
return false;
43+
}
44+
45+
return true;
46+
}
47+
48+
bool ContextDX12::initPhysicalDevice(bool useValidationLayers)
49+
{
50+
// Create device factory
51+
ComPtr<IDXGIFactory6> dxgiFactory;
52+
53+
UINT factoryFlags = 0;
54+
if (useValidationLayers)
55+
{
56+
factoryFlags |= DXGI_CREATE_FACTORY_DEBUG;
57+
}
58+
59+
CreateDXGIFactory2(factoryFlags, IID_PPV_ARGS(&dxgiFactory));
60+
61+
// Iterate over available adapters
62+
ComPtr<IDXGIAdapter1> dxgiAdapter1;
63+
64+
if(dxgiFactory->EnumAdapterByGpuPreference(0,
65+
DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE,
66+
IID_PPV_ARGS(&dxgiAdapter1)) == DXGI_ERROR_NOT_FOUND)
67+
{
68+
return false;
69+
}
70+
71+
// TODO: Get device info
72+
//DXGI_ADAPTER_DESC1 adapterDesc;
73+
//dxgiAdapter1->GetDesc1(&adapterDesc);
74+
//std::wstring descMsg = adapterDesc.Description;
75+
//std::cout << descMsg << std::endl;
76+
77+
dxgiAdapter1.As(&m_dxgiAdapter);
78+
return true;
79+
}
80+
81+
bool ContextDX12::initLogicalDevice(bool breakOnValidation)
82+
{
83+
if (breakOnValidation)
84+
{
85+
86+
ComPtr<ID3D12Debug> spDebugController0;
87+
ComPtr<ID3D12Debug1> spDebugController1;
88+
if (!SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&spDebugController0))))
89+
{
90+
return false;
91+
}
92+
if (!SUCCEEDED(spDebugController0->QueryInterface(IID_PPV_ARGS(&spDebugController1))))
93+
{
94+
return false;
95+
}
96+
spDebugController1->SetEnableGPUBasedValidation(true);
97+
spDebugController1->EnableDebugLayer();
98+
}
99+
100+
ComPtr<ID3D12Device2> d3d12Device;
101+
auto hRes = D3D12CreateDevice(m_dxgiAdapter.Get(), D3D_FEATURE_LEVEL_12_1, IID_PPV_ARGS(&d3d12Device));
102+
if (!SUCCEEDED(hRes))
103+
{
104+
return false;
105+
}
106+
107+
if (breakOnValidation)
108+
{
109+
ComPtr<ID3D12InfoQueue> pInfoQueue;
110+
if (SUCCEEDED(d3d12Device->QueryInterface(IID_PPV_ARGS(&pInfoQueue))))
111+
{
112+
pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION, TRUE);
113+
pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, TRUE);
114+
pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, TRUE);
115+
116+
//D3D12_MESSAGE_CATEGORY Categories[] = {};
117+
D3D12_MESSAGE_SEVERITY Severities[] =
118+
{
119+
D3D12_MESSAGE_SEVERITY_INFO
120+
};
121+
122+
// Suppress individual messages by their ID
123+
//D3D12_MESSAGE_ID DenyIds[] = {};
124+
125+
D3D12_INFO_QUEUE_FILTER NewFilter = {};
126+
//NewFilter.DenyList.NumCategories = _countof(Categories);
127+
//NewFilter.DenyList.pCategoryList = Categories;
128+
NewFilter.DenyList.NumSeverities = _countof(Severities);
129+
NewFilter.DenyList.pSeverityList = Severities;
130+
//NewFilter.DenyList.NumIDs = _countof(DenyIds);
131+
//NewFilter.DenyList.pIDList = DenyIds;
132+
133+
if (!SUCCEEDED(pInfoQueue->PushStorageFilter(&NewFilter)))
134+
{
135+
return false;
136+
}
137+
}
138+
else
139+
{
140+
std::cout << "Unable to set dx12 validation\n";
141+
142+
return true;
143+
}
144+
}
145+
146+
return true;
147+
}
148+
}

‎engine/gfx/backend/DX12/ContextDX12.h

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//--------------------------------------------------------------------------------------------------
2+
// Revolution Engine
3+
//--------------------------------------------------------------------------------------------------
4+
// Copyright 2023 Carmelo J Fdez-Aguera
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
7+
// and associated documentation files (the "Software"), to deal in the Software without restriction,
8+
// including without limitation the rights to use, copy, modify, merge, publish, distribute,
9+
// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
10+
// furnished to do so, subject to the following conditions:
11+
//
12+
// The above copyright notice and this permission notice shall be included in all copies or
13+
// substantial portions of the Software.
14+
//
15+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
16+
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
#pragma once
21+
22+
#include "../Context.h"
23+
24+
#include <dxgi1_6.h>
25+
#include <wrl.h>
26+
27+
template<class T>
28+
using ComPtr = Microsoft::WRL::ComPtr<T>;
29+
30+
namespace rev::gfx
31+
{
32+
class ContextDX12 : public Context
33+
{
34+
public:
35+
bool init(bool useValidationLayers);
36+
37+
private:
38+
bool initPhysicalDevice(bool useValidationLayers);
39+
bool initLogicalDevice(bool breakOnValidation);
40+
41+
ComPtr<IDXGIAdapter4> m_dxgiAdapter;
42+
};
43+
}

‎engine/gfx/backend/DX12/DeviceDX12.h

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//--------------------------------------------------------------------------------------------------
2+
// Revolution Engine
3+
//--------------------------------------------------------------------------------------------------
4+
// Copyright 2023 Carmelo J Fdez-Aguera
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
7+
// and associated documentation files (the "Software"), to deal in the Software without restriction,
8+
// including without limitation the rights to use, copy, modify, merge, publish, distribute,
9+
// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
10+
// furnished to do so, subject to the following conditions:
11+
//
12+
// The above copyright notice and this permission notice shall be included in all copies or
13+
// substantial portions of the Software.
14+
//
15+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
16+
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
#pragma once
21+
22+
#include "../Device.h"
23+
24+
namespace rev::gfx
25+
{
26+
class DeviceDX12 : public Device
27+
{
28+
public:
29+
//
30+
};
31+
}

‎engine/gfx/backend/DX12/d3dx12.h

+2,723
Large diffs are not rendered by default.

‎samples/pluto/src/main.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
//--------------------------------------------------------------------------------------------------------------
99
int main(int _argc, const char** _argv)
1010
{
11-
rev::Pluto player;
12-
player.run(_argc, _argv);
11+
rev::Pluto game;
12+
game.run(_argc, _argv);
1313

1414
return 0;
1515
}

‎samples/racer/CMakeLists.txt

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
################################################################################
2+
# Rev project
3+
# Procedural generation sandbox
4+
################################################################################
5+
cmake_minimum_required (VERSION 3.10)
6+
project(Racer)
7+
8+
include(../../cmake/common.cmake)
9+
10+
UNSET(GLSL_SOURCES)
11+
UNSET(SPV_OUTPUT)
12+
file(GLOB_RECURSE GLSL_HEADER_FILES "shaders/*.h" "shaders/*.glsl")
13+
file(GLOB_RECURSE GLSL_SOURCE_FILES
14+
"shaders/*.comp"
15+
"shaders/*.frag"
16+
"shaders/*.vert"
17+
"shaders/*.rchit"
18+
"shaders/*.rahit"
19+
"shaders/*.rmiss"
20+
"shaders/*.rgen"
21+
)
22+
foreach(GLSL ${GLSL_SOURCE_FILES})
23+
get_filename_component(FILE_NAME ${GLSL} NAME)
24+
_compile_GLSL(${GLSL} "./shaders/${FILE_NAME}.spv" GLSL_SOURCES SPV_OUTPUT)
25+
endforeach(GLSL)
26+
27+
list(APPEND GLSL_SOURCES ${GLSL_HEADER_FILES})
28+
source_group(shaders FILES ${GLSL_SOURCES})
29+
30+
file(GLOB_RECURSE SOURCE_FILES "src/*.cpp" "src/*.h" "src/*.inl")
31+
GroupSources(src src)
32+
add_executable(Racer ${SOURCE_FILES} ${GLSL_SOURCES})
33+
set_target_properties(Racer PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
34+
target_link_libraries (Racer LINK_PUBLIC revCore revMath revGfx revGame revInput ImGui)
35+
36+
# Visual studio specifics
37+
set_target_properties(Racer PROPERTIES FOLDER "samples")

‎samples/racer/src/main.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//----------------------------------------------------------------------------------------------------------------------
2+
// Revolution Engine
3+
// Created by Carmelo J. Fdez-Agüera Tortosa
4+
//----------------------------------------------------------------------------------------------------------------------
5+
// Engine's default player's entry point
6+
#include "racer.h"
7+
8+
//--------------------------------------------------------------------------------------------------------------
9+
int main(int _argc, const char** _argv)
10+
{
11+
rev::Racer game;
12+
game.run(_argc, _argv);
13+
14+
return 0;
15+
}

‎samples/racer/src/racer.cpp

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
//--------------------------------------------------------------------------------------------------
2+
// Revolution Engine
3+
//--------------------------------------------------------------------------------------------------
4+
// Copyright 2021 Carmelo J Fdez-Aguera
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
7+
// and associated documentation files (the "Software"), to deal in the Software without restriction,
8+
// including without limitation the rights to use, copy, modify, merge, publish, distribute,
9+
// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
10+
// furnished to do so, subject to the following conditions:
11+
//
12+
// The above copyright notice and this permission notice shall be included in all copies or
13+
// substantial portions of the Software.
14+
//
15+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
16+
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
#include <cassert>
21+
#include <thread>
22+
23+
#include "racer.h"
24+
25+
namespace rev
26+
{
27+
//------------------------------------------------------------------------------------------------------------------
28+
void Racer::CommandLineOptions::registerOptions(core::CmdLineParser& args)
29+
{
30+
}
31+
32+
//------------------------------------------------------------------------------------------------------------------
33+
void Racer::getCommandLineOptions(core::CmdLineParser& args)
34+
{
35+
m_options.registerOptions(args);
36+
}
37+
38+
//------------------------------------------------------------------------------------------------------------------
39+
bool Racer::init()
40+
{
41+
return true;
42+
}
43+
44+
//------------------------------------------------------------------------------------------------------------------
45+
void Racer::end()
46+
{
47+
}
48+
49+
//------------------------------------------------------------------------------------------------------------------
50+
void Racer::onResize()
51+
{
52+
}
53+
54+
//------------------------------------------------------------------------------------------------------------------
55+
bool Racer::updateLogic(TimeDelta dt)
56+
{
57+
return true;
58+
}
59+
60+
//------------------------------------------------------------------------------------------------------------------
61+
void Racer::render(TimeDelta dt)
62+
{
63+
}
64+
65+
} // namespace rev

‎samples/racer/src/racer.h

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//--------------------------------------------------------------------------------------------------
2+
// Revolution Engine
3+
//--------------------------------------------------------------------------------------------------
4+
// Copyright 2021 Carmelo J Fdez-Aguera
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software
7+
// and associated documentation files (the "Software"), to deal in the Software without restriction,
8+
// including without limitation the rights to use, copy, modify, merge, publish, distribute,
9+
// sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
10+
// furnished to do so, subject to the following conditions:
11+
//
12+
// The above copyright notice and this permission notice shall be included in all copies or
13+
// substantial portions of the Software.
14+
//
15+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
16+
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17+
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
18+
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
#pragma once
21+
22+
#include <game/application/base3dApplication.h>
23+
24+
namespace rev {
25+
26+
namespace game {
27+
class FlyBy;
28+
class Orbit;
29+
}
30+
31+
class Racer : public game::Base3dApplication
32+
{
33+
public:
34+
virtual std::string name() { return "Racer"; }
35+
36+
Racer() = default;
37+
38+
private:
39+
40+
struct CommandLineOptions
41+
{
42+
void registerOptions(core::CmdLineParser&);
43+
} m_options;
44+
45+
// Extension interface
46+
// Life cycle
47+
void getCommandLineOptions(core::CmdLineParser&) override;
48+
bool init() override;
49+
void end() override;
50+
// Main loop
51+
bool updateLogic(TimeDelta logicDt) override;
52+
void render(TimeDelta renderDt) override;
53+
// Events
54+
void onResize() override;
55+
56+
private:
57+
};
58+
59+
} // namespace rev

0 commit comments

Comments
 (0)
Please sign in to comment.