diff --git a/private/sdl_gpu_test/1_green_triangle/app.cpp b/private/sdl_gpu_test/1_green_triangle/app.cpp index 612215e..e1f96f8 100644 --- a/private/sdl_gpu_test/1_green_triangle/app.cpp +++ b/private/sdl_gpu_test/1_green_triangle/app.cpp @@ -60,7 +60,7 @@ void GreenTriangleApp::init(const AppInitArgs& args) } }; mPipeline.create(mDevice, { - .vertexShader = vertexShader, + .vertexShader = vertexShader, .fragmentShader = fragmentShader, .targetInfo = { .colorTargetDescriptions = colorTargetsDescs diff --git a/private/sdl_gpu_test/3_textured_quad/app.cpp b/private/sdl_gpu_test/3_textured_quad/app.cpp index c430212..023461f 100644 --- a/private/sdl_gpu_test/3_textured_quad/app.cpp +++ b/private/sdl_gpu_test/3_textured_quad/app.cpp @@ -51,7 +51,7 @@ void TexturedQuadApp::init(const AppInitArgs& args) .dstColorBlendfactor = sdlpp::GPUBlendFactor::ONE_MINUS_SRC_ALPHA, .colorBlendOp = sdlpp::GPUBlendOp::ADD, .srcAlphaBlendfactor = sdlpp::GPUBlendFactor::ONE, - .dstAlphaBlendfactor = sdlpp::GPUBlendFactor::ZERO, + .dstAlphaBlendfactor = sdlpp::GPUBlendFactor::ONE, .alphaBlendOp = sdlpp::GPUBlendOp::ADD } } diff --git a/private/sdl_gpu_test/7_3d_scene/app.cpp b/private/sdl_gpu_test/7_3d_scene/app.cpp new file mode 100644 index 0000000..3200c98 --- /dev/null +++ b/private/sdl_gpu_test/7_3d_scene/app.cpp @@ -0,0 +1,298 @@ + +#include "./app.hpp" + +#include +#include +#include +#include +#include + +#include "../sdlpp/keyboard.hpp" +#include "../util/bitmap.hpp" +#include "../util/mesh.hpp" + +namespace sdl_gpu_test +{ +namespace +{ +inline constexpr float Y_POS_MIN = -10.f; +inline constexpr float Y_POS_MAX = 10.f; +inline constexpr Uint16 AXIS_DEADZONE = 5000; + +struct VertexShaderParameters +{ + glm::mat4 worldToView; + glm::mat4 viewToClip; +}; +} + +void ThreeDSceneApp::init(const AppInitArgs& args) +{ + Application::init(args); + + // create depth buffer + mDepthBuffer.create(mDevice, { + .format = sdlpp::GPUTextureFormat::D16_UNORM, + .usage = sdlpp::GPUTextureUsageFlags{.depthStencilTarget = true}, + .width = 1280, + .height = 720 + }); + + // create graphics pipeline + createMeshPipeline(); + + // create UI pipeline + mUIRenderer.init(*this); + + // load the mesh + const Mesh mesh = loadMesh(mFileSystem.getPath("meshes/cube.obj")); + mNumVertices = static_cast(mesh.vertices.size()); + + // create vertex buffer + mVertexBuffer.create(mDevice, { + .usage = {.vertex = true}, + .size = static_cast(mesh.vertices.size() * sizeof(Vertex)) + }); + uploadVertexData(mVertexBuffer, std::span(mesh.vertices)); + + // create texture and sampler + sdlpp::GPUTextureCreateArgs textureArgs = { + .format = sdlpp::GPUTextureFormat::R8G8B8A8_UNORM_SRGB, + .usage = {.sampler = true} + }; + mTexture = loadTexture("bitmaps/cube.png", textureArgs); + mSampler.create(mDevice, {}); + + // open gamepad + const std::vector gamepads = sdlpp::getGamepads(); + if (!gamepads.empty()) + { + mGamepad.open(gamepads[0]); + } + + // init the UI + mWidgetTree.init({.renderer = &mUIRenderer}); + mLabel = mWidgetTree.getRootWidget().emplaceChild