From 1b94bdc888f276fdf092d538cb32f63c76f3ba4a Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Tue, 25 Aug 2026 22:55:30 -0400 Subject: [PATCH] Make the RAND_MAX to float conversions explicit RAND_MAX is 32767 on Windows and converts to float exactly, so this is invisible on our primary target. Everywhere else it is INT_MAX, and 2147483647 has no exact float representation, so clang raises -Wimplicit-const-int-float-conversion and the build fails under -Werror. This is what stops trinity compiling anywhere but Windows. 32 conversions across 11 files, all the same idiom: before: ( (float)rand() / RAND_MAX ) after: ( (float)rand() / float( RAND_MAX ) ) The value is unchanged on every platform. The conversion was already happening; it is now written out rather than left implicit, which is what silences the diagnostic. Two sites in ProcessLifetime.cpp have RAND_MAX as the numerator rather than the divisor. They divide by a float, so it is the same conversion and they are fixed the same way. This takes an arm64-osx-debug build of trinity_metal from 30 errors to 1. The remaining error is an unused variable in EveChildMesh.cpp, an unrelated diagnostic that is deliberately left alone here. No behaviour change on Windows, and no new build configuration is needed to review it: the diff is one token per line, no logic touched. Claude-Session: https://claude.ai/code/session_01NSpJ5h8fGynb2qyHa4NE7Z --- .../Curves/Tr2CurveEulerRotationExpression.cpp | 6 +++--- trinity/Curves/Tr2CurveScalarExpression.cpp | 6 +++--- trinity/Curves/Tr2CurveVector3Expression.cpp | 6 +++--- trinity/Curves/Tr2ScalarExprKeyCurve.cpp | 2 +- trinity/Eve/Renderable/Stretch/EveStretch2.cpp | 4 ++-- .../Children/Behaviors/ProcessLifetime.cpp | 4 ++-- .../Children/EveChildParticleSphere.cpp | 4 ++-- ...artLightAttributeModifierExpressionBucket.cpp | 4 ++-- .../EveDistributionSpawnerTriggerSnake.cpp | 2 +- trinity/Eve/Volume/EveEllipsoidVolume.cpp | 10 +++++----- trinity/Eve/Volume/EveSphereVolume.cpp | 16 ++++++++-------- 11 files changed, 32 insertions(+), 32 deletions(-) diff --git a/trinity/Curves/Tr2CurveEulerRotationExpression.cpp b/trinity/Curves/Tr2CurveEulerRotationExpression.cpp index 2ca779ac6..b0cf86d9b 100644 --- a/trinity/Curves/Tr2CurveEulerRotationExpression.cpp +++ b/trinity/Curves/Tr2CurveEulerRotationExpression.cpp @@ -48,7 +48,7 @@ float Random( float a, float b ) { return ( ( b - a ) * 0.41f ) + a; } - return ( ( b - a ) * ( (float)rand() / RAND_MAX ) ) + a; + return ( ( b - a ) * ( (float)rand() / float( RAND_MAX ) ) ) + a; } // -------------------------------------------------------------------------------- @@ -86,7 +86,7 @@ Tr2CurveEulerRotationExpression::Tr2CurveEulerRotationExpression( IRoot* lockobj PARENTLOCK( m_inputs ), m_currentValue( 0, 0, 0, 1 ), m_timeScale( 1 ), - m_randomConstant( float( rand() ) / RAND_MAX ) + m_randomConstant( float( rand() ) / float( RAND_MAX ) ) { } @@ -297,7 +297,7 @@ Quaternion* Tr2CurveEulerRotationExpression::GetValueDoubleDotAt( Quaternion* in // -------------------------------------------------------------------------------- void Tr2CurveEulerRotationExpression::ResetRandomConstant() { - m_randomConstant = float( rand() ) / RAND_MAX; + m_randomConstant = float( rand() ) / float( RAND_MAX ); } // -------------------------------------------------------------------------------- diff --git a/trinity/Curves/Tr2CurveScalarExpression.cpp b/trinity/Curves/Tr2CurveScalarExpression.cpp index a0343ad53..d25fd91ed 100644 --- a/trinity/Curves/Tr2CurveScalarExpression.cpp +++ b/trinity/Curves/Tr2CurveScalarExpression.cpp @@ -52,7 +52,7 @@ float Random( float a, float b ) { return ( ( b - a ) * 0.41f ) + a; } - return ( ( b - a ) * ( (float)rand() / RAND_MAX ) ) + a; + return ( ( b - a ) * ( (float)rand() / float( RAND_MAX ) ) ) + a; } // -------------------------------------------------------------------------------- @@ -89,7 +89,7 @@ Tr2CurveScalarExpression::Tr2CurveScalarExpression( IRoot* lockobj ) : PARENTLOCK( m_inputs ), m_currentValue( 0 ), m_timeScale( 1 ), - m_randomConstant( float( rand() ) / RAND_MAX ) + m_randomConstant( float( rand() ) / float( RAND_MAX ) ) { } @@ -236,7 +236,7 @@ float Tr2CurveScalarExpression::GetRandomConstant() const // -------------------------------------------------------------------------------- void Tr2CurveScalarExpression::ResetRandomConstant() { - m_randomConstant = float( rand() ) / RAND_MAX; + m_randomConstant = float( rand() ) / float( RAND_MAX ); } // -------------------------------------------------------------------------------- diff --git a/trinity/Curves/Tr2CurveVector3Expression.cpp b/trinity/Curves/Tr2CurveVector3Expression.cpp index 50b4bd698..ab9471816 100644 --- a/trinity/Curves/Tr2CurveVector3Expression.cpp +++ b/trinity/Curves/Tr2CurveVector3Expression.cpp @@ -48,7 +48,7 @@ float Random( float a, float b ) { return ( ( b - a ) * 0.41f ) + a; } - return ( ( b - a ) * ( (float)rand() / RAND_MAX ) ) + a; + return ( ( b - a ) * ( (float)rand() / float( RAND_MAX ) ) ) + a; } // -------------------------------------------------------------------------------- @@ -85,7 +85,7 @@ Tr2CurveVector3Expression::Tr2CurveVector3Expression( IRoot* lockobj ) : PARENTLOCK( m_inputs ), m_currentValue( 0, 0, 0 ), m_timeScale( 1 ), - m_randomConstant( float( rand() ) / RAND_MAX ) + m_randomConstant( float( rand() ) / float( RAND_MAX ) ) { } @@ -349,7 +349,7 @@ Vector3d* Tr2CurveVector3Expression::InterpolatedPosition( Vector3d* out, Be::Ti // -------------------------------------------------------------------------------- void Tr2CurveVector3Expression::ResetRandomConstant() { - m_randomConstant = float( rand() ) / RAND_MAX; + m_randomConstant = float( rand() ) / float( RAND_MAX ); } // -------------------------------------------------------------------------------- diff --git a/trinity/Curves/Tr2ScalarExprKeyCurve.cpp b/trinity/Curves/Tr2ScalarExprKeyCurve.cpp index 524704863..6453a1f1e 100644 --- a/trinity/Curves/Tr2ScalarExprKeyCurve.cpp +++ b/trinity/Curves/Tr2ScalarExprKeyCurve.cpp @@ -44,7 +44,7 @@ static float perlin_wrap_simple( float x ) // -------------------------------------------------------------------------------------- static float frandom( float a, float b ) { - return ( ( b - a ) * ( (float)rand() / RAND_MAX ) ) + a; + return ( ( b - a ) * ( (float)rand() / float( RAND_MAX ) ) ) + a; } namespace diff --git a/trinity/Eve/Renderable/Stretch/EveStretch2.cpp b/trinity/Eve/Renderable/Stretch/EveStretch2.cpp index a936bc794..40ceda306 100644 --- a/trinity/Eve/Renderable/Stretch/EveStretch2.cpp +++ b/trinity/Eve/Renderable/Stretch/EveStretch2.cpp @@ -89,7 +89,7 @@ EveStretch2::EveStretch2( IRoot* lockObj ) : m_destinationTransform( IdentityMatrix() ), m_vb( BlueSharedString( "EveStretch2VB" ), &GetEveStretch2Quads ) { - m_effectData[0] = Vector4( 0, 0, 0, float( rand() ) / RAND_MAX ); + m_effectData[0] = Vector4( 0, 0, 0, float( rand() ) / float( RAND_MAX ) ); m_effectData[0] = Vector4( 1, 0, 0, 0 ); } @@ -136,7 +136,7 @@ float EveStretch2::GetCurveDuration() void EveStretch2::StartFiring( float delay ) { - m_effectData[0].w = float( rand() ) / RAND_MAX; + m_effectData[0].w = float( rand() ) / float( RAND_MAX ); if( m_start ) { m_start->PlayFrom( -delay ); diff --git a/trinity/Eve/SpaceObject/Children/Behaviors/ProcessLifetime.cpp b/trinity/Eve/SpaceObject/Children/Behaviors/ProcessLifetime.cpp index ee7e900d2..0d454ef66 100644 --- a/trinity/Eve/SpaceObject/Children/Behaviors/ProcessLifetime.cpp +++ b/trinity/Eve/SpaceObject/Children/Behaviors/ProcessLifetime.cpp @@ -214,7 +214,7 @@ std::vector ProcessLifetime::CalculateBehavior( std::vector float ProcessLifetime::GetRandomOffset( float cylWidth ) const { - return static_cast( RAND_MAX / ( 2 * ( cylWidth * m_wanderAmount ) ) ); + return static_cast( float( RAND_MAX ) / ( 2 * ( cylWidth * m_wanderAmount ) ) ); } bool ProcessLifetime::ProcessTunnel( DroneAgent& agent, SplineTunnel& tunnel, int& pointID, float boundingSphere ) @@ -402,7 +402,7 @@ void ProcessLifetime::FindASpawnPoint( DroneAgent& agent, ProcessLifetimeData* d Vector3 point = ( *tunnel )->splinePoints[0].pos; for( int i = 0; i < 3; i++ ) { - point[i] += -( *tunnel )->pointOfNoReturnSize + static_cast( rand() ) / ( static_cast( RAND_MAX / ( 2 * ( *tunnel )->pointOfNoReturnSize ) ) ); + point[i] += -( *tunnel )->pointOfNoReturnSize + static_cast( rand() ) / ( static_cast( float( RAND_MAX ) / ( 2 * ( *tunnel )->pointOfNoReturnSize ) ) ); } potentialPoints.push_back( point ); potentialRotations.push_back( ( *tunnel )->splinePoints[0].rot ); diff --git a/trinity/Eve/SpaceObject/Children/EveChildParticleSphere.cpp b/trinity/Eve/SpaceObject/Children/EveChildParticleSphere.cpp index 828333e46..53e31994e 100644 --- a/trinity/Eve/SpaceObject/Children/EveChildParticleSphere.cpp +++ b/trinity/Eve/SpaceObject/Children/EveChildParticleSphere.cpp @@ -348,7 +348,7 @@ void EveChildParticleSphere::ApplyConstraint( const Vector3& previousReferencePo void EveChildParticleSphere::FillParticleData( float** particle, const Vector3& previousReferencePosition, const Vector3& velocityDirection ) { auto randf = []() { - return float( rand() ) / RAND_MAX; + return float( rand() ) / float( RAND_MAX ); }; if( m_positionElement.m_bufferType != Tr2ParticleElementData::COUNT ) @@ -410,7 +410,7 @@ void EveChildParticleSphere::AddParticles( const Vector3& previousReferencePosit } auto randf = []() { - return float( rand() ) / RAND_MAX; + return float( rand() ) / float( RAND_MAX ); }; float* particle[Tr2ParticleElementData::COUNT]; diff --git a/trinity/Eve/SpaceObject/Children/SmartLightSets/attributeModifiers/EveSmartLightAttributeModifierExpressionBucket.cpp b/trinity/Eve/SpaceObject/Children/SmartLightSets/attributeModifiers/EveSmartLightAttributeModifierExpressionBucket.cpp index a58b2dd31..f8f1bea58 100644 --- a/trinity/Eve/SpaceObject/Children/SmartLightSets/attributeModifiers/EveSmartLightAttributeModifierExpressionBucket.cpp +++ b/trinity/Eve/SpaceObject/Children/SmartLightSets/attributeModifiers/EveSmartLightAttributeModifierExpressionBucket.cpp @@ -39,7 +39,7 @@ float RandomHash( const EveSmartLightAttributeModifierExpressionBucket* bucket, float Random( float a, float b ) { - return ( ( b - a ) * ( (float)rand() / RAND_MAX ) ) + a; + return ( ( b - a ) * ( (float)rand() / float( RAND_MAX ) ) ) + a; } float Input( const EveSmartLightAttributeModifierExpressionBucket* bucket, float index ) @@ -84,7 +84,7 @@ CcpParser::Constant s_constants[] = { EveSmartLightAttributeModifierExpressionBucket::EveSmartLightAttributeModifierExpressionBucket( IRoot* lockobj ) : PARENTLOCK( m_inputs ), - m_randomConstant( float( rand() ) / RAND_MAX ) + m_randomConstant( float( rand() ) / float( RAND_MAX ) ) { m_name = "ExpressionBucket"; m_expression = ""; diff --git a/trinity/Eve/SpaceObject/Utils/EveDistributionMethods/DistributionSpawners/EveDistributionSpawnerTriggerSnake.cpp b/trinity/Eve/SpaceObject/Utils/EveDistributionMethods/DistributionSpawners/EveDistributionSpawnerTriggerSnake.cpp index 6fc380108..b3b264257 100644 --- a/trinity/Eve/SpaceObject/Utils/EveDistributionMethods/DistributionSpawners/EveDistributionSpawnerTriggerSnake.cpp +++ b/trinity/Eve/SpaceObject/Utils/EveDistributionMethods/DistributionSpawners/EveDistributionSpawnerTriggerSnake.cpp @@ -66,7 +66,7 @@ void EveDistributionSpawnerTriggerSnake::UpdateSyncronous( const EveUpdateContex m_currentTravelTime = 0.f; m_travelProgress = 0.f; m_numDestinationsReached++; - m_travelDurationToNextPoint = Lerp( m_minTimeBetweenTriggers, m_maxTimeBetweenTriggers, (float)rand() / RAND_MAX ); + m_travelDurationToNextPoint = Lerp( m_minTimeBetweenTriggers, m_maxTimeBetweenTriggers, (float)rand() / float( RAND_MAX ) ); Vector3 searchPoint = Lerp( m_lastTarget, m_targetPoint, 1.3f ); // overshoot to reduce u-turns int32_t closetsPlace = owner.GetClosestFreePlacement( searchPoint ); diff --git a/trinity/Eve/Volume/EveEllipsoidVolume.cpp b/trinity/Eve/Volume/EveEllipsoidVolume.cpp index b0d26afd9..a49bd93bb 100644 --- a/trinity/Eve/Volume/EveEllipsoidVolume.cpp +++ b/trinity/Eve/Volume/EveEllipsoidVolume.cpp @@ -123,18 +123,18 @@ void EveEllipsoidVolume::GeneratePointsInVolume( std::vector& points, s for( size_t i = 0; i < howManyToAdd; i++ ) { - float a = TRI_2PI * ( float( rand() ) / RAND_MAX ); - float z = ( float( rand() ) / RAND_MAX ) * 2.f - 1.f; + float a = TRI_2PI * ( float( rand() ) / float( RAND_MAX ) ); + float z = ( float( rand() ) / float( RAND_MAX ) ) * 2.f - 1.f; Vector3 angle( sqrt( 1.f - z * z ) * cos( a ), sqrt( 1.f - z * z ) * sin( a ), z ); angle = Normalize( angle ); - if( ( float( rand() ) / RAND_MAX ) > sizeDifference ) + if( ( float( rand() ) / float( RAND_MAX ) ) > sizeDifference ) { - position = angle * ( m_innerShape + ( m_shape - m_innerShape ) * pow( (float)rand() / RAND_MAX, 0.75f * fallOffFactor ) ); + position = angle * ( m_innerShape + ( m_shape - m_innerShape ) * pow( (float)rand() / float( RAND_MAX ), 0.75f * fallOffFactor ) ); } else { - position = angle * ( m_innerShape * pow( (float)rand() / RAND_MAX, 1.f / 3.f ) ); + position = angle * ( m_innerShape * pow( (float)rand() / float( RAND_MAX ), 1.f / 3.f ) ); } points.push_back( position ); diff --git a/trinity/Eve/Volume/EveSphereVolume.cpp b/trinity/Eve/Volume/EveSphereVolume.cpp index e0f9c8e9d..964acb2b0 100644 --- a/trinity/Eve/Volume/EveSphereVolume.cpp +++ b/trinity/Eve/Volume/EveSphereVolume.cpp @@ -61,10 +61,10 @@ void EveSphereVolume::GeneratePointsInVolume( std::vector& points, size { for( size_t i = 0; i < howManyToAdd; i++ ) { - float dist = m_innerSphere.radius + circleDiffRange * pow( (float)rand() / RAND_MAX, 1.f / 3.f ); + float dist = m_innerSphere.radius + circleDiffRange * pow( (float)rand() / float( RAND_MAX ), 1.f / 3.f ); - float a = TRI_2PI * ( float( rand() ) / RAND_MAX ); - float z = ( float( rand() ) / RAND_MAX ) * 2.f - 1.f; + float a = TRI_2PI * ( float( rand() ) / float( RAND_MAX ) ); + float z = ( float( rand() ) / float( RAND_MAX ) ) * 2.f - 1.f; Vector3 angle( sqrt( 1.f - z * z ) * cos( a ), sqrt( 1.f - z * z ) * sin( a ), z ); position = angle * dist; @@ -80,19 +80,19 @@ void EveSphereVolume::GeneratePointsInVolume( std::vector& points, size for( size_t i = 0; i < howManyToAdd; i++ ) { - if( (float)rand() / RAND_MAX < sizeDifference ) + if( (float)rand() / float( RAND_MAX ) < sizeDifference ) { // inner volume - dist = m_innerSphere.radius * pow( (float)rand() / RAND_MAX, 1.f / 3.f ); + dist = m_innerSphere.radius * pow( (float)rand() / float( RAND_MAX ), 1.f / 3.f ); } else { // outer volume - dist = m_innerSphere.radius + circleDiffRange * pow( (float)rand() / RAND_MAX, fallOffFactor ); + dist = m_innerSphere.radius + circleDiffRange * pow( (float)rand() / float( RAND_MAX ), fallOffFactor ); } - float a = TRI_2PI * ( float( rand() ) / RAND_MAX ); - float z = ( float( rand() ) / RAND_MAX ) * 2.f - 1.f; + float a = TRI_2PI * ( float( rand() ) / float( RAND_MAX ) ); + float z = ( float( rand() ) / float( RAND_MAX ) ) * 2.f - 1.f; Vector3 angle( sqrt( 1.f - z * z ) * cos( a ), sqrt( 1.f - z * z ) * sin( a ), z ); position = angle * dist;