composite texture - random pixels node; update texture view in asset inspector when texture changes

This commit is contained in:
Mikulas Florek 2022-11-17 11:05:38 +01:00
parent 2a55958891
commit ea6c3e95f4
2 changed files with 52 additions and 0 deletions

View file

@ -31,6 +31,7 @@ enum class CompositeTexture::NodeType : u32 {
MULTIPLY,
MIX,
GRADIENT,
RANDOM_PIXELS
};
enum { OUTPUT_FLAG = 1 << 31 };
@ -287,6 +288,49 @@ struct FlipNode final : CompositeTexture::Node {
bool horizontal = false;
};
struct RandomPixelsNode final : CompositeTexture::Node {
CompositeTexture::NodeType getType() const override { return CompositeTexture::NodeType::RANDOM_PIXELS; }
bool hasInputPins() const override { return false; }
bool hasOutputPins() const override { return true; }
void serialize(OutputMemoryStream& blob) const override {
blob.write(w);
blob.write(h);
blob.write(seed);
}
void deserialize(InputMemoryStream& blob) override {
blob.read(w);
blob.read(h);
blob.read(seed);
}
bool getPixelData(CompositeTexture::PixelData* data, u32 output_idx) override {
RandomGenerator rng(seed);
data->w = w;
data->h = h;
data->channels = 1;
data->pixels.resize(w * h);
for (u32 i = 0; i < w * h; ++i) {
data->pixels[i] = u8(rng.rand() % 256);
}
return true;
}
bool gui() override {
ImGuiEx::NodeTitle("Random pixels");
outputSlot();
bool res = ImGui::DragInt("Width", (i32*)&w, 1, 1, 9000);
ImGui::DragInt("Height", (i32*)&h, 1, 1, 9000) || res;
ImGui::DragInt("Seed", (i32*)&seed) || res;
return res;
}
u32 w = 256;
u32 h = 256;
u32 seed = 521288629;
};
struct GradientNode final : CompositeTexture::Node {
CompositeTexture::NodeType getType() const override { return CompositeTexture::NodeType::GRADIENT; }
bool hasInputPins() const override { return false; }
@ -729,6 +773,7 @@ CompositeTexture::Node* createNode(CompositeTexture::NodeType type, CompositeTex
case CompositeTexture::NodeType::MULTIPLY: node = LUMIX_NEW(allocator, MultiplyNode); break;
case CompositeTexture::NodeType::MIX: node = LUMIX_NEW(allocator, MixNode); break;
case CompositeTexture::NodeType::GRADIENT: node = LUMIX_NEW(allocator, GradientNode); break;
case CompositeTexture::NodeType::RANDOM_PIXELS: node = LUMIX_NEW(allocator, RandomPixelsNode); break;
default: ASSERT(false); return nullptr;
}
node->m_resource = &resource;
@ -1044,6 +1089,7 @@ static const struct {
{ 'X', "Mix", CompositeTexture::NodeType::MIX },
{ 'M', "Merge", CompositeTexture::NodeType::MERGE },
{ 0, "Multiply", CompositeTexture::NodeType::MULTIPLY },
{ 0, "Random pixels", CompositeTexture::NodeType::RANDOM_PIXELS },
{ 'S', "Split", CompositeTexture::NodeType::SPLIT },
{ 'T', "Input", CompositeTexture::NodeType::INPUT },
};

View file

@ -1141,10 +1141,12 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
app.getAssetCompiler().registerExtension("tga", Texture::TYPE);
app.getAssetCompiler().registerExtension("raw", Texture::TYPE);
app.getAssetCompiler().registerExtension("ltc", Texture::TYPE);
app.getAssetCompiler().resourceCompiled().bind<&TexturePlugin::onResourceCompiled>(this);
}
~TexturePlugin() {
m_app.getAssetCompiler().resourceCompiled().unbind<&TexturePlugin::onResourceCompiled>(this);
PluginManager& plugin_manager = m_app.getEngine().getPluginManager();
auto* renderer = (Renderer*)plugin_manager.getPlugin("renderer");
if(m_texture_view) {
@ -1152,6 +1154,10 @@ struct TexturePlugin final : AssetBrowser::IPlugin, AssetCompiler::IPlugin
}
}
void onResourceCompiled(Resource& res) {
if (m_texture == &res) m_texture = nullptr;
}
const char* getDefaultExtension() const override { return "ltc"; }
const char* getFileDialogFilter() const override { return "Composite texture\0*.ltc\0"; }
const char* getFileDialogExtensions() const override { return "ltc"; }