agt 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.md +7 -0
- data/README.md +5 -0
- data/app/assets/javascripts/agt/config.coffee +9 -0
- data/app/assets/javascripts/agt/dom.coffee +12 -0
- data/app/assets/javascripts/agt/function.coffee +317 -0
- data/app/assets/javascripts/agt/geom/circle.coffee +338 -0
- data/app/assets/javascripts/agt/geom/cubic_bezier.coffee +37 -0
- data/app/assets/javascripts/agt/geom/diamond.coffee +241 -0
- data/app/assets/javascripts/agt/geom/ellipsis.coffee +141 -0
- data/app/assets/javascripts/agt/geom/linear_spline.coffee +56 -0
- data/app/assets/javascripts/agt/geom/matrix.coffee +240 -0
- data/app/assets/javascripts/agt/geom/mixins/geometry.coffee +171 -0
- data/app/assets/javascripts/agt/geom/mixins/intersections.coffee +150 -0
- data/app/assets/javascripts/agt/geom/mixins/path.coffee +145 -0
- data/app/assets/javascripts/agt/geom/mixins/proxyable.coffee +9 -0
- data/app/assets/javascripts/agt/geom/mixins/spline.coffee +329 -0
- data/app/assets/javascripts/agt/geom/mixins/surface.coffee +55 -0
- data/app/assets/javascripts/agt/geom/mixins/triangulable.coffee +112 -0
- data/app/assets/javascripts/agt/geom/point.coffee +454 -0
- data/app/assets/javascripts/agt/geom/polygon.coffee +119 -0
- data/app/assets/javascripts/agt/geom/quad_bezier.coffee +43 -0
- data/app/assets/javascripts/agt/geom/quint_bezier.coffee +42 -0
- data/app/assets/javascripts/agt/geom/rectangle.coffee +599 -0
- data/app/assets/javascripts/agt/geom/spiral.coffee +90 -0
- data/app/assets/javascripts/agt/geom/transformation_proxy.coffee +43 -0
- data/app/assets/javascripts/agt/geom/triangle.coffee +442 -0
- data/app/assets/javascripts/agt/impulse.coffee +105 -0
- data/app/assets/javascripts/agt/index.coffee +56 -0
- data/app/assets/javascripts/agt/inflector/inflection.coffee +21 -0
- data/app/assets/javascripts/agt/inflector/inflections.coffee +75 -0
- data/app/assets/javascripts/agt/inflector/inflector.coffee +235 -0
- data/app/assets/javascripts/agt/inheritance.coffee +132 -0
- data/app/assets/javascripts/agt/math.coffee +45 -0
- data/app/assets/javascripts/agt/mixins/activable.coffee +31 -0
- data/app/assets/javascripts/agt/mixins/aliasable.coffee +25 -0
- data/app/assets/javascripts/agt/mixins/alternate_case.coffee +72 -0
- data/app/assets/javascripts/agt/mixins/cloneable.coffee +71 -0
- data/app/assets/javascripts/agt/mixins/delegation.coffee +90 -0
- data/app/assets/javascripts/agt/mixins/disposable.coffee +7 -0
- data/app/assets/javascripts/agt/mixins/equatable.coffee +37 -0
- data/app/assets/javascripts/agt/mixins/formattable.coffee +52 -0
- data/app/assets/javascripts/agt/mixins/globalizable.coffee +175 -0
- data/app/assets/javascripts/agt/mixins/has_ancestors.coffee +47 -0
- data/app/assets/javascripts/agt/mixins/has_collection.coffee +107 -0
- data/app/assets/javascripts/agt/mixins/has_nested_collection.coffee +51 -0
- data/app/assets/javascripts/agt/mixins/memoizable.coffee +64 -0
- data/app/assets/javascripts/agt/mixins/parameterizable.coffee +101 -0
- data/app/assets/javascripts/agt/mixins/poolable.coffee +62 -0
- data/app/assets/javascripts/agt/mixins/sourcable.coffee +45 -0
- data/app/assets/javascripts/agt/mixins/state_machine.coffee +47 -0
- data/app/assets/javascripts/agt/net/router.coffee +165 -0
- data/app/assets/javascripts/agt/object.coffee +9 -0
- data/app/assets/javascripts/agt/particles/actions/base_action.coffee +7 -0
- data/app/assets/javascripts/agt/particles/actions/die_on_surface.coffee +14 -0
- data/app/assets/javascripts/agt/particles/actions/force.coffee +11 -0
- data/app/assets/javascripts/agt/particles/actions/friction.coffee +14 -0
- data/app/assets/javascripts/agt/particles/actions/live.coffee +9 -0
- data/app/assets/javascripts/agt/particles/actions/macro_action.coffee +13 -0
- data/app/assets/javascripts/agt/particles/actions/move.coffee +11 -0
- data/app/assets/javascripts/agt/particles/actions/null_action.coffee +9 -0
- data/app/assets/javascripts/agt/particles/counters/by_rate.coffee +17 -0
- data/app/assets/javascripts/agt/particles/counters/fixed.coffee +9 -0
- data/app/assets/javascripts/agt/particles/counters/null_counter.coffee +9 -0
- data/app/assets/javascripts/agt/particles/emission.coffee +35 -0
- data/app/assets/javascripts/agt/particles/emitters/null_emitter.coffee +7 -0
- data/app/assets/javascripts/agt/particles/emitters/path.coffee +10 -0
- data/app/assets/javascripts/agt/particles/emitters/ponctual.coffee +9 -0
- data/app/assets/javascripts/agt/particles/emitters/surface.coffee +10 -0
- data/app/assets/javascripts/agt/particles/initializers/explosion.coffee +19 -0
- data/app/assets/javascripts/agt/particles/initializers/life.coffee +16 -0
- data/app/assets/javascripts/agt/particles/initializers/macro_initializer.coffee +10 -0
- data/app/assets/javascripts/agt/particles/initializers/null_initializer.coffee +7 -0
- data/app/assets/javascripts/agt/particles/initializers/particle_sub_system.coffee +12 -0
- data/app/assets/javascripts/agt/particles/initializers/stream.coffee +20 -0
- data/app/assets/javascripts/agt/particles/mixins/randomizable.coffee +10 -0
- data/app/assets/javascripts/agt/particles/particle.coffee +32 -0
- data/app/assets/javascripts/agt/particles/sub_system.coffee +11 -0
- data/app/assets/javascripts/agt/particles/system.coffee +103 -0
- data/app/assets/javascripts/agt/particles/timers/instant.coffee +11 -0
- data/app/assets/javascripts/agt/particles/timers/limited.coffee +19 -0
- data/app/assets/javascripts/agt/particles/timers/null_timer.coffee +11 -0
- data/app/assets/javascripts/agt/particles/timers/unlimited.coffee +9 -0
- data/app/assets/javascripts/agt/particles/timers/until_death.coffee +11 -0
- data/app/assets/javascripts/agt/promise.coffee +214 -0
- data/app/assets/javascripts/agt/random/random.coffee +100 -0
- data/app/assets/javascripts/agt/random/seeds/lagged_fibonnacci.coffee +53 -0
- data/app/assets/javascripts/agt/random/seeds/linear.coffee +16 -0
- data/app/assets/javascripts/agt/random/seeds/linear_congruential.coffee +23 -0
- data/app/assets/javascripts/agt/random/seeds/math_random.coffee +9 -0
- data/app/assets/javascripts/agt/random/seeds/mersenne_twister.coffee +42 -0
- data/app/assets/javascripts/agt/random/seeds/no_random.coffee +12 -0
- data/app/assets/javascripts/agt/random/seeds/paul_houle.coffee +19 -0
- data/app/assets/javascripts/agt/signal.coffee +272 -0
- data/app/assets/javascripts/agt/sprites/animation.coffee +13 -0
- data/app/assets/javascripts/agt/sprites/sprite.coffee +30 -0
- data/app/assets/javascripts/agt/widgets/hash.coffee +36 -0
- data/app/assets/javascripts/agt/widgets/widgets.coffee +194 -0
- data/app/assets/javascripts/agt/widgets/widgets/checked_input.coffee +7 -0
- data/app/assets/javascripts/agt/widgets/widgets/focus_bubbling.coffee +15 -0
- data/lib/agt.rb +8 -0
- data/lib/agt/version.rb +5 -0
- metadata +173 -0
@@ -0,0 +1,9 @@
|
|
1
|
+
unless Object.getPropertyDescriptor?
|
2
|
+
if Object.getPrototypeOf? and Object.getOwnPropertyDescriptor?
|
3
|
+
Object.getPropertyDescriptor = (o, name) ->
|
4
|
+
proto = o
|
5
|
+
descriptor = undefined
|
6
|
+
proto = Object.getPrototypeOf?(proto) or proto.__proto__ while proto and not (descriptor = Object.getOwnPropertyDescriptor(proto, name))
|
7
|
+
descriptor
|
8
|
+
else
|
9
|
+
Object.getPropertyDescriptor = -> undefined
|
@@ -0,0 +1,14 @@
|
|
1
|
+
namespace('agt.particles.actions')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.actions.DieOnSurface
|
4
|
+
|
5
|
+
### Public ###
|
6
|
+
|
7
|
+
constructor: (@surfaces) ->
|
8
|
+
if Object::toString.call(@surface).indexOf('Array') is -1
|
9
|
+
@surfaces = [@surfaces]
|
10
|
+
|
11
|
+
prepare: ->
|
12
|
+
|
13
|
+
process: (p) ->
|
14
|
+
return p.die() for surface in @surfaces when surface.contains p.position
|
@@ -0,0 +1,11 @@
|
|
1
|
+
namespace('agt.particles.actions')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.actions.Force extends agt.particles.actions.BaseAction
|
4
|
+
|
5
|
+
### Public ###
|
6
|
+
|
7
|
+
constructor: (@vector=new agt.geom.Point) ->
|
8
|
+
|
9
|
+
process: (particle) ->
|
10
|
+
particle.velocity.x += @vector.x * @biasInSeconds
|
11
|
+
particle.velocity.y += @vector.y * @biasInSeconds
|
@@ -0,0 +1,14 @@
|
|
1
|
+
namespace('agt.particles.actions')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.actions.Friction extends agt.particles.actions.BaseAction
|
4
|
+
|
5
|
+
### Public ###
|
6
|
+
|
7
|
+
constructor: (@amount=1) ->
|
8
|
+
|
9
|
+
process: (particle) ->
|
10
|
+
fx = particle.velocity.x * @biasInSeconds * @amount
|
11
|
+
fy = particle.velocity.y * @biasInSeconds * @amount
|
12
|
+
|
13
|
+
particle.velocity.x -= fx
|
14
|
+
particle.velocity.y -= fy
|
@@ -0,0 +1,13 @@
|
|
1
|
+
namespace('agt.particles.actions')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.actions.MacroAction extends agt.particles.actions.BaseAction
|
4
|
+
|
5
|
+
### Public ###
|
6
|
+
|
7
|
+
constructor: (@actions=[]) ->
|
8
|
+
|
9
|
+
prepare: (bias, biasInSeconds, time) ->
|
10
|
+
action.prepare bias, biasInSeconds, time for action in @actions
|
11
|
+
|
12
|
+
process: (particle) ->
|
13
|
+
action.process particle for action in @actions
|
@@ -0,0 +1,11 @@
|
|
1
|
+
namespace('agt.particles.actions')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.actions.Move extends agt.particles.actions.BaseAction
|
4
|
+
|
5
|
+
### Public ###
|
6
|
+
|
7
|
+
process: (particle) ->
|
8
|
+
particle.lastPosition.x = particle.position.x
|
9
|
+
particle.lastPosition.y = particle.position.y
|
10
|
+
particle.position.x += particle.velocity.x * @biasInSeconds
|
11
|
+
particle.position.y += particle.velocity.y * @biasInSeconds
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace('agt.particles.counters')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.counters.ByRate
|
4
|
+
|
5
|
+
### Public ###
|
6
|
+
|
7
|
+
constructor: (@rate=1) ->
|
8
|
+
@count = 0
|
9
|
+
@rest = 0
|
10
|
+
@offset = 1
|
11
|
+
|
12
|
+
prepare: (bias, biasInSeconds, time) ->
|
13
|
+
@rest += biasInSeconds * @rate
|
14
|
+
@count = Math.floor(@rest)
|
15
|
+
@rest -= @count
|
16
|
+
@count += @offset
|
17
|
+
@offset = 0
|
@@ -0,0 +1,35 @@
|
|
1
|
+
namespace('agt.particles')
|
2
|
+
|
3
|
+
# Public:
|
4
|
+
class agt.particles.Emission
|
5
|
+
|
6
|
+
### Public ###
|
7
|
+
|
8
|
+
constructor: (@particleType=agt.particles.Particle,
|
9
|
+
@emitter=new agt.particles.timers.NullEmitter(),
|
10
|
+
@timer=new agt.particles.counters.NullTimer(),
|
11
|
+
@counter=new agt.particles.emitters.NullCounter(),
|
12
|
+
@initializer=null) ->
|
13
|
+
|
14
|
+
prepare: (bias, biasInSeconds, time) ->
|
15
|
+
@timer.prepare bias, biasInSeconds, time
|
16
|
+
|
17
|
+
nextTime = @timer.nextTime
|
18
|
+
@counter.prepare nextTime, nextTime / 1000, time
|
19
|
+
|
20
|
+
@currentCount = @counter.count
|
21
|
+
@currentTime = nextTime
|
22
|
+
@iterator = 0
|
23
|
+
|
24
|
+
hasNext: -> @iterator < @currentCount
|
25
|
+
|
26
|
+
next: ->
|
27
|
+
particle = @particleType.get position: @emitter.get()
|
28
|
+
@initializer?.initialize particle
|
29
|
+
@iterator++
|
30
|
+
|
31
|
+
particle
|
32
|
+
|
33
|
+
nextTime: -> @currentTime - @iterator / @currentCount * @currentTime
|
34
|
+
|
35
|
+
finished: -> @timer.finished()
|
@@ -0,0 +1,19 @@
|
|
1
|
+
namespace('agt.particles.initializers')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.initializers.Explosion
|
4
|
+
@include agt.particles.Randomizable
|
5
|
+
|
6
|
+
### Public ###
|
7
|
+
|
8
|
+
constructor: (@velocityMin=0,
|
9
|
+
@velocityMax=1,
|
10
|
+
@angleMin=0,
|
11
|
+
@angleMax=Math.PI*2,
|
12
|
+
@random) -> @initRandom()
|
13
|
+
|
14
|
+
initialize: (particle) ->
|
15
|
+
angle = @random.in @angleMin, @angleMax
|
16
|
+
velocity = @random.in @velocityMin, @velocityMax
|
17
|
+
|
18
|
+
particle.velocity.x = Math.cos(angle)*velocity
|
19
|
+
particle.velocity.y = Math.sin(angle)*velocity
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace('agt.particles.initializers')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.initializers.Life
|
4
|
+
@include agt.particles.Randomizable
|
5
|
+
|
6
|
+
### Public ###
|
7
|
+
|
8
|
+
constructor: (@lifeMin, @lifeMax, @random) ->
|
9
|
+
@lifeMax = @lifeMin unless @lifeMax?
|
10
|
+
@initRandom()
|
11
|
+
|
12
|
+
initialize: (particle) ->
|
13
|
+
if @lifeMin is @lifeMax
|
14
|
+
particle.maxLife = @lifeMin
|
15
|
+
else
|
16
|
+
particle.maxLife = @random.in @lifeMin, @lifeMax
|
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace('agt.particles.initializers')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.initializers.ParticleSubSystem
|
4
|
+
|
5
|
+
### Public ###
|
6
|
+
|
7
|
+
constructor: (initializer, action, emissionFactory, subSystem) ->
|
8
|
+
@subSystem = new agt.particles.SubSystem(
|
9
|
+
initializer, action, emissionFactory, subSystem
|
10
|
+
)
|
11
|
+
|
12
|
+
initialize: (particle) -> @subSystem.emitFor particle
|
@@ -0,0 +1,20 @@
|
|
1
|
+
namespace('agt.particles.initializers')
|
2
|
+
# Public:
|
3
|
+
class agt.particles.initializers.Stream
|
4
|
+
@include agt.particles.Randomizable
|
5
|
+
|
6
|
+
### Public ###
|
7
|
+
|
8
|
+
constructor: (@direction=new agt.geom.Point(1,1),
|
9
|
+
@velocityMin=0,
|
10
|
+
@velocityMax=1,
|
11
|
+
@angleRandom=0,
|
12
|
+
@random) -> @initRandom()
|
13
|
+
|
14
|
+
initialize: (particle) ->
|
15
|
+
velocity = @random.in @velocityMin, @velocityMax
|
16
|
+
angle = @direction.angle()
|
17
|
+
angle += @random.pad @angleRandom if @angleRandom isnt 0
|
18
|
+
|
19
|
+
particle.velocity.x = Math.cos(angle) * velocity
|
20
|
+
particle.velocity.y = Math.sin(angle) * velocity
|
@@ -0,0 +1,32 @@
|
|
1
|
+
namespace('agt.particles')
|
2
|
+
|
3
|
+
# Public:
|
4
|
+
class agt.particles.Particle
|
5
|
+
@concern agt.mixins.Poolable
|
6
|
+
|
7
|
+
### Public ###
|
8
|
+
|
9
|
+
init: (options={}) ->
|
10
|
+
@dead = false
|
11
|
+
@life = 0
|
12
|
+
@maxLife = 0
|
13
|
+
@position = new agt.geom.Point
|
14
|
+
@lastPosition = new agt.geom.Point
|
15
|
+
@velocity = new agt.geom.Point
|
16
|
+
@parasite = {}
|
17
|
+
|
18
|
+
@[ k ] = v for k,v of options
|
19
|
+
|
20
|
+
dispose: ->
|
21
|
+
@position = null
|
22
|
+
@lastPosition = null
|
23
|
+
@velocity = null
|
24
|
+
@parasite = null
|
25
|
+
|
26
|
+
die: ->
|
27
|
+
@dead = true
|
28
|
+
@life = @maxLife
|
29
|
+
|
30
|
+
revive: ->
|
31
|
+
@dead = false
|
32
|
+
@life = 0
|
@@ -0,0 +1,11 @@
|
|
1
|
+
namespace('agt.particles')
|
2
|
+
|
3
|
+
# Public:
|
4
|
+
class agt.particles.SubSystem extends agt.particles.System
|
5
|
+
|
6
|
+
### Public ###
|
7
|
+
|
8
|
+
constructor: (initializer, action, @emissionFactory, subSystem) ->
|
9
|
+
super initializer, action, subSystem
|
10
|
+
|
11
|
+
emitFor: (particle) -> @emit @emissionFactory particle
|
@@ -0,0 +1,103 @@
|
|
1
|
+
namespace('agt.particles')
|
2
|
+
|
3
|
+
# Public:
|
4
|
+
class agt.particles.System
|
5
|
+
|
6
|
+
### Public ###
|
7
|
+
|
8
|
+
constructor: (@initializer=new agt.particles.initializers.NullInitializer,
|
9
|
+
@action= new agt.particles.actions.NullAction, @subSystem) ->
|
10
|
+
@particlesCreated = new agt.Signal
|
11
|
+
@particlesDied = new agt.Signal
|
12
|
+
@emissionStarted = new agt.Signal
|
13
|
+
@emissionFinished = new agt.Signal
|
14
|
+
@particles = []
|
15
|
+
@emissions = []
|
16
|
+
|
17
|
+
emit: (emission) ->
|
18
|
+
@emissions.push emission
|
19
|
+
emission.system = this
|
20
|
+
@startEmission emission
|
21
|
+
|
22
|
+
startEmission: (emission) ->
|
23
|
+
emission.prepare 0, 0, @getTime()
|
24
|
+
@created = []
|
25
|
+
@died = []
|
26
|
+
|
27
|
+
@start() unless @running
|
28
|
+
@processEmission emission
|
29
|
+
|
30
|
+
@emissionStarted.dispatch this, emission
|
31
|
+
@particlesCreated.dispatch this, @created if @created.length > 0
|
32
|
+
@particlesDied.dispatch this, @died if @died.length > 0
|
33
|
+
|
34
|
+
@died = null
|
35
|
+
@created = null
|
36
|
+
|
37
|
+
start: ->
|
38
|
+
unless @running
|
39
|
+
agt.Impulse.instance().add @tick, this
|
40
|
+
@running = true
|
41
|
+
|
42
|
+
stop: ->
|
43
|
+
if @running
|
44
|
+
agt.Impulse.instance().remove @tick, this
|
45
|
+
@running = false
|
46
|
+
|
47
|
+
tick: (bias, biasInSeconds, time) ->
|
48
|
+
@died = []
|
49
|
+
@created = []
|
50
|
+
|
51
|
+
@processParticles bias, biasInSeconds, time
|
52
|
+
@processEmissions bias, biasInSeconds, time if @emitting()
|
53
|
+
|
54
|
+
@particlesCreated.dispatch this, @created if @created.length > 0
|
55
|
+
@particlesDied.dispatch this, @died if @died.length > 0
|
56
|
+
|
57
|
+
@died = null
|
58
|
+
@created = null
|
59
|
+
|
60
|
+
emitting: -> @emissions.length > 0
|
61
|
+
|
62
|
+
processEmissions: (bias, biasInSeconds, time) ->
|
63
|
+
for emission in @emissions.concat()
|
64
|
+
emission.prepare bias, biasInSeconds, time
|
65
|
+
@processEmission emission
|
66
|
+
|
67
|
+
processEmission: (emission) ->
|
68
|
+
while emission.hasNext()
|
69
|
+
time = emission.nextTime()
|
70
|
+
particle = emission.next()
|
71
|
+
@created.push particle
|
72
|
+
@registerParticle particle
|
73
|
+
@initializeParticle particle, time
|
74
|
+
if emission.finished()
|
75
|
+
@removeEmission emission
|
76
|
+
@emissionFinished.dispatch this, emission
|
77
|
+
|
78
|
+
removeEmission: (emission) ->
|
79
|
+
@emissions.splice @emissions.indexOf(emission), 1
|
80
|
+
|
81
|
+
processParticles: (bias, biasInSeconds, time) ->
|
82
|
+
@action.prepare bias, biasInSeconds, time
|
83
|
+
for particle in @particles.concat()
|
84
|
+
@action.process particle
|
85
|
+
@unregisterParticle particle if particle.dead
|
86
|
+
|
87
|
+
initializeParticle: (particle, time) ->
|
88
|
+
@initializer.initialize particle
|
89
|
+
@action.prepare time, time / 1000, @getTime()
|
90
|
+
@action.process particle
|
91
|
+
|
92
|
+
@unregisterParticle particle if particle.dead
|
93
|
+
|
94
|
+
registerParticle: (particle) ->
|
95
|
+
@particles.push particle
|
96
|
+
|
97
|
+
unregisterParticle: (particle) ->
|
98
|
+
@died.push particle
|
99
|
+
@subSystem?.emitFor particle
|
100
|
+
@particles.splice @particles.indexOf(particle), 1
|
101
|
+
particle.constructor.release particle
|
102
|
+
|
103
|
+
getTime: -> new Date().valueOf()
|