Spinning Topp Logo BlackTopp Studios
inc
texturebuffer.cpp
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 _graphicsproceduraltexturebuffer_cpp
68 #define _graphicsproceduraltexturebuffer_cpp
69 
70 #include "Graphics/Procedural/Texture/texturebuffer.h"
71 #include "Graphics/Procedural/proceduralenumerations.h"
72 
73 #include "Graphics/texturemanager.h"
74 #include "Graphics/texture.h"
75 #include "Graphics/image.h"
76 
77 #include "MathTools/mathtools.h"
78 
79 #include <OgrePixelFormat.h>
80 
81 #include <cstring>
82 #include <limits>
83 
84 #ifdef LoadImage
85 #undef LoadImage
86 #endif
87 
88 namespace Mezzanine
89 {
90  namespace Graphics
91  {
92  namespace Procedural
93  {
94  TextureBuffer::TextureBuffer(const Whole SquareSize) :
95  Width( std::max(SquareSize,Whole(8)) ),
96  Height( std::max(SquareSize,Whole(8)) )
97  {
98  this->Pixels = new ColourChannelType[ this->GetSubChannelCount() ];
99  memset(this->Pixels, 0, this->GetByteSize());
100  for( Whole Y = 0 ; Y < this->Height ; Y++ )
101  {
102  for( Whole X = 0 ; X < this->Width ; X++ )
103  {
104  this->SetAlphaByte( X, Y, std::numeric_limits<ColourChannelType>::max() );
105  }
106  }
107  }
108 
109  TextureBuffer::TextureBuffer(const Whole TexWidth, const Whole TexHeight) :
110  Width( std::max(TexWidth,Whole(8)) ),
111  Height( std::max(TexHeight,Whole(8)) )
112  {
113  this->Pixels = new ColourChannelType[ this->GetSubChannelCount() ];
114  memset(this->Pixels, 0, this->GetByteSize() );
115  for( Whole Y = 0 ; Y < this->Height ; Y++ )
116  {
117  for( Whole X = 0 ; X < this->Width ; X++ )
118  {
119  this->SetAlphaByte( X, Y, std::numeric_limits<ColourChannelType>::max() );
120  }
121  }
122  }
123 
125  Pixels(NULL),
126  Width( 8 ),
127  Height( 8 )
128  { this->SetData(Other); }
129 
131  { delete[] Pixels; }
132 
134  {
135  if( X >= this->Width || Y >= this->Height ) {
136  MEZZ_EXCEPTION(ExceptionBase::MM_OUT_OF_BOUNDS_EXCEPTION,"Requesting pixel position in TextureBuffer that is out of bounds.");
137  }
138 
139  return this->Pixels[ Y * this->Width * 4 + X * 4 + Component * sizeof(ColourChannelType) ];
140  }
141 
142  const TextureBuffer::ColourChannelType& TextureBuffer::GetPixel(const Whole X, const Whole Y, const UInt16 Component) const
143  {
144  if( X >= this->Width || Y >= this->Height ) {
145  MEZZ_EXCEPTION(ExceptionBase::MM_OUT_OF_BOUNDS_EXCEPTION,"Requesting pixel position in TextureBuffer that is out of bounds.");
146  }
147 
148  return this->Pixels[ Y * this->Width * 4 + X * 4 + Component * sizeof(ColourChannelType) ];
149  }
150 
151  ///////////////////////////////////////////////////////////////////////////////
152  // Utility
153 
155  {
156  if( Other.Pixels != NULL ) {
157  if( this->Width != Other.Width || this->Height != Other.Height ) {
158  this->Width = Other.GetWidth();
159  this->Height = Other.GetHeight();
160 
161  if( this->Pixels != NULL ) {
162  delete[] this->Pixels;
163  }
164 
165  this->Pixels = new ColourChannelType[ this->GetSubChannelCount() ];
166  }
167  memcpy(this->Pixels, Other.Pixels, this->GetByteSize());
168  }
169  }
170 
172  { return this->Width; }
173 
175  { return this->Height; }
176 
178  { return this->Width * this->Height; }
179 
181  { return this->GetPixelCount() * 4; }
182 
184  { return this->GetSubChannelCount() * sizeof(ColourChannelType); }
185 
187  {
188  ColourChannelType* NewBuff = new ColourChannelType[ this->GetSubChannelCount() ];
189  Ogre::PixelUtil::bulkPixelConversion(this->Pixels,static_cast<Ogre::PixelFormat>(Graphics::PF_R8G8B8A8),NewBuff,static_cast<Ogre::PixelFormat>(Format),this->GetPixelCount());
190  Image* NewImage = new Image(NewBuff,this->Width,this->Height,Format,true);
191  return NewImage;
192  }
193 
194  Texture* TextureBuffer::GenerateTexture(const String& TexName, const String& TexGroup, const Graphics::PixelFormat Format) const
195  {
196  Texture* Ret = Graphics::TextureManager::GetSingletonPtr()->CreateManualTexture(TexName,TexGroup,Graphics::TT_2D,this->Width,this->Height,0,Format);
197  Ret->_WriteToBuffer(this->Pixels,this->GetByteSize(),Graphics::PF_R8G8B8A8);
198  return Ret;
199  }
200 
201  ///////////////////////////////////////////////////////////////////////////////
202  // Pixel Configuration
203 
204  void TextureBuffer::SetPixel(const Whole X, const Whole Y, const ColourValue& Colour)
205  {
206  this->SetPixelReal(X,Y,Colour.RedChannel,Colour.GreenChannel,Colour.BlueChannel,Colour.AlphaChannel);
207  }
208 
209  void TextureBuffer::SetPixelByte(const Whole X, const Whole Y, const ColourChannelType Red, const ColourChannelType Green, const ColourChannelType Blue, const ColourChannelType Alpha)
210  {
211  this->SetRedByte(X,Y,Red);
212  this->SetGreenByte(X,Y,Green);
213  this->SetBlueByte(X,Y,Blue);
214  this->SetAlphaByte(X,Y,Alpha);
215  }
216 
217  void TextureBuffer::SetPixelReal(const Whole X, const Whole Y, const Real Red, const Real Green, const Real Blue, const Real Alpha)
218  {
219  this->SetRedReal(X,Y,Red);
220  this->SetGreenReal(X,Y,Green);
221  this->SetBlueReal(X,Y,Blue);
222  this->SetAlphaReal(X,Y,Alpha);
223  }
224 
226  { return ColourValue( this->GetRedReal(X,Y), this->GetGreenReal(X,Y), this->GetBlueReal(X,Y), this->GetAlphaReal(X,Y) ); }
227 
228  void TextureBuffer::SetRedByte(const Whole X, const Whole Y, const ColourChannelType Red)
229  { this->GetPixel(X,Y,Procedural::CCI_Red) = Red; }
230 
231  void TextureBuffer::SetRedReal(const Whole X, const Whole Y, const Real Red)
232  {
233  if( Red > 1.0 || Red < 0.0 )
234  { MEZZ_EXCEPTION(ExceptionBase::PARAMETERS_RANGE_EXCEPTION,"Red colour component to be set is outside the expected range [0.0-1.0]."); }
235  this->GetPixel(X,Y,Procedural::CCI_Red) = static_cast<ColourChannelType>( MathTools::Clamp(Red * Real(255.0),Real(0.0),Real(255.0)) );
236  }
237 
239  { return this->GetPixel(X,Y,Procedural::CCI_Red); }
240 
241  Real TextureBuffer::GetRedReal(const Whole X, const Whole Y) const
242  { return ( static_cast<Real>( this->GetPixel(X,Y,Procedural::CCI_Red) ) / 255.0 ); }
243 
244  void TextureBuffer::SetGreenByte(const Whole X, const Whole Y, const ColourChannelType Green)
245  { this->GetPixel(X,Y,Procedural::CCI_Green) = Green; }
246 
247  void TextureBuffer::SetGreenReal(const Whole X, const Whole Y, const Real Green)
248  {
249  if( Green > 1.0 || Green < 0.0 )
250  { MEZZ_EXCEPTION(ExceptionBase::PARAMETERS_RANGE_EXCEPTION,"Green colour component to be set is outside the expected range [0.0-1.0]."); }
251  this->GetPixel(X,Y,Procedural::CCI_Green) = static_cast<ColourChannelType>( MathTools::Clamp(Green * Real(255.0),Real(0.0),Real(255.0)) );
252  }
253 
255  { return this->GetPixel(X,Y,Procedural::CCI_Green); }
256 
257  Real TextureBuffer::GetGreenReal(const Whole X, const Whole Y) const
258  { return ( static_cast<Real>( this->GetPixel(X,Y,Procedural::CCI_Green) ) / 255.0 ); }
259 
260  void TextureBuffer::SetBlueByte(const Whole X, const Whole Y, const ColourChannelType Blue)
261  { this->GetPixel(X,Y,Procedural::CCI_Blue) = Blue; }
262 
263  void TextureBuffer::SetBlueReal(const Whole X, const Whole Y, const Real Blue)
264  {
265  if( Blue > 1.0 || Blue < 0.0 )
266  { MEZZ_EXCEPTION(ExceptionBase::PARAMETERS_RANGE_EXCEPTION,"Blue colour component to be set is outside the expected range [0.0-1.0]."); }
267  this->GetPixel(X,Y,Procedural::CCI_Blue) = static_cast<ColourChannelType>( MathTools::Clamp(Blue * Real(255.0),Real(0.0),Real(255.0)) );
268  }
269 
271  { return this->GetPixel(X,Y,Procedural::CCI_Blue); }
272 
273  Real TextureBuffer::GetBlueReal(const Whole X, const Whole Y) const
274  { return ( static_cast<Real>( this->GetPixel(X,Y,Procedural::CCI_Blue) ) / 255.0 ); }
275 
276  void TextureBuffer::SetAlphaByte(const Whole X, const Whole Y, const ColourChannelType Alpha)
277  { this->GetPixel(X,Y,Procedural::CCI_Alpha) = Alpha; }
278 
279  void TextureBuffer::SetAlphaReal(const Whole X, const Whole Y, const Real Alpha)
280  {
281  if( Alpha > 1.0 || Alpha < 0.0 )
282  { MEZZ_EXCEPTION(ExceptionBase::PARAMETERS_RANGE_EXCEPTION,"Alpha colour component to be set is outside the expected range [0.0-1.0]."); }
283  this->GetPixel(X,Y,Procedural::CCI_Alpha) = static_cast<ColourChannelType>( MathTools::Clamp(Alpha * Real(255.0),Real(0.0),Real(255.0)) );
284  }
285 
287  { return this->GetPixel(X,Y,Procedural::CCI_Alpha); }
288 
289  Real TextureBuffer::GetAlphaReal(const Whole X, const Whole Y) const
290  { return ( static_cast<Real>( this->GetPixel(X,Y,Procedural::CCI_Alpha) ) / 255.0 ); }
291  }//Procedural
292  }//Graphics
293 }//Mezzanine
294 
295 #endif
ColourChannelType & GetPixel(const Whole X, const Whole Y, const UInt16 Component)
Gets access to the pixel at the specified position in this buffer. the X or Y location go beyond the ...
TextureBuffer(const Whole SquareSize)
Square size constructor.
void SetRedByte(const Whole X, const Whole Y, const ColourChannelType Red)
Sets the red colour value of a specified pixel. the X or Y location go beyond the set size of this te...
Whole Height
The size of the texture to be generated on the Y axis.
void SetPixelByte(const Whole X, const Whole Y, const ColourChannelType Red, const ColourChannelType Green, const ColourChannelType Blue, const ColourChannelType Alpha=255)
Set colour of a specified pixel using a 0-255 range. the X or Y location go beyond the set size of th...
Real GetBlueReal(const Whole X, const Whole Y) const
Gets the blue colour value of a specified pixel. the X or Y location go beyond the set size of this t...
Whole GetWidth() const
Get the pixel width of this texture.
Real GetAlphaReal(const Whole X, const Whole Y) const
Gets the alpha colour value of a specified pixel. the X or Y location go beyond the set size of this ...
#define MEZZ_EXCEPTION(num, desc)
An easy way to throw exceptions with rich information.
Definition: exception.h:3048
ColourChannelType GetBlueByte(const Whole X, const Whole Y) const
Gets the blue colour value of a specified pixel. the X or Y location go beyond the set size of this t...
Real GetGreenReal(const Whole X, const Whole Y) const
Gets the green colour value of a specified pixel. the X or Y location go beyond the set size of this ...
STL namespace.
Whole Width
The size of the texture to be generated on the X axis.
Definition: texturebuffer.h:97
This is a simple class for holding 4 reals representing the colour any give object or lightsource can...
Definition: colourvalue.h:64
Whole GetByteSize() const
Gets the size of the internal buffer in bytes.
ColourChannelType * Pixels
A pointer to the buffer storing all the pixels of this texture buffer.
Definition: texturebuffer.h:94
ColourChannelType GetAlphaByte(const Whole X, const Whole Y) const
Gets the alpha colour value of a specified pixel. the X or Y location go beyond the set size of this ...
float Real
A Datatype used to represent a real floating point number.
Definition: datatypes.h:141
Texture * GenerateTexture(const String &TexName, const String &TexGroup, const Graphics::PixelFormat Format=Graphics::PF_R8G8B8A8) const
Creates a Texture from this buffer.
void SetGreenByte(const Whole X, const Whole Y, const ColourChannelType Green)
Sets the green colour value of a specified pixel. the X or Y location go beyond the set size of this ...
uint16_t UInt16
An 16-bit unsigned integer.
Definition: datatypes.h:122
Real GreenChannel
Value from 0.0 to 1.0 representing the amount of green present in the colour. 1.0 if very green...
Definition: colourvalue.h:73
void SetGreenReal(const Whole X, const Whole Y, const Real Green)
Sets the green colour value of a specified pixel. the X or Y location go beyond the set size of this ...
static TextureManager * GetSingletonPtr()
Fetches a pointer to the singleton.
Definition: singleton.h:97
This class represents a texture loaded into video memory.
Definition: texture.h:63
Real AlphaChannel
Value from 0.0 to 1.0 representing the transparency of the colours. 1.0 is opaque and 0...
Definition: colourvalue.h:79
This class represents an image loaded into system memory.
Definition: image.h:63
PixelFormat
This is used to describe how bits are arraged for each pixel in an image.
Thrown when a passed parameter is checked at runtime and not in the expected range.
Definition: exception.h:110
void SetPixelReal(const Whole X, const Whole Y, const Real Red, const Real Green, const Real Blue, const Real Alpha=1.0)
Set colour of a specified pixel using a 0.0-1.0 range. the X or Y location go beyond the set size of ...
void SetAlphaReal(const Whole X, const Whole Y, const Real Alpha)
Sets the alpha colour value of a specified pixel. the X or Y location go beyond the set size of this ...
void SetBlueReal(const Whole X, const Whole Y, const Real Blue)
Sets the blue colour value of a specified pixel. the X or Y location go beyond the set size of this t...
Real GetRedReal(const Whole X, const Whole Y) const
Gets the red colour value of a specified pixel. the X or Y location go beyond the set size of this te...
A convenience buffer that stores pixel colour values of a texture to be generated.
Definition: texturebuffer.h:86
A normal 2 dimensional texture.
void SetRedReal(const Whole X, const Whole Y, const Real Red)
Sets the red colour value of a specified pixel. the X or Y location go beyond the set size of this te...
The bulk of the engine components go in this namspace.
Definition: actor.cpp:56
void _WriteToBuffer(UInt8 *SrcBuffer, const Whole BufferSize, const Graphics::PixelFormat SrcFormat)
Writes to the textures internal buffer. the size of this texture is smaller than the buffer being wri...
Definition: texture.cpp:138
unsigned long Whole
Whole is an unsigned integer, it will be at least 32bits in size.
Definition: datatypes.h:151
Whole GetHeight() const
Get the pixel height of this texture.
Real BlueChannel
Value from 0.0 to 1.0 representing the amount of blue present in the colour. 1.0 if very blue...
Definition: colourvalue.h:76
void SetPixel(const Whole X, const Whole Y, const ColourValue &Colour)
Set colour of a specified pixel using a ColourValue. the X or Y location go beyond the set size of th...
Real RedChannel
Value from 0.0 to 1.0 representing the amount of red present in the colour. 1.0 if very red...
Definition: colourvalue.h:70
ColourChannelType GetGreenByte(const Whole X, const Whole Y) const
Gets the green colour value of a specified pixel. the X or Y location go beyond the set size of this ...
Thrown when attempted to access something that really should note be accessed.
Definition: exception.h:98
void SetAlphaByte(const Whole X, const Whole Y, const ColourChannelType Alpha)
Sets the alpha colour value of a specified pixel. the X or Y location go beyond the set size of this ...
void SetBlueByte(const Whole X, const Whole Y, const ColourChannelType Blue)
Sets the blue colour value of a specified pixel. the X or Y location go beyond the set size of this t...
std::string String
A datatype used to a series of characters.
Definition: datatypes.h:159
Image * GenerateImage(const Graphics::PixelFormat Format=Graphics::PF_R8G8B8A8) const
Creates an Image from this buffer.
void SetData(const TextureBuffer &Other)
Copies image data from another buffer into this buffer.
Whole GetSubChannelCount() const
Gets the number of colour channels among all the pixels in this texture.
ColourChannelType GetRedByte(const Whole X, const Whole Y) const
Gets the red colour value of a specified pixel. the X or Y location go beyond the set size of this te...
UInt8 ColourChannelType
Convenience typedef for the datatype containing the value for each colour channel.
Definition: texturebuffer.h:90
Whole GetPixelCount() const
Gets the number of pixels in this texture.