2
* Copyright 2010 Inalogic Inc.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3, as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the applicable version of the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of both the GNU Lesser General Public
15
* License version 3 along with this program. If not, see
16
* <http://www.gnu.org/licenses/>
18
* Authored by: Jay Taoko <jay.taoko_AT_gmail_DOT_com>
23
#include "GLDeviceObjects.h"
24
#include "IOpenGLVolumeTexture.h"
28
IMPLEMENT_OBJECT_TYPE(IOpenGLVolumeTexture);
30
IOpenGLVolumeTexture::IOpenGLVolumeTexture(
35
, BitmapFormat PixelFormat)
36
: IOpenGLBaseTexture(RTVOLUMETEXTURE, Width, Height, Depth, Levels, PixelFormat)
38
CHECKGL( glGenTextures(1, &_OpenGLID) );
39
CHECKGL( glBindTexture(GL_TEXTURE_3D, _OpenGLID) );
41
_VolumeSurfaceArray = new std::vector< TRefGL<IOpenGLSurface> >[_NumMipLevel];
42
for (t_u32 mip = 0; mip < _NumMipLevel; mip++)
44
for (t_u32 slice = 0; slice < ImageSurface::GetLevelDim(_PixelFormat, _Depth, mip); slice++)
46
//IOpenGLSurface* surface = new IOpenGLSurface(this, _OpenGLID, GL_TEXTURE_3D, GL_TEXTURE_3D, mip, slice);
47
//surface->InitializeLevel();
48
_VolumeSurfaceArray[mip].push_back(new IOpenGLSurface(this, _OpenGLID, GL_TEXTURE_3D, GL_TEXTURE_3D, mip, slice));
52
for (int mip = 0; mip < _NumMipLevel; mip++)
54
IOpenGLVolume* volume = new IOpenGLVolume(this, _OpenGLID, GL_TEXTURE_3D, GL_TEXTURE_3D, mip);
55
volume->InitializeLevel();
56
_VolumeArray.push_back(volume);
59
CHECKGL( glBindTexture(GL_TEXTURE_3D, _OpenGLID) );
60
SetFiltering(GL_NEAREST, GL_NEAREST);
61
SetWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE);
63
GRunTimeStats.Register(this);
66
IOpenGLVolumeTexture::~IOpenGLVolumeTexture()
69
for (t_u32 mip = 0; mip < _NumMipLevel; mip++)
71
for (t_u32 slice = 0; slice < ImageSurface::GetLevelDim(_PixelFormat, _Depth, mip); slice++)
73
// destroying a surface
74
_VolumeSurfaceArray[mip][slice] = 0;;
76
_VolumeSurfaceArray[mip].clear();
78
INL_SAFE_DELETE_ARRAY(_VolumeSurfaceArray);
81
for (int mip = 0; mip < _NumMipLevel; mip++)
83
// destroying a IOpenGLVolume
84
_VolumeArray[mip] = 0;
87
CHECKGL( glDeleteTextures(1, &_OpenGLID) );
89
GRunTimeStats.UnRegister(this);
92
int IOpenGLVolumeTexture::LockRect(
95
SURFACE_LOCKED_RECT * pLockedRect,
96
const SURFACE_RECT * pRect)
98
nuxAssertMsg(pLockedRect, TEXT("[IOpenGLVolumeTexture::LockRect] Invalid parameter 'pLockedRect'."));
99
nuxAssertMsg(Level >= 0, TEXT("[IOpenGLVolumeTexture::LockRect] Invalid mipmap level."));
100
nuxAssertMsg(Level < _NumMipLevel, TEXT("[IOpenGLVolumeTexture::LockRect] Invalid mipmap level."));
101
nuxAssertMsg(Slice >= 0, TEXT("[IOpenGLVolumeTexture::LockRect] Invalid slice index."));
102
nuxAssertMsg(Slice < ImageSurface::GetLevelDim(_PixelFormat, _Depth, Level), TEXT("[IOpenGLVolumeTexture::LockRect] Invalid slice index."));
109
if(Level < _NumMipLevel)
111
TRefGL<IOpenGLSurface> pVolumeSurfaceLevel = _VolumeSurfaceArray[Level][Slice];
112
return pVolumeSurfaceLevel->LockRect(pLockedRect, pRect);
116
pLockedRect->pBits = 0;
117
pLockedRect->Pitch = 0;
118
return OGL_INVALID_SURFACE_LEVEL;
123
int IOpenGLVolumeTexture::UnlockRect(
128
nuxAssertMsg(Level >= 0, TEXT("[IOpenGLVolumeTexture::LockRect] Invalid mipmap level."));
129
nuxAssertMsg(Level < _NumMipLevel, TEXT("[IOpenGLVolumeTexture::LockRect] Invalid mipmap level."));
131
if(Level < _NumMipLevel)
133
TRefGL<IOpenGLSurface> pVolumeSurfaceLevel = _VolumeSurfaceArray[Level][Slice];
134
return pVolumeSurfaceLevel->UnlockRect();
138
return OGL_INVALID_SURFACE_LEVEL;
143
int IOpenGLVolumeTexture::LockBox(int Level,
144
VOLUME_LOCKED_BOX * pLockedVolume,
145
const VOLUME_BOX * pBox)
147
nuxAssertMsg(pLockedVolume, TEXT("[IOpenGLVolumeTexture::LockBox] Invalid parameter 'pLockedRect'."));
148
nuxAssertMsg(Level >= 0, TEXT("[IOpenGLVolumeTexture::LockBox] Invalid mipmap level."));
149
nuxAssertMsg(Level < _NumMipLevel, TEXT("[IOpenGLVolumeTexture::LockBox] Invalid mipmap level."));
153
nuxAssertMsg(pBox->Front >= 0, TEXT("[IOpenGLVolumeTexture::LockBox] Invalid slice index."));
154
nuxAssertMsg(pBox->Front < pBox->Back, TEXT("[IOpenGLVolumeTexture::LockBox] Invalid slice index."));
155
nuxAssertMsg(pBox->Back <= ImageSurface::GetLevelDim(_PixelFormat, _Depth, Level),
156
TEXT("[IOpenGLVolumeTexture::LockBox] Invalid slice index."));
159
return _VolumeArray[Level]->LockBox(pLockedVolume, pBox);
162
int IOpenGLVolumeTexture::UnlockBox(int Level)
164
nuxAssertMsg(Level >= 0, TEXT("[IOpenGLVolumeTexture::LockBox] Invalid mipmap level."));
165
nuxAssertMsg(Level < _NumMipLevel, TEXT("[IOpenGLVolumeTexture::LockBox] Invalid mipmap level."));
167
return _VolumeArray[Level]->UnlockBox();