Skip to content

Commit b5b17ea

Browse files
committed
[parser] Change defaults to no longer be determined by very first #version statement.
Instead, subsequent `#version` statements may switch defaults back and forth until the first `default` statement.
1 parent 4534762 commit b5b17ea

File tree

4 files changed

+59
-18
lines changed

4 files changed

+59
-18
lines changed

changes.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,15 @@ Changed Behaviour
4343
- Any new behaviour formerly activated by `#version 3.71` now requires
4444
`#version 3.8` (or higher); specifying `#version 3.71` will trigger a
4545
corresponding warning.
46-
- Some defaults have been changed (requires `#version 3.8` as the _very first_
47-
statement of the scene, or a corresponding command line / INI setting):
46+
- Some defaults have been changed (requires `#version 3.8` or a corresponding
47+
command line / INI setting):
4848
- The pigment now defaults to plain white.
4949
- `ambient` now defaults to 0.0 instead of 0.1.
5050
- The camera `right` vector length now defaults to the output image aspect
5151
ratio (presuming square pixels) instead of 1.33.
52+
Switching back and forth between defaults via `#version` is possible until
53+
the first `default` statement is encountered; after that, `#version` will
54+
cause a warning instead of changing defaults.
5255
- Minor changes have been made to the benchmark scene. New benchmark version
5356
is 2.03.
5457
- Token counting in conditional blocks (e.g. in `#if ... #end`) has changed.

source/parser/parser.cpp

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

source/parser/parser.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,14 @@ class Parser : public SceneTask
634634
// parstxtr.h/parstxtr.cpp
635635
TEXTURE *Default_Texture;
636636

637+
enum class DefaultsVersion : char
638+
{
639+
kLegacy, ///< Pre-v3.8 defaults.
640+
k380, ///< v3.8.0 defaults.
641+
};
642+
DefaultsVersion defaultsVersion; ///< Language version active before the first `default` statement.
643+
bool defaultsModified : 1; ///< Whether a `default` statement has been encountered.
644+
637645
// express.h/express.cpp
638646
short Have_Vector;
639647
unsigned int Number_Of_Random_Generators;

source/parser/parser_tokenizer.cpp

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2539,12 +2539,8 @@ void Parser::Parse_Directive(int After_Hash)
25392539
"'#version version;'.");
25402540
}
25412541

2542-
if (!sceneData->languageVersionLate && !sceneData->languageVersionSet)
2543-
{
2544-
// Got `#version` as the first statement of the file.
2545-
// Initialize various defaults depending on language version specified.
2546-
InitDefaults(sceneData->languageVersion);
2547-
}
2542+
// Initialize various defaults depending on language version specified.
2543+
InitDefaults(sceneData->languageVersion);
25482544

25492545
// NB: This must be set _after_ parsing the value, in order for the `#version version`
25502546
// idiom to work properly, but _before_ any of the following code querying

0 commit comments

Comments
 (0)