diff --git a/Generals/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp b/Generals/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp index 74948ead0a2..47f6a14a65c 100644 --- a/Generals/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp +++ b/Generals/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp @@ -50,6 +50,7 @@ #include "WWLib/Vector.h" #include "WWMath/wwmath.h" #include "WWMath/quat.h" +#include //#include // Static Table, for Adaptive Delta Decompressor #define FILTER_TABLE_SIZE (256) @@ -430,13 +431,7 @@ void TimeCodedMotionChannelClass::Get_Vector(float32 frame,float * setvec) if (pidx == ((NumTimeCodes - 1) * PacketSize)) { - float32 *frm = (float32 *) &Data[pidx+1]; - - for (int i=0; i < VectorLen; i++) { - - setvec[i] = frm[i]; - - } + memcpy(setvec, &Data[pidx+1], VectorLen * sizeof(float32)); return; @@ -448,10 +443,7 @@ void TimeCodedMotionChannelClass::Get_Vector(float32 frame,float * setvec) uint32 time = Data[p2idx]; if (time & W3D_TIMECODED_BINARY_MOVEMENT_FLAG) { - float32 *frm = (float32 *) &Data[pidx+1]; - for (int i=0; i < VectorLen; i++) { - setvec[i] = frm[i]; - } + memcpy(setvec, &Data[pidx+1], VectorLen * sizeof(float32)); return; } @@ -460,18 +452,28 @@ void TimeCodedMotionChannelClass::Get_Vector(float32 frame,float * setvec) float32 ratio = (frame - time1) / (time2 - time1); - float32 *frame1 = (float32 *) &Data[pidx+1]; - float32 *frame2 = (float32 *) &Data[p2idx+1]; + const uint32* frame1 = &Data[pidx+1]; + const uint32* frame2 = &Data[p2idx+1]; for (int i=0; i < VectorLen; i++) { - setvec[i] = WWMath::Lerp(frame1[i],frame2[i],ratio); + setvec[i] = WWMath::Lerp(std::bit_cast(frame1[i]),std::bit_cast(frame2[i]),ratio); } } +// Sets a quaternion from the four floats stored in a packet. +static void Set_Quaternion_From_Packet(Quaternion& q, const uint32 packet[4]) +{ + q.Set( + std::bit_cast(packet[0]), + std::bit_cast(packet[1]), + std::bit_cast(packet[2]), + std::bit_cast(packet[3])); +} + Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) { @@ -488,9 +490,7 @@ Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) if (pidx == ((NumTimeCodes - 1) * PacketSize)) { - float32 *vec = (float32 *) &Data[pidx+1]; - - q.Set(vec[0], vec[1], vec[2], vec[3]); + Set_Quaternion_From_Packet(q, &Data[pidx+1]); return( q ); @@ -502,10 +502,7 @@ Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) uint32 time = Data[p2idx]; if (time & W3D_TIMECODED_BINARY_MOVEMENT_FLAG) { - // its a binary movement! - float32 *vec = (float32 *) &Data[pidx+1]; - - q.Set(vec[0], vec[1], vec[2], vec[3]); + Set_Quaternion_From_Packet(q, &Data[pidx+1]); return( q ); } @@ -515,14 +512,11 @@ Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) float32 ratio = (frame - time1) / (time2 - time1); - float32 *frame1 = (float32 *) &Data[pidx+1]; - float32 *frame2 = (float32 *) &Data[p2idx+1]; - - Quaternion q1(1); - Quaternion q2(1); + Quaternion q1; + Quaternion q2; - q1.Set(frame1[0], frame1[1], frame1[2], frame1[3]); - q2.Set(frame2[0], frame2[1], frame2[2], frame2[3]); + Set_Quaternion_From_Packet(q1, &Data[pidx+1]); + Set_Quaternion_From_Packet(q2, &Data[p2idx+1]); Fast_Slerp(q, q1, q2, ratio); @@ -972,7 +966,7 @@ bool AdaptiveDeltaMotionChannelClass::Load_W3D(ChunkLoadClass & cload) void AdaptiveDeltaMotionChannelClass::decompress(uint32 frame_idx, float *outdata) { // Start Over from the beginning - float *base = (float *) &Data[0]; // pointer to our true know beginning values + const uint32* base = &Data[0]; // pointer to our true know beginning values bool done = false; @@ -982,7 +976,7 @@ void AdaptiveDeltaMotionChannelClass::decompress(uint32 frame_idx, float *outdat pPacket+= (sizeof(float) * VectorLen); // skip non-compressed header information pPacket+= PACKET_SIZE * vi; // skip to the appropriate packet start - float last_value = base[vi]; + float last_value = std::bit_cast(base[vi]); for (uint32 frame=1; frame<=frame_idx;) { // Frame Loop @@ -1048,8 +1042,7 @@ void AdaptiveDeltaMotionChannelClass::decompress(uint32 src_idx, float *srcdata, assert(src_idx < frame_idx); src_idx++; - float *base = (float *) &Data[0]; // pointer to our true know beginning values - base += VectorLen; // skip header information + const uint32* base = &Data[VectorLen]; // skip header information bool done = false; diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp index d6bff509543..2485d251768 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/motchan.cpp @@ -50,6 +50,7 @@ #include "WWLib/Vector.h" #include "WWMath/wwmath.h" #include "WWMath/quat.h" +#include //#include // Static Table, for Adaptive Delta Decompressor #define FILTER_TABLE_SIZE (256) @@ -430,13 +431,7 @@ void TimeCodedMotionChannelClass::Get_Vector(float32 frame,float * setvec) if (pidx == ((NumTimeCodes - 1) * PacketSize)) { - float32 *frm = (float32 *) &Data[pidx+1]; - - for (int i=0; i < VectorLen; i++) { - - setvec[i] = frm[i]; - - } + memcpy(setvec, &Data[pidx+1], VectorLen * sizeof(float32)); return; @@ -448,10 +443,7 @@ void TimeCodedMotionChannelClass::Get_Vector(float32 frame,float * setvec) uint32 time = Data[p2idx]; if (time & W3D_TIMECODED_BINARY_MOVEMENT_FLAG) { - float32 *frm = (float32 *) &Data[pidx+1]; - for (int i=0; i < VectorLen; i++) { - setvec[i] = frm[i]; - } + memcpy(setvec, &Data[pidx+1], VectorLen * sizeof(float32)); return; } @@ -460,18 +452,28 @@ void TimeCodedMotionChannelClass::Get_Vector(float32 frame,float * setvec) float32 ratio = (frame - time1) / (time2 - time1); - float32 *frame1 = (float32 *) &Data[pidx+1]; - float32 *frame2 = (float32 *) &Data[p2idx+1]; + const uint32* frame1 = &Data[pidx+1]; + const uint32* frame2 = &Data[p2idx+1]; for (int i=0; i < VectorLen; i++) { - setvec[i] = WWMath::Lerp(frame1[i],frame2[i],ratio); + setvec[i] = WWMath::Lerp(std::bit_cast(frame1[i]),std::bit_cast(frame2[i]),ratio); } } +// Sets a quaternion from the four floats stored in a packet. +static void Set_Quaternion_From_Packet(Quaternion& q, const uint32 packet[4]) +{ + q.Set( + std::bit_cast(packet[0]), + std::bit_cast(packet[1]), + std::bit_cast(packet[2]), + std::bit_cast(packet[3])); +} + Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) { @@ -488,9 +490,7 @@ Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) if (pidx == ((NumTimeCodes - 1) * PacketSize)) { - float32 *vec = (float32 *) &Data[pidx+1]; - - q.Set(vec[0], vec[1], vec[2], vec[3]); + Set_Quaternion_From_Packet(q, &Data[pidx+1]); return( q ); @@ -502,10 +502,7 @@ Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) uint32 time = Data[p2idx]; if (time & W3D_TIMECODED_BINARY_MOVEMENT_FLAG) { - // its a binary movement! - float32 *vec = (float32 *) &Data[pidx+1]; - - q.Set(vec[0], vec[1], vec[2], vec[3]); + Set_Quaternion_From_Packet(q, &Data[pidx+1]); return( q ); } @@ -515,14 +512,11 @@ Quaternion TimeCodedMotionChannelClass::Get_QuatVector(float32 frame) float32 ratio = (frame - time1) / (time2 - time1); - float32 *frame1 = (float32 *) &Data[pidx+1]; - float32 *frame2 = (float32 *) &Data[p2idx+1]; - - Quaternion q1(1); - Quaternion q2(1); + Quaternion q1; + Quaternion q2; - q1.Set(frame1[0], frame1[1], frame1[2], frame1[3]); - q2.Set(frame2[0], frame2[1], frame2[2], frame2[3]); + Set_Quaternion_From_Packet(q1, &Data[pidx+1]); + Set_Quaternion_From_Packet(q2, &Data[p2idx+1]); Fast_Slerp(q, q1, q2, ratio); @@ -972,7 +966,7 @@ bool AdaptiveDeltaMotionChannelClass::Load_W3D(ChunkLoadClass & cload) void AdaptiveDeltaMotionChannelClass::decompress(uint32 frame_idx, float *outdata) { // Start Over from the beginning - float *base = (float *) &Data[0]; // pointer to our true know beginning values + const uint32* base = &Data[0]; // pointer to our true know beginning values bool done = false; @@ -982,7 +976,7 @@ void AdaptiveDeltaMotionChannelClass::decompress(uint32 frame_idx, float *outdat pPacket+= (sizeof(float) * VectorLen); // skip non-compressed header information pPacket+= PACKET_SIZE * vi; // skip to the appropriate packet start - float last_value = base[vi]; + float last_value = std::bit_cast(base[vi]); for (uint32 frame=1; frame<=frame_idx;) { // Frame Loop @@ -1048,8 +1042,7 @@ void AdaptiveDeltaMotionChannelClass::decompress(uint32 src_idx, float *srcdata, assert(src_idx < frame_idx); src_idx++; - float *base = (float *) &Data[0]; // pointer to our true know beginning values - base += VectorLen; // skip header information + const uint32* base = &Data[VectorLen]; // skip header information bool done = false;