About
Based on maxon::FilterContextInterface, maxon::FilterImageInterface and maxon::FilterInterface one can implement custom render filters.
FilterContex
A filter context is the central class to create queues, images and filters. A real-world implementation would initialize a library or a framework such as CUDA or OpenCL.
namespace FilterContextClasses
{
MAXON_DECLARATION(maxon::FilterContextClasses::EntryType, EXAMPLECONTEXT,
"net.maxonexample.render_filter.context.example");
}
class FilterContextImpl :
public maxon::Component<FilterContextImpl, maxon::FilterContextInterface>
{
public:
};
{
}
{
return filter;
}
{
maxon::FilterImageRef image = maxon::FilterImageClasses::EXAMPLEIMAGE().Create()
iferr_return;
CheckState(width > 0 && height > 0,
"Invalid Image Size!"_s);
FilterImageImpl* imageImpl = FilterImageImpl::GetOrNull(image);
return image;
}
{
}
maxon::Result<void> FilterContextImpl::ExecuteCommandQueue(maxon::FilterCommandQueueRef commandQueue)
{
}
FilterImage
A filter image stores the given image data. Internally it might represent a data structure related to the underlying library or framework.
namespace FilterImageClasses
{
MAXON_DECLARATION(maxon::FilterImageClasses::EntryType, EXAMPLEIMAGE,
"net.maxonexample.render_filter.image.example");
}
class FilterImageImpl :
public maxon::Component<FilterImageImpl, maxon::FilterImageInterface>
{
public:
private:
};
{
}
{
return _imgData.CopyFrom(data);
}
{
}
{
return _imgData.Resize(width * height);
}
{
return _imgData;
}
{
return _imgData;
}
Filter
The actual filter is based on maxon::FilterInterface. It can store various parameters and operates on the given data set.
namespace FilterClasses
{
MAXON_DECLARATION(FilterClasses::EntryType, EXAMPLEINVERT,
"net.maxonexample.render_filter.filter.example.invert");
MAXON_DECLARATION(FilterClasses::EntryType, EXAMPLEPOWER,
"net.maxonexample.render_filter.filter.example.power");
}
class FilterComponentRoot : public maxon::ComponentRoot
{
public:
protected:
};
maxon::Result<void> FilterComponentRoot::Execute(
const maxon::FilterImageRef& input, maxon::FilterImageRef output)
{
FilterImageImpl* inputImpl = FilterImageImpl::GetOrNull(input);
FilterImageImpl* outputImpl = FilterImageImpl::GetOrNull(output);
}
{
public:
private:
};
{
public:
private:
};
{
{
case ID_CASE(maxonexample::FilterExampleParameter::EVERYPIXEL):
{
break;
}
}
}
{
}
{
{
const maxon::Bool skip = _everyPixel ==
false && i % 2 == 0;
}
}
{
{
case ID_CASE(maxonexample::FilterExampleParameter::EXPONENT):
{
break;
}
}
}
{
}
{
{
{
}
}
}
Usage
Custom filter can be used as presented:
maxon::FilterContextRef filterContext = maxon::FilterContextClasses::EXAMPLECONTEXT().Create()
iferr_return;
maxon::FilterRef filterInvert = filterContext.CreateFilter(maxon::FilterClasses::EXAMPLEINVERT.GetId())
iferr_return;
maxon::FilterRef filterPower = filterContext.CreateFilter(maxon::FilterClasses::EXAMPLEPOWER.GetId())
iferr_return;
maxon::DataDictionary imgDesc;
maxon::FilterImageRef input = filterContext.CreateImage(imgDesc)
iferr_return;
maxon::FilterImageRef output = filterContext.CreateImage(imgDesc)
iferr_return;
Further Reading