diff --git a/projects/kiwano-imgui/kiwano-imgui.vcxproj b/projects/kiwano-imgui/kiwano-imgui.vcxproj
index 3b4e0927..80440720 100644
--- a/projects/kiwano-imgui/kiwano-imgui.vcxproj
+++ b/projects/kiwano-imgui/kiwano-imgui.vcxproj
@@ -3,9 +3,9 @@
-
-
-
+
+
+
@@ -21,8 +21,8 @@
-
-
+
+
{A7062ED8-8910-48A5-A3BC-C1612672571F}
@@ -112,4 +112,4 @@
-
+
\ No newline at end of file
diff --git a/projects/kiwano-imgui/kiwano-imgui.vcxproj.filters b/projects/kiwano-imgui/kiwano-imgui.vcxproj.filters
index 7a6139eb..c904e446 100644
--- a/projects/kiwano-imgui/kiwano-imgui.vcxproj.filters
+++ b/projects/kiwano-imgui/kiwano-imgui.vcxproj.filters
@@ -2,16 +2,31 @@
-
-
-
+
+ imgui_impl
+
+
+ imgui_impl
+
+
+ imgui_impl
+
-
-
+
+ imgui_impl
+
+
+ imgui_impl
+
+
+
+
+ {a11036bf-f334-4e51-aef2-15dd46be924d}
+
\ No newline at end of file
diff --git a/src/kiwano-imgui/ImGuiModule.cpp b/src/kiwano-imgui/ImGuiModule.cpp
index f65a4a5b..ae1f7b1f 100644
--- a/src/kiwano-imgui/ImGuiModule.cpp
+++ b/src/kiwano-imgui/ImGuiModule.cpp
@@ -8,7 +8,7 @@
#include
#include
#include
-#include
+#include
namespace kiwano
{
diff --git a/src/kiwano-imgui/imgui_impl.h b/src/kiwano-imgui/imgui_impl/imgui_impl.h
similarity index 93%
rename from src/kiwano-imgui/imgui_impl.h
rename to src/kiwano-imgui/imgui_impl/imgui_impl.h
index 31275492..bd98a2c5 100644
--- a/src/kiwano-imgui/imgui_impl.h
+++ b/src/kiwano-imgui/imgui_impl/imgui_impl.h
@@ -6,7 +6,7 @@
#if !defined(KGE_USE_DIRECTX10)
-#include
+#include
#include
inline bool ImGui_Impl_Init()
@@ -43,7 +43,7 @@ inline bool ImGui_Impl_CreateDeviceObjects()
#else
-#include
+#include
inline bool ImGui_Impl_Init()
{
diff --git a/src/kiwano-imgui/imgui_impl_dx10.cpp b/src/kiwano-imgui/imgui_impl/imgui_impl_dx10.cpp
similarity index 99%
rename from src/kiwano-imgui/imgui_impl_dx10.cpp
rename to src/kiwano-imgui/imgui_impl/imgui_impl_dx10.cpp
index 8bd81ed6..02296808 100644
--- a/src/kiwano-imgui/imgui_impl_dx10.cpp
+++ b/src/kiwano-imgui/imgui_impl/imgui_impl_dx10.cpp
@@ -1,6 +1,6 @@
// dear imgui: Renderer for Kiwano (DirectX10)
-#include
+#include
// DirectX
#include
diff --git a/src/kiwano-imgui/imgui_impl_dx10.h b/src/kiwano-imgui/imgui_impl/imgui_impl_dx10.h
similarity index 100%
rename from src/kiwano-imgui/imgui_impl_dx10.h
rename to src/kiwano-imgui/imgui_impl/imgui_impl_dx10.h
diff --git a/src/kiwano-imgui/imgui_impl_dx11.cpp b/src/kiwano-imgui/imgui_impl/imgui_impl_dx11.cpp
similarity index 99%
rename from src/kiwano-imgui/imgui_impl_dx11.cpp
rename to src/kiwano-imgui/imgui_impl/imgui_impl_dx11.cpp
index 5fccb34d..ba191fde 100644
--- a/src/kiwano-imgui/imgui_impl_dx11.cpp
+++ b/src/kiwano-imgui/imgui_impl/imgui_impl_dx11.cpp
@@ -1,6 +1,6 @@
// dear imgui: Renderer for Kiwano (DirectX11)
-#include
+#include
// DirectX
#include
diff --git a/src/kiwano-imgui/imgui_impl_dx11.h b/src/kiwano-imgui/imgui_impl/imgui_impl_dx11.h
similarity index 100%
rename from src/kiwano-imgui/imgui_impl_dx11.h
rename to src/kiwano-imgui/imgui_impl/imgui_impl_dx11.h
diff --git a/src/kiwano/2d/FrameSequence.cpp b/src/kiwano/2d/FrameSequence.cpp
index 48caeb99..24bceabe 100644
--- a/src/kiwano/2d/FrameSequence.cpp
+++ b/src/kiwano/2d/FrameSequence.cpp
@@ -24,6 +24,12 @@
namespace kiwano
{
+FrameSequencePtr FrameSequence::Create()
+{
+ FrameSequencePtr ptr = new (std::nothrow) FrameSequence;
+ return ptr;
+}
+
FrameSequencePtr FrameSequence::Create(Vector const& frames)
{
FrameSequencePtr ptr = new (std::nothrow) FrameSequence;
@@ -34,6 +40,17 @@ FrameSequencePtr FrameSequence::Create(Vector const& frames)
return ptr;
}
+FrameSequencePtr FrameSequence::Create(FramePtr frame, int cols, int rows, int max_num, float padding_x,
+ float padding_y)
+{
+ FrameSequencePtr ptr = new (std::nothrow) FrameSequence;
+ if (ptr)
+ {
+ ptr->AddFrames(frame, cols, rows, max_num, padding_x, padding_y);
+ }
+ return ptr;
+}
+
FrameSequence::FrameSequence() {}
FrameSequence::~FrameSequence() {}
@@ -60,6 +77,51 @@ void FrameSequence::AddFrames(Vector const& frames)
}
}
+void FrameSequence::AddFrames(FramePtr frame, int cols, int rows, int max_num, float padding_x, float padding_y)
+{
+ if (cols <= 0 || rows <= 0 || max_num == 0)
+ return;
+
+ if (!frame)
+ return;
+
+ Rect src_rect = frame->GetCropRect();
+ float raw_width = src_rect.GetWidth();
+ float raw_height = src_rect.GetHeight();
+ float width = (raw_width - (cols - 1) * padding_x) / cols;
+ float height = (raw_height - (rows - 1) * padding_y) / rows;
+
+ Vector frames;
+ frames.reserve((max_num > 0) ? max_num : (rows * cols));
+
+ int current_num = 0;
+
+ float dty = src_rect.GetTop();
+ for (int i = 0; i < rows; i++)
+ {
+ float dtx = src_rect.GetLeft();
+
+ for (int j = 0; j < cols; j++)
+ {
+ FramePtr ptr = new (std::nothrow) Frame;
+ if (ptr)
+ {
+ ptr->SetTexture(frame->GetTexture());
+ ptr->SetCropRect(Rect{ dtx, dty, dtx + width, dty + height });
+ frames.push_back(ptr);
+ ++current_num;
+ }
+ dtx += (width + padding_x);
+ }
+ dty += (height + padding_y);
+
+ if (max_num > 0 && current_num == max_num)
+ break;
+ }
+
+ AddFrames(frames);
+}
+
FramePtr FrameSequence::GetFrame(size_t index) const
{
KGE_ASSERT(index < frames_.size());
diff --git a/src/kiwano/2d/FrameSequence.h b/src/kiwano/2d/FrameSequence.h
index b4fa6bb6..d6255918 100644
--- a/src/kiwano/2d/FrameSequence.h
+++ b/src/kiwano/2d/FrameSequence.h
@@ -34,11 +34,26 @@ KGE_DECLARE_SMART_PTR(FrameSequence);
class KGE_API FrameSequence : public virtual ObjectBase
{
public:
+ /// \~chinese
+ /// @brief 创建序列帧
+ static FrameSequencePtr Create();
+
/// \~chinese
/// @brief 创建序列帧
/// @param frames 图像帧集合
static FrameSequencePtr Create(Vector const& frames);
+ /// \~chinese
+ /// @brief 按行列分割图像并创建序列帧
+ /// @param frame 图像帧
+ /// @param cols 列数
+ /// @param rows 行数
+ /// @param max_num 最大帧数量,设-1为将分割后的图像全部作为序列帧
+ /// @param padding_x X方向间隔
+ /// @param padding_y Y方向间隔
+ static FrameSequencePtr Create(FramePtr frame, int cols, int rows = 1, int max_num = -1, float padding_x = 0,
+ float padding_y = 0);
+
/// \~chinese
/// @brief 构建空序列帧
FrameSequence();
@@ -55,6 +70,16 @@ public:
/// @param frames 图像帧集合
void AddFrames(Vector const& frames);
+ /// \~chinese
+ /// @brief 按行列分割图像并添加序列帧
+ /// @param frame 图像帧
+ /// @param cols 列数
+ /// @param rows 行数
+ /// @param max_num 最大帧数量,设-1为将分割后的图像全部作为序列帧
+ /// @param padding_x X方向间隔
+ /// @param padding_y Y方向间隔
+ void AddFrames(FramePtr frame, int cols, int rows = 1, int max_num = -1, float padding_x = 0, float padding_y = 0);
+
/// \~chinese
/// @brief 获取关键帧
/// @param index 图像帧下标