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