aboutsummaryrefslogtreecommitdiff
path: root/src/scene.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/scene.h')
-rw-r--r--src/scene.h592
1 files changed, 592 insertions, 0 deletions
diff --git a/src/scene.h b/src/scene.h
new file mode 100644
index 0000000..8c4d752
--- /dev/null
+++ b/src/scene.h
@@ -0,0 +1,592 @@
+/*
+ * Copyright © 2008 Ben Smith
+ * Copyright © 2010-2011 Linaro Limited
+ *
+ * This file is part of the glmark2 OpenGL (ES) 2.0 benchmark.
+ *
+ * glmark2 is free software: you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * glmark2 is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * glmark2. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ * Ben Smith (original glmark benchmark)
+ * Alexandros Frantzis (glmark2)
+ * Marc Ordinas i Llopis, Collabora Ltd. (pulsar scene)
+ * Jesse Barker (glmark2)
+ */
+#ifndef GLMARK2_SCENE_H_
+#define GLMARK2_SCENE_H_
+
+#include "gl-headers.h"
+
+#include "mesh.h"
+#include "vec.h"
+#include "program.h"
+
+#include <math.h>
+
+#include <string>
+#include <map>
+#include <list>
+#include <vector>
+#include "canvas.h"
+
+/**
+ * A configurable scene used for creating benchmarks.
+ */
+class Scene
+{
+public:
+ virtual ~Scene();
+
+ /**
+ * Scene options.
+ */
+ struct Option {
+ Option(const std::string &nam, const std::string &val, const std::string &desc,
+ const std::string &values = "");
+
+ Option() {}
+ std::string name;
+ std::string value;
+ std::string default_value;
+ std::string description;
+ std::vector<std::string> acceptable_values;
+ bool set;
+ };
+
+ /**
+ * The result of a validation check.
+ */
+ enum ValidationResult {
+ ValidationFailure,
+ ValidationSuccess,
+ ValidationUnknown
+ };
+
+ /**
+ * Checks whether this scene (in its current configuration) is supported.
+ *
+ * @param show_errors whether to log errors about unsupported features
+ *
+ * @return whether the scene is supported
+ */
+ virtual bool supported(bool show_errors);
+
+ /**
+ * Performs option-independent resource loading and configuration.
+ *
+ * It should be safe to call ::load() (and the corresponding ::unload())
+ * only once per program execution, although you may choose to do so more
+ * times to better manage resource consumption.
+ *
+ * @return whether loading succeeded
+ */
+ virtual bool load();
+
+ /**
+ * Performs option-independent resource unloading.
+ */
+ virtual void unload();
+
+ /**
+ * Performs option-dependent resource loading and configuration.
+ *
+ * This method also prepares a scene for a benchmark run.
+ * It should be called just before running a scene/benchmark.
+ *
+ * The base Scene::setup() method also checks whether a scene
+ * configuration is supported by calling ::supported(true).
+ *
+ * @return whether setting the scene up succeeded
+ */
+ virtual bool setup();
+
+ /**
+ * Performs option-dependent resource unloading.
+ *
+ * This method should be called just after running a scene/benchmark.
+ *
+ * @return the operation status
+ */
+ virtual void teardown();
+
+ /**
+ * Updates the scene state.
+ */
+ virtual void update();
+
+ /**
+ * Draws the current scene state.
+ */
+ virtual void draw();
+
+ /**
+ * Gets an informational string describing the scene.
+ *
+ * @param title if specified, a custom title to use, instead of the default
+ */
+ virtual std::string info_string(const std::string &title = "");
+
+ /**
+ * Sets the value of an option for this scene.
+ *
+ * @param opt the option to set
+ * @param val the value to set the option to
+ *
+ * @return whether the option value was set successfully
+ */
+ virtual bool set_option(const std::string &opt, const std::string &val);
+
+ /**
+ * Validates the current output of this scene.
+ *
+ * This method should be called after having called ::draw() once.
+ *
+ * @return the validation result
+ */
+ virtual ValidationResult validate() { return ValidationUnknown; }
+
+ /**
+ * Gets whether this scene is running.
+ *
+ * @return true if running, false otherwise
+ */
+ bool running() { return running_; }
+
+ /**
+ * Sets whether this scene is running.
+ *
+ * @return true if running, false otherwise
+ */
+ void running(bool r) { running_ = r; }
+
+ /**
+ * Gets the average FPS value for this scene.
+ *
+ * @return the average FPS value
+ */
+ unsigned average_fps();
+
+ /**
+ * Gets the name of the scene.
+ * @return the name of the scene
+ */
+ const std::string &name() { return name_; }
+
+ /**
+ * Resets all scene options to their default values.
+ */
+ void reset_options();
+
+ /**
+ * Sets the default value of a scene option.
+ */
+ bool set_option_default(const std::string &opt, const std::string &val);
+
+ /**
+ * Gets the scene options.
+ *
+ * @return the scene options
+ */
+ const std::map<std::string, Option> &options() { return options_; }
+
+ /**
+ * Gets a dummy scene object reference.
+ *
+ * @return the dummy Scene
+ */
+ static Scene &dummy()
+ {
+ static Scene dummy_scene(Canvas::dummy(), "");
+ return dummy_scene;
+ }
+
+ /**
+ * Loads a shader program from a pair of vertex and fragment shader strings.
+ *
+ * @return whether the operation succeeded
+ */
+ static bool load_shaders_from_strings(Program &program,
+ const std::string &vtx_shader,
+ const std::string &frg_shader,
+ const std::string &vtx_shader_filename = "None",
+ const std::string &frg_shader_filename = "None");
+
+protected:
+ Scene(Canvas &pCanvas, const std::string &name);
+ std::string construct_title(const std::string &title);
+
+ Canvas &canvas_;
+ std::string name_;
+ std::map<std::string, Option> options_;
+ double startTime_;
+ double lastUpdateTime_;
+ unsigned currentFrame_;
+ bool running_;
+ double duration_; // Duration of run in seconds
+};
+
+/*
+ * Special Scene used for setting the default options
+ */
+class SceneDefaultOptions : public Scene
+{
+public:
+ SceneDefaultOptions(Canvas &pCanvas) : Scene(pCanvas, "") {}
+ bool set_option(const std::string &opt, const std::string &val);
+ bool setup();
+
+private:
+ std::list<std::pair<std::string, std::string> > defaultOptions_;
+};
+
+class SceneBuild : public Scene
+{
+public:
+ SceneBuild(Canvas &pCanvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneBuild();
+
+protected:
+ Program program_;
+ LibMatrix::mat4 perspective_;
+ LibMatrix::vec3 centerVec_;
+ float radius_;
+ Mesh mesh_;
+ bool orientModel_;
+ float orientationAngle_;
+ LibMatrix::vec3 orientationVec_;
+ float rotation_;
+ float rotationSpeed_;
+ bool useVbo_;
+};
+
+class SceneTexture : public Scene
+{
+public:
+ SceneTexture(Canvas &pCanvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneTexture();
+
+protected:
+ Program program_;
+ Mesh mesh_;
+ GLuint texture_;
+ float radius_;
+ bool orientModel_;
+ float orientationAngle_;
+ LibMatrix::vec3 orientationVec_;
+ LibMatrix::mat4 perspective_;
+ LibMatrix::vec3 centerVec_;
+ LibMatrix::vec3 rotation_;
+ LibMatrix::vec3 rotationSpeed_;
+};
+
+class SceneShading : public Scene
+{
+public:
+ SceneShading(Canvas &pCanvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneShading();
+
+protected:
+ Program program_;
+ float radius_;
+ bool orientModel_;
+ float orientationAngle_;
+ LibMatrix::vec3 orientationVec_;
+ LibMatrix::vec3 centerVec_;
+ LibMatrix::mat4 perspective_;
+ Mesh mesh_;
+ float rotation_;
+ float rotationSpeed_;
+};
+
+class SceneGrid : public Scene
+{
+public:
+ SceneGrid(Canvas &pCanvas, const std::string &name);
+ virtual bool load();
+ virtual void unload();
+ virtual bool setup();
+ virtual void teardown();
+ virtual void update();
+ virtual void draw();
+ virtual ValidationResult validate();
+
+ ~SceneGrid();
+
+protected:
+ Program program_;
+ Mesh mesh_;
+ float rotation_;
+ float rotationSpeed_;
+};
+
+class SceneConditionals : public SceneGrid
+{
+public:
+ SceneConditionals(Canvas &pCanvas);
+ bool setup();
+ ValidationResult validate();
+
+ ~SceneConditionals();
+};
+
+class SceneFunction : public SceneGrid
+{
+public:
+ SceneFunction(Canvas &pCanvas);
+ bool setup();
+ ValidationResult validate();
+
+ ~SceneFunction();
+};
+
+class SceneLoop : public SceneGrid
+{
+public:
+ SceneLoop(Canvas &pCanvas);
+ bool setup();
+ ValidationResult validate();
+
+ ~SceneLoop();
+};
+
+class SceneBump : public Scene
+{
+public:
+ SceneBump(Canvas &pCanvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneBump();
+
+protected:
+ Program program_;
+ Mesh mesh_;
+ GLuint texture_;
+ float rotation_;
+ float rotationSpeed_;
+private:
+ bool setup_model_plain(const std::string &type);
+ bool setup_model_normals();
+ bool setup_model_normals_tangent();
+ bool setup_model_height();
+};
+
+class SceneEffect2D : public Scene
+{
+public:
+ SceneEffect2D(Canvas &pCanvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneEffect2D();
+
+protected:
+ Program program_;
+
+ Mesh mesh_;
+ GLuint texture_;
+};
+
+class ScenePulsar : public Scene
+{
+public:
+ ScenePulsar(Canvas &pCanvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~ScenePulsar();
+
+protected:
+ int numQuads_;
+ Program program_;
+ Mesh mesh_;
+ LibMatrix::vec3 scale_;
+ std::vector<LibMatrix::vec3> rotations_;
+ std::vector<LibMatrix::vec3> rotationSpeeds_;
+ GLuint texture_;
+
+private:
+ void create_and_setup_mesh();
+};
+
+struct SceneDesktopPrivate;
+
+class SceneDesktop : public Scene
+{
+public:
+ SceneDesktop(Canvas &canvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneDesktop();
+
+private:
+ SceneDesktopPrivate *priv_;
+};
+
+struct SceneBufferPrivate;
+
+class SceneBuffer : public Scene
+{
+public:
+ SceneBuffer(Canvas &canvas);
+ bool supported(bool show_errors);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneBuffer();
+
+private:
+ SceneBufferPrivate *priv_;
+};
+
+class SceneIdeasPrivate;
+
+class SceneIdeas : public Scene
+{
+public:
+ SceneIdeas(Canvas &pCanvas);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneIdeas();
+
+private:
+ SceneIdeasPrivate* priv_;
+};
+
+class SceneTerrainPrivate;
+
+class SceneTerrain : public Scene
+{
+public:
+ SceneTerrain(Canvas &pCanvas);
+ bool supported(bool show_errors);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+
+ ~SceneTerrain();
+
+private:
+ SceneTerrainPrivate* priv_;
+};
+
+class JellyfishPrivate;
+class SceneJellyfish : public Scene
+{
+ JellyfishPrivate* priv_;
+public:
+ SceneJellyfish(Canvas &pCanvas);
+ ~SceneJellyfish();
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+};
+
+class ShadowPrivate;
+class SceneShadow : public Scene
+{
+ ShadowPrivate* priv_;
+public:
+ SceneShadow(Canvas& canvas);
+ bool supported(bool show_errors);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+};
+
+class RefractPrivate;
+class SceneRefract : public Scene
+{
+ RefractPrivate* priv_;
+public:
+ SceneRefract(Canvas& canvas);
+ bool supported(bool show_errors);
+ bool load();
+ void unload();
+ bool setup();
+ void teardown();
+ void update();
+ void draw();
+ ValidationResult validate();
+};
+
+#endif