Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSimplexNoiseGenerator Class Reference

#include <simplexnoisegenerator.h>

+ Inheritance diagram for KisSimplexNoiseGenerator:

Public Member Functions

KisConfigWidgetcreateConfigurationWidget (QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
 
KisFilterConfigurationSP defaultConfiguration (KisResourcesInterfaceSP resourcesInterface) const override
 
virtual void generate (KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config) const
 
virtual void generate (KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
 
virtual void generate (KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const=0
 
 KisSimplexNoiseGenerator ()
 
quint64 rotateLeft (const quint64 input, uint d) const
 
uint seedFromString (const QString &string) const
 
- Public Member Functions inherited from KisGenerator
virtual bool allowsSplittingIntoPatches () const
 
virtual QRect generatedRect (QRect _imageArea, const KisFilterConfigurationSP=0) const
 
 KisGenerator (const KoID &id, const KoID &category, const QString &entry)
 
 ~KisGenerator () override
 
- Public Member Functions inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager ()
 
const KisBookmarkedConfigurationManagerbookmarkManager () const
 
ColorSpaceIndependence colorSpaceIndependence () const
 
virtual KisFilterConfigurationSP factoryConfiguration (KisResourcesInterfaceSP resourcesInterface) const
 
QString id () const
 
 KisBaseProcessor (const KoID &id, const KoID &category, const QString &entry)
 
KoID menuCategory () const
 
QString menuEntry () const
 
QString name () const
 
 Private ()
 
QKeySequence shortcut () const
 
bool showConfigurationWidget ()
 If true, the filter wants to show a configuration widget.
 
bool supportsAdjustmentLayers () const
 This filter can be used in adjustment layers.
 
bool supportsPainting () const
 
bool supportsThreading () const
 
virtual ~KisBaseProcessor ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Static Public Member Functions

static KoID id ()
 
static double map_range (double value, double curr_min, double curr_max, double new_min, double new_max)
 

Additional Inherited Members

- Public Attributes inherited from KisBaseProcessor
KisBookmarkedConfigurationManagerbookmarkManager
 
KoID category
 
ColorSpaceIndependence colorSpaceIndependence
 
QString entry
 
KoID id
 
QKeySequence shortcut
 
bool showConfigurationWidget
 
bool supportsAdjustmentLayers
 
bool supportsPainting
 
bool supportsThreading
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Protected Member Functions inherited from KisGenerator
QString configEntryGroup () const
 
- Protected Member Functions inherited from KisBaseProcessor
void init (const QString &configEntryGroup)
 
void setColorSpaceIndependence (ColorSpaceIndependence v)
 
void setShortcut (const QKeySequence &shortcut)
 
void setShowConfigurationWidget (bool v)
 
void setSupportsAdjustmentLayers (bool v)
 
void setSupportsPainting (bool v)
 
void setSupportsThreading (bool v)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Detailed Description

Definition at line 26 of file simplexnoisegenerator.h.

Constructor & Destructor Documentation

◆ KisSimplexNoiseGenerator()

KisSimplexNoiseGenerator::KisSimplexNoiseGenerator ( )

Definition at line 38 of file simplexnoisegenerator.cpp.

38 : KisGenerator(id(), KoID("basic"), i18n("&Simplex Noise..."))
39{
42}
@ FULLY_INDEPENDENT
KisGenerator(const KoID &id, const KoID &category, const QString &entry)
Definition KoID.h:30
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)

References FULLY_INDEPENDENT, KisBaseProcessor::setColorSpaceIndependence(), and KisBaseProcessor::setSupportsPainting().

Member Function Documentation

◆ createConfigurationWidget()

KisConfigWidget * KisSimplexNoiseGenerator::createConfigurationWidget ( QWidget * parent,
const KisPaintDeviceSP dev,
bool useForMasks ) const
overridevirtual

Create the configuration widget for this processor.

Parameters
parentthe Qt owner widget of this widget
devthe paintdevice this filter will act on
useForMasksshown if the filer is going to be used in a mask. Some filters may provide limited options when applied as a mask (e.g. Gaussian Blur)

Reimplemented from KisBaseProcessor.

Definition at line 125 of file simplexnoisegenerator.cpp.

126{
127 Q_UNUSED(dev);
128 return new KisWdgSimplexNoise((KisFilter*)this, (QWidget*)parent);
129}

◆ defaultConfiguration()

KisFilterConfigurationSP KisSimplexNoiseGenerator::defaultConfiguration ( KisResourcesInterfaceSP resourcesInterface) const
overridevirtual

Return the configuration set as the default by the user or the default configuration from the filter writer as returned by factoryConfiguration.

This configuration is used by default for the configuration widget and given to the process function if there is no configuration widget.

Returns
the default configuration of this widget

Reimplemented from KisBaseProcessor.

Definition at line 112 of file simplexnoisegenerator.cpp.

113{
114 KisFilterConfigurationSP config = factoryConfiguration(resourcesInterface);
115 config->setProperty("looping", false);
116 config->setProperty("frequency", 25.0);
117 uint seed = static_cast<uint>(rand());
118 config->setProperty("seed", seed);
119 config->setProperty("custom_seed_string", "");
120 config->setProperty("ratio_x", 1.0f);
121 config->setProperty("ratio_y", 1.0f);
122 return config;
123}
unsigned int uint
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const

References KisBaseProcessor::factoryConfiguration().

◆ generate() [1/3]

void KisGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisFilterConfigurationSP config ) const
virtual

Provided for convenience when no progress reporting is needed.

Reimplemented from KisGenerator.

Definition at line 59 of file kis_generator.cpp.

33{
34 generate(dst, size, config, 0);
35}
virtual void generate(KisProcessingInformation dst, const QSize &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override

◆ generate() [2/3]

void KisSimplexNoiseGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisFilterConfigurationSP config,
KoUpdater * progressUpdater ) const
overridevirtual

Override this function with the implementation of your generator.

Parameters
dstthe destination paint device
sizethe size of the area that is to be filled
configthe parameters of the filter
progressUpdaterthe progress updater

Implements KisGenerator.

Definition at line 44 of file simplexnoisegenerator.cpp.

45{
46 KisPaintDeviceSP device = dst.paintDevice();
47 Q_ASSERT(!device.isNull());
48
49 osn_context *noise_context;
50
51 QRect bounds = QRect(dst.topLeft(), size);
52 QRect whole_image_bounds = device->defaultBounds()->bounds();
53
54 const KoColorSpace *cs = device->colorSpace();
57
58 KisSequentialIteratorProgress it(device, bounds, progressUpdater);
59
60 QVariant property;
61
62 const uint default_seed = (config->getProperty("seed", property)) ? property.toUInt() : 0;
63 const QString custom_seed_string = (config->getProperty("custom_seed_string", property)) ? property.toString() : "";
64 const bool use_custom_seed = !custom_seed_string.trimmed().isEmpty();
65
66 const uint seed = use_custom_seed ? seedFromString(custom_seed_string) : default_seed;
67 open_simplex_noise(seed, &noise_context);
68
69 double frequency = (config && config->getProperty("frequency", property)) ? property.toDouble() : 25.0;
70 double ratio_x = (config && config->getProperty("ratio_x", property)) ? property.toDouble() : 1.0;
71 double ratio_y = (config && config->getProperty("ratio_y", property)) ? property.toDouble() : 1.0;
72
73 bool looping = (config && config->getProperty("looping", property)) ? property.toBool() : false;
74
75 if( looping ){
76 float major_radius = 0.5f * frequency * ratio_x;
77 float minor_radius = 0.5f * frequency * ratio_y;
78 while(it.nextPixel()){
79 double x_phase = (double)it.x() / (double)whole_image_bounds.width() * M_PI * 2;
80 double y_phase = (double)it.y() / (double)(whole_image_bounds.height()) * M_PI * 2;
81 double x_coordinate = major_radius * map_range(cos(x_phase), -1.0, 1.0, 0.0, 1.0);
82 double y_coordinate = major_radius * map_range(sin(x_phase), -1.0, 1.0, 0.0, 1.0);
83 double z_coordinate = minor_radius * map_range(cos(y_phase), -1.0, 1.0, 0.0, 1.0);
84 double w_coordinate = minor_radius * map_range(sin(y_phase), -1.0, 1.0, 0.0, 1.0);
85 double value = open_simplex_noise4(noise_context, x_coordinate, y_coordinate, z_coordinate, w_coordinate);
86 value = map_range(value, -1.0, 1.0, 0.0, 1.0);
87
88 KoColor c(src);
89 reinterpret_cast<float *>(c.data())[0] = value;
90 c.setOpacity(OPACITY_OPAQUE_F);
91
92 conv->transform(c.data(), it.rawData(), 1);
93 }
94 } else {
95 while(it.nextPixel()){
96 double x_phase = (double)it.x() / (double)(whole_image_bounds.width()) * ratio_x;
97 double y_phase = (double)it.y() / (double)(whole_image_bounds.height()) * ratio_y;
98 double value = open_simplex_noise4(noise_context, x_phase * frequency, y_phase * frequency, x_phase * frequency, y_phase * frequency);
99 value = map_range(value, -1.0, 1.0, 0.0, 1.0);
100
101 KoColor c(src);
102 reinterpret_cast<float *>(c.data())[0] = value;
103 c.setOpacity(OPACITY_OPAQUE_F);
104
105 conv->transform(c.data(), it.rawData(), 1);
106 }
107 }
108 delete conv;
109 open_simplex_noise_free(noise_context);
110}
float value(const T *src, size_t ch)
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const qreal OPACITY_OPAQUE_F
virtual QRect bounds() const =0
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
bool isNull() const
static double map_range(double value, double curr_min, double curr_max, double new_min, double new_max)
uint seedFromString(const QString &string) const
QString id() const
Definition KoID.cpp:63
#define bounds(x, a, b)
#define M_PI
Definition kis_global.h:111
int open_simplex_noise(int64_t seed, struct osn_context **ctx)
void open_simplex_noise_free(struct osn_context *ctx)
double open_simplex_noise4(struct osn_context *ctx, double x, double y, double z, double w)
void transform(const quint8 *src, quint8 *dst, qint32 nPixels) const override=0
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
KoColorConversionTransformation * createColorConverter(const KoColorSpace *srcColorSpace, const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
static KoColorSpaceRegistry * instance()

References KisDefaultBoundsBase::bounds(), bounds, KisPaintDevice::colorSpace(), KoColorSpaceRegistry::colorSpace(), KoColorSpaceRegistry::createColorConverter(), KoColor::data(), KisPaintDevice::defaultBounds(), Float32BitsColorDepthID, GrayAColorModelID, KoID::id(), KoColorSpaceRegistry::instance(), KoColorConversionTransformation::internalConversionFlags(), KoColorConversionTransformation::internalRenderingIntent(), KisSharedPtr< T >::isNull(), M_PI, map_range(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), OPACITY_OPAQUE_F, open_simplex_noise(), open_simplex_noise4(), open_simplex_noise_free(), KisProcessingInformation::paintDevice(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), seedFromString(), KoColor::setOpacity(), KisConstProcessingInformation::topLeft, KoColorConversionTransformation::transform(), value(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::x(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::y().

◆ generate() [3/3]

virtual void KisGenerator::generate ( KisProcessingInformation dst,
const QSize & size,
const KisFilterConfigurationSP config,
KoUpdater * progressUpdater ) const
virtual

Override this function with the implementation of your generator.

Parameters
dstthe destination paint device
sizethe size of the area that is to be filled
configthe parameters of the filter
progressUpdaterthe progress updater

Implements KisGenerator.

◆ id()

static KoID KisSimplexNoiseGenerator::id ( )
inlinestatic

Definition at line 39 of file simplexnoisegenerator.h.

39 {
40 return KoID("simplex_noise", i18n("Simplex Noise"));
41 }

◆ map_range()

static double KisSimplexNoiseGenerator::map_range ( double value,
double curr_min,
double curr_max,
double new_min,
double new_max )
inlinestatic

Definition at line 49 of file simplexnoisegenerator.h.

49 {
50 return (value - curr_min) * (new_max - new_min) / (curr_max - curr_min) + new_min;
51 }

References value().

◆ rotateLeft()

quint64 KisSimplexNoiseGenerator::rotateLeft ( const quint64 input,
uint d ) const

Definition at line 142 of file simplexnoisegenerator.cpp.

143{
144 return (input << shift)|(input >> (64 - shift));
145}

◆ seedFromString()

uint KisSimplexNoiseGenerator::seedFromString ( const QString & string) const

Definition at line 132 of file simplexnoisegenerator.cpp.

133{
134 QByteArray bytes = QCryptographicHash::hash(string.toUtf8(),QCryptographicHash::Md5);
135 uint hash = 0;
136 for( int index = 0; index < bytes.length(); index++){
137 hash += rotateLeft(bytes[index], index % 32);
138 }
139 return hash;
140}
quint64 rotateLeft(const quint64 input, uint d) const

References rotateLeft().


The documentation for this class was generated from the following files: