void PGlTexture::setWrapMode(PGLTextureWrapModeEnum wrapModeS, PGLTextureWrapModeEnum wrapModeT) { if (m_texture != 0) { if (m_wrapModeS != wrapModeS || m_wrapModeT != wrapModeT) { if (isCubeMap()) { if (wrapModeS != P_GLTEXTURE_WRAPMODE_CLAMP_TO_EDGE || wrapModeT != P_GLTEXTURE_WRAPMODE_CLAMP_TO_EDGE) { PASSERTINFO(0, "Wrap mode must be clamp to edge when the texture is a cubemap."); return; } } glActiveTexture(GL_TEXTURE0); glBindTexture(m_target, m_texture); setWrapModeInternal(wrapModeS, wrapModeT); glBindTexture(m_target, 0); } } m_wrapModeS = wrapModeS; m_wrapModeT = wrapModeT; }
void TPC::fixupCubeMap() { /* Do various fixups to the cube maps. This includes rotating and swapping a * few sides around. This is done by the original games as well. */ if (!isCubeMap()) return; for (size_t j = 0; j < getMipMapCount(); j++) { assert(getLayerCount() > 0); const size_t index0 = 0 * getMipMapCount() + j; assert(index0 < _mipMaps.size()); const int32 width = _mipMaps[index0]->width; const int32 height = _mipMaps[index0]->height; const uint32 size = _mipMaps[index0]->size; for (size_t i = 1; i < getLayerCount(); i++) { const size_t index = i * getMipMapCount() + j; assert(index < _mipMaps.size()); if ((width != _mipMaps[index]->width ) || (height != _mipMaps[index]->height) || (size != _mipMaps[index]->size )) throw Common::Exception("Cube map layer dimensions mismatch"); } } // Since we need to rotate the individual cube sides, we need to decompress them all decompress(); // Rotate the cube sides so that they're all oriented correctly for (size_t i = 0; i < getLayerCount(); i++) { for (size_t j = 0; j < getMipMapCount(); j++) { const size_t index = i * getMipMapCount() + j; assert(index < _mipMaps.size()); MipMap &mipMap = *_mipMaps[index]; static const int rotation[6] = { 3, 1, 0, 2, 2, 0 }; rotate90(mipMap.data, mipMap.width, mipMap.height, getBPP(_format), rotation[i]); } } // Swap the first two sides of the cube maps for (size_t j = 0; j < getMipMapCount(); j++) { const size_t index0 = 0 * getMipMapCount() + j; const size_t index1 = 1 * getMipMapCount() + j; assert((index0 < _mipMaps.size()) && (index1 < _mipMaps.size())); MipMap &mipMap0 = *_mipMaps[index0]; MipMap &mipMap1 = *_mipMaps[index1]; SWAP(mipMap0.data, mipMap1.data); } }
void TPC::fixupCubeMap() { /* Do various fixups to the cube maps. This includes rotating and swapping a * few sides around. This is done by the original games as well. */ if (!isCubeMap()) return; // Since we need to rotate the individual cube sides, we need to decompress them all decompress(); // Rotate the cube sides so that they're all oriented correctly for (size_t i = 0; i < getLayerCount(); i++) { for (size_t j = 0; j < getMipMapCount(); j++) { const size_t index = i * getMipMapCount() + j; assert(index < _mipMaps.size()); MipMap &mipMap = *_mipMaps[index]; static const int rotation[6] = { 3, 1, 0, 2, 2, 0 }; rotate90(mipMap.data, mipMap.width, mipMap.height, getBPP(_format), rotation[i]); } } // Swap the first two sides of the cube maps for (size_t j = 0; j < getMipMapCount(); j++) { const size_t index0 = 0 * getMipMapCount() + j; const size_t index1 = 1 * getMipMapCount() + j; assert((index0 < _mipMaps.size()) && (index1 < _mipMaps.size())); MipMap &mipMap0 = *_mipMaps[index0]; MipMap &mipMap1 = *_mipMaps[index1]; assert((mipMap0.width == mipMap1.width) && (mipMap0.height == mipMap1.height)); SWAP(mipMap0.data, mipMap1.data); } }