git repos / blockattack-game

blame: source/code/editor/SagoTextureSelector.cpp

normal view · raw

1828235c Poul Sander 2025-08-10 10:46 1
/*
1828235c Poul Sander 2025-08-10 10:46 2
===========================================================================
1828235c Poul Sander 2025-08-10 10:46 3
 * Sago Multi Scrambler Puzzle
1828235c Poul Sander 2025-08-10 10:46 4
Copyright (C) 2022-2024 Poul Sander
1828235c Poul Sander 2025-08-10 10:46 5
1828235c Poul Sander 2025-08-10 10:46 6
This program is free software: you can redistribute it and/or modify
1828235c Poul Sander 2025-08-10 10:46 7
it under the terms of the GNU General Public License as published by
1828235c Poul Sander 2025-08-10 10:46 8
the Free Software Foundation, either version 2 of the License, or
1828235c Poul Sander 2025-08-10 10:46 9
(at your option) any later version.
1828235c Poul Sander 2025-08-10 10:46 10
1828235c Poul Sander 2025-08-10 10:46 11
This program is distributed in the hope that it will be useful,
1828235c Poul Sander 2025-08-10 10:46 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
1828235c Poul Sander 2025-08-10 10:46 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1828235c Poul Sander 2025-08-10 10:46 14
GNU General Public License for more details.
1828235c Poul Sander 2025-08-10 10:46 15
1828235c Poul Sander 2025-08-10 10:46 16
You should have received a copy of the GNU General Public License
1828235c Poul Sander 2025-08-10 10:46 17
along with this program.  If not, see http://www.gnu.org/licenses/
1828235c Poul Sander 2025-08-10 10:46 18
1828235c Poul Sander 2025-08-10 10:46 19
Source information and contacts persons can be found at
1828235c Poul Sander 2025-08-10 10:46 20
https://github.com/sago007/saland
1828235c Poul Sander 2025-08-10 10:46 21
===========================================================================
1828235c Poul Sander 2025-08-10 10:46 22
*/
1828235c Poul Sander 2025-08-10 10:46 23
1828235c Poul Sander 2025-08-10 10:46 24
#include "SagoTextureSelector.hpp"
1828235c Poul Sander 2025-08-10 10:46 25
#include <iostream>
1828235c Poul Sander 2025-08-10 10:46 26
#include "imgui.h"
1828235c Poul Sander 2025-08-10 10:46 27
#include "backends/imgui_impl_sdl2.h"
1828235c Poul Sander 2025-08-10 10:46 28
#include "backends/imgui_impl_sdlrenderer2.h"
1828235c Poul Sander 2025-08-10 10:46 29
#include <SDL_image.h>
1828235c Poul Sander 2025-08-10 10:46 30
#include "../../sago/SagoMisc.hpp"
1828235c Poul Sander 2025-08-10 10:46 31
#include "../global.hpp"
c461394a Poul Sander 2025-09-17 20:23 32
#include "../common.h"
c461394a Poul Sander 2025-09-17 20:23 33
c461394a Poul Sander 2025-09-17 20:23 34
const char* const editor_texture_grid_size = "editor_texture_grid_size";
1828235c Poul Sander 2025-08-10 10:46 35
1828235c Poul Sander 2025-08-10 10:46 36
1828235c Poul Sander 2025-08-10 10:46 37
class ChangeSDLColor
1828235c Poul Sander 2025-08-10 10:46 38
{
1828235c Poul Sander 2025-08-10 10:46 39
public:
1828235c Poul Sander 2025-08-10 10:46 40
	ChangeSDLColor(SDL_Renderer* renderer, Uint8 r, Uint8 g, Uint8 b, Uint8 a) : renderer(renderer) {
1828235c Poul Sander 2025-08-10 10:46 41
		SDL_GetRenderDrawColor(renderer, &oldr, &oldg, &oldb, &olda);
1828235c Poul Sander 2025-08-10 10:46 42
		SDL_SetRenderDrawColor(renderer, r, g, b, a);
1828235c Poul Sander 2025-08-10 10:46 43
	}
1828235c Poul Sander 2025-08-10 10:46 44
1828235c Poul Sander 2025-08-10 10:46 45
	ChangeSDLColor(SDL_Renderer* renderer) : renderer(renderer) {
1828235c Poul Sander 2025-08-10 10:46 46
		SDL_GetRenderDrawColor(renderer, &oldr, &oldg, &oldb, &olda);
1828235c Poul Sander 2025-08-10 10:46 47
	}
1828235c Poul Sander 2025-08-10 10:46 48
1828235c Poul Sander 2025-08-10 10:46 49
	void setRed() {
1828235c Poul Sander 2025-08-10 10:46 50
		SDL_SetRenderDrawColor(renderer, 255, 0, 0, SDL_ALPHA_OPAQUE);
1828235c Poul Sander 2025-08-10 10:46 51
	}
1828235c Poul Sander 2025-08-10 10:46 52
1828235c Poul Sander 2025-08-10 10:46 53
	void setYellow() {
1828235c Poul Sander 2025-08-10 10:46 54
		SDL_SetRenderDrawColor(renderer, 255, 255, 0, SDL_ALPHA_OPAQUE);
1828235c Poul Sander 2025-08-10 10:46 55
	}
1828235c Poul Sander 2025-08-10 10:46 56
1828235c Poul Sander 2025-08-10 10:46 57
	void reset() {
1828235c Poul Sander 2025-08-10 10:46 58
		SDL_SetRenderDrawColor(renderer, oldr, oldg, oldb, olda);
1828235c Poul Sander 2025-08-10 10:46 59
	}
1828235c Poul Sander 2025-08-10 10:46 60
1828235c Poul Sander 2025-08-10 10:46 61
	~ChangeSDLColor() {
1828235c Poul Sander 2025-08-10 10:46 62
		SDL_SetRenderDrawColor(renderer, oldr, oldg, oldb, olda);
1828235c Poul Sander 2025-08-10 10:46 63
	}
1828235c Poul Sander 2025-08-10 10:46 64
1828235c Poul Sander 2025-08-10 10:46 65
private:
1828235c Poul Sander 2025-08-10 10:46 66
	SDL_Renderer* renderer;
1828235c Poul Sander 2025-08-10 10:46 67
	Uint8 oldr, oldg, oldb, olda;
1828235c Poul Sander 2025-08-10 10:46 68
};
1828235c Poul Sander 2025-08-10 10:46 69
1828235c Poul Sander 2025-08-10 10:46 70
1828235c Poul Sander 2025-08-10 10:46 71
static void addLinesToCanvas(SDL_Renderer* renderer, SDL_Texture* texture, int xstep = 32, int ystep = 32, int xoffset = 0, int yoffset = 0) {
1828235c Poul Sander 2025-08-10 10:46 72
	int width, height;
1828235c Poul Sander 2025-08-10 10:46 73
	SDL_QueryTexture(texture, nullptr, nullptr, &width, &height);
1828235c Poul Sander 2025-08-10 10:46 74
	Uint8 r, g, b, a;
1828235c Poul Sander 2025-08-10 10:46 75
	SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a);
