Ignore:
Timestamp:
Jul 1, 2012, 1:39:19 PM (8 years ago)
Author:
touky
Message:

Added worldentity registration support.
Character now walks around.

Location:
trunk/games/ToukyDemo
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/games/ToukyDemo/Character.h

    r1547 r1548  
    217217                                {
    218218                                        m_body_cos[i].z += 2.0f * seconds;
    219                                         m_body_rotation[i].z = lol::cos(m_body_cos[i].z) * 30.0f;
     219                                        float fPI = M_PI;
     220                                        float Tmp = (abs(fmodf(m_body_cos[i].z, fPI * 2.0f) - fPI) / fPI);
     221                                        Tmp = Tmp * Tmp * (3 - 2 * Tmp);
     222                                        Tmp = Tmp * 2.0f - 1.f;
     223                                        m_body_rotation[i].z = Tmp * 30.0f;
     224                                        //m_body_rotation[i].z = lol::cos(m_body_cos[i].z) * 30.0f;
    220225                                        break;
    221226                                }
     
    235240                        }
    236241                }
     242
     243                for (int i = 0; i < EBP_MAX; ++i)
     244                {
     245                        mat4 WorldMatrix = mat4(1.0f);
     246                        int CurParent = m_body_parent[i];
     247
     248                        if (CurParent != i)
     249                                WorldMatrix = m_body_matrix_world[CurParent];
     250
     251                        m_body_matrix_world[i] = WorldMatrix * m_body_matrix_local[i] * mat4(quat::fromeuler_xyz(m_body_rotation[i]));
     252                }
     253
     254                m_velocity = vec3(20.f, .0f, .0f);
     255
     256                m_position += m_rotation.transform(m_velocity) * seconds;
    237257        }
    238258
     
    248268                }
    249269
    250                 for (int i = 0; i < EBP_MAX; ++i)
    251                 {
    252                         mat4 WorldMatrix = mat4(1.0f);
    253                         int CurParent = m_body_parent[i];
    254 
    255                         if (CurParent != i)
    256                                 WorldMatrix = m_body_matrix_world[CurParent];
    257 
    258                         m_body_matrix_world[i] = WorldMatrix * m_body_matrix_local[i] * mat4(quat::fromeuler_xyz(m_body_rotation[i]));
    259                 }
    260 
    261                 m_rotation *= quat::rotate(seconds * 30.0f, vec3(0, 1, 0));
    262                 mat4 main_matrix = mat4::translate(m_position) * mat4(quat::fromeuler_xyz(vec3(-45.0f, .0f, .0f))) * mat4(m_rotation);
     270                m_rotation *= quat::rotate(seconds * 30.0f, vec3(0, 1, 0));
     271                mat4 main_matrix = mat4::translate(m_position) * mat4(m_rotation);
    263272
    264273                for (int i = 0; i < EBP_MAX; ++i)
  • trunk/games/ToukyDemo/ToukyDemo.cpp

    r1547 r1548  
    5353
    5454        m_URO = new UserReactiveObject();
     55        m_URO->m_position = vec3(.0f, -30.0f, .0f);
    5556        Ticker::Ref(m_URO);
    5657
    5758        m_Character = new Character();
    58         m_Character->m_position = vec3(.0f, 10.0f, .0f);
     59        m_Character->m_position = vec3(.0f, 10.0f, 40.0f);
    5960        Ticker::Ref(m_Character);
     61        m_URO->InfluenceEntityRegistration(true, m_Character);
    6062
    6163    m_ready = false;
     
    8587ToukyDemo::~ToukyDemo()
    8688{
     89        m_URO->InfluenceEntityRegistration(false, m_Character);
     90
    8791        Ticker::Unref(m_camera);
    8892    Ticker::Unref(m_URO);
  • trunk/games/ToukyDemo/UserReactiveObject.h

    r1526 r1548  
    99#define __USERREACTIVEOBJECT_H__
    1010
    11 #define DEF_X 30
     11#define DEF_X 12
    1212#define DEF_Y 1
    13 #define DEF_Z 30
     13#define DEF_Z 12
    1414#define DEF_SIZE 10
    1515#define DEF_INF_BLEND 50
     
    203203    char const *GetName() { return "<UserReactiveObject>"; }
    204204
     205        virtual bool InfluenceEntityRegistration(bool IsRegistering, WorldEntity *RegEntity)
     206        {
     207                for (int i = 0; i < m_influencing_entities.Count(); ++i)
     208                {
     209                        if (!m_influencing_entities[i])
     210                                m_influencing_entities.Remove(i--);
     211                        else if (m_influencing_entities[i] == RegEntity)
     212                        {
     213                                if (IsRegistering)
     214                                        return false;
     215                                else
     216                                {
     217                                        m_influencing_entities.Remove(i--);
     218                                        Ticker::Unref(RegEntity);
     219                                        return true;
     220                                }
     221                        }
     222                }
     223
     224                m_influencing_entities << RegEntity;
     225                Ticker::Ref(RegEntity);
     226
     227                return true;
     228        }
     229
    205230protected:
    206231    virtual void TickGame(float seconds)
     
    208233        WorldEntity::TickGame(seconds);
    209234
     235                m_rotation *= quat::rotate(seconds * 10.0f, vec3(0, 1, 0));
     236                LocalToWorld = mat4::translate(m_position) * mat4(m_rotation);
     237
    210238                m_influence_point_list.Empty();
    211239
     
    218246                        debug_point_angle -= M_PI * 2.0f;
    219247
     248                for (int i = 0; i < m_influencing_entities.Count(); ++i)
     249                {
     250                        if (m_influencing_entities[i])
     251                        {
     252                                mat4 LocalPos = inverse(LocalToWorld) * mat4::translate(m_influencing_entities[i]->m_position);
     253                                m_influence_point_list << influencing_point_infos(BLD_SPHERE, LocalPos.v3.xyz, 1.0f);
     254                        }
     255                }
     256
    220257                //m_influence_point_list << influencing_point_infos(BLD_SPHERE, vec3(lol::cos(debug_point_angle) * DEF_X, 0, lol::sin(debug_point_angle) * DEF_Z) * DEF_SIZE * 0.3f, 1.0f);
    221                 m_influence_point_list << influencing_point_infos(BLD_SQUARE, vec3(-lol::cos(debug_point_angle) * DEF_X, 0, -lol::sin(debug_point_angle) * DEF_Z) * DEF_SIZE * 0.3f, 1.0f);
     258                //m_influence_point_list << influencing_point_infos(BLD_SQUARE, vec3(-lol::cos(debug_point_angle) * DEF_X, 0, -lol::sin(debug_point_angle) * DEF_Z) * DEF_SIZE * 0.3f, 1.0f);
    222259
    223260                ComputeInfluenceValues();
     
    371408        }
    372409
    373                 m_rotation *= quat::rotate(seconds * 10.0f, vec3(0, 1, 0));
    374                 mat4 main_matrix = mat4::translate(m_position) * mat4(m_rotation);
    375410                for (int i=0; i < m_point_list.Count(); i++)
    376411                {
    377                         mat4 model = main_matrix *
     412                        mat4 model = LocalToWorld *
    378413                                mat4::translate(m_point_list[i].m_final_pos) *
    379414                                mat4(quat::fromeuler_yxz(m_point_list[i].m_final_rot)) *
     
    385420private:
    386421        //mesh used to render UserReactiveObject
    387     EasyMesh m_ref_mesh;
     422    EasyMesh                                            m_ref_mesh;
    388423        //List of Pos/Rot/Etc... currently applied to the UserReactiveObject's meshes.
    389         Array<transient_infos> m_point_list;
     424        Array<transient_infos>                  m_point_list;
    390425        //List of influence steps
    391         Array<influence_infos> m_influence_list;
     426        Array<influence_infos>                  m_influence_list;
    392427        //List of currently influencing points
    393         Array<influencing_point_infos> m_influence_point_list;
    394 
    395         float wave_angle;
    396         float debug_point_angle;
    397     bool m_ready;
     428        Array<influencing_point_infos>  m_influence_point_list;
     429        //List of currently influencing entities (converted in m_influence_point_list at each frame).
     430        Array<WorldEntity*>                             m_influencing_entities;
     431
     432        float                                                   wave_angle;
     433        float                                                   debug_point_angle;
     434        mat4                                                    LocalToWorld;
     435    bool                                                        m_ready;
    398436};
    399437
Note: See TracChangeset for help on using the changeset viewer.