Adds possibility to color marks in scatter plots
[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  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  */
11
12 package org.scilab.forge.scirenderer.implementation.jogl;
13
14 import org.scilab.forge.scirenderer.DrawingTools;
15 import org.scilab.forge.scirenderer.SciRendererException;
16 import org.scilab.forge.scirenderer.buffers.ElementsBuffer;
17 import org.scilab.forge.scirenderer.clipping.ClippingManager;
18 import org.scilab.forge.scirenderer.implementation.jogl.clipping.JoGLClippingManager;
19 import org.scilab.forge.scirenderer.implementation.jogl.drawer.JoGLShapeDrawer;
20 import org.scilab.forge.scirenderer.implementation.jogl.lightning.JoGLLightManager;
21 import org.scilab.forge.scirenderer.lightning.LightManager;
22 import org.scilab.forge.scirenderer.renderer.Renderer;
23 import org.scilab.forge.scirenderer.shapes.appearance.Appearance;
24 import org.scilab.forge.scirenderer.shapes.appearance.Color;
25 import org.scilab.forge.scirenderer.shapes.geometry.Geometry;
26 import org.scilab.forge.scirenderer.texture.AnchorPosition;
27 import org.scilab.forge.scirenderer.texture.Texture;
28 import org.scilab.forge.scirenderer.tranformations.TransformationManager;
29 import org.scilab.forge.scirenderer.tranformations.TransformationManagerImpl;
30 import org.scilab.forge.scirenderer.tranformations.TransformationManagerListener;
31 import org.scilab.forge.scirenderer.tranformations.Vector3d;
32
33 import javax.media.opengl.GL2;
34
35 /**
36  *
37  * JoGl implementation of the DrawingTools.
38  *
39  * @author Pierre Lando
40  */
41 public class JoGLDrawingTools implements DrawingTools {
42
43     private final JoGLCapacity capacity = new JoGLCapacity();
44     private final TransformationManager transformationManager;
45     private final JoGLLightManager lightManager;
46     private final JoGLClippingManager clippingManager;
47     private final JoGLCanvas canvas;
48     private GL2 gl;
49
50     /**
51      * Default constructor.
52      * @param canvas the canvas where this drawing tools live.
53      */
54     JoGLDrawingTools(JoGLCanvas canvas) {
55         this.transformationManager = new TransformationManagerImpl(canvas);
56         this.lightManager = new JoGLLightManager(this);
57         this.clippingManager = new JoGLClippingManager(this);
58
59         this.canvas = canvas;
60
61         transformationManager.addListener(new TransformationManagerListener() {
62             @Override
63             public void transformationChanged(TransformationManager transformationManager) {
64                 gl.glMatrixMode(GL2.GL_MODELVIEW);
65                 if (transformationManager.isUsingSceneCoordinate()) {
66                     gl.glLoadMatrixd(transformationManager.getTransformation().getMatrix(), 0);
67                 } else {
68                     gl.glLoadMatrixd(transformationManager.getWindowTransformation().getMatrix(), 0);
69                 }
70             }
71         });
72     }
73
74     /**
75      * Synchronise to the given OpenGl context.
76      * @param gl the OpenGL context.
77      */
78     void glSynchronize(GL2 gl) {
79         this.gl = gl;
80         transformationManager.reset();
81         capacity.glReload(gl);
82         lightManager.reload();
83         clippingManager.reload();
84     }
85
86     @Override
87     public JoGLCanvas getCanvas() {
88         return canvas;
89     }
90
91     /**
92      * Return the OpenGl context.
93      * @return the OpenGl context.
94      */
95     public GL2 getGl() {
96         return gl;
97     }
98
99     /**
100      * Return the OpenGl capacity of this canvas.
101      * @return the OpenGl capacity of this canvas.
102      */
103     public JoGLCapacity getGLCapacity() {
104         return capacity;
105     }
106
107     @Override
108     public TransformationManager getTransformationManager() {
109         return transformationManager;
110     }
111
112     @Override
113     public LightManager getLightManager() {
114         return lightManager;
115     }
116
117     @Override
118     public ClippingManager getClippingManager() {
119         return clippingManager;
120     }
121
122     @Override
123     public void clear(Color color) {
124         gl.glClearColor(color.getRedAsFloat(), color.getGreenAsFloat(), color.getBlueAsFloat(), 1.f);
125         gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
126     }
127
128     @Override
129     public void clear(java.awt.Color color) {
130         float[] colorData = color.getRGBColorComponents(null);
131         gl.glClearColor(colorData[0], colorData[1], colorData[2], 1f);
132         gl.glClear(GL2.GL_COLOR_BUFFER_BIT);
133     }
134
135     @Override
136     public void clearDepthBuffer() {
137         gl.glClear(GL2.GL_DEPTH_BUFFER_BIT);
138     }
139
140     @Override
141     public void draw(Renderer renderer) {
142         canvas.getRendererManager().draw(this, renderer);
143     }
144
145     @Override
146     public void draw(Geometry geometry) throws SciRendererException {
147         JoGLShapeDrawer.getDrawer().draw(this, geometry, Appearance.getDefault());
148     }
149
150     @Override
151     public void draw(Geometry geometry, Appearance appearance) throws SciRendererException {
152         JoGLShapeDrawer.getDrawer().draw(this, geometry, appearance);
153     }
154
155     @Override
156     public void draw(Texture texture) throws SciRendererException {
157         canvas.getTextureManager().draw(this, texture);
158     }
159
160     @Override
161     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions) throws SciRendererException {
162         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, 0, null);
163     }
164
165     @Override
166     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, double rotationAngle) throws SciRendererException {
167         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, rotationAngle, null);
168     }
169
170     @Override
171     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, ElementsBuffer colors) throws SciRendererException {
172         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, 0, colors);
173     }
174
175     @Override
176     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, double rotationAngle, ElementsBuffer colors) throws SciRendererException {
177         canvas.getTextureManager().draw(this, texture, anchor, positions, 0, 1, rotationAngle, colors);
178     }
179
180     @Override
181     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, int offset, int stride, double rotationAngle) throws SciRendererException {
182         canvas.getTextureManager().draw(this, texture, anchor, positions, offset, stride, rotationAngle, null);
183     }
184
185     @Override
186     public void draw(Texture texture, AnchorPosition anchor, ElementsBuffer positions, int offset, int stride, double rotationAngle, ElementsBuffer colors) throws SciRendererException {
187         canvas.getTextureManager().draw(this, texture, anchor, positions, offset, stride, rotationAngle, colors);
188     }
189
190     @Override
191     public void draw(Texture texture, AnchorPosition anchor, Vector3d position) throws SciRendererException {
192         canvas.getTextureManager().draw(this, texture, anchor, position, 0);
193     }
194
195     @Override
196     public void draw(Texture texture, AnchorPosition anchor, Vector3d position, double rotationAngle) throws SciRendererException {
197         canvas.getTextureManager().draw(this, texture, anchor, position, rotationAngle);
198     }
199
200     /**
201      * Bind the given texture to the OpenGl context.
202      * @param texture the given texture.
203      * @throws SciRendererException is thrown if the texture is invalid.
204      */
205     public void bind(Texture texture) throws SciRendererException {
206         canvas.getTextureManager().bind(this, texture);
207     }
208 }