From e849aebc4e4127852b2cfbbaa8572e748cd95f89 Mon Sep 17 00:00:00 2001 From: axelpicou <115532798+axelpicou@users.noreply.github.com> Date: Wed, 20 Mar 2024 11:29:30 +0100 Subject: [PATCH] true architecture --- Resource.h | 30 -- enginecustom.sln | 31 ++ enginecustom/Main.cpp | 26 ++ enginecustom/Systemclass.cpp | 290 ++++++++++++++++ enginecustom/applicationclass.cpp | 44 +++ enginecustom/applicationclass.h | 37 +++ .../enginecustom.vcxproj | 31 +- .../enginecustom.vcxproj.filters | 45 ++- enginecustom/inputclass.cpp | 54 +++ enginecustom/inputclass.h | 26 ++ enginecustom/systemclass.h | 49 +++ framework.h | 15 - khaotic-engine.cpp | 309 ------------------ khaotic-engine.h | 3 - khaotic-engine.ico | Bin 46227 -> 0 bytes khaotic-engine.rc | Bin 7114 -> 0 bytes khaotic-engine.sln | 31 -- small.ico | Bin 46227 -> 0 bytes targetver.h | 6 - 19 files changed, 589 insertions(+), 438 deletions(-) delete mode 100644 Resource.h create mode 100644 enginecustom.sln create mode 100644 enginecustom/Main.cpp create mode 100644 enginecustom/Systemclass.cpp create mode 100644 enginecustom/applicationclass.cpp create mode 100644 enginecustom/applicationclass.h rename khaotic-engine.vcxproj => enginecustom/enginecustom.vcxproj (92%) rename khaotic-engine.vcxproj.filters => enginecustom/enginecustom.vcxproj.filters (64%) create mode 100644 enginecustom/inputclass.cpp create mode 100644 enginecustom/inputclass.h create mode 100644 enginecustom/systemclass.h delete mode 100644 framework.h delete mode 100644 khaotic-engine.cpp delete mode 100644 khaotic-engine.h delete mode 100644 khaotic-engine.ico delete mode 100644 khaotic-engine.rc delete mode 100644 khaotic-engine.sln delete mode 100644 small.ico delete mode 100644 targetver.h diff --git a/Resource.h b/Resource.h deleted file mode 100644 index a99901c..0000000 --- a/Resource.h +++ /dev/null @@ -1,30 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Fichier Include généré par Microsoft Visual C++. -// Utilisé par khaotic-engine.rc - -#define IDS_APP_TITLE 103 - -#define IDR_MAINFRAME 128 -#define IDD_KHAOTICENGINE_DIALOG 102 -#define IDD_ABOUTBOX 103 -#define IDM_ABOUT 104 -#define IDM_EXIT 105 -#define IDI_KHAOTICENGINE 107 -#define IDI_SMALL 108 -#define IDC_KHAOTICENGINE 109 -#define IDC_MYICON 2 -#ifndef IDC_STATIC -#define IDC_STATIC -1 -#endif -// Valeurs par défaut suivantes des nouveaux objets -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS - -#define _APS_NO_MFC 130 -#define _APS_NEXT_RESOURCE_VALUE 129 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1000 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/enginecustom.sln b/enginecustom.sln new file mode 100644 index 0000000..1ae2734 --- /dev/null +++ b/enginecustom.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34607.119 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "enginecustom", "enginecustom\enginecustom.vcxproj", "{92CF56C4-76BB-40D4-8FE5-36C15F5F127A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Debug|x64.ActiveCfg = Debug|x64 + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Debug|x64.Build.0 = Debug|x64 + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Debug|x86.ActiveCfg = Debug|Win32 + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Debug|x86.Build.0 = Debug|Win32 + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Release|x64.ActiveCfg = Release|x64 + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Release|x64.Build.0 = Release|x64 + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Release|x86.ActiveCfg = Release|Win32 + {92CF56C4-76BB-40D4-8FE5-36C15F5F127A}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1EF23231-6B54-4B81-9818-BF931C50AA46} + EndGlobalSection +EndGlobal diff --git a/enginecustom/Main.cpp b/enginecustom/Main.cpp new file mode 100644 index 0000000..1ea2604 --- /dev/null +++ b/enginecustom/Main.cpp @@ -0,0 +1,26 @@ +#include "systemclass.h" + + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pScmdline, int iCmdshow) +{ + SystemClass* System; + bool result; + + + // Create the system object. + System = new SystemClass; + + // Initialize and run the system object. + result = System->Initialize(); + if (result) + { + System->Run(); + } + + // Shutdown and release the system object. + System->Shutdown(); + delete System; + System = 0; + + return 0; +} \ No newline at end of file diff --git a/enginecustom/Systemclass.cpp b/enginecustom/Systemclass.cpp new file mode 100644 index 0000000..2f0b18e --- /dev/null +++ b/enginecustom/Systemclass.cpp @@ -0,0 +1,290 @@ +#include "systemclass.h" + +SystemClass::SystemClass() +{ + m_Input = 0; + m_Application = 0; +} + +SystemClass::SystemClass(const SystemClass& other) +{ +} + + +SystemClass::~SystemClass() +{ +} + +bool SystemClass::Initialize() +{ + int screenWidth, screenHeight; + bool result; + + + // Initialize the width and height of the screen to zero before sending the variables into the function. + screenWidth = 0; + screenHeight = 0; + + // Initialize the windows api. + InitializeWindows(screenWidth, screenHeight); + + // Create and initialize the input object. This object will be used to handle reading the keyboard input from the user. + m_Input = new InputClass; + + m_Input->Initialize(); + + // Create and initialize the application class object. This object will handle rendering all the graphics for this application. + m_Application = new ApplicationClass; + + result = m_Application->Initialize(screenWidth, screenHeight, m_hwnd); + if (!result) + { + return false; + } + + return true; +} + +void SystemClass::Shutdown() +{ + // Release the application class object. + if (m_Application) + { + m_Application->Shutdown(); + delete m_Application; + m_Application = 0; + } + + // Release the input object. + if (m_Input) + { + delete m_Input; + m_Input = 0; + } + + // Shutdown the window. + ShutdownWindows(); + + return; +} + +void SystemClass::Run() +{ + MSG msg; + bool done, result; + + + // Initialize the message structure. + ZeroMemory(&msg, sizeof(MSG)); + + // Loop until there is a quit message from the window or the user. + done = false; + while (!done) + { + // Handle the windows messages. + if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + // If windows signals to end the application then exit out. + if (msg.message == WM_QUIT) + { + done = true; + } + else + { + // Otherwise do the frame processing. + result = Frame(); + if (!result) + { + done = true; + } + } + + } + + return; +} + +bool SystemClass::Frame() +{ + bool result; + + + // Check if the user pressed escape and wants to exit the application. + if (m_Input->IsKeyDown(VK_ESCAPE)) + { + return false; + } + + // Do the frame processing for the application class object. + result = m_Application->Frame(); + if (!result) + { + return false; + } + + return true; +} + +LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) +{ + switch (umsg) + { + // Check if a key has been pressed on the keyboard. + case WM_KEYDOWN: + { + // If a key is pressed send it to the input object so it can record that state. + m_Input->KeyDown((unsigned int)wparam); + return 0; + } + + // Check if a key has been released on the keyboard. + case WM_KEYUP: + { + // If a key is released then send it to the input object so it can unset the state for that key. + m_Input->KeyUp((unsigned int)wparam); + return 0; + } + + // Any other messages send to the default message handler as our application won't make use of them. + default: + { + return DefWindowProc(hwnd, umsg, wparam, lparam); + } + } +} + +void SystemClass::InitializeWindows(int& screenWidth, int& screenHeight) +{ + WNDCLASSEX wc; + DEVMODE dmScreenSettings; + int posX, posY; + + + // Get an external pointer to this object. + ApplicationHandle = this; + + // Get the instance of this application. + m_hinstance = GetModuleHandle(NULL); + + // Give the application a name. + m_applicationName = L"Engine"; + + // Setup the windows class with default settings. + wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wc.lpfnWndProc = WndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = m_hinstance; + wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); + wc.hIconSm = wc.hIcon; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + wc.lpszMenuName = NULL; + wc.lpszClassName = m_applicationName; + wc.cbSize = sizeof(WNDCLASSEX); + + // Register the window class. + RegisterClassEx(&wc); + + // Determine the resolution of the clients desktop screen. + screenWidth = GetSystemMetrics(SM_CXSCREEN); + screenHeight = GetSystemMetrics(SM_CYSCREEN); + + // Setup the screen settings depending on whether it is running in full screen or in windowed mode. + if (FULL_SCREEN) + { + // If full screen set the screen to maximum size of the users desktop and 32bit. + memset(&dmScreenSettings, 0, sizeof(dmScreenSettings)); + dmScreenSettings.dmSize = sizeof(dmScreenSettings); + dmScreenSettings.dmPelsWidth = (unsigned long)screenWidth; + dmScreenSettings.dmPelsHeight = (unsigned long)screenHeight; + dmScreenSettings.dmBitsPerPel = 32; + dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; + + // Change the display settings to full screen. + ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN); + + // Set the position of the window to the top left corner. + posX = posY = 0; + } + else + { + // If windowed then set it to 800x600 resolution. + screenWidth = 800; + screenHeight = 600; + + // Place the window in the middle of the screen. + posX = (GetSystemMetrics(SM_CXSCREEN) - screenWidth) / 2; + posY = (GetSystemMetrics(SM_CYSCREEN) - screenHeight) / 2; + } + + // Create the window with the screen settings and get the handle to it. + m_hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_applicationName, m_applicationName, + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP, + posX, posY, screenWidth, screenHeight, NULL, NULL, m_hinstance, NULL); + + // Bring the window up on the screen and set it as main focus. + ShowWindow(m_hwnd, SW_SHOW); + SetForegroundWindow(m_hwnd); + SetFocus(m_hwnd); + + // Hide the mouse cursor. + ShowCursor(false); + + return; +} + +void SystemClass::ShutdownWindows() +{ + // Show the mouse cursor. + ShowCursor(true); + + // Fix the display settings if leaving full screen mode. + if (FULL_SCREEN) + { + ChangeDisplaySettings(NULL, 0); + } + + // Remove the window. + DestroyWindow(m_hwnd); + m_hwnd = NULL; + + // Remove the application instance. + UnregisterClass(m_applicationName, m_hinstance); + m_hinstance = NULL; + + // Release the pointer to this class. + ApplicationHandle = NULL; + + return; +} + +LRESULT CALLBACK WndProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam) +{ + switch (umessage) + { + // Check if the window is being destroyed. + case WM_DESTROY: + { + PostQuitMessage(0); + return 0; + } + + // Check if the window is being closed. + case WM_CLOSE: + { + PostQuitMessage(0); + return 0; + } + + // All other messages pass to the message handler in the system class. + default: + { + return ApplicationHandle->MessageHandler(hwnd, umessage, wparam, lparam); + } + } +} diff --git a/enginecustom/applicationclass.cpp b/enginecustom/applicationclass.cpp new file mode 100644 index 0000000..2e18374 --- /dev/null +++ b/enginecustom/applicationclass.cpp @@ -0,0 +1,44 @@ +#include "applicationclass.h" + + +ApplicationClass::ApplicationClass() +{ +} + + +ApplicationClass::ApplicationClass(const ApplicationClass& other) +{ +} + + +ApplicationClass::~ApplicationClass() +{ +} + + +bool ApplicationClass::Initialize(int screenWidth, int screenHeight, HWND hwnd) +{ + + return true; +} + + +void ApplicationClass::Shutdown() +{ + + return; +} + + +bool ApplicationClass::Frame() +{ + + return true; +} + + +bool ApplicationClass::Render() +{ + + return true; +} \ No newline at end of file diff --git a/enginecustom/applicationclass.h b/enginecustom/applicationclass.h new file mode 100644 index 0000000..833acfb --- /dev/null +++ b/enginecustom/applicationclass.h @@ -0,0 +1,37 @@ +#ifndef _APPLICATIONCLASS_H_ +#define _APPLICATIONCLASS_H_ + + +////////////// +// INCLUDES // +////////////// +#include + + +///////////// +// GLOBALS // +///////////// +const bool FULL_SCREEN = false; +const bool VSYNC_ENABLED = true; +const float SCREEN_DEPTH = 1000.0f; +const float SCREEN_NEAR = 0.3f; + +class ApplicationClass +{ +public: + ApplicationClass(); + ApplicationClass(const ApplicationClass&); + ~ApplicationClass(); + + bool Initialize(int, int, HWND); + void Shutdown(); + bool Frame(); + +private: + bool Render(); + +private: + +}; + +#endif \ No newline at end of file diff --git a/khaotic-engine.vcxproj b/enginecustom/enginecustom.vcxproj similarity index 92% rename from khaotic-engine.vcxproj rename to enginecustom/enginecustom.vcxproj index af63f23..2ab0ec6 100644 --- a/khaotic-engine.vcxproj +++ b/enginecustom/enginecustom.vcxproj @@ -18,11 +18,22 @@ x64 + + + + + + + + + + + 17.0 Win32Proj - {2c5096eb-e3ec-4bec-b945-27ca67723d1f} - khaoticengine + {92cf56c4-76bb-40d4-8fe5-36c15f5f127a} + enginecustom 10.0 @@ -126,22 +137,6 @@ true - - - - - - - - - - - - - - - - diff --git a/khaotic-engine.vcxproj.filters b/enginecustom/enginecustom.vcxproj.filters similarity index 64% rename from khaotic-engine.vcxproj.filters rename to enginecustom/enginecustom.vcxproj.filters index acb04c7..57a70d5 100644 --- a/khaotic-engine.vcxproj.filters +++ b/enginecustom/enginecustom.vcxproj.filters @@ -15,35 +15,28 @@ - - Fichiers d%27en-tête - - - Fichiers d%27en-tête - - - Fichiers d%27en-tête - - - Fichiers d%27en-tête - - - - + + Fichiers sources + + + Fichiers sources + + + Fichiers sources + + Fichiers sources - - Fichiers de ressources - - - - - Fichiers de ressources - - - Fichiers de ressources - + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + + + Fichiers d%27en-tête + \ No newline at end of file diff --git a/enginecustom/inputclass.cpp b/enginecustom/inputclass.cpp new file mode 100644 index 0000000..77c1cba --- /dev/null +++ b/enginecustom/inputclass.cpp @@ -0,0 +1,54 @@ +#include "inputclass.h" + + +InputClass::InputClass() +{ +} + + +InputClass::InputClass(const InputClass& other) +{ +} + + +InputClass::~InputClass() +{ +} + + +void InputClass::Initialize() +{ + int i; + + + // Initialize all the keys to being released and not pressed. + for (i = 0; i < 256; i++) + { + m_keys[i] = false; + } + + return; +} + + +void InputClass::KeyDown(unsigned int input) +{ + // If a key is pressed then save that state in the key array. + m_keys[input] = true; + return; +} + + +void InputClass::KeyUp(unsigned int input) +{ + // If a key is released then clear that state in the key array. + m_keys[input] = false; + return; +} + + +bool InputClass::IsKeyDown(unsigned int key) +{ + // Return what state the key is in (pressed/not pressed). + return m_keys[key]; +} \ No newline at end of file diff --git a/enginecustom/inputclass.h b/enginecustom/inputclass.h new file mode 100644 index 0000000..c079281 --- /dev/null +++ b/enginecustom/inputclass.h @@ -0,0 +1,26 @@ +#ifndef _INPUTCLASS_H_ +#define _INPUTCLASS_H_ + + +//////////////////////////////////////////////////////////////////////////////// +// Class name: InputClass +//////////////////////////////////////////////////////////////////////////////// +class InputClass +{ +public: + InputClass(); + InputClass(const InputClass&); + ~InputClass(); + + void Initialize(); + + void KeyDown(unsigned int); + void KeyUp(unsigned int); + + bool IsKeyDown(unsigned int); + +private: + bool m_keys[256]; +}; + +#endif \ No newline at end of file diff --git a/enginecustom/systemclass.h b/enginecustom/systemclass.h new file mode 100644 index 0000000..4eb1d8d --- /dev/null +++ b/enginecustom/systemclass.h @@ -0,0 +1,49 @@ +#ifndef _SYSTEMCLASS_H_ +#define _SYSTEMCLASS_H_ +#define WIN32_LEAN_AND_MEAN + +#include +#include "inputclass.h" +#include "applicationclass.h" + +class SystemClass +{ +public: + SystemClass(); + SystemClass(const SystemClass&); + ~SystemClass(); + + bool Initialize(); + void Shutdown(); + void Run(); + + LRESULT CALLBACK MessageHandler(HWND, UINT, WPARAM, LPARAM); + +private: + bool Frame(); + void InitializeWindows(int&, int&); + void ShutdownWindows(); + +private: + LPCWSTR m_applicationName; + HINSTANCE m_hinstance; + HWND m_hwnd; + + InputClass* m_Input; + ApplicationClass* m_Application; +}; + + +///////////////////////// +// FUNCTION PROTOTYPES // +///////////////////////// +static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); + + +///////////// +// GLOBALS // +///////////// +static SystemClass* ApplicationHandle = 0; + + +#endif \ No newline at end of file diff --git a/framework.h b/framework.h deleted file mode 100644 index 9b12fee..0000000 --- a/framework.h +++ /dev/null @@ -1,15 +0,0 @@ -// header.h : fichier Include pour les fichiers Include système standard, -// ou les fichiers Include spécifiques aux projets -// - -#pragma once - -#include "targetver.h" -#define WIN32_LEAN_AND_MEAN // Exclure les en-têtes Windows rarement utilisés -// Fichiers d'en-tête Windows -#include -// Fichiers d'en-tête C RunTime -#include -#include -#include -#include diff --git a/khaotic-engine.cpp b/khaotic-engine.cpp deleted file mode 100644 index 5024208..0000000 --- a/khaotic-engine.cpp +++ /dev/null @@ -1,309 +0,0 @@ - -///////////////**************new**************//////////////////// - -//Include and link appropriate libraries and headers// -#pragma comment(lib, "d3d11.lib") -#pragma comment(lib, "d3d10.lib") - -#include -#include -#include -#include -#include -#include - -//Global Declarations// -IDXGISwapChain* SwapChain; -ID3D11Device* d3d11Device; -ID3D11DeviceContext* d3d11DevCon; -ID3D11RenderTargetView* renderTargetView; - -float red = 0.0f; -float green = 0.0f; -float blue = 0.0f; -int colormodr = 1; -int colormodg = 1; -int colormodb = 1; - -///////////////**************new**************//////////////////// - -LPCTSTR WndClassName = L"firstwindow"; -HWND hwnd = NULL; - -const int Width = 300; -const int Height = 300; - -///////////////**************new**************//////////////////// - -//Function Prototypes// -bool InitializeDirect3d11App(HINSTANCE hInstance); -void ReleaseObjects(); -bool InitScene(); -void UpdateScene(); -void DrawScene(); - -///////////////**************new**************//////////////////// - -bool InitializeWindow(HINSTANCE hInstance, - int ShowWnd, - int width, int height, - bool windowed); -int messageloop(); - -LRESULT CALLBACK WndProc(HWND hWnd, - UINT msg, - WPARAM wParam, - LPARAM lParam); - - -int WINAPI WinMain(_In_ HINSTANCE hInstance, //Main windows function - _In_opt_ HINSTANCE hPrevInstance, - _In_ LPSTR lpCmdLine, - _In_ int nShowCmd) -{ - - if (!InitializeWindow(hInstance, nShowCmd, Width, Height, true)) - { - MessageBox(0, L"Window Initialization - Failed", - L"Error", MB_OK); - return 0; - } - - ///////////////**************new**************//////////////////// - - if (!InitializeDirect3d11App(hInstance)) //Initialize Direct3D - { - MessageBox(0, L"Direct3D Initialization - Failed", - L"Error", MB_OK); - return 0; - } - - if (!InitScene()) //Initialize our scene - { - MessageBox(0, L"Scene Initialization - Failed", - L"Error", MB_OK); - return 0; - } - - messageloop(); - - ReleaseObjects(); - - ///////////////**************new**************//////////////////// - - return 0; -} - -bool InitializeWindow(HINSTANCE hInstance, - int ShowWnd, - int width, int height, - bool windowed) -{ - typedef struct _WNDCLASS { - UINT cbSize; - UINT style; - WNDPROC lpfnWndProc; - int cbClsExtra; - int cbWndExtra; - HANDLE hInstance; - HICON hIcon; - HCURSOR hCursor; - HBRUSH hbrBackground; - LPCTSTR lpszMenuName; - LPCTSTR lpszClassName; - } WNDCLASS; - - WNDCLASSEX wc; - - wc.cbSize = sizeof(WNDCLASSEX); - wc.style = CS_HREDRAW | CS_VREDRAW; - wc.lpfnWndProc = WndProc; - wc.cbClsExtra = NULL; - wc.cbWndExtra = NULL; - wc.hInstance = hInstance; - wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); - wc.hCursor = LoadCursor(NULL, IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 2); - wc.lpszMenuName = NULL; - wc.lpszClassName = WndClassName; - wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); - - if (!RegisterClassEx(&wc)) - { - MessageBox(NULL, L"Error registering class", - L"Error", MB_OK | MB_ICONERROR); - return 1; - } - - hwnd = CreateWindowEx( - NULL, - WndClassName, - L"Khaotic Engine", - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, - width, height, - NULL, - NULL, - hInstance, - NULL - ); - - if (!hwnd) - { - MessageBox(NULL, L"Error creating window", - L"Error", MB_OK | MB_ICONERROR); - return 1; - } - - ShowWindow(hwnd, ShowWnd); - UpdateWindow(hwnd); - - return true; -} - -///////////////**************new**************//////////////////// - -bool InitializeDirect3d11App(HINSTANCE hInstance) -{ - //Describe our Buffer - DXGI_MODE_DESC bufferDesc; - - ZeroMemory(&bufferDesc, sizeof(DXGI_MODE_DESC)); - - bufferDesc.Width = Width; - bufferDesc.Height = Height; - bufferDesc.RefreshRate.Numerator = 60; - bufferDesc.RefreshRate.Denominator = 1; - bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; - bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; - - //Describe our SwapChain - DXGI_SWAP_CHAIN_DESC swapChainDesc; - - ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC)); - - swapChainDesc.BufferDesc = bufferDesc; - swapChainDesc.SampleDesc.Count = 4; //multisampling standard - swapChainDesc.SampleDesc.Quality = D3D11_STANDARD_MULTISAMPLE_PATTERN; - swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - swapChainDesc.BufferCount = 2; // triple buffering - swapChainDesc.OutputWindow = hwnd; - swapChainDesc.Windowed = TRUE; - swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; - - - //Create our SwapChain - D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, - D3D11_SDK_VERSION, &swapChainDesc, &SwapChain, &d3d11Device, NULL, &d3d11DevCon); - - //Create our BackBuffer - ID3D11Texture2D* BackBuffer; - SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&BackBuffer); - - //Create our Render Target - d3d11Device->CreateRenderTargetView(BackBuffer, NULL, &renderTargetView); - BackBuffer->Release(); - - //Set our Render Target - d3d11DevCon->OMSetRenderTargets(1, &renderTargetView, NULL); - - return true; -} - -void ReleaseObjects() -{ - //Release the COM Objects we created - SwapChain->Release(); - d3d11Device->Release(); - d3d11DevCon->Release(); -} -bool InitScene() -{ - - return true; -} - -void UpdateScene() -{ - //Update the colors of our scene - red += colormodr * 0.00005f; - green += colormodg * 0.00002f; - blue += colormodb * 0.00001f; - - if (red >= 1.0f || red <= 0.0f) - colormodr *= -1; - if (green >= 1.0f || green <= 0.0f) - colormodg *= -1; - if (blue >= 1.0f || blue <= 0.0f) - colormodb *= -1; -} - -void DrawScene() -{ - //Clear our backbuffer to the updated color - DirectX::XMFLOAT4 bgColor(red, green, blue, 1.0f); - float color[4] = { bgColor.x, bgColor.y, bgColor.z, bgColor.w }; - d3d11DevCon->ClearRenderTargetView(renderTargetView, color); - - //Present the backbuffer to the screen - SwapChain->Present(0, 0); -} - -///////////////**************new**************//////////////////// - -int messageloop() { - MSG msg; - ZeroMemory(&msg, sizeof(MSG)); - while (true) - { - BOOL PeekMessageL( - LPMSG lpMsg, - HWND hWnd, - UINT wMsgFilterMin, - UINT wMsgFilterMax, - UINT wRemoveMsg - ); - - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { - if (msg.message == WM_QUIT) - break; - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else { - ///////////////**************new**************//////////////////// - // run game code - - UpdateScene(); - DrawScene(); - - ///////////////**************new**************//////////////////// - } - } - return msg.wParam; -} - -LRESULT CALLBACK WndProc(HWND hwnd, - UINT msg, - WPARAM wParam, - LPARAM lParam) -{ - switch (msg) - { - case WM_KEYDOWN: - if (wParam == VK_ESCAPE) { - DestroyWindow(hwnd); - } - return 0; - - case WM_DESTROY: - PostQuitMessage(0); - return 0; - } - return DefWindowProc(hwnd, - msg, - wParam, - lParam); -} diff --git a/khaotic-engine.h b/khaotic-engine.h deleted file mode 100644 index d00d47e..0000000 --- a/khaotic-engine.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "resource.h" diff --git a/khaotic-engine.ico b/khaotic-engine.ico deleted file mode 100644 index b3ec03bd617f32e58128fa977fd6ac9605124f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46227 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 Y;&FT$(kX2KKjk^5FDKATlmE#43rvGc`Tzg` diff --git a/khaotic-engine.sln b/khaotic-engine.sln deleted file mode 100644 index 3673def..0000000 --- a/khaotic-engine.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.9.34607.119 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "khaotic-engine", "khaotic-engine.vcxproj", "{2C5096EB-E3EC-4BEC-B945-27CA67723D1F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Debug|x64.ActiveCfg = Debug|x64 - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Debug|x64.Build.0 = Debug|x64 - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Debug|x86.ActiveCfg = Debug|Win32 - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Debug|x86.Build.0 = Debug|Win32 - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Release|x64.ActiveCfg = Release|x64 - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Release|x64.Build.0 = Release|x64 - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Release|x86.ActiveCfg = Release|Win32 - {2C5096EB-E3EC-4BEC-B945-27CA67723D1F}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {AE9097A3-6D17-4474-B6FB-ACA76C7C3C8B} - EndGlobalSection -EndGlobal diff --git a/small.ico b/small.ico deleted file mode 100644 index b3ec03bd617f32e58128fa977fd6ac9605124f4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46227 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