Skip to content

Commit 3726b5d

Browse files
committed
Merge remote-tracking branch 'upstream/master' into scripting
2 parents 7a07623 + 56ca1ea commit 3726b5d

File tree

129 files changed

+3973
-4557
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

129 files changed

+3973
-4557
lines changed

CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@ add_subdirectory(apps/celview)
8787
add_subdirectory(apps/mpqtool)
8888
add_subdirectory(apps/exedump)
8989
add_subdirectory(apps/launcher)
90-
add_subdirectory(apps/fontgenerator)
9190
add_subdirectory(test)
9291

9392
if(MSVC)

apps/celview/main.cpp

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
#include "../components/settings/settings.h"
2+
#include <cel/celfile.h>
23
#include <chrono>
34
#include <faio/fafileobject.h>
45
#include <fmt/format.h>
56
#include <input/inputmanager.h>
7+
#include <misc/stringops.h>
68
#include <nfd.h>
79
#include <nuklearmisc/inputfwd.h>
810
#include <nuklearmisc/standaloneguispritehandler.h>
@@ -16,7 +18,9 @@ int main(int argc, char** argv)
1618
if (argc > 2)
1719
message_and_abort_fmt("Usage: %s [filename]", argv[0]);
1820

19-
Render::RenderSettings renderSettings;
21+
Cel::CelDecoder::loadConfigFiles();
22+
23+
Render::RenderSettings renderSettings = {};
2024
renderSettings.windowWidth = 800;
2125
renderSettings.windowHeight = 600;
2226
renderSettings.fullscreen = false;
@@ -29,12 +33,12 @@ int main(int argc, char** argv)
2933
settings.loadFromFile(Misc::getResourcesPath().str() + "/celview.ini");
3034

3135
bool faioInitDone = false;
32-
std::string listFile = settings.get<std::string>("celview", "listFile", "Diablo I.txt");
33-
std::string mpqFile = settings.get<std::string>("celview", "mpqFile", "DIABDAT.MPQ");
36+
auto listFile = settings.get<std::string>("celview", "listFile", "Diablo I.txt");
37+
auto mpqFile = settings.get<std::string>("celview", "mpqFile", "DIABDAT.MPQ");
3438

3539
std::vector<std::string> celFiles;
3640

37-
std::string selectedImage = "";
41+
std::string selectedImage;
3842
std::unique_ptr<NuklearMisc::GuiSprite> image;
3943

4044
std::unique_ptr<NuklearMisc::GuiSprite> nextImage;
@@ -67,7 +71,7 @@ int main(int argc, char** argv)
6771

6872
std::string label = selectedImage;
6973

70-
if (selectedImage == "")
74+
if (selectedImage.empty())
7175
label = "No image selected";
7276

7377
nk_label(ctx, label.c_str(), NK_TEXT_CENTERED);
@@ -76,31 +80,53 @@ int main(int argc, char** argv)
7680

7781
if (image)
7882
{
79-
nk_label(ctx, fmt::format("Number of Frames: {}", image.get()->getSprite()->size()).c_str(), NK_TEXT_LEFT);
80-
nk_label(ctx, fmt::format("Width: {}", image->getSprite()->getWidth()).c_str(), NK_TEXT_LEFT);
81-
nk_label(ctx, fmt::format("Height: {}", image->getSprite()->getHeight()).c_str(), NK_TEXT_LEFT);
82-
frame = nk_propertyi(ctx, "Frame", 0, frame, image->getSprite()->size(), 1, 0.2f);
83+
nk_label(ctx, fmt::format("Number of Frames: {}", image->size()).c_str(), NK_TEXT_LEFT);
84+
nk_label(ctx, fmt::format("Width: {}", image->getNkImage(frame).w).c_str(), NK_TEXT_LEFT);
85+
nk_label(ctx, fmt::format("Height: {}", image->getNkImage(frame).h).c_str(), NK_TEXT_LEFT);
86+
frame = nk_propertyi(ctx, "Frame", 0, frame, image->size(), 1, 0.2f);
8387

8488
if (nk_button_label(ctx, "save as png"))
8589
{
86-
nfdchar_t* outPath = NULL;
87-
nfdresult_t result = NFD_SaveDialog("png", NULL, &outPath);
90+
nfdchar_t* outPath = nullptr;
91+
nfdresult_t result = NFD_SaveDialog("png", nullptr, &outPath);
8892
if (result == NFD_OKAY)
8993
{
90-
Render::SpriteGroup::toPng(selectedImage, outPath);
91-
free(outPath);
94+
Cel::CelFile cel(selectedImage);
95+
std::vector<Image> images = cel.decode();
96+
97+
int32_t sumWidth = 0;
98+
int32_t maxHeight = 0;
99+
for (int32_t i = 0; i < int32_t(images.size()); i++)
100+
{
101+
sumWidth += images[i].width();
102+
if (images[i].height() > maxHeight)
103+
maxHeight = images[i].height();
104+
}
105+
106+
Image tmp(sumWidth, maxHeight);
107+
108+
int32_t x = 0;
109+
for (int32_t i = 0; i < int32_t(images.size()); i++)
110+
{
111+
images[i].blitTo(tmp, x, 0);
112+
x += images[i].width();
113+
}
114+
115+
Image::saveToPng(tmp, outPath);
92116
}
117+
free(outPath);
93118
}
94119

95120
if (nk_button_label(ctx, "save as gif"))
96121
{
97-
nfdchar_t* outPath = NULL;
98-
nfdresult_t result = NFD_SaveDialog("gif", NULL, &outPath);
122+
nfdchar_t* outPath = nullptr;
123+
nfdresult_t result = NFD_SaveDialog("gif", nullptr, &outPath);
99124
if (result == NFD_OKAY)
100125
{
101-
Render::SpriteGroup::toGif(selectedImage, outPath);
102-
free(outPath);
126+
Cel::CelDecoder cel(selectedImage);
127+
Image::saveToGif(cel.decode(), outPath);
103128
}
129+
free(outPath);
104130
}
105131

106132
auto msSinceLastFrame = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastFrame).count();
@@ -110,25 +136,23 @@ int main(int argc, char** argv)
110136
frame++;
111137
}
112138

