623cc1e4d2bafd68be8b3790504f5cd8ec206e2c
[scilab.git] / scilab / modules / scirenderer / src / org / scilab / forge / scirenderer / implementation / jogl / JoGLDrawingTools.java
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;
16
17 import org.scilab.forge.scirenderer.DrawingTools;
18 import org.scilab.forge.scirenderer.SciRendererException;
19 import org.scilab.forge.scirenderer.buffers.ElementsBuffer;
20 import org.scilab.forge.scirenderer.clipping.ClippingManager;
21 import org.scilab.forge.scirenderer.implementation.jogl.clipping.JoGLClippingManager;
22 import org.scilab.forge.scirenderer.implementation.jogl.drawer.JoGLShapeDrawer;
23 import org.scilab.forge.scirenderer.implementation.jogl.lightning.JoGLLightManager;
24 import org.scilab.forge.scirenderer.implementation.jogl.JoGLPixelDrawingMode;
25 import org.scilab.forge.scirenderer.lightning.LightManager;
26 import org.scilab.forge.scirenderer.renderer.Renderer;
27 import org.scilab.forge.scirenderer.shapes.appearance.Appearance;
28 import org.scilab.forge.scirenderer.shapes.appearance.Color;
29 import org.scilab.forge.scirenderer.shapes.geometry.Geometry;
30 import org.scilab.forge.scirenderer.texture.AnchorPosition;
31 import org.scilab.forge.scirenderer.texture.Texture;
32 import org.scilab.forge.scirenderer.tranformations.TransformationManager;
33 import org.scilab.forge.scirenderer.tranformations.TransformationManagerImpl;
34 import org.scilab.forge.scirenderer.tranformations.TransformationManagerListener;
35 import org.scilab.forge.scirenderer.tranformations.Vector3d;
36
37 import javax.media.opengl.GL2;
38
39 /**
40  *
41  * JoGl implementation of the DrawingTools.
42  *
43  * @author Pierre Lando
44  */
45 public class JoGLDrawingTools implements DrawingTools {
46
47     private final JoGLCapacity capacity = new JoGLCapacity();
48     private final TransformationManager transformationManager;
49     private final JoGLLightManager lightManager;
50     private final JoGLClippingManager clippingManager;
51     private final JoGLCanvas canvas;
52     private GL2 gl;
53     private int PixelDrawingMode;
54
55     /**
56      * Default constructor.
57      * @param canvas the canvas where this drawing tools live.
58      */
59     JoGLDrawingTools(JoGLCanvas canvas) {
60         this.transformationManager = new TransformationManagerImpl(canvas);
61         this.lightManager = new JoGLLightManager(this);
62         this.clippingManager = new JoGLClippingManager(this);
63
64         this.canvas = canvas;
65
66         this.PixelDrawingMode = GL2.GL_COPY;
67
68         transformationManager.addListener(new TransformationManagerListener() {
69             @Override
70             public void transformationChanged(TransformationManager transformationManager) {
71                 gl.glMatrixMode(GL2.GL_MODELVIEW);
72                 if (transformationManager.isUsingSceneCoordinate()) {
73                     gl.glLoadMatrixd(transformationManager.getTransformation().getMatrix(), 0);
74                 } else {
75                     gl.glLoadMatrixd(transformationManager.getWindowTransformation().getMatrix(), 0);
76                 }
77             }
78         });
79     }
80
81     /**
82      * Synchronise to the given OpenGl context.
83      * @param gl the OpenGL context.
84      */
85     void glSynchronize(GL2 gl) {
86         this.gl = gl;
87         transformationManager.reset();
88         capacity.glReload(gl);
89         lightManager.reload();
90         clippingManager.reload();
91     }
92
93     @Override
94     public JoGLCanvas getCanvas() {
95         return canvas;
96     }
97
98     /**
99      * Return the OpenGl context.
100      * @return the OpenGl context.
101      */
102     public GL2 getGl() {
103         return gl;
104     }
105
106     /**
107      * Return the OpenGl capacity of this canvas.
108      * @return the OpenGl capacity of this canvas.
109      */
110     public JoGLCapacity getGLCapacity() {
111         return capacity;
112     }
113
114     @Override
115     public TransformationManager getTransformationManager() {
116         return transformationManager;
117     }
118
119     @Override
120     public LightManager getLightManager() {
121         return lightManager;
122     }
123
124     @Override
125     public ClippingManager getClippingManager() {
126         return clippingManager;
127     }
128
129     public void setPixelDrawingMode(JoGLPixelDrawingMode mode) {
130         switch (mode) {
131             case CLEAR:
132                 PixelDrawingMode = GL2.GL_CLEAR;
133                 break;
134             case AND:
135                 PixelDrawingMode = GL2.GL_AND;
136                 break;
137             case AND_REVERSE:
138                 PixelDrawingMode = GL2.GL_AND_REVERSE;
139                 break;
140             case COPY:
141                 PixelDrawingMode = GL2.GL_COPY;
142                 break;
143             case AND_INVERTED:
144                 PixelDrawingMode = GL2.GL_AND_INVERTED;
145                 break;
146             case NOOP:
147                 PixelDrawingMode = GL2.GL_NOOP;
148                 break;
149             case XOR:
150                 PixelDrawingMode = GL2.GL_XOR;
151                 break;
152             case OR:
153                 PixelDrawingMode = GL2.GL_OR;
154                 break;
155             case NOR:
156                 PixelDrawingMode = GL2.GL_NOR;
157                 break;
158             case EQUIV:
159                 PixelDrawingMode = GL2.GL_EQUIV;
160                 break;
161             case INVERT:
162                 PixelDrawingMode = GL2.GL_INVERT;
163                 break;
164             case OR_REVERSE:
165                 PixelDrawingMode = GL2.GL_OR_REVERSE;
166                 break;
167             case COPY_INVERTED:
168                 PixelDrawingMode = GL2.GL_COPY_INVERTED;
169                 break;
170             case OR_INVERTED:
171                 PixelDrawingMode = GL2.GL_OR_INVERTED;
172                 break;
173             case NAND:
174                 PixelDrawingMode = GL2.GL_NAND;
175                 break;
176             case SET:
177                 PixelDrawingMode = GL2.GL_SET;
178                 break;
179             default:
180                 PixelDrawingMode = GL2.GL_COPY;
181                 break;
182         }
183     }
184
185     public int getGLPixelDrawingMode() {
186         return PixelDrawingMode;
187     }
188
189     @Override
190     public void clear(Color color) {
191         gl.glClearColor(color.getRedAsFloat(), color.getGreenAsFloat(), color.getBlueAsFloat(), 1.f);
192         gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
193     }
194
195     @Override
196     public void clear(java.awt.Color color) {
197         float[] colorData = color.getRGBColorComponents(null);
198         gl.glClearColor(colorData[0], colorData[1], colorData[2], 1f);
199         gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
200     }
201
202     @Override
203     public void clearDepthBuffer() {
204         gl.glClear(GL2.GL_DEPTH_BUFFER_BIT);
205     }
206
207     @Override
208     public void draw(Renderer renderer) {
209         canvas.getRendererManager().draw(this, renderer);
210     }
211
212     @Override
213     public void draw(Geometry geometry) throws SciRendererException {
214         JoGLShapeDrawer.getDrawer().draw(this, geometry, Appearance.getDefault());
215     }
216
217     @Override
218     public void draw(Geometry geometry, Appearance appearance) throws SciRendererException {
219         JoGLShapeDrawer.getDrawer().draw(this, geometry, appearance);
220     }
221
222     @Override
223     public void draw(Texture texture) throws SciRendererException {
224         canvas.getTextureManager().draw(this, texture);
225     }
226
227     @Override
228     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions) throws SciRendererException {
229         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, 0, null, null);
230     }
231
232     @Override
233     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, double rotationAngle) throws SciRendererException {
234         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, rotationAngle, null, null);
235     }
236
237     @Override
238     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, Color auxColor, ElementsBuffer colors) throws SciRendererException {
239         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, 0, auxColor, colors);
240     }
241
242     @Override
243     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, double rotationAngle, Color auxColor, ElementsBuffer colors) throws SciRendererException {
244         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, rotationAngle, auxColor, colors);
245     }
246
247     @Override
248     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, int offset, int stride, double rotationAngle) throws SciRendererException {
249         canvas.getTextureManager().draw(this, texture, anchor, positions, offset, stride, rotationAngle, null, null);
250     }
251
252     @Override
253     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, int offset, int stride, double rotationAngle, Color auxColor, ElementsBuffer colors) throws SciRendererException {
254         canvas.getTextureManager().draw(this, texture, anchor, positions, offset, stride, rotationAngle, auxColor, colors);
255     }
256
257     @Override
258     public void draw(Texture texture, AnchorPosition anchor, Vector3d position) throws SciRendererException {
259         canvas.getTextureManager().draw(this, texture, anchor, position, 0);
260     }
261
262     @Override
263     public void draw(Texture texture, AnchorPosition anchor, Vector3d position, double rotationAngle) throws SciRendererException {
264         canvas.getTextureManager().draw(this, texture, anchor, position, rotationAngle);
265     }
266
267     /**
268      * Bind the given texture to the OpenGl context.
269      * @param texture the given texture.
270      * @throws SciRendererException is thrown if the texture is invalid.
271      */
272     public void bind(Texture texture) throws SciRendererException {
273         canvas.getTextureManager().bind(this, texture);
274     }
275 }