1828235c Poul Sander 2025-08-10 10:46 76
1828235c Poul Sander 2025-08-10 10:46 77
	if (xstep > 0) {
1828235c Poul Sander 2025-08-10 10:46 78
		for (int i = 0; i < width+1; i += xstep) {
1828235c Poul Sander 2025-08-10 10:46 79
			ImGui::GetWindowDrawList()->AddLine(ImVec2(i+xoffset, yoffset), ImVec2(i+xoffset, height+yoffset), IM_COL32(r, g, b, a));
1828235c Poul Sander 2025-08-10 10:46 80
		}
1828235c Poul Sander 2025-08-10 10:46 81
	}
1828235c Poul Sander 2025-08-10 10:46 82
	if (ystep > 0) {
1828235c Poul Sander 2025-08-10 10:46 83
		for (int i = 0; i < height+1; i += ystep) {
1828235c Poul Sander 2025-08-10 10:46 84
			ImGui::GetWindowDrawList()->AddLine(ImVec2(xoffset, i+yoffset), ImVec2(width+xoffset, i+yoffset), IM_COL32(r, g, b, a));
1828235c Poul Sander 2025-08-10 10:46 85
		}
1828235c Poul Sander 2025-08-10 10:46 86
	}
1828235c Poul Sander 2025-08-10 10:46 87
}
1828235c Poul Sander 2025-08-10 10:46 88
1828235c Poul Sander 2025-08-10 10:46 89
static void addRectableToCanvas(SDL_Renderer* renderer, int topx = 0, int topy = 0, int height = 100, int width = 100, int xoffset = 0, int yoffset = 0) {
1828235c Poul Sander 2025-08-10 10:46 90
	Uint8 r, g, b, a;
1828235c Poul Sander 2025-08-10 10:46 91
	SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a);
