Toolset Visual Studio 2022 (v143) поломан
1vanK opened this issue · 12 comments
Если скомпилировать движок с тулсетом Visual Studio 2022 (v143) в релизной версии пушка из примера https://github.com/urho3d-learn/editor при анимации сжимается в блин. В отладочной версии, а также с тулсетом Visual Studio 2019 (v142) анимация у пушки нормальная
void AnimationState::ApplyTrack(AnimationStateTrack& stateTrack, float weight, bool silent)
{
Vector3 newPosition;
Quaternion newRotation;
Vector3 newScale;
if (interpolate)
{
...
}
else
{
if (!!(channelMask & AnimationChannels::Position))
newPosition = keyFrame->position_;
if (!!(channelMask & AnimationChannels::Rotation))
newRotation = keyFrame->rotation_;
if (!!(channelMask & AnimationChannels::Scale))
{
newScale = keyFrame->scale_;
//URHO3D_LOGINFO("!!!!! newScale " + String(newScale.x_) + " "
// + String(newScale.y_) + " " + String(newScale.z_));
}
}
}
Если раскомментировать вывод в лог, то всё работает. Без вывода в лог оптимизатор хавает переменную newScale и игра багует.
Можно вручную установить newScale = Vector3::ONE;
вместо newScale = keyFrame->scale_;
и тогда тоже работает.
Эта ошибка есть даже в версии 1.8.0: https://github.com/urho3d/Urho3D/releases/tag/1.8
Возможно всплыли последствия нарушения strict alias rules, которые в Урхо нарушаются повсеместно
Проблема воспроизводится в версии https://github.com/urho3d/Urho3D/releases/tag/1.8-ALPHA
Ошибка есть в 64-битной версии -G "Visual Studio 17 2022" -A x64
, но нет в 32-битной -G "Visual Studio 17 2022" -A Win32
Такой способ позволяет обойти проблему, но это тупо
if (!!(channelMask & AnimationChannels::Position))
newPosition = keyFrame->position_;
if (!!(channelMask & AnimationChannels::Rotation))
newRotation = keyFrame->rotation_;
if (!!(channelMask & AnimationChannels::Scale))
{
newScale = keyFrame->scale_;
newScale *= 2.f;
newScale *= 0.5f;
}
Еще помогает замена конструктора копирования у Vector3:
/// Assign from another vector.
//Vector3& operator =(const Vector3& rhs) noexcept = default;
Vector3& operator =(const Vector3& rhs) noexcept
{
x_ = rhs.x_;
y_ = rhs.y_;
z_ = rhs.z_;
return *this;
}
Но легче просто подождать исправления бага в компиляторе
VS 17.5.0 Preview 1.0 обновилась до VS 17.5.0 Preview 2.0, проблема осталась
Временный фикс добавил, но очевидно, что другие баги могут вылезать вообще в рандомных местах
Опции CMake для вопроизведения в будущем
cmake.exe repo -B build_vs -G "Visual Studio 17" -A x64^
-D URHO3D_OPENGL=1 -D URHO3D_D3D9=1 -D URHO3D_D3D11=1^
-D URHO3D_LIB_TYPE=STATIC -D URHO3D_STATIC_RUNTIME=0 -D URHO3D_HASH_DEBUG=0 -D URHO3D_MINIDUMPS=0 -D URHO3D_TESTING=1^
-D URHO3D_ANGELSCRIPT=1 -D URHO3D_FORCE_AS_MAX_PORTABILITY=0 -D URHO3D_LUA=1 -D URHO3D_LUAJIT=0 -D URHO3D_GENERATEBINDINGS=1^
-D URHO3D_SAMPLES=1 -D URHO3D_TOOLS=1 -D URHO3D_DOCS=0^
-D URHO3D_NETWORK=1 -D URHO3D_DATABASE_SQLITE=1 -D URHO3D_TRACY_PROFILING=0 -D URHO3D_PHYSICS2D=1 -D URHO3D_URHO2D=1
Обновилось до Version 17.5.0 Preview 3.0, проблема осталась