1/*
2 * Copyright 2012-2013 Tri-Edge AI <triedgeai@gmail.com>
3 * All rights reserved. Distributed under the terms of the MIT license.
4 */
5
6
7#include "GravityView.h"
8
9#include "Gravity.h"
10#include "GravitySource.h"
11#include "Particle.h"
12
13#include <GL/glu.h>
14
15
16GravityView::GravityView(Gravity* parent, BRect rect)
17	:
18	BGLView(rect, B_EMPTY_STRING, B_FOLLOW_NONE, 0,
19		BGL_RGB | BGL_DEPTH | BGL_DOUBLE)
20{
21	fParent = parent;
22
23	int realCount;
24
25	if (parent->Config.ParticleCount == 0)
26		realCount = 128;
27	else if (parent->Config.ParticleCount == 1)
28		realCount = 256;
29	else if (parent->Config.ParticleCount == 2)
30		realCount = 512;
31	else if (parent->Config.ParticleCount == 3)
32		realCount = 1024;
33	else if (parent->Config.ParticleCount == 4)
34		realCount = 2048;
35	else
36		realCount = 128;
37
38	Particle::Initialize(realCount, parent->Config.ShadeID);
39
40	LockGL();
41
42	glClearDepth(1.0f);
43
44	glEnable(GL_BLEND);
45	glBlendFunc(GL_SRC_ALPHA, GL_ONE);
46
47	glMatrixMode(GL_PROJECTION);
48	glLoadIdentity();
49	gluPerspective(45.0f, rect.Width() / rect.Height(), 2.0f, 20000.0f);
50	glMatrixMode(GL_MODELVIEW);
51	glLoadIdentity();
52
53	glTranslatef(0.0f, 0.0f, -30.0f);
54
55	glDepthMask(GL_FALSE);
56
57	UnlockGL();
58
59	fGravSource = new GravitySource();
60}
61
62
63GravityView::~GravityView()
64{
65	Particle::Terminate();
66	delete fGravSource;
67}
68
69
70void
71GravityView::AttachedToWindow()
72{
73	LockGL();
74	BGLView::AttachedToWindow();
75	UnlockGL();
76}
77
78
79void
80GravityView::DirectDraw()
81{
82	LockGL();
83
84	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
85	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
86
87	Particle::Tick();
88	fGravSource->Tick();
89
90	SwapBuffers();
91
92	UnlockGL();
93}
94
95