source: trunk/orbital/Lolnament.h @ 1492

Last change on this file since 1492 was 1492, checked in by touky, 9 years ago

Added Lolnament (Working Title) V0.1a in Orbital, for quick tests purposes.

File size: 4.8 KB
Line 
1//
2// Orbital
3//
4// Copyright: (c) 012 Benjamin Huet <huet.benjamin@gmail.com>
5//            (c) 2012 Sam Hocevar <sam@hocevar.net>
6//
7
8#if !defined __LOLNAMENT_H__
9#define __LOLNAMENT_H__
10
11#define DEF_X 30
12#define DEF_Y 1
13#define DEF_Z 30
14#define DEF_SIZE 10
15#define DEF_INF_BLEND 30
16#define DEF_INF_MAX 40
17
18struct transient_infos
19{
20        transient_infos(vec3 base_pos)
21        {
22                m_pos_base = base_pos;
23                m_influence = 0.0f;
24        };
25
26        vec3    m_pos_base;
27
28        float   m_influence;
29
30        vec3    m_pos_final;
31};
32
33#define INF_DEFAULT 0 //Basic Blend
34#define INF_WAVE        1 //Blend with wave
35
36struct influence_infos
37{
38        influence_infos(float step, vec3 pos_offset, int method=INF_DEFAULT)
39        {
40                m_step = clamp(step, 0.0f, 1.0f);
41                m_pos_offset = pos_offset;
42                m_method = method;
43        };
44
45        float   m_step;
46        int             m_method;
47        vec3    m_pos_offset;
48};
49
50class Lolnament : public WorldEntity
51{
52public:
53    Lolnament()
54      : m_ready(false)
55    {
56        m_ref_mesh.Compile("sc#d91 [afcb8 8 8 1]");
57
58                for (int z=0; z < DEF_Z; z++)
59                {
60                        for (int y=0; y < DEF_Y; y++)
61                        {
62                                for (int x=0; x < DEF_X; x++)
63                                {
64                                        m_point_list << transient_infos(vec3(x * DEF_SIZE, y * DEF_SIZE, z * DEF_SIZE) -
65                                                                        vec3(DEF_X * DEF_SIZE * 0.5f, DEF_Y * DEF_SIZE * 0.5f, DEF_Z * DEF_SIZE * 0.5f));
66                                }
67                        }
68                }
69                wave_angle = 0.0f;
70                debug_point_angle = 0.0f;
71
72                m_influence_list << influence_infos(0.0f, vec3(.0f,   .0f, .0f), INF_WAVE);
73                m_influence_list << influence_infos(0.5f, vec3(.0f, 40.0f, .0f), INF_DEFAULT);
74                m_influence_list << influence_infos(1.0f, vec3(.0f, 80.0f, .0f), INF_DEFAULT);
75    }
76
77    ~Lolnament()
78    {
79    }
80
81    char const *GetName() { return "<Lolnament>"; }
82
83protected:
84    virtual void TickGame(float seconds)
85    {
86        WorldEntity::TickGame(seconds);
87
88                m_influence_point_list.Empty();
89
90                wave_angle += 3.0f * seconds;
91                debug_point_angle += 1.0f * seconds;
92
93                if (wave_angle > M_PI * 2.0f)
94                        wave_angle -= M_PI * 2.0f;
95                if (debug_point_angle > M_PI * 2.0f)
96                        debug_point_angle -= M_PI * 2.0f;
97
98                m_influence_point_list << vec4(cos(debug_point_angle) * DEF_X * DEF_SIZE * 0.3f, 0, sin(debug_point_angle) * DEF_Z * DEF_SIZE * 0.3f, 1.0f);
99
100                ComputeInfluenceValues();
101
102                ComputePointFromInfluenceValues();
103    }
104
105        void ComputeInfluenceValues()
106    {
107                for (int i=0; i < m_point_list.Count(); i++)
108                {
109                        m_point_list[i].m_influence = 0.0f;
110                        for (int j=0; j < m_influence_point_list.Count(); j++)
111                                m_point_list[i].m_influence = max(m_point_list[i].m_influence, 1.0f - min(1.0f, max(0.0f, length(m_point_list[i].m_pos_base - m_influence_point_list[j].xyz) - DEF_INF_MAX) / DEF_INF_BLEND));
112                }
113        }
114
115        void ComputePointFromInfluenceValues()
116        {
117                for (int i=0; i < m_point_list.Count(); i++)
118                {
119                        int info_a = 0;
120                        int info_b = m_influence_list.Count();
121                        float step_a = -1.0f;
122                        float step_b = 2.0f;
123                        for (int j=0; j < m_influence_list.Count(); j++)
124                        {
125                                if (m_influence_list[j].m_step <= m_point_list[i].m_influence &&
126                                        m_influence_list[j].m_step > step_a)
127                                {
128                                        info_a = j;
129                                        step_a = m_influence_list[j].m_step;
130                                }
131                                if (m_influence_list[j].m_step >= m_point_list[i].m_influence &&
132                                        m_influence_list[j].m_step < step_b)
133                                {
134                                        info_b = j;
135                                        step_b = m_influence_list[j].m_step;
136                                }
137                        }
138
139                        vec3 point_pos_a = vec3(.0f, .0f, .0f);
140                        vec3 point_pos_b = vec3(.0f, .0f, .0f);
141                        get_modified_point(m_influence_list[info_a], m_point_list[i], i, point_pos_a);
142                        get_modified_point(m_influence_list[info_b], m_point_list[i], i, point_pos_b);
143
144                        float divider = step_b - step_a;
145                        divider = (divider > .0f)?((m_point_list[i].m_influence - step_a) / divider):(1.0f);
146                        m_point_list[i].m_pos_final = point_pos_a + (point_pos_b - point_pos_a) * divider;
147                }
148        }
149
150        void get_modified_point(const influence_infos &src_infos, const transient_infos &src_transient, int &point_nb, vec3 &point_pos)
151        {
152                point_pos = src_transient.m_pos_base;
153                switch (src_infos.m_method)
154                {
155                        case INF_WAVE:
156                        {
157                                float point_angle = wave_angle + (float)point_nb * 2.0f * M_PI * 2.0f / (DEF_X * 1.051f);
158                                point_pos += vec3(0.0f, (-1.0f + cos(point_angle)) * 20.0f, 0.0f);
159                        }
160                        case INF_DEFAULT:
161                        {
162                                point_pos += src_infos.m_pos_offset;
163                                break;
164                        }
165                }
166        }
167
168    virtual void TickDraw(float seconds)
169    {
170        WorldEntity::TickDraw(seconds);
171
172        if (!m_ready)
173        {
174            m_ref_mesh.MeshConvert();
175            m_ready = true;
176        }
177
178                for (int i=0; i < m_point_list.Count(); i++)
179                {
180                        mat4 model = mat4::translate(m_point_list[i].m_pos_final);
181                        m_ref_mesh.Render(model);
182                }
183    }
184
185private:
186        //mesh used to render Lolnament
187    Mesh m_ref_mesh;
188        //List of Pos/Rot/Etc... currently applied to the Lolnament's meshes.
189        Array<transient_infos> m_point_list;
190        //List of influence steps
191        Array<influence_infos> m_influence_list;
192
193        Array<vec4> m_influence_point_list;
194
195        float wave_angle;
196        float debug_point_angle;
197    bool m_ready;
198};
199
200#endif /* __LOLNAMENT_H__ */
201
Note: See TracBrowser for help on using the repository browser.