8ead71eb0700e28b3e60693368ae35e48cf321ef
[scilab.git] / scilab / modules / renderer / src / java / org / scilab / modules / renderer / figureDrawing / SciRenderer.java
1 /*------------------------------------------------------------------------*/
2 /* file: SciRenderer.java                                                 */
3 /* Copyright INRIA 2007                                                   */
4 /* Authors : Jean-Baptiste Silvy                                          */
5 /* desc : GLEventListener used to retrieve informations from the          */
6 /*        canvas                                                          */
7 /*------------------------------------------------------------------------*/
8
9 package org.scilab.modules.renderer.figureDrawing;
10
11 import javax.media.opengl.GLEventListener;
12 import javax.media.opengl.GLAutoDrawable;
13 import javax.media.opengl.GL;
14
15
16 /**
17  * GLEventListener used by Scilab
18  * @author Jean-Baptiste Silvy silvy
19  */
20 public class SciRenderer
21   implements GLEventListener {
22   
23         /** To know if the graphic context has already been initialized */
24         private boolean isInit;
25         
26         /** index of the figure to render */
27         private int renderedFigure;
28         
29         /**
30          * Default constructor
31          * @param figureIndex index of the figure to render
32          */
33         public SciRenderer(int figureIndex) {
34                 isInit = false;
35                 renderedFigure = figureIndex;
36         }
37         
38   /** Called by the drawable to initiate OpenGL rendering by the client.
39    * After all GLEventListeners have been notified of a display event, the 
40    * drawable will swap its buffers if necessary.
41    * @param gLDrawable The GLDrawable object.
42    */    
43   public void display(GLAutoDrawable gLDrawable) {
44       // should call the draw function of the corresponding figure
45           gLDrawable.getContext().setSynchronized(true);
46           FigureScilabCall call = new FigureScilabCall();
47           call.displayFigure(renderedFigure);
48     }
49     
50     
51   /** Called when the display mode has been changed.  <B>!! CURRENTLY UNIMPLEMENTED IN JOGL !!</B>
52    * @param gLDrawable The GLDrawable object.
53    * @param modeChanged Indicates if the video mode has changed.
54    * @param deviceChanged Indicates if the video device has changed.
55    */
56   public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) { }
57              
58   /** Called by the drawable immediately after the OpenGL context is 
59    * initialized for the first time. Can be used to perform one-time OpenGL 
60    * initialization such as setup of lights and display lists.
61    * @param gLDrawable The GLDrawable object.
62    */
63   public void init(GLAutoDrawable gLDrawable) {
64           
65       if (isInit) {
66           FigureScilabCall call = new FigureScilabCall();
67           call.redrawFigure(renderedFigure);
68       }
69       final GL gl = gLDrawable.getGL();
70       gl.glShadeModel(GL.GL_SMOOTH);              // Enable Smooth Shading
71       gl.glClearColor(1.0f, 1.0f, 1.0f, 0.5f);    // white Background
72       gl.glClearDepth(1.0f);                      // Depth Buffer Setup
73       gl.glEnable(GL.GL_DEPTH_TEST);                                                    // Enables Depth Testing
74       gl.glDepthFunc(GL.GL_LEQUAL);                                                             // The Type Of Depth Testing To Do
75       gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);       // Really Nice Perspective Calculations
76       gl.glEnable(GL.GL_LINE_SMOOTH);
77       isInit = true;
78
79     }
80     
81   
82   /** Called by the drawable during the first repaint after the component has 
83    * been resized. The client can update the viewport and view volume of the 
84    * window appropriately, for example by a call to 
85    * GL.glViewport(int, int, int, int); note that for convenience the component
86    * has already called GL.glViewport(int, int, int, int)(x, y, width, height)
87    * when this method is called, so the client may not have to do anything in
88    * this method.
89    * @param gLDrawable The GLDrawable object.
90    * @param x The X Coordinate of the viewport rectangle.
91    * @param y The Y coordinate of the viewport rectanble.
92    * @param width The new width of the window.
93    * @param height The new height of the window.
94    */
95   public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height)
96     {
97       final GL gl = gLDrawable.getGL();
98       //final GLU glu = new GLU();
99       float h = 1.0f; 
100
101       if (height > 0) {
102         // avoid a divide by zero error!
103         h = (float) height;
104       }
105       h = (float) width / h;
106       gl.glMatrixMode(GL.GL_PROJECTION);
107       gl.glLoadIdentity();
108       //glu.gluPerspective(45.0f, h, 1.0, 20.0);
109       gl.glFrustum(0.0, 1.0, 0.0, 1.0, 1.0, 20.0);
110       gl.glMatrixMode(GL.GL_MODELVIEW);
111       gl.glLoadIdentity();
112
113     }
114
115
116 }