В некоторых случаях можно столкнуться с ошибкой нарушения прав доступа при чтении памяти (access violation), пытаясь загрузить X-модель в Irrlicht 1.7.2.
device->getSceneManager()->getMesh("Models/model.x");
Где возникает ошибка (первая строка здесь - это 1019 строка в CXMeshFileLoader.cpp):
u32* data = new u32[datasize]; for (u32 j=0; j<datasize; ++j) data[j]=readInt(); if (dataformat&0x102) // 2nd uv set { mesh.TCoords2.reallocate(mesh.Vertices.size()); u8* dataptr = (u8*) data; const u32 size=((dataformat>>8)&0xf)*sizeof(core::vector2df); for (u32 j=0; j<mesh.Vertices.size(); ++j) { mesh.TCoords2.push_back(*((core::vector2df*)(dataptr))); dataptr += size; } }
Почему возникает ошибка: всего указателем data адресуются datasize*4 байт памяти, при загрузке модели может оказаться, что mesh.Vertices.size()*size больше, чем datasize*4 (в моем случае так и было) - отсюда и ошибка.
Что предлагается:
u32* data = new u32[datasize]; for (u32 j=0; j<datasize; ++j) data[j]=readInt(); if (dataformat&0x102) // 2nd uv set { mesh.TCoords2.reallocate(mesh.Vertices.size()); u8* dataptr = (u8*) data; const u32 size=((dataformat>>8)&0xf)*sizeof(core::vector2df); u32 boundary = (datasize << 2)/size; for (u32 j=0; j<mesh.Vertices.size() && j<boundary; ++j) { mesh.TCoords2.push_back(*((core::vector2df*)(dataptr))); dataptr += size; } }
Решение, безусловно не идеальное (что произойдет из-за преждевременного завершения цикла в общем случае?), но для всех моделей, которые мне пришлось загружать оказалось подходящим.
В любом случае в ближайшее время сообщу о найденной проблеме сообществу проекта, а там уже пусть решают.
Успешной разработки!
Вот люди пошли "а там уже пусть решают". Нет чтобы патчик накалякать, к сообществу присоединится :D
ОтветитьУдалитьЕсли по делу, то похоже проект живенький достаточно. Пофиксить должны быстро.
Было бы время, присоединился бы :)
ОтветитьУдалитьЕле нашкарябал 15 минут чтобы инфу изложить, а то пост уже с неделю в архиве лежит, так бы и затерялся совсем...