Записать данные в выбранную маску

Я пытаюсь написать выбранную маску, но она не работает.

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");
}

не работает: \

Экран от Nuke:
введите описание изображения здесь

0

Решение

Обычно вы бы использовали 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,

Надеюсь это поможет.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]