Skip to content

Commit 45ff273

Browse files
committed
Editor : Enhanced StepInto & StepOver
1 parent 8d4a03c commit 45ff273

File tree

4 files changed

+65
-55
lines changed

4 files changed

+65
-55
lines changed

src/Editor/RaycastingCameraViewport.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class RaycastingCameraViewport
2727

2828
void DrawGUI()
2929
{
30-
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
30+
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(3, 0));
3131
ImGui::SetNextWindowSizeConstraints(ImVec2(400, 400), ImVec2((float)GetScreenWidth(), (float)GetScreenHeight()));
3232

3333
if (ImGui::Begin("3D View", nullptr, ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_MenuBar))

src/Editor/RenderingOrchestrator.hpp

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <vector>
55

66
#include "RaycastingCameraViewport.hpp"
7+
#include "Utils/DrawingHelper.hpp"
78

89
class RenderingOrchestrator
910
{
@@ -18,23 +19,17 @@ class RenderingOrchestrator
1819

1920
if(play)
2021
{
21-
InitilizeFrame(world, cam);
22-
23-
if(rasterizer.IsRenderIterationRemains())
22+
AllRenderItr(world, cam);
23+
}
24+
else
25+
{
26+
switch(invokeEvent)
2427
{
25-
OneRenderItr(true);
28+
case StepInto: OneRenderItr(world, cam); break;
29+
case StepOver: AllRenderItr(world, cam); break;
2630
}
2731

28-
while(rasterizer.IsRenderIterationRemains())
29-
{
30-
OneRenderItr(false);
31-
}
32-
}
33-
else if(stepByStepNewFrame)
34-
{
35-
stepByStepNewFrame = false;
36-
InitilizeFrame(world, cam);
37-
OneRenderItr(true);
32+
invokeEvent = None;
3833
}
3934
}
4035

@@ -64,67 +59,75 @@ class RenderingOrchestrator
6459
}
6560
}
6661

67-
void OneRenderItr(bool firstItr)
62+
void AllRenderItr(World &world, RaycastingCamera &cam)
6863
{
69-
if(rasterizer.IsRenderIterationRemains())
64+
do
7065
{
71-
auto& renderTexture = cameraViewport.GetRenderTexture();
72-
73-
BeginTextureMode(renderTexture);
74-
75-
if(firstItr)
76-
{
77-
ClearBackground(MY_BLACK);
78-
}
66+
OneRenderItr(world, cam);
67+
} while(rasterizer.IsRenderIterationRemains());
68+
}
7969

80-
rasterizer.RenderIteration();
81-
EndTextureMode();
70+
void OneRenderItr(World &world, RaycastingCamera &cam)
71+
{
72+
if(!rasterizer.IsRenderIterationRemains())
73+
{
74+
InitilizeFrame(world, cam);
75+
}
8276

83-
auto& ctx = rasterizer.GetContext();
84-
assert(rasterizingItrsTextures.size() >= ctx.currentRenderItr);
77+
assert(rasterizer.IsRenderIterationRemains());
8578

86-
auto& texture = rasterizingItrsTextures.at(ctx.currentRenderItr - 1);
79+
auto& renderTexture = cameraViewport.GetRenderTexture();
80+
auto& ctx = rasterizer.GetContext();
81+
82+
BeginTextureMode(renderTexture);
8783

88-
if(texture.id == 0)
84+
if(ctx.currentRenderItr == 0)
8985
{
90-
texture = LoadRenderTexture(renderTexture.texture.width, renderTexture.texture.height);
86+
ClearBackground(MY_BLACK);
9187
}
9288

93-
BeginTextureMode(texture);
94-
DrawTexture(renderTexture.texture, 0, 0, WHITE);
95-
EndTextureMode();
96-
}
97-
else
89+
rasterizer.RenderIteration();
90+
91+
EndTextureMode();
92+
93+
assert(rasterizingItrsTextures.size() >= ctx.currentRenderItr);
94+
assert(ctx.currentRenderItr > 0);
95+
96+
auto& texture = rasterizingItrsTextures.at(ctx.currentRenderItr - 1);
97+
98+
if(texture.id == 0)
9899
{
99-
stepByStepNewFrame = true;
100+
texture = LoadRenderTexture(renderTexture.texture.width, renderTexture.texture.height);
100101
}
102+
103+
BeginTextureMode(texture);
104+
DrawTextureFlippedY(renderTexture.texture, 0, 0, WHITE);
105+
EndTextureMode();
101106
}
102107

