Changeset 1496
- Timestamp:
- Jun 18, 2012, 7:32:58 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/orbital/Lolnament.h
r1494 r1496 16 16 #define DEF_INF_MAX 30 17 17 18 struct work_infos 19 { 20 work_infos() 21 { 22 m_pos = vec3(0,0,0); 23 m_rot = vec3(0,0,0); 24 m_scale = 0.0f; 25 m_scale_3d = vec3(0,0,0); 26 m_damp_up = 0.0f; 27 m_damp_down = 0.0f; 28 } 29 work_infos(vec3 offset_pos, vec3 offset_rot, float offset_scale, vec3 offset_scale_3d, float damp_up, float damp_down) 30 { 31 m_pos = offset_pos; 32 m_rot = offset_rot; 33 m_scale = offset_scale; 34 m_scale_3d = offset_scale_3d; 35 m_damp_up = damp_up; 36 m_damp_down = damp_down; 37 } 38 39 vec3 m_pos; 40 vec3 m_rot; 41 float m_scale; 42 vec3 m_scale_3d; 43 float m_damp_up; 44 float m_damp_down; 45 }; 46 47 struct Point_infos_Part 48 { 49 Point_infos_Part(int useage_index, vec3 offset_pos, vec3 offset_rot, float offset_scale=.0f, vec3 offset_scale_3d=vec3(.0f), float damp_up=.0f, float damp_down=.0f) 50 { 51 m_useage_index = useage_index; 52 m_point_infos =work_infos(offset_pos, offset_rot, offset_scale, offset_scale_3d, damp_up, damp_down); 53 } 54 55 int m_useage_index; 56 work_infos m_point_infos; 57 }; 58 18 59 struct transient_infos 19 60 { 20 transient_infos(vec3 base_pos, vec3 base_rot=vec3(0.0f, 0.0f, 0.0f), float base_scale=1.0f, vec3 base_scale_3d=vec3(1.0f, 1.0f, 1.0f)) 21 : m_final_pos(vec3(0.0f, 0.0f, 0.0f)), 22 m_final_rot(vec3(0.0f, 0.0f, 0.0f)), 23 m_final_scale(0.0f), 24 m_final_scale_3d(vec3(0.0f, 0.0f, 0.0f)), 25 m_influence(0.0f) 26 { 61 transient_infos(int point_id, vec3 base_pos, vec3 base_rot=vec3(0.0f, 0.0f, 0.0f), float base_scale=1.0f, vec3 base_scale_3d=vec3(1.0f, 1.0f, 1.0f), int random_number=0) 62 : m_influence(0.0f), 63 m_influence_previous(0.0f) 64 { 65 m_point_id = point_id; 66 27 67 m_base_pos = base_pos; 28 68 m_base_rot = base_rot; 29 69 m_base_scale = base_scale; 30 70 m_base_scale_3d = base_scale_3d; 71 72 m_final_pos = base_pos; 73 m_final_rot = base_rot; 74 m_final_scale = base_scale; 75 m_final_scale_3d = base_scale_3d; 76 77 for (; random_number > 0; random_number--) 78 random_list << work_infos(vec3(RandF(), RandF(), RandF()), vec3(RandF(), RandF(), RandF()), RandF(), vec3(RandF(), RandF(), RandF()), RandF(), RandF()); 31 79 }; 80 81 int m_point_id; 32 82 33 83 vec3 m_base_pos; … … 36 86 vec3 m_base_scale_3d; 37 87 88 float m_influence_previous; 38 89 float m_influence; 39 90 … … 42 93 float m_final_scale; 43 94 vec3 m_final_scale_3d; 44 }; 45 46 struct work_infos 47 { 48 work_infos() 49 { 50 m_pos = vec3(0,0,0); 51 m_rot = vec3(0,0,0); 52 m_scale = 0.0f; 53 m_scale_3d = vec3(0,0,0); 54 } 55 56 vec3 m_pos; 57 vec3 m_rot; 58 float m_scale; 59 vec3 m_scale_3d; 95 96 Array<work_infos> random_list; 60 97 }; 61 98 … … 63 100 #define INF_WAVE 1 //Blend with wave 64 101 102 #define OFF_DEF 0 //Reference offset 103 #define RND_MIN 1 //Minimum random offset 104 #define RND_MAX 2 //Maximum random offset 105 #define MAX_OFF 3 //Maximum offset slots 106 65 107 struct influence_infos 66 108 { 67 influence_infos(float step, vec3 offset_pos, vec3 offset_rot, float offset_scale=0.0f, vec3 offset_scale_3d=vec3(0.0f, 0.0f, 0.0f), int method=INF_DEFAULT) 68 { 109 influence_infos(float step, const int method=INF_DEFAULT) 110 { 111 //Empty struct 112 memset(this, 0, sizeof(influence_infos)); 113 69 114 m_step = clamp(step, 0.0f, 1.0f); 70 m_offset_pos = offset_pos;71 m_offset_rot = offset_rot;72 m_offset_scale = offset_scale;73 m_offset_scale_3d = offset_scale_3d;74 115 m_method = method; 75 116 }; 76 117 118 inline influence_infos& operator<<(Point_infos_Part const &added_part) 119 { 120 if (added_part.m_useage_index >= OFF_DEF && added_part.m_useage_index < MAX_OFF) 121 { 122 int i = added_part.m_useage_index; 123 m_offset_pos[i] = added_part.m_point_infos.m_pos; 124 m_offset_rot[i] = added_part.m_point_infos.m_rot; 125 m_offset_scale[i] = added_part.m_point_infos.m_scale; 126 m_offset_scale_3d[i] = added_part.m_point_infos.m_scale_3d; 127 m_damp_up[i] = added_part.m_point_infos.m_damp_up; 128 m_damp_down[i] = added_part.m_point_infos.m_damp_down; 129 } 130 131 return *this; 132 } 133 77 134 float m_step; 78 135 int m_method; 79 vec3 m_offset_pos; 80 vec3 m_offset_rot; 81 float m_offset_scale; 82 vec3 m_offset_scale_3d; 136 137 vec3 m_offset_pos[3]; 138 vec3 m_offset_rot[3]; 139 float m_offset_scale[3]; 140 vec3 m_offset_scale_3d[3]; 141 float m_damp_up[3]; 142 float m_damp_down[3]; 83 143 }; 84 144 … … 93 153 "[sc#44d afcb6 6 8 1]"); 94 154 155 wave_angle = 0.0f; 156 debug_point_angle = 0.0f; 157 158 m_influence_list << (influence_infos(0.0f, INF_WAVE) << Point_infos_Part(OFF_DEF, vec3(.0f), vec3(.0f), .0f, vec3(.0f), .0f, 1.2f)); 159 m_influence_list << (influence_infos(0.3f) << Point_infos_Part(OFF_DEF, vec3(.0f, 40.0f, .0f), vec3(.0f, 90.0f, .0f))); 160 m_influence_list << (influence_infos(0.7f) << Point_infos_Part(OFF_DEF, vec3(.0f, 40.0f, .0f), vec3(.0f, 90.0f, .0f))); 161 m_influence_list << (influence_infos(1.0f) << Point_infos_Part(OFF_DEF, vec3(.0f, 80.0f, .0f), vec3(.0f, .0f, 90.0f), .0f, vec3(2.0f, .0f, .0f)) 162 << Point_infos_Part(RND_MIN, vec3(-40.0f, .0f, -40.0f), vec3(.0f)) 163 << Point_infos_Part(RND_MAX, vec3(40.0f, .0f, 40.0f), vec3(.0f))); 164 95 165 vec3 default_offset = vec3((float)DEF_X, (float)DEF_Y, (float)DEF_Z) * (float)DEF_SIZE * 0.5f; 96 166 for (int z=0; z < DEF_Z; z++) 97 {98 167 for (int y=0; y < DEF_Y; y++) 99 {100 168 for (int x=0; x < DEF_X; x++) 101 { 102 m_point_list << transient_infos(vec3((float)x, (float)y, (float)z) * (float)DEF_SIZE - default_offset, vec3(0,0,0)); 103 } 104 } 105 } 106 wave_angle = 0.0f; 107 debug_point_angle = 0.0f; 108 109 m_influence_list << influence_infos(0.0f, vec3(.0f, .0f, .0f), vec3(.0f, .0f, .0f), 0.0f, vec3(0.0f, 0.0f, 0.0f), INF_WAVE); 110 m_influence_list << influence_infos(0.3f, vec3(.0f, 40.0f, .0f), vec3(.0f, 90.0f, .0f)); 111 m_influence_list << influence_infos(0.7f, vec3(.0f, 40.0f, .0f), vec3(.0f, 90.0f, .0f)); 112 m_influence_list << influence_infos(1.0f, vec3(.0f, 80.0f, .0f), vec3(.0f, .0f, 90.0f), 0.0f, vec3(2.0f, 0.0f, 0.0f)); 113 } 169 m_point_list << transient_infos(m_point_list.Count(), vec3((float)x, (float)y, (float)z) * (float)DEF_SIZE - default_offset, vec3(0,0,0), 1.0f, vec3(1.0f), m_influence_list.Count()); 170 } 114 171 115 172 ~Lolnament() … … 138 195 ComputeInfluenceValues(); 139 196 140 ComputePointFromInfluenceValues( );197 ComputePointFromInfluenceValues(seconds); 141 198 } 142 199 … … 145 202 for (int i=0; i < m_point_list.Count(); i++) 146 203 { 204 m_point_list[i].m_influence_previous = m_point_list[i].m_influence; 147 205 m_point_list[i].m_influence = 0.0f; 148 206 for (int j=0; j < m_influence_point_list.Count(); j++) … … 151 209 } 152 210 153 void ComputePointFromInfluenceValues( )211 void ComputePointFromInfluenceValues(float seconds) 154 212 { 155 213 for (int i=0; i < m_point_list.Count(); i++) … … 177 235 work_infos work_a = work_infos(); 178 236 work_infos work_b = work_infos(); 179 get_modified_point(m_influence_list[info_a], m_point_list[i], i, work_a);180 get_modified_point(m_influence_list[info_b], m_point_list[i], i, work_b);237 get_modified_point(m_influence_list[info_a], info_a, m_point_list[i], work_a); 238 get_modified_point(m_influence_list[info_b], info_b, m_point_list[i], work_b); 181 239 182 240 float divider = step_b - step_a; 183 241 divider = (divider > .0f)?((m_point_list[i].m_influence - step_a) / divider):(1.0f); 184 242 185 m_point_list[i].m_final_pos = work_a.m_pos + (work_b.m_pos - work_a.m_pos) * divider; 186 m_point_list[i].m_final_rot = work_a.m_rot + (work_b.m_rot - work_a.m_rot) * divider; 187 m_point_list[i].m_final_scale = work_a.m_scale + (work_b.m_scale - work_a.m_scale) * divider; 188 m_point_list[i].m_final_scale_3d = work_a.m_scale_3d + (work_b.m_scale_3d - work_a.m_scale_3d) * divider; 189 } 190 } 191 192 void get_modified_point(const influence_infos &src_infos, const transient_infos &src_transient, const int &point_nb, work_infos &dst_work) 243 float dir_influence = m_point_list[i].m_influence - m_point_list[i].m_influence_previous; 244 float damp_used = ((dir_influence > 0.f)?(work_b.m_damp_up):(work_a.m_damp_down)); 245 damp_used = (seconds / (seconds + damp_used)); 246 247 work_a.m_pos = work_a.m_pos + (work_b.m_pos - work_a.m_pos) * divider; 248 work_a.m_rot = work_a.m_rot + (work_b.m_rot - work_a.m_rot) * divider; 249 work_a.m_scale = work_a.m_scale + (work_b.m_scale - work_a.m_scale) * divider; 250 work_a.m_scale_3d = work_a.m_scale_3d + (work_b.m_scale_3d - work_a.m_scale_3d) * divider; 251 252 m_point_list[i].m_final_pos += (work_a.m_pos - m_point_list[i].m_final_pos) * damp_used; 253 m_point_list[i].m_final_rot += (work_a.m_rot - m_point_list[i].m_final_rot) * damp_used; 254 m_point_list[i].m_final_scale += (work_a.m_scale - m_point_list[i].m_final_scale) * damp_used; 255 m_point_list[i].m_final_scale_3d += (work_a.m_scale_3d - m_point_list[i].m_final_scale_3d) * damp_used; 256 } 257 } 258 259 void get_modified_point(const influence_infos &src_infos, const int random_idx, const transient_infos &src_transient, work_infos &dst_work) 193 260 { 194 261 //Base setup 195 dst_work.m_pos = src_transient.m_base_pos; 196 dst_work.m_rot = src_transient.m_base_rot; 197 dst_work.m_scale = src_transient.m_base_scale; 198 dst_work.m_scale_3d = src_transient.m_base_scale_3d; 262 dst_work.m_pos = src_transient.m_base_pos; 263 dst_work.m_rot = src_transient.m_base_rot; 264 dst_work.m_scale = src_transient.m_base_scale; 265 dst_work.m_scale_3d = src_transient.m_base_scale_3d; 266 dst_work.m_damp_down = src_infos.m_damp_down[OFF_DEF]; 267 dst_work.m_damp_up = src_infos.m_damp_up[OFF_DEF]; 199 268 200 269 //Added offset via given method … … 203 272 case INF_WAVE: 204 273 { 205 float point_angle = wave_angle + (float) point_nb* 2.0f * (float)M_PI * 2.0f / ((float)DEF_X * 1.051f);274 float point_angle = wave_angle + (float)src_transient.m_point_id * 2.0f * (float)M_PI * 2.0f / ((float)DEF_X * 1.051f); 206 275 dst_work.m_pos += vec3(0.0f, (-1.0f + cos(point_angle)) * 20.0f, 0.0f); 207 276 //TODO : dst_work.m_rot += vec3(0,0,0); … … 209 278 case INF_DEFAULT: 210 279 { 211 dst_work.m_pos += src_infos.m_offset_pos; 212 dst_work.m_rot += src_infos.m_offset_rot; 213 dst_work.m_scale += src_infos.m_offset_scale; 214 dst_work.m_scale_3d += src_infos.m_offset_scale_3d; 280 dst_work.m_pos += src_infos.m_offset_pos[OFF_DEF]; 281 dst_work.m_rot += src_infos.m_offset_rot[OFF_DEF]; 282 dst_work.m_scale += src_infos.m_offset_scale[OFF_DEF]; 283 dst_work.m_scale_3d += src_infos.m_offset_scale_3d[OFF_DEF]; 284 if (src_transient.random_list.Count() && random_idx > 0 && random_idx < src_transient.random_list.Count()) 285 { 286 dst_work.m_pos += src_infos.m_offset_pos[RND_MIN] + (src_infos.m_offset_pos[RND_MAX] - src_infos.m_offset_pos[RND_MIN]) * src_transient.random_list[random_idx].m_pos; 287 dst_work.m_rot += src_infos.m_offset_rot[RND_MIN] + (src_infos.m_offset_rot[RND_MAX] - src_infos.m_offset_rot[RND_MIN]) * src_transient.random_list[random_idx].m_rot; 288 dst_work.m_scale += src_infos.m_offset_scale[RND_MIN] + (src_infos.m_offset_scale[RND_MAX] - src_infos.m_offset_scale[RND_MIN]) * src_transient.random_list[random_idx].m_scale; 289 dst_work.m_scale_3d += src_infos.m_offset_scale_3d[RND_MIN] + (src_infos.m_offset_scale_3d[RND_MAX] - src_infos.m_offset_scale_3d[RND_MIN]) * src_transient.random_list[random_idx].m_scale_3d; 290 dst_work.m_damp_down += src_infos.m_damp_down[RND_MIN] + (src_infos.m_damp_down[RND_MAX] - src_infos.m_damp_down[RND_MIN]) * src_transient.random_list[random_idx].m_damp_down; 291 dst_work.m_damp_up += src_infos.m_damp_up[RND_MIN] + (src_infos.m_damp_up[RND_MAX] - src_infos.m_damp_up[RND_MIN]) * src_transient.random_list[random_idx].m_damp_up; 292 } 215 293 break; 216 294 }
Note: See TracChangeset
for help on using the changeset viewer.