-
Notifications
You must be signed in to change notification settings - Fork 0
/
MetaBalls.java
120 lines (103 loc) · 3.12 KB
/
MetaBalls.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package Main;
import com.sun.opengl.util.GLUT;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.glu.GLU;
/**
*
* @author Íèêèòà Ðóñåöêèé
*/
public class MetaBalls implements GLEventListener {
static GL gl;
static GLU glu;
static Interface Interface;
static long millis1;
static long millis0;
static int fps;
static int frames = 0;
static boolean draw = false;
static boolean run = true;
static boolean grid = false;
public static void main(String[] args) {
// Èíèöèàëèçàöèÿ èíòåðôåéñà
Interface = new Interface();
// Ðàñ÷¸ò ñåòêè
wMath.getGridDimension();
}
/**
* Èíèöèàëèçàöèÿ
* @param drawable
*/
public void init(GLAutoDrawable drawable) {
gl = drawable.getGL();
System.err.println("INIT GL IS: " + gl.getClass().getName());
gl.setSwapInterval(1);
gl.glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
gl.glShadeModel(GL.GL_SMOOTH);
}
/**
*
* @param drawable
* @param x
* @param y
* @param width
* @param height
*/
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
gl = drawable.getGL();
glu = new GLU();
final double h = (double) width / (double) height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, h, 1.0, 10000.0);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
}
/**
*
* @param drawable
*/
public void display(GLAutoDrawable drawable) {
gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glTranslatef(0, 0, 0);
glu.gluLookAt(0, 0, 200, 0, 0, 0, 0, 1, 0);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
GLUT glut = new GLUT();
// Îòîáðàæåíèå òåêñòà â ãëàâíîì îêíå
Interface.drawText(drawable, glut);
// Âûâîä FPS
fixFPS(drawable, glut);
for (Circle circle : Data.Balls) {
if (run) {
// Âçàèìîäåéñòâèå øàðà ñî ñòåíîé
Circle.bounce(circle);
}
if (draw) {
// Îòðèñîâêà êðóãîâ
Grid.drawCircles(circle);
}
}
// Ïðîöåäóðà îòðèñîâêè ìåòàñôåð
Grid.draw();
gl.glFlush();
}
private void fixFPS(GLAutoDrawable drawable, GLUT glut) {
frames++;
millis1 = System.currentTimeMillis();
if (millis1 - millis0 >= 1000) {
fps = frames;
millis0 = millis1;
frames = 0;
}
gl.glColor4f(1f, 1f, 1f, 0.6f);
gl.glWindowPos2i(20, drawable.getHeight() - 25);
glut.glutBitmapString(GLUT.BITMAP_HELVETICA_18, "FPS: " + fps);
}
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
}
}