=== modified file 'src/default-benchmarks.h'
@@ -60,7 +60,7 @@
benchmarks.push_back("buffer:update-fraction=0.5:update-dispersion=0.9:columns=200:update-method=map:interleave=false");
benchmarks.push_back("buffer:update-fraction=0.5:update-dispersion=0.9:columns=200:update-method=subdata:interleave=false");
benchmarks.push_back("buffer:update-fraction=0.5:update-dispersion=0.9:columns=200:update-method=map:interleave=true");
- benchmarks.push_back("ideas:speed=max:duration=12");
+ benchmarks.push_back("ideas:speed=duration");
benchmarks.push_back("conditionals:vertex-steps=0:fragment-steps=0");
benchmarks.push_back("conditionals:vertex-steps=0:fragment-steps=5");
benchmarks.push_back("conditionals:vertex-steps=5:fragment-steps=0");
=== modified file 'src/scene-ideas.cpp'
@@ -36,13 +36,14 @@
using LibMatrix::vec4;
using LibMatrix::uvec3;
using std::string;
+using std::map;
class SceneIdeasPrivate
{
public:
SceneIdeasPrivate() :
valid_(false),
- currentSpeed_(SPEED_MAXIMUM),
+ currentSpeed_(1.0), // Real time.
currentTime_(START_TIME_),
timeOffset_(START_TIME_)
{
@@ -52,14 +53,13 @@
~SceneIdeasPrivate()
{
}
- void initialize(const string& speed);
+ void initialize(map<string, Scene::Option>& options);
void reset_time();
void update_time();
void update_projection(const mat4& proj);
void draw();
private:
- float speed_from_optval(const string& optval);
void postIdle();
void initLights();
bool valid_;
@@ -72,10 +72,6 @@
static const float CYCLE_TIME_;
static const float TIME_;
static const float START_TIME_;
- static const float SPEED_SLOW;
- static const float SPEED_MEDIUM;
- static const float SPEED_FAST;
- static const float SPEED_MAXIMUM;
// Table
Table table_;
// Logo
@@ -100,10 +96,6 @@
vec4 lightPositions_[3];
};
-const float SceneIdeasPrivate::SPEED_SLOW(0.2);
-const float SceneIdeasPrivate::SPEED_MEDIUM(0.4);
-const float SceneIdeasPrivate::SPEED_FAST(0.7);
-const float SceneIdeasPrivate::SPEED_MAXIMUM(1.0);
const float SceneIdeasPrivate::TIME_(15.0);
const float SceneIdeasPrivate::CYCLE_TIME_(TIME_ * 1.0 - 3.0);
const float SceneIdeasPrivate::START_TIME_(0.6);
@@ -121,7 +113,7 @@
}
void
-SceneIdeasPrivate::initialize(const string& speed)
+SceneIdeasPrivate::initialize(map<string, Scene::Option>& options)
{
// Initialize the positions for the lights we'll use.
initLights();
@@ -148,7 +140,19 @@
reset_time();
- currentSpeed_ = speed_from_optval(speed);
+ // If the option string tells us the user wants the speed to be a function
+ // of the scene duration, do it. Otherwise, take the value explicitly.
+ static const string durationLabel("duration");
+ static const string speedLabel("speed");
+ if (options[speedLabel].value == durationLabel)
+ {
+ float duration = Util::fromString<float>(options[durationLabel].value);
+ currentSpeed_ = (CYCLE_TIME_ - START_TIME_) / duration;
+ }
+ else
+ {
+ currentSpeed_ = Util::fromString<float>(options[speedLabel].value);
+ }
// If we're here, we're okay to run.
valid_ = true;
@@ -195,35 +199,11 @@
projection_ *= proj;
}
-float
-SceneIdeasPrivate::speed_from_optval(const string& optval)
-{
- float retVal(SPEED_MAXIMUM);
- if (optval == "slow")
- {
- retVal = SPEED_SLOW;
- }
- else if (optval == "medium")
- {
- retVal = SPEED_MEDIUM;
- }
- else if (optval == "fast")
- {
- retVal = SPEED_FAST;
- }
- else if (optval != "max")
- {
- Log::error("Unknown speed option '%s', using default.\n", optval.c_str());
- }
-
- return retVal;
-}
-
SceneIdeas::SceneIdeas(Canvas& canvas) :
Scene(canvas, "ideas")
{
- options_["speed"] = Scene::Option("speed", "max",
- "Rendering speed [slow, medium, fast, max]");
+ options_["speed"] = Scene::Option("speed", "duration",
+ "Time coefficient (1.0 is \"wall clock\" speed, <1.0 is slower, >1.0 is faster). A special value of \"duration\" computes this as a function of the \"duration\" option");
}
SceneIdeas::~SceneIdeas()
@@ -248,7 +228,7 @@
{
Scene::setup();
priv_ = new SceneIdeasPrivate();
- priv_->initialize(options_["speed"].value);
+ priv_->initialize(options_);
priv_->update_projection(canvas_.projection());
// Core Scene state