113-
if (frame >= (int32_t)image.get()->getSprite()->size())
139+
if (frame >= (int32_t)image->size())
114140
frame = 0;
115141

116-
Render::Sprite sprite = image.get()->getSprite()->operator[](frame);
117-
118-
int32_t w, h;
119-
Render::spriteSize(sprite, w, h);
142+
int32_t w = image->getNkImage(frame).w;
143+
int32_t h = image->getNkImage(frame).h;
120144

121145
nk_layout_space_begin(ctx, NK_STATIC, h, 1);
122146
{
123147
nk_layout_space_push(ctx, nk_rect(0, 0, w, h));
124148

125149
auto canvas = nk_window_get_canvas(ctx);
126150

127-
struct nk_rect imageRect;
151+
struct nk_rect imageRect = {};
128152
nk_widget(&imageRect, ctx);
129153
nk_fill_rect(canvas, imageRect, 0.0, nk_rgb(0, 255, 0));
130154

131-
auto img = image.get()->getNkImage(frame);
155+
auto img = image->getNkImage(frame);
132156
nk_draw_image(canvas, imageRect, &img, nk_rgb(255, 255, 255));
133157
}
134158
nk_layout_space_end(ctx);
@@ -153,7 +177,9 @@ int main(int argc, char** argv)
153177
auto tmp = FAIO::listMpqFiles("*.cl2");
154178
celFiles.insert(celFiles.end(), tmp.begin(), tmp.end());
155179

156-
std::sort(celFiles.begin(), celFiles.end());
180+
std::sort(celFiles.begin(), celFiles.end(), [](const std::string& l, const std::string& r) {
181+
return Misc::StringUtils::toLower(l) < Misc::StringUtils::toLower(r);
182+
});
157183

158184
settings.set<std::string>("celview", "listFile", listFile);
159185
settings.set<std::string>("celview", "mpqFile", mpqFile);
@@ -165,25 +191,29 @@ int main(int argc, char** argv)
165191
{
166192
selectedImage = argv[1];
167193
frame = 0;
168-
nextImage = std::unique_ptr<NuklearMisc::GuiSprite>(guiHandler.getSprite(new Render::SpriteGroup(selectedImage, false)));
194+
195+
Cel::CelFile cel(selectedImage);
196+
nextImage = std::make_unique<NuklearMisc::GuiSprite>(cel.decode());
169197
}
170198
}
171199
}
172200

173201
nk_layout_row_dynamic(ctx, rowHeight, 1);
174202

175-
for (size_t i = 0; i < celFiles.size(); i++)
203+
for (auto& celFile : celFiles)
176204
{
177205
auto buttonStyle = ctx->style.button;
178206

179-
if (selectedImage == celFiles[i])
207+
if (selectedImage == celFile)
180208
buttonStyle.normal = buttonStyle.hover;
181209

182-
if (nk_button_label_styled(ctx, &buttonStyle, celFiles[i].c_str()))
210+
if (nk_button_label_styled(ctx, &buttonStyle, celFile.c_str()))
183211
{
184-
selectedImage = celFiles[i];
212+
selectedImage = celFile;
185213
frame = 0;
186-
nextImage = std::unique_ptr<NuklearMisc::GuiSprite>(guiHandler.getSprite(new Render::SpriteGroup(selectedImage, false)));
214+
215+
Cel::CelFile cel(selectedImage);
216+
nextImage = std::make_unique<NuklearMisc::GuiSprite>(cel.decode());
187217
}
188218
}
189219

apps/fontgenerator/CMakeLists.txt

Lines changed: 0 additions & 3 deletions
This file was deleted.

apps/fontgenerator/main.cpp

Lines changed: 0 additions & 112 deletions
This file was deleted.

apps/freeablo/CMakeLists.txt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ add_library(freeablo_lib # split into a library so I can link to it from tests
1010

1111
farender/renderer.cpp
1212
farender/renderer.h
13-
farender/spritecache.cpp
14-
farender/spritecache.h
15-
farender/spritemanager.cpp
16-
farender/spritemanager.h
1713
farender/animationplayer.cpp
1814
farender/animationplayer.h
1915
farender/fontinfo.cpp
2016
farender/fontinfo.h
17+
farender/spriteloader.cpp
18+
farender/spriteloader.h
19+
farender/spritegroup.cpp
20+
farender/spritegroup.h
2121

2222
faworld/actor/basestate.cpp
2323
faworld/actor/basestate.h
@@ -165,8 +165,7 @@ add_library(freeablo_lib # split into a library so I can link to it from tests
165165
fasavegame/objectidmapper.h
166166
fasavegame/objectidmapper.cpp
167167
fasavegame/gameloader.h
168-
fasavegame/gameloader.cpp
169-
)
168+
fasavegame/gameloader.cpp farender/levelrenderer.cpp farender/levelrenderer.h)
170169

171170
target_link_libraries(freeablo_lib PUBLIC NuklearMisc Render Audio Serial Input Random Image enet cxxopts fmt::fmt Script)
172171
target_include_directories(freeablo_lib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

0 commit comments

Comments
 (0)