Changeset 1496


Ignore:
Timestamp:
Jun 18, 2012, 7:32:58 PM (9 years ago)
Author:
touky
Message:

Added Damping & random in the Lolnament.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/orbital/Lolnament.h

    r1494 r1496  
    1616#define DEF_INF_MAX 30
    1717
     18struct 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
     47struct 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
    1859struct transient_infos
    1960{
    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
    2767                m_base_pos = base_pos;
    2868                m_base_rot = base_rot;
    2969                m_base_scale = base_scale;
    3070                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());
    3179        };
     80
     81        int             m_point_id;
    3282
    3383        vec3    m_base_pos;
     
    3686        vec3    m_base_scale_3d;
    3787
     88        float   m_influence_previous;
    3889        float   m_influence;
    3990
     
    4293        float   m_final_scale;
    4394        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;
    6097};
    6198
     
    63100#define INF_WAVE        1 //Blend with wave
    64101
     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
    65107struct influence_infos
    66108{
    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
    69114                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;
    74115                m_method = method;
    75116        };
    76117
     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
    77134        float   m_step;
    78135        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];
    83143};
    84144
     
    93153                                                        "[sc#44d afcb6 6 8 1]");
    94154
     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
    95165                vec3 default_offset = vec3((float)DEF_X, (float)DEF_Y, (float)DEF_Z) * (float)DEF_SIZE * 0.5f;
    96166                for (int z=0; z < DEF_Z; z++)
    97                 {
    98167                        for (int y=0; y < DEF_Y; y++)
    99                         {
    100168                                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}
    114171
    115172    ~Lolnament()
     
    138195                ComputeInfluenceValues();
    139196
    140                 ComputePointFromInfluenceValues();
     197                ComputePointFromInfluenceValues(seconds);
    141198    }
    142199
     
    145202                for (int i=0; i < m_point_list.Count(); i++)
    146203                {
     204                        m_point_list[i].m_influence_previous = m_point_list[i].m_influence;
    147205                        m_point_list[i].m_influence = 0.0f;
    148206                        for (int j=0; j < m_influence_point_list.Count(); j++)
     
    151209        }
    152210
    153         void ComputePointFromInfluenceValues()
     211        void ComputePointFromInfluenceValues(float seconds)
    154212        {
    155213                for (int i=0; i < m_point_list.Count(); i++)
     
    177235                        work_infos work_a = work_infos();
    178236                        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);
    181239
    182240                        float divider = step_b - step_a;
    183241                        divider = (divider > .0f)?((m_point_list[i].m_influence - step_a) / divider):(1.0f);
    184242
    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)
    193260        {
    194261                //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];
    199268
    200269                //Added offset via given method
     
    203272                        case INF_WAVE:
    204273                        {
    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);
    206275                                dst_work.m_pos += vec3(0.0f, (-1.0f + cos(point_angle)) * 20.0f, 0.0f);
    207276                                //TODO : dst_work.m_rot += vec3(0,0,0);
     
    209278                        case INF_DEFAULT:
    210279                        {
    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                                }
    215293                                break;
    216294                        }
Note: See TracChangeset for help on using the changeset viewer.