You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Dec 11, 2017. It is now read-only.
Там в начале GetPixelData() и SetPixelData() при выполнении проверки, установлена ли текстура в качестве рендертаргета, проверяется p_rnd_target && p_rnd_target == this. Но this может быть нулевым только когда метод вызывается для нулевого указателя (texture->GetPixelData(), texture == NULL). В этом случае все равно произойдет access violation, поэтому в процессе проверки можно предполагать, что this не нулевой, и тогда в условии оставить только p_rnd_target == this.
В _DataSize() заметил, что после цикла по лодам для вычисления разрешения нужного лода идет проверка if (w == 0 || h == 0) return 0;. Но для прямоугольных (не квадратных) текстур начиная с определенного лода длина более короткой стороны текстуры при вычислении в цикле станет 0, в этом случае ее надо заменять на 1. Например, с текстурой 1024x512 для последнего лода после вычисления в цикле получится размер 1x0 и функция вернет 0, а должен быть размер 1x1 и функция должна возвращать размер в байтах одного текселя.
В Reallocate() появился цикл со странным условием while (!(cur_w == cur_h == 1)). Здесь сравнивается cur_w и cur_h, и результат сравнения (bool) сравнивается с 1. То есть для квадратных текстур не выполнится ни одной итерации.
Результаты GetTextureGLFormat() нигде не используются, кроме проверки формата. Но формат проверяется в самом начале функции: if (!pData || eDataFormat != _format). _format не может быть некорректным, в противном случае текстура бы не создалась.
Еще в Reallocate() нет проверки поддержки NPOT текстур (эта проверка есть в CreateTexture()).
Параметр _bMipMaps в Reallocate() не обновляется. В результате если в Reallocate() не передать мип уровни, то решение об автоматической генерации мип уровней принимается на основании того, были ли мип уровни при создании текстуры, а не в момент последнего вызова Reallocate(). Помимо этого параметр _bMipMaps странным образом используется в SetPixelData()/GetPixelData(): при попытке обратиться к ненулевому мип уровню при отсутствии мип уровней возвращается ошибка (!_bMipMaps && uiLodLevel != 0). Но здесь не проверяется, выходит ли параметр uiLodLevel за допустимые пределы при наличии мип уровней.
The text was updated successfully, but these errors were encountered:
d9caf06
Там в начале GetPixelData() и SetPixelData() при выполнении проверки, установлена ли текстура в качестве рендертаргета, проверяется p_rnd_target && p_rnd_target == this. Но this может быть нулевым только когда метод вызывается для нулевого указателя (texture->GetPixelData(), texture == NULL). В этом случае все равно произойдет access violation, поэтому в процессе проверки можно предполагать, что this не нулевой, и тогда в условии оставить только p_rnd_target == this.
В _DataSize() заметил, что после цикла по лодам для вычисления разрешения нужного лода идет проверка if (w == 0 || h == 0) return 0;. Но для прямоугольных (не квадратных) текстур начиная с определенного лода длина более короткой стороны текстуры при вычислении в цикле станет 0, в этом случае ее надо заменять на 1. Например, с текстурой 1024x512 для последнего лода после вычисления в цикле получится размер 1x0 и функция вернет 0, а должен быть размер 1x1 и функция должна возвращать размер в байтах одного текселя.
В Reallocate() появился цикл со странным условием while (!(cur_w == cur_h == 1)). Здесь сравнивается cur_w и cur_h, и результат сравнения (bool) сравнивается с 1. То есть для квадратных текстур не выполнится ни одной итерации.
Результаты GetTextureGLFormat() нигде не используются, кроме проверки формата. Но формат проверяется в самом начале функции: if (!pData || eDataFormat != _format). _format не может быть некорректным, в противном случае текстура бы не создалась.
Еще в Reallocate() нет проверки поддержки NPOT текстур (эта проверка есть в CreateTexture()).
Параметр _bMipMaps в Reallocate() не обновляется. В результате если в Reallocate() не передать мип уровни, то решение об автоматической генерации мип уровней принимается на основании того, были ли мип уровни при создании текстуры, а не в момент последнего вызова Reallocate(). Помимо этого параметр _bMipMaps странным образом используется в SetPixelData()/GetPixelData(): при попытке обратиться к ненулевому мип уровню при отсутствии мип уровней возвращается ошибка (!_bMipMaps && uiLodLevel != 0). Но здесь не проверяется, выходит ли параметр uiLodLevel за допустимые пределы при наличии мип уровней.
The text was updated successfully, but these errors were encountered: