Skrolli 2018.3: Näin syntyi Assembly-demo

Linkit

Listaukset

vector<float> radii; // Säteet
vector<float> radii_phases; // Säteiden vaiheet
vector<float> speeds; // Nopeudet


vector<float> angles; // Kulmat


Listaus 1:

void initialize(){
	for(int i = 0; i < n; i++){
		int beam = (rand() % 16); // Satunnainen haara
		float dir = rand() % 2 == 0 ? 1 : -1; // Suunta: myötä- tai vastapäivään
		radii.push_back(rand_float() * maxradius); // Satunnaisluku väliltä [0,maxradius]
		radii_phases.push_back(rand_float() * M_PI); // Satunnainen vaihe väliltä [0,pii]
		angles.push_back(rand_float() / 5.0f); // Vähän vaihtelua alkukulmaan
		speeds.push_back(dir * (beam + 5 * (maxradius - radius) / maxradius) / 10.0f);
	}
}


Listaus 2:

// t: ajanhetki
// dt: kulunut aika viime päivityksestä
void update(float t, float dt){
	for(int i = 0; i < Scene::get().gems.size(); i++){
		angles[i] += speeds[i] * dt; // Päivitä kulma
		float r = radii[i] + sin((t + radii_phases[i]) * 4.0f); // Päivitä säde
		vec3 pos = center + cos(angles[i]) * right * r + sin(angles[i]) * up * r; // Laske sijainti
		Scene::get().gems[i].pos = pos; // Päivitä sijainti
		Scene::get().gems[i].color = vec3(abs(sin(t))*0.1f,abs(cos(speeds[i])) * 0.5f, abs(sin(speeds[i]))); // Päivitä väri
	}
	Scene::get().light_intensity = 2.0f + abs(sin(t)); // Päivitä valon kirkkaus
}


Listaus 3:

get_position(float t, // Aika
	vec3 up, // Ylös-suunta tornadon koordinaatistossa
	vec3 right, // Oikealle-suunta tornadon koordinaatistossa
	vec3 forward, // Eteenpäin-suunta tornadon koordinaatistossa
	vec3 center, // Kappaleen ympyräradan keskipiste
	float r, // Kappaleen ympyräradan säde
	float speed, // Kappaleen kulmanopeus
	float angle_phase, // Kappaleen kulma ajanhetkellä 0
	float height_phase) // Kappaleen korkeus-siirtymä ajanhetkellä 0
{
	return center + cos(speed*t + angle_phase) * r * right +
		10 * sin(t + height_phase) * up +
		sin(speed*t + angles_phase) * r * forward;
}