handle negative light intensity values in class LightRadii #41

This commit is contained in:
Garux 2020-04-14 19:45:00 +03:00
parent 7d59736ed6
commit 42ac0ccb61

View File

@ -756,7 +756,13 @@ void calculateRadii(){
intensity *= m_scale; intensity *= m_scale;
if ( spawnflags_linear( m_flags ) ) { if( intensity < 0 ){ // prevent NaN
m_radii_transformed[0] = m_radii[0] =
m_radii_transformed[1] = m_radii[1] =
m_radii_transformed[2] = m_radii[2] = 0; // indicate negative intensity
}
else if ( spawnflags_linear( m_flags ) ) {
m_radii_transformed[0] = m_radii[0] = light_radius_linear( intensity, 1.0f ) / m_fade; m_radii_transformed[0] = m_radii[0] = light_radius_linear( intensity, 1.0f ) / m_fade;
m_radii_transformed[1] = m_radii[1] = light_radius_linear( intensity, 48.0f ) / m_fade; m_radii_transformed[1] = m_radii[1] = light_radius_linear( intensity, 48.0f ) / m_fade;
m_radii_transformed[2] = m_radii[2] = light_radius_linear( intensity, 255.0f ) / m_fade; m_radii_transformed[2] = m_radii[2] = light_radius_linear( intensity, 255.0f ) / m_fade;
@ -807,12 +813,16 @@ void flagsChanged( const char* value ){
} }
typedef MemberCaller1<LightRadii, const char*, &LightRadii::flagsChanged> FlagsChangedCaller; typedef MemberCaller1<LightRadii, const char*, &LightRadii::flagsChanged> FlagsChangedCaller;
void calculateTransformedRadii( float radius ){ void transformRadii( float offset ){
const float radius = m_radii[1] + offset;
float (&r)[3] = m_radii_transformed; float (&r)[3] = m_radii_transformed;
if ( spawnflags_linear( m_flags ) ) { if ( spawnflags_linear( m_flags ) ) {
r[0] = radius + 47.0f / m_fade; r[0] = radius + 47.0f / m_fade;
if( r[0] <= 1.f ){ if( r[0] <= 1.f ){
r[0] = r[1] = r[2] = 1.f; r[0] = 1.f;
r[1] = r[2] = 1.f - 47.0f / m_fade; // this is called once again after minimizing already minimal radii, so calculate correct r[1]
return; return;
} }
r[1] = radius; r[1] = radius;
@ -822,21 +832,22 @@ void calculateTransformedRadii( float radius ){
{ {
r[0] = radius * sqrt( 48.f ); r[0] = radius * sqrt( 48.f );
if( r[0] <= 1.f ){ if( r[0] <= 1.f ){
r[0] = r[1] = r[2] = 1.f; r[0] = 1.f;
r[1] = r[2] = 0;
return; return;
} }
r[1] = radius; r[1] = radius;
r[2] = r[0] / sqrt( 255.f ); r[2] = r[0] / sqrt( 255.f );
} }
//globalOutputStream() << r[0] << " " << r[1] << " " << r[2] << " \n"; // globalOutputStream() << r[0] << " " << r[1] << " " << r[2] << " m_radii_transformed\n";
} }
float calculateIntensityFromRadii(){ float calculateIntensityFromRadii(){
float intensity; if( m_radii_transformed[0] == 0 ) // negative intensity
if ( spawnflags_linear( m_flags ) ) return m_primaryIntensity != 0? m_primaryIntensity : m_secondaryIntensity;
intensity = ( m_radii_transformed[0] * m_fade + 1.f ) / ( fPointScale * fLinearScale ); else if ( spawnflags_linear( m_flags ) )
return ( m_radii_transformed[0] * m_fade + 1.f ) / ( fPointScale * fLinearScale ) / m_scale;
else else
intensity = m_radii_transformed[0] * m_radii_transformed[0] * 1.f / fPointScale; return m_radii_transformed[0] * m_radii_transformed[0] * 1.f / fPointScale / m_scale;
return intensity / m_scale;
} }
}; };
@ -1512,8 +1523,8 @@ void snapto( float snap ){
m_originKey.write( &m_entity ); m_originKey.write( &m_entity );
} }
} }
void setLightRadii( float radius ){ void transformLightRadii( float offset ){
m_radii.calculateTransformedRadii( radius ); m_radii.transformRadii( offset );
} }
void setLightRadius( const AABB& aabb ){ void setLightRadius( const AABB& aabb ){
m_aabb_light.origin = aabb.origin; m_aabb_light.origin = aabb.origin;
@ -1767,10 +1778,6 @@ const Matrix4& projection() const {
return m_doom3Projection; return m_doom3Projection;
} }
const LightRadii& getLightRadii() const {
return m_radii;
}
Shader* getShader() const { Shader* getShader() const {
return m_shader.get(); return m_shader.get();
} }
@ -1933,7 +1940,7 @@ void evaluateTransform(){
m_contained.setLightRadius( m_dragPlanes.evaluateResize( getTranslation(), rotation() ) ); m_contained.setLightRadius( m_dragPlanes.evaluateResize( getTranslation(), rotation() ) );
} }
else{ else{
m_contained.setLightRadii( m_contained.getLightRadii().m_radii[1] + m_scaleRadius.evaluateResize( getTranslation() ) ); m_contained.transformLightRadii( m_scaleRadius.evaluateResize( getTranslation() ) );
} }
} }
} }