Spinning Topp Logo BlackTopp Studios
inc
convolutionmodifier.h
1 // © Copyright 2010 - 2016 BlackTopp Studios Inc.
2 /* This file is part of The Mezzanine Engine.
3 
4  The Mezzanine Engine is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  The Mezzanine Engine is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with The Mezzanine Engine. If not, see <http://www.gnu.org/licenses/>.
16 */
17 /* The original authors have included a copy of the license specified above in the
18  'Docs' folder. See 'gpl.txt'
19 */
20 /* We welcome the use of the Mezzanine engine to anyone, including companies who wish to
21  Build professional software and charge for their product.
22 
23  However there are some practical restrictions, so if your project involves
24  any of the following you should contact us and we will try to work something
25  out:
26  - DRM or Copy Protection of any kind(except Copyrights)
27  - Software Patents You Do Not Wish to Freely License
28  - Any Kind of Linking to Non-GPL licensed Works
29  - Are Currently In Violation of Another Copyright Holder's GPL License
30  - If You want to change our code and not add a few hundred MB of stuff to
31  your distribution
32 
33  These and other limitations could cause serious legal problems if you ignore
34  them, so it is best to simply contact us or the Free Software Foundation, if
35  you have any questions.
36 
37  Joseph Toppi - toppij@gmail.com
38  John Blackwood - makoenergy02@gmail.com
39 */
40 /*
41  -----------------------------------------------------------------------------
42  This source file is part of ogre-procedural
43 
44  For the latest info, see http://code.google.com/p/ogre-procedural/
45 
46  Copyright (c) 2010-2013 Michael Broutin
47 
48  Permission is hereby granted, free of charge, to any person obtaining a copy
49  of this software and associated documentation files (the "Software"), to deal
50  in the Software without restriction, including without limitation the rights
51  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
52  copies of the Software, and to permit persons to whom the Software is
53  furnished to do so, subject to the following conditions:
54 
55  The above copyright notice and this permission notice shall be included in
56  all copies or substantial portions of the Software.
57 
58  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
61  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
62  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
63  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
64  THE SOFTWARE.
65  -----------------------------------------------------------------------------
66  */
67 #ifndef _graphicsproceduralconvolutionmodifier_h
68 #define _graphicsproceduralconvolutionmodifier_h
69 
70 #include "Graphics/Procedural/Texture/texturemodifier.h"
71 
72 #include "matrix3x3.h"
73 
74 namespace Mezzanine
75 {
76  namespace Graphics
77  {
78  namespace Procedural
79  {
80  ///////////////////////////////////////////////////////////////////////////////
81  /// @brief A modifier that will calculate each pixel in an image to be a weighed sum of itself and it's neighbors.
82  /// @details
83  ///////////////////////////////////////
85  {
86  protected:
87  /// @internal
88  /// @brief The matricy to use for per-pixel processing.
90  /// @internal
91  /// @brief The custom value to divide the pixel result by.
93  /// @internal
94  /// @brief The size of the set kernel.
96  /// @internal
97  /// @brief A value over 128 will force a colour closer to White, lower will force a colour closer to black.
99  /// @internal
100  /// @brief Whether or not a dynamic divisor from pixel processing is to be used or the explicitly set divisor.
102  /// @internal
103  /// @brief Whether or not the Alpha channel is to be processed with the rest of the pixel.
105  public:
106  /// @brief Blank constructor.
108  /// @brief Class destructor.
109  virtual ~ConvolutionModifier();
110 
111  ///////////////////////////////////////////////////////////////////////////////
112  // Utility
113 
114  /// @copydoc TextureModifier::Modify(TextureBuffer&)
115  virtual void Modify(TextureBuffer& Buffer);
116  /// @copydoc TextureModifier::GetName() const
117  virtual String GetName() const;
118 
119  ///////////////////////////////////////////////////////////////////////////////
120  // Configuration
121 
122  /// @brief Sets the matrix that determines how each pixel neighbor is to be weighed when processing each pixel.
123  /// @remarks This method calls CalculateDivisor() after updating the kernel. If you want to have a custom divisor set be sure to call
124  /// CalculateDivisor() AFTER the call to this method.
125  /// @param Size The row size of the square kernel to be set.
126  /// @param Data The matricy to use for per-pixel processing.
127  /// @return Returns a reference to this.
128  ConvolutionModifier& SetKernel(const UInt8 Size, Real* Data);
129  /// @brief Sets the matrix that determines how each pixel neighbor is to be weighed when processing each pixel.
130  /// @remarks This method calls CalculateDivisor() after updating the kernel. If you want to have a custom divisor set be sure to call
131  /// CalculateDivisor() AFTER the call to this method.
132  /// @param Size The row size of the square kernel to be set.
133  /// @param Data The matricy to use for per-pixel processing.
134  /// @return Returns a reference to this.
135  ConvolutionModifier& SetKernel(const UInt8 Size, Integer* Data);
136  /// @brief Sets the matrix that determines how each pixel neighbor is to be weighed when processing each pixel.
137  /// @remarks This method calls CalculateDivisor() after updating the kernel. If you want to have a custom divisor set be sure to call
138  /// CalculateDivisor() AFTER the call to this method.
139  /// @param Data A 3x3 matrix to use for per-pixel processing.
140  /// @return Returns a reference to this.
141  ConvolutionModifier& SetKernel(const Matrix3x3& Data);
142  /// @brief Sets a custom divisor that will be applied to the result of the pixel to help keep the value within a range.
143  /// @param Div The custom value to divide the pixel result by.
144  /// @return Returns a reference to this.
145  ConvolutionModifier& SetDivisor(const Real Div);
146  /// @brief Sets a threshold that will force the colours of each pixel further to white or black.
147  /// @param Thresh The threshold to use. Values over 128 will force a colour closer to White, lower will force a colour closer to black.
148  /// @return Returns a reference to this.
149  ConvolutionModifier& SetThreshold(const UInt8 Thresh);
150  /// @brief Sets if a custom divisor should be use or one automatically generated during pixel processing.
151  /// @param CalculateEdge Whether or not a dynamic divisor from pixel processing is to be used or the explicitly set divisor.
152  /// @return Returns a reference to this.
153  ConvolutionModifier& SetCalculateEdgeDivisor(const Boole CalculateEdge);
154  /// @brief Sets if the alpha channel of each pixel should be processed.
155  /// @param IncludeAlpha Whether or not the Alpha channel is to be processed with the rest of the pixel.
156  /// @return Returns a reference to this.
157  ConvolutionModifier& SetIncludeAlphaChannel(const Boole IncludeAlpha);
158  /// @brief Automatically generates a sane divisor for pixel processing.
159  /// @remarks This method will loop over every element of the kernal and assign the sum of all it's elements to the divisor.
160  /// If for any reason the sum is zero a value of 1.0 will be assigned.
161  /// @return Returns a reference to this.
162  ConvolutionModifier& CalculateDivisor();
163  };//ConvolutionModifier
164  }//Procedural
165  }//Graphics
166 }//Mezzanine
167 
168 #endif
This is a 3x3 Matrix class used for representing rotations and scaling in an object.
Definition: matrix3x3.h:62
bool Boole
Generally acts a single bit, true or false.
Definition: datatypes.h:173
int Integer
A datatype used to represent any integer close to.
Definition: datatypes.h:154
uint8_t UInt8
An 8-bit unsigned integer.
Definition: datatypes.h:118
float Real
A Datatype used to represent a real floating point number.
Definition: datatypes.h:141
Boole IncludeAlphaChannel
Whether or not the Alpha channel is to be processed with the rest of the pixel.
Real Divisor
The custom value to divide the pixel result by.
Boole CalculateEdgeDivisor
Whether or not a dynamic divisor from pixel processing is to be used or the explicitly set divisor...
Real * KernelData
The matricy to use for per-pixel processing.
A convenience buffer that stores pixel colour values of a texture to be generated.
Definition: texturebuffer.h:86
#define MEZZ_LIB
Some platforms require special decorations to denote what is exported/imported in a share library...
The bulk of the engine components go in this namspace.
Definition: actor.cpp:56
A modifier that will calculate each pixel in an image to be a weighed sum of itself and it's neighbor...
A base class for modifying the contents of an already populated texture buffer.
UInt8 Threshold
A value over 128 will force a colour closer to White, lower will force a colour closer to black...
std::string String
A datatype used to a series of characters.
Definition: datatypes.h:159