Я пытаюсь написать выбранную маску, но она не работает.
class IdMaskV1 : public Iop
{
public:
IdMaskV1(Node* node) : Iop(node),
aaIndexFile(0)
{
mChannelSet = Mask_RGBA;
}
~IdMaskV1() {}
//int maximum_inputs() const { return 1; }
//int minimum_inputs() const { return 1; }
virtual void knobs(Knob_Callback);
void _validate(bool);
void in_channels(int input_number, ChannelSet& channels) const;
void _request(int x, int y, int r, int t, ChannelMask channels, int count);
void engine(int y, int x, int r, ChannelMask channels, Row& outRow);const char* Class() const { return CLASS; }
const char* node_help() const { return HELP; }
private:
static const Iop::Description description;
static const char* const CLASS;
static const char* const HELP;
ChannelSet mChannelSet;
};static Iop* IdMaskV1Create(Node* node)
{
return new IdMaskV1(node);
}
const Iop::Description IdMaskV1::description(CLASS, "Examples/IdMaskV1", IdMaskV1Create);
const char* const IdMaskV1::CLASS = "IdMaskV1";
const char* const IdMaskV1::HELP = "Example Plugin";
void IdMaskV1::_validate(bool for_real)
{
copy_info();
set_out_channels(mChannelSet);
info_.turn_on(mChannelSet);
}
void IdMaskV1::in_channels(int input_number, ChannelSet& channels) const
{
/*
// Must turn on the other color channels if any color channels are requested:
foreach(z, channels) {
if (colourIndex(z) <= 3) { // it is red, green, or blue
if (!(mChannelSet & z)) { // save some time if we already turned this on
mChannelSet.addBrothers(z, 3); // add all three to the "done" set
}
}
}*/
//channels += mChannelSet; // add the colors to the channels we need
}
void IdMaskV1::_request(int x, int y, int r, int t, ChannelMask channels, int count)
{
input(0)->request(x, y, r, t, ChannelMask(channels), count);
}void IdMaskV1::engine(int y, int x, int r, ChannelMask channels, Row& outRow)
{
ChannelMask mask(channels);
if (aborted()) {
std::cerr << "Aborted!";
return;
}
Row inputRow(x, r);
inputRow.get(input0(), y, x, r, mask);
foreach(channel, mask) {
Channel ch = brother(channel, colourIndex(channel));
mChannelSet += ch;
}
for (int curX = x; curX < r; curX++) {
foreach(channel, mChannelSet) {
float value = 0;
// some process. In RGB i write 0.f, to A i write mask;
outRow.writable(channel)[curX] = value;
}
}
}void IdMaskV1::knobs(Knob_Callback f)
{
...
ChannelMask_knob(f, &mChannelSet, 1, "channels");
}
Для процесса я создал «other.test». В Knob я выбрал канал rgba (или custom: ‘test’) и собственную маску: ‘other.test’
Я жду результата в ‘other.test’, но результат, который я вижу в rgba | rgba.alpha | A: \
Обновить
новая попытка:
#include "DDImage/Iop.h"#include "DDImage/Row.h"#include "DDImage/Knobs.h"#include "DDImage/Tile.h"
using namespace DD::Image;
using namespace std;
class IdMaskV1 : public Iop
{
public:
IdMaskV1(Node* node) : Iop(node)
{
}
~IdMaskV1() {}
virtual void knobs(Knob_Callback);
void _validate(bool);
void _request(int x, int y, int r, int t, ChannelMask channels, int count);
void engine(int y, int x, int r, ChannelMask channels, Row& outRow);
const char* Class() const { return CLASS; }
const char* node_help() const { return HELP; }
private:
static const Iop::Description description;
static const char* const CLASS;
static const char* const HELP;
Channel mMaskChan;
};static Iop* IdMaskV1Create(Node* node)
{
return new IdMaskV1(node);
}
const Iop::Description IdMaskV1::description(CLASS, "Examples/IdMaskV1", IdMaskV1Create);
const char* const IdMaskV1::CLASS = "IdMaskV1";
const char* const IdMaskV1::HELP = "Example Plugin";
void IdMaskV1::_validate(bool for_real)
{
copy_info();
set_out_channels(mMaskChan);
info_.turn_on(mMaskChan);
}
void IdMaskV1::_request(int x, int y, int r, int t, ChannelMask channels, int count)
{
input(0)->request(x, y, r, t, channels, count);
}void IdMaskV1::engine(int y, int x, int r, ChannelMask channels, Row& outRow)
{
if (aborted()) {
std::cerr << "Aborted!";
return;
}
ChannelSet unchanged(channels);
if (unchanged & mMaskChan) {
unchanged -= mMaskChan;
static float value = 0.1678f;
float* out = outRow.writable(mMaskChan) + x;
const float* END = outRow[mMaskChan] + r;
while (out < END)
*out++ = value;
}
if (unchanged)
input0().get(y, x, r, unchanged, outRow);
}
void IdMaskV1::knobs(Knob_Callback f)
{
Channel_knob(f, &mMaskChan, 1, "channels");
}
не работает: \
Обычно вы бы использовали ChannelSet_knob
(или один, если его варианты), если вы хотите выполнить одну и ту же операцию на всех каналах, указанных пользователем. Тем не менее, это может быть сложно определить, является ли данный канал в ручке ChannelSet
на самом деле канал указывается в раскрывающейся маске на ручке, так как некоторые другие каналы могут быть отключены.
Таким образом, если вы хотите записать конкретные данные в один конкретный канал, было бы гораздо проще использовать Channel_knob
и просто представить и работать на одном канале внутри страны.
В этом случае engine()
реализация может выглядеть так:
void IdMaskV1::engine(int y, int x, int r, ChannelMask channels, Row& outRow)
{
ChannelSet unchanged(channels);
// mMaskChan is a `Channel`, and is the private knob storage for a `Channel_knob`
if (unchanged & mMaskChan) {
unchanged -= mMaskChan;
static float value = 0.1678f; // Whatever value or data you want
float* OUT = outRow.writable(mMaskChan) + x;
const float* END = outRow[mMaskChan] + r;
while (OUT < END)
*OUT++ = value;
}
if (unchanged)
input0().get(y, x, r, unchanged, outRow);
}
Вам также необходимо изменить ваш _validate
метод для вызова set_out_channels
а также info_.turn_on
на mMaskChan
вместо mChannelSet
,
Надеюсь это поможет.
Других решений пока нет …