Loading files under win32

This commit is contained in:
Kevin Trogant 2022-11-24 09:52:56 +01:00
parent 70d23facf9
commit 7fae583084
5 changed files with 114 additions and 11 deletions

View File

@ -44,7 +44,9 @@ elseif (WIN32)
${kde_SRCS} ${kde_SRCS}
win32_kde.cpp win32_kde.cpp
glad.c glad.c
glad.h) glad.h
Win32AssetManager.cpp
Win32AssetManager.h)
target_link_libraries(kde glfw) target_link_libraries(kde glfw)
target_include_directories(kde PRIVATE ${PROJECT_SOURCE_DIR}/../../../glfw/include) target_include_directories(kde PRIVATE ${PROJECT_SOURCE_DIR}/../../../glfw/include)
endif() endif()

View File

@ -1,7 +1,6 @@
#include "Texture.h" #include "Texture.h"
Texture::Texture(unsigned int width, unsigned int height, const void *data) Texture::Texture(unsigned int width, unsigned int height, const void* data) : m_texture(0)
: m_texture(0)
{ {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &m_texture); glGenTextures(1, &m_texture);
@ -25,8 +24,7 @@ Texture::Texture(unsigned int width, unsigned int height, const void *data)
height_px = height; height_px = height;
} }
Texture::Texture(unsigned int width, unsigned int height, const void* data, GLint format) Texture::Texture(unsigned int width, unsigned int height, const void* data, GLint format) : m_texture(0)
: m_texture(0)
{ {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &m_texture); glGenTextures(1, &m_texture);
@ -60,13 +58,12 @@ void Texture::bind() const
glBindTexture(GL_TEXTURE_2D, m_texture); glBindTexture(GL_TEXTURE_2D, m_texture);
} }
void Texture::getTextureSize( void Texture::getTextureSize(unsigned int* w, unsigned int* h)
unsigned int* w, {
unsigned int* h){ if (w != nullptr) {
if (w != NULL){
*w = width_px; *w = width_px;
} }
if (h != NULL){ if (h != nullptr) {
*h = height_px; *h = height_px;
} }
} }

View File

@ -0,0 +1,69 @@
#include "Win32AssetManager.h"
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
void Win32AssetManager::create(const char* asset_root_dir)
{
static Win32AssetManager mgr;
mgr.m_asset_root = asset_root_dir;
AssetManager::ptr = &mgr;
}
bool Win32AssetManager::loadFile(const char* path, FileBuffer* p_file_buffer)
{
// TODO(Kevin): We could totally optimize this via a custom allocator
char _cp[MAX_PATH];
strncpy(_cp, m_asset_root, MAX_PATH);
strncat(_cp, "\\", MAX_PATH);
strncat(_cp, path, MAX_PATH);
WIN32_FILE_ATTRIBUTE_DATA attribs;
if (!GetFileAttributesExA(_cp, GetFileExInfoStandard, &attribs)) {
return false;
}
size_t size = static_cast<size_t>(attribs.nFileSizeHigh) << 32 | attribs.nFileSizeLow;
void* data = VirtualAlloc(nullptr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
p_file_buffer->data = data;
p_file_buffer->size = size;
p_file_buffer->internal = nullptr;
HANDLE file =
CreateFileA(_cp, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
if (!file) {
VirtualFree(data, 0, MEM_RELEASE);
return false;
}
char* dst = reinterpret_cast<char*>(data);
while (size >= UINT32_MAX) {
DWORD bytes_read = 0;
if (!ReadFile(file, dst, UINT32_MAX, &bytes_read, nullptr)) {
// Error occured
CloseHandle(file);
VirtualFree(data, 0, MEM_RELEASE);
return false;
}
size -= bytes_read;
dst += bytes_read;
}
if (size > 0) {
DWORD bytes_read = 0;
if (!ReadFile(file, dst, size, &bytes_read, nullptr)) {
// Error occured
CloseHandle(file);
VirtualFree(data, 0, MEM_RELEASE);
return false;
}
}
CloseHandle(file);
return true;
}
void Win32AssetManager::releaseFileBuffer(FileBuffer& fb)
{
void* data = const_cast<void*>(fb.data);
VirtualFree(data, 0, MEM_RELEASE);
fb.data = nullptr;
fb.size = 0;
}

View File

@ -0,0 +1,23 @@
#ifndef KRIMI_DINNER_ENGINE_WIN32_ASSET_MANAGER_H
#define KRIMI_DINNER_ENGINE_WIN32_ASSET_MANAGER_H
#include "AssetManager.h"
class Win32AssetManager : public AssetManager
{
public:
/// @brief Create the singleton instance
///
/// Sets @ref AssetManager::ptr to the singleton instance
/// @param asset_root_dir Directory where asset files are located
static void create(const char* asset_root_dir);
bool loadFile(const char* path, FileBuffer* p_file_buffer) override;
void releaseFileBuffer(FileBuffer& fb) override;
private:
const char* m_asset_root;
};
#endif

View File

@ -3,6 +3,7 @@
#include "glad.h" #include "glad.h"
#include "Renderer.h" #include "Renderer.h"
#include "Win32AssetManager.h"
#undef APIENTRY #undef APIENTRY
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
@ -38,13 +39,24 @@ int main()
return 1; return 1;
} }
const char* asset_dir = "app\\src\\main\\assets";
Win32AssetManager::create(asset_dir);
Renderer::create(); Renderer::create();
glfwSwapInterval(1); glfwSwapInterval(1);
while (!glfwWindowShouldClose(window)) { while (!glfwWindowShouldClose(window)) {
glfwPollEvents(); glfwPollEvents();
Renderer::ptr->addRect(100, 100, 500, 500, 0.3, 0.3, 0.3, 1.0f); Renderer::ptr->addRect(100,
100,
500,
500,
0.3,
0.3,
0.3,
1.0f,
StringRepository::global->internString("smiley_PNG42.png"));
int w, h; int w, h;
glfwGetFramebufferSize(window, &w, &h); glfwGetFramebufferSize(window, &w, &h);