1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2009-2011 - DIGITEO - Pierre Lando
4  *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13  */
14 
15 package org.scilab.forge.scirenderer.implementation.jogl.renderer;
16 
17 import org.scilab.forge.scirenderer.Drawer;
18 import org.scilab.forge.scirenderer.implementation.jogl.JoGLDrawingTools;
19 import org.scilab.forge.scirenderer.renderer.Renderer;
20 
21 import com.jogamp.opengl.GL2;
22 
23 /**
24  * @author Pierre Lando
25  */
26 public class JoGLRenderer implements Renderer {
27 
28     /**
29      * The current drawer.
30      */
31     private Drawer drawer;
32 
33     /**
34      * The OpenGl display list name.
35      */
36     private Integer glName;
37 
38     /**
39      * Store the display list up to date status.
40      */
41     private boolean upToDate;
42 
43     /**
44      * Default constructor.
45      * The constructor is package : only {@link JoGLRendererManager} can instantiate this object.
46      */
JoGLRenderer()47     JoGLRenderer() {
48         upToDate = false;
49         drawer = null;
50         glName = null;
51     }
52 
53     @Override
setDrawer(Drawer drawer)54     public void setDrawer(Drawer drawer) {
55         this.drawer = drawer;
56         upToDate = false;
57     }
58 
59     @Override
getDrawer()60     public Drawer getDrawer() {
61         return drawer;
62     }
63 
64     @Override
reload()65     public void reload() {
66         glName = null;
67         upToDate = false;
68     }
69 
70     /**
71      * Perform a draw to the given canvas.
72      * @param drawingTools the given drawing tools.
73      */
draw(JoGLDrawingTools drawingTools)74     public void draw(JoGLDrawingTools drawingTools) {
75         if (drawingTools.getCanvas().getJoGLParameters().useDisplayList()) {
76             synchronize(drawingTools);
77             GL2 gl = drawingTools.getGl().getGL2();
78             gl.glCallList(glName);
79         } else {
80             if (drawer != null) {
81                 drawer.draw(drawingTools);
82             }
83         }
84     }
85 
86     /**
87      * Synchronize the display list.
88      * @param drawingTools drawing tools.
89      */
synchronize(JoGLDrawingTools drawingTools)90     private void synchronize(JoGLDrawingTools drawingTools) {
91         GL2 gl = drawingTools.getGl().getGL2();
92 
93         // Check glName.
94         if ((glName == null) || !(gl.glIsList(glName))) {
95             glName = gl.glGenLists(1);
96             upToDate = false;
97         }
98 
99         // Check up to date.
100         if (!upToDate) {
101             gl.glNewList(glName, GL2.GL_COMPILE);
102 
103             if (drawer != null) {
104                 drawer.draw(drawingTools);
105             }
106 
107             gl.glEndList();
108             upToDate = true;
109         }
110     }
111 
112     /**
113      * Dispose resources.
114      * @param gl the current OpenGl context.
115      */
dispose(GL2 gl)116     void dispose(GL2 gl) {
117         if ((glName != null) && gl.glIsList(glName)) {
118             gl.glDeleteLists(glName, 1);
119             glName = null;
120             upToDate = false;
121         }
122     }
123 }
124