Started writing a manual; Lots of changes
This commit is contained in:
parent
f884847513
commit
3b5b608ae9
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,6 +1,7 @@
|
|||||||
.vs/
|
.vs/
|
||||||
bin/
|
bin/
|
||||||
int/
|
int/
|
||||||
|
manual/
|
||||||
*.aps
|
*.aps
|
||||||
*.res
|
*.res
|
||||||
*.nfpack
|
*.nfpack
|
@ -98,8 +98,8 @@ if exist "base.nfpack" (copy "base.nfpack" "$(OutDir)assets\")</Command>
|
|||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
|
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
|
||||||
<IgnoreSpecificDefaultLibraries>libcmt.lib</IgnoreSpecificDefaultLibraries>
|
<IgnoreSpecificDefaultLibraries>libcmt.lib</IgnoreSpecificDefaultLibraries>
|
||||||
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
|
|
||||||
<Profile>true</Profile>
|
<Profile>true</Profile>
|
||||||
|
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
|
||||||
</Link>
|
</Link>
|
||||||
<PostBuildEvent>
|
<PostBuildEvent>
|
||||||
<Command>cd assets
|
<Command>cd assets
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include "MainState.h"
|
#include "MainState.h"
|
||||||
|
|
||||||
void MainState::onEnter() {
|
void MainState::onEnter() {
|
||||||
Log("MainState onEnter!");
|
NFLog("MainState onEnter!");
|
||||||
currCamType = nf::Camera::Type::FIRST_PERSON;
|
currCamType = nf::Camera::Type::FIRST_PERSON;
|
||||||
camera->setType(currCamType);
|
camera->setType(currCamType);
|
||||||
ap.load("example.nfpack");
|
ap.load("example.nfpack");
|
||||||
@ -31,7 +31,7 @@ void MainState::onEnter() {
|
|||||||
for (int y = 0; y < 3; y++) {
|
for (int y = 0; y < 3; y++) {
|
||||||
for (int z = 0; z < 3; z++) {
|
for (int z = 0; z < 3; z++) {
|
||||||
entities.push_back(new nf::Entity);
|
entities.push_back(new nf::Entity);
|
||||||
entities.back()->create(ap.get("2mats.obj"), nf::Entity::Type::DYNAMIC);
|
entities.back()->create(nf::BaseAssets::cone, nf::Entity::Type::DYNAMIC);
|
||||||
entities.back()->setPosition(nf::Vec3(5.0 + x * 2.05, 1.0 + y * 2.05, -5.0 + z * 2.05));
|
entities.back()->setPosition(nf::Vec3(5.0 + x * 2.05, 1.0 + y * 2.05, -5.0 + z * 2.05));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -52,20 +52,21 @@ void MainState::update(float deltaTime) {
|
|||||||
camera->setType(currCamType);
|
camera->setType(currCamType);
|
||||||
}
|
}
|
||||||
|
|
||||||
float speed = 5.0;
|
float speed;
|
||||||
if (camera->getType() == nf::Camera::Type::FIRST_PERSON) {
|
if (camera->getType() == nf::Camera::Type::FIRST_PERSON) {
|
||||||
if (app->isKeyHeld(NFI_SHIFT))
|
if (app->isKeyHeld(NFI_SHIFT))
|
||||||
speed = 20.0;
|
speed = 20.0f;
|
||||||
else
|
else
|
||||||
speed = 5.0;
|
speed = 5.0f;
|
||||||
|
speed *= deltaTime;
|
||||||
if (app->isKeyHeld(NFI_W))
|
if (app->isKeyHeld(NFI_W))
|
||||||
camera->moveForward(speed * deltaTime);
|
camera->moveZ(speed);
|
||||||
if (app->isKeyHeld(NFI_S))
|
if (app->isKeyHeld(NFI_S))
|
||||||
camera->moveBackward(speed * deltaTime);
|
camera->moveZ(-speed);
|
||||||
if (app->isKeyHeld(NFI_D))
|
if (app->isKeyHeld(NFI_D))
|
||||||
camera->moveRight(speed * deltaTime);
|
camera->moveX(speed);
|
||||||
if (app->isKeyHeld(NFI_A))
|
if (app->isKeyHeld(NFI_A))
|
||||||
camera->moveLeft(speed * deltaTime);
|
camera->moveX(-speed);
|
||||||
}
|
}
|
||||||
|
|
||||||
text.setText("FPS: " + std::to_string(app->getFPS()));
|
text.setText("FPS: " + std::to_string(app->getFPS()));
|
||||||
@ -134,7 +135,7 @@ void MainState::render(nf::Renderer& renderer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MainState::onExit() {
|
void MainState::onExit() {
|
||||||
Log("MainState onExit!");
|
NFLog("MainState onExit!");
|
||||||
|
|
||||||
entities.clear();
|
entities.clear();
|
||||||
}
|
}
|
@ -57,7 +57,7 @@
|
|||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>NFENGINE; GLEW_STATIC;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>GLEW_STATIC;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>$(ProjectDir)src\include\;$(ProjectDir)dep\include\</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(ProjectDir)src\include\;$(ProjectDir)dep\include\</AdditionalIncludeDirectories>
|
||||||
<ObjectFileName>$(IntDir)obj\</ObjectFileName>
|
<ObjectFileName>$(IntDir)obj\</ObjectFileName>
|
||||||
@ -89,7 +89,7 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<PreprocessorDefinitions>NFENGINE; GLEW_STATIC;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>GLEW_STATIC;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<AdditionalIncludeDirectories>$(ProjectDir)src\include\;$(ProjectDir)dep\include\</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(ProjectDir)src\include\;$(ProjectDir)dep\include\</AdditionalIncludeDirectories>
|
||||||
<ObjectFileName>$(IntDir)obj\</ObjectFileName>
|
<ObjectFileName>$(IntDir)obj\</ObjectFileName>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "Utility.h"
|
#include "Utility.h"
|
||||||
|
|
||||||
namespace nf {
|
namespace nf {
|
||||||
DEBUGINIT;
|
NFDEBUGINIT;
|
||||||
|
|
||||||
Application::Application(Config& config) :
|
Application::Application(Config& config) :
|
||||||
m_currentConfig(config),
|
m_currentConfig(config),
|
||||||
@ -18,21 +18,12 @@ namespace nf {
|
|||||||
m_stateChange(false),
|
m_stateChange(false),
|
||||||
m_stateChangeStarted(false)
|
m_stateChangeStarted(false)
|
||||||
{
|
{
|
||||||
Log("Creating NF application");
|
NFLog("Creating NF application");
|
||||||
Log("Width: " + std::to_string(m_currentConfig.width) + ", Height: " + std::to_string(m_currentConfig.height) + ", Fullscreen: " + std::to_string(m_currentConfig.fullscreen) + ", Title: " + m_currentConfig.title);
|
NFLog("Width: " + std::to_string(m_currentConfig.width) + ", Height: " + std::to_string(m_currentConfig.height) + ", Fullscreen: " + std::to_string(m_currentConfig.fullscreen) + ", Title: " + m_currentConfig.title);
|
||||||
|
|
||||||
if (getApp(true) != nullptr)
|
if (getApp(true) != nullptr)
|
||||||
Error("Cannot create two NF Application objects!");
|
NFError("Cannot create two NF Application objects!");
|
||||||
setApp(this);
|
setApp(this);
|
||||||
m_hInst = GetModuleHandle(NULL);
|
|
||||||
registerWindowClass();
|
|
||||||
RECT windowSize = getWindowRect();
|
|
||||||
int x = 0;
|
|
||||||
int y = 0;
|
|
||||||
calculateNewWindowPos(x, y);
|
|
||||||
m_window = CreateWindowEx(NULL, m_wclassName, toWide(m_currentConfig.title).data(), WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, x, y, windowSize.right, windowSize.bottom, NULL, NULL, m_hInst, NULL);
|
|
||||||
SetProp(m_window, L"App", this);
|
|
||||||
if (m_currentConfig.fullscreen) toggleFullscreen();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setWindowIcon(HICON hIcon) {
|
void Application::setWindowIcon(HICON hIcon) {
|
||||||
@ -47,19 +38,19 @@ namespace nf {
|
|||||||
|
|
||||||
Renderer* Application::getRenderer() const {
|
Renderer* Application::getRenderer() const {
|
||||||
if (!m_renderer)
|
if (!m_renderer)
|
||||||
Error("Application not running yet!");
|
NFError("Application not running yet!");
|
||||||
return m_renderer;
|
return m_renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEngine* Application::getAudioEngine() const {
|
AudioEngine* Application::getAudioEngine() const {
|
||||||
if(!m_audio)
|
if(!m_audio)
|
||||||
Error("Application not running yet!");
|
NFError("Application not running yet!");
|
||||||
return m_audio;
|
return m_audio;
|
||||||
}
|
}
|
||||||
|
|
||||||
PhysicsEngine* Application::getPhysicsEngine() const {
|
PhysicsEngine* Application::getPhysicsEngine() const {
|
||||||
if (!m_physics)
|
if (!m_physics)
|
||||||
Error("Application not running yet!");
|
NFError("Application not running yet!");
|
||||||
return m_physics;
|
return m_physics;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,7 +59,7 @@ namespace nf {
|
|||||||
m_states[stateName] = state;
|
m_states[stateName] = state;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Error("State \"" + (std::string)stateName + (std::string)"\" already exists!");
|
NFError("State \"" + (std::string)stateName + (std::string)"\" already exists!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setDefaultState(const std::string& stateName) {
|
void Application::setDefaultState(const std::string& stateName) {
|
||||||
@ -78,10 +69,10 @@ namespace nf {
|
|||||||
m_defaultStateAdded = true;
|
m_defaultStateAdded = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Error("State \"" + (std::string)stateName + (std::string)"\" doesn't exist!");
|
NFError("State \"" + (std::string)stateName + (std::string)"\" doesn't exist!");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Error("More than one default state defined!");
|
NFError("More than one default state defined!");
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string& Application::getDefaultState() {
|
const std::string& Application::getDefaultState() {
|
||||||
@ -92,6 +83,15 @@ namespace nf {
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
SetThreadDescription(GetCurrentThread(), L"Input Thread");
|
SetThreadDescription(GetCurrentThread(), L"Input Thread");
|
||||||
#endif
|
#endif
|
||||||
|
m_hInst = GetModuleHandle(NULL);
|
||||||
|
registerWindowClass();
|
||||||
|
RECT windowSize = getWindowRect();
|
||||||
|
int x = 0;
|
||||||
|
int y = 0;
|
||||||
|
calculateNewWindowPos(x, y);
|
||||||
|
m_window = CreateWindowEx(NULL, m_wclassName, toWide(m_currentConfig.title).data(), WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, x, y, windowSize.right, windowSize.bottom, NULL, NULL, m_hInst, NULL);
|
||||||
|
SetProp(m_window, L"App", this);
|
||||||
|
if (m_currentConfig.fullscreen) toggleFullscreen();
|
||||||
showWindow(true);
|
showWindow(true);
|
||||||
m_running = true;
|
m_running = true;
|
||||||
MSG msg = { };
|
MSG msg = { };
|
||||||
@ -119,7 +119,7 @@ namespace nf {
|
|||||||
|
|
||||||
void Application::changeState(const std::string& stateName) {
|
void Application::changeState(const std::string& stateName) {
|
||||||
if (m_states.find(stateName) == m_states.end())
|
if (m_states.find(stateName) == m_states.end())
|
||||||
Error("State \"" + (std::string)stateName + (std::string)"\" doesn't exist!");
|
NFError("State \"" + (std::string)stateName + (std::string)"\" doesn't exist!");
|
||||||
m_stateChange = true;
|
m_stateChange = true;
|
||||||
m_nextState = m_states[stateName];
|
m_nextState = m_states[stateName];
|
||||||
}
|
}
|
||||||
@ -210,7 +210,7 @@ namespace nf {
|
|||||||
|
|
||||||
Application* Application::getApp(bool first) {
|
Application* Application::getApp(bool first) {
|
||||||
if (!currentApp && !first)
|
if (!currentApp && !first)
|
||||||
Error("No Application has been created yet!");
|
NFError("No Application has been created yet!");
|
||||||
return currentApp;
|
return currentApp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,7 +226,7 @@ namespace nf {
|
|||||||
RegisterClass(&wclass);
|
RegisterClass(&wclass);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Error("Cannot run multiple NF applications concurrently!");
|
NFError("Cannot run multiple NF applications concurrently!");
|
||||||
}
|
}
|
||||||
|
|
||||||
RECT Application::getWindowRect() const {
|
RECT Application::getWindowRect() const {
|
||||||
@ -303,7 +303,7 @@ namespace nf {
|
|||||||
|
|
||||||
void Application::quit() {
|
void Application::quit() {
|
||||||
m_quit = true;
|
m_quit = true;
|
||||||
Log("Exiting NF application");
|
NFLog("Exiting NF application");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::runMainGameThread() {
|
void Application::runMainGameThread() {
|
||||||
@ -340,7 +340,7 @@ namespace nf {
|
|||||||
static int i = 0;
|
static int i = 0;
|
||||||
i++;
|
i++;
|
||||||
if (i % 5 == 0)
|
if (i % 5 == 0)
|
||||||
Log("FPS: " + std::to_string(m_FPS));
|
NFLog("FPS: " + std::to_string(m_FPS));
|
||||||
#endif
|
#endif
|
||||||
m_fpsClock1 = std::chrono::steady_clock::now();
|
m_fpsClock1 = std::chrono::steady_clock::now();
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,9 @@ namespace nf {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AssetPack::AssetPack() {
|
AssetPack::AssetPack() :
|
||||||
|
m_loaded(false)
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,7 +89,7 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
curr = cubemaps[cmName];
|
curr = cubemaps[cmName];
|
||||||
if (curr->numImages == 6)
|
if (curr->numImages == 6)
|
||||||
Error("Duplicate cubemap images in pack \"" + (std::string)packName + (std::string)"\"!");
|
NFError("Duplicate cubemap images in pack \"" + (std::string)packName + (std::string)"\"!");
|
||||||
if (assetName.find("_cmfront") != std::string::npos) {
|
if (assetName.find("_cmfront") != std::string::npos) {
|
||||||
curr->frontData = new char[assetSize];
|
curr->frontData = new char[assetSize];
|
||||||
std::memcpy(curr->frontData, &assetContents[0], assetSize);
|
std::memcpy(curr->frontData, &assetContents[0], assetSize);
|
||||||
@ -135,7 +137,7 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
curr = buttons[buttonName];
|
curr = buttons[buttonName];
|
||||||
if (curr->numImages == 3)
|
if (curr->numImages == 3)
|
||||||
Error("Duplicate button images in pack \"" + (std::string)packName + (std::string)"\"!");
|
NFError("Duplicate button images in pack \"" + (std::string)packName + (std::string)"\"!");
|
||||||
if (assetName.find("_buttonidle") != std::string::npos) {
|
if (assetName.find("_buttonidle") != std::string::npos) {
|
||||||
curr->idleTex.data = new char[assetSize];
|
curr->idleTex.data = new char[assetSize];
|
||||||
std::memcpy(curr->idleTex.data, &assetContents[0], assetSize);
|
std::memcpy(curr->idleTex.data, &assetContents[0], assetSize);
|
||||||
@ -196,12 +198,12 @@ namespace nf {
|
|||||||
m_assets[assetName] = sound;
|
m_assets[assetName] = sound;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Error("Invalid asset extention in pack \"" + (std::string)packName + (std::string)"\"!");
|
NFError("Invalid asset extention in pack \"" + (std::string)packName + (std::string)"\"!");
|
||||||
}
|
}
|
||||||
if (cubemapCount % 6 != 0)
|
if (cubemapCount % 6 != 0)
|
||||||
Error("Could not find full cubemap in pack \"" + (std::string)packName + (std::string)"\"!");
|
NFError("Could not find full cubemap in pack \"" + (std::string)packName + (std::string)"\"!");
|
||||||
if (buttonCount % 3 != 0)
|
if (buttonCount % 3 != 0)
|
||||||
Error("Could not find full button set in pack \"" + (std::string)packName + (std::string)"\"!");
|
NFError("Could not find full button set in pack \"" + (std::string)packName + (std::string)"\"!");
|
||||||
|
|
||||||
while (packContentsOBJ.size()) {
|
while (packContentsOBJ.size()) {
|
||||||
size_t startingPos = packContentsOBJ.find_first_of("#NFASSET ") + 9;
|
size_t startingPos = packContentsOBJ.find_first_of("#NFASSET ") + 9;
|
||||||
@ -244,26 +246,35 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_loaded = true;
|
||||||
if (packName != "base.nfpack") {
|
if (packName != "base.nfpack") {
|
||||||
if (!Application::getApp()->getCurrentState()->isRunning())
|
if (!Application::getApp()->getCurrentState()->isRunning())
|
||||||
Application::getApp()->getCurrentState()->m_nfObjects.push_back(this);
|
Application::getApp()->getCurrentState()->m_nfObjects.push_back(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AssetPack::isLoaded() {
|
||||||
|
return m_loaded;
|
||||||
|
}
|
||||||
|
|
||||||
Asset* AssetPack::get(const char* in) {
|
Asset* AssetPack::get(const char* in) {
|
||||||
|
if (!m_loaded) NFError("AssetPack has not been loaded yet!");
|
||||||
if (m_assets.find(in) == m_assets.end())
|
if (m_assets.find(in) == m_assets.end())
|
||||||
Error("Could not find asset \"" + (std::string)in + (std::string)"\" in asset pack!");
|
NFError("Could not find asset \"" + (std::string)in + (std::string)"\" in asset pack!");
|
||||||
return m_assets[in];
|
return m_assets[in];
|
||||||
}
|
}
|
||||||
|
|
||||||
Asset* AssetPack::get(std::string& in) {
|
Asset* AssetPack::get(std::string& in) {
|
||||||
|
if (!m_loaded) NFError("AssetPack has not been loaded yet!");
|
||||||
return get(in.c_str());
|
return get(in.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
Asset* AssetPack::operator[](const char* in) {
|
Asset* AssetPack::operator[](const char* in) {
|
||||||
|
if (!m_loaded) NFError("AssetPack has not been loaded yet!");
|
||||||
return get(in);
|
return get(in);
|
||||||
}
|
}
|
||||||
Asset* AssetPack::operator[](std::string& in) {
|
Asset* AssetPack::operator[](std::string& in) {
|
||||||
|
if (!m_loaded) NFError("AssetPack has not been loaded yet!");
|
||||||
return get(in.c_str());
|
return get(in.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,6 +286,8 @@ namespace nf {
|
|||||||
for (auto curr : m_assets)
|
for (auto curr : m_assets)
|
||||||
delete curr.second;
|
delete curr.second;
|
||||||
m_assets.clear();
|
m_assets.clear();
|
||||||
|
|
||||||
|
m_loaded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AssetPack::~AssetPack() {
|
AssetPack::~AssetPack() {
|
||||||
|
@ -14,10 +14,10 @@ namespace nf {
|
|||||||
{
|
{
|
||||||
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
|
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
Error("Could not initialize COM!");
|
NFError("Could not initialize COM!");
|
||||||
hr = XAudio2Create(&m_engine);
|
hr = XAudio2Create(&m_engine);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
Error("Could not initialize the audio engine!");
|
NFError("Could not initialize the audio engine!");
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
XAUDIO2_DEBUG_CONFIGURATION debug = { 0 };
|
XAUDIO2_DEBUG_CONFIGURATION debug = { 0 };
|
||||||
debug.TraceMask = XAUDIO2_LOG_ERRORS | XAUDIO2_LOG_WARNINGS;
|
debug.TraceMask = XAUDIO2_LOG_ERRORS | XAUDIO2_LOG_WARNINGS;
|
||||||
@ -30,7 +30,7 @@ namespace nf {
|
|||||||
else if (SUCCEEDED(hr))
|
else if (SUCCEEDED(hr))
|
||||||
m_isActive = true;
|
m_isActive = true;
|
||||||
else
|
else
|
||||||
Error("Could not initialize the audio engine!");
|
NFError("Could not initialize the audio engine!");
|
||||||
m_threadRunning = true;
|
m_threadRunning = true;
|
||||||
m_thread = std::thread(&AudioEngine::runAudioThread, this);
|
m_thread = std::thread(&AudioEngine::runAudioThread, this);
|
||||||
}
|
}
|
||||||
@ -45,7 +45,7 @@ namespace nf {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Error("Could not initialize audio!");
|
NFError("Could not initialize audio!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -115,7 +115,7 @@ namespace nf {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (!SUCCEEDED(hr))
|
else if (!SUCCEEDED(hr))
|
||||||
Error("Could not play sound!");
|
NFError("Could not play sound!");
|
||||||
curr.voice = source;
|
curr.voice = source;
|
||||||
curr.voice->SubmitSourceBuffer(curr.buffer);
|
curr.voice->SubmitSourceBuffer(curr.buffer);
|
||||||
curr.voice->SetVolume(curr.volume);
|
curr.voice->SetVolume(curr.volume);
|
||||||
|
@ -39,15 +39,15 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Gamestate::onEnter() {
|
void Gamestate::onEnter() {
|
||||||
Error("Gamestate has no overridden onEnter function!");
|
NFError("Gamestate has no overridden onEnter function!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gamestate::update(float deltaTime) {
|
void Gamestate::update(float deltaTime) {
|
||||||
Error("Gamestate has no overridden update function!");
|
NFError("Gamestate has no overridden update function!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gamestate::render(Renderer& renderer) {
|
void Gamestate::render(Renderer& renderer) {
|
||||||
Error("Gamestate has no overridden render function!");
|
NFError("Gamestate has no overridden render function!");
|
||||||
}
|
}
|
||||||
|
|
||||||
Camera* Gamestate::getCamera() {
|
Camera* Gamestate::getCamera() {
|
||||||
@ -67,7 +67,7 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Gamestate::onExit() {
|
void Gamestate::onExit() {
|
||||||
Error("Gamestate has no overridden onExit function!");
|
NFError("Gamestate has no overridden onExit function!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Gamestate::stop() {
|
void Gamestate::stop() {
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace nf {
|
namespace nf {
|
||||||
void IntroGamestate::onEnter() {
|
void IntroGamestate::onEnter() {
|
||||||
Log("Intro onEnter!");
|
NFLog("Intro onEnter!");
|
||||||
m_scale = 2.0;
|
m_scale = 2.0;
|
||||||
m_logoTex.create(BaseAssets::logo, Vec2(0.0, 0.0));
|
m_logoTex.create(BaseAssets::logo, Vec2(0.0, 0.0));
|
||||||
m_logoTex.centered(true, true);
|
m_logoTex.centered(true, true);
|
||||||
@ -37,6 +37,6 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void IntroGamestate::onExit() {
|
void IntroGamestate::onExit() {
|
||||||
Log("Intro onExit!");
|
NFLog("Intro onExit!");
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -23,7 +23,7 @@ namespace nf {
|
|||||||
|
|
||||||
void Button::create(const Vec2& position, std::string string, Asset* buttonAsset, float scale, float opacity) {
|
void Button::create(const Vec2& position, std::string string, Asset* buttonAsset, float scale, float opacity) {
|
||||||
if (m_constructed)
|
if (m_constructed)
|
||||||
Error("Button already created!");
|
NFError("Button already created!");
|
||||||
m_constructed = true;
|
m_constructed = true;
|
||||||
m_position = position;
|
m_position = position;
|
||||||
m_string = string;
|
m_string = string;
|
||||||
@ -36,12 +36,12 @@ namespace nf {
|
|||||||
m_text.setOpacity(m_opacity);
|
m_text.setOpacity(m_opacity);
|
||||||
AButton* button;
|
AButton* button;
|
||||||
if ((button = dynamic_cast<AButton*>(buttonAsset)) == nullptr)
|
if ((button = dynamic_cast<AButton*>(buttonAsset)) == nullptr)
|
||||||
Error("Non-button asset passed to Button::create!");
|
NFError("Non-button asset passed to Button::create!");
|
||||||
m_idleTexture = new Texture(&button->idleTex);
|
m_idleTexture = new Texture(&button->idleTex);
|
||||||
m_hoverTexture = new Texture(&button->hoverTex);
|
m_hoverTexture = new Texture(&button->hoverTex);
|
||||||
m_pressedTexture = new Texture(&button->pressedTex);
|
m_pressedTexture = new Texture(&button->pressedTex);
|
||||||
if (!((m_idleTexture->getDimensions() == m_hoverTexture->getDimensions()) && (m_idleTexture->getDimensions() == m_pressedTexture->getDimensions()))) {
|
if (!((m_idleTexture->getDimensions() == m_hoverTexture->getDimensions()) && (m_idleTexture->getDimensions() == m_pressedTexture->getDimensions()))) {
|
||||||
Error("Button images are not the same size!");
|
NFError("Button images are not the same size!");
|
||||||
}
|
}
|
||||||
float tc[3][4] = {
|
float tc[3][4] = {
|
||||||
0.0, 1.0,
|
0.0, 1.0,
|
||||||
|
@ -18,7 +18,7 @@ namespace nf {
|
|||||||
|
|
||||||
void Cubemap::create(Asset* cubemapAsset) {
|
void Cubemap::create(Asset* cubemapAsset) {
|
||||||
if (m_constructed)
|
if (m_constructed)
|
||||||
Error("Cubemap already created!");
|
NFError("Cubemap already created!");
|
||||||
m_constructed = true;
|
m_constructed = true;
|
||||||
ACubemap& cm = *(ACubemap*)cubemapAsset;
|
ACubemap& cm = *(ACubemap*)cubemapAsset;
|
||||||
glGenTextures(1, &m_id);
|
glGenTextures(1, &m_id);
|
||||||
|
@ -24,12 +24,12 @@ namespace nf {
|
|||||||
|
|
||||||
void Entity::create(Asset* modelAsset, Type type) {
|
void Entity::create(Asset* modelAsset, Type type) {
|
||||||
if (m_constructed)
|
if (m_constructed)
|
||||||
Error("Entity already created!");
|
NFError("Entity already created!");
|
||||||
m_constructed = true;
|
m_constructed = true;
|
||||||
m_type = type;
|
m_type = type;
|
||||||
AModel* model;
|
AModel* model;
|
||||||
if ((model = dynamic_cast<AModel*>(modelAsset)) == nullptr)
|
if ((model = dynamic_cast<AModel*>(modelAsset)) == nullptr)
|
||||||
Error("Non-model asset passed to Entity::create!");
|
NFError("Non-model asset passed to Entity::create!");
|
||||||
if (model->alreadyLoaded) {
|
if (model->alreadyLoaded) {
|
||||||
m_model = model->loadedModel;
|
m_model = model->loadedModel;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ namespace nf {
|
|||||||
|
|
||||||
void Light::create(const Vec3& position, const Vec3& color, float strength, Type type) {
|
void Light::create(const Vec3& position, const Vec3& color, float strength, Type type) {
|
||||||
if (m_constructed)
|
if (m_constructed)
|
||||||
Error("Light already created!");
|
NFError("Light already created!");
|
||||||
m_constructed = true;
|
m_constructed = true;
|
||||||
m_position = position;
|
m_position = position;
|
||||||
m_color = color;
|
m_color = color;
|
||||||
|
@ -94,11 +94,11 @@ namespace nf {
|
|||||||
|
|
||||||
void Sound::create(Asset* soundAsset) {
|
void Sound::create(Asset* soundAsset) {
|
||||||
if (m_constructed)
|
if (m_constructed)
|
||||||
Error("Sound already created!");
|
NFError("Sound already created!");
|
||||||
m_constructed = true;
|
m_constructed = true;
|
||||||
ASound* sound;
|
ASound* sound;
|
||||||
if ((sound = dynamic_cast<ASound*>(soundAsset)) == nullptr)
|
if ((sound = dynamic_cast<ASound*>(soundAsset)) == nullptr)
|
||||||
Error("Non-sound asset passed to Sound::create!");
|
NFError("Non-sound asset passed to Sound::create!");
|
||||||
std::string data(sound->data, sound->size);
|
std::string data(sound->data, sound->size);
|
||||||
|
|
||||||
size_t dataSize;
|
size_t dataSize;
|
||||||
@ -107,7 +107,7 @@ namespace nf {
|
|||||||
else if (data.find("RIFF") == 0)
|
else if (data.find("RIFF") == 0)
|
||||||
dataSize = loadWAV(data);
|
dataSize = loadWAV(data);
|
||||||
else
|
else
|
||||||
Error("Sound asset not of correct format!");
|
NFError("Sound asset not of correct format!");
|
||||||
|
|
||||||
m_xBuffer.pAudioData = (unsigned char*)m_buffer;
|
m_xBuffer.pAudioData = (unsigned char*)m_buffer;
|
||||||
m_xBuffer.AudioBytes = (unsigned int)dataSize;
|
m_xBuffer.AudioBytes = (unsigned int)dataSize;
|
||||||
@ -167,11 +167,11 @@ namespace nf {
|
|||||||
unsigned int fileSize = *(unsigned int*)&data[4];
|
unsigned int fileSize = *(unsigned int*)&data[4];
|
||||||
size_t fmtPos;
|
size_t fmtPos;
|
||||||
if ((fmtPos = data.find("fmt")) == std::string::npos)
|
if ((fmtPos = data.find("fmt")) == std::string::npos)
|
||||||
Error("WAV not of correct format!");
|
NFError("WAV not of correct format!");
|
||||||
std::memcpy(&m_format, &data[fmtPos + 8], 16);
|
std::memcpy(&m_format, &data[fmtPos + 8], 16);
|
||||||
size_t dataPos;
|
size_t dataPos;
|
||||||
if ((dataPos = data.find("data")) == std::string::npos)
|
if ((dataPos = data.find("data")) == std::string::npos)
|
||||||
Error("WAV not of correct m_format!");
|
NFError("WAV not of correct m_format!");
|
||||||
unsigned int dataSize = *(unsigned int*)&data[dataPos + 4];
|
unsigned int dataSize = *(unsigned int*)&data[dataPos + 4];
|
||||||
m_buffer = new char[dataSize];
|
m_buffer = new char[dataSize];
|
||||||
std::memcpy(m_buffer, &data[dataPos + 8], dataSize);
|
std::memcpy(m_buffer, &data[dataPos + 8], dataSize);
|
||||||
|
@ -19,7 +19,7 @@ namespace nf {
|
|||||||
|
|
||||||
void Text::create(const std::string& string, const Vec2& position, const Vec3& color, float opacity, float scale, Asset* fontAsset) {
|
void Text::create(const std::string& string, const Vec2& position, const Vec3& color, float opacity, float scale, Asset* fontAsset) {
|
||||||
if (m_constructed)
|
if (m_constructed)
|
||||||
Error("Text already created!");
|
NFError("Text already created!");
|
||||||
m_constructed = true;
|
m_constructed = true;
|
||||||
m_string = string;
|
m_string = string;
|
||||||
m_position = position;
|
m_position = position;
|
||||||
@ -28,7 +28,7 @@ namespace nf {
|
|||||||
m_opacity = opacity;
|
m_opacity = opacity;
|
||||||
AFont* font;
|
AFont* font;
|
||||||
if ((font = dynamic_cast<AFont*>(fontAsset)) == nullptr)
|
if ((font = dynamic_cast<AFont*>(fontAsset)) == nullptr)
|
||||||
Error("Non-font asset passed to Text::create!");
|
NFError("Non-font asset passed to Text::create!");
|
||||||
if (font->alreadyLoaded) {
|
if (font->alreadyLoaded) {
|
||||||
m_font = font->loadedFont;
|
m_font = font->loadedFont;
|
||||||
}
|
}
|
||||||
@ -36,10 +36,10 @@ namespace nf {
|
|||||||
m_font = new Font;
|
m_font = new Font;
|
||||||
FT_Library ft;
|
FT_Library ft;
|
||||||
if (FT_Init_FreeType(&ft))
|
if (FT_Init_FreeType(&ft))
|
||||||
Error("Could not initialize FreeType!");
|
NFError("Could not initialize FreeType!");
|
||||||
FT_Face face;
|
FT_Face face;
|
||||||
if (FT_New_Memory_Face(ft, (const unsigned char*)font->data, (unsigned int)font->size, 0, &face))
|
if (FT_New_Memory_Face(ft, (const unsigned char*)font->data, (unsigned int)font->size, 0, &face))
|
||||||
Error("Could not load font!");
|
NFError("Could not load font!");
|
||||||
FT_Set_Pixel_Sizes(face, 0, 160);
|
FT_Set_Pixel_Sizes(face, 0, 160);
|
||||||
for (unsigned char c = 0; c < 128; c++) {
|
for (unsigned char c = 0; c < 128; c++) {
|
||||||
FT_Load_Char(face, c, FT_LOAD_RENDER);
|
FT_Load_Char(face, c, FT_LOAD_RENDER);
|
||||||
|
@ -18,11 +18,11 @@ namespace nf {
|
|||||||
|
|
||||||
void UITexture::create(Asset* textureAsset, const Vec2& position, float scale, float opacity) {
|
void UITexture::create(Asset* textureAsset, const Vec2& position, float scale, float opacity) {
|
||||||
if (m_constructed)
|
if (m_constructed)
|
||||||
Error("UITexture already created!");
|
NFError("UITexture already created!");
|
||||||
m_constructed = true;
|
m_constructed = true;
|
||||||
ATexture* tex;
|
ATexture* tex;
|
||||||
if ((tex = dynamic_cast<ATexture*>(textureAsset)) == nullptr)
|
if ((tex = dynamic_cast<ATexture*>(textureAsset)) == nullptr)
|
||||||
Error("Non-texture asset passed to UITexture::create!");
|
NFError("Non-texture asset passed to UITexture::create!");
|
||||||
m_position = position;
|
m_position = position;
|
||||||
m_scale = scale;
|
m_scale = scale;
|
||||||
m_opacity = opacity;
|
m_opacity = opacity;
|
||||||
|
@ -11,7 +11,7 @@ namespace nf {
|
|||||||
Debug::ErrorImp(message, file, line);
|
Debug::ErrorImp(message, file, line);
|
||||||
__debugbreak();
|
__debugbreak();
|
||||||
#else
|
#else
|
||||||
Error(message);
|
NFError(message);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -33,7 +33,7 @@ namespace nf {
|
|||||||
m_err = new PhysicsErrorCallback;
|
m_err = new PhysicsErrorCallback;
|
||||||
m_foundation = PxCreateFoundation(PX_PHYSICS_VERSION, m_alloc, *m_err);
|
m_foundation = PxCreateFoundation(PX_PHYSICS_VERSION, m_alloc, *m_err);
|
||||||
if (!m_foundation)
|
if (!m_foundation)
|
||||||
Error("Could not initialize physics engine!");
|
NFError("Could not initialize physics engine!");
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
m_pvd = PxCreatePvd(*m_foundation);
|
m_pvd = PxCreatePvd(*m_foundation);
|
||||||
@ -43,11 +43,11 @@ namespace nf {
|
|||||||
|
|
||||||
m_phy = PxCreatePhysics(PX_PHYSICS_VERSION, *m_foundation, PxTolerancesScale(), false, m_pvd);
|
m_phy = PxCreatePhysics(PX_PHYSICS_VERSION, *m_foundation, PxTolerancesScale(), false, m_pvd);
|
||||||
if (!m_phy)
|
if (!m_phy)
|
||||||
Error("Could not initialize physics engine!");
|
NFError("Could not initialize physics engine!");
|
||||||
|
|
||||||
m_cooking = PxCreateCooking(PX_PHYSICS_VERSION, *m_foundation, PxCookingParams(PxTolerancesScale()));
|
m_cooking = PxCreateCooking(PX_PHYSICS_VERSION, *m_foundation, PxCookingParams(PxTolerancesScale()));
|
||||||
if (!m_cooking)
|
if (!m_cooking)
|
||||||
Error("Could not initialize physics engine!");
|
NFError("Could not initialize physics engine!");
|
||||||
|
|
||||||
unsigned int threads = std::thread::hardware_concurrency() - 1;
|
unsigned int threads = std::thread::hardware_concurrency() - 1;
|
||||||
if (threads < 0) threads = 0;
|
if (threads < 0) threads = 0;
|
||||||
@ -177,7 +177,7 @@ namespace nf {
|
|||||||
|
|
||||||
PxDefaultMemoryOutputStream buf;
|
PxDefaultMemoryOutputStream buf;
|
||||||
if (!m_cooking->cookConvexMesh(desc, buf))
|
if (!m_cooking->cookConvexMesh(desc, buf))
|
||||||
Error("Could not create convex mesh!");
|
NFError("Could not create convex mesh!");
|
||||||
|
|
||||||
PxDefaultMemoryInputData in(buf.getData(), buf.getSize());
|
PxDefaultMemoryInputData in(buf.getData(), buf.getSize());
|
||||||
PxConvexMesh* mesh = m_phy->createConvexMesh(in);
|
PxConvexMesh* mesh = m_phy->createConvexMesh(in);
|
||||||
@ -195,7 +195,7 @@ namespace nf {
|
|||||||
|
|
||||||
PxDefaultMemoryOutputStream buf;
|
PxDefaultMemoryOutputStream buf;
|
||||||
if (!m_cooking->cookTriangleMesh(desc, buf))
|
if (!m_cooking->cookTriangleMesh(desc, buf))
|
||||||
Error("Could not create triangle mesh!");
|
NFError("Could not create triangle mesh!");
|
||||||
|
|
||||||
PxDefaultMemoryInputData in(buf.getData(), buf.getSize());
|
PxDefaultMemoryInputData in(buf.getData(), buf.getSize());
|
||||||
PxTriangleMesh* mesh = m_phy->createTriangleMesh(in);
|
PxTriangleMesh* mesh = m_phy->createTriangleMesh(in);
|
||||||
@ -218,7 +218,7 @@ namespace nf {
|
|||||||
else if (m_triangleMeshes.find(entity->getModel()) != m_triangleMeshes.end())
|
else if (m_triangleMeshes.find(entity->getModel()) != m_triangleMeshes.end())
|
||||||
triangleMesh = m_triangleMeshes[entity->getModel()];
|
triangleMesh = m_triangleMeshes[entity->getModel()];
|
||||||
else
|
else
|
||||||
Error("No physics mesh found for this entity!");
|
NFError("No physics mesh found for this entity!");
|
||||||
|
|
||||||
//Dynamic or static
|
//Dynamic or static
|
||||||
if (type == Entity::Type::DYNAMIC) {
|
if (type == Entity::Type::DYNAMIC) {
|
||||||
|
@ -31,30 +31,23 @@ namespace nf {
|
|||||||
return m_type;
|
return m_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::moveForward(float speed) {
|
void Camera::move(const Vec2& offset) {
|
||||||
Vec3 temp = m_front * speed;
|
moveX(offset.x);
|
||||||
|
moveZ(offset.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Camera::moveZ(float offset) {
|
||||||
|
Vec3 temp = m_front * offset;
|
||||||
m_position += temp;
|
m_position += temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::moveBackward(float speed) {
|
void Camera::moveX(float offset) {
|
||||||
Vec3 temp = m_front * speed;
|
|
||||||
m_position -= temp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Camera::moveRight(float speed) {
|
|
||||||
glm::vec3 front = { m_front.x, m_front.y, m_front.z };
|
glm::vec3 front = { m_front.x, m_front.y, m_front.z };
|
||||||
glm::vec3 temp = glm::normalize(glm::cross(front, glm::vec3(0.0, 1.0, 0.0))) * speed;
|
glm::vec3 temp = glm::normalize(glm::cross(front, glm::vec3(0.0, 1.0, 0.0))) * offset;
|
||||||
Vec3 move = { temp.x, temp.y, temp.z };
|
Vec3 move = { temp.x, temp.y, temp.z };
|
||||||
m_position += move;
|
m_position += move;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::moveLeft(float speed) {
|
|
||||||
glm::vec3 front = { m_front.x, m_front.y, m_front.z };
|
|
||||||
glm::vec3 temp = glm::normalize(glm::cross(front, glm::vec3(0.0, 1.0, 0.0))) * speed;
|
|
||||||
Vec3 move = { temp.x, temp.y, temp.z };
|
|
||||||
m_position -= move;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Camera::setPosition(float x, float y, float z) {
|
void Camera::setPosition(float x, float y, float z) {
|
||||||
m_position = { x, y, z };
|
m_position = { x, y, z };
|
||||||
}
|
}
|
||||||
@ -81,7 +74,7 @@ namespace nf {
|
|||||||
return m_front;
|
return m_front;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::bind(Shader* gBufferShader, Shader* lightingShader, Shader* cubemapShader) {
|
void Camera::update(Shader* gBufferShader, Shader* lightingShader, Shader* cubemapShader) {
|
||||||
glm::mat4 view;
|
glm::mat4 view;
|
||||||
|
|
||||||
switch (m_type) {
|
switch (m_type) {
|
||||||
@ -104,7 +97,7 @@ namespace nf {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type::ORBIT: {
|
case Type::ORBIT: {
|
||||||
|
//TODO: Camera orbit mode
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Type::FIXED: {
|
case Type::FIXED: {
|
||||||
|
@ -11,7 +11,7 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Drawable::bind() {
|
void Drawable::bind() {
|
||||||
Error("Tried to bind an invalid object!");
|
NFError("Tried to bind an invalid object!");
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int Drawable::getIndexCount() {
|
unsigned int Drawable::getIndexCount() {
|
||||||
|
@ -19,7 +19,7 @@ namespace nf {
|
|||||||
m_newLine("\n")
|
m_newLine("\n")
|
||||||
{
|
{
|
||||||
if (model->neededTextures.size() > 32)
|
if (model->neededTextures.size() > 32)
|
||||||
Error("Model exceedes 32 texture limit!");
|
NFError("Model exceedes 32 texture limit!");
|
||||||
std::vector<char> file(model->data, model->data + model->size);
|
std::vector<char> file(model->data, model->data + model->size);
|
||||||
size_t mtlPos = std::search(file.begin(), file.end(), m_newMtl, m_newMtl + std::strlen(m_newMtl)) - file.begin();
|
size_t mtlPos = std::search(file.begin(), file.end(), m_newMtl, m_newMtl + std::strlen(m_newMtl)) - file.begin();
|
||||||
std::vector<char> mtl(&file[mtlPos], &file[0] + file.size());
|
std::vector<char> mtl(&file[mtlPos], &file[0] + file.size());
|
||||||
@ -72,15 +72,15 @@ namespace nf {
|
|||||||
}
|
}
|
||||||
else if (std::strcmp(&firstWord[0], "f") == 0) {
|
else if (std::strcmp(&firstWord[0], "f") == 0) {
|
||||||
if (!tcPresent)
|
if (!tcPresent)
|
||||||
Error("No texture coordinates found in model!");
|
NFError("No texture coordinates found in model!");
|
||||||
if (!vnPresent)
|
if (!vnPresent)
|
||||||
Error("No normals found in model!");
|
NFError("No normals found in model!");
|
||||||
|
|
||||||
unsigned int vertexIndex[3], uvIndex[3], vnIndex[3];
|
unsigned int vertexIndex[3], uvIndex[3], vnIndex[3];
|
||||||
char temp;
|
char temp;
|
||||||
ss >> vertexIndex[0] >> temp >> uvIndex[0] >> temp >> vnIndex[0] >> vertexIndex[1] >> temp >> uvIndex[1] >> temp >> vnIndex[1] >> vertexIndex[2] >> temp >> uvIndex[2] >> temp >> vnIndex[2];
|
ss >> vertexIndex[0] >> temp >> uvIndex[0] >> temp >> vnIndex[0] >> vertexIndex[1] >> temp >> uvIndex[1] >> temp >> vnIndex[1] >> vertexIndex[2] >> temp >> uvIndex[2] >> temp >> vnIndex[2];
|
||||||
if (ss.rdbuf()->in_avail() > 1)
|
if (ss.rdbuf()->in_avail() > 1)
|
||||||
Error("Model has non-triangle faces!");
|
NFError("Model has non-triangle faces!");
|
||||||
mats[usingMat]->vbIndices.push_back(vertexIndex[0]);
|
mats[usingMat]->vbIndices.push_back(vertexIndex[0]);
|
||||||
mats[usingMat]->vbIndices.push_back(vertexIndex[1]);
|
mats[usingMat]->vbIndices.push_back(vertexIndex[1]);
|
||||||
mats[usingMat]->vbIndices.push_back(vertexIndex[2]);
|
mats[usingMat]->vbIndices.push_back(vertexIndex[2]);
|
||||||
@ -232,7 +232,7 @@ namespace nf {
|
|||||||
matCount++;
|
matCount++;
|
||||||
}
|
}
|
||||||
if (m_materials.size() > 32)
|
if (m_materials.size() > 32)
|
||||||
Error("Model exceedes 32 material limit!");
|
NFError("Model exceedes 32 material limit!");
|
||||||
m_vao = new VertexArray;
|
m_vao = new VertexArray;
|
||||||
m_vao->addBuffer(&vboPositions[0], vboPositions.size() * sizeof(float));
|
m_vao->addBuffer(&vboPositions[0], vboPositions.size() * sizeof(float));
|
||||||
m_vao->pushFloat(3);
|
m_vao->pushFloat(3);
|
||||||
|
@ -59,7 +59,7 @@ namespace nf {
|
|||||||
wglMakeCurrent(m_hdc, m_hglrc);
|
wglMakeCurrent(m_hdc, m_hglrc);
|
||||||
glewExperimental = GL_TRUE;
|
glewExperimental = GL_TRUE;
|
||||||
if (glewInit() != GLEW_OK)
|
if (glewInit() != GLEW_OK)
|
||||||
Error("Could not initialize GLEW!");
|
NFError("Could not initialize GLEW!");
|
||||||
const int attrib[] = {
|
const int attrib[] = {
|
||||||
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
|
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
|
||||||
WGL_CONTEXT_MINOR_VERSION_ARB, 3,
|
WGL_CONTEXT_MINOR_VERSION_ARB, 3,
|
||||||
@ -71,7 +71,7 @@ namespace nf {
|
|||||||
wglMakeCurrent(m_hdc, m_hglrc);
|
wglMakeCurrent(m_hdc, m_hglrc);
|
||||||
//TODO: Configure V-Sync with a custom max FPS
|
//TODO: Configure V-Sync with a custom max FPS
|
||||||
wglSwapIntervalEXT(0);
|
wglSwapIntervalEXT(0);
|
||||||
Log("OpenGL version: " + std::string((char*)glGetString(GL_VERSION)));
|
NFLog("OpenGL version: " + std::string((char*)glGetString(GL_VERSION)));
|
||||||
glDepthFunc(GL_LESS);
|
glDepthFunc(GL_LESS);
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
@ -137,23 +137,23 @@ namespace nf {
|
|||||||
|
|
||||||
void Renderer::render(Entity& in) {
|
void Renderer::render(Entity& in) {
|
||||||
if (in.isConstructed() == false)
|
if (in.isConstructed() == false)
|
||||||
Error("Tried to render Entity before being created!");
|
NFError("Tried to render Entity before being created!");
|
||||||
m_lGame.push_back(&in);
|
m_lGame.push_back(&in);
|
||||||
//TODO: Sort transparent objects by distance; Farthest first
|
//TODO: Sort transparent objects by distance; Farthest first
|
||||||
}
|
}
|
||||||
void Renderer::render(UIElement& in) {
|
void Renderer::render(UIElement& in) {
|
||||||
if (in.isConstructed() == false)
|
if (in.isConstructed() == false)
|
||||||
Error("Tried to render a UI element before being created!");
|
NFError("Tried to render a UI element before being created!");
|
||||||
m_lUI.push_back(&in);
|
m_lUI.push_back(&in);
|
||||||
}
|
}
|
||||||
void Renderer::render(Light& in) {
|
void Renderer::render(Light& in) {
|
||||||
if (in.isConstructed() == false)
|
if (in.isConstructed() == false)
|
||||||
Error("Tried to render a light before being created!");
|
NFError("Tried to render a light before being created!");
|
||||||
m_lights.push_back(&in);
|
m_lights.push_back(&in);
|
||||||
}
|
}
|
||||||
void Renderer::render(Cubemap& in) {
|
void Renderer::render(Cubemap& in) {
|
||||||
if (in.isConstructed() == false)
|
if (in.isConstructed() == false)
|
||||||
Error("Tried to render a cubemap before being created!");
|
NFError("Tried to render a cubemap before being created!");
|
||||||
m_cubemap = ∈
|
m_cubemap = ∈
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ namespace nf {
|
|||||||
glViewport(0, 0, m_app->getConfig().width, m_app->getConfig().height);
|
glViewport(0, 0, m_app->getConfig().width, m_app->getConfig().height);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)m_app->getConfig().width / (float)m_app->getConfig().height, 0.1f, 1000.0f);
|
glm::mat4 proj = glm::perspective(glm::radians(45.0f), (float)m_app->getConfig().width / (float)m_app->getConfig().height, 0.1f, 1000.0f);
|
||||||
camera->bind(m_gBufferShader, m_lightingShader, m_cubemapShader);
|
camera->update(m_gBufferShader, m_lightingShader, m_cubemapShader);
|
||||||
|
|
||||||
//First, fill the gBuffer with entities
|
//First, fill the gBuffer with entities
|
||||||
m_gBufferShader->setUniform("proj", proj);
|
m_gBufferShader->setUniform("proj", proj);
|
||||||
@ -284,7 +284,7 @@ namespace nf {
|
|||||||
//Check for OpenGL errors
|
//Check for OpenGL errors
|
||||||
GLenum err = glGetError();
|
GLenum err = glGetError();
|
||||||
if (err != GL_NO_ERROR)
|
if (err != GL_NO_ERROR)
|
||||||
Error("OpenGL error " + std::to_string(err));
|
NFError("OpenGL error " + std::to_string(err));
|
||||||
|
|
||||||
//Show completed frame
|
//Show completed frame
|
||||||
SwapBuffers(m_hdc);
|
SwapBuffers(m_hdc);
|
||||||
@ -292,7 +292,7 @@ namespace nf {
|
|||||||
|
|
||||||
void Renderer::setAmbient(float am) {
|
void Renderer::setAmbient(float am) {
|
||||||
if (am < 0.0f)
|
if (am < 0.0f)
|
||||||
Error("Cannot have a negative ambient light strength!");
|
NFError("Cannot have a negative ambient light strength!");
|
||||||
m_lightingShader->setUniform("ambientStrength", am);
|
m_lightingShader->setUniform("ambientStrength", am);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ namespace nf {
|
|||||||
char* message = new char[length];
|
char* message = new char[length];
|
||||||
glGetShaderInfoLog(curr, length, &length, message);
|
glGetShaderInfoLog(curr, length, &length, message);
|
||||||
message[length - 2] = 0;
|
message[length - 2] = 0;
|
||||||
Error("OpenGL Error: " + (std::string)message);
|
NFError("OpenGL Error: " + (std::string)message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
glAttachShader(m_id, vs);
|
glAttachShader(m_id, vs);
|
||||||
@ -51,7 +51,7 @@ namespace nf {
|
|||||||
glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &length);
|
glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &length);
|
||||||
char* message = new char[length];
|
char* message = new char[length];
|
||||||
glGetProgramInfoLog(m_id, length, &length, message);
|
glGetProgramInfoLog(m_id, length, &length, message);
|
||||||
Error("OpenGL Error: " + (std::string)message);
|
NFError("OpenGL Error: " + (std::string)message);
|
||||||
}
|
}
|
||||||
glDetachShader(m_id, vs);
|
glDetachShader(m_id, vs);
|
||||||
glDetachShader(m_id, fs);
|
glDetachShader(m_id, fs);
|
||||||
@ -72,7 +72,7 @@ namespace nf {
|
|||||||
glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &length);
|
glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &length);
|
||||||
char* message = new char[length];
|
char* message = new char[length];
|
||||||
glGetProgramInfoLog(m_id, length, &length, message);
|
glGetProgramInfoLog(m_id, length, &length, message);
|
||||||
Error("OpenGL Error: " + (std::string)message);
|
NFError("OpenGL Error: " + (std::string)message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ namespace nf {
|
|||||||
void Shader::getUniformLocation(const std::string& uniformName) {
|
void Shader::getUniformLocation(const std::string& uniformName) {
|
||||||
unsigned int loc = glGetUniformLocation(m_id, uniformName.c_str());
|
unsigned int loc = glGetUniformLocation(m_id, uniformName.c_str());
|
||||||
if (loc == -1)
|
if (loc == -1)
|
||||||
Error("Uniform \"" + (std::string)uniformName + "\" does not exist!");
|
NFError("Uniform \"" + (std::string)uniformName + "\" does not exist!");
|
||||||
m_uniformLocations[uniformName] = loc;
|
m_uniformLocations[uniformName] = loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ namespace nf {
|
|||||||
stbi_set_flip_vertically_on_load(true);
|
stbi_set_flip_vertically_on_load(true);
|
||||||
unsigned char* texture = stbi_load_from_memory((unsigned char*)tex->data, (unsigned int)tex->size, &m_x, &m_y, &nChannels, 0);
|
unsigned char* texture = stbi_load_from_memory((unsigned char*)tex->data, (unsigned int)tex->size, &m_x, &m_y, &nChannels, 0);
|
||||||
if (!texture)
|
if (!texture)
|
||||||
Error("Texture failed to load from memory!");
|
NFError("Texture failed to load from memory!");
|
||||||
glGenTextures(1, &m_id);
|
glGenTextures(1, &m_id);
|
||||||
glBindTexture(GL_TEXTURE_2D, m_id);
|
glBindTexture(GL_TEXTURE_2D, m_id);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -15,7 +15,7 @@ namespace nf {
|
|||||||
|
|
||||||
void VertexArray::addBuffer(const void* data, const size_t size) {
|
void VertexArray::addBuffer(const void* data, const size_t size) {
|
||||||
if (!m_lastBufferHasLayout)
|
if (!m_lastBufferHasLayout)
|
||||||
Error("Buffer added to vertex array has no layout!");
|
NFError("Buffer added to vertex array has no layout!");
|
||||||
m_buffers.push_back(new VertexBuffer(data, size));
|
m_buffers.push_back(new VertexBuffer(data, size));
|
||||||
m_buffers.back()->bind();
|
m_buffers.back()->bind();
|
||||||
m_lastBufferHasLayout = false;
|
m_lastBufferHasLayout = false;
|
||||||
@ -24,14 +24,14 @@ namespace nf {
|
|||||||
|
|
||||||
void VertexArray::pushFloat(unsigned int count) {
|
void VertexArray::pushFloat(unsigned int count) {
|
||||||
if (m_lastBufferHasLayout)
|
if (m_lastBufferHasLayout)
|
||||||
Error("Tried to modify a vertex array's buffer after the layout was final!");
|
NFError("Tried to modify a vertex array's buffer after the layout was final!");
|
||||||
m_lastBufferLayout.push_back({ GL_FLOAT, count, GL_FALSE });
|
m_lastBufferLayout.push_back({ GL_FLOAT, count, GL_FALSE });
|
||||||
m_lastStride += count * sizeof(GL_FLOAT);
|
m_lastStride += count * sizeof(GL_FLOAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexArray::pushInt(unsigned int count) {
|
void VertexArray::pushInt(unsigned int count) {
|
||||||
if (m_lastBufferHasLayout)
|
if (m_lastBufferHasLayout)
|
||||||
Error("Tried to modify a vertex array's buffer after the layout was final!");
|
NFError("Tried to modify a vertex array's buffer after the layout was final!");
|
||||||
m_lastBufferLayout.push_back({ GL_INT, count, GL_FALSE });
|
m_lastBufferLayout.push_back({ GL_INT, count, GL_FALSE });
|
||||||
m_lastStride += count * sizeof(GL_INT);
|
m_lastStride += count * sizeof(GL_INT);
|
||||||
}
|
}
|
||||||
@ -53,9 +53,9 @@ namespace nf {
|
|||||||
|
|
||||||
void VertexArray::bind() {
|
void VertexArray::bind() {
|
||||||
if (m_buffers.empty())
|
if (m_buffers.empty())
|
||||||
Error("No buffers and layouts added to vertex array before being bound!");
|
NFError("No buffers and layouts added to vertex array before being bound!");
|
||||||
if (!m_lastBufferHasLayout)
|
if (!m_lastBufferHasLayout)
|
||||||
Error("Buffer added to vertex array has no layout!");
|
NFError("Buffer added to vertex array has no layout!");
|
||||||
glBindVertexArray(m_id);
|
glBindVertexArray(m_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +114,7 @@ namespace nf {
|
|||||||
std::ofstream out;
|
std::ofstream out;
|
||||||
out.open(filename, std::ios::binary);
|
out.open(filename, std::ios::binary);
|
||||||
if (!out)
|
if (!out)
|
||||||
Error("File \"" + (std::string)filename + (std::string)"\" could not be written!");
|
NFError("File \"" + (std::string)filename + (std::string)"\" could not be written!");
|
||||||
std::string write(in);
|
std::string write(in);
|
||||||
if (encrypted) {
|
if (encrypted) {
|
||||||
for (unsigned int i = 0; i < write.size(); i++)
|
for (unsigned int i = 0; i < write.size(); i++)
|
||||||
@ -132,7 +132,7 @@ namespace nf {
|
|||||||
std::ifstream in;
|
std::ifstream in;
|
||||||
in.open(filename, std::ios::binary);
|
in.open(filename, std::ios::binary);
|
||||||
if (!in)
|
if (!in)
|
||||||
Error("File \"" + (std::string)filename + (std::string)"\" could not be read!");
|
NFError("File \"" + (std::string)filename + (std::string)"\" could not be read!");
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << in.rdbuf();
|
ss << in.rdbuf();
|
||||||
std::string read(ss.str());
|
std::string read(ss.str());
|
||||||
|
@ -2,53 +2,183 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "IntroGamestate.h"
|
|
||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
|
#include "Gamestate.h"
|
||||||
|
#ifndef NFIMPL
|
||||||
|
#include "IntroGamestate.h"
|
||||||
#include "AudioEngine.h"
|
#include "AudioEngine.h"
|
||||||
#ifdef NFENGINE
|
|
||||||
#include "PhysicsEngine.h"
|
#include "PhysicsEngine.h"
|
||||||
#endif
|
#endif
|
||||||
//TODO: Document ALL frontend functions in new include files for the frontend only
|
//TODO: Document ALL frontend functions in new include files for the frontend only
|
||||||
|
|
||||||
namespace nf {
|
namespace nf {
|
||||||
|
class AudioEngine;
|
||||||
class PhysicsEngine;
|
class PhysicsEngine;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Main class
|
||||||
|
*
|
||||||
|
* This class handles low-level Windows APIs and provides a window.
|
||||||
|
* Every NF applicaiton will create one.
|
||||||
|
*/
|
||||||
class Application {
|
class Application {
|
||||||
public:
|
public:
|
||||||
Application(Config& conf);
|
|
||||||
Application() = delete;
|
|
||||||
Application(Application& other) = delete;
|
Application(Application& other) = delete;
|
||||||
|
/**
|
||||||
|
* @brief Main constructor
|
||||||
|
* @param conf Configuration to be applied to the app as default. Must be provided.
|
||||||
|
*/
|
||||||
|
Application(Config& conf);
|
||||||
|
/**
|
||||||
|
* @brief Sets the app's window icon
|
||||||
|
* @param hIcon Valid HICON loaded with a Windows API funciton like LoadIcon
|
||||||
|
*
|
||||||
|
* This also sets the window's taskbar icon.
|
||||||
|
*/
|
||||||
void setWindowIcon(HICON hIcon);
|
void setWindowIcon(HICON hIcon);
|
||||||
|
/**
|
||||||
|
* @brief Sets the app's cursor
|
||||||
|
* @param hCursor Valid HCURSOR loaded with a Windows API funciton like LoadCursor
|
||||||
|
*/
|
||||||
void setWindowCursor(HCURSOR hCursor);
|
void setWindowCursor(HCURSOR hCursor);
|
||||||
|
/**
|
||||||
|
* @brief Adds a Gamestate to the app's available gamestates
|
||||||
|
* @param state Pointer to the Gamestate instance
|
||||||
|
* @param stateName Name of the state to be used later
|
||||||
|
*
|
||||||
|
* Gamestates can only be accessed in an app if this funciton has been called.
|
||||||
|
* The stateName is added to the app's list of states that can be switched to later.
|
||||||
|
*/
|
||||||
|
void addState(Gamestate* state, const std::string& stateName);
|
||||||
|
/**
|
||||||
|
* @brief Sets the state the app should switch to after the logo gamestate
|
||||||
|
* @param stateName Name of a priviously-added state
|
||||||
|
*
|
||||||
|
* @note The gamestate must have already been added to the app by calling addState.
|
||||||
|
*/
|
||||||
|
void setDefaultState(const std::string& stateName);
|
||||||
|
/**
|
||||||
|
* @brief Queries the name of the current gamestate
|
||||||
|
* @return Name of current gamestate
|
||||||
|
*/
|
||||||
|
const std::string& getDefaultState();
|
||||||
|
/**
|
||||||
|
* @brief Runs the application
|
||||||
|
*
|
||||||
|
* This funciton initializes and runs the main loop on the calling thread.
|
||||||
|
*
|
||||||
|
* @note This function will not return untill the engine exits.
|
||||||
|
*/
|
||||||
|
void run();
|
||||||
|
/**
|
||||||
|
* @brief Change to a different gamestate
|
||||||
|
* @param stateName name of the gamestate to switch to
|
||||||
|
*
|
||||||
|
* This function starts the process of unloading the current gamestate and loading
|
||||||
|
* a new one.
|
||||||
|
*
|
||||||
|
* @note The actual gamestate switching does not happen immediately before the next
|
||||||
|
* frame, but instead after a short amount of time for the engine to fade to a
|
||||||
|
* loading screen.
|
||||||
|
*/
|
||||||
|
void changeState(const std::string& stateName);
|
||||||
|
/**
|
||||||
|
* @brief Sets the visibility of the main window
|
||||||
|
* @param show Show the window?
|
||||||
|
*
|
||||||
|
* This function can be called at any time, regardless of the state of the application.
|
||||||
|
*/
|
||||||
|
void showWindow(bool show);
|
||||||
|
/**
|
||||||
|
* @brief Changes the app's config
|
||||||
|
* @param in The configuration to replace the current one
|
||||||
|
*
|
||||||
|
* This function reads in the new Config and sets up the engine to reflect it.
|
||||||
|
*
|
||||||
|
* @sa Config
|
||||||
|
*/
|
||||||
|
void changeConfig(const Config& in);
|
||||||
|
/**
|
||||||
|
* @brief Queries the current configuration
|
||||||
|
* @return A const reference to the current configuration of the app
|
||||||
|
*
|
||||||
|
* @sa Config
|
||||||
|
*/
|
||||||
|
const Config& getConfig() const;
|
||||||
|
/**
|
||||||
|
* @brief Queries the current FPS
|
||||||
|
* @return The current FPS
|
||||||
|
*
|
||||||
|
* @todo Start averaging the FPS instead of calculating it every frame.
|
||||||
|
*/
|
||||||
|
int getFPS() const;
|
||||||
|
/**
|
||||||
|
* @brief Queries if a certain key is currently down
|
||||||
|
* @param code An NFI code representing a keyboard key
|
||||||
|
* @return If the key is down
|
||||||
|
*
|
||||||
|
* This function returns true for every frame that a key is held down for. This is
|
||||||
|
* perfect for continuous movement or really anything that involves holding keys.
|
||||||
|
*/
|
||||||
|
bool isKeyHeld(unsigned int code);
|
||||||
|
/**
|
||||||
|
* @brief Queries if a certain key has been pressed
|
||||||
|
* @param code An NFI code representing a keyboard key
|
||||||
|
* @return If the key has been pressed
|
||||||
|
*
|
||||||
|
* This function returns true for only one frame that a key is held down for.
|
||||||
|
* This is perfect for toggling menus, actions, etc.
|
||||||
|
*/
|
||||||
|
bool isKeyPressed(unsigned int code);
|
||||||
|
/**
|
||||||
|
* @brief Queries if a certain mouse button is currently down
|
||||||
|
* @param code An NFI code representing a mouse button
|
||||||
|
* @return If the mouse button is down
|
||||||
|
*
|
||||||
|
* This function returns true for every frame that a mouse button is held down for.
|
||||||
|
* This is perfect for automatic weapons, dragging objects, etc.
|
||||||
|
*/
|
||||||
|
bool isMouseHeld(unsigned int code);
|
||||||
|
/**
|
||||||
|
* @brief Queries if a certain mouse button has been pressed
|
||||||
|
* @param code An NFI code representing a mouse button
|
||||||
|
* @return If the mouse button has been pressed
|
||||||
|
*
|
||||||
|
* This function returns true for only one frame that a mouse button is held down for.
|
||||||
|
* This is perfect for semi-automatic weapons, actions, etc.
|
||||||
|
*/
|
||||||
|
bool isMouseClicked(unsigned int code);
|
||||||
|
/**
|
||||||
|
* @brief Queries the cursor's current position in the window
|
||||||
|
* @return The coordinates of the cursor in window space
|
||||||
|
*
|
||||||
|
* A return value of (0, 0) represents the top-left corner of the window while
|
||||||
|
* a return value of (window width, window height) represents the bottom-right
|
||||||
|
* corner of the window.
|
||||||
|
*/
|
||||||
|
Vec2 getMousePos();
|
||||||
|
/**
|
||||||
|
* @brief Exits the main loop and cleans up the engine
|
||||||
|
*
|
||||||
|
* @todo Free up the possibility for an implementation to create another app
|
||||||
|
* before it exits.
|
||||||
|
*/
|
||||||
|
void quit();
|
||||||
|
#ifndef NFIMPL
|
||||||
Renderer* getRenderer() const;
|
Renderer* getRenderer() const;
|
||||||
AudioEngine* getAudioEngine() const;
|
AudioEngine* getAudioEngine() const;
|
||||||
PhysicsEngine* getPhysicsEngine() const;
|
PhysicsEngine* getPhysicsEngine() const;
|
||||||
void addState(Gamestate* state, const std::string& stateName);
|
|
||||||
void setDefaultState(const std::string& stateName);
|
|
||||||
const std::string& getDefaultState();
|
|
||||||
void run();
|
|
||||||
bool hasCustomWindowIcon();
|
bool hasCustomWindowIcon();
|
||||||
void changeState(const std::string& stateName);
|
|
||||||
Gamestate* getCurrentState();
|
Gamestate* getCurrentState();
|
||||||
void showWindow(bool show);
|
|
||||||
const HWND& getWindow();
|
const HWND& getWindow();
|
||||||
void changeConfig(const Config& in);
|
|
||||||
const Config& getConfig() const;
|
|
||||||
int getFPS() const;
|
|
||||||
bool isKeyHeld(unsigned int code);
|
|
||||||
bool isKeyPressed(unsigned int code);
|
|
||||||
bool isMouseClicked(unsigned int code);
|
|
||||||
bool isMouseHeld(unsigned int code);
|
|
||||||
void trackMouse(bool track);
|
void trackMouse(bool track);
|
||||||
void getMouseDiff(int& x, int& y);
|
void getMouseDiff(int& x, int& y);
|
||||||
Vec2 getMousePos();
|
|
||||||
static Application* getApp(bool first = false);
|
static Application* getApp(bool first = false);
|
||||||
|
#endif
|
||||||
void quit();
|
|
||||||
~Application();
|
~Application();
|
||||||
private:
|
private:
|
||||||
void registerWindowClass();
|
void registerWindowClass();
|
||||||
@ -101,8 +231,10 @@ namespace nf {
|
|||||||
//Renderer object to use OpenGL to render the current state
|
//Renderer object to use OpenGL to render the current state
|
||||||
Renderer* m_renderer;
|
Renderer* m_renderer;
|
||||||
|
|
||||||
|
//Handles nf::Sound objects and calculates 3D sounds
|
||||||
AudioEngine* m_audio;
|
AudioEngine* m_audio;
|
||||||
|
|
||||||
|
//Calculates physics
|
||||||
PhysicsEngine* m_physics;
|
PhysicsEngine* m_physics;
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -72,37 +72,136 @@ namespace nf {
|
|||||||
~ASound() override;
|
~ASound() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A representation of a nfpack file
|
||||||
|
*
|
||||||
|
* With this class, you can access your custom assets with the get functions.
|
||||||
|
*/
|
||||||
class AssetPack : public NFObject {
|
class AssetPack : public NFObject {
|
||||||
public:
|
public:
|
||||||
|
AssetPack(const AssetPack& other) = delete;
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
AssetPack();
|
AssetPack();
|
||||||
|
/**
|
||||||
|
* @brief Loads a specified nfpack into memory
|
||||||
|
* @param packName name of pack to load relative to the `assets` directory
|
||||||
|
*
|
||||||
|
* After calling this function, future calls to @ref get will return an Asset pointer.
|
||||||
|
*
|
||||||
|
* @warning Because this function could take a considerable amount of time when
|
||||||
|
* dealing with very large packs, it is not recomended to call this function
|
||||||
|
* in a Gamestate::update or Gamestate::render function.
|
||||||
|
*/
|
||||||
void load(const char* packName);
|
void load(const char* packName);
|
||||||
|
/**
|
||||||
|
* @brief Queries whether or not a pack has been loaded
|
||||||
|
* @return If a pack is loaded
|
||||||
|
*/
|
||||||
|
bool isLoaded();
|
||||||
|
/**
|
||||||
|
* @brief Gets a specified Asset pointer from a string literal
|
||||||
|
* @param in name of asset file to retrieve
|
||||||
|
* @return An Asset pointer
|
||||||
|
*/
|
||||||
Asset* get(const char* in);
|
Asset* get(const char* in);
|
||||||
|
/**
|
||||||
|
* @brief Gets a specified Asset pointer from an std::string
|
||||||
|
* @param in name of asset file to retrieve
|
||||||
|
* @return An Asset pointer
|
||||||
|
*/
|
||||||
Asset* get(std::string& in);
|
Asset* get(std::string& in);
|
||||||
|
/**
|
||||||
|
* @brief Gets a specified Asset pointer from a string literal
|
||||||
|
* @param in name of asset file to retrieve
|
||||||
|
* @return An Asset pointer
|
||||||
|
*
|
||||||
|
* This function allows you to get assets like this:
|
||||||
|
*
|
||||||
|
* ~~~
|
||||||
|
* Asset* model = assetPack["model.obj"];
|
||||||
|
* ~~~
|
||||||
|
*/
|
||||||
Asset* operator[](const char* in);
|
Asset* operator[](const char* in);
|
||||||
|
/**
|
||||||
|
* @brief Gets a specified Asset pointer from an std::string
|
||||||
|
* @param in name of asset file to retrieve
|
||||||
|
* @return An Asset pointer
|
||||||
|
*
|
||||||
|
* This function allows you to get assets like this:
|
||||||
|
*
|
||||||
|
* ~~~
|
||||||
|
* std::string str = "model.obj";
|
||||||
|
* Asset* model = assetPack[str];
|
||||||
|
* ~~~
|
||||||
|
*/
|
||||||
Asset* operator[](std::string& in);
|
Asset* operator[](std::string& in);
|
||||||
|
/**
|
||||||
void destroy() override;
|
* @brief Unloads the pack from memory
|
||||||
|
*
|
||||||
|
* This function can be useful if you have an AssetPack object as a member of
|
||||||
|
* a Gamestate and want to unload it at a specific time.
|
||||||
|
*/
|
||||||
void unload();
|
void unload();
|
||||||
|
void destroy() override;
|
||||||
~AssetPack();
|
~AssetPack();
|
||||||
private:
|
private:
|
||||||
|
bool m_loaded;
|
||||||
std::unordered_map<std::string, Asset*> m_assets;
|
std::unordered_map<std::string, Asset*> m_assets;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A collection of a few defualt assets included in `base.nfpack`
|
||||||
|
*
|
||||||
|
* All models have a default, grey material.
|
||||||
|
*/
|
||||||
struct BaseAssets {
|
struct BaseAssets {
|
||||||
|
/**
|
||||||
|
* @brief A cube
|
||||||
|
*/
|
||||||
static AModel* cube;
|
static AModel* cube;
|
||||||
|
/**
|
||||||
|
* @brief A flattened cube
|
||||||
|
*/
|
||||||
static AModel* plane;
|
static AModel* plane;
|
||||||
|
/**
|
||||||
|
* @brief A sphere
|
||||||
|
*/
|
||||||
static AModel* sphere;
|
static AModel* sphere;
|
||||||
|
/**
|
||||||
|
* @brief A cone
|
||||||
|
*/
|
||||||
static AModel* cone;
|
static AModel* cone;
|
||||||
|
/**
|
||||||
|
* @brief A cylinder
|
||||||
|
*/
|
||||||
static AModel* cylinder;
|
static AModel* cylinder;
|
||||||
|
/**
|
||||||
|
* @brief A torus
|
||||||
|
*/
|
||||||
static AModel* torus;
|
static AModel* torus;
|
||||||
|
/**
|
||||||
|
* @brief NF logo
|
||||||
|
*/
|
||||||
static ATexture* logo;
|
static ATexture* logo;
|
||||||
|
/**
|
||||||
|
* @brief Default cubemap
|
||||||
|
*/
|
||||||
static ACubemap* cubemap;
|
static ACubemap* cubemap;
|
||||||
|
/**
|
||||||
|
* @brief Default font
|
||||||
|
*
|
||||||
|
* The default font is Segoe UI Light.
|
||||||
|
*/
|
||||||
static AFont* font;
|
static AFont* font;
|
||||||
|
/**
|
||||||
|
* @brief Default button textures
|
||||||
|
*
|
||||||
|
* @sa @ref customButtons
|
||||||
|
*/
|
||||||
static AButton* button;
|
static AButton* button;
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -10,15 +10,45 @@ namespace nf {
|
|||||||
class Texture;
|
class Texture;
|
||||||
struct Asset;
|
struct Asset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A UI button
|
||||||
|
*
|
||||||
|
* Buttons can be customized to use three different textures: an idle, hover, and pressed
|
||||||
|
* texture.
|
||||||
|
*
|
||||||
|
* @sa @ref customButtons
|
||||||
|
* @ref createUI
|
||||||
|
*/
|
||||||
class Button : public UIElement, public NFObject {
|
class Button : public UIElement, public NFObject {
|
||||||
public:
|
public:
|
||||||
|
Button(const Button& other) = delete;
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
Button();
|
Button();
|
||||||
|
/**
|
||||||
|
* @brief Creates a UI button
|
||||||
|
* @param position Position vector in screen space
|
||||||
|
* @param string Text to show on the button; Can be an empty string; Optional
|
||||||
|
* @param buttonAsset A custom button asset; Optional
|
||||||
|
* @param scale Scale of the button; Optional
|
||||||
|
* @param opacity Opacity of the button; Optional
|
||||||
|
*/
|
||||||
void create(const Vec2& position, std::string string = "", Asset* buttonAsset = nf::BaseAssets::button, float scale = 1.0f, float opacity = 1.0f);
|
void create(const Vec2& position, std::string string = "", Asset* buttonAsset = nf::BaseAssets::button, float scale = 1.0f, float opacity = 1.0f);
|
||||||
|
/**
|
||||||
|
* @brief Queries whether or not the button has been clicked
|
||||||
|
* @return If the button has been clicked
|
||||||
|
*
|
||||||
|
* @note This function returns true for only one frame when the mouse button
|
||||||
|
* is released on top of the button.
|
||||||
|
*/
|
||||||
|
bool isClicked();
|
||||||
|
#ifndef NFIMPL
|
||||||
const char* identity() override;
|
const char* identity() override;
|
||||||
void render(Shader* shader, unsigned int windowWidth, unsigned int windowHeight, Application* app, Shader* textShader);
|
void render(Shader* shader, unsigned int windowWidth, unsigned int windowHeight, Application* app, Shader* textShader);
|
||||||
bool isClicked();
|
#endif
|
||||||
|
|
||||||
void destroy() override;
|
void destroy() override;
|
||||||
~Button();
|
~Button();
|
||||||
private:
|
private:
|
||||||
|
@ -5,32 +5,110 @@ namespace nf {
|
|||||||
class Application;
|
class Application;
|
||||||
class Shader;
|
class Shader;
|
||||||
//TODO: Make sure there are always newlines here;
|
//TODO: Make sure there are always newlines here;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The viewpoint for the engine
|
||||||
|
*/
|
||||||
class Camera {
|
class Camera {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Dictates the behavior of a camera's movement
|
||||||
|
*/
|
||||||
enum class Type {
|
enum class Type {
|
||||||
|
/**
|
||||||
|
* @brief No mouse capture
|
||||||
|
*
|
||||||
|
* Perfect for selecting menus with the mouse
|
||||||
|
*/
|
||||||
UI,
|
UI,
|
||||||
|
/**
|
||||||
|
* @brief First-person mouse-look movement
|
||||||
|
*/
|
||||||
FIRST_PERSON,
|
FIRST_PERSON,
|
||||||
|
/**
|
||||||
|
* @brief Orbit movement around either a position or Entity
|
||||||
|
*/
|
||||||
ORBIT,
|
ORBIT,
|
||||||
|
/**
|
||||||
|
* @brief Fixed to either a position or Entity
|
||||||
|
*/
|
||||||
FIXED
|
FIXED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef NFIMPL
|
||||||
Camera(Application* app);
|
Camera(Application* app);
|
||||||
|
#else
|
||||||
|
Camera() = delete;
|
||||||
|
Camera(const Camera& other) = delete;
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* @brief Sets the camera's type
|
||||||
|
* @param cameraType the @ref Type to change to
|
||||||
|
*/
|
||||||
void setType(Type cameraType);
|
void setType(Type cameraType);
|
||||||
|
/**
|
||||||
|
* @brief Queries the current @ref Type of the camera
|
||||||
|
* @return The current Type of the camera
|
||||||
|
*/
|
||||||
Type getType() const;
|
Type getType() const;
|
||||||
|
/**
|
||||||
void moveForward(float speed);
|
* @brief Moves the camera given an offset
|
||||||
void moveBackward(float speed);
|
* @param offset Offset vector
|
||||||
void moveRight(float speed);
|
*
|
||||||
void moveLeft(float speed);
|
* The x component of the offset is added to the x coordinate of the camera
|
||||||
|
* while the y component is added to the z coordinate.
|
||||||
|
*/
|
||||||
|
void move(const Vec2& offset);
|
||||||
|
/**
|
||||||
|
* @brief Moves the camera forwards and backwards
|
||||||
|
* @param offset The amount to move the camera in the Z direction
|
||||||
|
*/
|
||||||
|
void moveZ(float offset);
|
||||||
|
/**
|
||||||
|
* @brief Moves the camera left and right
|
||||||
|
* @param offset The amount to move the camera in the X direction
|
||||||
|
*/
|
||||||
|
void moveX(float offset);
|
||||||
|
/**
|
||||||
|
* @brief Sets the position of the camera with three floats
|
||||||
|
* @param x X component
|
||||||
|
* @param y Y component
|
||||||
|
* @param z Z component
|
||||||
|
*/
|
||||||
void setPosition(float x, float y, float z);
|
void setPosition(float x, float y, float z);
|
||||||
|
/**
|
||||||
|
* @brief Sets the position of the camera with a Vec3
|
||||||
|
* @param position Position vector
|
||||||
|
*/
|
||||||
void setPosition(const Vec3& position);
|
void setPosition(const Vec3& position);
|
||||||
|
/**
|
||||||
|
* @brief Queries the position of the camera
|
||||||
|
* @return The position of the camera
|
||||||
|
*/
|
||||||
const Vec3& getPosition();
|
const Vec3& getPosition();
|
||||||
void setRotation(float x, float y);
|
/**
|
||||||
|
* @brief Sets the rotation of the camera given a pitch and yaw
|
||||||
|
* @param yaw Left and right rotation in degrees
|
||||||
|
* @param pitch Up and down rotation in degrees
|
||||||
|
*/
|
||||||
|
void setRotation(float yaw, float pitch);
|
||||||
|
/**
|
||||||
|
* @brief Sets the rotation of the camera given a Vec2
|
||||||
|
* @param rotation Rotation vector
|
||||||
|
*
|
||||||
|
* The x component of the rotation represents yaw (left and right rotation)
|
||||||
|
* while the y component represents pitch (up and down rotation).
|
||||||
|
* Both are in degrees.
|
||||||
|
*/
|
||||||
void setRotation(const Vec2& rotation);
|
void setRotation(const Vec2& rotation);
|
||||||
|
/**
|
||||||
|
* @brief Gets the rotation of the camera
|
||||||
|
* @return The rotation of the camera
|
||||||
|
*/
|
||||||
const Vec3& getRotation();
|
const Vec3& getRotation();
|
||||||
|
#ifndef NFIMPL
|
||||||
void bind(Shader* gBufferShader, Shader* lightingShader, Shader* cubemapShader);
|
void update(Shader* gBufferShader, Shader* lightingShader, Shader* cubemapShader);
|
||||||
|
#endif
|
||||||
~Camera();
|
~Camera();
|
||||||
private:
|
private:
|
||||||
Application* m_app;
|
Application* m_app;
|
||||||
|
@ -1,11 +1,33 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace nf {
|
namespace nf {
|
||||||
|
/**
|
||||||
|
* @brief Configuration for NF
|
||||||
|
*
|
||||||
|
* This struct contains basic information about the engine's window.
|
||||||
|
*
|
||||||
|
* @todo Add more things here such as mouse sensativity and FPS target?
|
||||||
|
*/
|
||||||
struct Config {
|
struct Config {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Width of the engine window (should fullscreen be false)
|
||||||
|
*/
|
||||||
unsigned int width;
|
unsigned int width;
|
||||||
|
/**
|
||||||
|
* @brief Height of the engine window (should fullscreen be false)
|
||||||
|
*/
|
||||||
unsigned int height;
|
unsigned int height;
|
||||||
|
/**
|
||||||
|
* @brief Sets fullscreen
|
||||||
|
*
|
||||||
|
* If fullscreen, the engine will be displayed at the current monitor's
|
||||||
|
* resolution.
|
||||||
|
*/
|
||||||
bool fullscreen;
|
bool fullscreen;
|
||||||
|
/**
|
||||||
|
* @brief Title of the engine's window
|
||||||
|
*/
|
||||||
const char* title;
|
const char* title;
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -6,14 +6,38 @@ namespace nf {
|
|||||||
struct Asset;
|
struct Asset;
|
||||||
class Shader;
|
class Shader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A skybox in the background of a gamestate's world
|
||||||
|
*
|
||||||
|
* A cubemap is a cube with a texture on each one of its 6 sides.
|
||||||
|
*
|
||||||
|
* @sa @ref createCubemap @ref customCubemap
|
||||||
|
*/
|
||||||
class Cubemap : public Drawable, public NFObject {
|
class Cubemap : public Drawable, public NFObject {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
Cubemap();
|
Cubemap();
|
||||||
|
/**
|
||||||
|
* @brief Creates a cubemap
|
||||||
|
* @param cubemapAsset A cubemap asset retrieved from an AssetPack
|
||||||
|
*
|
||||||
|
* This function will prepare the cubemap to be rendered.
|
||||||
|
*
|
||||||
|
* @warning Trying to render a cubemap before creating it will result in an error.
|
||||||
|
*/
|
||||||
void create(Asset* cubemapAsset);
|
void create(Asset* cubemapAsset);
|
||||||
|
/**
|
||||||
|
* @brief Queries whether or not the cubemap has been created
|
||||||
|
* @return If the cubemap has been created
|
||||||
|
*/
|
||||||
bool isConstructed();
|
bool isConstructed();
|
||||||
|
#ifndef NFIMPL
|
||||||
void render(Shader* shader);
|
void render(Shader* shader);
|
||||||
|
#endif
|
||||||
void destroy() override;
|
void destroy() override;
|
||||||
~Cubemap();
|
~Cubemap();
|
||||||
private:
|
private:
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
#include "Assets.h"
|
#include "Assets.h"
|
||||||
#include "NFObject.h"
|
#include "NFObject.h"
|
||||||
#include "Utility.h"
|
#include "Utility.h"
|
||||||
#ifdef NFENGINE
|
#ifndef NFIMPL
|
||||||
#include "glm/glm.hpp"
|
#include "glm/glm.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -10,45 +10,149 @@ namespace nf {
|
|||||||
class Shader;
|
class Shader;
|
||||||
class Model;
|
class Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Represents a 3D object in the world
|
||||||
|
*
|
||||||
|
* Every entity has a position, rotation, and scale with respect to the world.
|
||||||
|
* Every entity also has an associated Model it was created with.
|
||||||
|
*/
|
||||||
class Entity : public NFObject {
|
class Entity : public NFObject {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Dictates the behavior of an entity in the physics simulation
|
||||||
|
*/
|
||||||
enum class Type {
|
enum class Type {
|
||||||
|
/**
|
||||||
|
* @brief Will not move, but will participate in the simulation
|
||||||
|
*/
|
||||||
STATIC,
|
STATIC,
|
||||||
|
/**
|
||||||
|
* @brief Will move and participate in the simulation
|
||||||
|
*/
|
||||||
DYNAMIC,
|
DYNAMIC,
|
||||||
|
/**
|
||||||
|
* @brief Will not move, but will participate in the simulation;
|
||||||
|
* This type allows concave meshes. This type is meant for environmental
|
||||||
|
* meshes such as landscapes and the insides of buildings or similar.
|
||||||
|
*/
|
||||||
MAP,
|
MAP,
|
||||||
|
/**
|
||||||
|
* @brief Will not participate in the simulation; This is perfect for debris
|
||||||
|
* on the ground like trash or books.
|
||||||
|
*/
|
||||||
DETAIL
|
DETAIL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Entity(const Entity& other) = delete;
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
Entity();
|
Entity();
|
||||||
|
/**
|
||||||
|
* @brief Creates an entity
|
||||||
|
* @param modelAsset A model Asset pointer
|
||||||
|
* @param type @ref Type of entity; Defaults to Type::STATIC
|
||||||
|
*
|
||||||
|
* This function will initialize an entity by loading its associated model from
|
||||||
|
* the modelAsset parameter.
|
||||||
|
*
|
||||||
|
* @warning Calling this function twice before the state exits will result in an
|
||||||
|
* error. See @ref isConstructed.
|
||||||
|
*/
|
||||||
void create(Asset* modelAsset, Type type = Type::STATIC);
|
void create(Asset* modelAsset, Type type = Type::STATIC);
|
||||||
|
/**
|
||||||
|
* @brief Queries whether or not the entity has been created
|
||||||
|
* @return If the entity has been created
|
||||||
|
*/
|
||||||
bool isConstructed();
|
bool isConstructed();
|
||||||
|
/**
|
||||||
|
* @brief Queries the type of the entity
|
||||||
|
* @return The type of the entity
|
||||||
|
*/
|
||||||
Type getType();
|
Type getType();
|
||||||
|
/**
|
||||||
|
* @brief Sets the position of the origin of the entity with three floats
|
||||||
|
* @param x X component
|
||||||
|
* @param y Y component
|
||||||
|
* @param z Z component
|
||||||
|
*/
|
||||||
void setPosition(float x, float y, float z);
|
void setPosition(float x, float y, float z);
|
||||||
|
/**
|
||||||
|
* @brief Sets the position of the origin of the entity with a Vec3
|
||||||
|
* @param position The position vector
|
||||||
|
*/
|
||||||
void setPosition(const Vec3& position);
|
void setPosition(const Vec3& position);
|
||||||
|
/**
|
||||||
|
* @brief Sets the rotation of the origin of the entity with three floats in degrees
|
||||||
|
* @param x X component
|
||||||
|
* @param y Y component
|
||||||
|
* @param z Z component
|
||||||
|
*/
|
||||||
void setRotation(float x, float y, float z);
|
void setRotation(float x, float y, float z);
|
||||||
|
/**
|
||||||
|
* @brief Sets the rotation of the origin of the entity with a Vec3
|
||||||
|
* @param rotation The rotation vector in degrees
|
||||||
|
*/
|
||||||
void setRotation(const Vec3& rotation);
|
void setRotation(const Vec3& rotation);
|
||||||
|
/**
|
||||||
|
* @brief Sets the scale of the entity with three floats
|
||||||
|
* @param x X component
|
||||||
|
* @param y Y component
|
||||||
|
* @param z Z component
|
||||||
|
*/
|
||||||
void setScale(float x, float y, float z);
|
void setScale(float x, float y, float z);
|
||||||
|
/**
|
||||||
|
* @brief Sets the scale of the entity with a Vec3
|
||||||
|
* @param scale The scale vector
|
||||||
|
*/
|
||||||
void setScale(const Vec3& scale);
|
void setScale(const Vec3& scale);
|
||||||
|
/**
|
||||||
|
* @brief Sets the scale of the entity with a single scalar
|
||||||
|
* @param x The single scalar for all three axes
|
||||||
|
*/
|
||||||
void setScale(float x);
|
void setScale(float x);
|
||||||
|
/**
|
||||||
|
* @brief Sets the linear velocy of the entity with three floats
|
||||||
|
* @param x X component
|
||||||
|
* @param y Y component
|
||||||
|
* @param z Z component
|
||||||
|
*/
|
||||||
void setVelocity(float x, float y, float z);
|
void setVelocity(float x, float y, float z);
|
||||||
|
/**
|
||||||
|
* @brief Sets the linear velocy of the entity with a Vec3
|
||||||
|
* @param velocity The velocity vector
|
||||||
|
*/
|
||||||
void setVelocity(const Vec3& velocity);
|
void setVelocity(const Vec3& velocity);
|
||||||
|
/**
|
||||||
|
* @brief Sets the mass of the entity
|
||||||
|
* @param mass The mass
|
||||||
|
*
|
||||||
|
* Experiment with different values to get an idea of the scale of masses.
|
||||||
|
*/
|
||||||
void setMass(float mass);
|
void setMass(float mass);
|
||||||
|
/**
|
||||||
|
* @brief Queries the current position of the entity
|
||||||
|
* @return The entity's current position
|
||||||
|
*/
|
||||||
const Vec3& getPosition();
|
const Vec3& getPosition();
|
||||||
|
/**
|
||||||
|
* @brief Queries the current rotation of the entity
|
||||||
|
* @return The entity's current rotation as a quaternion
|
||||||
|
*/
|
||||||
const Vec4& getRotation();
|
const Vec4& getRotation();
|
||||||
|
/**
|
||||||
|
* @brief Queries the current scale of the entity
|
||||||
|
* @return The entity's current scale
|
||||||
|
*/
|
||||||
const Vec3& getScale();
|
const Vec3& getScale();
|
||||||
|
#ifndef NFIMPL
|
||||||
void setPositionPhysics(const Vec3& position);
|
void setPositionPhysics(const Vec3& position);
|
||||||
void setRotationPhysics(const Vec4& rotation);
|
void setRotationPhysics(const Vec4& rotation);
|
||||||
bool needsPhysicsUpdate();
|
bool needsPhysicsUpdate();
|
||||||
void render(Shader* shader, bool onlyDepth);
|
void render(Shader* shader, bool onlyDepth);
|
||||||
Model* getModel() const;
|
Model* getModel() const;
|
||||||
#ifdef NFENGINE
|
|
||||||
const glm::mat4 getModelMatrix();
|
const glm::mat4 getModelMatrix();
|
||||||
#endif
|
#endif
|
||||||
void destroy() override;
|
void destroy() override;
|
||||||
|
@ -13,31 +13,98 @@ namespace nf {
|
|||||||
class Model;
|
class Model;
|
||||||
class Texture;
|
class Texture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A state NF can be in that includes a collection of objects and user-defined
|
||||||
|
* behavior
|
||||||
|
*
|
||||||
|
* Every user-defined state inherits from this class.
|
||||||
|
*/
|
||||||
class Gamestate {
|
class Gamestate {
|
||||||
public:
|
public:
|
||||||
Gamestate();
|
|
||||||
//TODO: Add this to other objects
|
//TODO: Add this to other objects
|
||||||
Gamestate(const Gamestate& other) = delete;
|
Gamestate(const Gamestate& other) = delete;
|
||||||
|
/**
|
||||||
|
* @brief Default constructor; Must be used
|
||||||
|
*/
|
||||||
|
Gamestate();
|
||||||
|
/**
|
||||||
|
* @brief The state's 'constructor'
|
||||||
|
*
|
||||||
|
* This function runs when the state is started.
|
||||||
|
*/
|
||||||
|
virtual void onEnter();
|
||||||
|
/**
|
||||||
|
* @brief Update function
|
||||||
|
* @param deltaTime Amount of time the previous frame took to produce in seconds
|
||||||
|
*
|
||||||
|
* This function is called every frame. It is called before render.
|
||||||
|
*
|
||||||
|
* The deltaTime parameter's purpose is to create non-frame-dependant gameplay. This
|
||||||
|
* number should be multiplied with user numbers likes velocities. Doing this will
|
||||||
|
* produce output that will look the same on higher and lower framerates.
|
||||||
|
*/
|
||||||
|
virtual void update(float deltaTime);
|
||||||
|
/**
|
||||||
|
* @brief Render function
|
||||||
|
* @param renderer A reference to the Renderer object
|
||||||
|
*
|
||||||
|
* This function will contain calls to Renderer::render to decide what will be drawn
|
||||||
|
* on the next frame.
|
||||||
|
*
|
||||||
|
* @sa Renderer
|
||||||
|
*/
|
||||||
|
virtual void render(Renderer& renderer);
|
||||||
|
/**
|
||||||
|
* @brief The state's 'destructor'
|
||||||
|
*
|
||||||
|
* This function runs when the state is exited.
|
||||||
|
*
|
||||||
|
* It is imperitive that the class members are 'reset' back to their default values
|
||||||
|
* here. This does not include members of the Gamestate that are NF objects
|
||||||
|
* such as entites and UIElements.
|
||||||
|
*
|
||||||
|
* For more information see the @ref gamestates.
|
||||||
|
*/
|
||||||
|
virtual void onExit();
|
||||||
|
/**
|
||||||
|
* @brief Returns the state's Camera
|
||||||
|
* @return The state's camera
|
||||||
|
*/
|
||||||
|
Camera* getCamera();
|
||||||
|
/**
|
||||||
|
* @brief Sets the state's ambient light level
|
||||||
|
* @param stength Light level multiplier; Defaults to 0.1f
|
||||||
|
*
|
||||||
|
* An ambient light level of 0.0f is perfect for pitch dark rooms where no light means
|
||||||
|
* completely black while a level of 1.0f means full-bright.
|
||||||
|
*/
|
||||||
|
void setAmbientLight(float stength);
|
||||||
|
/**
|
||||||
|
* @brief Sets the state's gravity in a certain direction
|
||||||
|
* @param gravity A vector representing a direction the force of gravity should act in
|
||||||
|
* In units of Earth gravity
|
||||||
|
*
|
||||||
|
* The default gravity of a state is:
|
||||||
|
*
|
||||||
|
* ~~~
|
||||||
|
* Vec3(0.0, -1.0, 0.0);
|
||||||
|
* ~~~
|
||||||
|
*/
|
||||||
|
void setGravity(const Vec3& gravity);
|
||||||
|
/**
|
||||||
|
* @brief Sets the state's gravity downward
|
||||||
|
* @param strength A multiplier in units of Earth gravity
|
||||||
|
*
|
||||||
|
* The default is 1.0f;
|
||||||
|
*/
|
||||||
|
void setGravity(float strength);
|
||||||
|
#ifndef NFIMPL
|
||||||
void run(Application* app, bool physics = true);
|
void run(Application* app, bool physics = true);
|
||||||
bool isRunning();
|
bool isRunning();
|
||||||
bool isLoading();
|
bool isLoading();
|
||||||
|
|
||||||
virtual void onEnter();
|
|
||||||
|
|
||||||
virtual void update(float deltaTime);
|
|
||||||
virtual void render(Renderer& renderer);
|
|
||||||
|
|
||||||
Camera* getCamera();
|
|
||||||
//Defaults to 0.1f
|
|
||||||
void setAmbientLight(float stength);
|
|
||||||
//In units of Earth gravity (9.81 m/s^2)
|
|
||||||
void setGravity(const Vec3& gravity);
|
|
||||||
void setGravity(float strength);
|
|
||||||
|
|
||||||
virtual void onExit();
|
|
||||||
void stop();
|
void stop();
|
||||||
|
#endif
|
||||||
|
//TODO: Probably change these to private members?
|
||||||
std::vector<NFObject*> m_nfObjects;
|
std::vector<NFObject*> m_nfObjects;
|
||||||
std::vector<Entity*> m_entsToDelete;
|
std::vector<Entity*> m_entsToDelete;
|
||||||
std::unordered_set<Model*> m_modelsToDelete;
|
std::unordered_set<Model*> m_modelsToDelete;
|
||||||
|
@ -5,27 +5,89 @@
|
|||||||
namespace nf {
|
namespace nf {
|
||||||
class Shader;
|
class Shader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A light in a gamestate's world
|
||||||
|
*
|
||||||
|
* Lights are completely dynamic and can have different colors and strengths. They
|
||||||
|
* are also movable.
|
||||||
|
*/
|
||||||
class Light : public NFObject {
|
class Light : public NFObject {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Dictates the behavior of a light
|
||||||
|
*/
|
||||||
enum class Type {
|
enum class Type {
|
||||||
DIRECTIONAL,
|
/**
|
||||||
POINT
|
* @brief A light that has a position in the world and casts light in every
|
||||||
|
* direction
|
||||||
|
*/
|
||||||
|
POINT,
|
||||||
|
/**
|
||||||
|
* @brief A light that has no position, but only a direction; Perfect for
|
||||||
|
* sunlight
|
||||||
|
*/
|
||||||
|
DIRECTIONAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
Light();
|
Light();
|
||||||
|
/**
|
||||||
|
* @brief Creates a light
|
||||||
|
* @param position Starting position vector of the light
|
||||||
|
* @param color Color vector in (red, green, blue) order from 0.0f to 1.0f
|
||||||
|
* @param strength Strength of the light; Optional
|
||||||
|
* @param type Type of the light; Optional
|
||||||
|
*/
|
||||||
void create(const Vec3& position, const Vec3& color, float strength = 1.0f, Type type = Type::POINT);
|
void create(const Vec3& position, const Vec3& color, float strength = 1.0f, Type type = Type::POINT);
|
||||||
|
/**
|
||||||
|
* @brief Queries whether or not the light has been created
|
||||||
|
* @return If the light has been created
|
||||||
|
*/
|
||||||
bool isConstructed();
|
bool isConstructed();
|
||||||
|
/**
|
||||||
|
* @brief Sets the position of the light with a Vec3
|
||||||
|
* @param position The position vector
|
||||||
|
*
|
||||||
|
* For directional lights, this will change the direction instead of the position.
|
||||||
|
*/
|
||||||
void setPosition(const Vec3& position);
|
void setPosition(const Vec3& position);
|
||||||
|
/**
|
||||||
|
* @brief Sets the color of the light
|
||||||
|
* @param color The color vector in (red, green, blue) order from 0.0f to 1.0f
|
||||||
|
*/
|
||||||
void setColor(const Vec3& color);
|
void setColor(const Vec3& color);
|
||||||
|
/**
|
||||||
|
* @brief Sets the strength of the light
|
||||||
|
* @param strength The strength
|
||||||
|
*/
|
||||||
void setStrength(float strength);
|
void setStrength(float strength);
|
||||||
|
/**
|
||||||
void bind(Shader* shader, unsigned int lightNumber);
|
* @brief Queries the type of the light
|
||||||
|
* @return The type of the light
|
||||||
|
*/
|
||||||
Type getType();
|
Type getType();
|
||||||
|
/**
|
||||||
|
* @brief Gets the position of the light
|
||||||
|
* @return The position of the light
|
||||||
|
*/
|
||||||
const Vec3& getPosition();
|
const Vec3& getPosition();
|
||||||
|
/**
|
||||||
|
* @brief Gets the color of the light
|
||||||
|
* @return The color vector
|
||||||
|
*/
|
||||||
const Vec3& getColor();
|
const Vec3& getColor();
|
||||||
|
/**
|
||||||
|
* @brief Gets the strength of the light
|
||||||
|
* @return The strength
|
||||||
|
*/
|
||||||
const float getStrength();
|
const float getStrength();
|
||||||
|
#ifndef NFIMPL
|
||||||
|
void bind(Shader* shader, unsigned int lightNumber);
|
||||||
|
#endif
|
||||||
void destroy() override;
|
void destroy() override;
|
||||||
~Light();
|
~Light();
|
||||||
private:
|
private:
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
//TODO: Rework this file to only contain functions the frontend will need to access
|
//TODO: Rework this file to only contain functions the frontend will need to access
|
||||||
//Maybe a implementation define here?
|
//Maybe a implementation define here?
|
||||||
|
|
||||||
|
//TODO: Prevent including other headers other than this one
|
||||||
|
|
||||||
#include <chrono>
|
#ifndef NFIMPL
|
||||||
#include <unordered_map>
|
#define NFIMPL 1
|
||||||
#include <array>
|
#endif
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
@ -17,22 +17,59 @@ namespace nf {
|
|||||||
class VertexArray;
|
class VertexArray;
|
||||||
class IndexBuffer;
|
class IndexBuffer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles rendering user objects
|
||||||
|
*
|
||||||
|
* This should only be accessed in a gamestate's render function.
|
||||||
|
*
|
||||||
|
* @todo Maybe move to something like rendering everything automatically and adding a
|
||||||
|
* show function to entities and UI stuff?
|
||||||
|
*/
|
||||||
class Renderer {
|
class Renderer {
|
||||||
public:
|
public:
|
||||||
Renderer(Application* app);
|
/**
|
||||||
|
* @brief Renders an Entity
|
||||||
|
* @param in Entity to render
|
||||||
|
*
|
||||||
|
* This function adds an Entity to the list of entites to render in the next frame.
|
||||||
|
*
|
||||||
|
* @note An entity will participate in the physics simulation if it is setup to
|
||||||
|
* do so regardless of if it is rendered or not.
|
||||||
|
*/
|
||||||
|
void render(Entity& in);
|
||||||
|
/**
|
||||||
|
* @brief Renders a UIElement
|
||||||
|
* @param in UIElement to render
|
||||||
|
*
|
||||||
|
* This function adds a UIElement to the list UIElements to render in the next frame.
|
||||||
|
*/
|
||||||
|
void render(UIElement& in);
|
||||||
|
/**
|
||||||
|
* @brief Renders a Light
|
||||||
|
* @param in Light to render
|
||||||
|
*
|
||||||
|
* This function adds a Light to the list of lights to render in the next frame.
|
||||||
|
*/
|
||||||
|
void render(Light& in);
|
||||||
|
/**
|
||||||
|
* @brief Renders a Cubemap
|
||||||
|
* @param in Cubemap to render
|
||||||
|
*
|
||||||
|
* This function sets the next frame's Cubemap.
|
||||||
|
*
|
||||||
|
* @note Because only one Cubemap can be rendered in a frame, only the last call to
|
||||||
|
* this function before a frame is produced will take effect.
|
||||||
|
*/
|
||||||
|
void render(Cubemap& in);
|
||||||
|
#ifndef NFIMPL
|
||||||
void setFade(bool in, bool out, bool text = true);
|
void setFade(bool in, bool out, bool text = true);
|
||||||
bool isFadeOutComplete();
|
bool isFadeOutComplete();
|
||||||
|
|
||||||
void render(Entity& in);
|
|
||||||
void render(UIElement& in);
|
|
||||||
void render(Light& in);
|
|
||||||
void render(Cubemap& in);
|
|
||||||
|
|
||||||
void doFrame(Camera* camera, float dT);
|
void doFrame(Camera* camera, float dT);
|
||||||
void setAmbient(float am);
|
void setAmbient(float am);
|
||||||
|
|
||||||
|
Renderer(Application* app);
|
||||||
~Renderer();
|
~Renderer();
|
||||||
|
#endif
|
||||||
private:
|
private:
|
||||||
void loadBaseAssets();
|
void loadBaseAssets();
|
||||||
void createShadowMaps();
|
void createShadowMaps();
|
||||||
|
@ -7,15 +7,58 @@ namespace nf {
|
|||||||
struct Asset;
|
struct Asset;
|
||||||
class Entity;
|
class Entity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A stream of audio; Could be a sound effect or music
|
||||||
|
*
|
||||||
|
* NF currently supports WAV and Ogg Vorbis files.
|
||||||
|
*/
|
||||||
class Sound : public NFObject {
|
class Sound : public NFObject {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
Sound();
|
Sound();
|
||||||
|
/**
|
||||||
|
* @brief Creates a sound
|
||||||
|
* @param soundAsset A sound asset retrieved from an AssetPack
|
||||||
|
*
|
||||||
|
* The referenced sound can be of any format. This function will take care of
|
||||||
|
* figuring that out and loading it accordingly.
|
||||||
|
*/
|
||||||
void create(Asset* soundAsset);
|
void create(Asset* soundAsset);
|
||||||
|
/**
|
||||||
|
* @brief Sets the volume of the sound
|
||||||
|
* @param volume Volume; Can be higher than 1.0f
|
||||||
|
*/
|
||||||
void setVolume(float volume);
|
void setVolume(float volume);
|
||||||
|
/**
|
||||||
|
* @brief Sets the target Entity of the sound
|
||||||
|
* @param entity The target entity
|
||||||
|
*
|
||||||
|
* This function will bind the sound to a specific entity. When it is played,
|
||||||
|
* it will sound like the sound is coming from the target entity.
|
||||||
|
*/
|
||||||
void setEntity(Entity& entity);
|
void setEntity(Entity& entity);
|
||||||
|
/**
|
||||||
|
* @brief Sets the static location the sound should play at
|
||||||
|
* @param position A position vector
|
||||||
|
*/
|
||||||
void setPosition(const Vec3& position);
|
void setPosition(const Vec3& position);
|
||||||
|
/**
|
||||||
|
* @brief Plays the sound
|
||||||
|
* @param loop If the sound should forever loop when it completes playing
|
||||||
|
*
|
||||||
|
* This function can be called multiple times to play multiple instances of the
|
||||||
|
* sound.
|
||||||
|
*/
|
||||||
void play(bool loop = false);
|
void play(bool loop = false);
|
||||||
|
/**
|
||||||
|
* @brief Stops the sound
|
||||||
|
*
|
||||||
|
* This function will stop all instances of the sound if multiple are playing
|
||||||
|
*/
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
void destroy() override;
|
void destroy() override;
|
||||||
|
@ -19,18 +19,53 @@ namespace nf {
|
|||||||
bool isBase = false;
|
bool isBase = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A UI string
|
||||||
|
*
|
||||||
|
* Custom fonts are supported. See @ref customFonts
|
||||||
|
*/
|
||||||
class Text : public UIElement, public NFObject {
|
class Text : public UIElement, public NFObject {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
Text();
|
Text();
|
||||||
|
/**
|
||||||
|
* @brief Creates UI text
|
||||||
|
* @param string The text itself
|
||||||
|
* @param position Position vector in screen space
|
||||||
|
* @param color Color vector; Optional
|
||||||
|
* @param opacity Opacity of the text; Optional
|
||||||
|
* @param scale Scale of the text; Optional
|
||||||
|
* @param fontAsset Custom font asset; Optional
|
||||||
|
*/
|
||||||
void create(const std::string& string, const Vec2& position, const Vec3& color = {1.0, 1.0, 1.0}, float opacity = 1.0f, float scale = 1.0f, Asset* fontAsset = BaseAssets::font);
|
void create(const std::string& string, const Vec2& position, const Vec3& color = {1.0, 1.0, 1.0}, float opacity = 1.0f, float scale = 1.0f, Asset* fontAsset = BaseAssets::font);
|
||||||
const char* identity() override;
|
/**
|
||||||
|
* @brief Sets the displayed text
|
||||||
|
* @param string The new text to display
|
||||||
|
*/
|
||||||
void setText(const std::string& string);
|
void setText(const std::string& string);
|
||||||
|
/**
|
||||||
|
* @brief Sets the text's color
|
||||||
|
* @param color The new color vector
|
||||||
|
*/
|
||||||
void setColor(const Vec3& color);
|
void setColor(const Vec3& color);
|
||||||
|
/**
|
||||||
|
* @brief Sets the text's scale
|
||||||
|
* @param scale The new scale
|
||||||
|
*/
|
||||||
void setScale(float scale);
|
void setScale(float scale);
|
||||||
|
/**
|
||||||
|
* @brief Sets the text's opacity
|
||||||
|
* @param opacity The new opacity
|
||||||
|
*/
|
||||||
void setOpacity(float opacity);
|
void setOpacity(float opacity);
|
||||||
|
#ifndef NFIMPL
|
||||||
|
const char* identity() override;
|
||||||
void render(Shader* shader, unsigned int windowWidth, unsigned int windowHeight, bool onButton = false, float buttonWidth = 0.0f, float buttonHeight = 0.0f, const Vec2& buttonPos = Vec2());
|
void render(Shader* shader, unsigned int windowWidth, unsigned int windowHeight, bool onButton = false, float buttonWidth = 0.0f, float buttonHeight = 0.0f, const Vec2& buttonPos = Vec2());
|
||||||
|
#endif
|
||||||
void destroy() override;
|
void destroy() override;
|
||||||
~Text();
|
~Text();
|
||||||
private:
|
private:
|
||||||
|
@ -7,16 +7,41 @@ namespace nf {
|
|||||||
class Texture;
|
class Texture;
|
||||||
struct Asset;
|
struct Asset;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A UI image
|
||||||
|
*
|
||||||
|
* This class represents a texture that can be added to the UI.
|
||||||
|
*/
|
||||||
class UITexture : public UIElement, public NFObject {
|
class UITexture : public UIElement, public NFObject {
|
||||||
public:
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Constructor
|
||||||
|
*
|
||||||
|
* See @ref obLifetime
|
||||||
|
*/
|
||||||
UITexture();
|
UITexture();
|
||||||
|
/**
|
||||||
|
* @brief Creates a UI texture
|
||||||
|
* @param textureAsset Texture asset retrieved from an AssetPack
|
||||||
|
* @param position Position vector in screen space
|
||||||
|
* @param scale Scale of the texture
|
||||||
|
* @param opacity Opacity of the texture
|
||||||
|
*/
|
||||||
void create(Asset* textureAsset, const Vec2& position, float scale = 1.0f, float opacity = 1.0f);
|
void create(Asset* textureAsset, const Vec2& position, float scale = 1.0f, float opacity = 1.0f);
|
||||||
const char* identity() override;
|
/**
|
||||||
|
* @brief Sets the texture's scale
|
||||||
|
* @param scale The new scale
|
||||||
|
*/
|
||||||
void setScale(float scale);
|
void setScale(float scale);
|
||||||
|
/**
|
||||||
|
* @brief Sets the texture's opacity
|
||||||
|
* @param opacity The new opacity
|
||||||
|
*/
|
||||||
void setOpacity(float opacity);
|
void setOpacity(float opacity);
|
||||||
|
#ifndef NFIMPL
|
||||||
|
const char* identity() override;
|
||||||
void render(Shader* shader, unsigned int windowWidth, unsigned int windowHeight) override;
|
void render(Shader* shader, unsigned int windowWidth, unsigned int windowHeight) override;
|
||||||
|
#endif
|
||||||
void destroy() override;
|
void destroy() override;
|
||||||
~UITexture();
|
~UITexture();
|
||||||
private:
|
private:
|
||||||
|
@ -4,22 +4,48 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Nothin' Fancy namespace
|
||||||
|
*
|
||||||
|
* Every class and struct lives inside of this namespace
|
||||||
|
*
|
||||||
|
* It could be useful to `using` this namespace:
|
||||||
|
*
|
||||||
|
* ~~~
|
||||||
|
* using namespace nf;
|
||||||
|
* ~~~
|
||||||
|
*/
|
||||||
namespace nf {
|
namespace nf {
|
||||||
#ifdef _DEBUG
|
#if defined(_DEBUG) || defined(doxygen)
|
||||||
//Strips __FILE__ down to only the name of the file
|
//Strips __FILE__ down to only the name of the file
|
||||||
#define __FILENAME__ strrchr(__FILE__, '\\') + 1
|
#define __FILENAME__ strrchr(__FILE__, '\\') + 1
|
||||||
//Initializes static variables needed for debugging
|
//Initializes static variables needed for debugging
|
||||||
#define DEBUGINIT std::chrono::steady_clock::time_point Debug::m_initTime = std::chrono::high_resolution_clock::now();
|
#define NFDEBUGINIT std::chrono::steady_clock::time_point Debug::m_initTime = std::chrono::high_resolution_clock::now();
|
||||||
//Sleep for an amount of seconds
|
/**
|
||||||
#define SleepS(x) std::this_thread::sleep_for(std::chrono::seconds(x))
|
* Pauses the engine for a set amount of seconds
|
||||||
//Sleep for an amount of milliseconds
|
*/
|
||||||
#define SleepMS(x) std::this_thread::sleep_for(std::chrono::milliseconds(x))
|
#define NFSleepS(x) std::this_thread::sleep_for(std::chrono::seconds(x))
|
||||||
//Prints a nicely-formatted message complete with a timestamp
|
/**
|
||||||
#define Log(x) nf::Debug::LogImp(x)
|
* Pauses the engine for a set amount of milliseconds
|
||||||
//Prints error message and breaks the debugger in debug mode
|
*/
|
||||||
#define Error(x) {nf::Debug::ErrorImp(x,__FILENAME__, __LINE__);\
|
#define NFSleepMS(x) std::this_thread::sleep_for(std::chrono::milliseconds(x))
|
||||||
|
/**
|
||||||
|
* In debug mode, this prints a nicely-formatted message complete with a timestamp.
|
||||||
|
*
|
||||||
|
* In release mode, this does nothing.
|
||||||
|
*/
|
||||||
|
#define NFLog(x) nf::Debug::LogImp(x)
|
||||||
|
/**
|
||||||
|
* In debug mode, the error message is printed to the console and the debugger is broken.
|
||||||
|
*
|
||||||
|
* In release mode, the error message is shown in a message box and the application
|
||||||
|
* closes when the message box is closed.
|
||||||
|
*/
|
||||||
|
#define NFError(x) {nf::Debug::ErrorImp(x,__FILENAME__, __LINE__);\
|
||||||
__debugbreak();}
|
__debugbreak();}
|
||||||
|
/**
|
||||||
|
* @brief Handles NFLog and NFError calls
|
||||||
|
*/
|
||||||
class Debug {
|
class Debug {
|
||||||
private:
|
private:
|
||||||
static std::chrono::steady_clock::time_point m_initTime;
|
static std::chrono::steady_clock::time_point m_initTime;
|
||||||
@ -33,24 +59,70 @@ __debugbreak();}
|
|||||||
static void ErrorImp(const std::string& in, const char* filename, int line);
|
static void ErrorImp(const std::string& in, const char* filename, int line);
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
#define DEBUGINIT
|
#define NFDEBUGINIT
|
||||||
#define Log(x)
|
#define NFSleepS(x)
|
||||||
//Shows error dialog with specified message then exits
|
#define NFSleepMS(x)
|
||||||
#define Error(x) {MessageBox(FindWindow(L"NFClass", NULL), toWide(x).data(), L"NF Engine Error", MB_OK | MB_ICONERROR);\
|
#define NFLog(x)
|
||||||
|
#define NFError(x) {MessageBox(FindWindow(L"NFClass", NULL), toWide(x).data(), L"NF Engine Error", MB_OK | MB_ICONERROR);\
|
||||||
std::exit(-1);}
|
std::exit(-1);}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Two component vector
|
||||||
|
*
|
||||||
|
* Similar to Vec3 and Vec4.
|
||||||
|
*
|
||||||
|
* Supports operators + - * / += -= *= /= ==
|
||||||
|
*/
|
||||||
struct Vec2 {
|
struct Vec2 {
|
||||||
Vec2() : x(0.0), y(0.0) {}
|
/**
|
||||||
|
* @brief Default constructor
|
||||||
|
*
|
||||||
|
* Initializes all components to 0.0f
|
||||||
|
*/
|
||||||
|
Vec2() : x(0.0f), y(0.0f) {}
|
||||||
|
/**
|
||||||
|
* @brief Single constructor
|
||||||
|
* @param x1
|
||||||
|
*
|
||||||
|
* Sets all components to x1
|
||||||
|
*/
|
||||||
Vec2(float x1) : x(x1), y(x1) {}
|
Vec2(float x1) : x(x1), y(x1) {}
|
||||||
|
/**
|
||||||
|
* @brief Double constructor
|
||||||
|
* @param x1
|
||||||
|
* @param y1
|
||||||
|
*
|
||||||
|
* Initializes the vector with the specified values
|
||||||
|
*/
|
||||||
Vec2(float x1, float y1) : x(x1), y(y1) {}
|
Vec2(float x1, float y1) : x(x1), y(y1) {}
|
||||||
|
/**
|
||||||
|
* @brief Single constructor (double version)
|
||||||
|
* @param x1
|
||||||
|
*
|
||||||
|
* Double compatibility
|
||||||
|
*/
|
||||||
Vec2(double x1) : x((float)x1), y((float)x1) {}
|
Vec2(double x1) : x((float)x1), y((float)x1) {}
|
||||||
|
/**
|
||||||
|
* @brief Double constructor (double version)
|
||||||
|
* @param x1
|
||||||
|
* @param y1
|
||||||
|
*
|
||||||
|
* Double compatibility
|
||||||
|
*/
|
||||||
Vec2(double x1, double y1) : x((float)x1), y((float)y1) {}
|
Vec2(double x1, double y1) : x((float)x1), y((float)y1) {}
|
||||||
Vec2 operator+(const Vec2& rhs) const {
|
Vec2 operator+(const Vec2& rhs) const {
|
||||||
return Vec2(x + rhs.x, y + rhs.y);
|
return Vec2(x + rhs.x, y + rhs.y);
|
||||||
}
|
}
|
||||||
|
Vec2 operator-(const Vec2& rhs) const {
|
||||||
|
return Vec2(x - rhs.x, y - rhs.y);
|
||||||
|
}
|
||||||
Vec2 operator*(const float scalar) const {
|
Vec2 operator*(const float scalar) const {
|
||||||
return Vec2(x * scalar, y * scalar);
|
return Vec2(x * scalar, y * scalar);
|
||||||
}
|
}
|
||||||
|
Vec2 operator/(const Vec2& rhs) const {
|
||||||
|
return Vec2(x / rhs.x, y / rhs.y);
|
||||||
|
}
|
||||||
Vec2& operator+=(const Vec2& rhs) {
|
Vec2& operator+=(const Vec2& rhs) {
|
||||||
this->x += rhs.x;
|
this->x += rhs.x;
|
||||||
this->y += rhs.y;
|
this->y += rhs.y;
|
||||||
@ -61,23 +133,86 @@ std::exit(-1);}
|
|||||||
this->y -= rhs.y;
|
this->y -= rhs.y;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
Vec2& operator*=(const Vec2& rhs) {
|
||||||
|
this->x *= rhs.x;
|
||||||
|
this->y *= rhs.y;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Vec2& operator/=(const Vec2& rhs) {
|
||||||
|
this->x /= rhs.x;
|
||||||
|
this->y /= rhs.y;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
bool operator==(const Vec2& rhs) {
|
bool operator==(const Vec2& rhs) {
|
||||||
return this->x == rhs.x && this->y == rhs.y;
|
return this->x == rhs.x && this->y == rhs.y;
|
||||||
}
|
}
|
||||||
float x, y;
|
/**
|
||||||
|
* @brief X component
|
||||||
|
*/
|
||||||
|
float x;
|
||||||
|
/**
|
||||||
|
* @brief Y components
|
||||||
|
*/
|
||||||
|
float y;
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* @brief Three component vector
|
||||||
|
*
|
||||||
|
* Similar to Vec2 and Vec4
|
||||||
|
*
|
||||||
|
* Supports operators + - * / += -= *= /= ==
|
||||||
|
*/
|
||||||
struct Vec3 {
|
struct Vec3 {
|
||||||
Vec3() : x(0.0), y(0.0), z(0.0) {}
|
/**
|
||||||
|
* @brief Default constructor
|
||||||
|
*
|
||||||
|
* Initializes all components to 0.0f
|
||||||
|
*/
|
||||||
|
Vec3() : x(0.0f), y(0.0f), z(0.0f) {}
|
||||||
|
/**
|
||||||
|
* @brief Single constructor
|
||||||
|
* @param x1
|
||||||
|
*
|
||||||
|
* Sets all components to x1
|
||||||
|
*/
|
||||||
Vec3(float x1) : x(x1), y(x1), z(x1) {}
|
Vec3(float x1) : x(x1), y(x1), z(x1) {}
|
||||||
|
/**
|
||||||
|
* @brief Triple constructor
|
||||||
|
* @param x1
|
||||||
|
* @param y1
|
||||||
|
* @param z1
|
||||||
|
*
|
||||||
|
* Initializes the vector with the specified values
|
||||||
|
*/
|
||||||
Vec3(float x1, float y1, float z1) : x(x1), y(y1), z(z1) {}
|
Vec3(float x1, float y1, float z1) : x(x1), y(y1), z(z1) {}
|
||||||
|
/**
|
||||||
|
* @brief Single constructor (double version)
|
||||||
|
* @param x1
|
||||||
|
*
|
||||||
|
* Double compatibility
|
||||||
|
*/
|
||||||
Vec3(double x1) : x((float)x1), y((float)x1), z((float)x1) {}
|
Vec3(double x1) : x((float)x1), y((float)x1), z((float)x1) {}
|
||||||
|
/**
|
||||||
|
* @brief Triple constructor (double version)
|
||||||
|
* @param x1
|
||||||
|
* @param y1
|
||||||
|
* @param z1
|
||||||
|
*
|
||||||
|
* Double compatibility
|
||||||
|
*/
|
||||||
Vec3(double x1, double y1, double z1) : x((float)x1), y((float)y1), z((float)z1) {}
|
Vec3(double x1, double y1, double z1) : x((float)x1), y((float)y1), z((float)z1) {}
|
||||||
Vec3 operator+(const Vec3& rhs) const {
|
Vec3 operator+(const Vec3& rhs) const {
|
||||||
return Vec3(x + rhs.x, y + rhs.y, z + rhs.z);
|
return Vec3(x + rhs.x, y + rhs.y, z + rhs.z);
|
||||||
}
|
}
|
||||||
|
Vec3 operator-(const Vec3& rhs) const {
|
||||||
|
return Vec3(x - rhs.x, y - rhs.y, z - rhs.z);
|
||||||
|
}
|
||||||
Vec3 operator*(const float scalar) const {
|
Vec3 operator*(const float scalar) const {
|
||||||
return Vec3(x * scalar, y * scalar, z * scalar);
|
return Vec3(x * scalar, y * scalar, z * scalar);
|
||||||
}
|
}
|
||||||
|
Vec3 operator/(const Vec3& rhs) const {
|
||||||
|
return Vec3(x / rhs.x, y / rhs.y, z / rhs.z);
|
||||||
|
}
|
||||||
Vec3& operator+=(const Vec3& rhs) {
|
Vec3& operator+=(const Vec3& rhs) {
|
||||||
this->x += rhs.x;
|
this->x += rhs.x;
|
||||||
this->y += rhs.y;
|
this->y += rhs.y;
|
||||||
@ -90,23 +225,94 @@ std::exit(-1);}
|
|||||||
this->z -= rhs.z;
|
this->z -= rhs.z;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
Vec3& operator*=(const Vec3& rhs) {
|
||||||
|
this->x *= rhs.x;
|
||||||
|
this->y *= rhs.y;
|
||||||
|
this->z *= rhs.z;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Vec3& operator/=(const Vec3& rhs) {
|
||||||
|
this->x /= rhs.x;
|
||||||
|
this->y /= rhs.y;
|
||||||
|
this->z /= rhs.z;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
bool operator==(const Vec3& rhs) {
|
bool operator==(const Vec3& rhs) {
|
||||||
return this->x == rhs.x && this->y == rhs.y && this->z == rhs.z ;
|
return this->x == rhs.x && this->y == rhs.y && this->z == rhs.z ;
|
||||||
}
|
}
|
||||||
float x, y, z;
|
/**
|
||||||
|
* @brief X component
|
||||||
|
*/
|
||||||
|
float x;
|
||||||
|
/**
|
||||||
|
* @brief Y component
|
||||||
|
*/
|
||||||
|
float y;
|
||||||
|
/**
|
||||||
|
* @brief Z component
|
||||||
|
*/
|
||||||
|
float z;
|
||||||
};
|
};
|
||||||
|
/**
|
||||||
|
* @brief Four component vector
|
||||||
|
*
|
||||||
|
* Similar to Vec2 and Vec3
|
||||||
|
*
|
||||||
|
* Supports operators + - * / += -= *= /= ==
|
||||||
|
*/
|
||||||
struct Vec4 {
|
struct Vec4 {
|
||||||
Vec4() : x(0.0), y(0.0), z(0.0), w(0.0) {}
|
/**
|
||||||
|
* @brief Default constructor
|
||||||
|
*
|
||||||
|
* Initializes all components to 0.0f
|
||||||
|
*/
|
||||||
|
Vec4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f) {}
|
||||||
|
/**
|
||||||
|
* @brief Single constructor
|
||||||
|
* @param x1
|
||||||
|
*
|
||||||
|
* Sets all components to x1
|
||||||
|
*/
|
||||||
Vec4(float x1) : x(x1), y(x1), z(x1), w(x1) {}
|
Vec4(float x1) : x(x1), y(x1), z(x1), w(x1) {}
|
||||||
|
/**
|
||||||
|
* @brief Quadruple constructor
|
||||||
|
* @param x1
|
||||||
|
* @param y1
|
||||||
|
* @param z1
|
||||||
|
* @param w1
|
||||||
|
*
|
||||||
|
* Initializes the vector with the specified values
|
||||||
|
*/
|
||||||
Vec4(float x1, float y1, float z1, float w1) : x(x1), y(y1), z(z1), w(w1) {}
|
Vec4(float x1, float y1, float z1, float w1) : x(x1), y(y1), z(z1), w(w1) {}
|
||||||
|
/**
|
||||||
|
* @brief Single constructor (double version)
|
||||||
|
* @param x1
|
||||||
|
*
|
||||||
|
* Double compatibility
|
||||||
|
*/
|
||||||
Vec4(double x1) : x((float)x1), y((float)x1), z((float)x1), w((float)x1) {}
|
Vec4(double x1) : x((float)x1), y((float)x1), z((float)x1), w((float)x1) {}
|
||||||
|
/**
|
||||||
|
* @brief Quadruple constructor (double version)
|
||||||
|
* @param x1
|
||||||
|
* @param y1
|
||||||
|
* @param z1
|
||||||
|
* @param w1
|
||||||
|
*
|
||||||
|
* Double compatibility
|
||||||
|
*/
|
||||||
Vec4(double x1, double y1, double z1, double w1) : x((float)x1), y((float)y1), z((float)z1), w((float)w1) {}
|
Vec4(double x1, double y1, double z1, double w1) : x((float)x1), y((float)y1), z((float)z1), w((float)w1) {}
|
||||||
Vec4 operator+(const Vec4& rhs) const {
|
Vec4 operator+(const Vec4& rhs) const {
|
||||||
return Vec4(x + rhs.x, y + rhs.y, z + rhs.z, w + rhs.w);
|
return Vec4(x + rhs.x, y + rhs.y, z + rhs.z, w + rhs.w);
|
||||||
}
|
}
|
||||||
|
Vec4 operator-(const Vec4& rhs) const {
|
||||||
|
return Vec4(x - rhs.x, y - rhs.y, z - rhs.z, w - rhs.w);
|
||||||
|
}
|
||||||
Vec4 operator*(const float scalar) const {
|
Vec4 operator*(const float scalar) const {
|
||||||
return Vec4(x * scalar, y * scalar, z * scalar, w * scalar);
|
return Vec4(x * scalar, y * scalar, z * scalar, w * scalar);
|
||||||
}
|
}
|
||||||
|
Vec4 operator/(const Vec4& rhs) const {
|
||||||
|
return Vec4(x / rhs.x, y / rhs.y, z / rhs.z, w / rhs.w);
|
||||||
|
}
|
||||||
Vec4& operator+=(const Vec4& rhs) {
|
Vec4& operator+=(const Vec4& rhs) {
|
||||||
this->x += rhs.x;
|
this->x += rhs.x;
|
||||||
this->y += rhs.y;
|
this->y += rhs.y;
|
||||||
@ -121,10 +327,39 @@ std::exit(-1);}
|
|||||||
this->w -= rhs.w;
|
this->w -= rhs.w;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
Vec4& operator*=(const Vec4& rhs) {
|
||||||
|
this->x *= rhs.x;
|
||||||
|
this->y *= rhs.y;
|
||||||
|
this->z *= rhs.z;
|
||||||
|
this->w *= rhs.w;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
Vec4& operator/=(const Vec4& rhs) {
|
||||||
|
this->x /= rhs.x;
|
||||||
|
this->y /= rhs.y;
|
||||||
|
this->z /= rhs.z;
|
||||||
|
this->w /= rhs.w;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
bool operator==(const Vec4& rhs) {
|
bool operator==(const Vec4& rhs) {
|
||||||
return this->x == rhs.x && this->y == rhs.y && this->z == rhs.z && this->w == rhs.w;
|
return this->x == rhs.x && this->y == rhs.y && this->z == rhs.z && this->w == rhs.w;
|
||||||
}
|
}
|
||||||
float x, y, z, w;
|
/**
|
||||||
|
* @brief X component
|
||||||
|
*/
|
||||||
|
float x;
|
||||||
|
/**
|
||||||
|
* @brief Y component
|
||||||
|
*/
|
||||||
|
float y;
|
||||||
|
/**
|
||||||
|
* @brief Z component
|
||||||
|
*/
|
||||||
|
float z;
|
||||||
|
/**
|
||||||
|
* @brief W component
|
||||||
|
*/
|
||||||
|
float w;
|
||||||
};
|
};
|
||||||
|
|
||||||
const std::wstring toWide(const char* in);
|
const std::wstring toWide(const char* in);
|
||||||
@ -132,6 +367,26 @@ std::exit(-1);}
|
|||||||
|
|
||||||
Vec4 degToQuat(const Vec3& in);
|
Vec4 degToQuat(const Vec3& in);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Writes a stream of bytes as as std::string into a file in a specified location
|
||||||
|
* @param filename Path and name of file to be written, including extensions; Relative or absolute
|
||||||
|
* @param in Input std::string to be written
|
||||||
|
* @param encrypted Write the file encrypted?
|
||||||
|
*
|
||||||
|
* This function, as well as readFile, supports a basic and unsecure form of encryption.
|
||||||
|
* This is meant to discourage players from easily modifying stats, saves, etc.
|
||||||
|
*/
|
||||||
void writeFile(const std::string& filename, const std::string& in, bool encrypted = false);
|
void writeFile(const std::string& filename, const std::string& in, bool encrypted = false);
|
||||||
|
/**
|
||||||
|
* @brief Reads a file's bytes into an std::string
|
||||||
|
* @param filename Path and name of file to be read, including extensions; Relative or absolute
|
||||||
|
* @param compressed Internal use only as of now
|
||||||
|
* @return An std::string containing the specified file's bytes
|
||||||
|
*
|
||||||
|
* This function automatically detects whether or not the target file is encrypted
|
||||||
|
* and decrypts it if it is.
|
||||||
|
*
|
||||||
|
* @todo If files aren't found, the engine errors. Change this.
|
||||||
|
*/
|
||||||
std::string readFile(const std::string& filename, bool compressed = false);
|
std::string readFile(const std::string& filename, bool compressed = false);
|
||||||
}
|
}
|
346
docs/Doxyfile
Normal file
346
docs/Doxyfile
Normal file
@ -0,0 +1,346 @@
|
|||||||
|
# Doxyfile 1.9.2
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Project related configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
DOXYFILE_ENCODING = UTF-8
|
||||||
|
PROJECT_NAME = "Nothin' Fancy"
|
||||||
|
PROJECT_NUMBER = 0.1
|
||||||
|
PROJECT_BRIEF = "C++ 3D Game Engine"
|
||||||
|
PROJECT_LOGO = images/logo.png
|
||||||
|
OUTPUT_DIRECTORY = .
|
||||||
|
CREATE_SUBDIRS = NO
|
||||||
|
ALLOW_UNICODE_NAMES = NO
|
||||||
|
OUTPUT_LANGUAGE = English
|
||||||
|
BRIEF_MEMBER_DESC = YES
|
||||||
|
REPEAT_BRIEF = YES
|
||||||
|
ABBREVIATE_BRIEF = "The $name class" \
|
||||||
|
"The $name widget" \
|
||||||
|
"The $name file" \
|
||||||
|
is \
|
||||||
|
provides \
|
||||||
|
specifies \
|
||||||
|
contains \
|
||||||
|
represents \
|
||||||
|
a \
|
||||||
|
an \
|
||||||
|
the
|
||||||
|
ALWAYS_DETAILED_SEC = NO
|
||||||
|
INLINE_INHERITED_MEMB = NO
|
||||||
|
FULL_PATH_NAMES = NO
|
||||||
|
STRIP_FROM_PATH =
|
||||||
|
STRIP_FROM_INC_PATH =
|
||||||
|
SHORT_NAMES = NO
|
||||||
|
JAVADOC_AUTOBRIEF = NO
|
||||||
|
JAVADOC_BANNER = NO
|
||||||
|
QT_AUTOBRIEF = NO
|
||||||
|
MULTILINE_CPP_IS_BRIEF = NO
|
||||||
|
PYTHON_DOCSTRING = YES
|
||||||
|
INHERIT_DOCS = YES
|
||||||
|
SEPARATE_MEMBER_PAGES = NO
|
||||||
|
TAB_SIZE = 4
|
||||||
|
ALIASES =
|
||||||
|
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||||
|
OPTIMIZE_OUTPUT_JAVA = NO
|
||||||
|
OPTIMIZE_FOR_FORTRAN = NO
|
||||||
|
OPTIMIZE_OUTPUT_VHDL = NO
|
||||||
|
OPTIMIZE_OUTPUT_SLICE = NO
|
||||||
|
EXTENSION_MAPPING =
|
||||||
|
MARKDOWN_SUPPORT = YES
|
||||||
|
TOC_INCLUDE_HEADINGS = 5
|
||||||
|
AUTOLINK_SUPPORT = YES
|
||||||
|
BUILTIN_STL_SUPPORT = NO
|
||||||
|
CPP_CLI_SUPPORT = NO
|
||||||
|
SIP_SUPPORT = NO
|
||||||
|
IDL_PROPERTY_SUPPORT = YES
|
||||||
|
DISTRIBUTE_GROUP_DOC = NO
|
||||||
|
GROUP_NESTED_COMPOUNDS = NO
|
||||||
|
SUBGROUPING = YES
|
||||||
|
INLINE_GROUPED_CLASSES = NO
|
||||||
|
INLINE_SIMPLE_STRUCTS = NO
|
||||||
|
TYPEDEF_HIDES_STRUCT = NO
|
||||||
|
LOOKUP_CACHE_SIZE = 0
|
||||||
|
NUM_PROC_THREADS = 1
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Build related configuration options
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
EXTRACT_ALL = NO
|
||||||
|
EXTRACT_PRIVATE = NO
|
||||||
|
EXTRACT_PRIV_VIRTUAL = NO
|
||||||
|
EXTRACT_PACKAGE = NO
|
||||||
|
EXTRACT_STATIC = NO
|
||||||
|
EXTRACT_LOCAL_CLASSES = NO
|
||||||
|
EXTRACT_LOCAL_METHODS = NO
|
||||||
|
EXTRACT_ANON_NSPACES = NO
|
||||||
|
RESOLVE_UNNAMED_PARAMS = YES
|
||||||
|
HIDE_UNDOC_MEMBERS = YES
|
||||||
|
HIDE_UNDOC_CLASSES = YES
|
||||||
|
HIDE_FRIEND_COMPOUNDS = NO
|
||||||
|
HIDE_IN_BODY_DOCS = NO
|
||||||
|
INTERNAL_DOCS = NO
|
||||||
|
CASE_SENSE_NAMES = NO
|
||||||
|
HIDE_SCOPE_NAMES = NO
|
||||||
|
HIDE_COMPOUND_REFERENCE= NO
|
||||||
|
SHOW_HEADERFILE = YES
|
||||||
|
SHOW_INCLUDE_FILES = NO
|
||||||
|
SHOW_GROUPED_MEMB_INC = NO
|
||||||
|
FORCE_LOCAL_INCLUDES = NO
|
||||||
|
INLINE_INFO = YES
|
||||||
|
SORT_MEMBER_DOCS = NO
|
||||||
|
SORT_BRIEF_DOCS = NO
|
||||||
|
SORT_MEMBERS_CTORS_1ST = NO
|
||||||
|
SORT_GROUP_NAMES = NO
|
||||||
|
SORT_BY_SCOPE_NAME = NO
|
||||||
|
STRICT_PROTO_MATCHING = NO
|
||||||
|
GENERATE_TODOLIST = YES
|
||||||
|
GENERATE_TESTLIST = YES
|
||||||
|
GENERATE_BUGLIST = YES
|
||||||
|
GENERATE_DEPRECATEDLIST= YES
|
||||||
|
ENABLED_SECTIONS =
|
||||||
|
MAX_INITIALIZER_LINES = 30
|
||||||
|
SHOW_USED_FILES = YES
|
||||||
|
SHOW_FILES = YES
|
||||||
|
SHOW_NAMESPACES = YES
|
||||||
|
FILE_VERSION_FILTER =
|
||||||
|
LAYOUT_FILE = layout.xml
|
||||||
|
CITE_BIB_FILES =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to warning and progress messages
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
QUIET = NO
|
||||||
|
WARNINGS = YES
|
||||||
|
WARN_IF_UNDOCUMENTED = YES
|
||||||
|
WARN_IF_DOC_ERROR = YES
|
||||||
|
WARN_IF_INCOMPLETE_DOC = YES
|
||||||
|
WARN_NO_PARAMDOC = NO
|
||||||
|
WARN_AS_ERROR = NO
|
||||||
|
WARN_FORMAT = "$file:$line: $text"
|
||||||
|
WARN_LOGFILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the input files
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
INPUT = pages \
|
||||||
|
../NothinFancy/src/include
|
||||||
|
INPUT_ENCODING = UTF-8
|
||||||
|
FILE_PATTERNS = *.h \
|
||||||
|
*.md
|
||||||
|
RECURSIVE = YES
|
||||||
|
EXCLUDE = ../NothinFancy/src/include/IntroGamestate.h
|
||||||
|
EXCLUDE_SYMLINKS = NO
|
||||||
|
EXCLUDE_PATTERNS =
|
||||||
|
EXCLUDE_SYMBOLS =
|
||||||
|
EXAMPLE_PATH = examples
|
||||||
|
EXAMPLE_PATTERNS = *
|
||||||
|
EXAMPLE_RECURSIVE = NO
|
||||||
|
IMAGE_PATH = images
|
||||||
|
INPUT_FILTER =
|
||||||
|
FILTER_PATTERNS =
|
||||||
|
FILTER_SOURCE_FILES = NO
|
||||||
|
FILTER_SOURCE_PATTERNS =
|
||||||
|
USE_MDFILE_AS_MAINPAGE = main.md
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to source browsing
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
SOURCE_BROWSER = NO
|
||||||
|
INLINE_SOURCES = NO
|
||||||
|
STRIP_CODE_COMMENTS = YES
|
||||||
|
REFERENCED_BY_RELATION = NO
|
||||||
|
REFERENCES_RELATION = NO
|
||||||
|
REFERENCES_LINK_SOURCE = YES
|
||||||
|
SOURCE_TOOLTIPS = YES
|
||||||
|
USE_HTAGS = NO
|
||||||
|
VERBATIM_HEADERS = NO
|
||||||
|
CLANG_ASSISTED_PARSING = NO
|
||||||
|
CLANG_ADD_INC_PATHS = YES
|
||||||
|
CLANG_OPTIONS =
|
||||||
|
CLANG_DATABASE_PATH =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the alphabetical class index
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ALPHABETICAL_INDEX = NO
|
||||||
|
IGNORE_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the HTML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_HTML = YES
|
||||||
|
HTML_OUTPUT = manual
|
||||||
|
HTML_FILE_EXTENSION = .html
|
||||||
|
HTML_HEADER = header.html
|
||||||
|
HTML_FOOTER =
|
||||||
|
HTML_STYLESHEET =
|
||||||
|
HTML_EXTRA_STYLESHEET = theme.css
|
||||||
|
HTML_EXTRA_FILES = favicon.png
|
||||||
|
HTML_COLORSTYLE_HUE = 30
|
||||||
|
HTML_COLORSTYLE_SAT = 100
|
||||||
|
HTML_COLORSTYLE_GAMMA = 80
|
||||||
|
HTML_TIMESTAMP = NO
|
||||||
|
HTML_DYNAMIC_MENUS = YES
|
||||||
|
HTML_DYNAMIC_SECTIONS = NO
|
||||||
|
HTML_INDEX_NUM_ENTRIES = 100
|
||||||
|
GENERATE_DOCSET = NO
|
||||||
|
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||||
|
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||||
|
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
||||||
|
DOCSET_PUBLISHER_NAME = Publisher
|
||||||
|
GENERATE_HTMLHELP = NO
|
||||||
|
CHM_FILE =
|
||||||
|
HHC_LOCATION =
|
||||||
|
GENERATE_CHI = NO
|
||||||
|
CHM_INDEX_ENCODING =
|
||||||
|
BINARY_TOC = NO
|
||||||
|
TOC_EXPAND = NO
|
||||||
|
GENERATE_QHP = NO
|
||||||
|
QCH_FILE =
|
||||||
|
QHP_NAMESPACE = org.doxygen.Project
|
||||||
|
QHP_VIRTUAL_FOLDER = doc
|
||||||
|
QHP_CUST_FILTER_NAME =
|
||||||
|
QHP_CUST_FILTER_ATTRS =
|
||||||
|
QHP_SECT_FILTER_ATTRS =
|
||||||
|
QHG_LOCATION =
|
||||||
|
GENERATE_ECLIPSEHELP = NO
|
||||||
|
ECLIPSE_DOC_ID = org.doxygen.Project
|
||||||
|
DISABLE_INDEX = NO
|
||||||
|
GENERATE_TREEVIEW = YES
|
||||||
|
FULL_SIDEBAR = NO
|
||||||
|
ENUM_VALUES_PER_LINE = 4
|
||||||
|
TREEVIEW_WIDTH = 250
|
||||||
|
EXT_LINKS_IN_WINDOW = NO
|
||||||
|
HTML_FORMULA_FORMAT = png
|
||||||
|
FORMULA_FONTSIZE = 10
|
||||||
|
FORMULA_TRANSPARENT = YES
|
||||||
|
FORMULA_MACROFILE =
|
||||||
|
USE_MATHJAX = NO
|
||||||
|
MATHJAX_VERSION = MathJax_2
|
||||||
|
MATHJAX_FORMAT = HTML-CSS
|
||||||
|
MATHJAX_RELPATH =
|
||||||
|
MATHJAX_EXTENSIONS =
|
||||||
|
MATHJAX_CODEFILE =
|
||||||
|
SEARCHENGINE = YES
|
||||||
|
SERVER_BASED_SEARCH = NO
|
||||||
|
EXTERNAL_SEARCH = NO
|
||||||
|
SEARCHENGINE_URL =
|
||||||
|
SEARCHDATA_FILE = searchdata.xml
|
||||||
|
EXTERNAL_SEARCH_ID =
|
||||||
|
EXTRA_SEARCH_MAPPINGS =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the LaTeX output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_LATEX = NO
|
||||||
|
LATEX_OUTPUT = latex
|
||||||
|
LATEX_CMD_NAME =
|
||||||
|
MAKEINDEX_CMD_NAME = makeindex
|
||||||
|
LATEX_MAKEINDEX_CMD = makeindex
|
||||||
|
COMPACT_LATEX = NO
|
||||||
|
PAPER_TYPE = a4
|
||||||
|
EXTRA_PACKAGES =
|
||||||
|
LATEX_HEADER =
|
||||||
|
LATEX_FOOTER =
|
||||||
|
LATEX_EXTRA_STYLESHEET =
|
||||||
|
LATEX_EXTRA_FILES =
|
||||||
|
PDF_HYPERLINKS = YES
|
||||||
|
USE_PDFLATEX = YES
|
||||||
|
LATEX_BATCHMODE = NO
|
||||||
|
LATEX_HIDE_INDICES = NO
|
||||||
|
LATEX_BIB_STYLE = plain
|
||||||
|
LATEX_TIMESTAMP = NO
|
||||||
|
LATEX_EMOJI_DIRECTORY =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the RTF output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_RTF = NO
|
||||||
|
RTF_OUTPUT = rtf
|
||||||
|
COMPACT_RTF = NO
|
||||||
|
RTF_HYPERLINKS = NO
|
||||||
|
RTF_STYLESHEET_FILE =
|
||||||
|
RTF_EXTENSIONS_FILE =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the man page output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_MAN = NO
|
||||||
|
MAN_OUTPUT = man
|
||||||
|
MAN_EXTENSION = .3
|
||||||
|
MAN_SUBDIR =
|
||||||
|
MAN_LINKS = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the XML output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_XML = NO
|
||||||
|
XML_OUTPUT = xml
|
||||||
|
XML_PROGRAMLISTING = YES
|
||||||
|
XML_NS_MEMB_FILE_SCOPE = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the DOCBOOK output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_DOCBOOK = NO
|
||||||
|
DOCBOOK_OUTPUT = docbook
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options for the AutoGen Definitions output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_AUTOGEN_DEF = NO
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the Perl module output
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
GENERATE_PERLMOD = NO
|
||||||
|
PERLMOD_LATEX = NO
|
||||||
|
PERLMOD_PRETTY = YES
|
||||||
|
PERLMOD_MAKEVAR_PREFIX =
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the preprocessor
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
ENABLE_PREPROCESSING = YES
|
||||||
|
MACRO_EXPANSION = NO
|
||||||
|
EXPAND_ONLY_PREDEF = NO
|
||||||
|
SEARCH_INCLUDES = YES
|
||||||
|
INCLUDE_PATH =
|
||||||
|
INCLUDE_FILE_PATTERNS =
|
||||||
|
PREDEFINED = doxygen
|
||||||
|
EXPAND_AS_DEFINED =
|
||||||
|
SKIP_FUNCTION_MACROS = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to external references
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
TAGFILES =
|
||||||
|
GENERATE_TAGFILE =
|
||||||
|
ALLEXTERNALS = NO
|
||||||
|
EXTERNAL_GROUPS = YES
|
||||||
|
EXTERNAL_PAGES = YES
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
# Configuration options related to the dot tool
|
||||||
|
#---------------------------------------------------------------------------
|
||||||
|
CLASS_DIAGRAMS = YES
|
||||||
|
DIA_PATH =
|
||||||
|
HIDE_UNDOC_RELATIONS = YES
|
||||||
|
HAVE_DOT = NO
|
||||||
|
DOT_NUM_THREADS = 0
|
||||||
|
DOT_FONTNAME = Helvetica
|
||||||
|
DOT_FONTSIZE = 10
|
||||||
|
DOT_FONTPATH =
|
||||||
|
CLASS_GRAPH = YES
|
||||||
|
COLLABORATION_GRAPH = YES
|
||||||
|
GROUP_GRAPHS = YES
|
||||||
|
UML_LOOK = NO
|
||||||
|
UML_LIMIT_NUM_FIELDS = 10
|
||||||
|
DOT_UML_DETAILS = NO
|
||||||
|
DOT_WRAP_THRESHOLD = 17
|
||||||
|
TEMPLATE_RELATIONS = NO
|
||||||
|
INCLUDE_GRAPH = YES
|
||||||
|
INCLUDED_BY_GRAPH = YES
|
||||||
|
CALL_GRAPH = NO
|
||||||
|
CALLER_GRAPH = NO
|
||||||
|
GRAPHICAL_HIERARCHY = YES
|
||||||
|
DIRECTORY_GRAPH = YES
|
||||||
|
DOT_IMAGE_FORMAT = png
|
||||||
|
INTERACTIVE_SVG = NO
|
||||||
|
DOT_PATH =
|
||||||
|
DOTFILE_DIRS =
|
||||||
|
MSCFILE_DIRS =
|
||||||
|
DIAFILE_DIRS =
|
||||||
|
PLANTUML_JAR_PATH =
|
||||||
|
PLANTUML_CFG_FILE =
|
||||||
|
PLANTUML_INCLUDE_PATH =
|
||||||
|
DOT_GRAPH_MAX_NODES = 50
|
||||||
|
MAX_DOT_GRAPH_DEPTH = 0
|
||||||
|
DOT_TRANSPARENT = NO
|
||||||
|
DOT_MULTI_TARGETS = NO
|
||||||
|
GENERATE_LEGEND = YES
|
||||||
|
DOT_CLEANUP = YES
|
BIN
docs/favicon.png
Normal file
BIN
docs/favicon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
74
docs/header.html
Normal file
74
docs/header.html
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<!-- HTML header for doxygen 1.9.2-->
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<link rel="shortcut icon" type="image/png" href="$relpath^favicon.png"/>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||||||
|
<meta name="generator" content="Doxygen $doxygenversion"/>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||||
|
<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
|
||||||
|
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN FULL_SIDEBAR-->
|
||||||
|
<script type="text/javascript">var page_layout=1;</script>
|
||||||
|
<!--END FULL_SIDEBAR-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
<script type="text/javascript" src="$relpath^jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="$relpath^dynsections.js"></script>
|
||||||
|
$treeview
|
||||||
|
$search
|
||||||
|
$mathjax
|
||||||
|
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
|
||||||
|
$extrastylesheet
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN FULL_SIDEBAR-->
|
||||||
|
<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
<!--END FULL_SIDEBAR-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
|
||||||
|
<!--BEGIN TITLEAREA-->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 56px;">
|
||||||
|
<!--BEGIN PROJECT_LOGO-->
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
|
||||||
|
<!--END PROJECT_LOGO-->
|
||||||
|
<!--BEGIN PROJECT_NAME-->
|
||||||
|
<td id="projectalign" style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname">$projectname<!--BEGIN PROJECT_NUMBER--><span id="projectnumber"> $projectnumber</span><!--END PROJECT_NUMBER-->
|
||||||
|
</div>
|
||||||
|
<!--BEGIN PROJECT_BRIEF--><div id="projectbrief">$projectbrief</div><!--END PROJECT_BRIEF-->
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_NAME-->
|
||||||
|
<!--BEGIN !PROJECT_NAME-->
|
||||||
|
<!--BEGIN PROJECT_BRIEF-->
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectbrief">$projectbrief</div>
|
||||||
|
</td>
|
||||||
|
<!--END PROJECT_BRIEF-->
|
||||||
|
<!--END !PROJECT_NAME-->
|
||||||
|
<!--BEGIN DISABLE_INDEX-->
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<!--BEGIN !FULL_SIDEBAR-->
|
||||||
|
<td>$searchbox</td>
|
||||||
|
<!--END !FULL_SIDEBAR-->
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
<!--END DISABLE_INDEX-->
|
||||||
|
</tr>
|
||||||
|
<!--BEGIN SEARCHENGINE-->
|
||||||
|
<!--BEGIN FULL_SIDEBAR-->
|
||||||
|
<tr><td colspan="2">$searchbox</td></tr>
|
||||||
|
<!--END FULL_SIDEBAR-->
|
||||||
|
<!--END SEARCHENGINE-->
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!--END TITLEAREA-->
|
||||||
|
<!-- end header part -->
|
BIN
docs/images/logo.png
Normal file
BIN
docs/images/logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
BIN
docs/images/logofull.png
Normal file
BIN
docs/images/logofull.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 937 KiB |
240
docs/layout.xml
Normal file
240
docs/layout.xml
Normal file
@ -0,0 +1,240 @@
|
|||||||
|
<doxygenlayout version="1.0">
|
||||||
|
<!-- Generated by doxygen 1.9.2 -->
|
||||||
|
<!-- Navigation index tabs for HTML output -->
|
||||||
|
<navindex>
|
||||||
|
<tab type="mainpage" visible="yes" title=""/>
|
||||||
|
<tab type="pages" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="modules" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="namespaces" visible="yes" title="API">
|
||||||
|
<tab type="namespacelist" visible="yes" title="Class List" intro="Here, you can find a list of every useful class to use in NF."/>
|
||||||
|
<tab type="namespacemembers" visible="no" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="concepts" visible="yes" title="">
|
||||||
|
</tab>
|
||||||
|
<tab type="interfaces" visible="yes" title="">
|
||||||
|
<tab type="interfacelist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="interfaceindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="interfacehierarchy" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="classes" visible="no" title="API">
|
||||||
|
<tab type="classlist" visible="no" title="Classes" intro=""/>
|
||||||
|
<tab type="classindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="hierarchy" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="classmembers" visible="no" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="structs" visible="yes" title="">
|
||||||
|
<tab type="structlist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="structindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="exceptions" visible="yes" title="">
|
||||||
|
<tab type="exceptionlist" visible="yes" title="" intro=""/>
|
||||||
|
<tab type="exceptionindex" visible="$ALPHABETICAL_INDEX" title=""/>
|
||||||
|
<tab type="exceptionhierarchy" visible="yes" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="files" visible="no" title="">
|
||||||
|
<tab type="filelist" visible="no" title="" intro=""/>
|
||||||
|
<tab type="globals" visible="no" title="" intro=""/>
|
||||||
|
</tab>
|
||||||
|
<tab type="examples" visible="yes" title="" intro=""/>
|
||||||
|
</navindex>
|
||||||
|
|
||||||
|
<!-- Layout definition for a class page -->
|
||||||
|
<class>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_HEADERFILE"/>
|
||||||
|
<inheritancegraph visible="$CLASS_GRAPH"/>
|
||||||
|
<collaborationgraph visible="$COLLABORATION_GRAPH"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestedclasses visible="yes" title=""/>
|
||||||
|
<publictypes title=""/>
|
||||||
|
<services title=""/>
|
||||||
|
<interfaces title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicmethods title=""/>
|
||||||
|
<publicstaticmethods title=""/>
|
||||||
|
<publicattributes title=""/>
|
||||||
|
<publicstaticattributes title=""/>
|
||||||
|
<protectedtypes title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<protectedmethods title=""/>
|
||||||
|
<protectedstaticmethods title=""/>
|
||||||
|
<protectedattributes title=""/>
|
||||||
|
<protectedstaticattributes title=""/>
|
||||||
|
<packagetypes title=""/>
|
||||||
|
<packagemethods title=""/>
|
||||||
|
<packagestaticmethods title=""/>
|
||||||
|
<packageattributes title=""/>
|
||||||
|
<packagestaticattributes title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<privatetypes title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<privatemethods title=""/>
|
||||||
|
<privatestaticmethods title=""/>
|
||||||
|
<privateattributes title=""/>
|
||||||
|
<privatestaticattributes title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
<related title="" subtitle=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<services title=""/>
|
||||||
|
<interfaces title=""/>
|
||||||
|
<constructors title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<related title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<allmemberslink visible="yes"/>
|
||||||
|
<usedfiles visible="$SHOW_USED_FILES"/>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</class>
|
||||||
|
|
||||||
|
<!-- Layout definition for a namespace page -->
|
||||||
|
<namespace>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestednamespaces visible="yes" title=""/>
|
||||||
|
<constantgroups visible="yes" title=""/>
|
||||||
|
<interfaces visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<concepts visible="yes" title=""/>
|
||||||
|
<structs visible="yes" title=""/>
|
||||||
|
<exceptions visible="yes" title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<sequences title=""/>
|
||||||
|
<dictionaries title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<sequences title=""/>
|
||||||
|
<dictionaries title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</namespace>
|
||||||
|
|
||||||
|
<!-- Layout definition for a concept page -->
|
||||||
|
<concept>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_HEADERFILE"/>
|
||||||
|
<definition visible="yes" title=""/>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</concept>
|
||||||
|
|
||||||
|
<!-- Layout definition for a file page -->
|
||||||
|
<file>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<includes visible="$SHOW_INCLUDE_FILES"/>
|
||||||
|
<includegraph visible="$INCLUDE_GRAPH"/>
|
||||||
|
<includedbygraph visible="$INCLUDED_BY_GRAPH"/>
|
||||||
|
<sourcelink visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<interfaces visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<structs visible="yes" title=""/>
|
||||||
|
<exceptions visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
|
<concepts visible="yes" title=""/>
|
||||||
|
<constantgroups visible="yes" title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<sequences title=""/>
|
||||||
|
<dictionaries title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<sequences title=""/>
|
||||||
|
<dictionaries title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection/>
|
||||||
|
</file>
|
||||||
|
|
||||||
|
<!-- Layout definition for a group page -->
|
||||||
|
<group>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<groupgraph visible="$GROUP_GRAPHS"/>
|
||||||
|
<memberdecl>
|
||||||
|
<nestedgroups visible="yes" title=""/>
|
||||||
|
<dirs visible="yes" title=""/>
|
||||||
|
<files visible="yes" title=""/>
|
||||||
|
<namespaces visible="yes" title=""/>
|
||||||
|
<concepts visible="yes" title=""/>
|
||||||
|
<classes visible="yes" title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<sequences title=""/>
|
||||||
|
<dictionaries title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<enumvalues title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
<membergroups visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
<memberdef>
|
||||||
|
<pagedocs/>
|
||||||
|
<inlineclasses title=""/>
|
||||||
|
<defines title=""/>
|
||||||
|
<typedefs title=""/>
|
||||||
|
<sequences title=""/>
|
||||||
|
<dictionaries title=""/>
|
||||||
|
<enums title=""/>
|
||||||
|
<enumvalues title=""/>
|
||||||
|
<functions title=""/>
|
||||||
|
<variables title=""/>
|
||||||
|
<signals title=""/>
|
||||||
|
<publicslots title=""/>
|
||||||
|
<protectedslots title=""/>
|
||||||
|
<privateslots title=""/>
|
||||||
|
<events title=""/>
|
||||||
|
<properties title=""/>
|
||||||
|
<friends title=""/>
|
||||||
|
</memberdef>
|
||||||
|
<authorsection visible="yes"/>
|
||||||
|
</group>
|
||||||
|
|
||||||
|
<!-- Layout definition for a directory page -->
|
||||||
|
<directory>
|
||||||
|
<briefdescription visible="yes"/>
|
||||||
|
<directorygraph visible="yes"/>
|
||||||
|
<memberdecl>
|
||||||
|
<dirs visible="yes"/>
|
||||||
|
<files visible="yes"/>
|
||||||
|
</memberdecl>
|
||||||
|
<detaileddescription title=""/>
|
||||||
|
</directory>
|
||||||
|
</doxygenlayout>
|
19
docs/pages/1_install.md
Normal file
19
docs/pages/1_install.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
@page install Installation
|
||||||
|
@tableofcontents
|
||||||
|
|
||||||
|
This page details how to install NF in a MSVC project.
|
||||||
|
|
||||||
|
@section prereq Prerequisites
|
||||||
|
|
||||||
|
In order to create an NF application, you must first have the following:
|
||||||
|
|
||||||
|
- Visual Studio 2022 or later (MSVC v143 or later)
|
||||||
|
- A 64 bit computer as NF is 64 bit only
|
||||||
|
- A compatible graphics card (See @ref issues)
|
||||||
|
- Apt C++ knowledge
|
||||||
|
- The engine itself
|
||||||
|
@todo Link download here?
|
||||||
|
|
||||||
|
@section projSetup Step One: Project Setup
|
||||||
|
|
||||||
|
@note kdlsjfldksjf
|
21
docs/pages/2_tutorial.md
Normal file
21
docs/pages/2_tutorial.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
@page tutorial Tutorial
|
||||||
|
@tableofcontents
|
||||||
|
|
||||||
|
This tutorial aims to teach the basics of the engine and how to use it.
|
||||||
|
|
||||||
|
First, follow the steps on the @ref install page. Once NF has been installed into a new
|
||||||
|
MSVC project in Visual Studio, you can begin here.
|
||||||
|
|
||||||
|
@section createConfig Creating a Config
|
||||||
|
|
||||||
|
@todo The tutorial page
|
||||||
|
|
||||||
|
@section createUI Creating a UI
|
||||||
|
|
||||||
|
@section createCubemap Adding a Cubemap (Skybox)
|
||||||
|
|
||||||
|
@todo Lighting page?
|
||||||
|
|
||||||
|
@image html logofull.png "NF Logo" width=200px
|
||||||
|
|
||||||
|
Really cool
|
8
docs/pages/3_gamestates.md
Normal file
8
docs/pages/3_gamestates.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
@page gamestates Gamestate System
|
||||||
|
@tableofcontents
|
||||||
|
|
||||||
|
@todo The gamestates page
|
||||||
|
|
||||||
|
@section enterAndExit onEnter and onExit
|
||||||
|
|
||||||
|
@section obLifetime Object Lifetime
|
13
docs/pages/4_assets.md
Normal file
13
docs/pages/4_assets.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
@page assets Asset System
|
||||||
|
|
||||||
|
This page details NF's asset system and custom pack format.
|
||||||
|
|
||||||
|
@section buildAssets How to Build Your Assets
|
||||||
|
|
||||||
|
@todo Asset system page
|
||||||
|
|
||||||
|
@section customFonts Custom Font Assets
|
||||||
|
|
||||||
|
@section customButtons Custom Button Assets
|
||||||
|
|
||||||
|
@section customCubemap Custom Cubemap Assets
|
6
docs/pages/5_issues.md
Normal file
6
docs/pages/5_issues.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@page issues Known Issues
|
||||||
|
|
||||||
|
This page includes the known issues of the engine in order of importance.
|
||||||
|
|
||||||
|
1. Shader compilation errors
|
||||||
|
- This issue is caused by differences in graphics drivers and what exact OpenGL shader code they will compile. **This issue will be attended to soon.**
|
35
docs/pages/main.md
Normal file
35
docs/pages/main.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
@tableofcontents
|
||||||
|
|
||||||
|
Nothin' Fancy (abbreviated as NF) is an experimental 3D game engine written in C++
|
||||||
|
for Windows. It was created by Grayson Riffe in 2021. This manual aims to aid the end-user
|
||||||
|
with using this engine to create games and visualizations. It contains a user guide and
|
||||||
|
the API reference.
|
||||||
|
|
||||||
|
@image html logofull.png "Engine Logo" width=200px
|
||||||
|
|
||||||
|
Features
|
||||||
|
===
|
||||||
|
|
||||||
|
In its current form, NF is always changing and evolving, so some of these features could change
|
||||||
|
at any time.
|
||||||
|
|
||||||
|
- @ref gamestates
|
||||||
|
- @ref assets
|
||||||
|
- Easy-to-use input
|
||||||
|
- Deffered renderer
|
||||||
|
- Materials system
|
||||||
|
- Color, specular, and normal texture support
|
||||||
|
- Cubemap support
|
||||||
|
- 3D sound support
|
||||||
|
- Rigid body physics
|
||||||
|
- Customizable UI
|
||||||
|
- Text
|
||||||
|
- Textures
|
||||||
|
- Buttons also with customizable textures
|
||||||
|
|
||||||
|
Example App
|
||||||
|
===
|
||||||
|
|
||||||
|
You can download the source or build for the example game that includes all of the
|
||||||
|
aforementioned features.
|
||||||
|
@todo Example App download
|
1827
docs/theme.css
Normal file
1827
docs/theme.css
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user