mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2025-10-30 07:11:05 +00:00
Implement ImGui additive rendering. (#152)
This commit is contained in:
parent
b4de79720c
commit
372c04fedd
5 changed files with 37 additions and 3 deletions
|
|
@ -22,6 +22,7 @@ enum class ImGuiCallback : int32_t
|
|||
SetOutline = -6,
|
||||
SetProceduralOrigin = -7,
|
||||
// -8 is ImDrawCallback_ResetRenderState, don't use!
|
||||
SetAdditive = -9
|
||||
};
|
||||
|
||||
union ImGuiCallbackData
|
||||
|
|
@ -64,6 +65,11 @@ union ImGuiCallbackData
|
|||
{
|
||||
float proceduralOrigin[2];
|
||||
} setProceduralOrigin;
|
||||
|
||||
struct
|
||||
{
|
||||
bool enabled;
|
||||
} setAdditive;
|
||||
};
|
||||
|
||||
extern ImGuiCallbackData* AddImGuiCallback(ImGuiCallback callback);
|
||||
|
|
|
|||
|
|
@ -1127,7 +1127,7 @@ namespace plume {
|
|||
desc.srcBlend = RenderBlend::SRC_ALPHA;
|
||||
desc.dstBlend = RenderBlend::INV_SRC_ALPHA;
|
||||
desc.blendOp = RenderBlendOperation::ADD;
|
||||
desc.srcBlendAlpha = RenderBlend::ONE;
|
||||
desc.srcBlendAlpha = RenderBlend::SRC_ALPHA;
|
||||
desc.dstBlendAlpha = RenderBlend::INV_SRC_ALPHA;
|
||||
desc.blendOpAlpha = RenderBlendOperation::ADD;
|
||||
return desc;
|
||||
|
|
|
|||
|
|
@ -1141,6 +1141,7 @@ static constexpr size_t SAMPLER_DESCRIPTOR_SIZE = 1024;
|
|||
static std::unique_ptr<GuestTexture> g_imFontTexture;
|
||||
static std::unique_ptr<RenderPipelineLayout> g_imPipelineLayout;
|
||||
static std::unique_ptr<RenderPipeline> g_imPipeline;
|
||||
static std::unique_ptr<RenderPipeline> g_imAdditivePipeline;
|
||||
|
||||
template<typename T>
|
||||
static void ExecuteCopyCommandList(const T& function)
|
||||
|
|
@ -1309,6 +1310,9 @@ static void CreateImGuiBackend()
|
|||
pipelineDesc.inputSlotsCount = 1;
|
||||
g_imPipeline = g_device->createGraphicsPipeline(pipelineDesc);
|
||||
|
||||
pipelineDesc.renderTargetBlend[0].dstBlend = RenderBlend::ONE;
|
||||
g_imAdditivePipeline = g_device->createGraphicsPipeline(pipelineDesc);
|
||||
|
||||
#ifndef ENABLE_IM_FONT_ATLAS_SNAPSHOT
|
||||
ImFontAtlasSnapshot snapshot;
|
||||
snapshot.Snap();
|
||||
|
|
@ -2091,9 +2095,10 @@ static void ProcDrawImGui(const RenderCommand& cmd)
|
|||
SetFramebuffer(g_backBuffer, nullptr, false);
|
||||
|
||||
auto& commandList = g_commandLists[g_frame];
|
||||
auto pipeline = g_imPipeline.get();
|
||||
|
||||
commandList->setGraphicsPipelineLayout(g_imPipelineLayout.get());
|
||||
commandList->setPipeline(g_imPipeline.get());
|
||||
commandList->setPipeline(pipeline);
|
||||
commandList->setGraphicsDescriptorSet(g_textureDescriptorSet.get(), 0);
|
||||
commandList->setGraphicsDescriptorSet(g_samplerDescriptorSet.get(), 1);
|
||||
|
||||
|
|
@ -2167,6 +2172,16 @@ static void ProcDrawImGui(const RenderCommand& cmd)
|
|||
case ImGuiCallback::SetProceduralOrigin:
|
||||
setPushConstants(&pushConstants.proceduralOrigin, &callbackData->setProceduralOrigin, sizeof(callbackData->setProceduralOrigin));
|
||||
break;
|
||||
case ImGuiCallback::SetAdditive:
|
||||
{
|
||||
auto pipelineToSet = callbackData->setAdditive.enabled ? g_imAdditivePipeline.get() : g_imPipeline.get();
|
||||
if (pipeline != pipelineToSet)
|
||||
{
|
||||
commandList->setPipeline(pipelineToSet);
|
||||
pipeline = pipelineToSet;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
assert(false && "Unknown ImGui callback type.");
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -108,6 +108,17 @@ inline void ResetProceduralOrigin()
|
|||
SetProceduralOrigin({ 0.0f, 0.0f });
|
||||
}
|
||||
|
||||
inline void SetAdditive(bool enabled)
|
||||
{
|
||||
auto callbackData = AddImGuiCallback(ImGuiCallback::SetAdditive);
|
||||
callbackData->setAdditive.enabled = enabled;
|
||||
}
|
||||
|
||||
inline void ResetAdditive()
|
||||
{
|
||||
SetAdditive(false);
|
||||
}
|
||||
|
||||
inline float Scale(float size)
|
||||
{
|
||||
return size * g_aspectRatioScale;
|
||||
|
|
|
|||
|
|
@ -613,13 +613,15 @@ static void DrawContainer(ImVec2 min, ImVec2 max, bool isTextArea)
|
|||
);
|
||||
double gridOverlayAlpha = ComputeMotionInstaller(g_appearTime, g_disappearTime, CONTAINER_INNER_TIME, CONTAINER_INNER_DURATION);
|
||||
|
||||
const uint32_t gridColor = IM_COL32(0, 33, 0, (isTextArea ? 128 : 255) * gridAlpha);
|
||||
const uint32_t gridColor = IM_COL32(0, 33, 0, (isTextArea ? 223 : 255) * gridAlpha);
|
||||
const uint32_t gridOverlayColor = IM_COL32(0, 32, 0, 128 * gridOverlayAlpha);
|
||||
|
||||
float gridSize = Scale(GRID_SIZE);
|
||||
|
||||
SetShaderModifier(IMGUI_SHADER_MODIFIER_CHECKERBOARD);
|
||||
SetAdditive(true);
|
||||
drawList->AddRectFilled(min, max, gridColor);
|
||||
SetAdditive(false);
|
||||
SetShaderModifier(IMGUI_SHADER_MODIFIER_NONE);
|
||||
|
||||
if (isTextArea)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue