fire-ring-effect-source.cpp
2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* Copyright (c) 2023 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include "fire-ring-effect-source.h"
#include <random>
namespace Dali::ParticleEffect
{
static float LIFETIME = 5.0f;
FireSource::FireSource(ParticleEmitter& emitter)
: mEmitter(emitter)
{
std::time_t result = std::time(nullptr);
srand(result);
mRadius = Vector2::ONE;
}
FireSource::FireSource(ParticleEmitter& emitter, Dali::Vector2 ringRadius) :
mEmitter(emitter)
{
std::time_t result = std::time(nullptr);
srand(result);
mRadius = ringRadius;
}
void FireSource::Init()
{
auto handle = mEmitter.GetHandle();
if(handle)
{
mStreamBasePos = handle.GetParticleList().AddLocalStream<Vector3>(Vector3::ZERO);
}
}
uint32_t FireSource::Update(ParticleList& particleList, uint32_t count)
{
while(count--)
{
auto particle = particleList.NewParticle(LIFETIME * (float(std::rand() % 1000)/1000.0f) + 1.0f );
if(!particle)
{
return 0u;
}
auto& basePosition = particle.GetByIndex<Vector3>(mStreamBasePos);
auto& position = particle.Get<Vector3>(ParticleStream::POSITION_STREAM_BIT);
auto& color = particle.Get<Vector4>(ParticleStream::COLOR_STREAM_BIT);
auto& velocity = particle.Get<Vector3>(ParticleStream::VELOCITY_STREAM_BIT);
auto& scale = particle.Get<Vector3>(ParticleStream::SCALE_STREAM_BIT);
UpdateParticle(position, basePosition, color, velocity, scale);
}
return 0;
}
void FireSource::UpdateParticle(Vector3& position, Vector3& basePosition, Vector4& color, Vector3& velocity, Vector3& scale)
{
float posRadians = ((rand() % 360) * M_PI) / 180.0f;
basePosition.x = position.x = mRadius.x * sin(posRadians);
basePosition.y = position.y = mRadius.y * cos(posRadians);
color = Dali::Color::WHITE; // white color when emitted
// angle of motion
float radians = ((rand() % 360) * M_PI) / 180.0f;
float speed = ((rand() % 5) + 5);
velocity.x = sin(radians) * speed;
velocity.y = cos(radians) * speed;
// Random initial scale
float currentScale = float(rand() % 32) + 32;
scale = Vector3(currentScale, currentScale, 1);
}
} // namespace Dali::ParticleEffect