DGLE-HQ / DGLE

Powerful independent cross-platform engine for 2D/3D games and visualizations. Young, strong and crazy!

Home Page:http://dgle.dronprogs.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Need to fix a number of issues reported by @ash3D

megaDRONe86 opened this issue · comments

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 за допустимые пределы при наличии мип уровней.