103108
void DrawGUI()
104109
{
105110
ImGui::Begin("Rendering");
106111

107-
if(ImGui::Button("Play"))
112+
constexpr const char* LabelPlay = "Play";
113+
constexpr const char* LabelPause = "Pause";
114+
115+
if(ImGui::Button(!play ? LabelPlay : LabelPause))
108116
{
109-
play = true;
117+
play = !play;
110118
}
111119
ImGui::SameLine();
112-
if(ImGui::Button("Pause"))
113-
{
114-
play = false;
115-
stepByStepNewFrame = true;
116-
}
117-
ImGui::SameLine();
118120
if(ImGui::Button("> Step") && !play)
119121
{
120-
OneRenderItr(stepByStepNewFrame);
122+
invokeEvent = StepInto;
121123
}
122124
ImGui::SameLine();
123125
if(ImGui::Button(">> Step") && !play)
124126
{
125-
127+
invokeEvent = StepOver;
126128
}
127129

130+
// Render Iterations UI
128131
{
129132
auto& ctx = rasterizer.GetContext();
130133

@@ -145,13 +148,11 @@ class RenderingOrchestrator
145148

146149
private:
147150
RaycastingCameraViewport& cameraViewport;
148-
149-
// Step By step
150-
bool play = true;
151-
bool stepByStepNewFrame = false;
152-
153151
WorldRasterizer rasterizer;
154152

153+
bool play = true;
154+
enum InvokeEvent { None, StepInto, StepOver };
155+
InvokeEvent invokeEvent { None };
155156
std::vector<RenderTexture> rasterizingItrsTextures;
156157
};
157158

src/Utils/DrawingHelper.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,13 @@ inline void DrawArrow(Vector2 start, Vector2 end, Color color = RED, float thick
2323
Vector2 arrowTipB = Vector2Add(arrowTipEnd, Vector2Scale(arrowLeftPerpDirection, arrowTipWidth));
2424

2525
DrawTriangle(end, arrowTipA, arrowTipB, color);
26+
}
27+
28+
void DrawTextureFlippedY(const Texture2D& texture, int posX, int posY, Color tint)
29+
{
30+
Rectangle sourceRec = { 0.0f, 0.0f, (float)texture.width, (float)-texture.height }; // Flip Y axis
31+
Rectangle destRec = { (float)posX, (float)posY, (float)texture.width, (float)texture.height };
32+
Vector2 origin = { 0.0f, 0.0f };
33+
34+
DrawTexturePro(texture, sourceRec, destRec, origin, 0.0f, tint);
2635
}

vendors/rlImGui/rlImGui.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ void rlImGuiImageRenderTextureFit(const RenderTexture* image, bool center)
616616
ImGui::SetCursorPosY(ImGui::GetCursorPosY() + (area.y / 2 - sizeY / 2));
617617
}
618618

619-
rlImGuiImageRect(&image->texture, sizeX, sizeY, Rectangle{ 0,0, float(image->texture.width), -float(image->texture.height) });
619+
rlImGuiImageRect(&image->texture, sizeX, sizeY, Rectangle{ 0, 0, float(image->texture.width), -float(image->texture.height) });
620620
}
621621

622622
void rlImGuiImageRenderTextureFitWidth(const RenderTexture* image)
@@ -629,7 +629,7 @@ void rlImGuiImageRenderTextureFitWidth(const RenderTexture* image)
629629

630630
ImVec2 area = ImGui::GetContentRegionAvail();
631631

632-
float scale = area.x / image->texture.width;
632+
float scale = area.x / image->texture.width;
633633

634634
int sizeX = int(image->texture.width * scale);
635635
int sizeY = int(image->texture.height * scale);

0 commit comments

Comments
 (0)