1828235c Poul Sander 2025-08-10 10:46 92
	topx += xoffset;
1828235c Poul Sander 2025-08-10 10:46 93
	topy += yoffset;
1828235c Poul Sander 2025-08-10 10:46 94
	ImGui::GetWindowDrawList()->AddLine(ImVec2(topx, topy), ImVec2(topx+width, topy), IM_COL32(r, g, b, a));
1828235c Poul Sander 2025-08-10 10:46 95
	ImGui::GetWindowDrawList()->AddLine(ImVec2(topx+width, topy), ImVec2(topx+width, topy+height), IM_COL32(r, g, b, a));
1828235c Poul Sander 2025-08-10 10:46 96
	ImGui::GetWindowDrawList()->AddLine(ImVec2(topx+width, topy+height), ImVec2(topx, topy+height), IM_COL32(r, g, b, a));
1828235c Poul Sander 2025-08-10 10:46 97
	ImGui::GetWindowDrawList()->AddLine(ImVec2(topx, topy+height), ImVec2(topx, topy), IM_COL32(r, g, b, a));
1828235c Poul Sander 2025-08-10 10:46 98
}
1828235c Poul Sander 2025-08-10 10:46 99
1828235c Poul Sander 2025-08-10 10:46 100
static void addFolderToList(const std::string& folder, std::vector<std::string>& list, const std::string& filter = "") {
1828235c Poul Sander 2025-08-10 10:46 101
	std::vector<std::string> textures = sago::GetFileList(folder.c_str());
1828235c Poul Sander 2025-08-10 10:46 102
	for (const auto& texture : textures) {
1828235c Poul Sander 2025-08-10 10:46 103
		std::cout << "Texture: " << texture << "\n";
1828235c Poul Sander 2025-08-10 10:46 104
		if (texture.find(".png") == std::string::npos) {
1828235c Poul Sander 2025-08-10 10:46 105
			continue;
1828235c Poul Sander 2025-08-10 10:46 106
		}
1828235c Poul Sander 2025-08-10 10:46 107
		if (filter.empty() || texture.find(filter) != std::string::npos) {
1828235c Poul Sander 2025-08-10 10:46 108
			list.push_back(texture);
1828235c Poul Sander 2025-08-10 10:46 109
		}
1828235c Poul Sander 2025-08-10 10:46 110
	}
1828235c Poul Sander 2025-08-10 10:46 111
}
1828235c Poul Sander 2025-08-10 10:46 112
1828235c Poul Sander 2025-08-10 10:46 113
static std::vector<std::string> populateTree(const std::string& filter = "") {
1828235c Poul Sander 2025-08-10 10:46 114
	std::vector<std::string> textures;
1828235c Poul Sander 2025-08-10 10:46 115
	addFolderToList("textures", textures, filter);
1828235c Poul Sander 2025-08-10 10:46 116
	return textures;
1828235c Poul Sander 2025-08-10 10:46 117
}
1828235c Poul Sander 2025-08-10 10:46 118
1828235c Poul Sander 2025-08-10 10:46 119
std::string remove_file_extension(const std::string& filename) {
1828235c Poul Sander 2025-08-10 10:46 120
	size_t lastindex = filename.find_last_of(".");
1828235c Poul Sander 2025-08-10 10:46 121
	return filename.substr(0, lastindex);
1828235c Poul Sander 2025-08-10 10:46 122
}
1828235c Poul Sander 2025-08-10 10:46 123
1828235c Poul Sander 2025-08-10 10:46 124
1828235c Poul Sander 2025-08-10 10:46 125
static void ImGuiWritePartOfImage(SDL_Texture* texture, int topx, int topy, int w, int h) {
1828235c Poul Sander 2025-08-10 10:46 126
	int tex_w, tex_h;
1828235c Poul Sander 2025-08-10 10:46 127
	SDL_QueryTexture(texture, nullptr, nullptr, &tex_w, &tex_h);
1828235c Poul Sander 2025-08-10 10:46 128
	float sprite_w = w;
1828235c Poul Sander 2025-08-10 10:46 129
	float sprite_h = h;
1828235c Poul Sander 2025-08-10 10:46 130
	float topxf = topx;
1828235c Poul Sander 2025-08-10 10:46 131
	float topyf = topy;
1828235c Poul Sander 2025-08-10 10:46 132
	ImVec2 uv0 = ImVec2(topxf / tex_w, topyf / tex_h);
1828235c Poul Sander 2025-08-10 10:46 133
	ImVec2 uv1 = ImVec2((topxf + sprite_w) / tex_w, (topyf + sprite_h) / tex_h);
1828235c Poul Sander 2025-08-10 10:46 134
	ImGui::Image((ImTextureID)(intptr_t)texture, ImVec2((float)w, (float)h), uv0, uv1);
1828235c Poul Sander 2025-08-10 10:46 135
}
1828235c Poul Sander 2025-08-10 10:46 136
1828235c Poul Sander 2025-08-10 10:46 137
void SagoTextureSelector::runSpriteSelectorFrame(SDL_Renderer* target) {
1828235c Poul Sander 2025-08-10 10:46 138
	ImGui::Begin("SpriteList", nullptr, ImGuiWindowFlags_NoCollapse);
1828235c Poul Sander 2025-08-10 10:46 139
	static char filter[256] = "";
1828235c Poul Sander 2025-08-10 10:46 140
	ImGui::InputText("Filter", filter, IM_ARRAYSIZE(filter));
1828235c Poul Sander 2025-08-10 10:46 141
	ImGui::Separator();
1828235c Poul Sander 2025-08-10 10:46 142
	for (const auto& sprite : sprites) {
1828235c Poul Sander 2025-08-10 10:46 143
		std::string sprite_name = sprite.first;
1828235c Poul Sander 2025-08-10 10:46 144
		if (filter[0] == '\0' || sprite_name.find(filter) != std::string::npos) {
1828235c Poul Sander 2025-08-10 10:46 145
			if (ImGui::Selectable(sprite_name.c_str(), selected_sprite == sprite_name)) {
1828235c Poul Sander 2025-08-10 10:46 146
				selected_sprite = sprite_name;
1828235c Poul Sander 2025-08-10 10:46 147
			}
1828235c Poul Sander 2025-08-10 10:46 148
		}
1828235c Poul Sander 2025-08-10 10:46 149
	}
1828235c Poul Sander 2025-08-10 10:46 150
1828235c Poul Sander 2025-08-10 10:46 151
	ImGui::End();
1828235c Poul Sander 2025-08-10 10:46 152
1828235c Poul Sander 2025-08-10 10:46 153
	ImGui::Begin("SpriteViewer");
1828235c Poul Sander 2025-08-10 10:46 154
	if (selected_sprite.length()) {
1828235c Poul Sander 2025-08-10 10:46 155
		const SagoSprite& current_sprite = sprites[selected_sprite];
1828235c Poul Sander 2025-08-10 10:46 156
		SDL_Texture* current_texture = globalData.dataHolder->getTexturePtr(current_sprite.texture);
1828235c Poul Sander 2025-08-10 10:46 157
		ImGui::Text("Size: %d x %d", current_sprite.width, current_sprite.height);
1828235c Poul Sander 2025-08-10 10:46 158
		ImGui::BeginChild("Test");
1828235c Poul Sander 2025-08-10 10:46 159
		int offset = current_sprite.width * (SDL_GetTicks()/current_sprite.frame_time % current_sprite.number_of_frames);
1828235c Poul Sander 2025-08-10 10:46 160
		ImGuiWritePartOfImage(current_texture, current_sprite.topx+offset, current_sprite.topy, current_sprite.width, current_sprite.height);
1828235c Poul Sander 2025-08-10 10:46 161
		ImGui::EndChild();
1828235c Poul Sander 2025-08-10 10:46 162
	}
1828235c Poul Sander 2025-08-10 10:46 163
	ImGui::End();
1828235c Poul Sander 2025-08-10 10:46 164
1828235c Poul Sander 2025-08-10 10:46 165
	ImGui::Begin("SpriteTexture");
1828235c Poul Sander 2025-08-10 10:46 166
	if (selected_sprite.length() && sprites[selected_sprite].texture.length()) {
1828235c Poul Sander 2025-08-10 10:46 167
		int tex_w, tex_h;
1828235c Poul Sander 2025-08-10 10:46 168
		const SagoSprite& current_sprite = sprites[selected_sprite];
1828235c Poul Sander 2025-08-10 10:46 169
		SDL_Texture* current_texture = globalData.dataHolder->getTexturePtr(current_sprite.texture);
1828235c Poul Sander 2025-08-10 10:46 170
		SDL_QueryTexture(current_texture, nullptr, nullptr, &tex_w, &tex_h);
1828235c Poul Sander 2025-08-10 10:46 171
		ImGui::Text("Size: %d x %d", tex_w, tex_h);
1828235c Poul Sander 2025-08-10 10:46 172
		ImGui::BeginChild("Test");
1828235c Poul Sander 2025-08-10 10:46 173
		ImVec2 p = ImGui::GetCursorScreenPos();
1828235c Poul Sander 2025-08-10 10:46 174
		ImGui::Image((ImTextureID)(intptr_t)current_texture, ImVec2((float)tex_w, (float)tex_h));
1828235c Poul Sander 2025-08-10 10:46 175
		ChangeSDLColor color(target);
1828235c Poul Sander 2025-08-10 10:46 176
		color.setYellow();
1828235c Poul Sander 2025-08-10 10:46 177
		for (int i = 1; i < current_sprite.number_of_frames; i++) {
1828235c Poul Sander 2025-08-10 10:46 178
			addRectableToCanvas(target, current_sprite.topx+i*current_sprite.width, current_sprite.topy, current_sprite.height, current_sprite.width,  p.x, p.y);
1828235c Poul Sander 2025-08-10 10:46 179
		}
1828235c Poul Sander 2025-08-10 10:46 180
		color.setRed();
1828235c Poul Sander 2025-08-10 10:46 181
		addRectableToCanvas(target, current_sprite.topx, current_sprite.topy, current_sprite.height, current_sprite.width,  p.x, p.y);
1828235c Poul Sander 2025-08-10 10:46 182
		ImGui::EndChild();
1828235c Poul Sander 2025-08-10 10:46 183
	}
1828235c Poul Sander 2025-08-10 10:46 184
	ImGui::End();
1828235c Poul Sander 2025-08-10 10:46 185
}
1828235c Poul Sander 2025-08-10 10:46 186
1828235c Poul Sander 2025-08-10 10:46 187
void SagoTextureSelector::runTextureSelectorFrame(SDL_Renderer* target) {
1828235c Poul Sander 2025-08-10 10:46 188
	ImGui::Begin("TextureList", nullptr, ImGuiWindowFlags_NoCollapse);
c461394a Poul Sander 2025-09-17 20:23 189
	if (ImGui::SliderInt("grid size", &grid_size, 0, 100))
c461394a Poul Sander 2025-09-17 20:23 190
	{
c461394a Poul Sander 2025-09-17 20:23 191
		Config::getInstance()->setInt(editor_texture_grid_size, grid_size);
c461394a Poul Sander 2025-09-17 20:23 192
	}
1828235c Poul Sander 2025-08-10 10:46 193
	static char filter[256] = "";
1828235c Poul Sander 2025-08-10 10:46 194
	ImGui::InputText("Filter", filter, IM_ARRAYSIZE(filter));
1828235c Poul Sander 2025-08-10 10:46 195
	ImGui::Separator();
1828235c Poul Sander 2025-08-10 10:46 196
	for (const auto& texture : textures) {
1828235c Poul Sander 2025-08-10 10:46 197
		if (filter[0] == '\0' || texture.find(filter) != std::string::npos) {
1828235c Poul Sander 2025-08-10 10:46 198
			if (ImGui::Selectable(texture.c_str(), selected_texture == texture)) {
1828235c Poul Sander 2025-08-10 10:46 199
				selected_texture = texture;
1828235c Poul Sander 2025-08-10 10:46 200
			}
1828235c Poul Sander 2025-08-10 10:46 201
		}
1828235c Poul Sander 2025-08-10 10:46 202
	}
1828235c Poul Sander 2025-08-10 10:46 203
	ImGui::End();
1828235c Poul Sander 2025-08-10 10:46 204
1828235c Poul Sander 2025-08-10 10:46 205
	ImGui::Begin("TextureViewer");
1828235c Poul Sander 2025-08-10 10:46 206
	if (selected_texture.length()) {
1828235c Poul Sander 2025-08-10 10:46 207
		int tex_w, tex_h;
1828235c Poul Sander 2025-08-10 10:46 208
		SDL_Texture* current_texture = globalData.dataHolder->getTexturePtr(remove_file_extension(selected_texture));
1828235c Poul Sander 2025-08-10 10:46 209
		SDL_QueryTexture(current_texture, nullptr, nullptr, &tex_w, &tex_h);
1828235c Poul Sander 2025-08-10 10:46 210
		ImGui::Text("Size: %d x %d", tex_w, tex_h);
1828235c Poul Sander 2025-08-10 10:46 211
		ImGui::BeginChild("Test");
1828235c Poul Sander 2025-08-10 10:46 212
		ImVec2 p = ImGui::GetCursorScreenPos();
1828235c Poul Sander 2025-08-10 10:46 213
		ImGui::Image((ImTextureID)(intptr_t)current_texture, ImVec2((float)tex_w, (float)tex_h));
1828235c Poul Sander 2025-08-10 10:46 214
		ChangeSDLColor color(target);
1828235c Poul Sander 2025-08-10 10:46 215
		color.setRed();
c461394a Poul Sander 2025-09-17 20:23 216
		if (grid_size)
c461394a Poul Sander 2025-09-17 20:23 217
		{
c461394a Poul Sander 2025-09-17 20:23 218
			addLinesToCanvas(target, current_texture, grid_size, grid_size, p.x, p.y);
c461394a Poul Sander 2025-09-17 20:23 219
		}
1828235c Poul Sander 2025-08-10 10:46 220
		ImGui::EndChild();
1828235c Poul Sander 2025-08-10 10:46 221
	}
1828235c Poul Sander 2025-08-10 10:46 222
	ImGui::End();
1828235c Poul Sander 2025-08-10 10:46 223
1828235c Poul Sander 2025-08-10 10:46 224
}
1828235c Poul Sander 2025-08-10 10:46 225
1828235c Poul Sander 2025-08-10 10:46 226
1828235c Poul Sander 2025-08-10 10:46 227
1828235c Poul Sander 2025-08-10 10:46 228
SagoTextureSelector::SagoTextureSelector() {
c461394a Poul Sander 2025-09-17 20:23 229
	grid_size = Config::getInstance()->getInt(editor_texture_grid_size, 32);
1828235c Poul Sander 2025-08-10 10:46 230
}
1828235c Poul Sander 2025-08-10 10:46 231
1828235c Poul Sander 2025-08-10 10:46 232
SagoTextureSelector::~SagoTextureSelector() {
1828235c Poul Sander 2025-08-10 10:46 233
}
1828235c Poul Sander 2025-08-10 10:46 234
1828235c Poul Sander 2025-08-10 10:46 235
bool SagoTextureSelector::IsActive() {
1828235c Poul Sander 2025-08-10 10:46 236
	return isActive;
1828235c Poul Sander 2025-08-10 10:46 237
}
1828235c Poul Sander 2025-08-10 10:46 238
1828235c Poul Sander 2025-08-10 10:46 239
void SagoTextureSelector::ProcessInput(const SDL_Event& event, bool &processed) {
1828235c Poul Sander 2025-08-10 10:46 240
}
1828235c Poul Sander 2025-08-10 10:46 241
1828235c Poul Sander 2025-08-10 10:46 242
void SagoTextureSelector::Draw(SDL_Renderer* target) {
1828235c Poul Sander 2025-08-10 10:46 243
	runTextureSelectorFrame(target);
1828235c Poul Sander 2025-08-10 10:46 244
	runSpriteSelectorFrame(target);
1828235c Poul Sander 2025-08-10 10:46 245
}
1828235c Poul Sander 2025-08-10 10:46 246
1828235c Poul Sander 2025-08-10 10:46 247
void SagoTextureSelector::Update() {
1828235c Poul Sander 2025-08-10 10:46 248
}
1828235c Poul Sander 2025-08-10 10:46 249
1828235c Poul Sander 2025-08-10 10:46 250
void SagoTextureSelector::Init() {
1828235c Poul Sander 2025-08-10 10:46 251
	textures = populateTree();
1828235c Poul Sander 2025-08-10 10:46 252
	sprites = LoadSprites();
1828235c Poul Sander 2025-08-10 10:46 253
}