diff --git a/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt b/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt index d3e97f05c..e10edda7d 100644 --- a/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt +++ b/libvisual-plugins/plugins/actor/gforce/CMakeLists.txt @@ -2,7 +2,7 @@ SET(GFORCE_SOURCE_DIR ${PROJECT_SOURCE_DIR}/plugins/actor/gforce) SET(GFORCE_DATA_DIR ${LV_PLUGIN_DATA_DIR}/actor/actor_gforce) SET(GFORCE_COMPILE_DEFS UNIX_X _REENTRANT) -SET(GFORCE_COMPILE_OPTIONS -fno-strict-aliasing -Wno-unknown-warning-option -Wno-sometimes-uninitialized) +SET(GFORCE_COMPILE_OPTIONS -Werror) # Required on GCC but not Clang for some reason. IF(NOT MINGW) diff --git a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h index c78f08bdc..a84a9e6bf 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h +++ b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/Headers/XFloatList.h @@ -4,9 +4,23 @@ // by Andrew O'Meara #include "XPtrList.h" +#include class XLongList; +inline float void_ptr_to_float(const void* value) +{ + float result; + memcpy( &result, &value, sizeof( result ) ); + return result; +} + +inline void* float_to_void_ptr(float value) +{ + void* result = 0; + memcpy( &result, &value, sizeof( value ) ); + return result; +} class XFloatList { @@ -14,11 +28,11 @@ class XFloatList { XFloatList( ListOrderingT inOrdering = cOrderNotImportant ); // See XPtrList.h for ListOrderingT choices // See XPtrList.h for description of functions. - virtual long Add( float inNum ) { return mList.Add( *((void**) &inNum) ); } + virtual long Add( float inNum ) { return mList.Add( float_to_void_ptr( inNum ) ); } virtual void Add( const XFloatList& inList ) { mList.Add( inList.mList ); } virtual bool RemoveElement( long inIndex ) { return mList.RemoveElement( inIndex ); } virtual void RemoveAll() { mList.RemoveAll(); } - virtual float Fetch( long inIndex ) { long t = (long) mList.Fetch( inIndex ); return *((float*) &t);} + virtual float Fetch( long inIndex ) { return void_ptr_to_float( mList.Fetch( inIndex ) ); } virtual bool Fetch( long inIndex, float* ioPtrDest ) const { return mList.Fetch( inIndex, (void**)ioPtrDest ); } virtual long Count() const { return mList.Count(); } @@ -36,7 +50,7 @@ class XFloatList { // Smoothes all the floats in this list void GaussSmooth( float inSigma ); - float operator[] ( const long inIndex ) { long t = (long) mList.Fetch( inIndex ); return *((float*) &t); } + float operator[] ( const long inIndex ) { return void_ptr_to_float(mList.Fetch( inIndex )); } // Generic utility fcn to gauss-smooth a 1D curve. static void GaussSmooth( float inSigma, long inN, float inSrceDest[] ); diff --git a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp index 0751dfb73..a4be95d00 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/GeneralTools/XFloatList.cpp @@ -64,7 +64,7 @@ void XFloatList::FindMeans( long inNumMeans, float outMeans[], float inSigmaScal // If this a local max. (Note: this could/should be improved for neighbors that are equal) if ( ( cen > left && cen >= right ) ) { - sepCandidates.Put( i, *((void**) &cen) ); + sepCandidates.Put( i, float_to_void_ptr( cen ) ); } } @@ -284,7 +284,7 @@ void XFloatList::Rank( XLongList& outRank, long inNumToRank ) const { int XFloatList::sQSFloatComparitor( const void* inA, const void* inB ) { - float diff = *((float*) inB) - *((float*) inA); + float diff = void_ptr_to_float(inB) - void_ptr_to_float(inA); if ( diff > 0.0 ) return 1; else if ( diff < 0.0 ) @@ -296,7 +296,7 @@ int XFloatList::sQSFloatComparitor( const void* inA, const void* inB ) { int XFloatList::sFloatComparitor( const void* inA, const void* inB ) { - float diff = *((float*) &inB) - *((float*) &inA); + float diff = void_ptr_to_float(inA) - void_ptr_to_float(inB); if ( diff > 0.0 ) return 1; else if ( diff < 0.0 ) diff --git a/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp b/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp index f4c3b4035..9dcb7c69a 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/io/CEgIStream.cpp @@ -1,6 +1,6 @@ #include "CEgIStream.h" - -//#include +#include +#include UtilStr CEgIStream::sTemp; @@ -32,8 +32,20 @@ long CEgIStream::GetLong() { float CEgIStream::GetFloat() { - long v = GetLong(); - return *( (float*) &v ); + uint32_t c, n = GetByte(); + + c = GetByte(); + n = n | ( c << 8 ); + + c = GetByte(); + n = n | ( c << 16 ); + + c = GetByte(); + n = n | ( c << 24 ); + + float result; + memcpy(&result, &n, sizeof(result)); + return result; } diff --git a/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp b/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp index 48487a260..7bdcbee78 100644 --- a/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp +++ b/libvisual-plugins/plugins/actor/gforce/Common/math/ExprVirtualMachine.cpp @@ -19,6 +19,7 @@ #endif #include +#include #include #include @@ -85,7 +86,7 @@ ExprUserFcn ExprVirtualMachine::sZeroFcn = { 0, { 0 } }; case cABS: r = fabs( r ); break; \ case cSIN: r = sin( r ); break; \ case cCOS: r = cos( r ); break; \ - case cSEED: i = *((long*) &r); \ + case cSEED: i = std::bit_cast( r ); \ size = i % 31; \ srand( ( i << size ) | ( i >> ( 32 - size ) ) ); break; \ case cTAN: r = tan( r ); break; \