~hikiko/nux/arb-srgba-shader

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*
 * Copyright 2010 Inalogic® Inc.
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License, as
 * published by the  Free Software Foundation; either version 2.1 or 3.0
 * of the License.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranties of
 * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
 * PURPOSE.  See the applicable version of the GNU Lesser General Public
 * License for more details.
 *
 * You should have received a copy of both the GNU Lesser General Public
 * License along with this program. If not, see <http://www.gnu.org/licenses/>
 *
 * Authored by: Jay Taoko <jaytaoko@inalogic.com>
 *
 */


#ifndef IOPENGLBASETEXTURE_H
#define IOPENGLBASETEXTURE_H

#include "GLResource.h"
#include "IOpenGLResource.h"
#include "GLShaderParameter.h"
#include "GLTextureStates.h"

namespace nux
{

  class IOpenGLResource;
  class IOpenGLBaseTexture;

  int GetTextureSize(IOpenGLBaseTexture *pTexture);

// todo: It should not be possible to create an object of type IOpenGLBaseTexture directly.
  class IOpenGLBaseTexture: public IOpenGLResource
  {
    NUX_DECLARE_OBJECT_TYPE(IOpenGLBaseTexture, IOpenGLResource);

  public:

    IOpenGLBaseTexture(OpenGLResourceType ResourceType,
                        unsigned int Width,
                        unsigned int Height,
                        unsigned int Depth,
                        unsigned int NumMipLevel,
                        BitmapFormat PixelFormat, NUX_FILE_LINE_PROTO);

    virtual ~IOpenGLBaseTexture();

    BitmapFormat GetPixelFormat() const
    {
      return _PixelFormat;
    }
    int GetNumMipLevel() const
    {
      return _NumMipLevel;
    }
    bool IsPowerOfTwo() const
    {
      return _IsPOT;
    }

    int GetWidth() const
    {
      if (_ResourceType == RTTEXTURE)
        return _Width;

      if (_ResourceType == RTTEXTURERECTANGLE)
        return _Width;

      if (_ResourceType == RTCUBETEXTURE)
        return _Width;

      return 0;
    }

    int GetHeight() const
    {
      if (_ResourceType == RTTEXTURE)
        return _Height;

      if (_ResourceType == RTTEXTURERECTANGLE)
        return _Height;

      if (_ResourceType == RTCUBETEXTURE)
        return _Width;

      return 0;
    }

    int GetDepth() const
    {
      if (_ResourceType == RTTEXTURE)
        return 1;

      if (_ResourceType == RTTEXTURERECTANGLE)
        return 1;

      if (_ResourceType == RTCUBETEXTURE)
        return 1;

      if (_ResourceType == RTVOLUMETEXTURE)
        return _Depth;

      if (_ResourceType == RTANIMATEDTEXTURE)
        return _Depth;

      return 0;
    }

    int GetFormatRowMemoryAlignment() const
    {
      return _RowMemoryAlignment;
    }
    //GLTextureStates& GetTextureStates() {return _TextureStates;}

    void SetRenderStates();
    void SetFiltering(unsigned int MIN = GL_NEAREST, unsigned int MAG = GL_NEAREST/*, unsigned int MIP = GL_NEAREST*/);
    void SetWrap(unsigned int U = GL_REPEAT, unsigned int V = GL_REPEAT, unsigned int W = GL_REPEAT);
    void SetLOD(float MinLod = -1000.0f, float MaxLod = +1000.0f);
    void SetMipLevel(unsigned int MinMip = 0, unsigned int MaxMip = 1000);
    void SetBorderColor(float R, float G, float B, float A);

    int BindTexture();
    int BindTextureToUnit(int TextureUnitIndex);

    virtual void GetSurfaceLevel(int Level, ObjectPtr<IOpenGLSurface>& surface);
    virtual ObjectPtr<IOpenGLSurface> GetSurfaceLevel(int Level);
    virtual int LockRect(
      int Level,
      SURFACE_LOCKED_RECT *pLockedRect,
      const SURFACE_RECT *pRect);

    virtual int UnlockRect(int Level);

    //! Return a pointer to a mipmap level data.
    /*!
        Return a pointer to a mipmap level data. The data is in the RGBA format.\n

        @param level The requested texture mipmap level data.
        @param width Returns the width in pixel of the image data.
        @param height Returns the height in pixel of the image data.
        @param stride Returns the row stride of the image data.

        @return A pointer to RGBA data. The caller must delete the data by calling delete [].
    */
    virtual unsigned char* GetSurfaceData(int level, int &width, int &height, int &stride);

  protected:
    GLTextureStates _TextureStates;
    bool            _IsPOT;             // is power of two?
    int           _NumMipLevel;
    BitmapFormat    _PixelFormat;

    // These parameters are scalable across textures, cube textures and volume textures.
    // For texture and cube texture _Depth is equal to 1.
    // For cube texture, _Width = _Height
    int        _Width;
    int        _Height;
    int         _Depth;
    int         _RowMemoryAlignment;

    friend class IOpenGLSurface;
    friend class IOpenGLVolume;
    friend void GetTextureDesc(
      IOpenGLBaseTexture *pTexture,
      unsigned int Level,
      TEXTURE_DESC *pDesc
    );
    friend int GetTextureSize(IOpenGLBaseTexture *pTexture);
  };

}

#endif // IOPENGLBASETEXTURE_H