@@ -197,6 +197,9 @@ void Parser::Run()
197197 Default_Texture->Tnormal = nullptr ;
198198 Default_Texture->Finish = Create_Finish ();
199199
200+ defaultsVersion = DefaultsVersion::kLegacy ;
201+ defaultsModified = false ;
202+
200203 // Initialize various defaults depending on language version as per command line / INI settings.
201204 InitDefaults (sceneData->EffectiveLanguageVersion ());
202205
@@ -356,7 +359,7 @@ void Parser::Run()
356359 // TODO FIXME - review whole if-statement and line after it below [trf]
357360 // we set this before resetting languageVersion since there's nothing to
358361 // be gained from disabling the defaulting of the noise generator to
359- // something other than compatibilty mode.
362+ // something other than compatibility mode.
360363 if (sceneData->explicitNoiseGenerator == false )
361364 sceneData->noiseGenerator = (sceneData->EffectiveLanguageVersion () < 350 ?
362365 kNoiseGen_Original : kNoiseGen_RangeCorrected );
@@ -540,24 +543,53 @@ void Parser::InitDefaults(int version)
540543 MathColour pigmentColour;
541544 double ambientLevel;
542545 double rightLength;
546+ DefaultsVersion newDefaults;
547+
543548 if (version >= 380 )
549+ newDefaults = DefaultsVersion::k380;
550+ else
551+ newDefaults = DefaultsVersion::kLegacy ;
552+
553+ if (newDefaults == defaultsVersion)
554+ // nothing to change
555+ return ;
556+
557+ if (defaultsModified)
544558 {
545- pigmentType = PLAIN_PATTERN;
546- pigmentColour = MathColour (1.0 );
547- ambientLevel = 0.0 ;
548- rightLength = sceneData->aspectRatio ;
559+ // Don't override defaults if they've already been modified by the user.
560+ Warning (" Scene language version changed after a 'default' statement. "
561+ " The changes in defaults normally associated with the language "
562+ " version change are not applied." );
563+ return ;
549564 }
550- else
565+
566+ switch (newDefaults)
551567 {
552- pigmentType = NO_PATTERN;
553- pigmentColour = MathColour (0.0 );
554- ambientLevel = 0.1 ;
555- rightLength = 1.33 ;
568+ case DefaultsVersion::k380:
569+ pigmentType = PLAIN_PATTERN;
570+ pigmentColour = MathColour (1.0 );
571+ ambientLevel = 0.0 ;
572+ rightLength = sceneData->aspectRatio ;
573+ break ;
574+
575+ case DefaultsVersion::kLegacy :
576+ pigmentType = NO_PATTERN;
577+ pigmentColour = MathColour (0.0 );
578+ ambientLevel = 0.1 ;
579+ rightLength = 1.33 ;
580+ break ;
581+
582+ default :
583+ POV_PARSER_ASSERT (false );
584+ break ;
556585 }
586+
557587 Default_Texture->Pigment ->Type = pigmentType;
558588 Default_Texture->Pigment ->colour = TransColour (pigmentColour, 0.0 , 0.0 );
559589 Default_Texture->Finish ->Ambient = MathColour (ambientLevel);
560590 Default_Camera.Right = Vector3d (rightLength, 0.0 , 0.0 );
591+
592+ defaultsVersion = newDefaults;
561593}
562594
563595
@@ -6869,6 +6901,8 @@ void Parser::Parse_Default ()
68696901 Not_In_Default = false ;
68706902 Parse_Begin ();
68716903
6904+ defaultsModified = true ;
6905+
68726906 EXPECT
68736907 CASE (TEXTURE_TOKEN)
68746908 Local_Texture = Default_Texture;
0 commit comments