1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_Particle.cpp
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 46365 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "demo/Body/demo_Particle.h"
17 
18 namespace demo
19 {
20     /* ------------------------------------------------------------------------
21         Particle class  member function
22         ------------------------------------------------------------------------ */
23 
24     bool Particle::s_Initialize = false;
25 
26     u32 Particle::s_InitialLifeTime = 30;
27     f32 Particle::s_InitialMass = 1.0f;
28     nn::math::Vector3 Particle::s_InitialPosition(0.0f, 0.0f, 0.0f);
29     nn::math::Vector3 Particle::s_InitialVelocity(0.0f, 0.0f, 0.0f);
30     nn::math::Vector3 Particle::s_RandomVelocityScale(1.0f, 0.0f, 1.0f);
31     nn::math::Vector3 Particle::s_Gravity(0.0f, 0.0f, 0.0f);
32     f32 Particle::s_InitialRadius = 0.4f;
33 
Particle(void)34     Particle::Particle(void) :
35     m_LifeTime(0.0f),
36     m_Mass(s_InitialMass),
37     m_Position(s_InitialPosition), m_Velocity(s_InitialVelocity),
38     m_Acceleration(s_Gravity),
39     m_Color(1.0f, 0.0f, 0.0f),
40     m_Sphere()
41     {
42         if ( ! s_Initialize  )
43         {
44             ::std::srand(0x1234);
45 
46             s_Initialize = true;
47         }
48     }
49 
~Particle()50     Particle::~Particle()
51     {
52     }
53 
Initialize(void)54     void Particle::Initialize(void)
55     {
56         u32 vertexAttributes = demo::VERTEX_POSITION_ATTRIBUTE |
57             demo::VERTEX_COLOR_ATTRIBUTE |
58             demo::VERTEX_NORMAL_ATTRIBUTE |
59             demo::VERTEX_TEXCOORD_ATTRIBUTE;
60         InitializeParticle(vertexAttributes, s_InitialRadius, 2);
61     }
62 
InitializeParticle(const u32 vertexAttributes,const f32 radius,const u32 division)63     void Particle::InitializeParticle(const u32 vertexAttributes,
64         const f32 radius, const u32 division)
65     {
66         m_Sphere.InitializeSphere(vertexAttributes, radius, division);
67 
68         f32 red = static_cast<f32>(::std::rand() % 256) / 256.0f;
69         f32 green = static_cast<f32>(::std::rand() % 256) / 256.0f;
70         f32 blue = static_cast<f32>(::std::rand() % 256) / 256.0f;
71         m_Sphere.SetColor(red, green, blue);
72 
73         m_Acceleration = s_Gravity;
74 
75         Spawn();
76     }
77 
Finalize(void)78     void Particle::Finalize(void)
79     {
80         m_Sphere.Finalize();
81     }
82 
Update(const f32 time)83     void Particle::Update(const f32 time)
84     {
85         m_LifeTime -= time;
86         if ( m_LifeTime < 0 )
87         {
88             Spawn();
89         }
90         else
91         {
92             for (u32 index = 0; index < 3; index++)
93             {
94                 nn::math::Vector3 deltaVec;
95                 nn::math::VEC3Scale(&deltaVec, &m_Acceleration, time / m_Mass);
96                 m_Velocity += deltaVec;
97                 nn::math::VEC3Scale(&deltaVec, &m_Velocity, time);
98                 m_Position += deltaVec;
99             }
100             m_Sphere.SetWorldPosition(m_Position.x, m_Position.y, m_Position.z);
101         }
102     }
103 
Spawn(void)104     void Particle::Spawn(void)
105     {
106         m_LifeTime = static_cast<f32>(::std::rand() % s_InitialLifeTime);
107 
108         m_Position = s_InitialPosition;
109         m_Velocity.x = s_RandomVelocityScale.x * (static_cast<f32>(::std::rand() % 256) / 256.0f - 0.5f) + s_InitialVelocity.x;
110         m_Velocity.y = s_RandomVelocityScale.y * (static_cast<f32>(::std::rand() % 256) / 256.0f - 0.5f) + s_InitialVelocity.y;
111         m_Velocity.z = s_RandomVelocityScale.z * (static_cast<f32>(::std::rand() % 256) / 256.0f - 0.5f) + s_InitialVelocity.z;
112     }
113 
GetWorldMatrix(void) const114     nn::math::MTX44 Particle::GetWorldMatrix(void) const
115     {
116         return m_Sphere.GetWorldMatrix();
117     }
118 
Draw(void)119     void Particle::Draw(void)
120     {
121         m_Sphere.Draw();
122     }
123 
124 }
125