diff --git a/build b/build index 6465630a..d1fe3fe6 160000 --- a/build +++ b/build @@ -1 +1 @@ -Subproject commit 6465630a70c8e025f1bfa93cc5b40f16d4dc2e16 +Subproject commit d1fe3fe6c3a3e128dc5aa5515980f0367a8c5ab4 diff --git a/external/etk b/external/etk index 2ad4975a..bb085be5 160000 --- a/external/etk +++ b/external/etk @@ -1 +1 @@ -Subproject commit 2ad4975a4551f338b2020835c875390c33fc7f0e +Subproject commit bb085be53d88d727686a5e23aa7c3e2cb2caf7f5 diff --git a/external/exml b/external/exml index 0e6c60af..75ef4d18 160000 --- a/external/exml +++ b/external/exml @@ -1 +1 @@ -Subproject commit 0e6c60afb75423ad1450b145e631a4a457e1e7c3 +Subproject commit 75ef4d184ade2791d1db3b3d0f40b8ae46aa7f45 diff --git a/sources/android/src/org/ewol/Ewol.java b/sources/android/src/org/ewol/Ewol.java index 7ed29632..206d2cf8 100644 --- a/sources/android/src/org/ewol/Ewol.java +++ b/sources/android/src/org/ewol/Ewol.java @@ -9,56 +9,58 @@ package org.ewol; import android.app.Activity; +import android.service.wallpaper.WallpaperService; +import android.service.wallpaper.WallpaperService.Engine; public class Ewol { - public static final Ewol EWOL = getInstance(); - private static Ewol instance = null; - - /* Default constructor (why not ?)*/ - private Ewol() {} - /* Use singleton */ - public static Ewol getInstance() { - if(instance == null) - instance = new Ewol(); - return instance; - } - - public static native void setJavaVirtualMachineStart(T activityInstance); - public static native void setJavaVirtualMachineStop(); - public static native void paramSetArchiveDir(int mode, String myString); - - - public native void touchEvent(); - // activity status - public native void onCreate(); - public native void onStart(); - public native void onReStart(); - public native void onResume(); - public native void onPause(); - public native void onStop(); - public native void onDestroy(); - // set display properties : - public native void displayPropertyMetrics(float ratioX, float ratioY); - // IO native function : - // Specific for the type of input : TOOL_TYPE_FINGER and TOOL_TYPE_STYLUS (work as the same) - public native void inputEventMotion(int pointerID, float x, float y); - public native void inputEventState(int pointerID, boolean isDown, float x, float y); - // Specific for the type of input : TOOL_TYPE_MOUSE - public native void mouseEventMotion(int pointerID, float x, float y); - public native void mouseEventState(int pointerID, boolean isDown, float x, float y); - // other unknow event ... - public native void unknowEvent(int eventID); + public static final Ewol EWOL = getInstance(); + private static Ewol instance = null; - public native void keyboardEventMove(int type, boolean isDown); - public native void keyboardEventKey(int uniChar, boolean isDown); + /* Default constructor (why not ?)*/ + private Ewol() {} + /* Use singleton */ + public static Ewol getInstance() { + if(instance == null) + instance = new Ewol(); + return instance; + } - // Audio section ... - public native void audioPlayback(short[] bufferData, int frames, int nbChannels); + public static native void setJavaVirtualMachineStart(T activityInstance); + public static native void setJavaVirtualMachineStartWallpaperEngine(T serviceInstance); + public static native void setJavaVirtualMachineStop(); + public static native void paramSetArchiveDir(int mode, String myString); - public native void keyboardEventKeySystem(int keyVal, boolean isDown); - // renderer Event : - public native void renderInit(); - public native void renderResize(int w, int h); - public native void renderDraw(); + public native void touchEvent(); + // activity status + public native void onCreate(); + public native void onStart(); + public native void onReStart(); + public native void onResume(); + public native void onPause(); + public native void onStop(); + public native void onDestroy(); + // set display properties : + public native void displayPropertyMetrics(float ratioX, float ratioY); + // IO native function : + // Specific for the type of input : TOOL_TYPE_FINGER and TOOL_TYPE_STYLUS (work as the same) + public native void inputEventMotion(int pointerID, float x, float y); + public native void inputEventState(int pointerID, boolean isDown, float x, float y); + // Specific for the type of input : TOOL_TYPE_MOUSE + public native void mouseEventMotion(int pointerID, float x, float y); + public native void mouseEventState(int pointerID, boolean isDown, float x, float y); + // other unknow event ... + public native void unknowEvent(int eventID); + + public native void keyboardEventMove(int type, boolean isDown); + public native void keyboardEventKey(int uniChar, boolean isDown); + + // Audio section ... + public native void audioPlayback(short[] bufferData, int frames, int nbChannels); + + public native void keyboardEventKeySystem(int keyVal, boolean isDown); + // renderer Event : + public native void renderInit(); + public native void renderResize(int w, int h); + public native void renderDraw(); } diff --git a/sources/android/src/org/ewol/EwolActivity.java b/sources/android/src/org/ewol/EwolActivity.java index b0246bb4..b6f7a31c 100644 --- a/sources/android/src/org/ewol/EwolActivity.java +++ b/sources/android/src/org/ewol/EwolActivity.java @@ -9,8 +9,6 @@ package org.ewol; - - import android.app.Activity; import android.content.Context; import android.opengl.GLSurfaceView; @@ -49,170 +47,170 @@ import static org.ewol.Ewol.EWOL; */ public abstract class EwolActivity extends Activity implements EwolCallback, EwolConstants{ - private EwolSurfaceViewGL mGLView; - private EwolAudioTask mStreams; - private Thread mAudioThread; - - static { - System.loadLibrary("ewol"); - } - - protected void initApkPath(String org, String vendor, String project) { - StringBuilder sb = new StringBuilder(); - sb.append(org).append("."); - sb.append(vendor).append("."); - sb.append(project); - String apkFilePath = null; - ApplicationInfo appInfo = null; - PackageManager packMgmr = getPackageManager(); - try { - appInfo = packMgmr.getApplicationInfo(sb.toString(), 0); - } catch (NameNotFoundException e) { - e.printStackTrace(); - throw new RuntimeException("Unable to locate assets, aborting..."); + private EwolSurfaceViewGL mGLView; + private EwolAudioTask mStreams; + private Thread mAudioThread; + + static { + System.loadLibrary("ewol"); } - apkFilePath = appInfo.sourceDir; - Ewol.paramSetArchiveDir(0, apkFilePath); - } - - @Override protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // set the java evironement in the C sources : - Ewol.setJavaVirtualMachineStart(this); - - // Load the application directory - Ewol.paramSetArchiveDir(1, getFilesDir().toString()); - Ewol.paramSetArchiveDir(2, getCacheDir().toString()); - // to enable extarnal storage: add in the manifest the restriction needed ... - //packageManager.checkPermission("android.permission.READ_SMS", myPackage) == PERMISSION_GRANTED; - //Ewol.paramSetArchiveDir(3, getExternalCacheDir().toString()); - - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(metrics); - EWOL.displayPropertyMetrics(metrics.xdpi, metrics.ydpi); - - // call C init ... - EWOL.onCreate(); - - // Remove the title of the current display : - requestWindowFeature(Window.FEATURE_NO_TITLE); - // set full screen Mode : - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - // display keyboard: - //getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); - // hide keyboard : - getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); - - // create bsurface system - mGLView = new EwolSurfaceViewGL(this, 2); - - // create element audio ... - mStreams = new EwolAudioTask(); - - setContentView(mGLView); - } - - @Override protected void onStart() - { - super.onStart(); - // call C - EWOL.onStart(); - } - @Override protected void onRestart() - { - super.onRestart(); - // call C - EWOL.onReStart(); - } - - @Override protected void onResume() - { - super.onResume(); - mGLView.onResume(); - mAudioThread = new Thread(mStreams); - if (mAudioThread != null) { - mAudioThread.start(); + protected void initApkPath(String org, String vendor, String project) { + StringBuilder sb = new StringBuilder(); + sb.append(org).append("."); + sb.append(vendor).append("."); + sb.append(project); + String apkFilePath = null; + ApplicationInfo appInfo = null; + PackageManager packMgmr = getPackageManager(); + try { + appInfo = packMgmr.getApplicationInfo(sb.toString(), 0); + } catch (NameNotFoundException e) { + e.printStackTrace(); + throw new RuntimeException("Unable to locate assets, aborting..."); + } + apkFilePath = appInfo.sourceDir; + Ewol.paramSetArchiveDir(0, apkFilePath); } - // call C - EWOL.onResume(); - } - @Override protected void onPause() - { - super.onPause(); - mGLView.onPause(); - if (mAudioThread != null) { - // request audio stop - mStreams.AutoStop(); - // wait the thread ended ... - try { - mAudioThread.join(); - } catch(InterruptedException e) { } + @Override protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + + // set the java evironement in the C sources : + Ewol.setJavaVirtualMachineStart(this); + + // Load the application directory + Ewol.paramSetArchiveDir(1, getFilesDir().toString()); + Ewol.paramSetArchiveDir(2, getCacheDir().toString()); + // to enable extarnal storage: add in the manifest the restriction needed ... + //packageManager.checkPermission("android.permission.READ_SMS", myPackage) == PERMISSION_GRANTED; + //Ewol.paramSetArchiveDir(3, getExternalCacheDir().toString()); + + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + EWOL.displayPropertyMetrics(metrics.xdpi, metrics.ydpi); + + // call C init ... + EWOL.onCreate(); + + // Remove the title of the current display : + requestWindowFeature(Window.FEATURE_NO_TITLE); + // set full screen Mode : + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + // display keyboard: + //getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + // hide keyboard : + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); + + // create bsurface system + mGLView = new EwolSurfaceViewGL(this, 2); + + // create element audio ... + mStreams = new EwolAudioTask(); + + setContentView(mGLView); } - // call C - EWOL.onPause(); - } - @Override protected void onStop() - { - super.onStop(); - // call C - EWOL.onStop(); - } - @Override protected void onDestroy() - { - super.onDestroy(); - // call C - EWOL.onDestroy(); - // Remove the java Virtual machine pointer form the C code - Ewol.setJavaVirtualMachineStop(); - } - - @Override protected void finalize() throws Throwable - { - super.finalize(); - // cleanup your object here - } - - public void onConfigurationChanged(Configuration newConfig) - { - super.onConfigurationChanged(newConfig); - } - - public void keyboardUpdate(boolean show) - { - final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - if(show) { - //EWOL.touchEvent(); - imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); - } else { - imm.toggleSoftInput(0 ,InputMethodManager.HIDE_IMPLICIT_ONLY + InputMethodManager.HIDE_NOT_ALWAYS); - //imm.hideSoftInputFromWindow(view.getWindowToken(),0); + @Override protected void onStart() + { + super.onStart(); + // call C + EWOL.onStart(); } - } - public void eventNotifier(String[] args) - { - // just for the test ... - EWOL.touchEvent(); - } - - public void orientationUpdate(int screenMode) - { - if (screenMode == EWOL_ORIENTATION_LANDSCAPE) { - //Force landscape - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); - } else if (screenMode == EWOL_ORIENTATION_PORTRAIT) { - //Force portrait - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - } else { - //Force auto Rotation - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); + @Override protected void onRestart() + { + super.onRestart(); + // call C + EWOL.onReStart(); + } + + @Override protected void onResume() + { + super.onResume(); + mGLView.onResume(); + mAudioThread = new Thread(mStreams); + if (mAudioThread != null) { + mAudioThread.start(); + } + // call C + EWOL.onResume(); + } + + @Override protected void onPause() + { + super.onPause(); + mGLView.onPause(); + if (mAudioThread != null) { + // request audio stop + mStreams.AutoStop(); + // wait the thread ended ... + try { + mAudioThread.join(); + } catch(InterruptedException e) { } + } + // call C + EWOL.onPause(); + } + + @Override protected void onStop() + { + super.onStop(); + // call C + EWOL.onStop(); + } + @Override protected void onDestroy() + { + super.onDestroy(); + // call C + EWOL.onDestroy(); + // Remove the java Virtual machine pointer form the C code + Ewol.setJavaVirtualMachineStop(); + } + + @Override protected void finalize() throws Throwable + { + super.finalize(); + // cleanup your object here + } + + public void onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + } + + public void keyboardUpdate(boolean show) + { + final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if(show) { + //EWOL.touchEvent(); + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); + } else { + imm.toggleSoftInput(0 ,InputMethodManager.HIDE_IMPLICIT_ONLY + InputMethodManager.HIDE_NOT_ALWAYS); + //imm.hideSoftInputFromWindow(view.getWindowToken(),0); + } + } + + public void eventNotifier(String[] args) + { + // just for the test ... + EWOL.touchEvent(); + } + + public void orientationUpdate(int screenMode) + { + if (screenMode == EWOL_ORIENTATION_LANDSCAPE) { + //Force landscape + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } else if (screenMode == EWOL_ORIENTATION_PORTRAIT) { + //Force portrait + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } else { + //Force auto Rotation + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); + } } - } } diff --git a/sources/android/src/org/ewol/EwolRendererGL.java b/sources/android/src/org/ewol/EwolRendererGL.java index a4ab9a11..8d7f994c 100644 --- a/sources/android/src/org/ewol/EwolRendererGL.java +++ b/sources/android/src/org/ewol/EwolRendererGL.java @@ -23,18 +23,17 @@ import static org.ewol.Ewol.EWOL; * @brief Class : * */ -public class EwolRendererGL implements GLSurfaceView.Renderer { +public class EwolRendererGL implements GLSurfaceView.Renderer +{ + public void onSurfaceCreated(GL10 gl, EGLConfig config) { + EWOL.renderInit(); + } - public void onSurfaceCreated(GL10 gl, EGLConfig config) { - - EWOL.renderInit(); - } + public void onSurfaceChanged(GL10 gl, int w, int h) { + EWOL.renderResize(w, h); + } - public void onSurfaceChanged(GL10 gl, int w, int h) { - EWOL.renderResize(w, h); - } - - public void onDrawFrame(GL10 gl) { - EWOL.renderDraw(); - } + public void onDrawFrame(GL10 gl) { + EWOL.renderDraw(); + } } diff --git a/sources/android/src/org/ewol/EwolWallpaper.java b/sources/android/src/org/ewol/EwolWallpaper.java new file mode 100644 index 00000000..d5358a3e --- /dev/null +++ b/sources/android/src/org/ewol/EwolWallpaper.java @@ -0,0 +1,231 @@ +/** + * @author Edouard DUPIN, Kevin BILLONNEAU + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license BSD v3 (see license file) + */ + + +package org.ewol; + +import android.service.wallpaper.WallpaperService; +//import android.app.Activity; +import android.content.Context; +import android.opengl.GLSurfaceView; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.KeyEvent; +// For No Title : +import android.view.Window; + +// For the full screen : +import android.view.WindowManager; +// for the keyboard event : +import android.view.inputmethod.InputMethodManager; + +import java.io.File; +import android.content.Context; +import android.content.res.Configuration; + +// For the getting apk name : +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.AssetFileDescriptor; +import android.content.res.AssetManager; +import android.util.DisplayMetrics; +import android.view.SurfaceHolder; + + +import java.io.IOException; + +import static org.ewol.Ewol.EWOL; + +/** + * @brief Class : + * + */ +public abstract class EwolWallpaper extends WallpaperService +{ + private TestPatternEngine tmpEngine; + + static { + System.loadLibrary("ewol"); + } + + @Override public void onCreate() + { + super.onCreate(); + } + + @Override public void onDestroy() + { + super.onDestroy(); + } + + @Override public Engine onCreateEngine() + { + tmpEngine = new TestPatternEngine(); + return tmpEngine; + } + + protected void initApkPath(String org, String vendor, String project) + { + tmpEngine.initApkPath(org, vendor, project); + } + + class TestPatternEngine extends Engine implements EwolCallback, EwolConstants // implements SharedPreferences.OnSharedPreferenceChangeListener + { + private EwolSurfaceViewGL mGLView; + + + public void initApkPath(String org, String vendor, String project) { + StringBuilder sb = new StringBuilder(); + sb.append(org).append("."); + sb.append(vendor).append("."); + sb.append(project); + String apkFilePath = null; + ApplicationInfo appInfo = null; + PackageManager packMgmr = getPackageManager(); + try { + appInfo = packMgmr.getApplicationInfo(sb.toString(), 0); + } catch (NameNotFoundException e) { + e.printStackTrace(); + throw new RuntimeException("Unable to locate assets, aborting..."); + } + apkFilePath = appInfo.sourceDir; + Ewol.paramSetArchiveDir(0, apkFilePath); + } + + @Override public void onCreate(SurfaceHolder surfaceHolder) + { + super.onCreate(surfaceHolder); + + // set the java evironement in the C sources : + Ewol.setJavaVirtualMachineStartWallpaperEngine(this); + + // Load the application directory + Ewol.paramSetArchiveDir(1, getFilesDir().toString()); + Ewol.paramSetArchiveDir(2, getCacheDir().toString()); + // to enable extarnal storage: add in the manifest the restriction needed ... + //packageManager.checkPermission("android.permission.READ_SMS", myPackage) == PERMISSION_GRANTED; + //Ewol.paramSetArchiveDir(3, getExternalCacheDir().toString()); + + DisplayMetrics metrics = new DisplayMetrics(); + //!getWindowManager().getDefaultDisplay().getMetrics(metrics); + //!EWOL.displayPropertyMetrics(metrics.xdpi, metrics.ydpi); + + // call C init ... + EWOL.onCreate(); + + // Remove the title of the current display : + //!requestWindowFeature(Window.FEATURE_NO_TITLE); + // set full screen Mode : + //!getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + // display keyboard: + //getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + // hide keyboard : + //!getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); + + // create bsurface system + mGLView = new EwolSurfaceViewGL(this, 2); + + setContentView(mGLView); + } + + @Override public void onStart() + { + super.onStart(); + // call C + EWOL.onStart(); + } + + @Override public void onRestart() + { + super.onRestart(); + // call C + EWOL.onReStart(); + } + + @Override public void onResume() + { + super.onResume(); + mGLView.onResume(); + // call C + EWOL.onResume(); + } + + @Override public void onPause() + { + super.onPause(); + mGLView.onPause(); + // call C + EWOL.onPause(); + } + + @Override public void onStop() + { + super.onStop(); + // call C + EWOL.onStop(); + } + @Override public void onDestroy() + { + super.onDestroy(); + // call C + EWOL.onDestroy(); + // Remove the java Virtual machine pointer form the C code + Ewol.setJavaVirtualMachineStop(); + } + + @Override protected void finalize() throws Throwable + { + super.finalize(); + // cleanup your object here + } + + public void onConfigurationChanged(Configuration newConfig) + { + super.onConfigurationChanged(newConfig); + } + + public void keyboardUpdate(boolean show) + { + final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); + if(show) { + //EWOL.touchEvent(); + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); + } else { + imm.toggleSoftInput(0 ,InputMethodManager.HIDE_IMPLICIT_ONLY + InputMethodManager.HIDE_NOT_ALWAYS); + //imm.hideSoftInputFromWindow(view.getWindowToken(),0); + } + } + + public void eventNotifier(String[] args) + { + // just for the test ... + EWOL.touchEvent(); + } + + public void orientationUpdate(int screenMode) + { + /* + if (screenMode == EWOL_ORIENTATION_LANDSCAPE) { + //Force landscape + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + } else if (screenMode == EWOL_ORIENTATION_PORTRAIT) { + //Force portrait + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } else { + //Force auto Rotation + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); + } + */ + } + } +} + + + diff --git a/sources/android/src/org/ewol/EwolWallpaperService.java b/sources/android/src/org/ewol/EwolWallpaperService.java new file mode 100644 index 00000000..b7fb90e8 --- /dev/null +++ b/sources/android/src/org/ewol/EwolWallpaperService.java @@ -0,0 +1,123 @@ + + +package org.ewol; + +import android.content.Context; +import android.opengl.GLSurfaceView; +import android.opengl.GLSurfaceView.Renderer; +import android.os.Build; +import android.service.wallpaper.WallpaperService; +import android.util.Log; +import android.view.SurfaceHolder; + +//import com.learnopengles.android.util.LoggerConfig; + +public abstract class EwolWallpaperService extends WallpaperService +{ + private EwolSurfaceViewGL mGLView; + /* + // moi ... + @Override + public abstract Engine onCreateEngine(Context context) { + return new GLEngine(Context context); + } + */ + /* + static { + System.loadLibrary("ewol"); + } + + protected void initApkPath(String org, String vendor, String project) { + StringBuilder sb = new StringBuilder(); + sb.append(org).append("."); + sb.append(vendor).append("."); + sb.append(project); + String apkFilePath = null; + ApplicationInfo appInfo = null; + PackageManager packMgmr = getPackageManager(); + try { + appInfo = packMgmr.getApplicationInfo(sb.toString(), 0); + } catch (NameNotFoundException e) { + e.printStackTrace(); + throw new RuntimeException("Unable to locate assets, aborting..."); + } + apkFilePath = appInfo.sourceDir; + Ewol.paramSetArchiveDir(0, apkFilePath); + } + */ + + public class GLEngine extends Engine + { + class WallpaperGLSurfaceView extends GLSurfaceView + { + private static final String TAG = "WallpaperGLSurfaceView"; + WallpaperGLSurfaceView(Context context) + { + super(context); + Log.d(TAG, "WallpaperGLSurfaceView(" + context + ")"); + } + @Override + public SurfaceHolder getHolder() + { + Log.d(TAG, "getHolder(): returning " + getSurfaceHolder()); + return getSurfaceHolder(); + } + public void onDestroy() + { + Log.d(TAG, "onDestroy()"); + super.onDetachedFromWindow(); + } + } + + private static final String TAG = "GLEngine"; + private WallpaperGLSurfaceView glSurfaceView; + private boolean rendererHasBeenSet; + + @Override + public void onCreate(SurfaceHolder surfaceHolder) + { + Log.d(TAG, "onCreate(" + surfaceHolder + ")"); + super.onCreate(surfaceHolder); + glSurfaceView = new WallpaperGLSurfaceView(EwolWallpaperService.this); + } + @Override + public void onVisibilityChanged(boolean visible) + { + Log.d(TAG, "onVisibilityChanged(" + visible + ")"); + super.onVisibilityChanged(visible); + if (rendererHasBeenSet) { + if (visible) { + glSurfaceView.onResume(); + } else { + glSurfaceView.onPause(); + } + } + } + @Override + public void onDestroy() + { + Log.d(TAG, "onDestroy()"); + super.onDestroy(); + glSurfaceView.onDestroy(); + } + protected void setRenderer(Renderer renderer) + { + Log.d(TAG, "setRenderer(" + renderer + ")"); + glSurfaceView.setRenderer(renderer); + rendererHasBeenSet = true; + } + protected void setPreserveEGLContextOnPause(boolean preserve) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + Log.d(TAG, "setPreserveEGLContextOnPause(" + preserve + ")"); + glSurfaceView.setPreserveEGLContextOnPause(preserve); + } + } + protected void setEGLContextClientVersion(int version) + { + Log.d(TAG, "setEGLContextClientVersion(" + version + ")"); + glSurfaceView.setEGLContextClientVersion(version); + } + } +} + diff --git a/sources/android/src/org/ewol/LessonThreeRenderer.java b/sources/android/src/org/ewol/LessonThreeRenderer.java new file mode 100644 index 00000000..01f671c5 --- /dev/null +++ b/sources/android/src/org/ewol/LessonThreeRenderer.java @@ -0,0 +1,73 @@ +package org.ewol; + +import org.ewol.LessonTwoRenderer; + +/** + * This class implements our custom renderer. Note that the GL10 parameter passed in is unused for OpenGL ES 2.0 + * renderers -- the static class GLES20 is used instead. + */ +public class LessonThreeRenderer extends LessonTwoRenderer +{ + protected String getVertexShader() + { + // Define our per-pixel lighting shader. + final String perPixelVertexShader = + "uniform mat4 u_MVPMatrix; \n" // A constant representing the combined model/view/projection matrix. + + "uniform mat4 u_MVMatrix; \n" // A constant representing the combined model/view matrix. + + + "attribute vec4 a_Position; \n" // Per-vertex position information we will pass in. + + "attribute vec4 a_Color; \n" // Per-vertex color information we will pass in. + + "attribute vec3 a_Normal; \n" // Per-vertex normal information we will pass in. + + + "varying vec3 v_Position; \n" // This will be passed into the fragment shader. + + "varying vec4 v_Color; \n" // This will be passed into the fragment shader. + + "varying vec3 v_Normal; \n" // This will be passed into the fragment shader. + + // The entry point for our vertex shader. + + "void main() \n" + + "{ \n" + // Transform the vertex into eye space. + + " v_Position = vec3(u_MVMatrix * a_Position); \n" + // Pass through the color. + + " v_Color = a_Color; \n" + // Transform the normal's orientation into eye space. + + " v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0)); \n" + // gl_Position is a special variable used to store the final position. + // Multiply the vertex by the matrix to get the final point in normalized screen coordinates. + + " gl_Position = u_MVPMatrix * a_Position; \n" + + "} \n"; + + return perPixelVertexShader; + } + + protected String getFragmentShader() + { + final String perPixelFragmentShader = + "precision mediump float; \n" // Set the default precision to medium. We don't need as high of a + // precision in the fragment shader. + + "uniform vec3 u_LightPos; \n" // The position of the light in eye space. + + + "varying vec3 v_Position; \n" // Interpolated position for this fragment. + + "varying vec4 v_Color; \n" // This is the color from the vertex shader interpolated across the + // triangle per fragment. + + "varying vec3 v_Normal; \n" // Interpolated normal for this fragment. + + // The entry point for our fragment shader. + + "void main() \n" + + "{ \n" + // Will be used for attenuation. + + " float distance = length(u_LightPos - v_Position); \n" + // Get a lighting direction vector from the light to the vertex. + + " vec3 lightVector = normalize(u_LightPos - v_Position); \n" + // Calculate the dot product of the light vector and vertex normal. If the normal and light vector are + // pointing in the same direction then it will get max illumination. + + " float diffuse = max(dot(v_Normal, lightVector), 0.1); \n" + // Add attenuation. + + " diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance))); \n" + // Multiply the color by the diffuse illumination level to get final output color. + + " gl_FragColor = v_Color * diffuse; \n" + + "} \n"; + + return perPixelFragmentShader; + } +} diff --git a/sources/android/src/org/ewol/LessonThreeWallpaperService.java b/sources/android/src/org/ewol/LessonThreeWallpaperService.java new file mode 100644 index 00000000..ac1ca5d7 --- /dev/null +++ b/sources/android/src/org/ewol/LessonThreeWallpaperService.java @@ -0,0 +1,12 @@ +package com.learnopengles.android.livewallpaper; + +import android.opengl.GLSurfaceView.Renderer; + +import com.learnopengles.android.lesson3.LessonThreeRenderer; + +public class LessonThreeWallpaperService extends OpenGLES2WallpaperService { + @Override + Renderer getNewRenderer() { + return new LessonThreeRenderer(); + } +} \ No newline at end of file diff --git a/sources/android/src/org/ewol/LessonTwoRenderer.java b/sources/android/src/org/ewol/LessonTwoRenderer.java new file mode 100644 index 00000000..53a351a6 --- /dev/null +++ b/sources/android/src/org/ewol/LessonTwoRenderer.java @@ -0,0 +1,642 @@ +package org.ewol; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.FloatBuffer; + +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.opengles.GL10; + +import android.opengl.GLES20; +import android.opengl.GLSurfaceView; +import android.opengl.Matrix; +import android.os.SystemClock; +import android.util.Log; + +/** + * This class implements our custom renderer. Note that the GL10 parameter passed in is unused for OpenGL ES 2.0 + * renderers -- the static class GLES20 is used instead. + */ +public class LessonTwoRenderer implements GLSurfaceView.Renderer +{ + /** Used for debug logs. */ + private static final String TAG = "LessonTwoRenderer"; + + /** + * Store the model matrix. This matrix is used to move models from object space (where each model can be thought + * of being located at the center of the universe) to world space. + */ + private float[] mModelMatrix = new float[16]; + + /** + * Store the view matrix. This can be thought of as our camera. This matrix transforms world space to eye space; + * it positions things relative to our eye. + */ + private float[] mViewMatrix = new float[16]; + + /** Store the projection matrix. This is used to project the scene onto a 2D viewport. */ + private float[] mProjectionMatrix = new float[16]; + + /** Allocate storage for the final combined matrix. This will be passed into the shader program. */ + private float[] mMVPMatrix = new float[16]; + + /** + * Stores a copy of the model matrix specifically for the light position. + */ + private float[] mLightModelMatrix = new float[16]; + + /** Store our model data in a float buffer. */ + private final FloatBuffer mCubePositions; + private final FloatBuffer mCubeColors; + private final FloatBuffer mCubeNormals; + + /** This will be used to pass in the transformation matrix. */ + private int mMVPMatrixHandle; + + /** This will be used to pass in the modelview matrix. */ + private int mMVMatrixHandle; + + /** This will be used to pass in the light position. */ + private int mLightPosHandle; + + /** This will be used to pass in model position information. */ + private int mPositionHandle; + + /** This will be used to pass in model color information. */ + private int mColorHandle; + + /** This will be used to pass in model normal information. */ + private int mNormalHandle; + + /** How many bytes per float. */ + private final int mBytesPerFloat = 4; + + /** Size of the position data in elements. */ + private final int mPositionDataSize = 3; + + /** Size of the color data in elements. */ + private final int mColorDataSize = 4; + + /** Size of the normal data in elements. */ + private final int mNormalDataSize = 3; + + /** Used to hold a light centered on the origin in model space. We need a 4th coordinate so we can get translations to work when + * we multiply this by our transformation matrices. */ + private final float[] mLightPosInModelSpace = new float[] {0.0f, 0.0f, 0.0f, 1.0f}; + + /** Used to hold the current position of the light in world space (after transformation via model matrix). */ + private final float[] mLightPosInWorldSpace = new float[4]; + + /** Used to hold the transformed position of the light in eye space (after transformation via modelview matrix) */ + private final float[] mLightPosInEyeSpace = new float[4]; + + /** This is a handle to our per-vertex cube shading program. */ + private int mPerVertexProgramHandle; + + /** This is a handle to our light point program. */ + private int mPointProgramHandle; + + /** + * Initialize the model data. + */ + public LessonTwoRenderer() + { + // Define points for a cube. + + // X, Y, Z + final float[] cubePositionData = + { + // In OpenGL counter-clockwise winding is default. This means that when we look at a triangle, + // if the points are counter-clockwise we are looking at the "front". If not we are looking at + // the back. OpenGL has an optimization where all back-facing triangles are culled, since they + // usually represent the backside of an object and aren't visible anyways. + + // Front face + -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + + // Right face + 1.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, + 1.0f, 1.0f, -1.0f, + 1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + + // Back face + 1.0f, 1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + + // Left face + -1.0f, 1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + + // Top face + -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, -1.0f, + + // Bottom face + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, + }; + + // R, G, B, A + final float[] cubeColorData = + { + // Front face (red) + 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + 1.0f, 0.0f, 0.0f, 1.0f, + + // Right face (green) + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + 0.0f, 1.0f, 0.0f, 1.0f, + + // Back face (blue) + 0.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 1.0f, 1.0f, + + // Left face (yellow) + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + 1.0f, 1.0f, 0.0f, 1.0f, + + // Top face (cyan) + 0.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + 0.0f, 1.0f, 1.0f, 1.0f, + + // Bottom face (magenta) + 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f, + 1.0f, 0.0f, 1.0f, 1.0f + }; + + // X, Y, Z + // The normal is used in light calculations and is a vector which points + // orthogonal to the plane of the surface. For a cube model, the normals + // should be orthogonal to the points of each face. + final float[] cubeNormalData = + { + // Front face + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + 0.0f, 0.0f, 1.0f, + + // Right face + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + 1.0f, 0.0f, 0.0f, + + // Back face + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, + 0.0f, 0.0f, -1.0f, + + // Left face + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, + -1.0f, 0.0f, 0.0f, + + // Top face + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + 0.0f, 1.0f, 0.0f, + + // Bottom face + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f, + 0.0f, -1.0f, 0.0f + }; + + // Initialize the buffers. + mCubePositions = ByteBuffer.allocateDirect(cubePositionData.length * mBytesPerFloat) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mCubePositions.put(cubePositionData).position(0); + + mCubeColors = ByteBuffer.allocateDirect(cubeColorData.length * mBytesPerFloat) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mCubeColors.put(cubeColorData).position(0); + + mCubeNormals = ByteBuffer.allocateDirect(cubeNormalData.length * mBytesPerFloat) + .order(ByteOrder.nativeOrder()).asFloatBuffer(); + mCubeNormals.put(cubeNormalData).position(0); + } + + protected String getVertexShader() + { + // TODO: Explain why we normalize the vectors, explain some of the vector math behind it all. Explain what is eye space. + final String vertexShader = + "uniform mat4 u_MVPMatrix; \n" // A constant representing the combined model/view/projection matrix. + + "uniform mat4 u_MVMatrix; \n" // A constant representing the combined model/view matrix. + + "uniform vec3 u_LightPos; \n" // The position of the light in eye space. + + + "attribute vec4 a_Position; \n" // Per-vertex position information we will pass in. + + "attribute vec4 a_Color; \n" // Per-vertex color information we will pass in. + + "attribute vec3 a_Normal; \n" // Per-vertex normal information we will pass in. + + + "varying vec4 v_Color; \n" // This will be passed into the fragment shader. + + + "void main() \n" // The entry point for our vertex shader. + + "{ \n" + // Transform the vertex into eye space. + + " vec3 modelViewVertex = vec3(u_MVMatrix * a_Position); \n" + // Transform the normal's orientation into eye space. + + " vec3 modelViewNormal = vec3(u_MVMatrix * vec4(a_Normal, 0.0)); \n" + // Will be used for attenuation. + + " float distance = length(u_LightPos - modelViewVertex); \n" + // Get a lighting direction vector from the light to the vertex. + + " vec3 lightVector = normalize(u_LightPos - modelViewVertex); \n" + // Calculate the dot product of the light vector and vertex normal. If the normal and light vector are + // pointing in the same direction then it will get max illumination. + + " float diffuse = max(dot(modelViewNormal, lightVector), 0.1); \n" + // Attenuate the light based on distance. + + " diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance))); \n" + // Multiply the color by the illumination level. It will be interpolated across the triangle. + + " v_Color = a_Color * diffuse; \n" + // gl_Position is a special variable used to store the final position. + // Multiply the vertex by the matrix to get the final point in normalized screen coordinates. + + " gl_Position = u_MVPMatrix * a_Position; \n" + + "} \n"; + + return vertexShader; + } + + protected String getFragmentShader() + { + final String fragmentShader = + "precision mediump float; \n" // Set the default precision to medium. We don't need as high of a + // precision in the fragment shader. + + "varying vec4 v_Color; \n" // This is the color from the vertex shader interpolated across the + // triangle per fragment. + + "void main() \n" // The entry point for our fragment shader. + + "{ \n" + + " gl_FragColor = v_Color; \n" // Pass the color directly through the pipeline. + + "} \n"; + + return fragmentShader; + } + + public void onSurfaceCreated(GL10 glUnused, EGLConfig config) + { + // Set the background clear color to black. + GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + // Use culling to remove back faces. + GLES20.glEnable(GLES20.GL_CULL_FACE); + + // Enable depth testing + GLES20.glEnable(GLES20.GL_DEPTH_TEST); + + // Position the eye in front of the origin. + final float eyeX = 0.0f; + final float eyeY = 0.0f; + final float eyeZ = -0.5f; + + // We are looking toward the distance + final float lookX = 0.0f; + final float lookY = 0.0f; + final float lookZ = -5.0f; + + // Set our up vector. This is where our head would be pointing were we holding the camera. + final float upX = 0.0f; + final float upY = 1.0f; + final float upZ = 0.0f; + + // Set the view matrix. This matrix can be said to represent the camera position. + // NOTE: In OpenGL 1, a ModelView matrix is used, which is a combination of a model and + // view matrix. In OpenGL 2, we can keep track of these matrices separately if we choose. + Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ); + + final String vertexShader = getVertexShader(); + final String fragmentShader = getFragmentShader(); + + final int vertexShaderHandle = compileShader(GLES20.GL_VERTEX_SHADER, vertexShader); + final int fragmentShaderHandle = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentShader); + + mPerVertexProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, + new String[] {"a_Position", "a_Color", "a_Normal"}); + + // Define a simple shader program for our point. + final String pointVertexShader = + "uniform mat4 u_MVPMatrix; \n" + + "attribute vec4 a_Position; \n" + + "void main() \n" + + "{ \n" + + " gl_Position = u_MVPMatrix \n" + + " * a_Position; \n" + + " gl_PointSize = 5.0; \n" + + "} \n"; + + final String pointFragmentShader = + "precision mediump float; \n" + + "void main() \n" + + "{ \n" + + " gl_FragColor = vec4(1.0, \n" + + " 1.0, 1.0, 1.0); \n" + + "} \n"; + + final int pointVertexShaderHandle = compileShader(GLES20.GL_VERTEX_SHADER, pointVertexShader); + final int pointFragmentShaderHandle = compileShader(GLES20.GL_FRAGMENT_SHADER, pointFragmentShader); + mPointProgramHandle = createAndLinkProgram(pointVertexShaderHandle, pointFragmentShaderHandle, + new String[] {"a_Position"}); + } + + public void onSurfaceChanged(GL10 glUnused, int width, int height) + { + // Set the OpenGL viewport to the same size as the surface. + GLES20.glViewport(0, 0, width, height); + + // Create a new perspective projection matrix. The height will stay the same + // while the width will vary as per aspect ratio. + final float ratio = (float) width / height; + final float left = -ratio; + final float right = ratio; + final float bottom = -1.0f; + final float top = 1.0f; + final float near = 1.0f; + final float far = 10.0f; + + Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far); + } + + public void onDrawFrame(GL10 glUnused) + { + GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); + + // Do a complete rotation every 10 seconds. + long time = SystemClock.uptimeMillis() % 10000L; + float angleInDegrees = (360.0f / 10000.0f) * ((int) time); + + // Set our per-vertex lighting program. + GLES20.glUseProgram(mPerVertexProgramHandle); + + // Set program handles for cube drawing. + mMVPMatrixHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle, "u_MVPMatrix"); + mMVMatrixHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle, "u_MVMatrix"); + mLightPosHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle, "u_LightPos"); + mPositionHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle, "a_Position"); + mColorHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle, "a_Color"); + mNormalHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle, "a_Normal"); + + // Calculate position of the light. Rotate and then push into the distance. + Matrix.setIdentityM(mLightModelMatrix, 0); + Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, -5.0f); + Matrix.rotateM(mLightModelMatrix, 0, angleInDegrees, 0.0f, 1.0f, 0.0f); + Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 2.0f); + + Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0, mLightPosInModelSpace, 0); + Matrix.multiplyMV(mLightPosInEyeSpace, 0, mViewMatrix, 0, mLightPosInWorldSpace, 0); + + // Draw some cubes. + Matrix.setIdentityM(mModelMatrix, 0); + Matrix.translateM(mModelMatrix, 0, 4.0f, 0.0f, -7.0f); + Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 1.0f, 0.0f, 0.0f); + drawCube(); + + Matrix.setIdentityM(mModelMatrix, 0); + Matrix.translateM(mModelMatrix, 0, -4.0f, 0.0f, -7.0f); + Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 1.0f, 0.0f); + drawCube(); + + Matrix.setIdentityM(mModelMatrix, 0); + Matrix.translateM(mModelMatrix, 0, 0.0f, 4.0f, -7.0f); + Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 0.0f, 1.0f); + drawCube(); + + Matrix.setIdentityM(mModelMatrix, 0); + Matrix.translateM(mModelMatrix, 0, 0.0f, -4.0f, -7.0f); + drawCube(); + + Matrix.setIdentityM(mModelMatrix, 0); + Matrix.translateM(mModelMatrix, 0, 0.0f, 0.0f, -5.0f); + Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 1.0f, 1.0f, 0.0f); + drawCube(); + + // Draw a point to indicate the light. + GLES20.glUseProgram(mPointProgramHandle); + drawLight(); + } + + /** + * Draws a cube. + */ + private void drawCube() + { + // Pass in the position information + mCubePositions.position(0); + GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false, + 0, mCubePositions); + + GLES20.glEnableVertexAttribArray(mPositionHandle); + + // Pass in the color information + mCubeColors.position(0); + GLES20.glVertexAttribPointer(mColorHandle, mColorDataSize, GLES20.GL_FLOAT, false, + 0, mCubeColors); + + GLES20.glEnableVertexAttribArray(mColorHandle); + + // Pass in the normal information + mCubeNormals.position(0); + GLES20.glVertexAttribPointer(mNormalHandle, mNormalDataSize, GLES20.GL_FLOAT, false, + 0, mCubeNormals); + + GLES20.glEnableVertexAttribArray(mNormalHandle); + + // This multiplies the view matrix by the model matrix, and stores the result in the MVP matrix + // (which currently contains model * view). + Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0); + + // Pass in the modelview matrix. + GLES20.glUniformMatrix4fv(mMVMatrixHandle, 1, false, mMVPMatrix, 0); + + // This multiplies the modelview matrix by the projection matrix, and stores the result in the MVP matrix + // (which now contains model * view * projection). + Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0); + + // Pass in the combined matrix. + GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0); + + // Pass in the light position in eye space. + GLES20.glUniform3f(mLightPosHandle, mLightPosInEyeSpace[0], mLightPosInEyeSpace[1], mLightPosInEyeSpace[2]); + + // Draw the cube. + GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 36); + } + + /** + * Draws a point representing the position of the light. + */ + private void drawLight() + { + final int pointMVPMatrixHandle = GLES20.glGetUniformLocation(mPointProgramHandle, "u_MVPMatrix"); + final int pointPositionHandle = GLES20.glGetAttribLocation(mPointProgramHandle, "a_Position"); + + // Pass in the position. + GLES20.glVertexAttrib3f(pointPositionHandle, mLightPosInModelSpace[0], mLightPosInModelSpace[1], mLightPosInModelSpace[2]); + + // Since we are not using a buffer object, disable vertex arrays for this attribute. + GLES20.glDisableVertexAttribArray(pointPositionHandle); + + // Pass in the transformation matrix. + Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mLightModelMatrix, 0); + Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0); + GLES20.glUniformMatrix4fv(pointMVPMatrixHandle, 1, false, mMVPMatrix, 0); + + // Draw the point. + GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 1); + } + + /** + * Helper function to compile a shader. + * + * @param shaderType The shader type. + * @param shaderSource The shader source code. + * @return An OpenGL handle to the shader. + */ + private int compileShader(final int shaderType, final String shaderSource) + { + int shaderHandle = GLES20.glCreateShader(shaderType); + + if (shaderHandle != 0) + { + // Pass in the shader source. + GLES20.glShaderSource(shaderHandle, shaderSource); + + // Compile the shader. + GLES20.glCompileShader(shaderHandle); + + // Get the compilation status. + final int[] compileStatus = new int[1]; + GLES20.glGetShaderiv(shaderHandle, GLES20.GL_COMPILE_STATUS, compileStatus, 0); + + // If the compilation failed, delete the shader. + if (compileStatus[0] == 0) + { + Log.e(TAG, "Error compiling shader: " + GLES20.glGetShaderInfoLog(shaderHandle)); + GLES20.glDeleteShader(shaderHandle); + shaderHandle = 0; + } + } + + if (shaderHandle == 0) + { + throw new RuntimeException("Error creating shader."); + } + + return shaderHandle; + } + + /** + * Helper function to compile and link a program. + * + * @param vertexShaderHandle An OpenGL handle to an already-compiled vertex shader. + * @param fragmentShaderHandle An OpenGL handle to an already-compiled fragment shader. + * @param attributes Attributes that need to be bound to the program. + * @return An OpenGL handle to the program. + */ + private int createAndLinkProgram(final int vertexShaderHandle, final int fragmentShaderHandle, final String[] attributes) + { + int programHandle = GLES20.glCreateProgram(); + + if (programHandle != 0) + { + // Bind the vertex shader to the program. + GLES20.glAttachShader(programHandle, vertexShaderHandle); + + // Bind the fragment shader to the program. + GLES20.glAttachShader(programHandle, fragmentShaderHandle); + + // Bind attributes + if (attributes != null) + { + final int size = attributes.length; + for (int i = 0; i < size; i++) + { + GLES20.glBindAttribLocation(programHandle, i, attributes[i]); + } + } + + // Link the two shaders together into a program. + GLES20.glLinkProgram(programHandle); + + // Get the link status. + final int[] linkStatus = new int[1]; + GLES20.glGetProgramiv(programHandle, GLES20.GL_LINK_STATUS, linkStatus, 0); + + // If the link failed, delete the program. + if (linkStatus[0] == 0) + { + Log.e(TAG, "Error compiling program: " + GLES20.glGetProgramInfoLog(programHandle)); + GLES20.glDeleteProgram(programHandle); + programHandle = 0; + } + } + + if (programHandle == 0) + { + throw new RuntimeException("Error creating program."); + } + + return programHandle; + } +} diff --git a/sources/ewol/renderer/os/gui.Android.cpp b/sources/ewol/renderer/os/gui.Android.cpp index db92a2fc..f5b7a56d 100644 --- a/sources/ewol/renderer/os/gui.Android.cpp +++ b/sources/ewol/renderer/os/gui.Android.cpp @@ -20,17 +20,17 @@ #include // get a resources from the java environement : -static JNIEnv* JavaVirtualMachinePointer = NULL; // the JVM -static jclass javaClassEwol = 0; // main activity class (android ...) -static jclass javaClassEwolCallbackAndActivity = 0; -static jobject javaObjectEwolCallbackAndActivity = 0; +static JNIEnv* JavaVirtualMachinePointer = NULL; // the JVM +static jclass javaClassEwol = 0; // main activity class (android ...) +static jclass javaClassEwolCallbackAndActivity = 0; +static jobject javaObjectEwolCallbackAndActivity = 0; -static jmethodID javaMethodEwolCallbackEventNotifier = 0; // basic methode to call ... -static jmethodID javaMethodEwolCallbackKeyboardUpdate = 0; // basic methode to call ... +static jmethodID javaMethodEwolCallbackEventNotifier = 0; // basic methode to call ... +static jmethodID javaMethodEwolCallbackKeyboardUpdate = 0; // basic methode to call ... static jmethodID javaMethodEwolCallbackOrientationUpdate = 0; static jmethodID javaMethodEwolActivitySetTitle = 0; // generic classes -static jclass javaDefaultClassString = 0; // default string class +static jclass javaDefaultClassString = 0; // default string class static int32_t m_currentHeight = 0; @@ -43,408 +43,424 @@ static ewol::SpecialKey guiKeyBoardSpecialKeyMode; // jni doc : /usr/lib/jvm/java-1.6.0-openjdk/include -#define __jni_safe_init_method_id(mid, cls, name, sign) ({ \ - mid = JavaVirtualMachinePointer->GetMethodID(cls, name, sign); \ - if(mid == NULL) { \ - EWOL_ERROR("C->java : Can't find the method " << name); \ - /* remove access on the virtual machine : */ \ - JavaVirtualMachinePointer = NULL; \ - return; \ - } \ - }) +#define __jni_safe_init_method_id(mid, cls, name, sign) ({ \ + mid = JavaVirtualMachinePointer->GetMethodID(cls, name, sign); \ + if(mid == NULL) { \ + EWOL_ERROR("C->java : Can't find the method " << name); \ + /* remove access on the virtual machine : */ \ + JavaVirtualMachinePointer = NULL; \ + return; \ + } \ + }) static void java_check_exception(JNIEnv* env) { - if (env->ExceptionOccurred()) { - EWOL_ERROR("C->java : EXEPTION ..."); - env->ExceptionDescribe(); - env->ExceptionClear(); - } + if (env->ExceptionOccurred()) { + EWOL_ERROR("C->java : EXEPTION ..."); + env->ExceptionDescribe(); + env->ExceptionClear(); + } } static bool java_attach_current_thread(int *rstatus) { - EWOL_DEBUG("C->java : call java"); - if (NULL == g_JavaVM) { - EWOL_ERROR("C->java : JVM not initialised"); - return false; - } - JNIEnv *JavaVirtualMachinePointer_tmp; - *rstatus = g_JavaVM->GetEnv((void **) &JavaVirtualMachinePointer_tmp, JNI_VERSION_1_6); - if (*rstatus == JNI_EDETACHED) { - JavaVMAttachArgs lJavaVMAttachArgs; - lJavaVMAttachArgs.version = JNI_VERSION_1_6; - lJavaVMAttachArgs.name = "EwolNativeThread"; - lJavaVMAttachArgs.group = NULL; - int status = g_JavaVM->AttachCurrentThread(&JavaVirtualMachinePointer_tmp, &lJavaVMAttachArgs); - java_check_exception(JavaVirtualMachinePointer); - if (status != JNI_OK) { - EWOL_ERROR("C->java : AttachCurrentThread failed : " << status); - return false; - } - } - return true; + EWOL_DEBUG("C->java : call java"); + if (NULL == g_JavaVM) { + EWOL_ERROR("C->java : JVM not initialised"); + return false; + } + JNIEnv *JavaVirtualMachinePointer_tmp; + *rstatus = g_JavaVM->GetEnv((void **) &JavaVirtualMachinePointer_tmp, JNI_VERSION_1_6); + if (*rstatus == JNI_EDETACHED) { + JavaVMAttachArgs lJavaVMAttachArgs; + lJavaVMAttachArgs.version = JNI_VERSION_1_6; + lJavaVMAttachArgs.name = "EwolNativeThread"; + lJavaVMAttachArgs.group = NULL; + int status = g_JavaVM->AttachCurrentThread(&JavaVirtualMachinePointer_tmp, &lJavaVMAttachArgs); + java_check_exception(JavaVirtualMachinePointer); + if (status != JNI_OK) { + EWOL_ERROR("C->java : AttachCurrentThread failed : " << status); + return false; + } + } + return true; } + static void java_detach_current_thread(int status) { - if(status == JNI_EDETACHED) g_JavaVM->DetachCurrentThread(); + if(status == JNI_EDETACHED) g_JavaVM->DetachCurrentThread(); } void SendJavaKeyboardUpdate(bool showIt) { - int status; - if(!java_attach_current_thread(&status)) return; - - //Call java ... - JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolCallbackKeyboardUpdate, showIt ? JNI_TRUE : JNI_FALSE); - // manage execption : - java_check_exception(JavaVirtualMachinePointer); - java_detach_current_thread(status); + int status; + if(!java_attach_current_thread(&status)) return; + + //Call java ... + JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolCallbackKeyboardUpdate, showIt ? JNI_TRUE : JNI_FALSE); + // manage execption : + java_check_exception(JavaVirtualMachinePointer); + java_detach_current_thread(status); } // mode 0 : auto; 1 landscape, 2 portrait void SendJavaOrientationUpdate(int32_t mode) { #ifndef __ANDROID_PERMISSION__SET_ORIENTATION__ - EWOL_ERROR("C->java : call set orientation without Allow application to do it ... Break..."); - return; + EWOL_ERROR("C->java : call set orientation without Allow application to do it ... Break..."); + return; #else - int status; - if(!java_attach_current_thread(&status)) return; - jint param = mode; - - //Call java ... - JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolCallbackOrientationUpdate, param); + int status; + if(!java_attach_current_thread(&status)) { + return; + } + jint param = mode; - // manage execption : - java_check_exception(JavaVirtualMachinePointer); - java_detach_current_thread(status); + //Call java ... + JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolCallbackOrientationUpdate, param); + + // manage execption : + java_check_exception(JavaVirtualMachinePointer); + java_detach_current_thread(status); #endif } void SendJavaSetTitle(const char * dataString) { - EWOL_DEBUG("C->java : send message to the java : \"" << dataString << "\""); - int status; - if(!java_attach_current_thread(&status)) return; - EWOL_DEBUG("C->java : 222"); - if (NULL == dataString) { - EWOL_ERROR("C->java : No data to send ..."); - return; - } + EWOL_DEBUG("C->java : send message to the java : \"" << dataString << "\""); + int status; + if(!java_attach_current_thread(&status)) { + return; + } + EWOL_DEBUG("C->java : 222"); + if (NULL == dataString) { + EWOL_ERROR("C->java : No data to send ..."); + return; + } - //Call java ... - jstring title = JavaVirtualMachinePointer->NewStringUTF(dataString); - JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolActivitySetTitle, title); - JavaVirtualMachinePointer->DeleteLocalRef(title); - // manage execption : - java_check_exception(JavaVirtualMachinePointer); - java_detach_current_thread(status); + //Call java ... + jstring title = JavaVirtualMachinePointer->NewStringUTF(dataString); + JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolActivitySetTitle, title); + JavaVirtualMachinePointer->DeleteLocalRef(title); + // manage execption : + java_check_exception(JavaVirtualMachinePointer); + java_detach_current_thread(status); } void SendSystemMessage(const char * dataString) { - EWOL_DEBUG("C->java : send message to the java : \"" << dataString << "\""); - int status; - if(!java_attach_current_thread(&status)) return; - EWOL_DEBUG("C->java : 222"); - if (NULL == dataString) { - EWOL_ERROR("C->java : No data to send ..."); - return; - } - EWOL_DEBUG("C->java : 333"); - // create the string to the java - jstring jstr = JavaVirtualMachinePointer->NewStringUTF(dataString); - if (jstr == 0) { - EWOL_ERROR("C->java : Out of memory" ); - return; - } - EWOL_DEBUG("C->java : 444"); - // create argument list - jobjectArray args = JavaVirtualMachinePointer->NewObjectArray(1, javaDefaultClassString, jstr); - if (args == 0) { - EWOL_ERROR("C->java : Out of memory" ); - return; - } - EWOL_DEBUG("C->java : 555"); - //Call java ... - JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolCallbackEventNotifier, args); + EWOL_DEBUG("C->java : send message to the java : \"" << dataString << "\""); + int status; + if(!java_attach_current_thread(&status)) { + return; + } + EWOL_DEBUG("C->java : 222"); + if (NULL == dataString) { + EWOL_ERROR("C->java : No data to send ..."); + return; + } + EWOL_DEBUG("C->java : 333"); + // create the string to the java + jstring jstr = JavaVirtualMachinePointer->NewStringUTF(dataString); + if (jstr == 0) { + EWOL_ERROR("C->java : Out of memory" ); + return; + } + EWOL_DEBUG("C->java : 444"); + // create argument list + jobjectArray args = JavaVirtualMachinePointer->NewObjectArray(1, javaDefaultClassString, jstr); + if (args == 0) { + EWOL_ERROR("C->java : Out of memory" ); + return; + } + EWOL_DEBUG("C->java : 555"); + //Call java ... + JavaVirtualMachinePointer->CallVoidMethod(javaObjectEwolCallbackAndActivity, javaMethodEwolCallbackEventNotifier, args); - EWOL_DEBUG("C->java : 666"); - java_check_exception(JavaVirtualMachinePointer); - java_detach_current_thread(status); + EWOL_DEBUG("C->java : 666"); + java_check_exception(JavaVirtualMachinePointer); + java_detach_current_thread(status); } namespace guiAbstraction { - void SendKeyboardEvent(bool isDown, uniChar_t keyInput); + void SendKeyboardEvent(bool isDown, uniChar_t keyInput); }; extern "C" { - // JNI OnLoad - JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved) - { - // get the java virtual machine handle ... - g_JavaVM = jvm; - EWOL_DEBUG("JNI-> load the jvm ..." ); - return JNI_VERSION_1_6; - } - // JNI OnUnLoad - JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) - { - g_JavaVM = NULL; - EWOL_DEBUG("JNI-> Un-load the jvm ..." ); - } - + // JNI OnLoad + JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved) + { + // get the java virtual machine handle ... + g_JavaVM = jvm; + EWOL_DEBUG("JNI-> load the jvm ..." ); + return JNI_VERSION_1_6; + } + // JNI OnUnLoad + JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) + { + g_JavaVM = NULL; + EWOL_DEBUG("JNI-> Un-load the jvm ..." ); + } - /* Call to initialize the graphics state */ - void Java_org_ewol_Ewol_paramSetArchiveDir(JNIEnv* env, jclass cls, jint mode, jstring myString) - { - // direct setting of the date in the string system ... - jboolean isCopy; - const char* str = env->GetStringUTFChars(myString, &isCopy); - eSystem::SetArchiveDir(mode, str); - if (isCopy == JNI_TRUE) { - // from here str is reset ... - env->ReleaseStringUTFChars(myString, str); - str = NULL; - } - } + /* Call to initialize the graphics state */ + void Java_org_ewol_Ewol_paramSetArchiveDir(JNIEnv* env, jclass cls, jint mode, jstring myString) + { + // direct setting of the date in the string system ... + jboolean isCopy; + const char* str = env->GetStringUTFChars(myString, &isCopy); + eSystem::SetArchiveDir(mode, str); + if (isCopy == JNI_TRUE) { + // from here str is reset ... + env->ReleaseStringUTFChars(myString, str); + str = NULL; + } + } - void Java_org_ewol_Ewol_setJavaVirtualMachineStart(JNIEnv* env, jclass classBase, jobject objCallback) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Set JVM Pointer **"); - EWOL_DEBUG("*******************************************"); - JavaVirtualMachinePointer = env; - // get default needed all time elements : - if (NULL != JavaVirtualMachinePointer) { - EWOL_DEBUG("C->java : try load org/ewol/Ewol class"); - javaClassEwol = JavaVirtualMachinePointer->FindClass("org/ewol/Ewol" ); - if (javaClassEwol == 0) { - EWOL_ERROR("C->java : Can't find org/ewol/Ewol class"); - // remove access on the virtual machine : - JavaVirtualMachinePointer = NULL; - return; - } - /* The object field extends Activity and implement EwolCallback */ - javaClassEwolCallbackAndActivity = JavaVirtualMachinePointer->GetObjectClass(objCallback); - if(javaClassEwolCallbackAndActivity == NULL) { - EWOL_ERROR("C->java : Can't find org/ewol/EwolCallback class"); - // remove access on the virtual machine : - JavaVirtualMachinePointer = NULL; - return; - } - - __jni_safe_init_method_id( - javaMethodEwolActivitySetTitle, - javaClassEwolCallbackAndActivity, - "setTitle", "(Ljava/lang/CharSequence;)V"); - - __jni_safe_init_method_id( - javaMethodEwolCallbackEventNotifier, - javaClassEwolCallbackAndActivity, - "eventNotifier", "([Ljava/lang/String;)V"); - - __jni_safe_init_method_id( - javaMethodEwolCallbackKeyboardUpdate, - javaClassEwolCallbackAndActivity, - "keyboardUpdate", "(Z)V"); - - __jni_safe_init_method_id( - javaMethodEwolCallbackOrientationUpdate, - javaClassEwolCallbackAndActivity, - "orientationUpdate", "(I)V"); - + static void setJavaVirtualMachineStart(JNIEnv* env, jclass classBase, jobject objCallback) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Set JVM Pointer **"); + EWOL_DEBUG("*******************************************"); + JavaVirtualMachinePointer = env; + // get default needed all time elements : + if (NULL != JavaVirtualMachinePointer) { + EWOL_DEBUG("C->java : try load org/ewol/Ewol class"); + javaClassEwol = JavaVirtualMachinePointer->FindClass("org/ewol/Ewol" ); + if (javaClassEwol == 0) { + EWOL_ERROR("C->java : Can't find org/ewol/Ewol class"); + // remove access on the virtual machine : + JavaVirtualMachinePointer = NULL; + return; + } + /* The object field extends Activity and implement EwolCallback */ + javaClassEwolCallbackAndActivity = JavaVirtualMachinePointer->GetObjectClass(objCallback); + if(javaClassEwolCallbackAndActivity == NULL) { + EWOL_ERROR("C->java : Can't find org/ewol/EwolCallback class"); + // remove access on the virtual machine : + JavaVirtualMachinePointer = NULL; + return; + } - javaObjectEwolCallbackAndActivity = env->NewGlobalRef(objCallback); - //javaObjectEwolCallbackAndActivity = objCallback; + __jni_safe_init_method_id( + javaMethodEwolActivitySetTitle, + javaClassEwolCallbackAndActivity, + "setTitle", "(Ljava/lang/CharSequence;)V"); - javaDefaultClassString = JavaVirtualMachinePointer->FindClass("java/lang/String" ); - if (javaDefaultClassString == 0) { - EWOL_ERROR("C->java : Can't find java/lang/String" ); - // remove access on the virtual machine : - JavaVirtualMachinePointer = NULL; - return; - } - } - } - void Java_org_ewol_Ewol_setJavaVirtualMachineStop(JNIEnv* env, jclass cls) { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Remove JVM Pointer **"); - EWOL_DEBUG("*******************************************"); - env->DeleteGlobalRef(javaObjectEwolCallbackAndActivity); - JavaVirtualMachinePointer = NULL; - } - void Java_org_ewol_Ewol_touchEvent( JNIEnv* env, jobject thiz ) - { - EWOL_DEBUG(" ==> Touch Event"); - java_check_exception(env); - } + __jni_safe_init_method_id( + javaMethodEwolCallbackEventNotifier, + javaClassEwolCallbackAndActivity, + "eventNotifier", "([Ljava/lang/String;)V"); + + __jni_safe_init_method_id( + javaMethodEwolCallbackKeyboardUpdate, + javaClassEwolCallbackAndActivity, + "keyboardUpdate", "(Z)V"); + + __jni_safe_init_method_id( + javaMethodEwolCallbackOrientationUpdate, + javaClassEwolCallbackAndActivity, + "orientationUpdate", "(I)V"); + + javaObjectEwolCallbackAndActivity = env->NewGlobalRef(objCallback); + //javaObjectEwolCallbackAndActivity = objCallback; + + javaDefaultClassString = JavaVirtualMachinePointer->FindClass("java/lang/String" ); + if (javaDefaultClassString == 0) { + EWOL_ERROR("C->java : Can't find java/lang/String" ); + // remove access on the virtual machine : + JavaVirtualMachinePointer = NULL; + return; + } + } + } - void Java_org_ewol_Ewol_onCreate( JNIEnv* env, jobject thiz ) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Activity On Create **"); - EWOL_DEBUG("*******************************************"); - eSystem::Init(); - } - - void Java_org_ewol_Ewol_onStart(JNIEnv* env, jobject thiz) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Activity On Start **"); - EWOL_DEBUG("*******************************************"); - //SendSystemMessage(" testmessages ... "); - } - void Java_org_ewol_Ewol_onReStart(JNIEnv* env, jobject thiz) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Activity On Re-Start **"); - EWOL_DEBUG("*******************************************"); - } - void Java_org_ewol_Ewol_onResume(JNIEnv* env, jobject thiz) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Activity On Resume **"); - EWOL_DEBUG("*******************************************"); - } - void Java_org_ewol_Ewol_onPause(JNIEnv* env, jobject thiz) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Activity On Pause **"); - EWOL_DEBUG("*******************************************"); - // All the openGl has been destroyed ... - eSystem::OpenGlContextDestroy(); - } - void Java_org_ewol_Ewol_onStop(JNIEnv* env, jobject thiz) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Activity On Stop **"); - EWOL_DEBUG("*******************************************"); - } - void Java_org_ewol_Ewol_onDestroy(JNIEnv* env, jobject thiz) - { - EWOL_DEBUG("*******************************************"); - EWOL_DEBUG("** Activity On Destroy **"); - EWOL_DEBUG("*******************************************"); - eSystem::UnInit(); - } + void Java_org_ewol_Ewol_setJavaVirtualMachineStart(JNIEnv* _env, jclass _classBase, jobject _objCallback) + { + setJavaVirtualMachineStart(_env, _classBase, _objCallback); + } + + void Java_org_ewol_Ewol_setJavaVirtualMachineStartWallpaperEngine(JNIEnv* _env, jclass _classBase, jobject _objCallback) + { + setJavaVirtualMachineStart(_env, _classBase, _objCallback); + } + + + void Java_org_ewol_Ewol_setJavaVirtualMachineStop(JNIEnv* env, jclass cls) { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Remove JVM Pointer **"); + EWOL_DEBUG("*******************************************"); + env->DeleteGlobalRef(javaObjectEwolCallbackAndActivity); + JavaVirtualMachinePointer = NULL; + } + void Java_org_ewol_Ewol_touchEvent( JNIEnv* env, jobject thiz ) + { + EWOL_DEBUG(" ==> Touch Event"); + java_check_exception(env); + } + + void Java_org_ewol_Ewol_onCreate( JNIEnv* env, jobject thiz ) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Activity On Create **"); + EWOL_DEBUG("*******************************************"); + eSystem::Init(); + } + + void Java_org_ewol_Ewol_onStart(JNIEnv* env, jobject thiz) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Activity On Start **"); + EWOL_DEBUG("*******************************************"); + //SendSystemMessage(" testmessages ... "); + } + void Java_org_ewol_Ewol_onReStart(JNIEnv* env, jobject thiz) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Activity On Re-Start **"); + EWOL_DEBUG("*******************************************"); + } + void Java_org_ewol_Ewol_onResume(JNIEnv* env, jobject thiz) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Activity On Resume **"); + EWOL_DEBUG("*******************************************"); + } + void Java_org_ewol_Ewol_onPause(JNIEnv* env, jobject thiz) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Activity On Pause **"); + EWOL_DEBUG("*******************************************"); + // All the openGl has been destroyed ... + eSystem::OpenGlContextDestroy(); + } + void Java_org_ewol_Ewol_onStop(JNIEnv* env, jobject thiz) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Activity On Stop **"); + EWOL_DEBUG("*******************************************"); + } + void Java_org_ewol_Ewol_onDestroy(JNIEnv* env, jobject thiz) + { + EWOL_DEBUG("*******************************************"); + EWOL_DEBUG("** Activity On Destroy **"); + EWOL_DEBUG("*******************************************"); + eSystem::UnInit(); + } - /* ********************************************************************************************** - * ** IO section : - * ********************************************************************************************** */ - void Java_org_ewol_Ewol_inputEventMotion( JNIEnv* env, jobject thiz, jint pointerID, jfloat x, jfloat y ) - { - eSystem::SetInputMotion(pointerID+1, x, m_currentHeight-y); - } + /* ********************************************************************************************** + * ** IO section : + * ********************************************************************************************** */ + void Java_org_ewol_Ewol_inputEventMotion( JNIEnv* env, jobject thiz, jint pointerID, jfloat x, jfloat y ) + { + eSystem::SetInputMotion(pointerID+1, x, m_currentHeight-y); + } - void Java_org_ewol_Ewol_inputEventState( JNIEnv* env, jobject thiz, jint pointerID, jboolean isUp, jfloat x, jfloat y ) - { - eSystem::SetInputState(pointerID+1, isUp, x, m_currentHeight-y); - } + void Java_org_ewol_Ewol_inputEventState( JNIEnv* env, jobject thiz, jint pointerID, jboolean isUp, jfloat x, jfloat y ) + { + eSystem::SetInputState(pointerID+1, isUp, x, m_currentHeight-y); + } - void Java_org_ewol_Ewol_mouseEventMotion( JNIEnv* env, jobject thiz, jint pointerID, jfloat x, jfloat y ) - { - eSystem::SetMouseMotion(pointerID+1, x, m_currentHeight-y); - } + void Java_org_ewol_Ewol_mouseEventMotion( JNIEnv* env, jobject thiz, jint pointerID, jfloat x, jfloat y ) + { + eSystem::SetMouseMotion(pointerID+1, x, m_currentHeight-y); + } - void Java_org_ewol_Ewol_mouseEventState( JNIEnv* env, jobject thiz, jint pointerID, jboolean isUp, jfloat x, jfloat y ) - { - eSystem::SetMouseState(pointerID+1, isUp, x, m_currentHeight-y); - } + void Java_org_ewol_Ewol_mouseEventState( JNIEnv* env, jobject thiz, jint pointerID, jboolean isUp, jfloat x, jfloat y ) + { + eSystem::SetMouseState(pointerID+1, isUp, x, m_currentHeight-y); + } - void Java_org_ewol_Ewol_unknowEvent( JNIEnv* env, jobject thiz, jint pointerID) - { - EWOL_DEBUG("Unknown IO event : " << pointerID << " ???"); - } + void Java_org_ewol_Ewol_unknowEvent( JNIEnv* env, jobject thiz, jint pointerID) + { + EWOL_DEBUG("Unknown IO event : " << pointerID << " ???"); + } - void Java_org_ewol_Ewol_keyboardEventMove( JNIEnv* env, jobject thiz, jint type, jboolean isdown) - { - EWOL_DEBUG("IO keyboard Move event : \"" << type << "\" is down=" << isdown); - } + void Java_org_ewol_Ewol_keyboardEventMove( JNIEnv* env, jobject thiz, jint type, jboolean isdown) + { + EWOL_DEBUG("IO keyboard Move event : \"" << type << "\" is down=" << isdown); + } - void Java_org_ewol_Ewol_keyboardEventKey( JNIEnv* env, jobject thiz, jint uniChar, jboolean isdown) - { - EWOL_DEBUG("IO keyboard Key event : \"" << uniChar << "\" is down=" << isdown); - eSystem::SetKeyboard(guiKeyBoardSpecialKeyMode, uniChar, isdown); - } + void Java_org_ewol_Ewol_keyboardEventKey( JNIEnv* env, jobject thiz, jint uniChar, jboolean isdown) + { + EWOL_DEBUG("IO keyboard Key event : \"" << uniChar << "\" is down=" << isdown); + eSystem::SetKeyboard(guiKeyBoardSpecialKeyMode, uniChar, isdown); + } - void Java_org_ewol_Ewol_displayPropertyMetrics( JNIEnv* env, jobject thiz, jfloat ratioX, jfloat ratioY) - { - // set the internal system ratio properties ... - ewol::dimension::SetPixelRatio(vec2(ratioX,ratioY), ewol::Dimension::Inch); - } + void Java_org_ewol_Ewol_displayPropertyMetrics( JNIEnv* env, jobject thiz, jfloat ratioX, jfloat ratioY) + { + // set the internal system ratio properties ... + ewol::dimension::SetPixelRatio(vec2(ratioX,ratioY), ewol::Dimension::Inch); + } - // TODO : Set a return true or false if we want to grep this event ... - void Java_org_ewol_Ewol_keyboardEventKeySystem( JNIEnv* env, jobject thiz, jint keyVal, jboolean isdown) - { - switch (keyVal) - { - case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_VOLUME_UP: - EWOL_DEBUG("IO keyboard Key System \"VOLUME_UP\" is down=" << isdown); - break; - case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_VOLUME_DOWN: - EWOL_DEBUG("IO keyboard Key System \"VOLUME_DOWN\" is down=" << isdown); - break; - case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_MENU: - EWOL_DEBUG("IO keyboard Key System \"MENU\" is down=" << isdown); - break; - case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_CAMERA: - EWOL_DEBUG("IO keyboard Key System \"CAMERA\" is down=" << isdown); - break; - case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_HOME: - EWOL_DEBUG("IO keyboard Key System \"HOME\" is down=" << isdown); - break; - case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_POWER: - EWOL_DEBUG("IO keyboard Key System \"POWER\" is down=" << isdown); - break; - default: - EWOL_DEBUG("IO keyboard Key System event : \"" << keyVal << "\" is down=" << isdown); - break; - } - } + // TODO : Set a return true or false if we want to grep this event ... + void Java_org_ewol_Ewol_keyboardEventKeySystem( JNIEnv* env, jobject thiz, jint keyVal, jboolean isdown) + { + switch (keyVal) { + case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_VOLUME_UP: + EWOL_DEBUG("IO keyboard Key System \"VOLUME_UP\" is down=" << isdown); + break; + case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_VOLUME_DOWN: + EWOL_DEBUG("IO keyboard Key System \"VOLUME_DOWN\" is down=" << isdown); + break; + case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_MENU: + EWOL_DEBUG("IO keyboard Key System \"MENU\" is down=" << isdown); + break; + case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_CAMERA: + EWOL_DEBUG("IO keyboard Key System \"CAMERA\" is down=" << isdown); + break; + case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_HOME: + EWOL_DEBUG("IO keyboard Key System \"HOME\" is down=" << isdown); + break; + case org_ewol_EwolConstants_EWOL_SYSTEM_KEY_POWER: + EWOL_DEBUG("IO keyboard Key System \"POWER\" is down=" << isdown); + break; + default: + EWOL_DEBUG("IO keyboard Key System event : \"" << keyVal << "\" is down=" << isdown); + break; + } + } - /* ********************************************************************************************** - * ** Renderer section : - * ********************************************************************************************** */ - void Java_org_ewol_Ewol_renderInit(JNIEnv* env, jobject thiz) - { + /* ********************************************************************************************** + * ** Renderer section : + * ********************************************************************************************** */ + void Java_org_ewol_Ewol_renderInit(JNIEnv* env, jobject thiz) + { - } + } - void Java_org_ewol_Ewol_renderResize( JNIEnv* env, jobject thiz, jint w, jint h ) - { - m_currentHeight = h; - eSystem::Resize(w, h); - } + void Java_org_ewol_Ewol_renderResize( JNIEnv* env, jobject thiz, jint w, jint h ) + { + m_currentHeight = h; + eSystem::Resize(w, h); + } - void Java_org_ewol_Ewol_renderDraw(JNIEnv* env, jobject thiz) - { - eSystem::Draw(true); - } - - void Java_org_ewol_Ewol_audioPlayback(JNIEnv* env, void* reserved, jshortArray location, jint frameRate, jint nbChannels) - { - // Get the short* pointer from the Java array - jboolean isCopy; - jshort* dst = env->GetShortArrayElements(location, &isCopy); - if (NULL != dst) { - ewol::audio::GetData(dst, frameRate, nbChannels); - } - //APPL_DEBUG("IO Audio event request: Frames=" << frameRate << " channels=" << nbChannels); - // TODO : Understand why it did not work corectly ... - //if (isCopy == JNI_TRUE) { - // Release the short* pointer - env->ReleaseShortArrayElements(location, dst, 0); - //} - } + void Java_org_ewol_Ewol_renderDraw(JNIEnv* env, jobject thiz) + { + eSystem::Draw(true); + } + + void Java_org_ewol_Ewol_audioPlayback(JNIEnv* env, void* reserved, jshortArray location, jint frameRate, jint nbChannels) + { + // Get the short* pointer from the Java array + jboolean isCopy; + jshort* dst = env->GetShortArrayElements(location, &isCopy); + if (NULL != dst) { + ewol::audio::GetData(dst, frameRate, nbChannels); + } + //APPL_DEBUG("IO Audio event request: Frames=" << frameRate << " channels=" << nbChannels); + // TODO : Understand why it did not work corectly ... + //if (isCopy == JNI_TRUE) { + // Release the short* pointer + env->ReleaseShortArrayElements(location, dst, 0); + //} + } }; @@ -455,81 +471,81 @@ extern "C" int guiInterface::main(int argc, const char *argv[]) { - // unneeded fuction, all is controlled by android java ... - return 0; + // unneeded fuction, all is controlled by android java ... + return 0; } int64_t guiInterface::GetTime(void) { - struct timeval now; - gettimeofday(&now, NULL); - //EWOL_VERBOSE("current time : " << now.tv_sec << "s " << now.tv_usec << "us"); - return (int64_t)((int64_t)now.tv_sec*(int64_t)1000000 + (int64_t)now.tv_usec); + struct timeval now; + gettimeofday(&now, NULL); + //EWOL_VERBOSE("current time : " << now.tv_sec << "s " << now.tv_usec << "us"); + return (int64_t)((int64_t)now.tv_sec*(int64_t)1000000 + (int64_t)now.tv_usec); } void guiInterface::SetTitle(etk::UString& title) { - SendJavaSetTitle(title.c_str()); + SendJavaSetTitle(title.c_str()); } // ------------------------------------------------------------------------- -// ClipBoard AREA : +// ClipBoard AREA : // ------------------------------------------------------------------------- bool l_clipBoardOwnerStd = false; void guiInterface::ClipBoardGet(ewol::clipBoard::clipboardListe_te clipboardID) { - // this is to force the local system to think we have the buffer - // TODO : Remove this 2 Line when code will be writen - l_clipBoardOwnerStd = true; - switch (clipboardID) - { - case ewol::clipBoard::clipboardSelection: - // NOTE : Windows does not support the middle button the we do it internaly - // just transmit an event , we have the data in the system - eSystem::ClipBoardArrive(clipboardID); - break; - case ewol::clipBoard::clipboardStd: - if (false == l_clipBoardOwnerStd) { - // Generate a request TO the OS - // TODO : Send the message to the OS "We disire to receive the copy buffer ... - } else { - // just transmit an event , we have the data in the system - eSystem::ClipBoardArrive(clipboardID); - } - break; - default: - EWOL_ERROR("Request an unknow ClipBoard ..."); - break; - } + // this is to force the local system to think we have the buffer + // TODO : Remove this 2 Line when code will be writen + l_clipBoardOwnerStd = true; + switch (clipboardID) + { + case ewol::clipBoard::clipboardSelection: + // NOTE : Windows does not support the middle button the we do it internaly + // just transmit an event , we have the data in the system + eSystem::ClipBoardArrive(clipboardID); + break; + case ewol::clipBoard::clipboardStd: + if (false == l_clipBoardOwnerStd) { + // Generate a request TO the OS + // TODO : Send the message to the OS "We disire to receive the copy buffer ... + } else { + // just transmit an event , we have the data in the system + eSystem::ClipBoardArrive(clipboardID); + } + break; + default: + EWOL_ERROR("Request an unknow ClipBoard ..."); + break; + } } void guiInterface::ClipBoardSet(ewol::clipBoard::clipboardListe_te clipboardID) { - switch (clipboardID) - { - case ewol::clipBoard::clipboardSelection: - // NOTE : nothing to do : Windows deas ot supported Middle button - break; - case ewol::clipBoard::clipboardStd: - // Request the clipBoard : - if (false == l_clipBoardOwnerStd) { - // TODO : Inform the OS that we have the current buffer of copy ... - l_clipBoardOwnerStd = true; - } - break; - default: - EWOL_ERROR("Request an unknow ClipBoard ..."); - break; - } + switch (clipboardID) + { + case ewol::clipBoard::clipboardSelection: + // NOTE : nothing to do : Windows deas ot supported Middle button + break; + case ewol::clipBoard::clipboardStd: + // Request the clipBoard : + if (false == l_clipBoardOwnerStd) { + // TODO : Inform the OS that we have the current buffer of copy ... + l_clipBoardOwnerStd = true; + } + break; + default: + EWOL_ERROR("Request an unknow ClipBoard ..."); + break; + } } void guiInterface::Stop(void) { - // TODO : send a message to the android system to stop ... + // TODO : send a message to the android system to stop ... } // java system to send message : @@ -538,49 +554,49 @@ void SendJavaKeyboardUpdate(bool showIt); void guiInterface::KeyboardShow(void) { - // send a message at the java : - SendJavaKeyboardUpdate(true); + // send a message at the java : + SendJavaKeyboardUpdate(true); } void guiInterface::KeyboardHide(void) { - // send a message at the java : - SendJavaKeyboardUpdate(false); + // send a message at the java : + SendJavaKeyboardUpdate(false); } void guiInterface::ChangeSize(ivec2 size) { - // The size can not be change on android platform + // The size can not be change on android platform } void guiInterface::ChangePos(ivec2 size) { - // The position can not be change on Android platform + // The position can not be change on Android platform } void guiInterface::GetAbsPos(ivec2& size) { - size.setValue(0,0); + size.setValue(0,0); } void guiInterface::ForceOrientation(ewol::orientation_te orientation) { - SendJavaOrientationUpdate((int32_t)orientation); + SendJavaOrientationUpdate((int32_t)orientation); } void guiInterface::GrabPointerEvents(bool isGrabbed, vec2 forcedPosition) { - // nothing to do ... + // nothing to do ... } void guiInterface::SetCursor(ewol::cursorDisplay_te newCursor) { - // nothing to do ... + // nothing to do ... } void guiInterface::SetIcon(etk::UString inputFile) { - // nothing to do ... + // nothing to do ... }