1/*
2 * Copyright 2012-2013 Tri-Edge AI <triedgeai@gmail.com>
3 * Copyright 2014 Haiku, Inc. All rights reserved.
4 *
5 * Distributed under the terms of the MIT license.
6 *
7 * Authors:
8 *		Tri-Edge AI
9 *		John Scipione, jscipione@gmail.com
10 */
11
12
13
14#include "GravitySource.h"
15
16#include "Particle.h"
17
18#include <stdlib.h>
19
20
21#define frand() ((float)rand() / (float)RAND_MAX)
22
23
24GravitySource::GravitySource()
25{
26	x = 0.0f;
27	y = 0.0f;
28	z = 0.0f;
29	r = 0.0f;
30
31	vx = 0.0f;
32	vy = 0.0f;
33	vz = 0.0f;
34
35	tx = frand() * 30.0f - 15.0f;
36	ty = frand() * 30.0f - 15.0f;
37	tz = frand() * 10.0f - 5.0f;
38}
39
40
41void
42GravitySource::Tick()
43{
44	float dx = tx - x;
45	float dy = ty - y;
46	float dz = tz - z;
47
48	float d = dx * dx + dy * dy + dz * dz;
49
50	vx += dx * 0.003f;
51	vy += dy * 0.003f;
52	vz += dz * 0.003f;
53
54	x += vx;
55	y += vy;
56	z += vz;
57
58	vx *= 0.98f;
59	vy *= 0.98f;
60	vz *= 0.98f;
61
62	if (dx * dx + dy * dy + dz * dz < 1.0f) {
63		tx = frand() * 20.0f - 10.0f;
64		ty = frand() * 20.0f - 10.0f;
65		tz = frand() * 10.0f - 5.0f;
66	}
67
68	for (int32 i = 0; i < Particle::list->CountItems(); i++) {
69		Particle* p = Particle::list->ItemAt(i);
70		dx = x - p->x;
71		dy = y - p->y;
72		dz = z - p->z;
73
74		d = dx * dx + dy * dy + dz * dz;
75
76		p->vx += dx / d * 0.25f;
77		p->vy += dy / d * 0.25f;
78		p->vz += dz / d * 0.25f;
79		p->vr += 1.0f / d;
80	}
81}
82