void UniformSet::_updateTextureUniforms(UniformSetLocation & _location, bool _bUsesT0, bool _bUsesT1, bool _bForce)
{
	int nFB[2] = { 0, 0 };
	const bool bUsesTile[2] = { _bUsesT0, _bUsesT1 };
	TextureCache & cache = textureCache();
	for (u32 t = 0; t < 2; ++t) {
		if (!bUsesTile[t])
			continue;

		if (gSP.textureTile[t] != NULL) {
			if (gSP.textureTile[t]->textureMode == TEXTUREMODE_BGIMAGE || gSP.textureTile[t]->textureMode == TEXTUREMODE_FRAMEBUFFER_BG)
				_location.uTexOffset[t].set(0.0f, 0.0f, _bForce);
			else {
				float fuls = gSP.textureTile[t]->fuls;
				float fult = gSP.textureTile[t]->fult;
				FrameBuffer * pBuffer = gSP.textureTile[t]->frameBuffer;
				if (pBuffer != NULL) {
					if (gSP.textureTile[t]->masks > 0 && gSP.textureTile[t]->clamps == 0)
						fuls = float(gSP.textureTile[t]->uls % (1 << gSP.textureTile[t]->masks));
					if (gSP.textureTile[t]->maskt > 0 && gSP.textureTile[t]->clampt == 0)
						fult = float(gSP.textureTile[t]->ult % (1 << gSP.textureTile[t]->maskt));
				}
				_location.uTexOffset[t].set(fuls, fult, _bForce);
			}
		}

		if (cache.current[t] != NULL) {
			f32 shiftScaleS = 1.0f;
			f32 shiftScaleT = 1.0f;
			getTextureShiftScale(t, cache, shiftScaleS, shiftScaleT);
			_location.uCacheShiftScale[t].set(shiftScaleS, shiftScaleT, _bForce);
			_location.uCacheScale[t].set(cache.current[t]->scaleS, cache.current[t]->scaleT, _bForce);
			_location.uCacheOffset[t].set(cache.current[t]->offsetS, cache.current[t]->offsetT, _bForce);
			nFB[t] = cache.current[t]->frameBufferTexture;
		}
	}

	_location.uCacheFrameBuffer.set(nFB[0], nFB[1], _bForce);
	_location.uTexScale.set(gSP.texture.scales, gSP.texture.scalet, _bForce);
}
	void update(bool _force) override
	{
		int nFB[2] = { 0, 0 };
		TextureCache & cache = textureCache();
		for (u32 t = 0; t < 2; ++t) {
			if (!m_useTile[t])
				continue;

			if (gSP.textureTile[t] != NULL) {
				if (gSP.textureTile[t]->textureMode == TEXTUREMODE_BGIMAGE || gSP.textureTile[t]->textureMode == TEXTUREMODE_FRAMEBUFFER_BG)
					uTexOffset[t].set(0.0f, 0.0f, _force);
				else {
					float fuls = gSP.textureTile[t]->fuls;
					float fult = gSP.textureTile[t]->fult;
					FrameBuffer * pBuffer = gSP.textureTile[t]->frameBuffer;
					if (pBuffer != NULL) {
						if (gSP.textureTile[t]->masks > 0 && gSP.textureTile[t]->clamps == 0)
							fuls = float(gSP.textureTile[t]->uls % (1 << gSP.textureTile[t]->masks));
						if (gSP.textureTile[t]->maskt > 0 && gSP.textureTile[t]->clampt == 0)
							fult = float(gSP.textureTile[t]->ult % (1 << gSP.textureTile[t]->maskt));
					}
					uTexOffset[t].set(fuls, fult, _force);
				}
			}

			if (cache.current[t] != NULL) {
				f32 shiftScaleS = 1.0f;
				f32 shiftScaleT = 1.0f;
				getTextureShiftScale(t, cache, shiftScaleS, shiftScaleT);
				uCacheShiftScale[t].set(shiftScaleS, shiftScaleT, _force);
				uCacheScale[t].set(cache.current[t]->scaleS, cache.current[t]->scaleT, _force);
				uCacheOffset[t].set(cache.current[t]->offsetS, cache.current[t]->offsetT, _force);
				nFB[t] = cache.current[t]->frameBufferTexture;
			}
		}

		uCacheFrameBuffer.set(nFB[0], nFB[1], _force);
		uTexScale.set(gSP.texture.scales, gSP.texture.scalet, _force);
	}