mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-01-13 06:11:12 +01:00
Added a new ImageIndexer helper class.
This commit is contained in:
parent
73caee4fa2
commit
0f1c04e08d
@ -10,3 +10,5 @@ env_wfc.add_source_files(env.modules_sources, "wave_form_collapse.cpp")
|
||||
|
||||
env_wfc.add_source_files(env.modules_sources, "tiling_wave_form_collapse.cpp")
|
||||
env_wfc.add_source_files(env.modules_sources, "overlapping_wave_form_collapse.cpp")
|
||||
|
||||
env_wfc.add_source_files(env.modules_sources, "image_indexer.cpp")
|
||||
|
@ -11,6 +11,7 @@ def get_doc_classes():
|
||||
"WaveFormCollapse",
|
||||
"TilingWaveFormCollapse",
|
||||
"OverlappingWaveFormCollapse",
|
||||
"ImageIndexer",
|
||||
]
|
||||
|
||||
|
||||
|
35
modules/wfc/doc_classes/ImageIndexer.xml
Normal file
35
modules/wfc/doc_classes/ImageIndexer.xml
Normal file
@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<class name="ImageIndexer" inherits="Reference" version="3.5">
|
||||
<brief_description>
|
||||
</brief_description>
|
||||
<description>
|
||||
</description>
|
||||
<tutorials>
|
||||
</tutorials>
|
||||
<methods>
|
||||
<method name="get_color_indices">
|
||||
<return type="PoolIntArray" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_colors">
|
||||
<return type="PoolColorArray" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
<method name="index_image">
|
||||
<return type="void" />
|
||||
<argument index="0" name="arg0" type="Image" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
<method name="indices_to_argb8_data">
|
||||
<return type="PoolByteArray" />
|
||||
<argument index="0" name="arg0" type="PoolIntArray" />
|
||||
<description>
|
||||
</description>
|
||||
</method>
|
||||
</methods>
|
||||
<constants>
|
||||
</constants>
|
||||
</class>
|
76
modules/wfc/image_indexer.cpp
Normal file
76
modules/wfc/image_indexer.cpp
Normal file
@ -0,0 +1,76 @@
|
||||
|
||||
#include "image_indexer.h"
|
||||
|
||||
#include "core/oa_hash_map.h"
|
||||
|
||||
PoolColorArray ImageIndexer::get_colors() {
|
||||
return _colors;
|
||||
}
|
||||
PoolIntArray ImageIndexer::get_color_indices() {
|
||||
return _color_indices;
|
||||
}
|
||||
|
||||
void ImageIndexer::index_image(Ref<Image> image) {
|
||||
ERR_FAIL_COND(!image.is_valid());
|
||||
|
||||
_colors.resize(0);
|
||||
_color_indices.resize(0);
|
||||
|
||||
OAHashMap<Color, int> col_map;
|
||||
|
||||
image->lock();
|
||||
|
||||
int w = image->get_width();
|
||||
int h = image->get_height();
|
||||
|
||||
for (int x = 0; x < w; ++x) {
|
||||
for (int y = 0; y < h; ++y) {
|
||||
Color c = image->get_pixel(x, y);
|
||||
|
||||
int color_index = 0;
|
||||
if (!col_map.lookup(c, color_index)) {
|
||||
color_index = _colors.size();
|
||||
_colors.push_back(c);
|
||||
col_map.set(c, color_index);
|
||||
}
|
||||
|
||||
_color_indices.push_back(color_index);
|
||||
}
|
||||
}
|
||||
|
||||
image->unlock();
|
||||
}
|
||||
|
||||
PoolByteArray ImageIndexer::indices_to_argb8_data(const PoolIntArray &indices) {
|
||||
PoolByteArray arr;
|
||||
arr.resize(indices.size() * 4);
|
||||
|
||||
PoolByteArray::Write arrw = arr.write();
|
||||
PoolIntArray::Read indr = indices.read();
|
||||
int s = indices.size();
|
||||
|
||||
for (int i = 0; i < s; ++i) {
|
||||
int arrind = i * 4;
|
||||
|
||||
Color c = _colors[indr[i]];
|
||||
|
||||
arrw[arrind] = static_cast<uint8_t>(c.r * 255);
|
||||
arrw[arrind + 1] = static_cast<uint8_t>(c.g * 255);
|
||||
arrw[arrind + 2] = static_cast<uint8_t>(c.b * 255);
|
||||
arrw[arrind + 3] = static_cast<uint8_t>(c.a * 255);
|
||||
}
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
ImageIndexer::ImageIndexer() {
|
||||
}
|
||||
ImageIndexer::~ImageIndexer() {
|
||||
}
|
||||
|
||||
void ImageIndexer::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("get_colors"), &ImageIndexer::get_colors);
|
||||
ClassDB::bind_method(D_METHOD("get_color_indices"), &ImageIndexer::get_color_indices);
|
||||
ClassDB::bind_method(D_METHOD("index_image"), &ImageIndexer::index_image);
|
||||
ClassDB::bind_method(D_METHOD("indices_to_argb8_data"), &ImageIndexer::indices_to_argb8_data);
|
||||
}
|
30
modules/wfc/image_indexer.h
Normal file
30
modules/wfc/image_indexer.h
Normal file
@ -0,0 +1,30 @@
|
||||
#ifndef IMAGE_INDEXER_H
|
||||
#define IMAGE_INDEXER_H
|
||||
|
||||
#include "core/image.h"
|
||||
#include "core/reference.h"
|
||||
#include "core/variant.h"
|
||||
|
||||
class ImageIndexer : public Reference {
|
||||
GDCLASS(ImageIndexer, Reference);
|
||||
|
||||
public:
|
||||
PoolColorArray get_colors();
|
||||
PoolIntArray get_color_indices();
|
||||
|
||||
void index_image(Ref<Image> image);
|
||||
|
||||
PoolByteArray indices_to_argb8_data(const PoolIntArray &indices);
|
||||
|
||||
ImageIndexer();
|
||||
~ImageIndexer();
|
||||
|
||||
protected:
|
||||
static void _bind_methods();
|
||||
|
||||
private:
|
||||
PoolColorArray _colors;
|
||||
PoolIntArray _color_indices;
|
||||
};
|
||||
|
||||
#endif
|
@ -4,11 +4,13 @@
|
||||
#include "overlapping_wave_form_collapse.h"
|
||||
#include "tiling_wave_form_collapse.h"
|
||||
#include "wave_form_collapse.h"
|
||||
#include "image_indexer.h"
|
||||
|
||||
void register_wfc_types() {
|
||||
ClassDB::register_class<WaveFormCollapse>();
|
||||
ClassDB::register_class<OverlappingWaveFormCollapse>();
|
||||
ClassDB::register_class<TilingWaveFormCollapse>();
|
||||
ClassDB::register_class<ImageIndexer>();
|
||||
}
|
||||
|
||||
void unregister_wfc_types() {
|
||||
|
Loading…
Reference in New Issue
Block a user