From f2edffd89893dde7ccdc5eed5851a344397b7396 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Thu, 28 May 2026 22:08:25 -0500 Subject: [PATCH] window resize with integer scaling --- Makefile | 4 ++-- data/renpy/images/flowers.png | Bin 20358 -> 18437 bytes include/renpy/composite/vulkan.h | 4 +++- shader/renpy_composite.hlsl | 20 ++++++++++++++++---- src/font/outline.cpp | 8 ++++---- src/main.cpp | 30 ++++++++++++++++-------------- src/renpy/composite/vulkan.cpp | 10 ++++++---- src/renpy/script.cpp | 2 +- src/renpy/vulkan.cpp | 12 ++++++------ 9 files changed, 54 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index c1f6d10..fa996e3 100644 --- a/Makefile +++ b/Makefile @@ -113,8 +113,8 @@ all: main %.o: %.s $(AS) $< -o $@ -#%.dds: %.png -# WINEDEBUG=-all wine $(HOME)/Texconv.exe -y -nogpu -nowic -dx10 --format BC7_UNORM_SRGB -m 1 $< -o $(dir $@) +%.dds: %.png + WINEDEBUG=-all wine $(HOME)/Texconv.exe -y -nogpu -nowic -dx10 --format BC7_UNORM_SRGB -m 1 $< -o $(dir $@) %.pcm: %.wav ffmpeg -loglevel quiet -y -i $< -c:a pcm_s16le -ar 48000 -ac 2 -f s16le $@ diff --git a/data/renpy/images/flowers.png b/data/renpy/images/flowers.png index 33de539a9ff589af8284472b373f34f6ee06547a..66456ac11cded9e510354b970c573088df5ad154 100644 GIT binary patch literal 18437 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 X9;LM2E2<~!00000NkvXXu0mjfJTbkw literal 20358 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 0) { - float4 color1 = Texture[1].Sample(ClosestSampler, input.Texture); + float4 color1 = Texture[1].Load(int3(input.Texture * float2(1280, 720), 0)); float4 color01 = mix(color0, color1, input.TextLerp); - float4 color2 = Texture[2].Sample(ClosestSampler, input.Texture); + float4 color2 = Texture[2].Load(int3(input.Texture * float2(1280, 720), 0)); color = mix(color01, color2, input.DissolveLerp); } else { color = color0; diff --git a/src/font/outline.cpp b/src/font/outline.cpp index 2f5d5eb..f0ea03a 100644 --- a/src/font/outline.cpp +++ b/src/font/outline.cpp @@ -709,7 +709,7 @@ namespace font::outline { if (state.say.stringIndex != -1u) { char const * const string = renpy::script::strings[state.say.stringIndex]; uint32_t x = textboxLeft << 6; - uint32_t y = 590 << 6; + uint32_t y = 600 << 6; centered(frameIndex, string, x, y, textboxLeft, textboxWidth, @@ -720,11 +720,11 @@ namespace font::outline { if (state.say.characterIndex != -1u) { const renpy::language::character & character = renpy::script::characters[state.say.characterIndex]; char const * const string = character.characterName; - uint32_t x = 580 << 6; - uint32_t y = 550 << 6; + uint32_t x = 550 << 6; + uint32_t y = 565 << 6; centered(frameIndex, string, x, y, - 580, 118, + 550, 180, outputIndex, character.color); } diff --git a/src/main.cpp b/src/main.cpp index 04ab839..33850d6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -443,22 +443,22 @@ void offscreenRender(VkCommandBuffer commandBuffer, int frameIndex, // viewport/scissor - VkViewport shadowViewport{ + VkViewport viewport{ .x = 0, .y = 0, - .width = static_cast(windowSize.x), - .height = static_cast(windowSize.y), + .width = 1280, + .height = 720, .minDepth = 0.0f, .maxDepth = 1.0f }; - vkCmdSetViewport(commandBuffer, 0, 1, &shadowViewport); - VkRect2D shadowScissor{ + vkCmdSetViewport(commandBuffer, 0, 1, &viewport); + VkRect2D scissor{ .extent{ - .width = (uint32_t)windowSize.x, - .height = (uint32_t)windowSize.y + .width = 1280, + .height = 720 } }; - vkCmdSetScissor(commandBuffer, 0, 1, &shadowScissor); + vkCmdSetScissor(commandBuffer, 0, 1, &scissor); // draw @@ -663,8 +663,9 @@ int main() // window and surface ////////////////////////////////////////////////////////////////////// - SDL_Window * window = SDL_CreateWindow("Vulkan", 1280, 720, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE); + SDL_Window * window = SDL_CreateWindow("The Road to Alysen", 1280, 720, SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE); SDL_CHECK_NONNULL(window); + SDL_CHECK(SDL_SetWindowMinimumSize(window, 1280, 720)); SDL_CHECK(SDL_Vulkan_CreateSurface(window, instance, nullptr, &surface)); SDL_CHECK(SDL_GetWindowSize(window, &windowSize.x, &windowSize.y)); VkSurfaceCapabilitiesKHR surfaceCapabilities{}; @@ -918,6 +919,7 @@ int main() renpy::interpreter interpreter_state; interpreter_state.reset(); + interpreter_state.pc = 11; ////////////////////////////////////////////////////////////////////// // renpy composite @@ -1338,16 +1340,16 @@ int main() VkViewport viewport{ .x = 0, .y = 0, - .width = static_cast(windowSize.x), - .height = static_cast(windowSize.y), + .width = static_cast(surfaceCapabilities.currentExtent.width), + .height = static_cast(surfaceCapabilities.currentExtent.height), .minDepth = 0.0f, .maxDepth = 1.0f }; vkCmdSetViewport(commandBuffer, 0, 1, &viewport); VkRect2D scissor{ .extent{ - .width = (uint32_t)windowSize.x, - .height = (uint32_t)windowSize.y + .width = (uint32_t)surfaceCapabilities.currentExtent.width, + .height = (uint32_t)surfaceCapabilities.currentExtent.height } }; vkCmdSetScissor(commandBuffer, 0, 1, &scissor); @@ -1374,7 +1376,7 @@ int main() dissolve_lerp = clamp01(delta / interpreter_state.dissolveDuration); text_lerp = clamp01(delta / textDissolveDuration); } - composite_state.draw(commandBuffer, frameIndex, dissolve_lerp, text_lerp); + composite_state.draw(commandBuffer, frameIndex, dissolve_lerp, text_lerp, surfaceCapabilities.currentExtent.width, surfaceCapabilities.currentExtent.height); vkCmdEndRendering(commandBuffer); diff --git a/src/renpy/composite/vulkan.cpp b/src/renpy/composite/vulkan.cpp index a95680e..4c498fa 100644 --- a/src/renpy/composite/vulkan.cpp +++ b/src/renpy/composite/vulkan.cpp @@ -215,7 +215,7 @@ namespace renpy::composite { { VkPushConstantRange pushConstantRange{ .stageFlags = VK_SHADER_STAGE_VERTEX_BIT, - .size = (sizeof (float)), + .size = (sizeof (float)) * 4, }; VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo{ @@ -387,12 +387,14 @@ namespace renpy::composite { void vulkan::draw(VkCommandBuffer commandBuffer, uint32_t frameIndex, float dissolveLerp, - float textLerp) + float textLerp, + float framebufferWidth, + float framebufferHeight) { vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); - float lerp[2] = { dissolveLerp, textLerp }; - vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, (sizeof (float)) * 2, lerp); + float constants[4] = { dissolveLerp, textLerp, framebufferWidth, framebufferHeight }; + vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, (sizeof (float)) * 4, constants); VkDescriptorSet descriptorSets[1] = { descriptorSet0, diff --git a/src/renpy/script.cpp b/src/renpy/script.cpp index 34d107a..c61b999 100644 --- a/src/renpy/script.cpp +++ b/src/renpy/script.cpp @@ -185,7 +185,7 @@ const int strings_length = (sizeof (strings)) / (sizeof (strings[0])); const language::character characters[] = { { .characterName = "Alice", .color = 0x00765e }, // 0 { .characterName = "Cat", .color = 0x590093 }, // 1 - { .characterName = "Eily", .color = 0x0b6092 }, // 2 + { .characterName = "Mouse Girls", .color = 0x0b6092 }, // 2 { .characterName = "Mouse Girls", .color = 0x000000 }, // 3 { .characterName = "Narrator", .color = 0x000000 }, // 4 { .characterName = "Leona", .color = 0x590093 }, // 5 diff --git a/src/renpy/vulkan.cpp b/src/renpy/vulkan.cpp index ff1e3de..12a9dec 100644 --- a/src/renpy/vulkan.cpp +++ b/src/renpy/vulkan.cpp @@ -545,20 +545,20 @@ namespace renpy { .imageIndex = -2, // white gradient 1 }; instanceMappedData[maximumImageCount * frameIndex + outputIndex++] = { - .size = {244, 200}, - .topLeft = {336, 720 - 200}, + .size = {216, 184}, + .topLeft = {336, 720 - 184}, .imageIndex = 0, // flower }; instanceMappedData[maximumImageCount * frameIndex + outputIndex++] = { - .size = {-244, 200}, - .topLeft = {1280 - (336 + 244), 720 - 200}, + .size = {-216, 184}, + .topLeft = {1280 - (336 + 216), 720 - 184}, .imageIndex = 0, // flower }; if (state.say.characterIndex != -1u) { instanceMappedData[maximumImageCount * frameIndex + outputIndex++] = { - .size = {148, 30}, - .topLeft = {560, 528}, + .size = {180, 30}, + .topLeft = {550, 542}, .color = 0x80ffffffu, .imageIndex = -4, // white gradient 2 };