0031620: Samples - update Android JNI sample to use AIS_ViewController
[occt.git] / samples / java / jniviewer / app / src / main / java / com / opencascade / jnisample / OcctJniRenderer.java
1 // Copyright (c) 2014 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 package com.opencascade.jnisample;
15
16 import javax.microedition.khronos.egl.EGLConfig;
17 import javax.microedition.khronos.opengles.GL10;
18
19 import android.opengl.GLSurfaceView;
20
21 //! Wrapper for C++ OCCT viewer.
22 public class OcctJniRenderer implements GLSurfaceView.Renderer
23 {
24
25   //! Wrapper for V3d_TypeOfOrientation
26   enum TypeOfOrientation
27   {
28     Xpos, // front
29     Ypos, // left
30     Zpos, // top
31     Xneg, // back
32     Yneg, // right
33     Zneg  // bottom
34   };
35
36   //! Empty constructor.
37   OcctJniRenderer (GLSurfaceView theView,
38                    float theScreenDensity)
39   {
40     myView = theView; // this makes cyclic dependency, but it is OK for JVM
41     if (OcctJniActivity.areNativeLoaded)
42     {
43       myCppViewer = cppCreate (theScreenDensity);
44     }
45   }
46
47   //! Open file.
48   public void open (String thePath)
49   {
50     if (myCppViewer != 0)
51     {
52       cppOpen (myCppViewer, thePath);
53     }
54   }
55
56   //! Update viewer.
57   public void onDrawFrame (GL10 theGl)
58   {
59     if (myCppViewer != 0)
60     {
61       if (cppRedraw (myCppViewer))
62       {
63         myView.requestRender(); // this method is allowed from any thread
64       }
65     }
66   }
67
68   //! (re)initialize viewer.
69   public void onSurfaceChanged (GL10 theGl, int theWidth, int theHeight)
70   {
71     if (myCppViewer != 0)
72     {
73       cppResize (myCppViewer, theWidth, theHeight);
74     }
75   }
76
77   public void onSurfaceCreated (GL10 theGl, EGLConfig theEglConfig)
78   {
79     if (myCppViewer != 0)
80     {
81       cppInit (myCppViewer);
82     }
83   }
84
85   //! Add touch point.
86   public void onAddTouchPoint (int theId, float theX, float theY)
87   {
88     if (myCppViewer != 0)
89     {
90       cppAddTouchPoint (myCppViewer, theId, theX, theY);
91     }
92   }
93
94   //! Update touch point.
95   public void onUpdateTouchPoint (int theId, float theX, float theY)
96   {
97     if (myCppViewer != 0)
98     {
99       cppUpdateTouchPoint (myCppViewer, theId, theX, theY);
100     }
101   }
102
103   //! Remove touch point.
104   public void onRemoveTouchPoint (int theId)
105   {
106     if (myCppViewer != 0)
107     {
108       cppRemoveTouchPoint (myCppViewer, theId);
109     }
110   }
111
112   //! Select in 3D Viewer.
113   public void onSelectInViewer (float theX, float theY)
114   {
115     if (myCppViewer != 0)
116     {
117       cppSelectInViewer (myCppViewer, theX, theY);
118     }
119   }
120
121   //! Fit All
122   public void fitAll()
123   {
124     if (myCppViewer != 0)
125     {
126       cppFitAll (myCppViewer);
127     }
128   }
129
130   //! Move camera
131   public void setProj (TypeOfOrientation theProj)
132   {
133     if (myCppViewer == 0)
134     {
135       return;
136     }
137
138     switch (theProj)
139     {
140       case Xpos: cppSetXposProj (myCppViewer); break;
141       case Ypos: cppSetYposProj (myCppViewer); break;
142       case Zpos: cppSetZposProj (myCppViewer); break;
143       case Xneg: cppSetXnegProj (myCppViewer); break;
144       case Yneg: cppSetYnegProj (myCppViewer); break;
145       case Zneg: cppSetZnegProj (myCppViewer); break;
146     }
147   }
148
149   //! Post message to the text view.
150   public void postMessage (String theText)
151   {
152     OcctJniLogger.postMessage (theText);
153   }
154
155   //! Create instance of C++ class
156   private native long cppCreate (float theDispDensity);
157
158   //! Destroy instance of C++ class
159   private native void cppDestroy (long theCppPtr);
160
161   //! Initialize OCCT viewer (steal OpenGL ES context bound to this thread)
162   private native void cppInit    (long theCppPtr);
163
164   //! Resize OCCT viewer
165   private native void cppResize  (long theCppPtr, int theWidth, int theHeight);
166
167   //! Open CAD file
168   private native void cppOpen    (long theCppPtr, String thePath);
169
170   //! Add touch point
171   private native void cppAddTouchPoint (long theCppPtr, int theId, float theX, float theY);
172
173   //! Update touch point
174   private native void cppUpdateTouchPoint (long theCppPtr, int theId, float theX, float theY);
175
176   //! Remove touch point
177   private native void cppRemoveTouchPoint (long theCppPtr, int theId);
178
179   //! Select in 3D Viewer.
180   private native void cppSelectInViewer (long theCppPtr, float theX, float theY);
181
182   //! Redraw OCCT viewer
183   //! Returns TRUE if more frames are requested.
184   private native boolean cppRedraw  (long theCppPtr);
185
186   //! Fit All
187   private native void cppFitAll  (long theCppPtr);
188
189   //! Move camera
190   private native void cppSetXposProj (long theCppPtr);
191
192   //! Move camera
193   private native void cppSetYposProj (long theCppPtr);
194
195   //! Move camera
196   private native void cppSetZposProj (long theCppPtr);
197
198   //! Move camera
199   private native void cppSetXnegProj (long theCppPtr);
200
201   //! Move camera
202   private native void cppSetYnegProj (long theCppPtr);
203
204   //! Move camera
205   private native void cppSetZnegProj (long theCppPtr);
206
207   private GLSurfaceView myView = null; //!< back reference to the View
208   private long myCppViewer = 0;   //!< pointer to c++ class instance
209
210 }