Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
80f84359
Commit
80f84359
authored
Jul 24, 2015
by
Viktor Lidholt
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #273 from vlidholt/master
Optimizations for Particle Systems
parents
544e19d4
45399c7a
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
101 additions
and
25 deletions
+101
-25
color_secuence.dart
packages/flutter/example/game/lib/color_secuence.dart
+4
-6
particle_system.dart
packages/flutter/example/game/lib/particle_system.dart
+15
-19
sprites.dart
packages/flutter/example/game/lib/sprites.dart
+1
-0
util.dart
packages/flutter/example/game/lib/util.dart
+81
-0
No files found.
packages/flutter/example/game/lib/color_secuence.dart
View file @
80f84359
...
@@ -24,13 +24,11 @@ class ColorSequence {
...
@@ -24,13 +24,11 @@ class ColorSequence {
colors
=
new
List
<
Color
>();
colors
=
new
List
<
Color
>();
colorStops
=
new
List
<
double
>.
from
(
sequence
.
colorStops
);
colorStops
=
new
List
<
double
>.
from
(
sequence
.
colorStops
);
math
.
Random
rand
=
new
math
.
Random
();
for
(
Color
color
in
sequence
.
colors
)
{
for
(
Color
color
in
sequence
.
colors
)
{
int
aDelta
=
((
rand
.
next
Double
()
*
2.0
-
1.0
)
*
alphaVar
).
toInt
();
int
aDelta
=
((
rand
om
Double
()
*
2.0
-
1.0
)
*
alphaVar
).
toInt
();
int
rDelta
=
((
rand
.
next
Double
()
*
2.0
-
1.0
)
*
redVar
).
toInt
();
int
rDelta
=
((
rand
om
Double
()
*
2.0
-
1.0
)
*
redVar
).
toInt
();
int
gDelta
=
((
rand
.
next
Double
()
*
2.0
-
1.0
)
*
greenVar
).
toInt
();
int
gDelta
=
((
rand
om
Double
()
*
2.0
-
1.0
)
*
greenVar
).
toInt
();
int
bDelta
=
((
rand
.
next
Double
()
*
2.0
-
1.0
)
*
blueVar
).
toInt
();
int
bDelta
=
((
rand
om
Double
()
*
2.0
-
1.0
)
*
blueVar
).
toInt
();
int
aNew
=
(
color
.
alpha
+
aDelta
).
clamp
(
0
,
255
);
int
aNew
=
(
color
.
alpha
+
aDelta
).
clamp
(
0
,
255
);
int
rNew
=
(
color
.
red
+
rDelta
).
clamp
(
0
,
255
);
int
rNew
=
(
color
.
red
+
rDelta
).
clamp
(
0
,
255
);
...
...
packages/flutter/example/game/lib/particle_system.dart
View file @
80f84359
...
@@ -80,8 +80,6 @@ class ParticleSystem extends Node {
...
@@ -80,8 +80,6 @@ class ParticleSystem extends Node {
// double _elapsedTime;
// double _elapsedTime;
int
_numEmittedParticles
=
0
;
int
_numEmittedParticles
=
0
;
math
.
Random
_rand
;
ParticleSystem
(
this
.
texture
,
ParticleSystem
(
this
.
texture
,
{
this
.
life
:
1.5
,
{
this
.
life
:
1.5
,
this
.
lifeVar
:
1.0
,
this
.
lifeVar
:
1.0
,
...
@@ -116,7 +114,6 @@ class ParticleSystem extends Node {
...
@@ -116,7 +114,6 @@ class ParticleSystem extends Node {
this
.
numParticlesToEmit
:
0
,
this
.
numParticlesToEmit
:
0
,
this
.
autoRemoveOnFinish
:
true
})
{
this
.
autoRemoveOnFinish
:
true
})
{
_particles
=
new
List
<
_Particle
>();
_particles
=
new
List
<
_Particle
>();
_rand
=
new
math
.
Random
();
_emitCounter
=
0.0
;
_emitCounter
=
0.0
;
// _elapsedTime = 0.0;
// _elapsedTime = 0.0;
if
(
gravity
==
null
)
gravity
=
new
Vector2
.
zero
();
if
(
gravity
==
null
)
gravity
=
new
Vector2
.
zero
();
...
@@ -124,6 +121,8 @@ class ParticleSystem extends Node {
...
@@ -124,6 +121,8 @@ class ParticleSystem extends Node {
}
}
void
update
(
double
dt
)
{
void
update
(
double
dt
)
{
// TODO: Fix this (it's a temp fix for low framerates)
if
(
dt
>
0.1
)
dt
=
0.1
;
// Create new particles
// Create new particles
double
rate
=
1.0
/
emissionRate
;
double
rate
=
1.0
/
emissionRate
;
...
@@ -196,34 +195,34 @@ class ParticleSystem extends Node {
...
@@ -196,34 +195,34 @@ class ParticleSystem extends Node {
_Particle
particle
=
new
_Particle
();
_Particle
particle
=
new
_Particle
();
// Time to live
// Time to live
particle
.
timeToLive
=
math
.
max
(
life
+
lifeVar
*
rand
Minus1To1
(),
0.0
);
particle
.
timeToLive
=
math
.
max
(
life
+
lifeVar
*
rand
omSignedDouble
(),
0.0
);
// Position
// Position
Point
srcPos
=
Point
.
origin
;
Point
srcPos
=
Point
.
origin
;
particle
.
pos
=
new
Vector2
(
srcPos
.
x
+
posVar
.
x
*
rand
Minus1To1
(),
particle
.
pos
=
new
Vector2
(
srcPos
.
x
+
posVar
.
x
*
rand
omSignedDouble
(),
srcPos
.
y
+
posVar
.
y
*
rand
Minus1To1
());
srcPos
.
y
+
posVar
.
y
*
rand
omSignedDouble
());
// Size
// Size
particle
.
size
=
math
.
max
(
startSize
+
startSizeVar
*
rand
Minus1To1
(),
0.0
);
particle
.
size
=
math
.
max
(
startSize
+
startSizeVar
*
rand
omSignedDouble
(),
0.0
);
double
endSizeFinal
=
math
.
max
(
endSize
+
endSizeVar
*
rand
Minus1To1
(),
0.0
);
double
endSizeFinal
=
math
.
max
(
endSize
+
endSizeVar
*
rand
omSignedDouble
(),
0.0
);
particle
.
deltaSize
=
(
endSizeFinal
-
particle
.
size
)
/
particle
.
timeToLive
;
particle
.
deltaSize
=
(
endSizeFinal
-
particle
.
size
)
/
particle
.
timeToLive
;
// Rotation
// Rotation
particle
.
rotation
=
startRotation
+
startRotationVar
*
rand
Minus1To1
();
particle
.
rotation
=
startRotation
+
startRotationVar
*
rand
omSignedDouble
();
double
endRotationFinal
=
endRotation
+
endRotationVar
*
rand
Minus1To1
();
double
endRotationFinal
=
endRotation
+
endRotationVar
*
rand
omSignedDouble
();
particle
.
deltaRotation
=
(
endRotationFinal
-
particle
.
rotation
)
/
particle
.
timeToLive
;
particle
.
deltaRotation
=
(
endRotationFinal
-
particle
.
rotation
)
/
particle
.
timeToLive
;
// Direction
// Direction
double
dirRadians
=
convertDegrees2Radians
(
direction
+
directionVar
*
rand
Minus1To1
());
double
dirRadians
=
convertDegrees2Radians
(
direction
+
directionVar
*
rand
omSignedDouble
());
Vector2
dirVector
=
new
Vector2
(
math
.
cos
(
dirRadians
),
math
.
sin
(
dirRadians
));
Vector2
dirVector
=
new
Vector2
(
math
.
cos
(
dirRadians
),
math
.
sin
(
dirRadians
));
double
speedFinal
=
speed
+
speedVar
*
rand
Minus1To1
();
double
speedFinal
=
speed
+
speedVar
*
rand
omSignedDouble
();
particle
.
dir
=
dirVector
.
scale
(
speedFinal
);
particle
.
dir
=
dirVector
.
scale
(
speedFinal
);
// Radial acceleration
// Radial acceleration
particle
.
radialAccel
=
radialAcceleration
+
radialAccelerationVar
*
rand
Minus1To1
();
particle
.
radialAccel
=
radialAcceleration
+
radialAccelerationVar
*
rand
omSignedDouble
();
// Tangential acceleration
// Tangential acceleration
particle
.
tangentialAccel
=
tangentialAcceleration
+
tangentialAccelerationVar
*
rand
Minus1To1
();
particle
.
tangentialAccel
=
tangentialAcceleration
+
tangentialAccelerationVar
*
rand
omSignedDouble
();
// Color
// Color
particle
.
colorPos
=
0.0
;
particle
.
colorPos
=
0.0
;
...
@@ -248,7 +247,7 @@ class ParticleSystem extends Node {
...
@@ -248,7 +247,7 @@ class ParticleSystem extends Node {
double
scos
;
double
scos
;
double
ssin
;
double
ssin
;
if
(
rotateToMovement
)
{
if
(
rotateToMovement
)
{
double
extraRotation
=
m
ath
.
atan2
(
particle
.
dir
[
1
],
particle
.
dir
[
0
]);
double
extraRotation
=
GameM
ath
.
atan2
(
particle
.
dir
[
1
],
particle
.
dir
[
0
]);
scos
=
math
.
cos
(
convertDegrees2Radians
(
particle
.
rotation
)
+
extraRotation
)
*
particle
.
size
;
scos
=
math
.
cos
(
convertDegrees2Radians
(
particle
.
rotation
)
+
extraRotation
)
*
particle
.
size
;
ssin
=
math
.
sin
(
convertDegrees2Radians
(
particle
.
rotation
)
+
extraRotation
)
*
particle
.
size
;
ssin
=
math
.
sin
(
convertDegrees2Radians
(
particle
.
rotation
)
+
extraRotation
)
*
particle
.
size
;
}
else
{
}
else
{
...
@@ -275,10 +274,7 @@ class ParticleSystem extends Node {
...
@@ -275,10 +274,7 @@ class ParticleSystem extends Node {
Paint
paint
=
new
Paint
()..
setTransferMode
(
transferMode
)
Paint
paint
=
new
Paint
()..
setTransferMode
(
transferMode
)
..
setFilterQuality
(
FilterQuality
.
low
)
// All Skia examples do this.
..
setFilterQuality
(
FilterQuality
.
low
)
// All Skia examples do this.
..
isAntiAlias
=
false
;
// Antialiasing breaks SkCanvas.drawAtlas?
..
isAntiAlias
=
false
;
// Antialiasing breaks SkCanvas.drawAtlas?
return
canvas
.
drawAtlas
(
texture
.
image
,
transforms
,
rects
,
colors
,
canvas
.
drawAtlas
(
texture
.
image
,
transforms
,
rects
,
colors
,
TransferMode
.
modulate
,
null
,
paint
);
TransferMode
.
modulate
,
null
,
paint
);
}
}
double
randMinus1To1
()
=>
_rand
.
nextDouble
()
*
2.0
-
1.0
;
}
}
packages/flutter/example/game/lib/sprites.dart
View file @
80f84359
...
@@ -7,6 +7,7 @@ library sprites;
...
@@ -7,6 +7,7 @@ library sprites;
import
'dart:async'
;
import
'dart:async'
;
import
'dart:convert'
;
import
'dart:convert'
;
import
'dart:math'
as
math
;
import
'dart:math'
as
math
;
import
'dart:typed_data'
;
import
'dart:sky'
;
import
'dart:sky'
;
import
'package:sky/animation/curves.dart'
;
import
'package:sky/animation/curves.dart'
;
...
...
packages/flutter/example/game/lib/util.dart
View file @
80f84359
part of
sprites
;
part of
sprites
;
math
.
Random
_random
=
new
math
.
Random
();
// Random methods
double
randomDouble
(
)
{
return
_random
.
nextDouble
();
}
double
randomSignedDouble
(
)
{
return
_random
.
nextDouble
()
*
2.0
-
1.0
;
}
int
randomInt
(
int
max
)
{
return
_random
.
nextInt
(
max
);
}
// atan2
class
_Atan2Constants
{
_Atan2Constants
()
{
for
(
int
i
=
0
;
i
<=
size
;
i
++)
{
double
f
=
i
.
toDouble
()
/
size
.
toDouble
();
ppy
[
i
]
=
math
.
atan
(
f
)
*
stretch
/
math
.
PI
;
ppx
[
i
]
=
stretch
*
0.5
-
ppy
[
i
];
pny
[
i
]
=
-
ppy
[
i
];
pnx
[
i
]
=
ppy
[
i
]
-
stretch
*
0.5
;
npy
[
i
]
=
stretch
-
ppy
[
i
];
npx
[
i
]
=
ppy
[
i
]
+
stretch
*
0.5
;
nny
[
i
]
=
ppy
[
i
]
-
stretch
;
nnx
[
i
]
=
-
stretch
*
0.5
-
ppy
[
i
];
}
}
static
const
int
size
=
1024
;
static
const
double
stretch
=
math
.
PI
;
static
const
int
ezis
=
-
size
;
final
Float64List
ppy
=
new
Float64List
(
size
+
1
);
final
Float64List
ppx
=
new
Float64List
(
size
+
1
);
final
Float64List
pny
=
new
Float64List
(
size
+
1
);
final
Float64List
pnx
=
new
Float64List
(
size
+
1
);
final
Float64List
npy
=
new
Float64List
(
size
+
1
);
final
Float64List
npx
=
new
Float64List
(
size
+
1
);
final
Float64List
nny
=
new
Float64List
(
size
+
1
);
final
Float64List
nnx
=
new
Float64List
(
size
+
1
);
}
class
GameMath
{
static
final
_Atan2Constants
_atan2
=
new
_Atan2Constants
();
static
double
atan2
(
double
y
,
double
x
)
{
if
(
x
>=
0
)
{
if
(
y
>=
0
)
{
if
(
x
>=
y
)
return
_atan2
.
ppy
[(
_Atan2Constants
.
size
*
y
/
x
+
0.5
).
floor
()];
else
return
_atan2
.
ppx
[(
_Atan2Constants
.
size
*
x
/
y
+
0.5
).
floor
()];
}
else
{
if
(
x
>=
-
y
)
return
_atan2
.
pny
[(
_Atan2Constants
.
ezis
*
y
/
x
+
0.5
).
floor
()];
else
return
_atan2
.
pnx
[(
_Atan2Constants
.
ezis
*
x
/
y
+
0.5
).
floor
()];
}
}
else
{
if
(
y
>=
0
)
{
if
(-
x
>=
y
)
return
_atan2
.
npy
[(
_Atan2Constants
.
ezis
*
y
/
x
+
0.5
).
floor
()];
else
return
_atan2
.
npx
[(
_Atan2Constants
.
ezis
*
x
/
y
+
0.5
).
floor
()];
}
else
{
if
(
x
<=
y
)
return
_atan2
.
nny
[(
_Atan2Constants
.
size
*
y
/
x
+
0.5
).
floor
()];
else
return
_atan2
.
nnx
[(
_Atan2Constants
.
size
*
x
/
y
+
0.5
).
floor
()];
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment