• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 Google, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included
12  * in all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20  * DEALINGS IN THE SOFTWARE.
21  */
22 
23 #ifndef SIMULATION_H
24 #define SIMULATION_H
25 
26 #include <memory>
27 #include <random>
28 #include <vector>
29 
30 #include <glm/glm.hpp>
31 
32 #include "Meshes.h"
33 
34 class Animation {
35 public:
36     Animation(unsigned rng_seed, float scale);
37 
38     glm::mat4 transformation(float t);
39 
40 private:
41     struct Data {
42         glm::vec3 axis;
43         float speed;
44         float scale;
45 
46         glm::mat4 matrix;
47     };
48 
49     std::mt19937 rng_;
50     std::uniform_real_distribution<float> dir_;
51     std::uniform_real_distribution<float> speed_;
52 
53     Data current_;
54 };
55 
56 class Curve;
57 
58 class Path {
59 public:
60     Path(unsigned rng_seed);
61 
62     glm::vec3 position(float t);
63 
64 private:
65     struct Subpath {
66         glm::vec3 origin;
67         float start;
68         float end;
69         float now;
70 
71         std::shared_ptr<Curve> curve;
72     };
73 
74     void generate_subpath();
75 
76     std::mt19937 rng_;
77     std::uniform_int_distribution<> type_;
78     std::uniform_real_distribution<float> duration_;
79 
80     Subpath current_;
81 };
82 
83 class Simulation {
84 public:
85     Simulation(int object_count);
86 
87     struct Object {
88         Meshes::Type mesh;
89         glm::vec3 light_pos;
90         glm::vec3 light_color;
91 
92         Animation animation;
93         Path path;
94 
95         uint32_t frame_data_offset;
96 
97         glm::mat4 model;
98     };
99 
objects()100     const std::vector<Object> &objects() const { return objects_; }
101 
rng_seed()102     unsigned int rng_seed() { return random_dev_(); }
103 
104     void set_frame_data_size(uint32_t size);
105     void update(float time, int begin, int end);
106 
107 private:
108     std::random_device random_dev_;
109     std::vector<Object> objects_;
110 };
111 
112 #endif // SIMULATION_H
113