[Feat] (MG_State/Texture): Initial implementation of cube map

This commit is contained in:
2025-11-25 22:47:41 +08:00
parent 4d44dda117
commit a0aaba3cb5
10 changed files with 184 additions and 52 deletions
@@ -114,12 +114,10 @@ namespace MobileGL {
void TextureObjectWithOneMipmap::AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel,
MipmapInput input) {
// don't care target, index always 0
m_textureStorage.AllocateLevel(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input);
}
void TextureObjectWithOneMipmap::UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel,
DataPtr input) {
// ditto
m_textureStorage.UpdateSubData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input);
}
void* TextureObjectWithOneMipmap::MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) {
@@ -127,7 +125,6 @@ namespace MobileGL {
}
void TextureObjectWithOneMipmap::MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, bool dirty) {
// ditto
m_textureStorage.MarkDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, dirty);
}
@@ -25,6 +25,7 @@ namespace MobileGL {
virtual TextureInternalFormat GetFormat() const = 0;
virtual TextureTarget GetTarget() const = 0;
virtual const Vector<TextureUploadTarget>& GetUploadTargets() const = 0;
virtual IntVec3 GetBaseSize() const = 0;
virtual SharedPtr<SamplerObject> GetSamplerObject() const = 0;
virtual void SetInternalFormat(TextureInternalFormat format) = 0;
@@ -7,9 +7,12 @@ namespace MobileGL {
class TextureObject1D : public TextureObjectWithOneMipmap {
public:
explicit TextureObject1D(Uint externalIndex);
const Vector<TextureUploadTarget>& GetUploadTargets() const override {
return m_uploadTargets;
}
protected:
Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override;
const Vector<TextureUploadTarget> m_uploadTargets {TextureUploadTarget::Texture1D};
};
}
}
@@ -7,9 +7,12 @@ namespace MobileGL {
class TextureObject2D : public TextureObjectWithOneMipmap {
public:
explicit TextureObject2D(Uint externalIndex);
const Vector<TextureUploadTarget>& GetUploadTargets() const override {
return m_uploadTargets;
}
protected:
Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override;
const Vector<TextureUploadTarget> m_uploadTargets {TextureUploadTarget::Texture2D};
};
}
}
@@ -0,0 +1,59 @@
#include "TextureObject2DCube.h"
namespace MobileGL {
namespace MG_State {
namespace GLState {
TextureObject2DCube::TextureObject2DCube(Uint externalIndex):
TextureObjectBase(TextureTarget::TextureCubeMap, externalIndex) {
}
Uint TextureObject2DCube::GetMipmapLevelCount() const {
return m_textureStorage.GetLevelCount();
}
const IntVec3 TextureObject2DCube::GetMipmapTexelSize(TextureUploadTarget target,
Uint mipmapLevel) const {
return m_textureStorage.GetTexelSize(GetIndexOfTextureUploadTarget(target), mipmapLevel);
}
const SizeT TextureObject2DCube::GetMipmapByteSize(TextureUploadTarget target,
Uint mipmapLevel) const {
return m_textureStorage.GetByteSize(GetIndexOfTextureUploadTarget(target), mipmapLevel);
}
void
TextureObject2DCube::AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel,
MipmapInput input) {
m_textureStorage.AllocateLevel(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input);
}
void TextureObject2DCube::UpdateMipmapSubData(TextureUploadTarget uploadTarget,
Uint mipmapLevel, DataPtr input) {
m_textureStorage.UpdateSubData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, input);
}
void *
TextureObject2DCube::MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) {
return m_textureStorage.MapData(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel);
}
void TextureObject2DCube::MarkStorageDirty(TextureUploadTarget uploadTarget,
Uint mipmapLevel, bool dirty) {
m_textureStorage.MarkDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel, dirty);
}
bool TextureObject2DCube::IsStorageDirty(TextureUploadTarget uploadTarget,
Uint mipmapLevel) const {
return m_textureStorage.IsDirty(GetIndexOfTextureUploadTarget(uploadTarget), mipmapLevel);
}
Uint
TextureObject2DCube::GetIndexOfTextureUploadTarget(TextureUploadTarget target) const {
MOBILEGL_ASSERT(TextureUploadTarget::CubeMapPositiveX <= target && target <= TextureUploadTarget::ProxyCubeMap,
"Invalid TextureUploadTarget!");
return (Uint)target - (Uint)TextureUploadTarget::CubeMapPositiveX;
}
}
}
}
@@ -0,0 +1,37 @@
#pragma once
#include "TextureObject.h"
namespace MobileGL {
namespace MG_State {
namespace GLState {
class TextureObject2DCube : public TextureObjectBase {
public:
explicit TextureObject2DCube(Uint externalIndex);
const Vector<TextureUploadTarget>& GetUploadTargets() const override {
return m_uploadTargets;
}
Uint GetMipmapLevelCount() const override;
const IntVec3 GetMipmapTexelSize(TextureUploadTarget target, Uint mipmapLevel) const override;
const SizeT GetMipmapByteSize(TextureUploadTarget target, Uint mipmapLevel) const override;
void AllocateStorage(TextureUploadTarget uploadTarget, Uint mipmapLevel, MipmapInput input) override;
void UpdateMipmapSubData(TextureUploadTarget uploadTarget, Uint mipmapLevel, DataPtr input) override;
void* MapMipmapData(TextureUploadTarget uploadTarget, Uint mipmapLevel) override;
void MarkStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel, bool dirty) override;
bool IsStorageDirty(TextureUploadTarget uploadTarget, Uint mipmapLevel) const override;
protected:
Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override;
TextureStorage<6> m_textureStorage;
const Vector<TextureUploadTarget> m_uploadTargets {
TextureUploadTarget::CubeMapPositiveX,
TextureUploadTarget::CubeMapNegativeX,
TextureUploadTarget::CubeMapPositiveY,
TextureUploadTarget::CubeMapNegativeY,
TextureUploadTarget::CubeMapPositiveZ,
TextureUploadTarget::CubeMapNegativeZ,
};
};
}
}
}
@@ -7,9 +7,12 @@ namespace MobileGL {
class TextureObject3D : public TextureObjectWithOneMipmap {
public:
explicit TextureObject3D(Uint externalIndex);
const Vector<TextureUploadTarget>& GetUploadTargets() const override {
return m_uploadTargets;
}
protected:
Uint GetIndexOfTextureUploadTarget(TextureUploadTarget target) const override;
const Vector<TextureUploadTarget> m_uploadTargets {TextureUploadTarget::Texture3D};
};
}
}
@@ -4,6 +4,7 @@
#include "MG_State/GLState/TextureState/TextureObject2D.h"
#include "MG_State/GLState/TextureState/TextureObject3D.h"
#include "MG_Util/Types.h"
#include "TextureObject2DCube.h"
namespace MobileGL {
namespace MG_State {
@@ -34,7 +35,9 @@ namespace MobileGL {
case TextureTarget::Texture1D:
textureObject = MakeShared<TextureObject1D>(index);
break;
case TextureTarget::TextureCubeMap: // TODO
case TextureTarget::TextureCubeMap:
textureObject = MakeShared<TextureObject2DCube>(index);
break;
case TextureTarget::Texture2D:
textureObject = MakeShared<TextureObject2D>(index);
break;