00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef Texture_INCUDE_DEFINE
00033 #define Texture_INCUDE_DEFINE
00034
00035 #include <vlCore/String.hpp>
00036 #include <vlCore/Vector4.hpp>
00037 #include <vlCore/Image.hpp>
00038 #include <vlGraphics/BufferObject.hpp>
00039
00040 namespace vl
00041 {
00042 class OpenGLContext;
00043
00044
00045
00046
00062 class VLGRAPHICS_EXPORT TexParameter: public Object
00063 {
00064 VL_INSTRUMENT_CLASS(vl::TexParameter, Object)
00065 friend class Texture;
00066
00067 public:
00068 TexParameter();
00069
00070 void apply(ETextureDimension dimension, OpenGLContext* gl) const;
00071
00072 ETexParamFilter minFilter() const { return mMinFilter; }
00073 ETexParamFilter magFilter() const { return mMagfilter; }
00074 ETexParamWrap wrapS() const { return mWrapS; }
00075 ETexParamWrap wrapT() const { return mWrapT; }
00076 ETexParamWrap wrapR() const { return mWrapR; }
00077 fvec4 borderColor() const { return mBorderColor; }
00078 float anisotropy() const { return mAnisotropy; }
00079 bool generateMipmap() const { return mGenerateMipmap; }
00080 ETexCompareMode compareMode() const { return mCompareMode; }
00081 ETexCompareFunc compareFunc() const { return mCompareFunc; }
00082 EDepthTextureMode depthTextureMode() const { return mDepthTextureMode; }
00083
00084 void setMinFilter(ETexParamFilter minfilter) { mDirty = true; mMinFilter = minfilter; }
00085 void setMagFilter(ETexParamFilter magfilter);
00086 void setWrapS(ETexParamWrap texturewrap) { mDirty = true; mWrapS = texturewrap; }
00087 void setWrapT(ETexParamWrap texturewrap) { mDirty = true; mWrapT = texturewrap; }
00088 void setWrapR(ETexParamWrap texturewrap) { mDirty = true; mWrapR = texturewrap; }
00089 void setBorderColor(fvec4 bordercolor) { mDirty = true; mBorderColor = bordercolor; }
00090 void setAnisotropy(float anisotropy) { mDirty = true; mAnisotropy = anisotropy; }
00091 void setGenerateMipmap(bool generate_mipmap) { mDirty = true; mGenerateMipmap = generate_mipmap; }
00092 void setCompareMode(ETexCompareMode mode) { mDirty = true; mCompareMode = mode; }
00093 void setCompareFunc(ETexCompareFunc func) { mDirty = true; mCompareFunc = func; }
00094 void setDepthTextureMode(EDepthTextureMode mode) { mDirty = true; mDepthTextureMode = mode; }
00095
00096 void setDirty(bool dirty) const { mDirty = dirty; }
00097
00098 bool dirty() const { return mDirty; }
00099
00100 protected:
00101 ETexParamFilter mMinFilter;
00102 ETexParamFilter mMagfilter;
00103 ETexParamWrap mWrapS;
00104 ETexParamWrap mWrapT;
00105 ETexParamWrap mWrapR;
00106 ETexCompareMode mCompareMode;
00107 ETexCompareFunc mCompareFunc;
00108 EDepthTextureMode mDepthTextureMode;
00109 fvec4 mBorderColor;
00110 float mAnisotropy;
00111 bool mGenerateMipmap;
00112
00113 mutable bool mDirty;
00114 };
00115
00116 class TextureSampler;
00117
00118
00119
00142 class VLGRAPHICS_EXPORT Texture: public Object
00143 {
00144 VL_INSTRUMENT_CLASS(vl::Texture, Object)
00145 friend class TextureSampler;
00146
00147 public:
00153 class SetupParams: public Object
00154 {
00155 public:
00156 SetupParams()
00157 {
00158 mDimension = TD_TEXTURE_2D;
00159 mFormat = TF_RGBA;
00160 mBorder = false;
00161 mGenMipmaps = false;
00162 mWidth = mHeight = mDepth = 0;
00163 mSamples = 0;
00164 mFixedSamplesLocation = true;
00165 }
00166
00167 void setImagePath(const String& path) { mImagePath = path; }
00168 const String& imagePath() const { return mImagePath; }
00169
00170 void setImage(const Image* image) { mImage = image; }
00171 const Image* image() const { return mImage.get(); }
00172
00173 const BufferObject* bufferObject() const { return mBufferObject.get(); }
00174 BufferObject* bufferObject() { return mBufferObject.get(); }
00175 void setBufferObject(BufferObject* bo) { mBufferObject = bo; }
00176
00177 void setDimension(ETextureDimension dimension) { mDimension = dimension; }
00178 ETextureDimension dimension() const { return mDimension; }
00179
00180 void setFormat(ETextureFormat format) { mFormat = format; }
00181 ETextureFormat format() const { return mFormat; }
00182
00183 void setBorder(bool on) { mBorder = on; }
00184 bool border() const { return mBorder; }
00185
00186 void setGenMipmaps(bool on) { mGenMipmaps = on; }
00187 bool genMipmaps() const { return mGenMipmaps; }
00188
00189 void setWidth(int w) { mWidth = w; }
00190 int width() const { return mWidth; }
00191
00192 void setHeight(int h) { mHeight = h; }
00193 int height() const { return mHeight; }
00194
00195 void setDepth(int d) { mDepth = d; }
00196 int depth() const { return mDepth; }
00197
00198 int samples() const { return mSamples; }
00199 void setSamples(int samples) { mSamples = samples; }
00200
00201 bool fixedSamplesLocations() const { return mFixedSamplesLocation; }
00202 void setFixedSamplesLocations(bool fixed) { mFixedSamplesLocation = fixed; }
00203
00204 protected:
00205 String mImagePath;
00206 ref<BufferObject> mBufferObject;
00207 ref<Image> mImage;
00208 ETextureDimension mDimension;
00209 ETextureFormat mFormat;
00210 int mWidth, mHeight, mDepth;
00211 int mSamples;
00212 bool mBorder;
00213 bool mGenMipmaps;
00214 bool mFixedSamplesLocation;
00215 };
00216
00217 public:
00220 Texture(const String& image_path, ETextureFormat format = TF_RGBA, bool mipmaps = true, bool border=false);
00221
00224 Texture(const Image* image, ETextureFormat format = TF_RGBA, bool mipmaps = true, bool border=false);
00225
00228 Texture(int width, ETextureFormat format = TF_RGBA, bool border=false);
00229
00232 Texture(int width, int height, ETextureFormat format = TF_RGBA, bool border=false);
00233
00236 Texture(int width, int height, int depth, ETextureFormat format = TF_RGBA, bool border=false);
00237
00239 Texture();
00240
00242 ~Texture();
00243
00245 TexParameter* getTexParameter() { return mTexParameter.get(); }
00246
00248 const TexParameter* getTexParameter() const { return mTexParameter.get(); }
00249
00251 const TexParameter* getTexParameterOverride() const { return mTexParameterOverride.get(); }
00252
00254 BufferObject* bufferObject() { return mBufferObject.get(); }
00255
00257 const BufferObject* bufferObject() const { return mBufferObject.get(); }
00258
00260 void destroyTexture();
00261
00265 bool createTexture();
00266
00269 bool createTexture(ETextureDimension tex_dimension, ETextureFormat tex_format, int w, int h, int d, bool border, BufferObject* bo, int samples, bool fixedsamplelocations);
00270
00278 bool setMipLevel(int mip_level, const Image* img, bool gen_mipmaps);
00279
00281 void prepareTexture1D(int width, ETextureFormat format, bool border=false)
00282 {
00283 prepareTexture1D(NULL, format, false, border);
00284 mSetupParams->setWidth(width);
00285 }
00286
00288 bool createTexture1D(int width, ETextureFormat format, bool border=false)
00289 {
00290 prepareTexture1D(width, format, border);
00291 return createTexture();
00292 }
00293
00295 void prepareTexture1D(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00296 {
00297 prepareTexture1D(NULL, format, mipmaps, border);
00298 mSetupParams->setImagePath(image_path);
00299 }
00300
00302 bool createTexture1D(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00303 {
00304 prepareTexture1D(image_path, format, mipmaps, border);
00305 return createTexture();
00306 }
00307
00309 void prepareTexture1D(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00310 {
00311 mSetupParams = new SetupParams;
00312 mSetupParams->setImage(image);
00313 mSetupParams->setDimension(TD_TEXTURE_1D);
00314 mSetupParams->setFormat(format);
00315 mSetupParams->setGenMipmaps(mipmaps);
00316 mSetupParams->setBorder(border);
00317 }
00318
00320 bool createTexture1D(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00321 {
00322 prepareTexture1D(image, format, mipmaps, border);
00323 return createTexture();
00324 }
00325
00327 void prepareTexture2D(int width, int height, ETextureFormat format, bool border=false)
00328 {
00329 prepareTexture2D(NULL, format, false, border);
00330 mSetupParams->setWidth(width);
00331 mSetupParams->setHeight(height);
00332 }
00333
00335 bool createTexture2D(int width, int height, ETextureFormat format, bool border=false)
00336 {
00337 prepareTexture2D(width, height, format, border);
00338 return createTexture();
00339 }
00340
00342 void prepareTexture2D(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00343 {
00344 prepareTexture2D(NULL, format, mipmaps, border);
00345 mSetupParams->setImagePath(image_path);
00346 }
00347
00349 bool createTexture2D(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00350 {
00351 prepareTexture2D(image_path, format, mipmaps, border);
00352 return createTexture();
00353 }
00354
00356 void prepareTexture2D(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00357 {
00358 mSetupParams = new SetupParams;
00359 mSetupParams->setImage(image);
00360 mSetupParams->setDimension(TD_TEXTURE_2D);
00361 mSetupParams->setFormat(format);
00362 mSetupParams->setGenMipmaps(mipmaps);
00363 mSetupParams->setBorder(border);
00364 }
00365
00367 bool createTexture2D(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00368 {
00369 prepareTexture2D(image, format, mipmaps, border);
00370 return createTexture();
00371 }
00372
00374 void prepareTexture3D(int width, int height, int depth, ETextureFormat format, bool border=false)
00375 {
00376 prepareTexture3D(NULL, format, false, border);
00377 mSetupParams->setWidth(width);
00378 mSetupParams->setHeight(height);
00379 mSetupParams->setDepth(depth);
00380 }
00381
00383 bool createTexture3D(int width, int height, int depth, ETextureFormat format, bool border=false)
00384 {
00385 prepareTexture3D(width, height, depth, format, border);
00386 return createTexture();
00387 }
00388
00390 void prepareTexture3D(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00391 {
00392 prepareTexture3D(NULL, format, mipmaps, border);
00393 mSetupParams->setImagePath(image_path);
00394 }
00395
00397 bool createTexture3D(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00398 {
00399 prepareTexture3D(image_path, format, mipmaps, border);
00400 return createTexture();
00401 }
00402
00404 void prepareTexture3D(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00405 {
00406 mSetupParams = new SetupParams;
00407 mSetupParams->setImage(image);
00408 mSetupParams->setDimension(TD_TEXTURE_3D);
00409 mSetupParams->setFormat(format);
00410 mSetupParams->setGenMipmaps(mipmaps);
00411 mSetupParams->setBorder(border);
00412 }
00413
00415 bool createTexture3D(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00416 {
00417 prepareTexture3D(image, format, mipmaps, border);
00418 return createTexture();
00419 }
00420
00422 void prepareTextureCubemap(int width, int height, ETextureFormat format, bool border=false)
00423 {
00424 prepareTextureCubemap(NULL, format, false, border);
00425 mSetupParams->setWidth(width);
00426 mSetupParams->setHeight(height);
00427 }
00428
00430 bool createTextureCubemap(int width, int height, ETextureFormat format, bool border=false)
00431 {
00432 prepareTextureCubemap(width, height, format, border);
00433 return createTexture();
00434 }
00435
00437 void prepareTextureCubemap(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00438 {
00439 prepareTextureCubemap(NULL, format, mipmaps, border);
00440 mSetupParams->setImagePath(image_path);
00441 }
00442
00444 bool createTextureCubemap(const String& image_path, ETextureFormat format, bool mipmaps=true, bool border=false)
00445 {
00446 prepareTextureCubemap(image_path, format, mipmaps, border);
00447 return createTexture();
00448 }
00449
00451 void prepareTextureCubemap(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00452 {
00453 mSetupParams = new SetupParams;
00454 mSetupParams->setImage(image);
00455 mSetupParams->setDimension(TD_TEXTURE_CUBE_MAP);
00456 mSetupParams->setFormat(format);
00457 mSetupParams->setGenMipmaps(mipmaps);
00458 mSetupParams->setBorder(border);
00459 }
00460
00462 bool createTextureCubemap(const Image* image, ETextureFormat format, bool mipmaps=true, bool border=false)
00463 {
00464 prepareTextureCubemap(image, format, mipmaps, border);
00465 return createTexture();
00466 }
00467
00469 void prepareTexture1DArray(int width, int count, ETextureFormat format)
00470 {
00471 prepareTexture1DArray(NULL, format, false);
00472 mSetupParams->setWidth(width);
00473 mSetupParams->setHeight(count);
00474 }
00475
00477 bool createTexture1DArray(int width, int count, ETextureFormat format)
00478 {
00479 prepareTexture1DArray(width, count, format);
00480 return createTexture();
00481 }
00482
00484 void prepareTexture1DArray(const String& image_path, ETextureFormat format, bool mipmaps=true)
00485 {
00486 prepareTexture1DArray(NULL, format, mipmaps);
00487 mSetupParams->setImagePath(image_path);
00488 }
00489
00491 bool createTexture1DArray(const String& image_path, ETextureFormat format, bool mipmaps=true)
00492 {
00493 prepareTexture1DArray(image_path, format, mipmaps);
00494 return createTexture();
00495 }
00496
00498 void prepareTexture1DArray(const Image* image, ETextureFormat format, bool mipmaps=true)
00499 {
00500 mSetupParams = new SetupParams;
00501 mSetupParams->setImage(image);
00502 mSetupParams->setDimension(TD_TEXTURE_1D_ARRAY);
00503 mSetupParams->setFormat(format);
00504 mSetupParams->setGenMipmaps(mipmaps);
00505 mSetupParams->setBorder(false);
00506 }
00507
00509 bool createTexture1DArray(const Image* image, ETextureFormat format, bool mipmaps=true)
00510 {
00511 prepareTexture1DArray(image, format, mipmaps);
00512 return createTexture();
00513 }
00514
00516 void prepareTexture2DArray(int width, int height, int count, ETextureFormat format)
00517 {
00518 prepareTexture2DArray(NULL, format, false);
00519 mSetupParams->setWidth(width);
00520 mSetupParams->setHeight(height);
00521 mSetupParams->setDepth(count);
00522 }
00523
00525 bool createTexture2DArray(int width, int height, int count, ETextureFormat format)
00526 {
00527 prepareTexture2DArray(width, height, count, format);
00528 return createTexture();
00529 }
00530
00532 void prepareTexture2DArray(const String& image_path, ETextureFormat format, bool mipmaps=true)
00533 {
00534 prepareTexture2DArray(NULL, format, mipmaps);
00535 mSetupParams->setImagePath(image_path);
00536 }
00537
00539 bool createTexture2DArray(const String& image_path, ETextureFormat format, bool mipmaps=true)
00540 {
00541 prepareTexture2DArray(image_path, format, mipmaps);
00542 return createTexture();
00543 }
00544
00546 void prepareTexture2DArray(const Image* image, ETextureFormat format, bool mipmaps=true)
00547 {
00548 mSetupParams = new SetupParams;
00549 mSetupParams->setImage(image);
00550 mSetupParams->setDimension(TD_TEXTURE_2D_ARRAY);
00551 mSetupParams->setFormat(format);
00552 mSetupParams->setGenMipmaps(mipmaps);
00553 mSetupParams->setBorder(false);
00554 }
00555
00557 bool createTexture2DArray(const Image* image, ETextureFormat format, bool mipmaps=true)
00558 {
00559 prepareTexture2DArray(image, format, mipmaps);
00560 return createTexture();
00561 }
00562
00564 void prepareTextureRectangle(int width, int height, ETextureFormat format)
00565 {
00566 prepareTextureRectangle(NULL, format);
00567 mSetupParams->setWidth(width);
00568 mSetupParams->setHeight(height);
00569 }
00570
00572 bool createTextureRectangle(int width, int height, ETextureFormat format)
00573 {
00574 prepareTextureRectangle(width, height, format);
00575 return createTexture();
00576 }
00577
00579 void prepareTextureRectangle(const String& image_path, ETextureFormat format)
00580 {
00581 prepareTextureRectangle(NULL, format);
00582 mSetupParams->setImagePath(image_path);
00583 }
00584
00586 bool createTextureRectangle(const String& image_path, ETextureFormat format)
00587 {
00588 prepareTextureRectangle(image_path, format);
00589 return createTexture();
00590 }
00591
00593 void prepareTextureRectangle(const Image* image, ETextureFormat format)
00594 {
00595 mSetupParams = new SetupParams;
00596 mSetupParams->setImage(image);
00597 mSetupParams->setDimension(TD_TEXTURE_RECTANGLE);
00598 mSetupParams->setFormat(format);
00599 mSetupParams->setGenMipmaps(false);
00600 mSetupParams->setBorder(false);
00601 }
00602
00604 bool createTextureRectangle(const Image* image, ETextureFormat format)
00605 {
00606 prepareTextureRectangle(image, format);
00607 return createTexture();
00608 }
00609
00611 void prepareTextureBuffer(vl::ETextureFormat format, BufferObject* bo)
00612 {
00613 mSetupParams = new SetupParams;
00614 mSetupParams->setDimension(TD_TEXTURE_BUFFER);
00615 mSetupParams->setFormat(format);
00616 mSetupParams->setBufferObject(bo);
00617 mSetupParams->setGenMipmaps(false);
00618 mSetupParams->setBorder(false);
00619 }
00620
00622 bool createTextureBuffer(vl::ETextureFormat format, BufferObject* bo)
00623 {
00624 prepareTextureBuffer(format, bo);
00625 return createTexture();
00626 }
00627
00629 void prepareTexture2DMultisample(int width, int height, vl::ETextureFormat format, int samples, bool fixedsamplelocations)
00630 {
00631 mSetupParams = new SetupParams;
00632 mSetupParams->setDimension(TD_TEXTURE_2D_MULTISAMPLE);
00633 mSetupParams->setWidth(width);
00634 mSetupParams->setHeight(height);
00635 mSetupParams->setFormat(format);
00636 mSetupParams->setSamples(samples);
00637 mSetupParams->setFixedSamplesLocations(fixedsamplelocations);
00638 mSetupParams->setGenMipmaps(false);
00639 mSetupParams->setBorder(false);
00640 }
00641
00643 bool createTexture2DMultisample(int width, int height, vl::ETextureFormat format, int samples, bool fixedsamplelocations)
00644 {
00645 prepareTexture2DMultisample(width, height, format, samples, fixedsamplelocations);
00646 return createTexture();
00647 }
00648
00650 void prepareTexture2DMultisampleArray(int width, int height, int depth, vl::ETextureFormat format, int samples, bool fixedsamplelocations)
00651 {
00652 mSetupParams = new SetupParams;
00653 mSetupParams->setDimension(TD_TEXTURE_2D_MULTISAMPLE_ARRAY);
00654 mSetupParams->setWidth(width);
00655 mSetupParams->setHeight(height);
00656 mSetupParams->setDepth(depth);
00657 mSetupParams->setFormat(format);
00658 mSetupParams->setSamples(samples);
00659 mSetupParams->setFixedSamplesLocations(fixedsamplelocations);
00660 mSetupParams->setGenMipmaps(false);
00661 mSetupParams->setBorder(false);
00662 }
00663
00665 bool createTexture2DMultisampleArray(int width, int height, int depth, vl::ETextureFormat format, int samples, bool fixedsamplelocations)
00666 {
00667 prepareTexture2DMultisampleArray(width, height, depth, format, samples, fixedsamplelocations);
00668 return createTexture();
00669 }
00670
00672 void setHandle(unsigned int id) { mHandle = id; }
00674 unsigned int handle() const { return mHandle; }
00675
00677 void setDimension(ETextureDimension dimension) { mDimension = dimension; }
00679 ETextureDimension dimension() const { return mDimension; }
00680
00682 void setInternalFormat(ETextureFormat format) { mFormat = format; }
00684 ETextureFormat internalFormat() const { return mFormat; }
00685
00687 void setWidth(int x) { mWidth = x; }
00689 int width() const { return mWidth; }
00690
00692 void setHeight(int y) { mHeight = y; }
00694 int height() const { return mHeight; }
00695
00697 void setDepth(int z) { mDepth = z; }
00699 int depth() const { return mDepth; }
00700
00702 void setBorder(bool border) { mBorder = border; }
00704 bool border() const { return mBorder; }
00705
00707 void setSamples(int samples) { mSamples = samples; }
00709 int samples() const { return mSamples; }
00710
00712 void setFixedSamplesLocation(bool fixed) { mFixedSamplesLocation = fixed; }
00714 bool fixedSamplesLocation() const { return mFixedSamplesLocation; }
00715
00717 void setSetupParams(SetupParams* setup_params) { mSetupParams = setup_params; }
00718
00720 const SetupParams* setupParams() const { return mSetupParams.get(); }
00721
00723 SetupParams* setupParams() { return mSetupParams.get(); }
00724
00726 bool isValid() const;
00727
00729 bool isDepthTexture() const;
00730
00733 void clone(const Texture& other);
00734
00736 static bool supports(ETextureDimension tex_dimension, ETextureFormat tex_format, int mip_level, EImageDimension img_dimension, int w, int h, int d, bool border, int samples, bool fixedsamplelocations, bool verbose);
00737
00739 static bool isCompressedFormat(int format);
00740
00741 private:
00742 Texture(const Texture& other): Object(other) {}
00743 void operator=(const Texture&) {}
00744 void reset();
00745
00746 protected:
00747 unsigned int mHandle;
00748 ref<TexParameter> mTexParameter;
00749 mutable ref<TexParameter> mTexParameterOverride;
00750 ref<SetupParams> mSetupParams;
00751 ref<BufferObject> mBufferObject;
00752 ETextureFormat mFormat;
00753 ETextureDimension mDimension;
00754 int mWidth;
00755 int mHeight;
00756 int mDepth;
00757 int mSamples;
00758 bool mBorder;
00759 bool mFixedSamplesLocation;
00760 };
00761 }
00762
00763 #endif