Jogamp
Bug 682 - Relocating javax.media.opengl.* -> com.jogamp.opengl.* (Part 1)
[jogl-demos.git] / src / demos / testContextSharing / TestContextSharing.java
1 /*
2  * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * - Redistribution of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  *
11  * - Redistribution in binary form must reproduce the above copyright
12  *   notice, this list of conditions and the following disclaimer in the
13  *   documentation and/or other materials provided with the distribution.
14  *
15  * Neither the name of Sun Microsystems, Inc. or the names of
16  * contributors may be used to endorse or promote products derived from
17  * this software without specific prior written permission.
18  *
19  * This software is provided "AS IS," without a warranty of any kind. ALL
20  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
21  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
22  * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
23  * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
24  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
25  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
26  * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
27  * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
28  * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
29  * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
30  * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
31  *
32  * You acknowledge that this software is not designed or intended for use
33  * in the design, construction, operation or maintenance of any nuclear
34  * facility.
35  *
36  * Sun gratefully acknowledges that this software was originally authored
37  * and developed by Kenneth Bradley Russell and Christopher John Kline.
38  */
39
40 package demos.testContextSharing;
41
42 import java.awt.BorderLayout;
43 import java.awt.Frame;
44
45 import com.jogamp.opengl.DebugGL2;
46 import com.jogamp.opengl.GL2;
47 import com.jogamp.opengl.GLAutoDrawable;
48 import com.jogamp.opengl.GLEventListener;
49 import com.jogamp.opengl.awt.GLCanvas;
50
51
52 /** A simple demonstration of sharing of display lists between drawables. */
53
54 public class TestContextSharing {
55   private int gearDisplayList;
56
57   public static void main(String[] args) {
58     new TestContextSharing().run(args);
59   }
60
61   public void run(String[] args) {
62     GLCanvas canvas1 = new GLCanvas();
63     canvas1.addGLEventListener(new Listener());
64     canvas1.setSize(256, 256);
65     Frame frame1 = new Frame("Canvas 1");
66     frame1.setLayout(new BorderLayout());
67     frame1.add(canvas1, BorderLayout.CENTER);
68     System.err.println("Showing init frame1");
69     frame1.setLocation(0, 0);
70     frame1.pack();
71     frame1.setVisible(true);
72
73     GLCanvas canvas2 = new GLCanvas(null, null, null);
74     canvas2.setSharedContext(canvas1.getContext());
75     canvas2.addGLEventListener(new Listener());
76     canvas2.setSize(256, 256);
77     Frame frame2 = new Frame("Canvas 2");
78     frame2.setLayout(new BorderLayout());
79     frame2.add(canvas2, BorderLayout.CENTER);
80     System.err.println("Showing init frame2");
81     frame2.setLocation(frame1.getWidth(),0);
82     frame2.pack();
83     frame2.setVisible(true);
84
85     try {
86         Thread.sleep(10000);
87     } catch (InterruptedException e) { }
88
89   }
90
91   class Listener implements GLEventListener {
92
93     @Override
94         public void init(GLAutoDrawable drawable) {
95
96       GL2 gl = drawable.getGL().getGL2();
97
98       drawable.setGL(new DebugGL2(gl));
99
100       float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f };
101       gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_POSITION, pos, 0);
102       gl.glEnable(GL2.GL_CULL_FACE);
103       gl.glEnable(GL2.GL_LIGHTING);
104       gl.glEnable(GL2.GL_LIGHT0);
105       gl.glEnable(GL2.GL_DEPTH_TEST);
106
107       initializeDisplayList(gl);
108
109       gl.glEnable(GL2.GL_NORMALIZE);
110     }
111
112     @Override
113         public void dispose(GLAutoDrawable drawable) {
114     }
115
116     @Override
117         public void display(GLAutoDrawable drawable) {
118       GL2 gl = drawable.getGL().getGL2();
119
120       gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
121
122       System.err.println("Drawing display list " + gearDisplayList + ", context: 0x" + Integer.toHexString(gl.getContext().hashCode()));
123       gl.glCallList(gearDisplayList);
124     }
125
126     @Override
127         public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
128       GL2 gl = drawable.getGL().getGL2();
129
130       float h = (float)height / (float)width;
131
132       gl.glMatrixMode(GL2.GL_PROJECTION);
133       gl.glLoadIdentity();
134       gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
135       gl.glMatrixMode(GL2.GL_MODELVIEW);
136       gl.glLoadIdentity();
137       gl.glTranslatef(0.0f, 0.0f, -40.0f);
138     }
139
140     // Unused routines
141     public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}
142   }
143
144   private synchronized void initializeDisplayList(GL2 gl) {
145     if (gearDisplayList != 0) {
146       return;
147     }
148
149     gearDisplayList = gl.glGenLists(1);
150     gl.glNewList(gearDisplayList, GL2.GL_COMPILE);
151     float red[] = { 0.8f, 0.1f, 0.0f, 1.0f };
152     gl.glMaterialfv(GL2.GL_FRONT, GL2.GL_AMBIENT_AND_DIFFUSE, red, 0);
153     gear(gl, 1.0f, 4.0f, 1.0f, 20, 0.7f);
154     gl.glEndList();
155     System.err.println(Thread.currentThread() + " Initialized display list " + gearDisplayList + ", context: 0x" + Integer.toHexString(gl.getContext().hashCode()));
156   }
157
158   private void gear(GL2 gl,
159                     float inner_radius,
160                     float outer_radius,
161                     float width,
162                     int teeth,
163                     float tooth_depth)
164   {
165     int i;
166     float r0, r1, r2;
167     float angle, da;
168     float u, v, len;
169
170     r0 = inner_radius;
171     r1 = outer_radius - tooth_depth / 2.0f;
172     r2 = outer_radius + tooth_depth / 2.0f;
173
174     da = 2.0f * (float) Math.PI / teeth / 4.0f;
175
176     gl.glShadeModel(GL2.GL_FLAT);
177
178     gl.glNormal3f(0.0f, 0.0f, 1.0f);
179
180     /* draw front face */
181     gl.glBegin(GL2.GL_QUAD_STRIP);
182     for (i = 0; i <= teeth; i++)
183       {
184         angle = i * 2.0f * (float) Math.PI / teeth;
185         gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
186         gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
187         if(i < teeth)
188           {
189             gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
190             gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
191           }
192       }
193     gl.glEnd();
194
195     /* draw front sides of teeth */
196     gl.glBegin(GL2.GL_QUADS);
197     for (i = 0; i < teeth; i++)
198       {
199         angle = i * 2.0f * (float) Math.PI / teeth;
200         gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
201         gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
202         gl.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), width * 0.5f);
203         gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
204       }
205     gl.glEnd();
206
207     /* draw back face */
208     gl.glBegin(GL2.GL_QUAD_STRIP);
209     for (i = 0; i <= teeth; i++)
210       {
211         angle = i * 2.0f * (float) Math.PI / teeth;
212         gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
213         gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
214         gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
215         gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
216       }
217     gl.glEnd();
218
219     /* draw back sides of teeth */
220     gl.glBegin(GL2.GL_QUADS);
221     for (i = 0; i < teeth; i++)
222       {
223         angle = i * 2.0f * (float) Math.PI / teeth;
224         gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
225         gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
226         gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
227         gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
228       }
229     gl.glEnd();
230
231     /* draw outward faces of teeth */
232     gl.glBegin(GL2.GL_QUAD_STRIP);
233     for (i = 0; i < teeth; i++)
234       {
235         angle = i * 2.0f * (float) Math.PI / teeth;
236         gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
237         gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
238         u = r2 * (float)Math.cos(angle + da) - r1 * (float)Math.cos(angle);
239         v = r2 * (float)Math.sin(angle + da) - r1 * (float)Math.sin(angle);
240         len = (float)Math.sqrt(u * u + v * v);
241         u /= len;
242         v /= len;
243         gl.glNormal3f(v, -u, 0.0f);
244         gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
245         gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
246         gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
247         gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), width * 0.5f);
248         gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
249         u = r1 * (float)Math.cos(angle + 3 * da) - r2 * (float)Math.cos(angle + 2 * da);
250         v = r1 * (float)Math.sin(angle + 3 * da) - r2 * (float)Math.sin(angle + 2 * da);
251         gl.glNormal3f(v, -u, 0.0f);
252         gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), width * 0.5f);
253         gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
254         gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
255       }
256     gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), width * 0.5f);
257     gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), -width * 0.5f);
258     gl.glEnd();
259
260     gl.glShadeModel(GL2.GL_SMOOTH);
261
262     /* draw inside radius cylinder */
263     gl.glBegin(GL2.GL_QUAD_STRIP);
264     for (i = 0; i <= teeth; i++)
265       {
266         angle = i * 2.0f * (float) Math.PI / teeth;
267         gl.glNormal3f(-(float)Math.cos(angle), -(float)Math.sin(angle), 0.0f);
268         gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
269         gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
270       }
271     gl.glEnd();
272   }
273 }
http://JogAmp.org git info: FAQ, tutorial and man pages.