diff --git a/.vscode/settings.json b/.vscode/settings.json index 1507357..d6faa94 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,14 @@ { "files.associations": { - "functional": "cpp" + "functional": "cpp", + "array": "cpp", + "utility": "cpp", + "xutility": "cpp", + "compare": "cpp", + "memory": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "xmemory": "cpp", + "xtr1common": "cpp" } } \ No newline at end of file diff --git a/Src/IAEngine/CMakeLists.txt b/Src/IAEngine/CMakeLists.txt index c48572d..0a1a86f 100644 --- a/Src/IAEngine/CMakeLists.txt +++ b/Src/IAEngine/CMakeLists.txt @@ -9,9 +9,15 @@ set(IAEngine_Sources imp/cpp/ResourceManager.cpp - imp/cpp/Rendering/Texture.cpp imp/cpp/Rendering/Camera.cpp + imp/cpp/Rendering/Texture.cpp imp/cpp/Rendering/Renderer.cpp + imp/cpp/Rendering/GPUBuffer.cpp + + imp/cpp/Rendering/Mesh/Quad.cpp + + imp/cpp/Rendering/Pipeline/Pipeline.cpp + imp/cpp/Rendering/Pipeline/UnlitMesh.cpp imp/cpp/Physics/Physics.cpp diff --git a/Src/IAEngine/imp/cpp/Rendering/GPUBuffer.cpp b/Src/IAEngine/imp/cpp/Rendering/GPUBuffer.cpp new file mode 100644 index 0000000..9e757a1 --- /dev/null +++ b/Src/IAEngine/imp/cpp/Rendering/GPUBuffer.cpp @@ -0,0 +1,115 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include + +#include + +namespace ia::iae +{ + EXTERN SDL_GPUDevice *g_gpuDevice; + + UINT32 g_stagingBufferSize = 4096; + SDL_GPUTransferBuffer* g_stagingBuffer{}; + + RefPtr GPUBuffer::Create(IN PCVOID data, IN UINT32 dataSize) + { + const auto res = MakeRefPtr(); + + SDL_GPUBufferCreateInfo createInfo{ + .usage = SDL_GPU_BUFFERUSAGE_VERTEX, + .size = dataSize + }; + SDL_GPUBuffer* handle{}; + if(!(handle = SDL_CreateGPUBuffer(g_gpuDevice, &createInfo))) + { + IAE_LOG_ERROR("Couldn't create a SDL3 GPU Buffer: ", SDL_GetError()); + return nullptr; + } + + if(data && dataSize) + { + if(!EnsureStagingBufferSize((UINT32)dataSize)) + return nullptr; + + const auto mappedPtr = SDL_MapGPUTransferBuffer(g_gpuDevice, g_stagingBuffer, false); + memcpy(mappedPtr, data, dataSize); + SDL_UnmapGPUTransferBuffer(g_gpuDevice, g_stagingBuffer); + + const auto cmdBuffer = SDL_AcquireGPUCommandBuffer(g_gpuDevice); + const auto copyPass = SDL_BeginGPUCopyPass(cmdBuffer); + + SDL_GPUTransferBufferLocation src{ + .transfer_buffer = g_stagingBuffer, + .offset = 0 + }; + SDL_GPUBufferRegion dst{ + .buffer = handle, + .offset = 0, + .size = dataSize + }; + SDL_UploadToGPUBuffer(copyPass, &src, &dst, false); + + SDL_EndGPUCopyPass(copyPass); + SDL_SubmitGPUCommandBuffer(cmdBuffer); + } + + res->m_handle = (Handle)handle; + + return res; + } + + BOOL GPUBuffer::InitializeStagingBuffer() + { + SDL_GPUTransferBufferCreateInfo createInfo{ + .usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, + .size = g_stagingBufferSize + }; + if(!(g_stagingBuffer = SDL_CreateGPUTransferBuffer(g_gpuDevice, &createInfo))) + { + IAE_LOG_ERROR("Couldn't create a SDL3 GPU Staging Buffer: ", SDL_GetError()); + return false; + } + return true; + } + + VOID GPUBuffer::TerminateStagingBuffer() + { + if(!g_stagingBuffer) + return; + + SDL_ReleaseGPUTransferBuffer(g_gpuDevice, g_stagingBuffer); + } + + BOOL GPUBuffer::EnsureStagingBufferSize(IN UINT32 size) + { + if(!g_stagingBuffer) + return false; + if(size <= g_stagingBufferSize) + return true; + SDL_ReleaseGPUTransferBuffer(g_gpuDevice, g_stagingBuffer); + SDL_GPUTransferBufferCreateInfo createInfo{ + .usage = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD, + .size = (g_stagingBufferSize = size) + }; + if(!(g_stagingBuffer = SDL_CreateGPUTransferBuffer(g_gpuDevice, &createInfo))) + { + IAE_LOG_ERROR("Couldn't create a SDL3 GPU Staging Buffer: ", SDL_GetError()); + return false; + } + return true; + } +} // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/imp/cpp/Rendering/Mesh/Quad.cpp b/Src/IAEngine/imp/cpp/Rendering/Mesh/Quad.cpp new file mode 100644 index 0000000..70a3052 --- /dev/null +++ b/Src/IAEngine/imp/cpp/Rendering/Mesh/Quad.cpp @@ -0,0 +1,44 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include +#include +#include + +namespace ia::iae +{ + RefPtr g_quadMeshVertexBuffer{}; + + VOID QuadMesh::Initialize() + { + Vertex_Mesh vertices[6] = {{iam::Vec3f{-1, 1, 0}, iam::Vec2f{0, 0}}, {iam::Vec3f{1, 1, 0}, iam::Vec2f{1, 0}}, + {iam::Vec3f{1, -1, 0}, iam::Vec2f{1, 1}}, {iam::Vec3f{-1, 1, 0}, iam::Vec2f{0, 0}}, + {iam::Vec3f{1, -1, 0}, iam::Vec2f{1, 1}}, {iam::Vec3f{-1, -1, 0}, iam::Vec2f{0, 1}}}; + g_quadMeshVertexBuffer = GPUBuffer::Create(&vertices, sizeof(vertices)); + } + + VOID QuadMesh::Terminate() + { + if(g_quadMeshVertexBuffer) + g_quadMeshVertexBuffer.reset(); + } + + VOID QuadMesh::Draw(IN CONST iam::Vec3f &position, IN CONST iam::Vec3f &scale, IN FLOAT32 rotation) + { + Renderer::Draw((Handle)g_quadMeshVertexBuffer.get(), 6); + } +} // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/imp/cpp/Rendering/Pipeline/Pipeline.cpp b/Src/IAEngine/imp/cpp/Rendering/Pipeline/Pipeline.cpp new file mode 100644 index 0000000..10afd27 --- /dev/null +++ b/Src/IAEngine/imp/cpp/Rendering/Pipeline/Pipeline.cpp @@ -0,0 +1,83 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include + +#include + +#include + +namespace ia::iae +{ + EXTERN SDL_GPUDevice *g_gpuDevice; + + Handle IPipeline::LoadShaderFromMemory(IN ShaderStage _stage, IN PCUINT8 sourceData, IN SIZE_T sourceLength, + IN UINT32 samplerCount, IN UINT32 uniformBufferCount, + IN UINT32 storageBufferCount, IN UINT32 storageTextureCount) + { + SDL_GPUShader* res{}; + + SDL_GPUShaderStage stage{}; + switch (_stage) + { + case ShaderStage::VERTEX: + stage = SDL_GPU_SHADERSTAGE_VERTEX; + break; + + case ShaderStage::PIXEL: + stage = SDL_GPU_SHADERSTAGE_FRAGMENT; + break; + + default: + THROW_INVALID_DATA("Unsupported shader stage"); + break; + } + + SDL_GPUShaderCreateInfo createInfo = { + .code_size = sourceLength, + .code = sourceData, + .entrypoint = "main", + .format = SDL_GPU_SHADERFORMAT_SPIRV, + .stage = stage, + .num_samplers = samplerCount, + .num_storage_textures = storageTextureCount, + .num_storage_buffers = storageBufferCount, + .num_uniform_buffers = uniformBufferCount, + }; + + if(!(res = SDL_CreateGPUShader(g_gpuDevice, &createInfo))) + { + IAE_LOG_ERROR("Failed to create a SDL shader: ", SDL_GetError()); + return INVALID_HANDLE; + } + + return (Handle)res; + } + + Handle IPipeline::LoadShaderFromFile(IN ShaderStage stage, IN PCCHAR fileName, IN UINT32 samplerCount, + IN UINT32 uniformBufferCount, IN UINT32 storageBufferCount, + IN UINT32 storageTextureCount) + { + const auto source = File::ReadToVector(fileName); + return LoadShaderFromMemory(stage, source.data(), source.size(), samplerCount, uniformBufferCount, + storageBufferCount, storageTextureCount); + } + + VOID IPipeline::UnloadShader(IN Handle handle) + { + SDL_ReleaseGPUShader(g_gpuDevice, (SDL_GPUShader *) handle); + } +} // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/imp/cpp/Rendering/Pipeline/UnlitMesh.cpp b/Src/IAEngine/imp/cpp/Rendering/Pipeline/UnlitMesh.cpp new file mode 100644 index 0000000..a13efe6 --- /dev/null +++ b/Src/IAEngine/imp/cpp/Rendering/Pipeline/UnlitMesh.cpp @@ -0,0 +1,89 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include + +#include + +#include + +namespace ia::iae +{ + EXTERN SDL_GPUDevice *g_gpuDevice; + EXTERN SDL_Window *g_windowHandle; + + Pipeline_UnlitMesh::~Pipeline_UnlitMesh() + { + } + + RefPtr Pipeline_UnlitMesh::Create() + { + const auto res = MakeRefPtr(); + + const auto vertexShader = LoadShaderFromMemory(ShaderStage::VERTEX, SHADER_SOURCE_UNLITMESH_VERT, sizeof(SHADER_SOURCE_UNLITMESH_VERT), 0, 0, 0, 0); + const auto pixelShader = LoadShaderFromMemory(ShaderStage::PIXEL, SHADER_SOURCE_UNLITMESH_FRAG, sizeof(SHADER_SOURCE_UNLITMESH_FRAG), 0, 0, 0, 0); + + SDL_GPUColorTargetDescription colorTargets[] = { + {.format = SDL_GetGPUSwapchainTextureFormat(g_gpuDevice, g_windowHandle)}}; + SDL_GPUVertexBufferDescription vertexBuffers[] = {{ + .slot = 0, + .pitch = sizeof(Vertex_Mesh), + .input_rate = SDL_GPU_VERTEXINPUTRATE_VERTEX, + .instance_step_rate = 0, + }}; + SDL_GPUVertexAttribute vertexAttributes[] = { + {.location = 0, .buffer_slot = 0, .format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3, .offset = 0}, + {.location = 1, + .buffer_slot = 0, + .format = SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2, + .offset = sizeof(float) * 3}}; + SDL_GPUGraphicsPipelineCreateInfo createInfo = { + .vertex_shader = (SDL_GPUShader *) vertexShader, + .fragment_shader = (SDL_GPUShader *) pixelShader, + .vertex_input_state = + SDL_GPUVertexInputState{.vertex_buffer_descriptions = vertexBuffers, + .num_vertex_buffers = sizeof(vertexBuffers) / sizeof(vertexBuffers[0]), + .vertex_attributes = vertexAttributes, + .num_vertex_attributes = + sizeof(vertexAttributes) / sizeof(vertexAttributes[0])}, + .primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, + .target_info = + { + .color_target_descriptions = colorTargets, + .num_color_targets = sizeof(colorTargets) / sizeof(colorTargets[0]), + }, + }; + + SDL_GPUGraphicsPipeline* handle{}; + if(!(handle = SDL_CreateGPUGraphicsPipeline(g_gpuDevice, &createInfo))) + { + IAE_LOG_ERROR("Failed to create a SDL graphics pipeline: ", SDL_GetError()); + return nullptr; + } + + UnloadShader(pixelShader); + UnloadShader(vertexShader); + + res->m_handle = (Handle)handle; + + return res; + } + + VOID Pipeline_UnlitMesh::Bind(IN Handle renderPassHandle) + { + SDL_BindGPUGraphicsPipeline((SDL_GPURenderPass*)renderPassHandle, (SDL_GPUGraphicsPipeline*)m_handle); + } +} // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/imp/cpp/Rendering/Renderer.cpp b/Src/IAEngine/imp/cpp/Rendering/Renderer.cpp index dd8710e..9943eb7 100644 --- a/Src/IAEngine/imp/cpp/Rendering/Renderer.cpp +++ b/Src/IAEngine/imp/cpp/Rendering/Renderer.cpp @@ -15,6 +15,9 @@ // along with this program. If not, see . #include +#include +#include +#include #include #include @@ -38,15 +41,15 @@ namespace ia::iae // ImGUI State ImGuiIO g_imGUIIO{}; - ImDrawData* g_imDrawData{}; + ImDrawData *g_imDrawData{}; + + RefPtr g_pipelineUnlitMesh; BOOL Renderer::Initialize(IN Engine *engine) { g_windowHandle = (SDL_Window *) engine->GetWindowHandle(); - if (!(g_gpuDevice = - SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV | SDL_GPU_SHADERFORMAT_DXIL | SDL_GPU_SHADERFORMAT_MSL, - engine->IsDebugMode, nullptr))) + if (!(g_gpuDevice = SDL_CreateGPUDevice(SDL_GPU_SHADERFORMAT_SPIRV, engine->IsDebugMode, nullptr))) { IAE_LOG_ERROR("Couldn't create SDL3 GPU Device: ", SDL_GetError()); return false; @@ -57,7 +60,8 @@ namespace ia::iae IAE_LOG_ERROR("Couldn't initialize SDL3 GPU for the window: ", SDL_GetError()); return false; } - SDL_SetGPUSwapchainParameters(g_gpuDevice, g_windowHandle, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, SDL_GPU_PRESENTMODE_VSYNC); + SDL_SetGPUSwapchainParameters(g_gpuDevice, g_windowHandle, SDL_GPU_SWAPCHAINCOMPOSITION_SDR, + SDL_GPU_PRESENTMODE_VSYNC); const auto mainScale = SDL_GetDisplayContentScale(SDL_GetPrimaryDisplay()); @@ -73,14 +77,20 @@ namespace ia::iae style.ScaleAllSizes(mainScale); style.FontScaleDpi = mainScale; - ImGui_ImplSDLGPU3_InitInfo initInfo{ - .Device = g_gpuDevice, - .ColorTargetFormat = SDL_GetGPUSwapchainTextureFormat(g_gpuDevice, g_windowHandle), - .PresentMode = SDL_GPU_PRESENTMODE_VSYNC - }; + ImGui_ImplSDLGPU3_InitInfo initInfo{.Device = g_gpuDevice, + .ColorTargetFormat = + SDL_GetGPUSwapchainTextureFormat(g_gpuDevice, g_windowHandle), + .PresentMode = SDL_GPU_PRESENTMODE_VSYNC}; ImGui_ImplSDL3_InitForSDLGPU(g_windowHandle); ImGui_ImplSDLGPU3_Init(&initInfo); + if (!GPUBuffer::InitializeStagingBuffer()) + return false; + + g_pipelineUnlitMesh = Pipeline_UnlitMesh::Create(); + + QuadMesh::Initialize(); + return true; } @@ -88,6 +98,10 @@ namespace ia::iae { SDL_WaitForGPUIdle(g_gpuDevice); + QuadMesh::Terminate(); + + GPUBuffer::TerminateStagingBuffer(); + ImGui_ImplSDL3_Shutdown(); ImGui_ImplSDLGPU3_Shutdown(); ImGui::DestroyContext(); @@ -144,6 +158,8 @@ namespace ia::iae colorTargetInfo.store_op = SDL_GPU_STOREOP_STORE; g_renderPass = SDL_BeginGPURenderPass(g_cmdBuffer, &colorTargetInfo, 1, NULL); + + g_pipelineUnlitMesh->Bind((Handle) g_renderPass); } VOID Renderer::EndFrame() @@ -155,4 +171,20 @@ namespace ia::iae SDL_EndGPURenderPass(g_renderPass); SDL_SubmitGPUCommandBuffer(g_cmdBuffer); } + + VOID Renderer::Draw(IN Handle vertexBufferHandle, IN INT32 vertexCount) + { + SDL_GPUBufferBinding bindings[] = {{.buffer = (SDL_GPUBuffer *) vertexBufferHandle, .offset = 0}}; + SDL_BindGPUVertexBuffers(g_renderPass, 0, bindings, 1); + SDL_DrawGPUPrimitives(g_renderPass, vertexCount, 1, 0, 0); + } + + VOID Renderer::Draw(IN Handle vertexBufferHandle, IN Handle indexBufferHandle, IN INT32 indexCount) + { + SDL_GPUBufferBinding bindings[] = {{.buffer = (SDL_GPUBuffer *) vertexBufferHandle, .offset = 0}, + {.buffer = (SDL_GPUBuffer *) indexBufferHandle, .offset = 0}}; + SDL_BindGPUVertexBuffers(g_renderPass, 0, bindings, 1); + SDL_BindGPUIndexBuffer(g_renderPass, &bindings[1], SDL_GPU_INDEXELEMENTSIZE_32BIT); + SDL_DrawGPUIndexedPrimitives(g_renderPass, indexCount, 1, 0, 0, 0); + } } // namespace ia::iae diff --git a/Src/IAEngine/imp/cpp/Rendering/Texture.cpp b/Src/IAEngine/imp/cpp/Rendering/Texture.cpp index c2dd54a..73b8d4f 100644 --- a/Src/IAEngine/imp/cpp/Rendering/Texture.cpp +++ b/Src/IAEngine/imp/cpp/Rendering/Texture.cpp @@ -23,7 +23,7 @@ namespace ia::iae { - Texture::Texture(IN Engine *engine) : m_engine(engine) + Texture::Texture() { } @@ -35,8 +35,7 @@ namespace ia::iae VOID Texture::Draw(IN CONST iam::Vec3f &position, IN CONST iam::Vec3f &scale, IN FLOAT32 rotation, IN BOOL flipH, IN BOOL flipV, IN CONST iam::Vec4f &colorOverlay) CONST { - SDL_FRect rect{.x = position.X, .y = position.Y, .w = m_width * scale.X, .h = m_height * scale.Y}; - + // SDL_FRect rect{.x = position.X, .y = position.Y, .w = m_width * scale.X, .h = m_height * scale.Y}; //SDL_SetTextureColorModFloat(TEXTURE_HANDLE, colorOverlay.X, colorOverlay.Y, colorOverlay.Z); //SDL_SetTextureAlphaModFloat(TEXTURE_HANDLE, colorOverlay.W); //SDL_RenderTextureRotated((SDL_Renderer *) m_engine->GetRendererHandle(), TEXTURE_HANDLE, nullptr, &rect, diff --git a/Src/IAEngine/imp/cpp/ResourceManager.cpp b/Src/IAEngine/imp/cpp/ResourceManager.cpp index 1635fb0..8eee427 100644 --- a/Src/IAEngine/imp/cpp/ResourceManager.cpp +++ b/Src/IAEngine/imp/cpp/ResourceManager.cpp @@ -46,10 +46,10 @@ namespace ia::iae RefPtr ResourceManager::CreateTexture(IN PCUINT8 rgbaData, IN INT32 width, IN INT32 height) { - const auto result = MakeRefPtr(m_engine); + //const auto result = MakeRefPtr(m_engine); - result->m_width = width; - result->m_height = height; + //result->m_width = width; + //result->m_height = height; //SDL_Surface *surface = // SDL_CreateSurfaceFrom(width, height, SDL_PIXELFORMAT_RGBA32, (void *) rgbaData, width << 2); @@ -60,6 +60,6 @@ namespace ia::iae // THROW_UNKNOWN("Failed to create SDL Texture: ", SDL_GetError()); //SDL_DestroySurface(surface); - return result; + return nullptr; } } // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/imp/glsl/UnlitMesh/UnlitMesh.frag b/Src/IAEngine/imp/glsl/UnlitMesh/UnlitMesh.frag new file mode 100644 index 0000000..6ea360b --- /dev/null +++ b/Src/IAEngine/imp/glsl/UnlitMesh/UnlitMesh.frag @@ -0,0 +1,11 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 0) in vec2 inTexCoord; + +layout(location = 0) out vec4 outColor; + +void main() +{ + outColor = vec4(0, 1, 0, 1); +} \ No newline at end of file diff --git a/Src/IAEngine/imp/glsl/UnlitMesh/UnlitMesh.vert b/Src/IAEngine/imp/glsl/UnlitMesh/UnlitMesh.vert new file mode 100644 index 0000000..e5d07f1 --- /dev/null +++ b/Src/IAEngine/imp/glsl/UnlitMesh/UnlitMesh.vert @@ -0,0 +1,10 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 0) out vec2 outTexCoord; + +void main() +{ + outTexCoord = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); + gl_Position = vec4(outTexCoord * 2.0f - 1.0f, 0.0f, 1.0f); +} \ No newline at end of file diff --git a/Src/IAEngine/imp/hpp/EmbeddedShaders.hpp b/Src/IAEngine/imp/hpp/EmbeddedShaders.hpp new file mode 100644 index 0000000..425fe3b --- /dev/null +++ b/Src/IAEngine/imp/hpp/EmbeddedShaders.hpp @@ -0,0 +1,33 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// ---------------------------------------------------------------------- +// GENERATED FILE. DO NOT EDIT. +// ---------------------------------------------------------------------- + +#pragma once + +#include + +namespace ia::iae +{ +CONSTEXPR UINT8 SHADER_SOURCE_UNLITMESH_VERT[1272] = { +0x3,0x2,0x23,0x7,0x0,0x0,0x1,0x0,0xb,0x0,0xd,0x0,0x2b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x0,0x2,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x6,0x0,0x1,0x0,0x0,0x0,0x47,0x4c,0x53,0x4c,0x2e,0x73,0x74,0x64,0x2e,0x34,0x35,0x30,0x0,0x0,0x0,0x0,0xe,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xf,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x2,0x0,0x0,0x0,0xc2,0x1,0x0,0x0,0x4,0x0,0x9,0x0,0x47,0x4c,0x5f,0x41,0x52,0x42,0x5f,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x5f,0x73,0x68,0x61,0x64,0x65,0x72,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x73,0x0,0x0,0x4,0x0,0xa,0x0,0x47,0x4c,0x5f,0x47,0x4f,0x4f,0x47,0x4c,0x45,0x5f,0x63,0x70,0x70,0x5f,0x73,0x74,0x79,0x6c,0x65,0x5f,0x6c,0x69,0x6e,0x65,0x5f,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x76,0x65,0x0,0x0,0x4,0x0,0x8,0x0,0x47,0x4c,0x5f,0x47,0x4f,0x4f,0x47,0x4c,0x45,0x5f,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x5f,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x76,0x65,0x0,0x5,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0x9,0x0,0x0,0x0,0x6f,0x75,0x74,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x0,0x5,0x0,0x6,0x0,0xc,0x0,0x0,0x0,0x67,0x6c,0x5f,0x56,0x65,0x72,0x74,0x65,0x78,0x49,0x6e,0x64,0x65,0x78,0x0,0x0,0x5,0x0,0x6,0x0,0x1b,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x65,0x72,0x56,0x65,0x72,0x74,0x65,0x78,0x0,0x0,0x0,0x0,0x6,0x0,0x6,0x0,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x73,0x69,0x74,0x69,0x6f,0x6e,0x0,0x6,0x0,0x7,0x0,0x1b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x67,0x6c,0x5f,0x50,0x6f,0x69,0x6e,0x74,0x53,0x69,0x7a,0x65,0x0,0x0,0x0,0x0,0x6,0x0,0x7,0x0,0x1b,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x6c,0x69,0x70,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x6,0x0,0x7,0x0,0x1b,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x67,0x6c,0x5f,0x43,0x75,0x6c,0x6c,0x44,0x69,0x73,0x74,0x61,0x6e,0x63,0x65,0x0,0x5,0x0,0x3,0x0,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0x9,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0xc,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x2a,0x0,0x0,0x0,0x47,0x0,0x3,0x0,0x1b,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x1b,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x1b,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x1b,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x48,0x0,0x5,0x0,0x1b,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x13,0x0,0x2,0x0,0x2,0x0,0x0,0x0,0x21,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x16,0x0,0x3,0x0,0x6,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xb,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xb,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x17,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x15,0x0,0x4,0x0,0x18,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x18,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x1c,0x0,0x4,0x0,0x1a,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x19,0x0,0x0,0x0,0x1e,0x0,0x6,0x0,0x1b,0x0,0x0,0x0,0x17,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x1a,0x0,0x0,0x0,0x1a,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x1c,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x1b,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x1c,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x0,0x0,0x80,0x3f,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x29,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x17,0x0,0x0,0x0,0x36,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xf8,0x0,0x2,0x0,0x5,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0xc4,0x0,0x5,0x0,0xa,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0xc7,0x0,0x5,0x0,0xa,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x6f,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x11,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0xa,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0xc7,0x0,0x5,0x0,0xa,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x13,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x6f,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x14,0x0,0x0,0x0,0x50,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x16,0x0,0x0,0x0,0x12,0x0,0x0,0x0,0x15,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x9,0x0,0x0,0x0,0x16,0x0,0x0,0x0,0x3d,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x8e,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x1f,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x50,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x83,0x0,0x5,0x0,0x7,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x21,0x0,0x0,0x0,0x23,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x26,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x51,0x0,0x5,0x0,0x6,0x0,0x0,0x0,0x27,0x0,0x0,0x0,0x24,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x50,0x0,0x7,0x0,0x17,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0x26,0x0,0x0,0x0,0x27,0x0,0x0,0x0,0x25,0x0,0x0,0x0,0x22,0x0,0x0,0x0,0x41,0x0,0x5,0x0,0x29,0x0,0x0,0x0,0x2a,0x0,0x0,0x0,0x1d,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x2a,0x0,0x0,0x0,0x28,0x0,0x0,0x0,0xfd,0x0,0x1,0x0,0x38,0x0,0x1,0x0,}; + +CONSTEXPR UINT8 SHADER_SOURCE_UNLITMESH_FRAG[548] = { +0x3,0x2,0x23,0x7,0x0,0x0,0x1,0x0,0xb,0x0,0xd,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x11,0x0,0x2,0x0,0x1,0x0,0x0,0x0,0xb,0x0,0x6,0x0,0x1,0x0,0x0,0x0,0x47,0x4c,0x53,0x4c,0x2e,0x73,0x74,0x64,0x2e,0x34,0x35,0x30,0x0,0x0,0x0,0x0,0xe,0x0,0x3,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xf,0x0,0x7,0x0,0x4,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x10,0x0,0x3,0x0,0x4,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3,0x0,0x3,0x0,0x2,0x0,0x0,0x0,0xc2,0x1,0x0,0x0,0x4,0x0,0x9,0x0,0x47,0x4c,0x5f,0x41,0x52,0x42,0x5f,0x73,0x65,0x70,0x61,0x72,0x61,0x74,0x65,0x5f,0x73,0x68,0x61,0x64,0x65,0x72,0x5f,0x6f,0x62,0x6a,0x65,0x63,0x74,0x73,0x0,0x0,0x4,0x0,0xa,0x0,0x47,0x4c,0x5f,0x47,0x4f,0x4f,0x47,0x4c,0x45,0x5f,0x63,0x70,0x70,0x5f,0x73,0x74,0x79,0x6c,0x65,0x5f,0x6c,0x69,0x6e,0x65,0x5f,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x76,0x65,0x0,0x0,0x4,0x0,0x8,0x0,0x47,0x4c,0x5f,0x47,0x4f,0x4f,0x47,0x4c,0x45,0x5f,0x69,0x6e,0x63,0x6c,0x75,0x64,0x65,0x5f,0x64,0x69,0x72,0x65,0x63,0x74,0x69,0x76,0x65,0x0,0x5,0x0,0x4,0x0,0x4,0x0,0x0,0x0,0x6d,0x61,0x69,0x6e,0x0,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0x9,0x0,0x0,0x0,0x6f,0x75,0x74,0x43,0x6f,0x6c,0x6f,0x72,0x0,0x0,0x0,0x0,0x5,0x0,0x5,0x0,0xf,0x0,0x0,0x0,0x69,0x6e,0x54,0x65,0x78,0x43,0x6f,0x6f,0x72,0x64,0x0,0x0,0x47,0x0,0x4,0x0,0x9,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x47,0x0,0x4,0x0,0xf,0x0,0x0,0x0,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x13,0x0,0x2,0x0,0x2,0x0,0x0,0x0,0x21,0x0,0x3,0x0,0x3,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x16,0x0,0x3,0x0,0x6,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0x7,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0x8,0x0,0x0,0x0,0x9,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2b,0x0,0x4,0x0,0x6,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x0,0x0,0x80,0x3f,0x2c,0x0,0x7,0x0,0x7,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0xa,0x0,0x0,0x0,0xb,0x0,0x0,0x0,0x17,0x0,0x4,0x0,0xd,0x0,0x0,0x0,0x6,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x20,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0xd,0x0,0x0,0x0,0x3b,0x0,0x4,0x0,0xe,0x0,0x0,0x0,0xf,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x36,0x0,0x5,0x0,0x2,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0x0,0x0,0x0,0xf8,0x0,0x2,0x0,0x5,0x0,0x0,0x0,0x3e,0x0,0x3,0x0,0x9,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0xfd,0x0,0x1,0x0,0x38,0x0,0x1,0x0,}; + +} // namespace ia::iae diff --git a/Src/IAEngine/inc/IAEngine/Rendering/GPUBuffer.hpp b/Src/IAEngine/inc/IAEngine/Rendering/GPUBuffer.hpp new file mode 100644 index 0000000..67a9e2d --- /dev/null +++ b/Src/IAEngine/inc/IAEngine/Rendering/GPUBuffer.hpp @@ -0,0 +1,40 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + class Renderer; + + class GPUBuffer + { + public: + STATIC RefPtr Create(IN PCVOID data, IN UINT32 dataSize); + + private: + Handle m_handle{}; + + private: + STATIC BOOL InitializeStagingBuffer(); + STATIC VOID TerminateStagingBuffer(); + STATIC BOOL EnsureStagingBufferSize(IN UINT32 size); + + friend class Renderer; + }; +} // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/inc/IAEngine/Rendering/Mesh/Quad.hpp b/Src/IAEngine/inc/IAEngine/Rendering/Mesh/Quad.hpp new file mode 100644 index 0000000..11ca913 --- /dev/null +++ b/Src/IAEngine/inc/IAEngine/Rendering/Mesh/Quad.hpp @@ -0,0 +1,31 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + class QuadMesh + { + public: + STATIC VOID Initialize(); + STATIC VOID Terminate(); + + STATIC VOID Draw(IN CONST iam::Vec3f &position, IN CONST iam::Vec3f &scale, IN FLOAT32 rotation); + }; +} // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/inc/IAEngine/Rendering/Pipeline/Pipeline.hpp b/Src/IAEngine/inc/IAEngine/Rendering/Pipeline/Pipeline.hpp new file mode 100644 index 0000000..3af0cd8 --- /dev/null +++ b/Src/IAEngine/inc/IAEngine/Rendering/Pipeline/Pipeline.hpp @@ -0,0 +1,47 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + class IPipeline + { + public: + enum class ShaderStage + { + VERTEX, + PIXEL, + COMPUTE, + GEOMETRY + }; + + public: + PURE_VIRTUAL(VOID Bind(IN Handle renderPassHandle)); + + protected: + STATIC Handle LoadShaderFromMemory(IN ShaderStage stage, IN PCUINT8 sourceData, IN SIZE_T sourceLength, IN UINT32 samplerCount, + IN UINT32 uniformBufferCount, IN UINT32 storageBufferCount, + IN UINT32 storageTextureCount); + STATIC Handle LoadShaderFromFile(IN ShaderStage stage, IN PCCHAR fileName, IN UINT32 samplerCount, + IN UINT32 uniformBufferCount, IN UINT32 storageBufferCount, + IN UINT32 storageTextureCount); + + STATIC VOID UnloadShader(IN Handle handle); + }; +} // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/inc/IAEngine/Rendering/Pipeline/UnlitMesh.hpp b/Src/IAEngine/inc/IAEngine/Rendering/Pipeline/UnlitMesh.hpp new file mode 100644 index 0000000..355c5b1 --- /dev/null +++ b/Src/IAEngine/inc/IAEngine/Rendering/Pipeline/UnlitMesh.hpp @@ -0,0 +1,35 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + class Pipeline_UnlitMesh: public IPipeline + { + public: + ~Pipeline_UnlitMesh(); + + STATIC RefPtr Create(); + + VOID Bind(IN Handle renderPassHandle); + + private: + Handle m_handle{INVALID_HANDLE}; + }; +} \ No newline at end of file diff --git a/Src/IAEngine/inc/IAEngine/Rendering/Renderer.hpp b/Src/IAEngine/inc/IAEngine/Rendering/Renderer.hpp index 3b521b2..2327d19 100644 --- a/Src/IAEngine/inc/IAEngine/Rendering/Renderer.hpp +++ b/Src/IAEngine/inc/IAEngine/Rendering/Renderer.hpp @@ -44,6 +44,9 @@ namespace ia::iae STATIC VOID BeginFrame(); STATIC VOID EndFrame(); + STATIC VOID Draw(IN Handle vertexBufferHandle, IN INT32 vertexCount); + STATIC VOID Draw(IN Handle vertexBufferHandle, IN Handle indexBufferHandle, IN INT32 indexCount); + public: STATIC INT32 Width() { diff --git a/Src/IAEngine/inc/IAEngine/Rendering/Texture.hpp b/Src/IAEngine/inc/IAEngine/Rendering/Texture.hpp index 84460c0..187eeda 100644 --- a/Src/IAEngine/inc/IAEngine/Rendering/Texture.hpp +++ b/Src/IAEngine/inc/IAEngine/Rendering/Texture.hpp @@ -20,12 +20,10 @@ namespace ia::iae { - class Engine; - class Texture { public: - Texture(IN Engine* engine); + Texture(); ~Texture(); public: @@ -46,10 +44,5 @@ namespace ia::iae INT32 m_width; INT32 m_height; PVOID m_handle{}; - Engine* CONST m_engine; - - private: - friend class Engine; - friend class ResourceManager; }; } // namespace ia::iae \ No newline at end of file diff --git a/Src/IAEngine/inc/IAEngine/Rendering/Types.hpp b/Src/IAEngine/inc/IAEngine/Rendering/Types.hpp new file mode 100644 index 0000000..cb64285 --- /dev/null +++ b/Src/IAEngine/inc/IAEngine/Rendering/Types.hpp @@ -0,0 +1,30 @@ +// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#pragma once + +#include + +namespace ia::iae +{ + struct Vertex_Mesh + { + iam::Vec3f Position{}; + iam::Vec2f UV{}; + }; + + +} \ No newline at end of file diff --git a/Src/IAEngine/srcgen/embed_shaders.py b/Src/IAEngine/srcgen/embed_shaders.py new file mode 100644 index 0000000..b1d6c83 --- /dev/null +++ b/Src/IAEngine/srcgen/embed_shaders.py @@ -0,0 +1,61 @@ +import os + +GEN_SOURCE_PREFIX = """// IAEngine: 2D Game Engine by IA +// Copyright (C) 2025 IAS (ias@iasoft.dev) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +// ---------------------------------------------------------------------- +// GENERATED FILE. DO NOT EDIT. +// ---------------------------------------------------------------------- + +#pragma once + +#include + +namespace ia::iae +{ +""" + +GEN_SOURCE_SUFFIX = """} // namespace ia::iae\n""" +GEN_SOURCE_PATH = "Src/IAEngine/imp/hpp/EmbeddedShaders.hpp" +SHADER_SOURCE_PATH = "Src/IAEngine/imp/glsl" + +SHADER_SOURCE_FILES = [ + "UnlitMesh/UnlitMesh.vert", + "UnlitMesh/UnlitMesh.frag" +] + +def file_to_source_array(arrayName, filePath): + data = b'' + with open(filePath, 'rb') as f: + data = f.read() + res = f"CONSTEXPR UINT8 {arrayName}[{len(data)}] = {{\n" + for d in data: + res += f"{hex(d)}," + res += "};\n" + return res + +def main(): + with open(GEN_SOURCE_PATH, 'w') as outFile: + outFile.write(GEN_SOURCE_PREFIX) + for fileName in SHADER_SOURCE_FILES: + p = f"{SHADER_SOURCE_PATH}/{fileName}" + os.system(f"glslc {p} -o {p}.spv") + src = file_to_source_array(f"SHADER_SOURCE_{fileName.split('/')[-1].upper().replace('.', '_')}", f"{p}.spv") + outFile.write(f"{src}\n") + os.remove(f"{p}.spv") + outFile.write(GEN_SOURCE_SUFFIX) + +main()