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#include "GravityView.h"
14
15#include "Gravity.h"
16#include "GravitySource.h"
17#include "Particle.h"
18
19#include <GL/glu.h>
20
21
22GravityView::GravityView(BRect frame, Gravity* parent)
23	:
24	BGLView(frame, B_EMPTY_STRING, B_FOLLOW_NONE, 0,
25		BGL_RGB | BGL_DEPTH | BGL_DOUBLE),
26	fParent(parent),
27	fGravitySource(new GravitySource()),
28	fSize(128 << parent->Config.ParticleCount),
29	fShade(parent->Config.ShadeID)
30{
31	Particle::Initialize(fSize, fShade);
32}
33
34
35GravityView::~GravityView()
36{
37	Particle::Terminate();
38	delete fGravitySource;
39}
40
41
42void
43GravityView::AttachedToWindow()
44{
45	LockGL();
46	BGLView::AttachedToWindow();
47
48	glClearDepth(1.0f);
49
50	glEnable(GL_BLEND);
51	glBlendFunc(GL_SRC_ALPHA, GL_ONE);
52
53	glMatrixMode(GL_PROJECTION);
54	glLoadIdentity();
55	gluPerspective(45.0f, Bounds().Width() / Bounds().Height(), 2.0f, 20000.0f);
56	glMatrixMode(GL_MODELVIEW);
57	glLoadIdentity();
58
59	glTranslatef(0.0f, 0.0f, -30.0f);
60
61	glDepthMask(GL_FALSE);
62
63	UnlockGL();
64}
65
66
67void
68GravityView::DirectDraw()
69{
70	int32 size = 128 << fParent->Config.ParticleCount;
71	int32 shade = fParent->Config.ShadeID;
72
73	// resize particle list if needed
74	if (size > fSize)
75		Particle::AddParticles(size, shade);
76	else if (size < fSize)
77		Particle::RemoveParticles(size, shade);
78
79	// recolor particles if needed
80	if (shade != fShade)
81		Particle::ColorParticles(size, shade);
82
83	fSize = size;
84	fShade = shade;
85
86	LockGL();
87
88	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
89	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
90
91	Particle::Tick();
92	fGravitySource->Tick();
93
94	SwapBuffers();
95
96	UnlockGL();
97}
98
99