Merge "<pthread.h>: Mark pthread_exit() as __noreturn"
diff --git a/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml b/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml
index 230f479..510e97a 100644
--- a/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml
+++ b/ndk/platforms/android-17/samples/Teapot/AndroidManifest.xml
@@ -24,7 +24,7 @@
android:configChanges="orientation|keyboardHidden">
<!-- Tell NativeActivity the name of or .so -->
<meta-data android:name="android.app.lib_name"
- android:value="NativeActivity" />
+ android:value="TeapotNativeActivity" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/Android.mk b/ndk/platforms/android-17/samples/Teapot/jni/Android.mk
index eec31a6..583743f 100644
--- a/ndk/platforms/android-17/samples/Teapot/jni/Android.mk
+++ b/ndk/platforms/android-17/samples/Teapot/jni/Android.mk
@@ -2,7 +2,7 @@
include $(CLEAR_VARS)
-LOCAL_MODULE := NativeActivity
+LOCAL_MODULE := TeapotNativeActivity
LOCAL_SRC_FILES := TeapotNativeActivity.cpp \
TeapotRenderer.cpp \
@@ -11,10 +11,10 @@
LOCAL_CFLAGS :=
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2
-LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue helper
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
include $(BUILD_SHARED_LIBRARY)
-$(call import-module,android/helper)
+$(call import-module,android/ndk_helper)
$(call import-module,android/native_app_glue)
$(call import-module,android/cpufeatures)
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp b/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp
index f8d8b10..9efff81 100644
--- a/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotNativeActivity.cpp
@@ -20,11 +20,6 @@
#include <jni.h>
#include <errno.h>
-#include <vector>
-
-#include <EGL/egl.h>
-#include <GLES/gl.h>
-
#include <android/sensor.h>
#include <android/log.h>
#include <android_native_app_glue.h>
@@ -34,133 +29,140 @@
#include "TeapotRenderer.h"
#include "NDKHelper.h"
-
+//-------------------------------------------------------------------------
+//Preprocessor
+//-------------------------------------------------------------------------
+#define HELPER_CLASS_NAME "com/sample/helper/NDKHelper" //Class name of helper function
//-------------------------------------------------------------------------
//Shared state for our app.
//-------------------------------------------------------------------------
struct android_app;
-class engine {
- TeapotRenderer _renderer;
+class Engine
+{
+ TeapotRenderer renderer_;
- GLContext* _glContext;
+ ndk_helper::GLContext* gl_context_;
- bool _bInitializedResources;
- bool _bHasFocus;
+ bool initialized_resources_;
+ bool has_focus_;
- DoubletapDetector _doubletapDetector;
- PinchDetector _pinchDetector;
- DragDetector _dragDetector;
- perfMonitor _monitor;
+ ndk_helper::DoubletapDetector doubletap_detector_;
+ ndk_helper::PinchDetector pinch_detector_;
+ ndk_helper::DragDetector drag_detector_;
+ ndk_helper::PerfMonitor monitor_;
- tapCamera _tapCamera;
+ ndk_helper::TapCamera tap_camera_;
- android_app* _app;
+ android_app* app_;
- ASensorManager* _sensorManager;
- const ASensor* _accelerometerSensor;
- ASensorEventQueue* _sensorEventQueue;
+ ASensorManager* sensor_manager_;
+ const ASensor* accelerometer_sensor_;
+ ASensorEventQueue* sensor_event_queue_;
- void updateFPS(float fFPS);
- void showUI();
- void transformPosition( vec2& vec );
+ void UpdateFPS( float fFPS );
+ void ShowUI();
+ void TransformPosition( ndk_helper::Vec2& vec );
public:
- static void handleCmd(struct android_app* app, int32_t cmd);
- static int32_t handleInput( android_app* app, AInputEvent* event );
+ static void HandleCmd( struct android_app* app,
+ int32_t cmd );
+ static int32_t HandleInput( android_app* app,
+ AInputEvent* event );
- engine();
- ~engine();
- void setState(android_app* state);
- int initDisplay();
- void loadResources();
- void unloadResources();
- void drawFrame();
- void termDisplay();
- void trimMemory();
- bool isReady();
+ Engine();
+ ~Engine();
+ void SetState( android_app* state );
+ int InitDisplay();
+ void LoadResources();
+ void UnloadResources();
+ void DrawFrame();
+ void TermDisplay();
+ void TrimMemory();
+ bool IsReady();
- void updatePosition( AInputEvent* event, int32_t iIndex, float& fX, float& fY);
+ void UpdatePosition( AInputEvent* event,
+ int32_t iIndex,
+ float& fX,
+ float& fY );
- void initSensors();
- void processSensors( int32_t id );
- void suspendSensors();
- void resumeSensors();
+ void InitSensors();
+ void ProcessSensors( int32_t id );
+ void SuspendSensors();
+ void ResumeSensors();
};
//-------------------------------------------------------------------------
//Ctor
//-------------------------------------------------------------------------
-engine::engine() :
- _bInitializedResources( false ),
- _bHasFocus( false ),
- _app( NULL ),
- _sensorManager( NULL ),
- _accelerometerSensor( NULL ),
- _sensorEventQueue( NULL )
+Engine::Engine() :
+ initialized_resources_( false ),
+ has_focus_( false ),
+ app_( NULL ),
+ sensor_manager_( NULL ),
+ accelerometer_sensor_( NULL ),
+ sensor_event_queue_( NULL )
{
- _glContext = GLContext::getInstance();
+ gl_context_ = ndk_helper::GLContext::GetInstance();
}
//-------------------------------------------------------------------------
//Dtor
//-------------------------------------------------------------------------
-engine::~engine()
+Engine::~Engine()
{
}
/**
* Load resources
*/
-void engine::loadResources()
+void Engine::LoadResources()
{
- _renderer.init();
- _renderer.bind(&_tapCamera);
+ renderer_.Init();
+ renderer_.Bind( &tap_camera_ );
}
/**
* Unload resources
*/
-void engine::unloadResources()
+void Engine::UnloadResources()
{
- _renderer.unload();
+ renderer_.Unload();
}
/**
* Initialize an EGL context for the current display.
*/
-int engine::initDisplay()
+int Engine::InitDisplay()
{
- if( !_bInitializedResources )
+ if( !initialized_resources_ )
{
- _glContext->init( _app->window );
- loadResources();
- _bInitializedResources = true;
+ gl_context_->Init( app_->window );
+ LoadResources();
+ initialized_resources_ = true;
}
else
{
// initialize OpenGL ES and EGL
- if( EGL_SUCCESS != _glContext->resume( _app->window ) )
+ if( EGL_SUCCESS != gl_context_->Resume( app_->window ) )
{
- unloadResources();
- loadResources();
+ UnloadResources();
+ LoadResources();
}
}
- showUI();
+ ShowUI();
// Initialize GL state.
- glEnable(GL_CULL_FACE);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
+ glEnable( GL_CULL_FACE );
+ glEnable( GL_DEPTH_TEST );
+ glDepthFunc( GL_LEQUAL );
//Note that screen size might have been changed
- glViewport(0, 0,
- _glContext->getScreenWidth(),
- _glContext->getScreenHeight() );
- _renderer.updateViewport();
+ glViewport( 0, 0, gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() );
+ renderer_.UpdateViewport();
- _tapCamera.setFlip(1.f, -1.f, -1.f);
- _tapCamera.setPinchTransformFactor(2.f, 2.f, 8.f);
+ tap_camera_.SetFlip( 1.f, -1.f, -1.f );
+ tap_camera_.SetPinchTransformFactor( 2.f, 2.f, 8.f );
return 0;
}
@@ -168,108 +170,108 @@
/**
* Just the current frame in the display.
*/
-void engine::drawFrame()
+void Engine::DrawFrame()
{
float fFPS;
- if( _monitor.update(fFPS) )
+ if( monitor_.Update( fFPS ) )
{
- updateFPS( fFPS );
+ UpdateFPS( fFPS );
}
- double dTime = _monitor.getCurrentTime();
- _renderer.update(dTime);
+ renderer_.Update( monitor_.GetCurrentTime() );
// Just fill the screen with a color.
- glClearColor(0.5f, 0.5f, 0.5f, 1.f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- _renderer.render();
+ glClearColor( 0.5f, 0.5f, 0.5f, 1.f );
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ renderer_.Render();
// Swap
- if( EGL_SUCCESS != _glContext->swap() )
+ if( EGL_SUCCESS != gl_context_->Swap() )
{
- unloadResources();
- loadResources();
+ UnloadResources();
+ LoadResources();
}
}
/**
* Tear down the EGL context currently associated with the display.
*/
-void engine::termDisplay()
+void Engine::TermDisplay()
{
- _glContext->suspend();
+ gl_context_->Suspend();
}
-void engine::trimMemory()
+void Engine::TrimMemory()
{
LOGI( "Trimming memory" );
- _glContext->invalidate();
+ gl_context_->Invalidate();
}
/**
* Process the next input event.
*/
-int32_t engine::handleInput( android_app* app, AInputEvent* event )
+int32_t Engine::HandleInput( android_app* app,
+ AInputEvent* event )
{
- engine* eng = (engine*)app->userData;
- if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION)
+ Engine* eng = (Engine*) app->userData;
+ if( AInputEvent_getType( event ) == AINPUT_EVENT_TYPE_MOTION )
{
- GESTURE_STATE doubleTapState = eng->_doubletapDetector.detect(event);
- GESTURE_STATE dragState = eng->_dragDetector.detect(event);
- GESTURE_STATE pinchState = eng->_pinchDetector.detect(event);
+ ndk_helper::GESTURE_STATE doubleTapState = eng->doubletap_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect( event );
//Double tap detector has a priority over other detectors
- if( doubleTapState == GESTURE_STATE_ACTION )
- {
- //Detect double tap
- eng->_tapCamera.reset(true);
- }
- else
- {
- //Handle drag state
- if( dragState & GESTURE_STATE_START )
- {
- //Otherwise, start dragging
- vec2 v;
- eng->_dragDetector.getPointer( v );
- eng->transformPosition( v );
- eng->_tapCamera.beginDrag( v );
- }
- else if( dragState & GESTURE_STATE_MOVE )
- {
- vec2 v;
- eng->_dragDetector.getPointer( v );
- eng->transformPosition( v );
- eng->_tapCamera.drag( v );
- }
- else if( dragState & GESTURE_STATE_END )
- {
- eng->_tapCamera.endDrag();
- }
+ if( doubleTapState == ndk_helper::GESTURE_STATE_ACTION )
+ {
+ //Detect double tap
+ eng->tap_camera_.Reset( true );
+ }
+ else
+ {
+ //Handle drag state
+ if( dragState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Otherwise, start dragging
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.BeginDrag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.Drag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_END )
+ {
+ eng->tap_camera_.EndDrag();
+ }
- //Handle pinch state
- if( pinchState & GESTURE_STATE_START )
- {
- //Start new pinch
- vec2 v1;
- vec2 v2;
- eng->_pinchDetector.getPointers( v1, v2 );
- eng->transformPosition( v1 );
- eng->transformPosition( v2 );
- eng->_tapCamera.beginPinch( v1, v2 );
- }
- else if( pinchState & GESTURE_STATE_MOVE )
- {
- //Multi touch
- //Start new pinch
- vec2 v1;
- vec2 v2;
- eng->_pinchDetector.getPointers( v1, v2 );
- eng->transformPosition( v1 );
- eng->transformPosition( v2 );
- eng->_tapCamera.pinch( v1, v2 );
- }
- }
- return 1;
+ //Handle pinch state
+ if( pinchState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.BeginPinch( v1, v2 );
+ }
+ else if( pinchState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ //Multi touch
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.Pinch( v1, v2 );
+ }
+ }
+ return 1;
}
return 0;
}
@@ -277,176 +279,180 @@
/**
* Process the next main command.
*/
-void engine::handleCmd(struct android_app* app, int32_t cmd)
+void Engine::HandleCmd( struct android_app* app,
+ int32_t cmd )
{
- engine* eng = (engine*)app->userData;
- switch (cmd) {
- case APP_CMD_SAVE_STATE:
- break;
- case APP_CMD_INIT_WINDOW:
- // The window is being shown, get it ready.
- if (app->window != NULL) {
- eng->initDisplay();
- eng->drawFrame();
- }
- break;
- case APP_CMD_TERM_WINDOW:
- // The window is being hidden or closed, clean it up.
- eng->termDisplay();
- eng->_bHasFocus = false;
- break;
- case APP_CMD_STOP:
- break;
- case APP_CMD_GAINED_FOCUS:
- eng->resumeSensors();
- //Start animation
- eng->_bHasFocus = true;
- break;
- case APP_CMD_LOST_FOCUS:
- eng->suspendSensors();
- // Also stop animating.
- eng->_bHasFocus = false;
- eng->drawFrame();
- break;
- case APP_CMD_LOW_MEMORY:
- //Free up GL resources
- eng->trimMemory();
- break;
+ Engine* eng = (Engine*) app->userData;
+ switch( cmd )
+ {
+ case APP_CMD_SAVE_STATE:
+ break;
+ case APP_CMD_INIT_WINDOW:
+ // The window is being shown, get it ready.
+ if( app->window != NULL )
+ {
+ eng->InitDisplay();
+ eng->DrawFrame();
+ }
+ break;
+ case APP_CMD_TERM_WINDOW:
+ // The window is being hidden or closed, clean it up.
+ eng->TermDisplay();
+ eng->has_focus_ = false;
+ break;
+ case APP_CMD_STOP:
+ break;
+ case APP_CMD_GAINED_FOCUS:
+ eng->ResumeSensors();
+ //Start animation
+ eng->has_focus_ = true;
+ break;
+ case APP_CMD_LOST_FOCUS:
+ eng->SuspendSensors();
+ // Also stop animating.
+ eng->has_focus_ = false;
+ eng->DrawFrame();
+ break;
+ case APP_CMD_LOW_MEMORY:
+ //Free up GL resources
+ eng->TrimMemory();
+ break;
}
}
//-------------------------------------------------------------------------
//Sensor handlers
//-------------------------------------------------------------------------
-void engine::initSensors()
+void Engine::InitSensors()
{
- _sensorManager = ASensorManager_getInstance();
- _accelerometerSensor = ASensorManager_getDefaultSensor( _sensorManager,
- ASENSOR_TYPE_ACCELEROMETER);
- _sensorEventQueue = ASensorManager_createEventQueue( _sensorManager,
- _app->looper, LOOPER_ID_USER, NULL, NULL);
+ sensor_manager_ = ASensorManager_getInstance();
+ accelerometer_sensor_ = ASensorManager_getDefaultSensor( sensor_manager_,
+ ASENSOR_TYPE_ACCELEROMETER );
+ sensor_event_queue_ = ASensorManager_createEventQueue( sensor_manager_, app_->looper,
+ LOOPER_ID_USER, NULL, NULL );
}
-void engine::processSensors( int32_t id )
+void Engine::ProcessSensors( int32_t id )
{
// If a sensor has data, process it now.
if( id == LOOPER_ID_USER )
{
- if (_accelerometerSensor != NULL)
+ if( accelerometer_sensor_ != NULL )
{
ASensorEvent event;
- while (ASensorEventQueue_getEvents(_sensorEventQueue,
- &event, 1) > 0)
+ while( ASensorEventQueue_getEvents( sensor_event_queue_, &event, 1 ) > 0 )
{
}
}
}
}
-void engine::resumeSensors()
+void Engine::ResumeSensors()
{
// When our app gains focus, we start monitoring the accelerometer.
- if (_accelerometerSensor != NULL) {
- ASensorEventQueue_enableSensor(_sensorEventQueue,
- _accelerometerSensor);
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_enableSensor( sensor_event_queue_, accelerometer_sensor_ );
// We'd like to get 60 events per second (in us).
- ASensorEventQueue_setEventRate(_sensorEventQueue,
- _accelerometerSensor, (1000L/60)*1000);
+ ASensorEventQueue_setEventRate( sensor_event_queue_, accelerometer_sensor_,
+ (1000L / 60) * 1000 );
}
}
-void engine::suspendSensors()
+void Engine::SuspendSensors()
{
// When our app loses focus, we stop monitoring the accelerometer.
// This is to avoid consuming battery while not being used.
- if (_accelerometerSensor != NULL) {
- ASensorEventQueue_disableSensor(_sensorEventQueue,
- _accelerometerSensor);
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_disableSensor( sensor_event_queue_, accelerometer_sensor_ );
}
}
-
//-------------------------------------------------------------------------
//Misc
//-------------------------------------------------------------------------
-void engine::setState(android_app* state)
+void Engine::SetState( android_app* state )
{
- _app = state;
- _doubletapDetector.setConfiguration( _app->config );
- _dragDetector.setConfiguration( _app->config );
- _pinchDetector.setConfiguration( _app->config );
+ app_ = state;
+ doubletap_detector_.SetConfiguration( app_->config );
+ drag_detector_.SetConfiguration( app_->config );
+ pinch_detector_.SetConfiguration( app_->config );
}
-bool engine::isReady()
+bool Engine::IsReady()
{
- if( _bHasFocus )
+ if( has_focus_ )
return true;
return false;
}
-void engine::transformPosition( vec2& vec )
+void Engine::TransformPosition( ndk_helper::Vec2& vec )
{
- vec = vec2( 2.0f, 2.0f ) * vec / vec2( _glContext->getScreenWidth(), _glContext->getScreenHeight() ) - vec2( 1.f, 1.f );
+ vec = ndk_helper::Vec2( 2.0f, 2.0f ) * vec
+ / ndk_helper::Vec2( gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() )
+ - ndk_helper::Vec2( 1.f, 1.f );
}
-void engine::showUI()
+void Engine::ShowUI()
{
JNIEnv *jni;
- _app->activity->vm->AttachCurrentThread(&jni, NULL);
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
//Default class retrieval
- jclass clazz = jni->GetObjectClass( _app->activity->clazz );
- jmethodID methodID = jni->GetMethodID(clazz, "showUI", "()V" );
- jni->CallVoidMethod( _app->activity->clazz, methodID );
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "showUI", "()V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID );
- _app->activity->vm->DetachCurrentThread();
+ app_->activity->vm->DetachCurrentThread();
return;
}
-void engine::updateFPS(float fFPS)
+void Engine::UpdateFPS( float fFPS )
{
JNIEnv *jni;
- _app->activity->vm->AttachCurrentThread(&jni, NULL);
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
//Default class retrieval
- jclass clazz = jni->GetObjectClass(_app->activity->clazz);
- jmethodID methodID = jni->GetMethodID(clazz, "updateFPS", "(F)V");
- jni->CallVoidMethod(_app->activity->clazz, methodID, fFPS);
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "updateFPS", "(F)V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID, fFPS );
- _app->activity->vm->DetachCurrentThread();
+ app_->activity->vm->DetachCurrentThread();
return;
}
-engine g_engine;
+Engine g_engine;
/**
* This is the main entry point of a native application that is using
* android_native_app_glue. It runs in its own thread, with its own
* event loop for receiving input events and doing other things.
*/
-void android_main(android_app* state)
+void android_main( android_app* state )
{
app_dummy();
- g_engine.setState( state );
+ g_engine.SetState( state );
//Init helper functions
- JNIHelper::init( state->activity );
+ ndk_helper::JNIHelper::Init( state->activity, HELPER_CLASS_NAME );
state->userData = &g_engine;
- state->onAppCmd = engine::handleCmd;
- state->onInputEvent = engine::handleInput;
+ state->onAppCmd = Engine::HandleCmd;
+ state->onInputEvent = Engine::HandleInput;
#ifdef USE_NDK_PROFILER
- monstartup("libNativeActivity.so");
+ monstartup("libTeapotNativeActivity.so");
#endif
// Prepare to monitor accelerometer
- g_engine.initSensors();
+ g_engine.InitSensors();
// loop waiting for stuff to do.
- while (1) {
+ while( 1 )
+ {
// Read all pending events.
int id;
int events;
@@ -455,28 +461,28 @@
// If not animating, we will block forever waiting for events.
// If animating, we loop until all events are read, then continue
// to draw the next frame of animation.
- while ((id = ALooper_pollAll( g_engine.isReady() ? 0 : -1, NULL, &events,
- (void**)&source) ) >= 0)
+ while( (id = ALooper_pollAll( g_engine.IsReady() ? 0 : -1, NULL, &events, (void**) &source ))
+ >= 0 )
{
// Process this event.
- if (source != NULL)
- source->process(state, source);
+ if( source != NULL )
+ source->process( state, source );
- g_engine.processSensors( id );
+ g_engine.ProcessSensors( id );
// Check if we are exiting.
- if (state->destroyRequested != 0)
+ if( state->destroyRequested != 0 )
{
- g_engine.termDisplay();
+ g_engine.TermDisplay();
return;
}
}
- if( g_engine.isReady() )
+ if( g_engine.IsReady() )
{
// Drawing is throttled to the screen update rate, so there
// is no need to do timing here.
- g_engine.drawFrame();
+ g_engine.DrawFrame();
}
}
}
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp
index aa7c074..b7213dc 100644
--- a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.cpp
@@ -18,7 +18,6 @@
// TeapotRenderer.cpp
// Render a teapot
//--------------------------------------------------------------------------------
-
//--------------------------------------------------------------------------------
// Include files
//--------------------------------------------------------------------------------
@@ -40,257 +39,248 @@
//--------------------------------------------------------------------------------
// Dtor
//--------------------------------------------------------------------------------
-TeapotRenderer::~TeapotRenderer() {
- unload();
+TeapotRenderer::~TeapotRenderer()
+{
+ Unload();
}
-void TeapotRenderer::init()
+void TeapotRenderer::Init()
{
//Settings
- glFrontFace (GL_CCW);
+ glFrontFace( GL_CCW );
//Load shader
- loadShaders( &_shaderParam, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
+ LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh",
+ "Shaders/ShaderPlain.fsh" );
//Create Index buffer
- _iNumIndices = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
- glGenBuffers(1, &_ibo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ibo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER,
- sizeof( teapotIndices ) , teapotIndices,
- GL_STATIC_DRAW);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
+ glGenBuffers( 1, &ibo_ );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+ glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices,
+ GL_STATIC_DRAW );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
//Create VBO
- _iNumVertices = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
+ num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
int32_t iStride = sizeof(TEAPOT_VERTEX);
int32_t iIndex = 0;
- TEAPOT_VERTEX* p = new TEAPOT_VERTEX[_iNumVertices];
- for( int32_t i = 0; i < _iNumVertices; ++i )
+ TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];
+ for( int32_t i = 0; i < num_vertices_; ++i )
{
- p[i].fPos[0] = teapotPositions[iIndex];
- p[i].fPos[1] = teapotPositions[iIndex+1];
- p[i].fPos[2] = teapotPositions[iIndex+2];
+ p[i].pos[0] = teapotPositions[iIndex];
+ p[i].pos[1] = teapotPositions[iIndex + 1];
+ p[i].pos[2] = teapotPositions[iIndex + 2];
- p[i].fNormal[0] = teapotNormals[iIndex];
- p[i].fNormal[1] = teapotNormals[iIndex+1];
- p[i].fNormal[2] = teapotNormals[iIndex+2];
+ p[i].normal[0] = teapotNormals[iIndex];
+ p[i].normal[1] = teapotNormals[iIndex + 1];
+ p[i].normal[2] = teapotNormals[iIndex + 2];
iIndex += 3;
}
- glGenBuffers(1, &_vbo);
- glBindBuffer(GL_ARRAY_BUFFER, _vbo);
- glBufferData(GL_ARRAY_BUFFER, iStride * _iNumVertices,
- p, GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glGenBuffers( 1, &vbo_ );
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+ glBufferData( GL_ARRAY_BUFFER, iStride * num_vertices_, p, GL_STATIC_DRAW );
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
delete[] p;
- updateViewport();
- _mModel = mat4::translation(0, 0, -15.f);
+ UpdateViewport();
+ mat_model_ = ndk_helper::Mat4::Translation( 0, 0, -15.f );
- mat4 mat = mat4::rotationX(M_PI / 3);
- _mModel = mat * _mModel;
+ ndk_helper::Mat4 mat = ndk_helper::Mat4::RotationX( M_PI / 3 );
+ mat_model_ = mat * mat_model_;
}
-void TeapotRenderer::updateViewport()
+void TeapotRenderer::UpdateViewport()
{
//Init Projection matrices
int32_t viewport[4];
- glGetIntegerv(GL_VIEWPORT, viewport);
- float fAspect = (float)viewport[2] / (float)viewport[3];
+ glGetIntegerv( GL_VIEWPORT, viewport );
+ float fAspect = (float) viewport[2] / (float) viewport[3];
const float CAM_NEAR = 5.f;
const float CAM_FAR = 10000.f;
bool bRotate = false;
- _mProjection = mat4::perspective(fAspect, 1.f,
- CAM_NEAR, CAM_FAR);
+ mat_projection_ = ndk_helper::Mat4::Perspective( fAspect, 1.f, CAM_NEAR, CAM_FAR );
}
-void TeapotRenderer::unload()
+void TeapotRenderer::Unload()
{
- if (_vbo)
+ if( vbo_ )
{
- glDeleteBuffers(1, &_vbo);
- _vbo = 0;
+ glDeleteBuffers( 1, &vbo_ );
+ vbo_ = 0;
}
- if (_ibo)
+ if( ibo_ )
{
- glDeleteBuffers(1, &_ibo);
- _ibo = 0;
+ glDeleteBuffers( 1, &ibo_ );
+ ibo_ = 0;
}
- if (_shaderParam._program )
+ if( shader_param_.program_ )
{
- glDeleteProgram(_shaderParam._program);
- _shaderParam._program = 0;
+ glDeleteProgram( shader_param_.program_ );
+ shader_param_.program_ = 0;
}
}
-void TeapotRenderer::update(float fTime)
+void TeapotRenderer::Update( float fTime )
{
const float CAM_X = 0.f;
const float CAM_Y = 0.f;
const float CAM_Z = 700.f;
- _mView = mat4::lookAt(vec3(CAM_X, CAM_Y, CAM_Z),
- vec3(0.f, 0.f, 0.f), vec3(0.f, 1.f, 0.f));
+ mat_view_ = ndk_helper::Mat4::LookAt( ndk_helper::Vec3( CAM_X, CAM_Y, CAM_Z ),
+ ndk_helper::Vec3( 0.f, 0.f, 0.f ), ndk_helper::Vec3( 0.f, 1.f, 0.f ) );
- if( _camera )
+ if( camera_ )
{
- _camera->update();
- _mView = _camera->getTransformMatrix() * _mView * _camera->getRotationMatrix() * _mModel;
+ camera_->Update();
+ mat_view_ = camera_->GetTransformMatrix() * mat_view_
+ * camera_->GetRotationMatrix() * mat_model_;
}
else
{
- _mView = _mView * _mModel;
+ mat_view_ = mat_view_ * mat_model_;
}
}
-void TeapotRenderer::render()
+void TeapotRenderer::Render()
{
//
// Feed Projection and Model View matrices to the shaders
- mat4 mVP = _mProjection * _mView;
+ ndk_helper::Mat4 mat_vp = mat_projection_ * mat_view_;
// Bind the VBO
- glBindBuffer(GL_ARRAY_BUFFER, _vbo);
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
int32_t iStride = sizeof(TEAPOT_VERTEX);
// Pass the vertex data
- glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride,
- BUFFER_OFFSET( 0 ));
- glEnableVertexAttribArray(ATTRIB_VERTEX);
+ glVertexAttribPointer( ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride,
+ BUFFER_OFFSET( 0 ) );
+ glEnableVertexAttribArray( ATTRIB_VERTEX );
- glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
- BUFFER_OFFSET( 3 * sizeof(GLfloat) ));
- glEnableVertexAttribArray(ATTRIB_NORMAL);
-
+ glVertexAttribPointer( ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
+ BUFFER_OFFSET( 3 * sizeof(GLfloat) ) );
+ glEnableVertexAttribArray( ATTRIB_NORMAL );
// Bind the IB
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ibo);
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
- glUseProgram(_shaderParam._program);
+ glUseProgram( shader_param_.program_ );
- TEAPOT_MATERIALS material = {
- {1.0f, 0.5f, 0.5f},
- {1.0f, 1.0f, 1.0f, 10.f},
- {0.1f, 0.1f, 0.1f},
- };
+ TEAPOT_MATERIALS material = { { 1.0f, 0.5f, 0.5f }, { 1.0f, 1.0f, 1.0f, 10.f }, {
+ 0.1f, 0.1f, 0.1f }, };
//Update uniforms
- glUniform4f(_shaderParam._uiMaterialDiffuse,
- material.diffuse_color[0],
- material.diffuse_color[1],
- material.diffuse_color[2],
- 1.f);
+ glUniform4f( shader_param_.material_diffuse_, material.diffuse_color[0],
+ material.diffuse_color[1], material.diffuse_color[2], 1.f );
- glUniform4f(_shaderParam._uiMaterialSpecular,
- material.specular_color[0],
- material.specular_color[1],
- material.specular_color[2],
- material.specular_color[3]);
+ glUniform4f( shader_param_.material_specular_, material.specular_color[0],
+ material.specular_color[1], material.specular_color[2],
+ material.specular_color[3] );
//
//using glUniform3fv here was troublesome
//
- glUniform3f(_shaderParam._uiMaterialAmbient,
- material.ambient_color[0],
- material.ambient_color[1],
- material.ambient_color[2]);
+ glUniform3f( shader_param_.material_ambient_, material.ambient_color[0],
+ material.ambient_color[1], material.ambient_color[2] );
- glUniformMatrix4fv(_shaderParam._uiMatrixP, 1, GL_FALSE,
- mVP.ptr());
- glUniformMatrix4fv(_shaderParam._uiMatrixView, 1, GL_FALSE,
- _mView.ptr());
- glUniform3f(_shaderParam._uiLight0, 100.f, -200.f, -600.f);
+ glUniformMatrix4fv( shader_param_.matrix_projection_, 1, GL_FALSE, mat_vp.Ptr() );
+ glUniformMatrix4fv( shader_param_.matrix_view_, 1, GL_FALSE, mat_view_.Ptr() );
+ glUniform3f( shader_param_.light0_, 100.f, -200.f, -600.f );
- glDrawElements(GL_TRIANGLES, _iNumIndices, GL_UNSIGNED_SHORT,
- BUFFER_OFFSET(0));
+ glDrawElements( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0) );
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
}
-bool TeapotRenderer::loadShaders(SHADER_PARAMS* params, const char* strVsh, const char* strFsh)
+bool TeapotRenderer::LoadShaders( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh )
{
GLuint program;
- GLuint vertShader, fragShader;
- char *vertShaderPathname, *fragShaderPathname;
+ GLuint vert_shader, frag_shader;
+ char *vert_shader_pathname, *frag_shader_pathname;
// Create shader program
program = glCreateProgram();
- LOGI("Created Shader %d", program);
+ LOGI( "Created Shader %d", program );
// Create and compile vertex shader
- if (!shader::compileShader(&vertShader, GL_VERTEX_SHADER, strVsh)) {
- LOGI("Failed to compile vertex shader");
- glDeleteProgram(program);
+ if( !ndk_helper::shader::CompileShader( &vert_shader, GL_VERTEX_SHADER, strVsh ) )
+ {
+ LOGI( "Failed to compile vertex shader" );
+ glDeleteProgram( program );
return false;
}
// Create and compile fragment shader
- if (!shader::compileShader(&fragShader, GL_FRAGMENT_SHADER, strFsh)) {
- LOGI("Failed to compile fragment shader");
- glDeleteProgram(program);
+ if( !ndk_helper::shader::CompileShader( &frag_shader, GL_FRAGMENT_SHADER, strFsh ) )
+ {
+ LOGI( "Failed to compile fragment shader" );
+ glDeleteProgram( program );
return false;
}
// Attach vertex shader to program
- glAttachShader(program, vertShader);
+ glAttachShader( program, vert_shader );
// Attach fragment shader to program
- glAttachShader(program, fragShader);
+ glAttachShader( program, frag_shader );
// Bind attribute locations
// this needs to be done prior to linking
- glBindAttribLocation(program, ATTRIB_VERTEX, "myVertex");
- glBindAttribLocation(program, ATTRIB_NORMAL, "myNormal");
- glBindAttribLocation(program, ATTRIB_UV, "myUV");
+ glBindAttribLocation( program, ATTRIB_VERTEX, "myVertex" );
+ glBindAttribLocation( program, ATTRIB_NORMAL, "myNormal" );
+ glBindAttribLocation( program, ATTRIB_UV, "myUV" );
// Link program
- if (!shader::linkProgram(program)) {
- LOGI("Failed to link program: %d", program);
+ if( !ndk_helper::shader::LinkProgram( program ) )
+ {
+ LOGI( "Failed to link program: %d", program );
- if (vertShader) {
- glDeleteShader(vertShader);
- vertShader = 0;
+ if( vert_shader )
+ {
+ glDeleteShader( vert_shader );
+ vert_shader = 0;
}
- if (fragShader) {
- glDeleteShader(fragShader);
- fragShader = 0;
+ if( frag_shader )
+ {
+ glDeleteShader( frag_shader );
+ frag_shader = 0;
}
- if (program) {
- glDeleteProgram(program);
+ if( program )
+ {
+ glDeleteProgram( program );
}
return false;
}
// Get uniform locations
- params->_uiMatrixP = glGetUniformLocation(program, "uPMatrix");
- params->_uiMatrixView = glGetUniformLocation(program, "uMVMatrix");
+ params->matrix_projection_ = glGetUniformLocation( program, "uPMatrix" );
+ params->matrix_view_ = glGetUniformLocation( program, "uMVMatrix" );
- params->_uiLight0 = glGetUniformLocation(program, "vLight0");
- params->_uiMaterialDiffuse = glGetUniformLocation(program,
- "vMaterialDiffuse");
- params->_uiMaterialAmbient = glGetUniformLocation(program,
- "vMaterialAmbient");
- params->_uiMaterialSpecular = glGetUniformLocation(program,
- "vMaterialSpecular");
+ params->light0_ = glGetUniformLocation( program, "vLight0" );
+ params->material_diffuse_ = glGetUniformLocation( program, "vMaterialDiffuse" );
+ params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+ params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
// Release vertex and fragment shaders
- if (vertShader)
- glDeleteShader(vertShader);
- if (fragShader)
- glDeleteShader(fragShader);
+ if( vert_shader )
+ glDeleteShader( vert_shader );
+ if( frag_shader )
+ glDeleteShader( frag_shader );
- params->_program = program;
+ params->program_ = program;
return true;
}
-bool TeapotRenderer::bind(tapCamera* camera)
+bool TeapotRenderer::Bind( ndk_helper::TapCamera* camera )
{
- _camera = camera;
+ camera_ = camera;
return true;
}
diff --git a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h
index 7d6d646..a04f219 100644
--- a/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h
+++ b/ndk/platforms/android-17/samples/Teapot/jni/TeapotRenderer.h
@@ -43,62 +43,62 @@
#include "NDKHelper.h"
-
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
struct TEAPOT_VERTEX
{
- float fPos[3];
- float fNormal[3];
+ float pos[3];
+ float normal[3];
};
-enum SHADER_ATTRIBUTES {
+enum SHADER_ATTRIBUTES
+{
ATTRIB_VERTEX, ATTRIB_NORMAL, ATTRIB_UV,
};
struct SHADER_PARAMS
{
- GLuint _program;
- GLuint _uiLight0;
- GLuint _uiMaterialDiffuse;
- GLuint _uiMaterialAmbient;
- GLuint _uiMaterialSpecular;
+ GLuint program_;
+ GLuint light0_;
+ GLuint material_diffuse_;
+ GLuint material_ambient_;
+ GLuint material_specular_;
- GLuint _uiMatrixP;
- GLuint _uiMatrixView;
+ GLuint matrix_projection_;
+ GLuint matrix_view_;
};
struct TEAPOT_MATERIALS
{
- float diffuse_color[ 3 ];
- float specular_color[ 4 ];
- float ambient_color[ 3 ];
+ float diffuse_color[3];
+ float specular_color[4];
+ float ambient_color[3];
};
class TeapotRenderer
{
- int32_t _iNumIndices;
- int32_t _iNumVertices;
- GLuint _ibo;
- GLuint _vbo;
+ int32_t num_indices_;
+ int32_t num_vertices_;
+ GLuint ibo_;
+ GLuint vbo_;
- SHADER_PARAMS _shaderParam;
- bool loadShaders(SHADER_PARAMS* params, const char* strVsh, const char* strFsh);
+ SHADER_PARAMS shader_param_;
+ bool LoadShaders( SHADER_PARAMS* params, const char* strVsh, const char* strFsh );
- mat4 _mProjection;
- mat4 _mView;
- mat4 _mModel;
+ ndk_helper::Mat4 mat_projection_;
+ ndk_helper::Mat4 mat_view_;
+ ndk_helper::Mat4 mat_model_;
- tapCamera* _camera;
+ ndk_helper::TapCamera* camera_;
public:
TeapotRenderer();
virtual ~TeapotRenderer();
- void init();
- void render();
- void update(float dTime);
- bool bind(tapCamera* camera);
- void unload();
- void updateViewport();
+ void Init();
+ void Render();
+ void Update( float dTime );
+ bool Bind( ndk_helper::TapCamera* camera );
+ void Unload();
+ void UpdateViewport();
};
#endif
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java
index 47f4b66..3385a5d 100644
--- a/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/helper/NDKHelper.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.sample.helper;
import java.io.File;
@@ -10,35 +26,39 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
+import android.media.AudioManager;
+import android.media.AudioTrack;
import android.opengl.GLUtils;
import android.util.Log;
-
-public class NDKHelper {
+public class NDKHelper
+{
private static Context context;
- public static void setCotext( Context c )
+ public static void setContext(Context c)
{
- Log.i("NDKHelper", "set context:" + c);
+ Log.i("NDKHelper", "setContext:" + c);
context = c;
}
//
- //Load Bitmap
- //Java helper is useful decoding PNG, TIFF etc rather than linking libPng etc separately
+ // Load Bitmap
+ // Java helper is useful decoding PNG, TIFF etc rather than linking libPng
+ // etc separately
//
private int nextPOT(int i)
{
int pot = 1;
- while( pot < i ) pot <<= 1;
+ while (pot < i)
+ pot <<= 1;
return pot;
}
private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight)
{
- if(bitmapToScale == null)
+ if (bitmapToScale == null)
return null;
- //get the original width and height
+ // get the original width and height
int width = bitmapToScale.getWidth();
int height = bitmapToScale.getHeight();
// create a matrix for the manipulation
@@ -48,10 +68,11 @@
matrix.postScale(newWidth / width, newHeight / height);
// recreate the new Bitmap and set it back
- return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true);
+ return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(),
+ bitmapToScale.getHeight(), matrix, true);
}
- public void loadTexture(String path)
+ public boolean loadTexture(String path)
{
Bitmap bitmap = null;
try
@@ -63,31 +84,33 @@
}
File file = new File(context.getExternalFilesDir(null), str);
- if( file.canRead() )
+ if (file.canRead())
{
bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
- }
- else
+ } else
{
- bitmap = BitmapFactory.decodeStream(context.getResources().getAssets().open(path));
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
}
- // Matrix matrix = new Matrix();
- // // resize the bit map
- // matrix.postScale(-1F, 1F);
+ // Matrix matrix = new Matrix();
+ // // resize the bit map
+ // matrix.postScale(-1F, 1F);
//
- // // recreate the new Bitmap and set it back
- // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
+ // // recreate the new Bitmap and set it back
+ // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
+ // bitmap.getHeight(), matrix, true);
- }
- catch (Exception e) {
+ } catch (Exception e)
+ {
Log.w("NDKHelper", "Coundn't load a file:" + path);
+ return false;
}
- if( bitmap != null )
+ if (bitmap != null)
{
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
}
- return;
+ return true;
}
@@ -96,30 +119,38 @@
Bitmap bitmap = null;
try
{
- bitmap = BitmapFactory.decodeStream(context.getResources().getAssets().open(path));
- if( iScalePOT )
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
+ if (iScalePOT)
{
int originalWidth = getBitmapWidth(bitmap);
int originalHeight = getBitmapHeight(bitmap);
int width = nextPOT(originalWidth);
int height = nextPOT(originalHeight);
- if( originalWidth != width || originalHeight != height )
+ if (originalWidth != width || originalHeight != height)
{
- //Scale it
- bitmap = scaleBitmap( bitmap, width, height );
+ // Scale it
+ bitmap = scaleBitmap(bitmap, width, height);
}
}
- }
- catch (Exception e) {
+ } catch (Exception e)
+ {
Log.w("NDKHelper", "Coundn't load a file:" + path);
}
return bitmap;
}
- public int getBitmapWidth(Bitmap bmp) { return bmp.getWidth(); }
- public int getBitmapHeight(Bitmap bmp) { return bmp.getHeight(); }
+ public int getBitmapWidth(Bitmap bmp)
+ {
+ return bmp.getWidth();
+ }
+
+ public int getBitmapHeight(Bitmap bmp)
+ {
+ return bmp.getHeight();
+ }
public void getBitmapPixels(Bitmap bmp, int[] pixels)
{
@@ -133,15 +164,40 @@
bmp.recycle();
}
- public static String getNativeLibraryDirectory(Context appContext) {
+ public static String getNativeLibraryDirectory(Context appContext)
+ {
ApplicationInfo ai = context.getApplicationInfo();
- Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir );
+ Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir);
- if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 ||
- (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
+ || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
+ {
return ai.nativeLibraryDir;
}
return "/system/lib/";
}
+
+ public int getNativeAudioBufferSize()
+ {
+ int SDK_INT = android.os.Build.VERSION.SDK_INT;
+ if (SDK_INT >= 17)
+ {
+ AudioManager am = (AudioManager) context
+ .getSystemService(Context.AUDIO_SERVICE);
+ String framesPerBuffer = am
+ .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
+ return Integer.parseInt(framesPerBuffer);
+ } else
+ {
+ return 0;
+ }
+ }
+
+ public int getNativeAudioSampleRate()
+ {
+ return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
+
+ }
+
}
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java
index 4a80b6e..3b24bc4 100644
--- a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotApplication.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.sample.teapot;
import javax.microedition.khronos.opengles.GL10;
diff --git a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java
index 033beeb..f6a2e33 100644
--- a/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java
+++ b/ndk/platforms/android-17/samples/Teapot/src/com/sample/teapot/TeapotNativeActivity.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.sample.teapot;
import android.app.NativeActivity;
@@ -32,7 +48,6 @@
}
}
-
// Our popup window, you will call it from your C/C++ code later
TeapotNativeActivity _activity;
@@ -72,6 +87,15 @@
}});
}
+ protected void onPause()
+ {
+ super.onPause();
+ if (_popupWindow != null) {
+ _popupWindow.dismiss();
+ _popupWindow = null;
+ }
+ }
+
public void updateFPS(final float fFPS)
{
if( _label == null )
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml b/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml
index b5c0473..ae0bc3d 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml
+++ b/ndk/platforms/android-18/samples/MoreTeapots/AndroidManifest.xml
@@ -24,7 +24,7 @@
android:configChanges="orientation|keyboardHidden">
<!-- Tell NativeActivity the name of or .so -->
<meta-data android:name="android.app.lib_name"
- android:value="NativeActivity" />
+ android:value="MoreTeapotsNativeActivity" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk b/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk
index 651a2cf..cb0faf7 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/Android.mk
@@ -2,7 +2,7 @@
include $(CLEAR_VARS)
-LOCAL_MODULE := NativeActivity
+LOCAL_MODULE := MoreTeapotsNativeActivity
LOCAL_SRC_FILES := MoreTeapotsNativeActivity.cpp \
MoreTeapotsRenderer.cpp \
@@ -10,10 +10,10 @@
LOCAL_CFLAGS :=
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv2
-LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue helper
+LOCAL_STATIC_LIBRARIES := cpufeatures android_native_app_glue ndk_helper
include $(BUILD_SHARED_LIBRARY)
-$(call import-module,android/helper)
+$(call import-module,android/ndk_helper)
$(call import-module,android/native_app_glue)
-$(call import-module,android/cpufeatures)
\ No newline at end of file
+$(call import-module,android/cpufeatures)
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp
index 3202a92..d5f215a 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsNativeActivity.cpp
@@ -32,6 +32,13 @@
#include "MoreTeapotsRenderer.h"
+//-------------------------------------------------------------------------
+//Preprocessor
+//-------------------------------------------------------------------------
+#define HELPER_CLASS_NAME "com/sample/helper/NDKHelper" //Class name of helper function
+//-------------------------------------------------------------------------
+//Constants
+//-------------------------------------------------------------------------
const int32_t NUM_TEAPOTS_X = 8;
const int32_t NUM_TEAPOTS_Y = 8;
const int32_t NUM_TEAPOTS_Z = 6;
@@ -40,128 +47,132 @@
//Shared state for our app.
//-------------------------------------------------------------------------
struct android_app;
-class engine {
- MoreTeapotsRenderer _renderer;
+class Engine
+{
+ MoreTeapotsRenderer renderer_;
- GLContext* _glContext;
+ ndk_helper::GLContext* gl_context_;
- bool _bInitializedResources;
- bool _bHasFocus;
+ bool initialized_resources_;
+ bool has_focus_;
- DoubletapDetector _doubletapDetector;
- PinchDetector _pinchDetector;
- DragDetector _dragDetector;
- perfMonitor _monitor;
+ ndk_helper::DoubletapDetector doubletap_detector_;
+ ndk_helper::PinchDetector pinch_detector_;
+ ndk_helper::DragDetector drag_detector_;
+ ndk_helper::PerfMonitor monitor_;
- tapCamera _tapCamera;
+ ndk_helper::TapCamera tap_camera_;
- android_app* _app;
+ android_app* app_;
- ASensorManager* _sensorManager;
- const ASensor* _accelerometerSensor;
- ASensorEventQueue* _sensorEventQueue;
+ ASensorManager* sensor_manager_;
+ const ASensor* accelerometer_sensor_;
+ ASensorEventQueue* sensor_event_queue_;
- void updateFPS(float fFPS);
- void showUI();
- void transformPosition( vec2& vec );
+ void UpdateFPS( float fps );
+ void ShowUI();
+ void TransformPosition( ndk_helper::Vec2& vec );
public:
- static void handleCmd(struct android_app* app, int32_t cmd);
- static int32_t handleInput( android_app* app, AInputEvent* event );
+ static void HandleCmd( struct android_app* app,
+ int32_t cmd );
+ static int32_t HandleInput( android_app* app,
+ AInputEvent* event );
- engine();
- ~engine();
- void setState(android_app* state);
- int initDisplay();
- void loadResources();
- void unloadResources();
- void drawFrame();
- void termDisplay();
- void trimMemory();
- bool isReady();
+ Engine();
+ ~Engine();
+ void SetState( android_app* state );
+ int InitDisplay();
+ void LoadResources();
+ void UnloadResources();
+ void DrawFrame();
+ void TermDisplay();
+ void TrimMemory();
+ bool IsReady();
- void updatePosition( AInputEvent* event, int32_t iIndex, float& fX, float& fY);
+ void UpdatePosition( AInputEvent* event,
+ int32_t index,
+ float& x,
+ float& y );
- void initSensors();
- void processSensors( int32_t id );
- void suspendSensors();
- void resumeSensors();
+ void InitSensors();
+ void ProcessSensors( int32_t id );
+ void SuspendSensors();
+ void ResumeSensors();
};
//-------------------------------------------------------------------------
//Ctor
//-------------------------------------------------------------------------
-engine::engine() :
- _bInitializedResources( false ),
- _bHasFocus( false ),
- _app( NULL ),
- _sensorManager( NULL ),
- _accelerometerSensor( NULL ),
- _sensorEventQueue( NULL )
+Engine::Engine() :
+ initialized_resources_( false ),
+ has_focus_( false ),
+ app_( NULL ),
+ sensor_manager_( NULL ),
+ accelerometer_sensor_( NULL ),
+ sensor_event_queue_( NULL )
{
- _glContext = GLContext::getInstance();
+ gl_context_ = ndk_helper::GLContext::GetInstance();
}
//-------------------------------------------------------------------------
//Dtor
//-------------------------------------------------------------------------
-engine::~engine()
+Engine::~Engine()
{
}
/**
* Load resources
*/
-void engine::loadResources()
+void Engine::LoadResources()
{
- _renderer.init(NUM_TEAPOTS_X, NUM_TEAPOTS_Y, NUM_TEAPOTS_Z);
- _renderer.bind(&_tapCamera);
+ renderer_.Init( NUM_TEAPOTS_X, NUM_TEAPOTS_Y, NUM_TEAPOTS_Z );
+ renderer_.Bind( &tap_camera_ );
}
/**
* Unload resources
*/
-void engine::unloadResources()
+void Engine::UnloadResources()
{
- _renderer.unload();
+ renderer_.Unload();
}
/**
* Initialize an EGL context for the current display.
*/
-int engine::initDisplay()
+int Engine::InitDisplay()
{
- if( !_bInitializedResources )
+ if( !initialized_resources_ )
{
- _glContext->init( _app->window );
- loadResources();
- _bInitializedResources = true;
+ gl_context_->Init( app_->window );
+ LoadResources();
+ initialized_resources_ = true;
}
else
{
// initialize OpenGL ES and EGL
- if( EGL_SUCCESS != _glContext->resume( _app->window ) )
+ if( EGL_SUCCESS != gl_context_->Resume( app_->window ) )
{
- unloadResources();
- loadResources();
+ UnloadResources();
+ LoadResources();
}
}
- showUI();
+ ShowUI();
// Initialize GL state.
- glEnable(GL_CULL_FACE);
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LEQUAL);
+ glEnable( GL_CULL_FACE );
+ glEnable( GL_DEPTH_TEST );
+ glDepthFunc( GL_LEQUAL );
//Note that screen size might have been changed
- glViewport(0, 0,
- _glContext->getScreenWidth(),
- _glContext->getScreenHeight() );
- _renderer.updateViewport();
+ glViewport( 0, 0, gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() );
+ renderer_.UpdateViewport();
- _tapCamera.setFlip(1.f, -1.f, -1.f);
- _tapCamera.setPinchTransformFactor(10.f, 10.f, 8.f);
+ tap_camera_.SetFlip( 1.f, -1.f, -1.f );
+ tap_camera_.SetPinchTransformFactor( 10.f, 10.f, 8.f );
return 0;
}
@@ -169,108 +180,109 @@
/**
* Just the current frame in the display.
*/
-void engine::drawFrame()
+void Engine::DrawFrame()
{
- float fFPS;
- if( _monitor.update(fFPS) )
+ float fps;
+ if( monitor_.Update( fps ) )
{
- updateFPS( fFPS );
+ UpdateFPS( fps );
}
- double dTime = _monitor.getCurrentTime();
- _renderer.update(dTime);
+ double dTime = monitor_.GetCurrentTime();
+ renderer_.Update( dTime );
// Just fill the screen with a color.
- glClearColor(0.5f, 0.5f, 0.5f, 1.f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- _renderer.render();
+ glClearColor( 0.5f, 0.5f, 0.5f, 1.f );
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ renderer_.Render();
// Swap
- if( EGL_SUCCESS != _glContext->swap() )
+ if( EGL_SUCCESS != gl_context_->Swap() )
{
- unloadResources();
- loadResources();
+ UnloadResources();
+ LoadResources();
}
}
/**
* Tear down the EGL context currently associated with the display.
*/
-void engine::termDisplay()
+void Engine::TermDisplay()
{
- _glContext->suspend();
+ gl_context_->Suspend();
}
-void engine::trimMemory()
+void Engine::TrimMemory()
{
LOGI( "Trimming memory" );
- _glContext->invalidate();
+ gl_context_->Invalidate();
}
/**
* Process the next input event.
*/
-int32_t engine::handleInput( android_app* app, AInputEvent* event )
+int32_t Engine::HandleInput( android_app* app,
+ AInputEvent* event )
{
- engine* eng = (engine*)app->userData;
- if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION)
+ Engine* eng = (Engine*) app->userData;
+ if( AInputEvent_getType( event ) == AINPUT_EVENT_TYPE_MOTION )
{
- GESTURE_STATE doubleTapState = eng->_doubletapDetector.detect(event);
- GESTURE_STATE dragState = eng->_dragDetector.detect(event);
- GESTURE_STATE pinchState = eng->_pinchDetector.detect(event);
+ ndk_helper::GESTURE_STATE doubleTapState = eng->doubletap_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE dragState = eng->drag_detector_.Detect( event );
+ ndk_helper::GESTURE_STATE pinchState = eng->pinch_detector_.Detect( event );
//Double tap detector has a priority over other detectors
- if( doubleTapState == GESTURE_STATE_ACTION )
- {
- //Detect double tap
- eng->_tapCamera.reset(true);
- }
- else
- {
- //Handle drag state
- if( dragState & GESTURE_STATE_START )
- {
- //Otherwise, start dragging
- vec2 v;
- eng->_dragDetector.getPointer( v );
- eng->transformPosition( v );
- eng->_tapCamera.beginDrag( v );
- }
- else if( dragState & GESTURE_STATE_MOVE )
- {
- vec2 v;
- eng->_dragDetector.getPointer( v );
- eng->transformPosition( v );
- eng->_tapCamera.drag( v );
- }
- else if( dragState & GESTURE_STATE_END )
- {
- eng->_tapCamera.endDrag();
- }
+ if( doubleTapState == ndk_helper::GESTURE_STATE_ACTION )
+ {
+ //Detect double tap
+ eng->tap_camera_.Reset( true );
+ }
+ else
+ {
+ //Handle drag state
+ if( dragState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Otherwise, start dragging
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.BeginDrag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ ndk_helper::Vec2 v;
+ eng->drag_detector_.GetPointer( v );
+ eng->TransformPosition( v );
+ eng->tap_camera_.Drag( v );
+ }
+ else if( dragState & ndk_helper::GESTURE_STATE_END )
+ {
+ eng->tap_camera_.EndDrag();
+ }
- //Handle pinch state
- if( pinchState & GESTURE_STATE_START )
- {
- //Start new pinch
- vec2 v1;
- vec2 v2;
- eng->_pinchDetector.getPointers( v1, v2 );
- eng->transformPosition( v1 );
- eng->transformPosition( v2 );
- eng->_tapCamera.beginPinch( v1, v2 );
- }
- else if( pinchState & GESTURE_STATE_MOVE )
- {
- //Multi touch
- //Start new pinch
- vec2 v1;
- vec2 v2;
- eng->_pinchDetector.getPointers( v1, v2 );
- eng->transformPosition( v1 );
- eng->transformPosition( v2 );
- eng->_tapCamera.pinch( v1, v2 );
- }
- }
- return 1;
+ //Handle pinch state
+ if( pinchState & ndk_helper::GESTURE_STATE_START )
+ {
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.BeginPinch( v1, v2 );
+ }
+ else if( pinchState & ndk_helper::GESTURE_STATE_MOVE )
+ {
+ //Multi touch
+ //Start new pinch
+ ndk_helper::Vec2 v1;
+ ndk_helper::Vec2 v2;
+ eng->pinch_detector_.GetPointers( v1, v2 );
+ eng->TransformPosition( v1 );
+ eng->TransformPosition( v2 );
+ eng->tap_camera_.Pinch( v1, v2 );
+ }
+ }
+ return 1;
}
return 0;
}
@@ -278,176 +290,180 @@
/**
* Process the next main command.
*/
-void engine::handleCmd(struct android_app* app, int32_t cmd)
+void Engine::HandleCmd( struct android_app* app,
+ int32_t cmd )
{
- engine* eng = (engine*)app->userData;
- switch (cmd) {
- case APP_CMD_SAVE_STATE:
- break;
- case APP_CMD_INIT_WINDOW:
- // The window is being shown, get it ready.
- if (app->window != NULL) {
- eng->initDisplay();
- eng->drawFrame();
- }
- break;
- case APP_CMD_TERM_WINDOW:
- // The window is being hidden or closed, clean it up.
- eng->termDisplay();
- eng->_bHasFocus = false;
- break;
- case APP_CMD_STOP:
- break;
- case APP_CMD_GAINED_FOCUS:
- eng->resumeSensors();
- //Start animation
- eng->_bHasFocus = true;
- break;
- case APP_CMD_LOST_FOCUS:
- eng->suspendSensors();
- // Also stop animating.
- eng->_bHasFocus = false;
- eng->drawFrame();
- break;
- case APP_CMD_LOW_MEMORY:
- //Free up GL resources
- eng->trimMemory();
- break;
+ Engine* eng = (Engine*) app->userData;
+ switch( cmd )
+ {
+ case APP_CMD_SAVE_STATE:
+ break;
+ case APP_CMD_INIT_WINDOW:
+ // The window is being shown, get it ready.
+ if( app->window != NULL )
+ {
+ eng->InitDisplay();
+ eng->DrawFrame();
+ }
+ break;
+ case APP_CMD_TERM_WINDOW:
+ // The window is being hidden or closed, clean it up.
+ eng->TermDisplay();
+ eng->has_focus_ = false;
+ break;
+ case APP_CMD_STOP:
+ break;
+ case APP_CMD_GAINED_FOCUS:
+ eng->ResumeSensors();
+ //Start animation
+ eng->has_focus_ = true;
+ break;
+ case APP_CMD_LOST_FOCUS:
+ eng->SuspendSensors();
+ // Also stop animating.
+ eng->has_focus_ = false;
+ eng->DrawFrame();
+ break;
+ case APP_CMD_LOW_MEMORY:
+ //Free up GL resources
+ eng->TrimMemory();
+ break;
}
}
//-------------------------------------------------------------------------
//Sensor handlers
//-------------------------------------------------------------------------
-void engine::initSensors()
+void Engine::InitSensors()
{
- _sensorManager = ASensorManager_getInstance();
- _accelerometerSensor = ASensorManager_getDefaultSensor( _sensorManager,
- ASENSOR_TYPE_ACCELEROMETER);
- _sensorEventQueue = ASensorManager_createEventQueue( _sensorManager,
- _app->looper, LOOPER_ID_USER, NULL, NULL);
+ sensor_manager_ = ASensorManager_getInstance();
+ accelerometer_sensor_ = ASensorManager_getDefaultSensor( sensor_manager_,
+ ASENSOR_TYPE_ACCELEROMETER );
+ sensor_event_queue_ = ASensorManager_createEventQueue( sensor_manager_, app_->looper,
+ LOOPER_ID_USER, NULL, NULL );
}
-void engine::processSensors( int32_t id )
+void Engine::ProcessSensors( int32_t id )
{
// If a sensor has data, process it now.
if( id == LOOPER_ID_USER )
{
- if (_accelerometerSensor != NULL)
+ if( accelerometer_sensor_ != NULL )
{
ASensorEvent event;
- while (ASensorEventQueue_getEvents(_sensorEventQueue,
- &event, 1) > 0)
+ while( ASensorEventQueue_getEvents( sensor_event_queue_, &event, 1 ) > 0 )
{
}
}
}
}
-void engine::resumeSensors()
+void Engine::ResumeSensors()
{
// When our app gains focus, we start monitoring the accelerometer.
- if (_accelerometerSensor != NULL) {
- ASensorEventQueue_enableSensor(_sensorEventQueue,
- _accelerometerSensor);
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_enableSensor( sensor_event_queue_, accelerometer_sensor_ );
// We'd like to get 60 events per second (in us).
- ASensorEventQueue_setEventRate(_sensorEventQueue,
- _accelerometerSensor, (1000L/60)*1000);
+ ASensorEventQueue_setEventRate( sensor_event_queue_, accelerometer_sensor_,
+ (1000L / 60) * 1000 );
}
}
-void engine::suspendSensors()
+void Engine::SuspendSensors()
{
// When our app loses focus, we stop monitoring the accelerometer.
// This is to avoid consuming battery while not being used.
- if (_accelerometerSensor != NULL) {
- ASensorEventQueue_disableSensor(_sensorEventQueue,
- _accelerometerSensor);
+ if( accelerometer_sensor_ != NULL )
+ {
+ ASensorEventQueue_disableSensor( sensor_event_queue_, accelerometer_sensor_ );
}
}
-
//-------------------------------------------------------------------------
//Misc
//-------------------------------------------------------------------------
-void engine::setState(android_app* state)
+void Engine::SetState( android_app* state )
{
- _app = state;
- _doubletapDetector.setConfiguration( _app->config );
- _dragDetector.setConfiguration( _app->config );
- _pinchDetector.setConfiguration( _app->config );
+ app_ = state;
+ doubletap_detector_.SetConfiguration( app_->config );
+ drag_detector_.SetConfiguration( app_->config );
+ pinch_detector_.SetConfiguration( app_->config );
}
-bool engine::isReady()
+bool Engine::IsReady()
{
- if( _bHasFocus )
+ if( has_focus_ )
return true;
return false;
}
-void engine::transformPosition( vec2& vec )
+void Engine::TransformPosition( ndk_helper::Vec2& vec )
{
- vec = vec2( 2.0f, 2.0f ) * vec / vec2( _glContext->getScreenWidth(), _glContext->getScreenHeight() ) - vec2( 1.f, 1.f );
+ vec = ndk_helper::Vec2( 2.0f, 2.0f ) * vec
+ / ndk_helper::Vec2( gl_context_->GetScreenWidth(), gl_context_->GetScreenHeight() )
+ - ndk_helper::Vec2( 1.f, 1.f );
}
-void engine::showUI()
+void Engine::ShowUI()
{
JNIEnv *jni;
- _app->activity->vm->AttachCurrentThread(&jni, NULL);
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
//Default class retrieval
- jclass clazz = jni->GetObjectClass( _app->activity->clazz );
- jmethodID methodID = jni->GetMethodID(clazz, "showUI", "()V" );
- jni->CallVoidMethod( _app->activity->clazz, methodID );
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "showUI", "()V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID );
- _app->activity->vm->DetachCurrentThread();
+ app_->activity->vm->DetachCurrentThread();
return;
}
-void engine::updateFPS(float fFPS)
+void Engine::UpdateFPS( float fps )
{
JNIEnv *jni;
- _app->activity->vm->AttachCurrentThread(&jni, NULL);
+ app_->activity->vm->AttachCurrentThread( &jni, NULL );
//Default class retrieval
- jclass clazz = jni->GetObjectClass(_app->activity->clazz);
- jmethodID methodID = jni->GetMethodID(clazz, "updateFPS", "(F)V");
- jni->CallVoidMethod(_app->activity->clazz, methodID, fFPS);
+ jclass clazz = jni->GetObjectClass( app_->activity->clazz );
+ jmethodID methodID = jni->GetMethodID( clazz, "updateFPS", "(F)V" );
+ jni->CallVoidMethod( app_->activity->clazz, methodID, fps );
- _app->activity->vm->DetachCurrentThread();
+ app_->activity->vm->DetachCurrentThread();
return;
}
-engine g_engine;
+Engine g_engine;
/**
* This is the main entry point of a native application that is using
* android_native_app_glue. It runs in its own thread, with its own
* event loop for receiving input events and doing other things.
*/
-void android_main(android_app* state)
+void android_main( android_app* state )
{
app_dummy();
- g_engine.setState( state );
+ g_engine.SetState( state );
//Init helper functions
- JNIHelper::init( state->activity );
+ ndk_helper::JNIHelper::GetInstance()->Init( state->activity, HELPER_CLASS_NAME );
state->userData = &g_engine;
- state->onAppCmd = engine::handleCmd;
- state->onInputEvent = engine::handleInput;
+ state->onAppCmd = Engine::HandleCmd;
+ state->onInputEvent = Engine::HandleInput;
#ifdef USE_NDK_PROFILER
- monstartup("libNativeActivity.so");
+ monstartup("libMoreTeapotsNativeActivity.so");
#endif
// Prepare to monitor accelerometer
- g_engine.initSensors();
+ g_engine.InitSensors();
// loop waiting for stuff to do.
- while (1) {
+ while( 1 )
+ {
// Read all pending events.
int id;
int events;
@@ -456,28 +472,28 @@
// If not animating, we will block forever waiting for events.
// If animating, we loop until all events are read, then continue
// to draw the next frame of animation.
- while ((id = ALooper_pollAll( g_engine.isReady() ? 0 : -1, NULL, &events,
- (void**)&source) ) >= 0)
+ while( (id = ALooper_pollAll( g_engine.IsReady() ? 0 : -1, NULL, &events, (void**) &source ))
+ >= 0 )
{
// Process this event.
- if (source != NULL)
- source->process(state, source);
+ if( source != NULL )
+ source->process( state, source );
- g_engine.processSensors( id );
+ g_engine.ProcessSensors( id );
// Check if we are exiting.
- if (state->destroyRequested != 0)
+ if( state->destroyRequested != 0 )
{
- g_engine.termDisplay();
+ g_engine.TermDisplay();
return;
}
}
- if( g_engine.isReady() )
+ if( g_engine.IsReady() )
{
// Drawing is throttled to the screen update rate, so there
// is no need to do timing here.
- g_engine.drawFrame();
+ g_engine.DrawFrame();
}
}
}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp
index 4a4fb2c..4adf4ed 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.cpp
@@ -18,7 +18,6 @@
// MoreTeapotsRenderer.cpp
// Render teapots
//--------------------------------------------------------------------------------
-
//--------------------------------------------------------------------------------
// Include files
//--------------------------------------------------------------------------------
@@ -32,7 +31,8 @@
//--------------------------------------------------------------------------------
// Ctor
//--------------------------------------------------------------------------------
-MoreTeapotsRenderer::MoreTeapotsRenderer() : _bGeometryInstancingSupport( false )
+MoreTeapotsRenderer::MoreTeapotsRenderer() :
+ geometry_instancing_support_( false )
{
}
@@ -40,21 +40,25 @@
//--------------------------------------------------------------------------------
// Dtor
//--------------------------------------------------------------------------------
-MoreTeapotsRenderer::~MoreTeapotsRenderer() {
- unload();
+MoreTeapotsRenderer::~MoreTeapotsRenderer()
+{
+ Unload();
}
//--------------------------------------------------------------------------------
// Init
//--------------------------------------------------------------------------------
-void MoreTeapotsRenderer::init( const int32_t numX, const int32_t numY, const int32_t numZ )
+void MoreTeapotsRenderer::Init( const int32_t numX,
+ const int32_t numY,
+ const int32_t numZ )
{
- if( GLContext::getInstance()->getGLVersion() >= 3.0 )
+ if( ndk_helper::GLContext::GetInstance()->GetGLVersion() >= 3.0 )
{
- _bGeometryInstancingSupport = true;
+ geometry_instancing_support_ = true;
}
- else if( GLContext::getInstance()->checkExtension("GL_NV_draw_instanced")
- && GLContext::getInstance()->checkExtension("GL_NV_uniform_buffer_object") )
+ else if( ndk_helper::GLContext::GetInstance()->CheckExtension( "GL_NV_draw_instanced" )
+ && ndk_helper::GLContext::GetInstance()->CheckExtension(
+ "GL_NV_uniform_buffer_object" ) )
{
LOGI( "Supported via extension!" );
//_bGeometryInstancingSupport = true;
@@ -63,92 +67,87 @@
}
//Settings
- glFrontFace (GL_CCW);
+ glFrontFace( GL_CCW );
//Create Index buffer
- _iNumIndices = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
- glGenBuffers(1, &_ibo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ibo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER,
- sizeof( teapotIndices ) , teapotIndices,
- GL_STATIC_DRAW);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ num_indices_ = sizeof(teapotIndices) / sizeof(teapotIndices[0]);
+ glGenBuffers( 1, &ibo_ );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
+ glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(teapotIndices), teapotIndices, GL_STATIC_DRAW );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
//Create VBO
- _iNumVertices = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
+ num_vertices_ = sizeof(teapotPositions) / sizeof(teapotPositions[0]) / 3;
int32_t iStride = sizeof(TEAPOT_VERTEX);
int32_t iIndex = 0;
- TEAPOT_VERTEX* p = new TEAPOT_VERTEX[_iNumVertices];
- for( int32_t i = 0; i < _iNumVertices; ++i )
+ TEAPOT_VERTEX* p = new TEAPOT_VERTEX[num_vertices_];
+ for( int32_t i = 0; i < num_vertices_; ++i )
{
- p[i].fPos[0] = teapotPositions[iIndex];
- p[i].fPos[1] = teapotPositions[iIndex+1];
- p[i].fPos[2] = teapotPositions[iIndex+2];
+ p[i].pos[0] = teapotPositions[iIndex];
+ p[i].pos[1] = teapotPositions[iIndex + 1];
+ p[i].pos[2] = teapotPositions[iIndex + 2];
- p[i].fNormal[0] = teapotNormals[iIndex];
- p[i].fNormal[1] = teapotNormals[iIndex+1];
- p[i].fNormal[2] = teapotNormals[iIndex+2];
+ p[i].normal[0] = teapotNormals[iIndex];
+ p[i].normal[1] = teapotNormals[iIndex + 1];
+ p[i].normal[2] = teapotNormals[iIndex + 2];
iIndex += 3;
}
- glGenBuffers(1, &_vbo);
- glBindBuffer(GL_ARRAY_BUFFER, _vbo);
- glBufferData(GL_ARRAY_BUFFER, iStride * _iNumVertices,
- p, GL_STATIC_DRAW);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glGenBuffers( 1, &vbo_ );
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
+ glBufferData( GL_ARRAY_BUFFER, iStride * num_vertices_, p, GL_STATIC_DRAW );
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
delete[] p;
//Init Projection matrices
- _iX = numX;
- _iY = numY;
- _iZ = numZ;
- _mModels.reserve( _iX * _iY * _iZ );
+ teapot_x_ = numX;
+ teapot_y_ = numY;
+ teapot_z_ = numZ;
+ vec_mat_models_.reserve( teapot_x_ * teapot_y_ * teapot_z_ );
- updateViewport();
+ UpdateViewport();
- float fTotalWidth = 500.f;
- float fGapX = fTotalWidth / (_iX - 1);
- float fGapY = fTotalWidth / (_iY - 1);
- float fGapZ = fTotalWidth / (_iZ - 1);
- float fOffsetX = -fTotalWidth/ 2.f;
- float fOffsetY = -fTotalWidth/ 2.f;
- float fOffsetZ = -fTotalWidth/ 2.f;
+ const float total_width = 500.f;
+ float gap_x = total_width / (teapot_x_ - 1);
+ float gap_y = total_width / (teapot_y_ - 1);
+ float gap_z = total_width / (teapot_z_ - 1);
+ float offset_x = -total_width / 2.f;
+ float offset_y = -total_width / 2.f;
+ float offset_z = -total_width / 2.f;
- for( int32_t iX = 0; iX < _iX; ++iX )
- for( int32_t iY = 0; iY < _iY; ++iY )
- for( int32_t iZ = 0; iZ < _iZ; ++iZ )
+ for( int32_t iX = 0; iX < teapot_x_; ++iX )
+ for( int32_t iY = 0; iY < teapot_y_; ++iY )
+ for( int32_t iZ = 0; iZ < teapot_z_; ++iZ )
{
- _mModels.push_back( mat4::translation( iX * fGapX + fOffsetX,
- iY * fGapY + fOffsetY,
- iZ * fGapZ + fOffsetZ) );
- _mColors.push_back(
- vec3( random() / float(RAND_MAX * 1.1),
- random() / float(RAND_MAX * 1.1),
- random() / float(RAND_MAX * 1.1)
- ) );
+ vec_mat_models_.push_back(
+ ndk_helper::Mat4::Translation( iX * gap_x + offset_x, iY * gap_y + offset_y,
+ iZ * gap_z + offset_z ) );
+ vec_colors_.push_back(
+ ndk_helper::Vec3( random() / float( RAND_MAX * 1.1 ),
+ random() / float( RAND_MAX * 1.1 ),
+ random() / float( RAND_MAX * 1.1 ) ) );
- float fX = random() / float(RAND_MAX) - 0.5f;
- float fY = random() / float(RAND_MAX) - 0.5f;
- _mVecRotation.push_back(
- vec2( fX * 0.05f, fY * 0.05f ) );
- _mCurrentRotation.push_back(
- vec2( fX * M_PI, fY * M_PI ) );
+ float fX = random() / float( RAND_MAX ) - 0.5f;
+ float fY = random() / float( RAND_MAX ) - 0.5f;
+ vec_rotations_.push_back( ndk_helper::Vec2( fX * 0.05f, fY * 0.05f ) );
+ vec_current_rotations_.push_back( ndk_helper::Vec2( fX * M_PI, fY * M_PI ) );
}
- if( _bGeometryInstancingSupport )
+ if( geometry_instancing_support_ )
{
//
//Create parameter dictionary for shader patch
- std::map< std::string, std::string> param;
- param[ std::string( "%NUM_TEAPOT%" ) ] = toString( _iX * _iY * _iZ );
- param[ std::string( "%LOCATION_VERTEX%" ) ] = toString( ATTRIB_VERTEX );
- param[ std::string( "%LOCATION_NORMAL%" ) ] = toString( ATTRIB_NORMAL );
- if( _bARBSupport )
- param[ std::string( "%ARB%" ) ] = std::string( "ARB" );
+ std::map<std::string, std::string> param;
+ param[std::string( "%NUM_TEAPOT%" )] = ToString( teapot_x_ * teapot_y_ * teapot_z_ );
+ param[std::string( "%LOCATION_VERTEX%" )] = ToString( ATTRIB_VERTEX );
+ param[std::string( "%LOCATION_NORMAL%" )] = ToString( ATTRIB_NORMAL );
+ if( arb_support_ )
+ param[std::string( "%ARB%" )] = std::string( "ARB" );
else
- param[ std::string( "%ARB%" ) ] = std::string( "" );
+ param[std::string( "%ARB%" )] = std::string( "" );
//Load shader
- bool b = loadShadersES3( &_shaderParam, "Shaders/VS_ShaderPlainES3.vsh", "Shaders/ShaderPlainES3.fsh", param );
+ bool b = LoadShadersES3( &shader_param_, "Shaders/VS_ShaderPlainES3.vsh",
+ "Shaders/ShaderPlainES3.fsh", param );
if( b )
{
//
@@ -156,235 +155,226 @@
//
GLuint bindingPoint = 1;
GLuint blockIndex;
- blockIndex = glGetUniformBlockIndex( _shaderParam._program, "ParamBlock" );
- glUniformBlockBinding( _shaderParam._program, blockIndex, bindingPoint );
+ blockIndex = glGetUniformBlockIndex( shader_param_.program_, "ParamBlock" );
+ glUniformBlockBinding( shader_param_.program_, blockIndex, bindingPoint );
//Retrieve array stride value
int32_t iNumIndices;
- glGetActiveUniformBlockiv( _shaderParam._program, blockIndex,
+ glGetActiveUniformBlockiv( shader_param_.program_, blockIndex,
GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS, &iNumIndices );
GLint i[iNumIndices];
GLint stride[iNumIndices];
- glGetActiveUniformBlockiv( _shaderParam._program, blockIndex,
+ glGetActiveUniformBlockiv( shader_param_.program_, blockIndex,
GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, i );
- glGetActiveUniformsiv( _shaderParam._program, iNumIndices, (GLuint*)i, GL_UNIFORM_ARRAY_STRIDE, stride );
+ glGetActiveUniformsiv( shader_param_.program_, iNumIndices, (GLuint*) i,
+ GL_UNIFORM_ARRAY_STRIDE, stride );
- _uboMatrixStride = stride[ 0 ] / sizeof(float);
- _uboVectorStride = stride[ 2 ] / sizeof(float);
+ ubo_matrix_stride_ = stride[0] / sizeof(float);
+ ubo_vector_stride_ = stride[2] / sizeof(float);
- glGenBuffers(1, &_ubo);
- glBindBuffer(GL_UNIFORM_BUFFER, _ubo);
- glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, _ubo);
+ glGenBuffers( 1, &ubo_ );
+ glBindBuffer( GL_UNIFORM_BUFFER, ubo_ );
+ glBindBufferBase( GL_UNIFORM_BUFFER, bindingPoint, ubo_ );
//Store color value which wouldn't be updated every frame
- int32_t iSize = _iX * _iY * _iZ *
- (_uboMatrixStride+_uboMatrixStride+_uboVectorStride); //mat4 + mat4 + vec3 + 1 stride
+ int32_t iSize = teapot_x_ * teapot_y_ * teapot_z_
+ * (ubo_matrix_stride_ + ubo_matrix_stride_ + ubo_vector_stride_); //Mat4 + Mat4 + Vec3 + 1 stride
float* pBuffer = new float[iSize];
- float* pColor = pBuffer + _iX * _iY * _iZ * _uboMatrixStride*2;
- for( int32_t i = 0; i < _iX * _iY * _iZ; ++i )
+ float* pColor = pBuffer + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_ * 2;
+ for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
{
- memcpy(pColor, &_mColors[ i ], 3 * sizeof(float));
- pColor += _uboVectorStride; //Assuming std140 layout which is 4 DWORD stride for vectors
+ memcpy( pColor, &vec_colors_[i], 3 * sizeof(float) );
+ pColor += ubo_vector_stride_; //Assuming std140 layout which is 4 DWORD stride for vectors
}
- glBufferData(GL_UNIFORM_BUFFER, iSize * sizeof(float), pBuffer, GL_DYNAMIC_DRAW);
+ glBufferData( GL_UNIFORM_BUFFER, iSize * sizeof(float), pBuffer, GL_DYNAMIC_DRAW );
delete[] pBuffer;
}
else
{
- LOGI("Shader compilation failed!! Falls back to ES2.0 pass"); //This happens some devices.
- _bGeometryInstancingSupport = false;
+ LOGI( "Shader compilation failed!! Falls back to ES2.0 pass" );
+ //This happens some devices.
+ geometry_instancing_support_ = false;
//Load shader for GLES2.0
- loadShaders( &_shaderParam, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
+ LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
}
}
else
{
//Load shader for GLES2.0
- loadShaders( &_shaderParam, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
+ LoadShaders( &shader_param_, "Shaders/VS_ShaderPlain.vsh", "Shaders/ShaderPlain.fsh" );
}
}
-void MoreTeapotsRenderer::updateViewport()
+void MoreTeapotsRenderer::UpdateViewport()
{
int32_t viewport[4];
- glGetIntegerv(GL_VIEWPORT, viewport);
- float fAspect = (float)viewport[2] / (float)viewport[3];
+ glGetIntegerv( GL_VIEWPORT, viewport );
+ float fAspect = (float) viewport[2] / (float) viewport[3];
const float CAM_NEAR = 5.f;
const float CAM_FAR = 10000.f;
bool bRotate = false;
- _mProjection = mat4::perspective(fAspect, 1.f,
- CAM_NEAR, CAM_FAR);
+ mat_projection_ = ndk_helper::Mat4::Perspective( fAspect, 1.f, CAM_NEAR, CAM_FAR );
}
//--------------------------------------------------------------------------------
// Unload
//--------------------------------------------------------------------------------
-void MoreTeapotsRenderer::unload()
+void MoreTeapotsRenderer::Unload()
{
- if (_vbo)
+ if( vbo_ )
{
- glDeleteBuffers(1, &_vbo);
- _vbo = 0;
+ glDeleteBuffers( 1, &vbo_ );
+ vbo_ = 0;
}
- if (_ubo)
+ if( ubo_ )
{
- glDeleteBuffers(1, &_ubo);
- _ubo = 0;
+ glDeleteBuffers( 1, &ubo_ );
+ ubo_ = 0;
}
- if (_ibo)
+ if( ibo_ )
{
- glDeleteBuffers(1, &_ibo);
- _ibo = 0;
+ glDeleteBuffers( 1, &ibo_ );
+ ibo_ = 0;
}
- if (_shaderParam._program )
+ if( shader_param_.program_ )
{
- glDeleteProgram(_shaderParam._program);
- _shaderParam._program = 0;
+ glDeleteProgram( shader_param_.program_ );
+ shader_param_.program_ = 0;
}
}
//--------------------------------------------------------------------------------
// Update
//--------------------------------------------------------------------------------
-void MoreTeapotsRenderer::update(float fTime)
+void MoreTeapotsRenderer::Update( float fTime )
{
const float CAM_X = 0.f;
const float CAM_Y = 0.f;
const float CAM_Z = 2000.f;
- _mView = mat4::lookAt(vec3(CAM_X, CAM_Y, CAM_Z),
- vec3(0.f, 0.f, 0.f), vec3(0.f, 1.f, 0.f));
+ mat_view_ = ndk_helper::Mat4::LookAt( ndk_helper::Vec3( CAM_X, CAM_Y, CAM_Z ),
+ ndk_helper::Vec3( 0.f, 0.f, 0.f ), ndk_helper::Vec3( 0.f, 1.f, 0.f ) );
- if( _camera )
+ if( camera_ )
{
- _camera->update();
- _mView = _camera->getTransformMatrix() * _mView * _camera->getRotationMatrix();
+ camera_->Update();
+ mat_view_ = camera_->GetTransformMatrix() * mat_view_ * camera_->GetRotationMatrix();
}
}
//--------------------------------------------------------------------------------
// Render
//--------------------------------------------------------------------------------
-void MoreTeapotsRenderer::render()
+void MoreTeapotsRenderer::Render()
{
-
// Bind the VBO
- glBindBuffer(GL_ARRAY_BUFFER, _vbo);
+ glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
int32_t iStride = sizeof(TEAPOT_VERTEX);
// Pass the vertex data
- glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride,
- BUFFER_OFFSET( 0 ));
- glEnableVertexAttribArray(ATTRIB_VERTEX);
+ glVertexAttribPointer( ATTRIB_VERTEX, 3, GL_FLOAT, GL_FALSE, iStride, BUFFER_OFFSET( 0 ) );
+ glEnableVertexAttribArray( ATTRIB_VERTEX );
- glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
- BUFFER_OFFSET( 3 * sizeof(GLfloat) ));
- glEnableVertexAttribArray(ATTRIB_NORMAL);
+ glVertexAttribPointer( ATTRIB_NORMAL, 3, GL_FLOAT, GL_FALSE, iStride,
+ BUFFER_OFFSET( 3 * sizeof(GLfloat) ) );
+ glEnableVertexAttribArray( ATTRIB_NORMAL );
// Bind the IB
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ibo);
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, ibo_ );
- glUseProgram(_shaderParam._program);
+ glUseProgram( shader_param_.program_ );
- TEAPOT_MATERIALS material = {
- {1.0f, 1.0f, 1.0f, 10.f},
- {0.1f, 0.1f, 0.1f},
- };
+ TEAPOT_MATERIALS material = { { 1.0f, 1.0f, 1.0f, 10.f }, { 0.1f, 0.1f, 0.1f }, };
//Update uniforms
//
//using glUniform3fv here was troublesome..
//
- glUniform4f(_shaderParam._uiMaterialSpecular,
- material.specular_color[0],
- material.specular_color[1],
- material.specular_color[2],
- material.specular_color[3]);
- glUniform3f(_shaderParam._uiMaterialAmbient,
- material.ambient_color[0],
- material.ambient_color[1],
- material.ambient_color[2]);
+ glUniform4f( shader_param_.material_specular_, material.specular_color[0],
+ material.specular_color[1], material.specular_color[2], material.specular_color[3] );
+ glUniform3f( shader_param_.material_ambient_, material.ambient_color[0],
+ material.ambient_color[1], material.ambient_color[2] );
- glUniform3f(_shaderParam._uiLight0, 100.f, -200.f, -600.f);
+ glUniform3f( shader_param_.light0_, 100.f, -200.f, -600.f );
- if( _bGeometryInstancingSupport )
+ if( geometry_instancing_support_ )
{
//
//Geometry instancing, new feature in GLES3.0
//
//Update UBO
- glBindBuffer(GL_UNIFORM_BUFFER, _ubo);
- float* p = (float*)glMapBufferRange(GL_UNIFORM_BUFFER,
- 0, _iX * _iY * _iZ * (_uboMatrixStride * 2) * sizeof(float),
- GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT);
+ glBindBuffer( GL_UNIFORM_BUFFER, ubo_ );
+ float* p = (float*) glMapBufferRange( GL_UNIFORM_BUFFER, 0,
+ teapot_x_ * teapot_y_ * teapot_z_ * (ubo_matrix_stride_ * 2) * sizeof(float),
+ GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT );
float* pMVPMat = p;
- float* pMVMat = p + _iX * _iY * _iZ * _uboMatrixStride;
- for( int32_t i = 0; i < _iX * _iY * _iZ; ++i )
+ float* pMVMat = p + teapot_x_ * teapot_y_ * teapot_z_ * ubo_matrix_stride_;
+ for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
{
//Rotation
float fX, fY;
- _mCurrentRotation[ i ] += _mVecRotation[ i ];
- _mCurrentRotation[ i ].value( fX, fY );
- mat4 mRotation = mat4::rotationX( fX ) * mat4::rotationY( fY );
+ vec_current_rotations_[i] += vec_rotations_[i];
+ vec_current_rotations_[i].Value( fX, fY );
+ ndk_helper::Mat4 mat_rotation = ndk_helper::Mat4::RotationX( fX )
+ * ndk_helper::Mat4::RotationY( fY );
// Feed Projection and Model View matrices to the shaders
- mat4 mV = _mView * _mModels[ i ] * mRotation;
- mat4 mVP = _mProjection * mV;
+ ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;
+ ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;
- memcpy(pMVPMat, mVP.ptr(), sizeof(mV) );
- pMVPMat += _uboMatrixStride;
+ memcpy( pMVPMat, mat_vp.Ptr(), sizeof(mat_v) );
+ pMVPMat += ubo_matrix_stride_;
- memcpy(pMVMat, mV.ptr(), sizeof(mV) );
- pMVMat += _uboMatrixStride;
+ memcpy( pMVMat, mat_v.Ptr(), sizeof(mat_v) );
+ pMVMat += ubo_matrix_stride_;
}
- glUnmapBuffer(GL_UNIFORM_BUFFER);
+ glUnmapBuffer( GL_UNIFORM_BUFFER );
//Instanced rendering
- glDrawElementsInstanced(GL_TRIANGLES, _iNumIndices, GL_UNSIGNED_SHORT,
- BUFFER_OFFSET(0), _iX * _iY * _iZ);
+ glDrawElementsInstanced( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0),
+ teapot_x_ * teapot_y_ * teapot_z_ );
}
else
{
//Regular rendering pass
- for( int32_t i = 0; i < _iX * _iY * _iZ; ++i )
+ for( int32_t i = 0; i < teapot_x_ * teapot_y_ * teapot_z_; ++i )
{
//Set diffuse
- float fX, fY, fZ;
- _mColors[ i ].value( fX, fY, fZ );
- glUniform4f(_shaderParam._uiMaterialDiffuse, fX, fY, fZ,
- 1.f);
+ float x, y, z;
+ vec_colors_[i].Value( x, y, z );
+ glUniform4f( shader_param_.material_diffuse_, x, y, z, 1.f );
//Rotation
- _mCurrentRotation[ i ] += _mVecRotation[ i ];
- _mCurrentRotation[ i ].value( fX, fY );
- mat4 mRotation = mat4::rotationX( fX ) * mat4::rotationY( fY );
+ vec_current_rotations_[i] += vec_rotations_[i];
+ vec_current_rotations_[i].Value( x, y );
+ ndk_helper::Mat4 mat_rotation = ndk_helper::Mat4::RotationX( x )
+ * ndk_helper::Mat4::RotationY( y );
// Feed Projection and Model View matrices to the shaders
- mat4 mV = _mView * _mModels[ i ] * mRotation;
- mat4 mVP = _mProjection * mV;
- glUniformMatrix4fv(_shaderParam._uiMatrixP, 1, GL_FALSE,
- mVP.ptr());
- glUniformMatrix4fv(_shaderParam._uiMatrixView, 1, GL_FALSE,
- mV.ptr());
+ ndk_helper::Mat4 mat_v = mat_view_ * vec_mat_models_[i] * mat_rotation;
+ ndk_helper::Mat4 mat_vp = mat_projection_ * mat_v;
+ glUniformMatrix4fv( shader_param_.matrix_projection_, 1, GL_FALSE, mat_vp.Ptr() );
+ glUniformMatrix4fv( shader_param_.matrix_view_, 1, GL_FALSE, mat_v.Ptr() );
- glDrawElements(GL_TRIANGLES, _iNumIndices, GL_UNSIGNED_SHORT,
- BUFFER_OFFSET(0));
+ glDrawElements( GL_TRIANGLES, num_indices_, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0) );
}
}
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ glBindBuffer( GL_ARRAY_BUFFER, 0 );
+ glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );
}
//--------------------------------------------------------------------------------
// LoadShaders
//--------------------------------------------------------------------------------
-bool MoreTeapotsRenderer::loadShaders(SHADER_PARAMS* params, const char* strVsh, const char* strFsh)
+bool MoreTeapotsRenderer::LoadShaders( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh )
{
//
//Shader load for GLES2
@@ -396,75 +386,79 @@
// Create shader program
program = glCreateProgram();
- LOGI("Created Shader %d", program);
+ LOGI( "Created Shader %d", program );
// Create and compile vertex shader
- if (!shader::compileShader(&vertShader, GL_VERTEX_SHADER, strVsh)) {
- LOGI("Failed to compile vertex shader");
- glDeleteProgram(program);
+ if( !ndk_helper::shader::CompileShader( &vertShader, GL_VERTEX_SHADER, strVsh ) )
+ {
+ LOGI( "Failed to compile vertex shader" );
+ glDeleteProgram( program );
return false;
}
// Create and compile fragment shader
- if (!shader::compileShader(&fragShader, GL_FRAGMENT_SHADER, strFsh)) {
- LOGI("Failed to compile fragment shader");
- glDeleteProgram(program);
+ if( !ndk_helper::shader::CompileShader( &fragShader, GL_FRAGMENT_SHADER, strFsh ) )
+ {
+ LOGI( "Failed to compile fragment shader" );
+ glDeleteProgram( program );
return false;
}
// Attach vertex shader to program
- glAttachShader(program, vertShader);
+ glAttachShader( program, vertShader );
// Attach fragment shader to program
- glAttachShader(program, fragShader);
+ glAttachShader( program, fragShader );
// Bind attribute locations
// this needs to be done prior to linking
- glBindAttribLocation(program, ATTRIB_VERTEX, "myVertex");
- glBindAttribLocation(program, ATTRIB_NORMAL, "myNormal");
+ glBindAttribLocation( program, ATTRIB_VERTEX, "myVertex" );
+ glBindAttribLocation( program, ATTRIB_NORMAL, "myNormal" );
// Link program
- if (!shader::linkProgram(program)) {
- LOGI("Failed to link program: %d", program);
+ if( !ndk_helper::shader::LinkProgram( program ) )
+ {
+ LOGI( "Failed to link program: %d", program );
- if (vertShader) {
- glDeleteShader(vertShader);
+ if( vertShader )
+ {
+ glDeleteShader( vertShader );
vertShader = 0;
}
- if (fragShader) {
- glDeleteShader(fragShader);
+ if( fragShader )
+ {
+ glDeleteShader( fragShader );
fragShader = 0;
}
- if (program) {
- glDeleteProgram(program);
+ if( program )
+ {
+ glDeleteProgram( program );
}
return false;
}
// Get uniform locations
- params->_uiMatrixP = glGetUniformLocation(program, "uPMatrix");
- params->_uiMatrixView = glGetUniformLocation(program, "uMVMatrix");
+ params->matrix_projection_ = glGetUniformLocation( program, "uPMatrix" );
+ params->matrix_view_ = glGetUniformLocation( program, "uMVMatrix" );
- params->_uiLight0 = glGetUniformLocation(program, "vLight0");
- params->_uiMaterialDiffuse = glGetUniformLocation(program,
- "vMaterialDiffuse");
- params->_uiMaterialAmbient = glGetUniformLocation(program,
- "vMaterialAmbient");
- params->_uiMaterialSpecular = glGetUniformLocation(program,
- "vMaterialSpecular");
+ params->light0_ = glGetUniformLocation( program, "vLight0" );
+ params->material_diffuse_ = glGetUniformLocation( program, "vMaterialDiffuse" );
+ params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+ params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
// Release vertex and fragment shaders
- if (vertShader)
- glDeleteShader(vertShader);
- if (fragShader)
- glDeleteShader(fragShader);
+ if( vertShader )
+ glDeleteShader( vertShader );
+ if( fragShader )
+ glDeleteShader( fragShader );
- params->_program = program;
+ params->program_ = program;
return true;
}
-bool MoreTeapotsRenderer::loadShadersES3(SHADER_PARAMS* params,
- const char* strVsh, const char* strFsh,
+bool MoreTeapotsRenderer::LoadShadersES3( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh,
std::map<std::string, std::string>&shaderParams )
{
//
@@ -477,80 +471,85 @@
// Create shader program
program = glCreateProgram();
- LOGI("Created Shader %d", program);
+ LOGI( "Created Shader %d", program );
// Create and compile vertex shader
- if (!shader::compileShader(&vertShader, GL_VERTEX_SHADER, strVsh, shaderParams)) {
- LOGI("Failed to compile vertex shader");
- glDeleteProgram(program);
+ if( !ndk_helper::shader::CompileShader( &vertShader, GL_VERTEX_SHADER, strVsh, shaderParams ) )
+ {
+ LOGI( "Failed to compile vertex shader" );
+ glDeleteProgram( program );
return false;
}
// Create and compile fragment shader
- if (!shader::compileShader(&fragShader, GL_FRAGMENT_SHADER, strFsh, shaderParams)) {
- LOGI("Failed to compile fragment shader");
- glDeleteProgram(program);
+ if( !ndk_helper::shader::CompileShader( &fragShader, GL_FRAGMENT_SHADER, strFsh,
+ shaderParams ) )
+ {
+ LOGI( "Failed to compile fragment shader" );
+ glDeleteProgram( program );
return false;
}
// Attach vertex shader to program
- glAttachShader(program, vertShader);
+ glAttachShader( program, vertShader );
// Attach fragment shader to program
- glAttachShader(program, fragShader);
+ glAttachShader( program, fragShader );
// Link program
- if (!shader::linkProgram(program)) {
- LOGI("Failed to link program: %d", program);
+ if( !ndk_helper::shader::LinkProgram( program ) )
+ {
+ LOGI( "Failed to link program: %d", program );
- if (vertShader) {
- glDeleteShader(vertShader);
+ if( vertShader )
+ {
+ glDeleteShader( vertShader );
vertShader = 0;
}
- if (fragShader) {
- glDeleteShader(fragShader);
+ if( fragShader )
+ {
+ glDeleteShader( fragShader );
fragShader = 0;
}
- if (program) {
- glDeleteProgram(program);
+ if( program )
+ {
+ glDeleteProgram( program );
}
return false;
}
// Get uniform locations
- params->_uiLight0 = glGetUniformLocation(program, "vLight0");
- params->_uiMaterialAmbient = glGetUniformLocation(program,
- "vMaterialAmbient");
- params->_uiMaterialSpecular = glGetUniformLocation(program,
- "vMaterialSpecular");
+ params->light0_ = glGetUniformLocation( program, "vLight0" );
+ params->material_ambient_ = glGetUniformLocation( program, "vMaterialAmbient" );
+ params->material_specular_ = glGetUniformLocation( program, "vMaterialSpecular" );
// Release vertex and fragment shaders
- if (vertShader)
- glDeleteShader(vertShader);
- if (fragShader)
- glDeleteShader(fragShader);
+ if( vertShader )
+ glDeleteShader( vertShader );
+ if( fragShader )
+ glDeleteShader( fragShader );
- params->_program = program;
+ params->program_ = program;
return true;
}
//--------------------------------------------------------------------------------
// Bind
//--------------------------------------------------------------------------------
-bool MoreTeapotsRenderer::bind(tapCamera* camera)
+bool MoreTeapotsRenderer::Bind( ndk_helper::TapCamera* camera )
{
- _camera = camera;
+ camera_ = camera;
return true;
}
//--------------------------------------------------------------------------------
// Helper functions
//--------------------------------------------------------------------------------
-std::string MoreTeapotsRenderer::toString( const int32_t i )
+std::string MoreTeapotsRenderer::ToString( const int32_t i )
{
char str[64];
- snprintf( str, sizeof( str ), "%d", i );
+ snprintf( str, sizeof(str), "%d", i );
return std::string( str );
}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h
index 1cc8aa7..346d873 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h
+++ b/ndk/platforms/android-18/samples/MoreTeapots/jni/MoreTeapotsRenderer.h
@@ -47,74 +47,79 @@
struct TEAPOT_VERTEX
{
- float fPos[3];
- float fNormal[3];
+ float pos[3];
+ float normal[3];
};
-enum SHADER_ATTRIBUTES {
+enum SHADER_ATTRIBUTES
+{
ATTRIB_VERTEX, ATTRIB_NORMAL, ATTRIB_COLOR, ATTRIB_UV
};
struct SHADER_PARAMS
{
- GLuint _program;
- GLuint _uiLight0;
- GLuint _uiMaterialDiffuse;
- GLuint _uiMaterialAmbient;
- GLuint _uiMaterialSpecular;
+ GLuint program_;
+ GLuint light0_;
+ GLuint material_diffuse_;
+ GLuint material_ambient_;
+ GLuint material_specular_;
- GLuint _uiMatrixP;
- GLuint _uiMatrixView;
+ GLuint matrix_projection_;
+ GLuint matrix_view_;
};
struct TEAPOT_MATERIALS
{
- float specular_color[ 4 ];
- float ambient_color[ 3 ];
+ float specular_color[4];
+ float ambient_color[3];
};
class MoreTeapotsRenderer
{
- int32_t _iNumIndices;
- int32_t _iNumVertices;
- GLuint _ibo;
- GLuint _vbo;
- GLuint _ubo;
+ int32_t num_indices_;
+ int32_t num_vertices_;
+ GLuint ibo_;
+ GLuint vbo_;
+ GLuint ubo_;
- SHADER_PARAMS _shaderParam;
- bool loadShaders(SHADER_PARAMS* params, const char* strVsh, const char* strFsh);
- bool loadShadersES3(SHADER_PARAMS* params,
- const char* strVsh, const char* strFsh,
+ SHADER_PARAMS shader_param_;
+ bool LoadShaders( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh );
+ bool LoadShadersES3( SHADER_PARAMS* params,
+ const char* strVsh,
+ const char* strFsh,
std::map<std::string, std::string>&shaderParameters );
+ ndk_helper::Mat4 mat_projection_;
+ ndk_helper::Mat4 mat_view_;
+ std::vector<ndk_helper::Mat4> vec_mat_models_;
+ std::vector<ndk_helper::Vec3> vec_colors_;
+ std::vector<ndk_helper::Vec2> vec_rotations_;
+ std::vector<ndk_helper::Vec2> vec_current_rotations_;
- mat4 _mProjection;
- mat4 _mView;
- std::vector<mat4> _mModels;
- std::vector<vec3> _mColors;
- std::vector<vec2> _mVecRotation;
- std::vector<vec2> _mCurrentRotation;
+ ndk_helper::TapCamera* camera_;
- tapCamera* _camera;
+ int32_t teapot_x_;
+ int32_t teapot_y_;
+ int32_t teapot_z_;
+ int32_t ubo_matrix_stride_;
+ int32_t ubo_vector_stride_;
+ bool geometry_instancing_support_;
+ bool arb_support_;
- int32_t _iX;
- int32_t _iY;
- int32_t _iZ;
- int32_t _uboMatrixStride;
- int32_t _uboVectorStride;
- bool _bGeometryInstancingSupport;
- bool _bARBSupport;
-
- std::string toString( const int32_t i );
+ std::string ToString( const int32_t i );
public:
MoreTeapotsRenderer();
virtual ~MoreTeapotsRenderer();
- void init( const int32_t numX, const int32_t numY, const int32_t numZ );
- void render();
- void update(float dTime);
- bool bind(tapCamera* camera);
- void unload();
- void updateViewport();
+ void Init( const int32_t numX,
+ const int32_t numY,
+ const int32_t numZ );
+ void Render();
+ void Update( float dTime );
+ bool Bind( ndk_helper::TapCamera* camera );
+ void Unload();
+ void UpdateViewport();
};
#endif
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java
index 47f4b66..c864e72 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/helper/NDKHelper.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.sample.helper;
import java.io.File;
@@ -10,35 +26,39 @@
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
+import android.media.AudioManager;
+import android.media.AudioTrack;
import android.opengl.GLUtils;
import android.util.Log;
-
-public class NDKHelper {
+public class NDKHelper
+{
private static Context context;
- public static void setCotext( Context c )
+ public static void setContext(Context c)
{
- Log.i("NDKHelper", "set context:" + c);
+ Log.i("NDKHelper", "setContext:" + c);
context = c;
}
//
- //Load Bitmap
- //Java helper is useful decoding PNG, TIFF etc rather than linking libPng etc separately
+ // Load Bitmap
+ // Java helper is useful decoding PNG, TIFF etc rather than linking libPng
+ // etc separately
//
private int nextPOT(int i)
{
int pot = 1;
- while( pot < i ) pot <<= 1;
+ while (pot < i)
+ pot <<= 1;
return pot;
}
private Bitmap scaleBitmap(Bitmap bitmapToScale, float newWidth, float newHeight)
{
- if(bitmapToScale == null)
+ if (bitmapToScale == null)
return null;
- //get the original width and height
+ // get the original width and height
int width = bitmapToScale.getWidth();
int height = bitmapToScale.getHeight();
// create a matrix for the manipulation
@@ -48,10 +68,11 @@
matrix.postScale(newWidth / width, newHeight / height);
// recreate the new Bitmap and set it back
- return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(), bitmapToScale.getHeight(), matrix, true);
+ return Bitmap.createBitmap(bitmapToScale, 0, 0, bitmapToScale.getWidth(),
+ bitmapToScale.getHeight(), matrix, true);
}
- public void loadTexture(String path)
+ public boolean loadTexture(String path)
{
Bitmap bitmap = null;
try
@@ -63,31 +84,33 @@
}
File file = new File(context.getExternalFilesDir(null), str);
- if( file.canRead() )
+ if (file.canRead())
{
bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
- }
- else
+ } else
{
- bitmap = BitmapFactory.decodeStream(context.getResources().getAssets().open(path));
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
}
- // Matrix matrix = new Matrix();
- // // resize the bit map
- // matrix.postScale(-1F, 1F);
+ // Matrix matrix = new Matrix();
+ // // resize the bit map
+ // matrix.postScale(-1F, 1F);
//
- // // recreate the new Bitmap and set it back
- // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
+ // // recreate the new Bitmap and set it back
+ // bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
+ // bitmap.getHeight(), matrix, true);
- }
- catch (Exception e) {
+ } catch (Exception e)
+ {
Log.w("NDKHelper", "Coundn't load a file:" + path);
+ return false;
}
- if( bitmap != null )
+ if (bitmap != null)
{
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
}
- return;
+ return true;
}
@@ -96,30 +119,38 @@
Bitmap bitmap = null;
try
{
- bitmap = BitmapFactory.decodeStream(context.getResources().getAssets().open(path));
- if( iScalePOT )
+ bitmap = BitmapFactory.decodeStream(context.getResources().getAssets()
+ .open(path));
+ if (iScalePOT)
{
int originalWidth = getBitmapWidth(bitmap);
int originalHeight = getBitmapHeight(bitmap);
int width = nextPOT(originalWidth);
int height = nextPOT(originalHeight);
- if( originalWidth != width || originalHeight != height )
+ if (originalWidth != width || originalHeight != height)
{
- //Scale it
- bitmap = scaleBitmap( bitmap, width, height );
+ // Scale it
+ bitmap = scaleBitmap(bitmap, width, height);
}
}
- }
- catch (Exception e) {
+ } catch (Exception e)
+ {
Log.w("NDKHelper", "Coundn't load a file:" + path);
}
return bitmap;
}
- public int getBitmapWidth(Bitmap bmp) { return bmp.getWidth(); }
- public int getBitmapHeight(Bitmap bmp) { return bmp.getHeight(); }
+ public int getBitmapWidth(Bitmap bmp)
+ {
+ return bmp.getWidth();
+ }
+
+ public int getBitmapHeight(Bitmap bmp)
+ {
+ return bmp.getHeight();
+ }
public void getBitmapPixels(Bitmap bmp, int[] pixels)
{
@@ -133,15 +164,39 @@
bmp.recycle();
}
- public static String getNativeLibraryDirectory(Context appContext) {
+ public static String getNativeLibraryDirectory(Context appContext)
+ {
ApplicationInfo ai = context.getApplicationInfo();
- Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir );
+ Log.w("NDKHelper", "ai.nativeLibraryDir:" + ai.nativeLibraryDir);
- if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 ||
- (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
+ || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
+ {
return ai.nativeLibraryDir;
}
return "/system/lib/";
}
+
+ public int getNativeAudioBufferSize()
+ {
+ int SDK_INT = android.os.Build.VERSION.SDK_INT;
+ if (SDK_INT >= 17)
+ {
+ AudioManager am = (AudioManager) context
+ .getSystemService(Context.AUDIO_SERVICE);
+ String framesPerBuffer = am
+ .getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
+ return Integer.parseInt(framesPerBuffer);
+ } else
+ {
+ return 0;
+ }
+ }
+
+ public int getNativeAudioSampleRate()
+ {
+ return AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_SYSTEM);
+
+ }
}
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java
index 4eed7ce..b37d75a 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsApplication.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.sample.moreteapots;
import javax.microedition.khronos.opengles.GL10;
@@ -20,7 +36,7 @@
private static Context context;
public void onCreate(){
context=getApplicationContext();
- NDKHelper.setCotext(context);
+ NDKHelper.setContext(context);
Log.w("native-activity", "onCreate");
final PackageManager pm = getApplicationContext().getPackageManager();
diff --git a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java
index 5b22232..7f8248a 100644
--- a/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java
+++ b/ndk/platforms/android-18/samples/MoreTeapots/src/com/sample/moreteapots/MoreTeapotsNativeActivity.java
@@ -1,3 +1,19 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
package com.sample.moreteapots;
import android.app.NativeActivity;
@@ -39,7 +55,6 @@
_popupWindow = null;
}
}
-
// Our popup window, you will call it from your C/C++ code later
MoreTeapotsNativeActivity _activity;
diff --git a/ndk/platforms/android-19/include/android/keycodes.h b/ndk/platforms/android-19/include/android/keycodes.h
new file mode 100644
index 0000000..1ca1332
--- /dev/null
+++ b/ndk/platforms/android-19/include/android/keycodes.h
@@ -0,0 +1,278 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _ANDROID_KEYCODES_H
+#define _ANDROID_KEYCODES_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Key codes.
+ */
+enum {
+ AKEYCODE_UNKNOWN = 0,
+ AKEYCODE_SOFT_LEFT = 1,
+ AKEYCODE_SOFT_RIGHT = 2,
+ AKEYCODE_HOME = 3,
+ AKEYCODE_BACK = 4,
+ AKEYCODE_CALL = 5,
+ AKEYCODE_ENDCALL = 6,
+ AKEYCODE_0 = 7,
+ AKEYCODE_1 = 8,
+ AKEYCODE_2 = 9,
+ AKEYCODE_3 = 10,
+ AKEYCODE_4 = 11,
+ AKEYCODE_5 = 12,
+ AKEYCODE_6 = 13,
+ AKEYCODE_7 = 14,
+ AKEYCODE_8 = 15,
+ AKEYCODE_9 = 16,
+ AKEYCODE_STAR = 17,
+ AKEYCODE_POUND = 18,
+ AKEYCODE_DPAD_UP = 19,
+ AKEYCODE_DPAD_DOWN = 20,
+ AKEYCODE_DPAD_LEFT = 21,
+ AKEYCODE_DPAD_RIGHT = 22,
+ AKEYCODE_DPAD_CENTER = 23,
+ AKEYCODE_VOLUME_UP = 24,
+ AKEYCODE_VOLUME_DOWN = 25,
+ AKEYCODE_POWER = 26,
+ AKEYCODE_CAMERA = 27,
+ AKEYCODE_CLEAR = 28,
+ AKEYCODE_A = 29,
+ AKEYCODE_B = 30,
+ AKEYCODE_C = 31,
+ AKEYCODE_D = 32,
+ AKEYCODE_E = 33,
+ AKEYCODE_F = 34,
+ AKEYCODE_G = 35,
+ AKEYCODE_H = 36,
+ AKEYCODE_I = 37,
+ AKEYCODE_J = 38,
+ AKEYCODE_K = 39,
+ AKEYCODE_L = 40,
+ AKEYCODE_M = 41,
+ AKEYCODE_N = 42,
+ AKEYCODE_O = 43,
+ AKEYCODE_P = 44,
+ AKEYCODE_Q = 45,
+ AKEYCODE_R = 46,
+ AKEYCODE_S = 47,
+ AKEYCODE_T = 48,
+ AKEYCODE_U = 49,
+ AKEYCODE_V = 50,
+ AKEYCODE_W = 51,
+ AKEYCODE_X = 52,
+ AKEYCODE_Y = 53,
+ AKEYCODE_Z = 54,
+ AKEYCODE_COMMA = 55,
+ AKEYCODE_PERIOD = 56,
+ AKEYCODE_ALT_LEFT = 57,
+ AKEYCODE_ALT_RIGHT = 58,
+ AKEYCODE_SHIFT_LEFT = 59,
+ AKEYCODE_SHIFT_RIGHT = 60,
+ AKEYCODE_TAB = 61,
+ AKEYCODE_SPACE = 62,
+ AKEYCODE_SYM = 63,
+ AKEYCODE_EXPLORER = 64,
+ AKEYCODE_ENVELOPE = 65,
+ AKEYCODE_ENTER = 66,
+ AKEYCODE_DEL = 67,
+ AKEYCODE_GRAVE = 68,
+ AKEYCODE_MINUS = 69,
+ AKEYCODE_EQUALS = 70,
+ AKEYCODE_LEFT_BRACKET = 71,
+ AKEYCODE_RIGHT_BRACKET = 72,
+ AKEYCODE_BACKSLASH = 73,
+ AKEYCODE_SEMICOLON = 74,
+ AKEYCODE_APOSTROPHE = 75,
+ AKEYCODE_SLASH = 76,
+ AKEYCODE_AT = 77,
+ AKEYCODE_NUM = 78,
+ AKEYCODE_HEADSETHOOK = 79,
+ AKEYCODE_FOCUS = 80, // *Camera* focus
+ AKEYCODE_PLUS = 81,
+ AKEYCODE_MENU = 82,
+ AKEYCODE_NOTIFICATION = 83,
+ AKEYCODE_SEARCH = 84,
+ AKEYCODE_MEDIA_PLAY_PAUSE= 85,
+ AKEYCODE_MEDIA_STOP = 86,
+ AKEYCODE_MEDIA_NEXT = 87,
+ AKEYCODE_MEDIA_PREVIOUS = 88,
+ AKEYCODE_MEDIA_REWIND = 89,
+ AKEYCODE_MEDIA_FAST_FORWARD = 90,
+ AKEYCODE_MUTE = 91,
+ AKEYCODE_PAGE_UP = 92,
+ AKEYCODE_PAGE_DOWN = 93,
+ AKEYCODE_PICTSYMBOLS = 94,
+ AKEYCODE_SWITCH_CHARSET = 95,
+ AKEYCODE_BUTTON_A = 96,
+ AKEYCODE_BUTTON_B = 97,
+ AKEYCODE_BUTTON_C = 98,
+ AKEYCODE_BUTTON_X = 99,
+ AKEYCODE_BUTTON_Y = 100,
+ AKEYCODE_BUTTON_Z = 101,
+ AKEYCODE_BUTTON_L1 = 102,
+ AKEYCODE_BUTTON_R1 = 103,
+ AKEYCODE_BUTTON_L2 = 104,
+ AKEYCODE_BUTTON_R2 = 105,
+ AKEYCODE_BUTTON_THUMBL = 106,
+ AKEYCODE_BUTTON_THUMBR = 107,
+ AKEYCODE_BUTTON_START = 108,
+ AKEYCODE_BUTTON_SELECT = 109,
+ AKEYCODE_BUTTON_MODE = 110,
+ AKEYCODE_ESCAPE = 111,
+ AKEYCODE_FORWARD_DEL = 112,
+ AKEYCODE_CTRL_LEFT = 113,
+ AKEYCODE_CTRL_RIGHT = 114,
+ AKEYCODE_CAPS_LOCK = 115,
+ AKEYCODE_SCROLL_LOCK = 116,
+ AKEYCODE_META_LEFT = 117,
+ AKEYCODE_META_RIGHT = 118,
+ AKEYCODE_FUNCTION = 119,
+ AKEYCODE_SYSRQ = 120,
+ AKEYCODE_BREAK = 121,
+ AKEYCODE_MOVE_HOME = 122,
+ AKEYCODE_MOVE_END = 123,
+ AKEYCODE_INSERT = 124,
+ AKEYCODE_FORWARD = 125,
+ AKEYCODE_MEDIA_PLAY = 126,
+ AKEYCODE_MEDIA_PAUSE = 127,
+ AKEYCODE_MEDIA_CLOSE = 128,
+ AKEYCODE_MEDIA_EJECT = 129,
+ AKEYCODE_MEDIA_RECORD = 130,
+ AKEYCODE_F1 = 131,
+ AKEYCODE_F2 = 132,
+ AKEYCODE_F3 = 133,
+ AKEYCODE_F4 = 134,
+ AKEYCODE_F5 = 135,
+ AKEYCODE_F6 = 136,
+ AKEYCODE_F7 = 137,
+ AKEYCODE_F8 = 138,
+ AKEYCODE_F9 = 139,
+ AKEYCODE_F10 = 140,
+ AKEYCODE_F11 = 141,
+ AKEYCODE_F12 = 142,
+ AKEYCODE_NUM_LOCK = 143,
+ AKEYCODE_NUMPAD_0 = 144,
+ AKEYCODE_NUMPAD_1 = 145,
+ AKEYCODE_NUMPAD_2 = 146,
+ AKEYCODE_NUMPAD_3 = 147,
+ AKEYCODE_NUMPAD_4 = 148,
+ AKEYCODE_NUMPAD_5 = 149,
+ AKEYCODE_NUMPAD_6 = 150,
+ AKEYCODE_NUMPAD_7 = 151,
+ AKEYCODE_NUMPAD_8 = 152,
+ AKEYCODE_NUMPAD_9 = 153,
+ AKEYCODE_NUMPAD_DIVIDE = 154,
+ AKEYCODE_NUMPAD_MULTIPLY = 155,
+ AKEYCODE_NUMPAD_SUBTRACT = 156,
+ AKEYCODE_NUMPAD_ADD = 157,
+ AKEYCODE_NUMPAD_DOT = 158,
+ AKEYCODE_NUMPAD_COMMA = 159,
+ AKEYCODE_NUMPAD_ENTER = 160,
+ AKEYCODE_NUMPAD_EQUALS = 161,
+ AKEYCODE_NUMPAD_LEFT_PAREN = 162,
+ AKEYCODE_NUMPAD_RIGHT_PAREN = 163,
+ AKEYCODE_VOLUME_MUTE = 164,
+ AKEYCODE_INFO = 165,
+ AKEYCODE_CHANNEL_UP = 166,
+ AKEYCODE_CHANNEL_DOWN = 167,
+ AKEYCODE_ZOOM_IN = 168,
+ AKEYCODE_ZOOM_OUT = 169,
+ AKEYCODE_TV = 170,
+ AKEYCODE_WINDOW = 171,
+ AKEYCODE_GUIDE = 172,
+ AKEYCODE_DVR = 173,
+ AKEYCODE_BOOKMARK = 174,
+ AKEYCODE_CAPTIONS = 175,
+ AKEYCODE_SETTINGS = 176,
+ AKEYCODE_TV_POWER = 177,
+ AKEYCODE_TV_INPUT = 178,
+ AKEYCODE_STB_POWER = 179,
+ AKEYCODE_STB_INPUT = 180,
+ AKEYCODE_AVR_POWER = 181,
+ AKEYCODE_AVR_INPUT = 182,
+ AKEYCODE_PROG_RED = 183,
+ AKEYCODE_PROG_GREEN = 184,
+ AKEYCODE_PROG_YELLOW = 185,
+ AKEYCODE_PROG_BLUE = 186,
+ AKEYCODE_APP_SWITCH = 187,
+ AKEYCODE_BUTTON_1 = 188,
+ AKEYCODE_BUTTON_2 = 189,
+ AKEYCODE_BUTTON_3 = 190,
+ AKEYCODE_BUTTON_4 = 191,
+ AKEYCODE_BUTTON_5 = 192,
+ AKEYCODE_BUTTON_6 = 193,
+ AKEYCODE_BUTTON_7 = 194,
+ AKEYCODE_BUTTON_8 = 195,
+ AKEYCODE_BUTTON_9 = 196,
+ AKEYCODE_BUTTON_10 = 197,
+ AKEYCODE_BUTTON_11 = 198,
+ AKEYCODE_BUTTON_12 = 199,
+ AKEYCODE_BUTTON_13 = 200,
+ AKEYCODE_BUTTON_14 = 201,
+ AKEYCODE_BUTTON_15 = 202,
+ AKEYCODE_BUTTON_16 = 203,
+ AKEYCODE_LANGUAGE_SWITCH = 204,
+ AKEYCODE_MANNER_MODE = 205,
+ AKEYCODE_3D_MODE = 206,
+ AKEYCODE_CONTACTS = 207,
+ AKEYCODE_CALENDAR = 208,
+ AKEYCODE_MUSIC = 209,
+ AKEYCODE_CALCULATOR = 210,
+ AKEYCODE_ZENKAKU_HANKAKU = 211,
+ AKEYCODE_EISU = 212,
+ AKEYCODE_MUHENKAN = 213,
+ AKEYCODE_HENKAN = 214,
+ AKEYCODE_KATAKANA_HIRAGANA = 215,
+ AKEYCODE_YEN = 216,
+ AKEYCODE_RO = 217,
+ AKEYCODE_KANA = 218,
+ AKEYCODE_ASSIST = 219,
+ AKEYCODE_BRIGHTNESS_DOWN = 220,
+ AKEYCODE_BRIGHTNESS_UP = 221,
+ AKEYCODE_MEDIA_AUDIO_TRACK = 222,
+
+ // NOTE: If you add a new keycode here you must also add it to several other files.
+ // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _ANDROID_KEYCODES_H
diff --git a/ndk/platforms/android-19/include/android/sensor.h b/ndk/platforms/android-19/include/android/sensor.h
new file mode 100644
index 0000000..589058d
--- /dev/null
+++ b/ndk/platforms/android-19/include/android/sensor.h
@@ -0,0 +1,289 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef ANDROID_SENSOR_H
+#define ANDROID_SENSOR_H
+
+/******************************************************************
+ *
+ * IMPORTANT NOTICE:
+ *
+ * This file is part of Android's set of stable system headers
+ * exposed by the Android NDK (Native Development Kit).
+ *
+ * Third-party source AND binary code relies on the definitions
+ * here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
+ *
+ * - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
+ * - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
+ * - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
+ * - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
+ */
+
+/*
+ * Structures and functions to receive and process sensor events in
+ * native code.
+ *
+ */
+
+#include <sys/types.h>
+
+#include <android/looper.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Sensor types
+ * (keep in sync with hardware/sensor.h)
+ */
+
+enum {
+ ASENSOR_TYPE_ACCELEROMETER = 1,
+ ASENSOR_TYPE_MAGNETIC_FIELD = 2,
+ ASENSOR_TYPE_GYROSCOPE = 4,
+ ASENSOR_TYPE_LIGHT = 5,
+ ASENSOR_TYPE_PROXIMITY = 8
+};
+
+/*
+ * Sensor accuracy measure
+ */
+enum {
+ ASENSOR_STATUS_UNRELIABLE = 0,
+ ASENSOR_STATUS_ACCURACY_LOW = 1,
+ ASENSOR_STATUS_ACCURACY_MEDIUM = 2,
+ ASENSOR_STATUS_ACCURACY_HIGH = 3
+};
+
+/*
+ * A few useful constants
+ */
+
+/* Earth's gravity in m/s^2 */
+#define ASENSOR_STANDARD_GRAVITY (9.80665f)
+/* Maximum magnetic field on Earth's surface in uT */
+#define ASENSOR_MAGNETIC_FIELD_EARTH_MAX (60.0f)
+/* Minimum magnetic field on Earth's surface in uT*/
+#define ASENSOR_MAGNETIC_FIELD_EARTH_MIN (30.0f)
+
+/*
+ * A sensor event.
+ */
+
+/* NOTE: Must match hardware/sensors.h */
+typedef struct ASensorVector {
+ union {
+ float v[3];
+ struct {
+ float x;
+ float y;
+ float z;
+ };
+ struct {
+ float azimuth;
+ float pitch;
+ float roll;
+ };
+ };
+ int8_t status;
+ uint8_t reserved[3];
+} ASensorVector;
+
+typedef struct AMetaDataEvent {
+ int32_t what;
+ int32_t sensor;
+} AMetaDataEvent;
+
+typedef struct AUncalibratedEvent {
+ union {
+ float uncalib[3];
+ struct {
+ float x_uncalib;
+ float y_uncalib;
+ float z_uncalib;
+ };
+ };
+ union {
+ float bias[3];
+ struct {
+ float x_bias;
+ float y_bias;
+ float z_bias;
+ };
+ };
+} AUncalibratedEvent;
+
+/* NOTE: Must match hardware/sensors.h */
+typedef struct ASensorEvent {
+ int32_t version; /* sizeof(struct ASensorEvent) */
+ int32_t sensor;
+ int32_t type;
+ int32_t reserved0;
+ int64_t timestamp;
+ union {
+ union {
+ float data[16];
+ ASensorVector vector;
+ ASensorVector acceleration;
+ ASensorVector magnetic;
+ float temperature;
+ float distance;
+ float light;
+ float pressure;
+ float relative_humidity;
+ AUncalibratedEvent uncalibrated_gyro;
+ AUncalibratedEvent uncalibrated_magnetic;
+ AMetaDataEvent meta_data;
+ };
+ union {
+ uint64_t data[8];
+ uint64_t step_counter;
+ } u64;
+ };
+ int32_t reserved1[4];
+} ASensorEvent;
+
+struct ASensorManager;
+typedef struct ASensorManager ASensorManager;
+
+struct ASensorEventQueue;
+typedef struct ASensorEventQueue ASensorEventQueue;
+
+struct ASensor;
+typedef struct ASensor ASensor;
+typedef ASensor const* ASensorRef;
+typedef ASensorRef const* ASensorList;
+
+/*****************************************************************************/
+
+/*
+ * Get a reference to the sensor manager. ASensorManager is a singleton.
+ *
+ * Example:
+ *
+ * ASensorManager* sensorManager = ASensorManager_getInstance();
+ *
+ */
+ASensorManager* ASensorManager_getInstance();
+
+
+/*
+ * Returns the list of available sensors.
+ */
+int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list);
+
+/*
+ * Returns the default sensor for the given type, or NULL if no sensor
+ * of that type exist.
+ */
+ASensor const* ASensorManager_getDefaultSensor(ASensorManager* manager, int type);
+
+/*
+ * Creates a new sensor event queue and associate it with a looper.
+ */
+ASensorEventQueue* ASensorManager_createEventQueue(ASensorManager* manager,
+ ALooper* looper, int ident, ALooper_callbackFunc callback, void* data);
+
+/*
+ * Destroys the event queue and free all resources associated to it.
+ */
+int ASensorManager_destroyEventQueue(ASensorManager* manager, ASensorEventQueue* queue);
+
+
+/*****************************************************************************/
+
+/*
+ * Enable the selected sensor. Returns a negative error code on failure.
+ */
+int ASensorEventQueue_enableSensor(ASensorEventQueue* queue, ASensor const* sensor);
+
+/*
+ * Disable the selected sensor. Returns a negative error code on failure.
+ */
+int ASensorEventQueue_disableSensor(ASensorEventQueue* queue, ASensor const* sensor);
+
+/*
+ * Sets the delivery rate of events in microseconds for the given sensor.
+ * Note that this is a hint only, generally event will arrive at a higher
+ * rate. It is an error to set a rate inferior to the value returned by
+ * ASensor_getMinDelay().
+ * Returns a negative error code on failure.
+ */
+int ASensorEventQueue_setEventRate(ASensorEventQueue* queue, ASensor const* sensor, int32_t usec);
+
+/*
+ * Returns true if there are one or more events available in the
+ * sensor queue. Returns 1 if the queue has events; 0 if
+ * it does not have events; and a negative value if there is an error.
+ */
+int ASensorEventQueue_hasEvents(ASensorEventQueue* queue);
+
+/*
+ * Returns the next available events from the queue. Returns a negative
+ * value if no events are available or an error has occurred, otherwise
+ * the number of events returned.
+ *
+ * Examples:
+ * ASensorEvent event;
+ * ssize_t numEvent = ASensorEventQueue_getEvents(queue, &event, 1);
+ *
+ * ASensorEvent eventBuffer[8];
+ * ssize_t numEvent = ASensorEventQueue_getEvents(queue, eventBuffer, 8);
+ *
+ */
+ssize_t ASensorEventQueue_getEvents(ASensorEventQueue* queue,
+ ASensorEvent* events, size_t count);
+
+
+/*****************************************************************************/
+
+/*
+ * Returns this sensor's name (non localized)
+ */
+const char* ASensor_getName(ASensor const* sensor);
+
+/*
+ * Returns this sensor's vendor's name (non localized)
+ */
+const char* ASensor_getVendor(ASensor const* sensor);
+
+/*
+ * Return this sensor's type
+ */
+int ASensor_getType(ASensor const* sensor);
+
+/*
+ * Returns this sensors's resolution
+ */
+float ASensor_getResolution(ASensor const* sensor) __NDK_FPABI__;
+
+/*
+ * Returns the minimum delay allowed between events in microseconds.
+ * A value of zero means that this sensor doesn't report events at a
+ * constant rate, but rather only when a new data is available.
+ */
+int ASensor_getMinDelay(ASensor const* sensor);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // ANDROID_SENSOR_H
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S b/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
deleted file mode 100644
index 3e80128..0000000
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle.S
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
- .section .bss
- .align 4
-
-#ifndef CRT_LEGACY_WORKAROUND
- .hidden __dso_handle
-#endif
-
- .globl __dso_handle
-__dso_handle:
- .long 0
diff --git a/ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S b/ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S
deleted file mode 100644
index 77a5d7f..0000000
--- a/ndk/platforms/android-9/arch-x86/src/__dso_handle_so.S
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-# The __dso_handle global variable is used by static
-# C++ constructors and destructors in the binary.
-# See http://www.codesourcery.com/public/cxx-abi/abi.html#dso-dtor
-#
- .data
- .align 4
- .hidden __dso_handle
- .globl __dso_handle
-__dso_handle:
- .long __dso_handle
diff --git a/ndk/sources/android/helper/GLContext.cpp b/ndk/sources/android/helper/GLContext.cpp
deleted file mode 100644
index 4595456..0000000
--- a/ndk/sources/android/helper/GLContext.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//--------------------------------------------------------------------------------
-// GLContext.cpp
-//--------------------------------------------------------------------------------
-
-//--------------------------------------------------------------------------------
-// includes
-//--------------------------------------------------------------------------------
-#include <unistd.h>
-#include "GLContext.h"
-#include "gl3stub.h"
-
-//--------------------------------------------------------------------------------
-// eGLContext
-//--------------------------------------------------------------------------------
-
-//--------------------------------------------------------------------------------
-// Ctor
-//--------------------------------------------------------------------------------
-GLContext::GLContext() : _display(EGL_NO_DISPLAY),
- _surface(EGL_NO_SURFACE),
- _context(EGL_NO_CONTEXT),
- _iWidth( 0 ),
- _iHeight( 0 ),
- _bES3Support( false ),
- _bEGLContextInitialized( false ),
- _bGLESInitialized( false )
-{
-}
-
-void GLContext::initGLES()
-{
- if( _bGLESInitialized )
- return;
- //
- //Initialize OpenGL ES 3 if available
- //
- const char* versionStr = (const char*)glGetString(GL_VERSION);
- if (strstr(versionStr, "OpenGL ES 3.")
- && gl3stubInit())
- {
- _bES3Support = true;
- _fGLVersion = 3.0f;
- }
- else
- {
- _fGLVersion = 2.0f;
- }
-
- _bGLESInitialized = true;
-}
-
-//--------------------------------------------------------------------------------
-// Dtor
-//--------------------------------------------------------------------------------
-GLContext::~GLContext()
-{
- terminate();
-}
-
-bool GLContext::init( ANativeWindow* window )
-{
- if( _bEGLContextInitialized )
- return true;
-
- //
- //Initialize EGL
- //
- _window = window;
- initEGLSurface();
- initEGLContext();
- initGLES();
-
- _bEGLContextInitialized = true;
-
- return true;
-}
-
-bool GLContext::initEGLSurface()
-{
- _display = eglGetDisplay( EGL_DEFAULT_DISPLAY );
- eglInitialize( _display, 0, 0 );
-
- /*
- * Here specify the attributes of the desired configuration.
- * Below, we select an EGLConfig with at least 8 bits per color
- * component compatible with on-screen windows
- */
- const EGLint attribs[] = {
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_BLUE_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_RED_SIZE, 8,
- EGL_DEPTH_SIZE, 24,
- EGL_NONE
- };
- _iColorSize = 8;
- _iDepthSize = 24;
-
- EGLint numConfigs;
- eglChooseConfig( _display, attribs, &_config, 1, &numConfigs );
-
- if( !numConfigs )
- {
- //Fall back to 16bit depth buffer
- const EGLint attribs[] = {
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_BLUE_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_RED_SIZE, 8,
- EGL_DEPTH_SIZE, 16,
- EGL_NONE
- };
- eglChooseConfig( _display, attribs, &_config, 1, &numConfigs );
- _iDepthSize = 16;
- }
-
- if ( !numConfigs )
- {
- LOGW("Unable to retrieve EGL config");
- return false;
- }
-
- _surface = eglCreateWindowSurface( _display, _config, _window, NULL );
- eglQuerySurface(_display, _surface, EGL_WIDTH, &_iWidth);
- eglQuerySurface(_display, _surface, EGL_HEIGHT, &_iHeight);
-
- /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
- * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
- * As soon as we picked a EGLConfig, we can safely reconfigure the
- * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
- EGLint format;
- eglGetConfigAttrib(_display, _config, EGL_NATIVE_VISUAL_ID, &format);
- ANativeWindow_setBuffersGeometry( _window, 0, 0, format);
-
- return true;
-}
-
-bool GLContext::initEGLContext()
-{
- const EGLint contextAttribs[] = {
- EGL_CONTEXT_CLIENT_VERSION, 2, //Request opengl ES2.0
- EGL_NONE
- };
- _context = eglCreateContext( _display, _config, NULL, contextAttribs );
-
- if( eglMakeCurrent(_display, _surface, _surface, _context) == EGL_FALSE )
- {
- LOGW("Unable to eglMakeCurrent");
- return false;
- }
-
- _bContextValid = true;
- return true;
-}
-
-EGLint GLContext::swap()
-{
- bool b = eglSwapBuffers( _display, _surface);
- if( !b )
- {
- EGLint err = eglGetError();
- if( err == EGL_BAD_SURFACE )
- {
- //Recreate surface
- initEGLSurface();
- }
- else if( err == EGL_CONTEXT_LOST || err == EGL_BAD_CONTEXT )
- {
- //Context has been lost!!
- _bContextValid = false;
- terminate();
- initEGLContext();
- }
- return err;
- }
- return EGL_SUCCESS;
-}
-
-void GLContext::terminate()
-{
- if( _display != EGL_NO_DISPLAY )
- {
- eglMakeCurrent( _display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
- if ( _context != EGL_NO_CONTEXT )
- {
- eglDestroyContext( _display, _context );
- }
-
- if( _surface != EGL_NO_SURFACE )
- {
- eglDestroySurface( _display, _surface );
- }
- eglTerminate( _display );
- }
-
- _display = EGL_NO_DISPLAY;
- _context = EGL_NO_CONTEXT;
- _surface = EGL_NO_SURFACE;
- _bContextValid = false;
-
-}
-
-EGLint GLContext::resume(ANativeWindow* window)
-{
- if( _bEGLContextInitialized == false )
- {
- init( window );
- return EGL_SUCCESS;
- }
-
- int32_t iOriginalWidth = _iWidth;
- int32_t iOriginalHeight = _iHeight;
-
- //Create surface
- _window = window;
- _surface = eglCreateWindowSurface( _display, _config, _window, NULL );
- eglQuerySurface(_display, _surface, EGL_WIDTH, &_iWidth);
- eglQuerySurface(_display, _surface, EGL_HEIGHT, &_iHeight);
-
- if( _iWidth != iOriginalWidth || _iHeight != iOriginalHeight )
- {
- //Screen resized
- LOGI("Screen resized");
- }
-
- if( eglMakeCurrent(_display, _surface, _surface, _context) == EGL_TRUE )
- return EGL_SUCCESS;
-
- EGLint err = eglGetError();
- LOGW("Unable to eglMakeCurrent %d", err);
-
- if( err == EGL_CONTEXT_LOST )
- {
- //Recreate context
- LOGI("Re-creating egl context");
- initEGLContext();
- }
- else
- {
- //Recreate surface
- terminate();
- initEGLSurface();
- initEGLContext();
- }
-
- return err;
-
-}
-
-void GLContext::suspend()
-{
- if( _surface != EGL_NO_SURFACE )
- {
- eglDestroySurface( _display, _surface );
- _surface = EGL_NO_SURFACE;
- }
-}
-
-bool GLContext::invalidate()
-{
- terminate();
-
- _bEGLContextInitialized = false;
- return true;
-}
-
-
-bool GLContext::checkExtension( const char* extension )
-{
- if( extension == NULL )
- return false;
-
- std::string extensions = std::string( (char*)glGetString(GL_EXTENSIONS) );
- std::string str = std::string( extension );
- str.append( " " );
-
- size_t pos = 0;
- if( extensions.find( extension, pos ) != std::string::npos )
- {
- return true;
- }
-
- return false;
-}
diff --git a/ndk/sources/android/helper/JNIHelper.cpp b/ndk/sources/android/helper/JNIHelper.cpp
deleted file mode 100644
index a17f5aa..0000000
--- a/ndk/sources/android/helper/JNIHelper.cpp
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "JNIHelper.h"
-
-#define CLASS_NAME "android/app/NativeActivity"
-#define APPLICATION_CLASS_NAME "com/sample/helper/NDKHelper"
-
-//---------------------------------------------------------------------------
-//JNI Helper functions
-//---------------------------------------------------------------------------
-//Static variable
-ANativeActivity* JNIHelper::_activity;
-jobject JNIHelper::_objJNIHelper;
-jclass JNIHelper::_clsJNIHelper;
-std::string JNIHelper::_appName;
-
-jclass retrieveClass(JNIEnv *jni, ANativeActivity* activity,
- const char* className) {
- jclass activityClass = jni->FindClass(CLASS_NAME);
- jmethodID getClassLoader = jni->GetMethodID(activityClass, "getClassLoader",
- "()Ljava/lang/ClassLoader;");
- jobject cls = jni->CallObjectMethod(activity->clazz, getClassLoader);
- jclass classLoader = jni->FindClass("java/lang/ClassLoader");
- jmethodID findClass = jni->GetMethodID(classLoader, "loadClass",
- "(Ljava/lang/String;)Ljava/lang/Class;");
-
- jstring strClassName = jni->NewStringUTF(className);
- jclass classRetrieved = (jclass) jni->CallObjectMethod(cls, findClass,
- strClassName);
- jni->DeleteLocalRef(strClassName);
- return classRetrieved;
-}
-
-//---------------------------------------------------------------------------
-//Init
-//---------------------------------------------------------------------------
-void JNIHelper::init( ANativeActivity* activity )
-{
- _activity = activity;
-
- JNIEnv *env;
- _activity->vm->AttachCurrentThread(&env, NULL);
-
- //Retrieve app name
- jclass android_content_Context = env->GetObjectClass(_activity->clazz);
- jmethodID midGetPackageName = env->GetMethodID(android_content_Context, "getPackageName", "()Ljava/lang/String;");
-
- jstring packageName= (jstring)env->CallObjectMethod(_activity->clazz, midGetPackageName);
- const char* appname = env->GetStringUTFChars(packageName, NULL);
- _appName = std::string(appname);
-
- _activity->vm->DetachCurrentThread();
-
-};
-
-//---------------------------------------------------------------------------
-//readFile
-//---------------------------------------------------------------------------
-bool JNIHelper::readFile(const char* fileName, std::vector<uint8_t>& buffer)
-{
- if (_activity == NULL) {
- return false;
- }
-
- //First, try reading from externalFileDir;
- JNIEnv *env;
- jmethodID mid;
-
- _activity->vm->AttachCurrentThread(&env, NULL);
-
- jstring strPath = getExternalFilesDir(env);
- const char* path = env->GetStringUTFChars(strPath, NULL);
- std::string s(path);
-
- if (fileName[0] != '/') {
- s.append("/");
- }
- s.append(fileName);
- std::ifstream f(s.c_str(), std::ios::binary);
-
- env->ReleaseStringUTFChars(strPath, path);
- _activity->vm->DetachCurrentThread();
-
- if (f) {
- LOGI("reading:%s", s.c_str());
- f.seekg(0, std::ifstream::end);
- int32_t fileSize = f.tellg();
- f.seekg(0, std::ifstream::beg);
- buffer.reserve(fileSize);
- buffer.assign(std::istreambuf_iterator<char>(f),
- std::istreambuf_iterator<char>());
- return true;
- } else {
- //Fallback to assetManager
- AAssetManager* assetManager = _activity->assetManager;
- AAsset* assetFile = AAssetManager_open(assetManager, fileName,
- AASSET_MODE_BUFFER);
- if (!assetFile) {
- return false;
- }
- uint8_t* data = (uint8_t*) AAsset_getBuffer(assetFile);
- int32_t iSize = AAsset_getLength(assetFile);
- if (data == NULL) {
- AAsset_close(assetFile);
-
- LOGI("Failed to load:%s", fileName);
- return false;
- }
-
- buffer.assign(data, data + iSize);
-
- AAsset_close(assetFile);
- return true;
- }
-}
-
-jstring JNIHelper::getExternalFilesDir(JNIEnv *env)
-{
- if (_activity == NULL) {
- return NULL;
- }
- // getExternalFilesDir() - java
- jclass cls_Env = env->FindClass(CLASS_NAME);
- jmethodID mid = env->GetMethodID(cls_Env, "getExternalFilesDir",
- "(Ljava/lang/String;)Ljava/io/File;");
- jobject obj_File = env->CallObjectMethod(_activity->clazz, mid, NULL);
- jclass cls_File = env->FindClass("java/io/File");
- jmethodID mid_getPath = env->GetMethodID(cls_File, "getPath",
- "()Ljava/lang/String;");
- jstring obj_Path = (jstring) env->CallObjectMethod(obj_File, mid_getPath);
- return obj_Path;
-}
-
-uint32_t JNIHelper::loadTexture(const char* fileName)
-{
- if (_activity == NULL) {
- return 0;
- }
-
- JNIEnv *env;
- jmethodID mid;
-
- _activity->vm->AttachCurrentThread(&env, NULL);
-
- if (_clsJNIHelper == 0) {
- jclass cls = retrieveClass(env, _activity, APPLICATION_CLASS_NAME);
- _clsJNIHelper = (jclass) env->NewGlobalRef(cls);
-
- jmethodID constructor = env->GetMethodID(_clsJNIHelper, "<init>",
- "()V");
- _objJNIHelper = env->NewObject(_clsJNIHelper, constructor);
- _objJNIHelper = env->NewGlobalRef(_objJNIHelper);
- }
-
- jstring name = env->NewStringUTF(fileName);
-#if 0
- /* Ask the PNG manager for a bitmap */
- mid = env->GetMethodID(_clsJNIHelper, "openBitmap",
- "(Ljava/lang/String;Z)Landroid/graphics/Bitmap;");
-
- jobject png = env->CallObjectMethod(_objJNIHelper, mid, name, true);
- env->DeleteLocalRef(name);
- env->NewGlobalRef(png);
-
- /* Get image dimensions */
- mid = env->GetMethodID(_clsJNIHelper, "getBitmapWidth", "(Landroid/graphics/Bitmap;)I");
- int width = env->CallIntMethod(_objJNIHelper, mid, png);
- mid = env->GetMethodID(_clsJNIHelper, "getBitmapHeight", "(Landroid/graphics/Bitmap;)I");
- int height = env->CallIntMethod(_objJNIHelper, mid, png);
-
- /* Get pixels */
- jintArray array = env->NewIntArray(width * height);
- env->NewGlobalRef(array);
- mid = env->GetMethodID(_clsJNIHelper, "getBitmapPixels", "(Landroid/graphics/Bitmap;[I)V");
- env->CallVoidMethod(_objJNIHelper, mid, png, array);
-
- jint *pixels = env->GetIntArrayElements(array, 0);
-
- LOGI( "Loaded bitmap %s, width %d height %d",fileName, width, height);
-
- GLuint tex;
- glGenTextures( 1, &tex );
- glBindTexture( GL_TEXTURE_2D, tex );
-
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_LINEAR_MIPMAP_NEAREST );
- glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
-
- //Generate mipmap
- glGenerateMipmap(GL_TEXTURE_2D);
-
- env->ReleaseIntArrayElements(array, pixels, 0);
- env->DeleteGlobalRef(array);
-
- /* Free image */
- mid = env->GetMethodID(_clsJNIHelper, "closeBitmap", "(Landroid/graphics/Bitmap;)V");
- env->CallVoidMethod(_objJNIHelper, mid, png);
- env->DeleteGlobalRef(png);
-#else
- GLuint tex;
- glGenTextures(1, &tex);
- glBindTexture(GL_TEXTURE_2D, tex);
-
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_LINEAR_MIPMAP_NEAREST);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- mid = env->GetMethodID(_clsJNIHelper, "loadTexture",
- "(Ljava/lang/String;)V");
- env->CallVoidMethod(_objJNIHelper, mid, name);
-
- //Generate mipmap
- glGenerateMipmap(GL_TEXTURE_2D);
-
-#endif
-
- _activity->vm->DetachCurrentThread();
-
- return tex;
-
-}
-
-std::string JNIHelper::convertString( const char* str, const char* encode )
-{
- if (_activity == NULL)
- {
- return std::string("");
- }
-
- JNIEnv *env;
-
- _activity->vm->AttachCurrentThread(&env, NULL);
-
- int32_t iLength = strlen( (const char*)str );
-
- jbyteArray array = env->NewByteArray( iLength );
- env->SetByteArrayRegion( array, 0, iLength, (const signed char*)str );
-
- jstring strEncode = env->NewStringUTF( encode );
-
- jclass cls = env->FindClass("java/lang/String");
- jmethodID ctor = env->GetMethodID(cls, "<init>",
- "([BLjava/lang/String;)V");
- jstring object = (jstring)env->NewObject( cls, ctor, array, strEncode );
-
- const char *cparam = env->GetStringUTFChars( object, NULL );
-
- std::string s = std::string(cparam);
-
- env->ReleaseStringUTFChars( object, cparam );
- _activity->vm->DetachCurrentThread();
-
- return s;
-}
diff --git a/ndk/sources/android/helper/JNIHelper.h b/ndk/sources/android/helper/JNIHelper.h
deleted file mode 100644
index 253ce6a..0000000
--- a/ndk/sources/android/helper/JNIHelper.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <jni.h>
-#include <errno.h>
-#include <vector>
-#include <map>
-#include <fstream>
-#include <iostream>
-#include <string>
-
-#include <EGL/egl.h>
-#include <GLES2/gl2.h>
-
-#include <android/sensor.h>
-#include <android/log.h>
-#include <android_native_app_glue.h>
-
-#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, JNIHelper::getAppName(), __VA_ARGS__))
-#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, JNIHelper::getAppName(), __VA_ARGS__))
-#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, JNIHelper::getAppName(), __VA_ARGS__))
-
-jclass retrieveClass(JNIEnv *jni, ANativeActivity* activity, const char* className);
-
-/******************************************************************
- * Helpers to invoke Java methods
- * To use this class, add NDKHelper.java as a corresponding helpers in Java side
- */
-class JNIHelper
-{
-private:
- static ANativeActivity* _activity;
- static jobject _objJNIHelper;
- static jclass _clsJNIHelper;
-
- static jstring getExternalFilesDir( JNIEnv *env );
-
- static std::string _appName;
-public:
- JNIHelper()
- {
- };
- ~JNIHelper() {
- JNIEnv *env;
- _activity->vm->AttachCurrentThread(&env, NULL);
-
- env->DeleteGlobalRef(_objJNIHelper);
- env->DeleteGlobalRef(_clsJNIHelper);
-
- _activity->vm->DetachCurrentThread();
-
- };
- static void init( ANativeActivity* activity );
- static bool readFile( const char* fileName, std::vector<uint8_t>& buffer );
- static uint32_t loadTexture(const char* fileName );
- static std::string convertString( const char* str, const char* encode );
-
- static const char* getAppName() {
- return _appName.c_str();
- };
-
-
-
-
-};
diff --git a/ndk/sources/android/helper/gestureDetector.cpp b/ndk/sources/android/helper/gestureDetector.cpp
deleted file mode 100644
index 59255b0..0000000
--- a/ndk/sources/android/helper/gestureDetector.cpp
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//--------------------------------------------------------------------------------
-// gestureDetector.cpp
-//--------------------------------------------------------------------------------
-
-//--------------------------------------------------------------------------------
-// includes
-//--------------------------------------------------------------------------------
-#include "gestureDetector.h"
-
-//--------------------------------------------------------------------------------
-// GestureDetector
-//--------------------------------------------------------------------------------
-GestureDetector::GestureDetector()
-{
- _fDpFactor = 1.f;
-}
-
-void GestureDetector::setConfiguration(AConfiguration* config)
-{
- _fDpFactor = 160.f / AConfiguration_getDensity(config);
-}
-
-//--------------------------------------------------------------------------------
-// TapDetector
-//--------------------------------------------------------------------------------
-GESTURE_STATE TapDetector::detect(const AInputEvent* motion_event)
-{
- if( AMotionEvent_getPointerCount(motion_event) > 1 )
- {
- //Only support single touch
- return false;
- }
-
- int32_t iAction = AMotionEvent_getAction(motion_event);
- unsigned int flags = iAction & AMOTION_EVENT_ACTION_MASK;
- switch( flags )
- {
- case AMOTION_EVENT_ACTION_DOWN:
- _iDownPointerID = AMotionEvent_getPointerId(motion_event, 0);
- _fDownX = AMotionEvent_getX(motion_event, 0);
- _fDownY = AMotionEvent_getY(motion_event, 0);
- break;
- case AMOTION_EVENT_ACTION_UP:
- {
- int64_t eventTime = AMotionEvent_getEventTime(motion_event);
- int64_t downTime = AMotionEvent_getDownTime(motion_event);
- if( eventTime - downTime <= TAP_TIMEOUT )
- {
- if( _iDownPointerID == AMotionEvent_getPointerId(motion_event, 0) )
- {
- float fX = AMotionEvent_getX(motion_event, 0) - _fDownX;
- float fY = AMotionEvent_getY(motion_event, 0) - _fDownY;
- if( fX * fX + fY * fY < TOUCH_SLOP * TOUCH_SLOP * _fDpFactor )
- {
- LOGI("TapDetector: Tap detected");
- return GESTURE_STATE_ACTION;
- }
- }
- }
- break;
- }
- }
- return GESTURE_STATE_NONE;
-}
-
-//--------------------------------------------------------------------------------
-// DoubletapDetector
-//--------------------------------------------------------------------------------
-GESTURE_STATE DoubletapDetector::detect(const AInputEvent* motion_event)
-{
- if( AMotionEvent_getPointerCount(motion_event) > 1 )
- {
- //Only support single double tap
- return false;
- }
-
- bool bDetectedTap = _tapDetector.detect(motion_event);
-
- int32_t iAction = AMotionEvent_getAction(motion_event);
- unsigned int flags = iAction & AMOTION_EVENT_ACTION_MASK;
- switch( flags )
- {
- case AMOTION_EVENT_ACTION_DOWN:
- {
- int64_t eventTime = AMotionEvent_getEventTime(motion_event);
- if( eventTime - _lastTapTime <= DOUBLE_TAP_TIMEOUT )
- {
- float fX = AMotionEvent_getX(motion_event, 0) - _fLastTapX;
- float fY = AMotionEvent_getY(motion_event, 0) - _fLastTapY;
- if( fX * fX + fY * fY < DOUBLE_TAP_SLOP * DOUBLE_TAP_SLOP * _fDpFactor )
- {
- LOGI("DoubletapDetector: Doubletap detected");
- return GESTURE_STATE_ACTION;
- }
- }
- break;
- }
- case AMOTION_EVENT_ACTION_UP:
- if( bDetectedTap )
- {
- _lastTapTime = AMotionEvent_getEventTime(motion_event);
- _fLastTapX = AMotionEvent_getX(motion_event, 0);
- _fLastTapY = AMotionEvent_getY(motion_event, 0);
- }
- break;
- }
- return GESTURE_STATE_NONE;
-}
-
-void DoubletapDetector::setConfiguration(AConfiguration* config)
-{
- _fDpFactor = 160.f / AConfiguration_getDensity(config);
- _tapDetector.setConfiguration(config);
-}
-
-//--------------------------------------------------------------------------------
-// PinchDetector
-//--------------------------------------------------------------------------------
-
-int32_t PinchDetector::findIndex( const AInputEvent* event, int32_t iID )
-{
- int32_t iCount = AMotionEvent_getPointerCount(event);
- for( uint32_t i = 0; i < iCount; ++i )
- {
- if( iID == AMotionEvent_getPointerId(event, i) )
- return i;
- }
- return -1;
-}
-
-
-GESTURE_STATE PinchDetector::detect(const AInputEvent* event)
-{
- GESTURE_STATE ret = GESTURE_STATE_NONE;
- int32_t iAction = AMotionEvent_getAction(event);
- uint32_t flags = iAction & AMOTION_EVENT_ACTION_MASK;
- _event = event;
-
- int32_t iCount = AMotionEvent_getPointerCount(event);
- switch( flags )
- {
- case AMOTION_EVENT_ACTION_DOWN:
- _vecPointers.push_back( AMotionEvent_getPointerId( event, 0 ) );
- break;
- case AMOTION_EVENT_ACTION_POINTER_DOWN:
- {
- int32_t iIndex = (iAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
- _vecPointers.push_back(AMotionEvent_getPointerId(event, iIndex));
- if( iCount == 2 )
- {
- //Start new pinch
- ret = GESTURE_STATE_START;
- }
- }
- break;
- case AMOTION_EVENT_ACTION_UP:
- _vecPointers.pop_back();
- break;
- case AMOTION_EVENT_ACTION_POINTER_UP:
- {
- int32_t iIndex = (iAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
- int32_t iReleasedPointerID = AMotionEvent_getPointerId(event, iIndex);
-
- std::vector<int32_t>::iterator it = _vecPointers.begin();
- std::vector<int32_t>::iterator itEnd = _vecPointers.end();
- int32_t i = 0;
- for(;it!=itEnd;++it, ++i)
- {
- if( *it == iReleasedPointerID )
- {
- _vecPointers.erase(it);
- break;
- }
- }
-
- if( i <= 1 )
- {
- //Reset pinch or drag
- if( iCount != 2 )
- {
- //Start new pinch
- ret = GESTURE_STATE_START | GESTURE_STATE_END;
- }
- }
- }
- break;
- case AMOTION_EVENT_ACTION_MOVE:
- switch(iCount)
- {
- case 1:
- break;
- default:
- //Multi touch
- ret = GESTURE_STATE_MOVE;
- break;
- }
- break;
- case AMOTION_EVENT_ACTION_CANCEL:
- break;
- }
-
-
- return ret;
-}
-
-bool PinchDetector::getPointers( vec2& v1, vec2& v2 )
-{
- if( _vecPointers.size() < 2 )
- return false;
-
- int32_t iIndex = findIndex( _event, _vecPointers[0] );
- if( iIndex == -1 )
- return false;
-
- float fX = AMotionEvent_getX( _event, iIndex);
- float fY = AMotionEvent_getY( _event, iIndex);
-
- iIndex = findIndex( _event, _vecPointers[1] );
- if( iIndex == -1 )
- return false;
-
- float fX2 = AMotionEvent_getX( _event, iIndex);
- float fY2 = AMotionEvent_getY( _event, iIndex);
-
- v1 = vec2( fX, fY );
- v2 = vec2( fX2, fY2 );
-
- return true;
-}
-
-//--------------------------------------------------------------------------------
-// DragDetector
-//--------------------------------------------------------------------------------
-
-int32_t DragDetector::findIndex( const AInputEvent* event, int32_t iID )
-{
- int32_t iCount = AMotionEvent_getPointerCount(event);
- for( uint32_t i = 0; i < iCount; ++i )
- {
- if( iID == AMotionEvent_getPointerId(event, i) )
- return i;
- }
- return -1;
-}
-
-
-GESTURE_STATE DragDetector::detect(const AInputEvent* event)
-{
- GESTURE_STATE ret = GESTURE_STATE_NONE;
- int32_t iAction = AMotionEvent_getAction(event);
- int32_t iIndex = (iAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
- uint32_t flags = iAction & AMOTION_EVENT_ACTION_MASK;
- _event = event;
-
- int32_t iCount = AMotionEvent_getPointerCount(event);
- switch( flags )
- {
- case AMOTION_EVENT_ACTION_DOWN:
- _vecPointers.push_back( AMotionEvent_getPointerId( event, 0 ) );
- ret = GESTURE_STATE_START;
- break;
- case AMOTION_EVENT_ACTION_POINTER_DOWN:
- _vecPointers.push_back(AMotionEvent_getPointerId(event, iIndex));
- break;
- case AMOTION_EVENT_ACTION_UP:
- _vecPointers.pop_back();
- ret = GESTURE_STATE_END;
- break;
- case AMOTION_EVENT_ACTION_POINTER_UP:
- {
- int32_t iReleasedPointerID = AMotionEvent_getPointerId(event, iIndex);
-
- std::vector<int32_t>::iterator it = _vecPointers.begin();
- std::vector<int32_t>::iterator itEnd = _vecPointers.end();
- int32_t i = 0;
- for(;it!=itEnd;++it, ++i)
- {
- if( *it == iReleasedPointerID )
- {
- _vecPointers.erase(it);
- break;
- }
- }
-
- if( i <= 1 )
- {
- //Reset pinch or drag
- if( iCount == 2 )
- {
- ret = GESTURE_STATE_START;
- }
- }
- break;
- }
- case AMOTION_EVENT_ACTION_MOVE:
- switch(iCount)
- {
- case 1:
- //Drag
- ret = GESTURE_STATE_MOVE;
- break;
- default:
- break;
- }
- break;
- case AMOTION_EVENT_ACTION_CANCEL:
- break;
- }
-
- return ret;
-}
-
-bool DragDetector::getPointer( vec2& v )
-{
- if( _vecPointers.size() < 1 )
- return false;
-
- int32_t iIndex = findIndex( _event, _vecPointers[0] );
- if( iIndex == -1 )
- return false;
-
- float fX = AMotionEvent_getX( _event, iIndex);
- float fY = AMotionEvent_getY( _event, iIndex);
-
- v = vec2( fX, fY );
-
- return true;
-}
-
diff --git a/ndk/sources/android/helper/gl3stub.c b/ndk/sources/android/helper/gl3stub.c
deleted file mode 100644
index 0f0a40c..0000000
--- a/ndk/sources/android/helper/gl3stub.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <EGL/egl.h>
-#include "gl3stub.h"
-
-GLboolean gl3stubInit() {
- #define FIND_PROC(s) s = (void*)eglGetProcAddress(#s);
- FIND_PROC(glReadBuffer);
- FIND_PROC(glDrawRangeElements);
- FIND_PROC(glTexImage3D);
- FIND_PROC(glTexSubImage3D);
- FIND_PROC(glCopyTexSubImage3D);
- FIND_PROC(glCompressedTexImage3D);
- FIND_PROC(glCompressedTexSubImage3D);
- FIND_PROC(glGenQueries);
- FIND_PROC(glDeleteQueries);
- FIND_PROC(glIsQuery);
- FIND_PROC(glBeginQuery);
- FIND_PROC(glEndQuery);
- FIND_PROC(glGetQueryiv);
- FIND_PROC(glGetQueryObjectuiv);
- FIND_PROC(glUnmapBuffer);
- FIND_PROC(glGetBufferPointerv);
- FIND_PROC(glDrawBuffers);
- FIND_PROC(glUniformMatrix2x3fv);
- FIND_PROC(glUniformMatrix3x2fv);
- FIND_PROC(glUniformMatrix2x4fv);
- FIND_PROC(glUniformMatrix4x2fv);
- FIND_PROC(glUniformMatrix3x4fv);
- FIND_PROC(glUniformMatrix4x3fv);
- FIND_PROC(glBlitFramebuffer);
- FIND_PROC(glRenderbufferStorageMultisample);
- FIND_PROC(glFramebufferTextureLayer);
- FIND_PROC(glMapBufferRange);
- FIND_PROC(glFlushMappedBufferRange);
- FIND_PROC(glBindVertexArray);
- FIND_PROC(glDeleteVertexArrays);
- FIND_PROC(glGenVertexArrays);
- FIND_PROC(glIsVertexArray);
- FIND_PROC(glGetIntegeri_v);
- FIND_PROC(glBeginTransformFeedback);
- FIND_PROC(glEndTransformFeedback);
- FIND_PROC(glBindBufferRange);
- FIND_PROC(glBindBufferBase);
- FIND_PROC(glTransformFeedbackVaryings);
- FIND_PROC(glGetTransformFeedbackVarying);
- FIND_PROC(glVertexAttribIPointer);
- FIND_PROC(glGetVertexAttribIiv);
- FIND_PROC(glGetVertexAttribIuiv);
- FIND_PROC(glVertexAttribI4i);
- FIND_PROC(glVertexAttribI4ui);
- FIND_PROC(glVertexAttribI4iv);
- FIND_PROC(glVertexAttribI4uiv);
- FIND_PROC(glGetUniformuiv);
- FIND_PROC(glGetFragDataLocation);
- FIND_PROC(glUniform1ui);
- FIND_PROC(glUniform2ui);
- FIND_PROC(glUniform3ui);
- FIND_PROC(glUniform4ui);
- FIND_PROC(glUniform1uiv);
- FIND_PROC(glUniform2uiv);
- FIND_PROC(glUniform3uiv);
- FIND_PROC(glUniform4uiv);
- FIND_PROC(glClearBufferiv);
- FIND_PROC(glClearBufferuiv);
- FIND_PROC(glClearBufferfv);
- FIND_PROC(glClearBufferfi);
- FIND_PROC(glGetStringi);
- FIND_PROC(glCopyBufferSubData);
- FIND_PROC(glGetUniformIndices);
- FIND_PROC(glGetActiveUniformsiv);
- FIND_PROC(glGetUniformBlockIndex);
- FIND_PROC(glGetActiveUniformBlockiv);
- FIND_PROC(glGetActiveUniformBlockName);
- FIND_PROC(glUniformBlockBinding);
- FIND_PROC(glDrawArraysInstanced);
- FIND_PROC(glDrawElementsInstanced);
- FIND_PROC(glFenceSync);
- FIND_PROC(glIsSync);
- FIND_PROC(glDeleteSync);
- FIND_PROC(glClientWaitSync);
- FIND_PROC(glWaitSync);
- FIND_PROC(glGetInteger64v);
- FIND_PROC(glGetSynciv);
- FIND_PROC(glGetInteger64i_v);
- FIND_PROC(glGetBufferParameteri64v);
- FIND_PROC(glGenSamplers);
- FIND_PROC(glDeleteSamplers);
- FIND_PROC(glIsSampler);
- FIND_PROC(glBindSampler);
- FIND_PROC(glSamplerParameteri);
- FIND_PROC(glSamplerParameteriv);
- FIND_PROC(glSamplerParameterf);
- FIND_PROC(glSamplerParameterfv);
- FIND_PROC(glGetSamplerParameteriv);
- FIND_PROC(glGetSamplerParameterfv);
- FIND_PROC(glVertexAttribDivisor);
- FIND_PROC(glBindTransformFeedback);
- FIND_PROC(glDeleteTransformFeedbacks);
- FIND_PROC(glGenTransformFeedbacks);
- FIND_PROC(glIsTransformFeedback);
- FIND_PROC(glPauseTransformFeedback);
- FIND_PROC(glResumeTransformFeedback);
- FIND_PROC(glGetProgramBinary);
- FIND_PROC(glProgramBinary);
- FIND_PROC(glProgramParameteri);
- FIND_PROC(glInvalidateFramebuffer);
- FIND_PROC(glInvalidateSubFramebuffer);
- FIND_PROC(glTexStorage2D);
- FIND_PROC(glTexStorage3D);
- FIND_PROC(glGetInternalformativ);
- #undef FIND_PROC
-
- if (!glReadBuffer ||
- !glDrawRangeElements ||
- !glTexImage3D ||
- !glTexSubImage3D ||
- !glCopyTexSubImage3D ||
- !glCompressedTexImage3D ||
- !glCompressedTexSubImage3D ||
- !glGenQueries ||
- !glDeleteQueries ||
- !glIsQuery ||
- !glBeginQuery ||
- !glEndQuery ||
- !glGetQueryiv ||
- !glGetQueryObjectuiv ||
- !glUnmapBuffer ||
- !glGetBufferPointerv ||
- !glDrawBuffers ||
- !glUniformMatrix2x3fv ||
- !glUniformMatrix3x2fv ||
- !glUniformMatrix2x4fv ||
- !glUniformMatrix4x2fv ||
- !glUniformMatrix3x4fv ||
- !glUniformMatrix4x3fv ||
- !glBlitFramebuffer ||
- !glRenderbufferStorageMultisample ||
- !glFramebufferTextureLayer ||
- !glMapBufferRange ||
- !glFlushMappedBufferRange ||
- !glBindVertexArray ||
- !glDeleteVertexArrays ||
- !glGenVertexArrays ||
- !glIsVertexArray ||
- !glGetIntegeri_v ||
- !glBeginTransformFeedback ||
- !glEndTransformFeedback ||
- !glBindBufferRange ||
- !glBindBufferBase ||
- !glTransformFeedbackVaryings ||
- !glGetTransformFeedbackVarying ||
- !glVertexAttribIPointer ||
- !glGetVertexAttribIiv ||
- !glGetVertexAttribIuiv ||
- !glVertexAttribI4i ||
- !glVertexAttribI4ui ||
- !glVertexAttribI4iv ||
- !glVertexAttribI4uiv ||
- !glGetUniformuiv ||
- !glGetFragDataLocation ||
- !glUniform1ui ||
- !glUniform2ui ||
- !glUniform3ui ||
- !glUniform4ui ||
- !glUniform1uiv ||
- !glUniform2uiv ||
- !glUniform3uiv ||
- !glUniform4uiv ||
- !glClearBufferiv ||
- !glClearBufferuiv ||
- !glClearBufferfv ||
- !glClearBufferfi ||
- !glGetStringi ||
- !glCopyBufferSubData ||
- !glGetUniformIndices ||
- !glGetActiveUniformsiv ||
- !glGetUniformBlockIndex ||
- !glGetActiveUniformBlockiv ||
- !glGetActiveUniformBlockName ||
- !glUniformBlockBinding ||
- !glDrawArraysInstanced ||
- !glDrawElementsInstanced ||
- !glFenceSync ||
- !glIsSync ||
- !glDeleteSync ||
- !glClientWaitSync ||
- !glWaitSync ||
- !glGetInteger64v ||
- !glGetSynciv ||
- !glGetInteger64i_v ||
- !glGetBufferParameteri64v ||
- !glGenSamplers ||
- !glDeleteSamplers ||
- !glIsSampler ||
- !glBindSampler ||
- !glSamplerParameteri ||
- !glSamplerParameteriv ||
- !glSamplerParameterf ||
- !glSamplerParameterfv ||
- !glGetSamplerParameteriv ||
- !glGetSamplerParameterfv ||
- !glVertexAttribDivisor ||
- !glBindTransformFeedback ||
- !glDeleteTransformFeedbacks ||
- !glGenTransformFeedbacks ||
- !glIsTransformFeedback ||
- !glPauseTransformFeedback ||
- !glResumeTransformFeedback ||
- !glGetProgramBinary ||
- !glProgramBinary ||
- !glProgramParameteri ||
- !glInvalidateFramebuffer ||
- !glInvalidateSubFramebuffer ||
- !glTexStorage2D ||
- !glTexStorage3D ||
- !glGetInternalformativ)
- {
- return GL_FALSE;
- }
-
- return GL_TRUE;
-}
-
-/* Function pointer definitions */
-GL_APICALL void (* GL_APIENTRY glReadBuffer) (GLenum mode);
-GL_APICALL void (* GL_APIENTRY glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices);
-GL_APICALL void (* GL_APIENTRY glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void (* GL_APIENTRY glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
-GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
-GL_APICALL void (* GL_APIENTRY glGenQueries) (GLsizei n, GLuint* ids);
-GL_APICALL void (* GL_APIENTRY glDeleteQueries) (GLsizei n, const GLuint* ids);
-GL_APICALL GLboolean (* GL_APIENTRY glIsQuery) (GLuint id);
-GL_APICALL void (* GL_APIENTRY glBeginQuery) (GLenum target, GLuint id);
-GL_APICALL void (* GL_APIENTRY glEndQuery) (GLenum target);
-GL_APICALL void (* GL_APIENTRY glGetQueryiv) (GLenum target, GLenum pname, GLint* params);
-GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint* params);
-GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer) (GLenum target);
-GL_APICALL void (* GL_APIENTRY glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid** params);
-GL_APICALL void (* GL_APIENTRY glDrawBuffers) (GLsizei n, const GLenum* bufs);
-GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-GL_APICALL void (* GL_APIENTRY glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length);
-GL_APICALL void (* GL_APIENTRY glBindVertexArray) (GLuint array);
-GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays) (GLsizei n, const GLuint* arrays);
-GL_APICALL void (* GL_APIENTRY glGenVertexArrays) (GLsizei n, GLuint* arrays);
-GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray) (GLuint array);
-GL_APICALL void (* GL_APIENTRY glGetIntegeri_v) (GLenum target, GLuint index, GLint* data);
-GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback) (GLenum primitiveMode);
-GL_APICALL void (* GL_APIENTRY glEndTransformFeedback) (void);
-GL_APICALL void (* GL_APIENTRY glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
-GL_APICALL void (* GL_APIENTRY glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
-GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
-GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
-GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint* params);
-GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint* params);
-GL_APICALL void (* GL_APIENTRY glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w);
-GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
-GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv) (GLuint index, const GLint* v);
-GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv) (GLuint index, const GLuint* v);
-GL_APICALL void (* GL_APIENTRY glGetUniformuiv) (GLuint program, GLint location, GLuint* params);
-GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation) (GLuint program, const GLchar *name);
-GL_APICALL void (* GL_APIENTRY glUniform1ui) (GLint location, GLuint v0);
-GL_APICALL void (* GL_APIENTRY glUniform2ui) (GLint location, GLuint v0, GLuint v1);
-GL_APICALL void (* GL_APIENTRY glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2);
-GL_APICALL void (* GL_APIENTRY glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-GL_APICALL void (* GL_APIENTRY glUniform1uiv) (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void (* GL_APIENTRY glUniform2uiv) (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void (* GL_APIENTRY glUniform3uiv) (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void (* GL_APIENTRY glUniform4uiv) (GLint location, GLsizei count, const GLuint* value);
-GL_APICALL void (* GL_APIENTRY glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint* value);
-GL_APICALL void (* GL_APIENTRY glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint* value);
-GL_APICALL void (* GL_APIENTRY glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
-GL_APICALL void (* GL_APIENTRY glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
-GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi) (GLenum name, GLuint index);
-GL_APICALL void (* GL_APIENTRY glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
-GL_APICALL void (* GL_APIENTRY glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
-GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
-GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex) (GLuint program, const GLchar* uniformBlockName);
-GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
-GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
-GL_APICALL void (* GL_APIENTRY glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
-GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
-GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount);
-GL_APICALL GLsync (* GL_APIENTRY glFenceSync) (GLenum condition, GLbitfield flags);
-GL_APICALL GLboolean (* GL_APIENTRY glIsSync) (GLsync sync);
-GL_APICALL void (* GL_APIENTRY glDeleteSync) (GLsync sync);
-GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
-GL_APICALL void (* GL_APIENTRY glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
-GL_APICALL void (* GL_APIENTRY glGetInteger64v) (GLenum pname, GLint64* params);
-GL_APICALL void (* GL_APIENTRY glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values);
-GL_APICALL void (* GL_APIENTRY glGetInteger64i_v) (GLenum target, GLuint index, GLint64* data);
-GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64* params);
-GL_APICALL void (* GL_APIENTRY glGenSamplers) (GLsizei count, GLuint* samplers);
-GL_APICALL void (* GL_APIENTRY glDeleteSamplers) (GLsizei count, const GLuint* samplers);
-GL_APICALL GLboolean (* GL_APIENTRY glIsSampler) (GLuint sampler);
-GL_APICALL void (* GL_APIENTRY glBindSampler) (GLuint unit, GLuint sampler);
-GL_APICALL void (* GL_APIENTRY glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param);
-GL_APICALL void (* GL_APIENTRY glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint* param);
-GL_APICALL void (* GL_APIENTRY glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param);
-GL_APICALL void (* GL_APIENTRY glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat* param);
-GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint* params);
-GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat* params);
-GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor) (GLuint index, GLuint divisor);
-GL_APICALL void (* GL_APIENTRY glBindTransformFeedback) (GLenum target, GLuint id);
-GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks) (GLsizei n, const GLuint* ids);
-GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks) (GLsizei n, GLuint* ids);
-GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback) (GLuint id);
-GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback) (void);
-GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback) (void);
-GL_APICALL void (* GL_APIENTRY glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary);
-GL_APICALL void (* GL_APIENTRY glProgramBinary) (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length);
-GL_APICALL void (* GL_APIENTRY glProgramParameteri) (GLuint program, GLenum pname, GLint value);
-GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
-GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
-GL_APICALL void (* GL_APIENTRY glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-GL_APICALL void (* GL_APIENTRY glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-GL_APICALL void (* GL_APIENTRY glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
diff --git a/ndk/sources/android/helper/interpolator.cpp b/ndk/sources/android/helper/interpolator.cpp
deleted file mode 100644
index 137b64f..0000000
--- a/ndk/sources/android/helper/interpolator.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "interpolator.h"
-#include <math.h>
-#include "interpolator.h"
-
-
-//-------------------------------------------------
-//Ctor
-//-------------------------------------------------
-interpolator::interpolator()
-{
- m_listParams.clear();
-}
-
-//-------------------------------------------------
-//Dtor
-//-------------------------------------------------
-interpolator::~interpolator()
-{
- m_listParams.clear();
-}
-
-void interpolator::clear()
-{
- m_listParams.clear();
-}
-
-interpolator& interpolator::set(float start,float dest, INTERPOLATOR_TYPE type, double duration)
-{
- //init the parameters for the interpolation process
- _dStartTime = perfMonitor::getCurrentTime();
- _dDestTime = _dStartTime + duration;
- _type = type;
-
- _fStartValue = start;
- _fDestValue = dest;
- return *this;
-}
-
-interpolator& interpolator::add(const float dest,
- INTERPOLATOR_TYPE type, double duration)
-{
- interpolatorParam param;
- param.fDestValue = dest;
- param.type = type;
- param.dDuration = duration;
- m_listParams.push_back( param );
- return *this;
-}
-
-bool interpolator::update( const double currentTime, float& p )
-{
- bool bContinue;
- if( currentTime >= _dDestTime )
- {
- p = _fDestValue;
- if( m_listParams.size () )
- {
- interpolatorParam& item = m_listParams.front();
- set(_fDestValue, item.fDestValue, item.type, item.dDuration );
- m_listParams.pop_front();
-
- bContinue = true;
- }
- else
- {
- bContinue = false;
- }
- }
- else
- {
- float t = (float)(currentTime - _dStartTime);
- float d = (float)(_dDestTime - _dStartTime);
- float b = _fStartValue;
- float c = _fDestValue - _fStartValue;
- p = getFormula(_type, t, b, d, c);
-
- bContinue = true;
- }
- return bContinue;
-}
-
-float interpolator::getFormula(INTERPOLATOR_TYPE type, float t, float b, float d, float c)
-{
- float t1;
- switch( type )
- {
- case INTERPOLATOR_TYPE_LINEAR:
- // simple linear interpolation - no easing
- return (c * t / d + b);
-
- case INTERPOLATOR_TYPE_EASEINQUAD:
- // quadratic (t^2) easing in - accelerating from zero velocity
- t1 = t / d;
- return (c * t1 * t1 + b);
-
- case INTERPOLATOR_TYPE_EASEOUTQUAD:
- // quadratic (t^2) easing out - decelerating to zero velocity
- t1 = t / d;
- return (-c * t1 * (t1-2) + b);
-
- case INTERPOLATOR_TYPE_EASEINOUTQUAD:
- // quadratic easing in/out - acceleration until halfway, then deceleration
- t1 = t / d / 2;
- if (t1 < 1)
- return ( c/2 * t1 * t1 + b);
- else
- {
- t1 = t1 -1;
- return (-c/2 * (t1 * (t1-2) - 1) + b);
- }
- case INTERPOLATOR_TYPE_EASEINCUBIC:
- // cubic easing in - accelerating from zero velocity
- t1 = t / d;
- return (c * t1 * t1 * t1 + b);
-
- case INTERPOLATOR_TYPE_EASEOUTCUBIC:
- // cubic easing in - accelerating from zero velocity
- t1 = t / d - 1;
- return (c * (t1 * t1 * t1 + 1) + b);
-
- case INTERPOLATOR_TYPE_EASEINOUTCUBIC:
- // cubic easing in - accelerating from zero velocity
- t1 = t / d / 2;
-
- if ( t1 < 1)
- return (c/2 * t1 * t1 * t1 + b);
- else
- {
- t1 -= 2;
- return (c/2 * (t1 * t1 * t1 + 2 ) + b);
- }
- case INTERPOLATOR_TYPE_EASEINQUART:
- // quartic easing in - accelerating from zero velocity
- t1 = t / d;
- return (c * t1 * t1 * t1 * t1 + b);
-
- case INTERPOLATOR_TYPE_EASEINEXPO:
- // exponential (2^t) easing in - accelerating from zero velocity
- if (t==0)
- return b;
- else
- return (c*powf(2,(10*(t/d-1)))+b);
-
- case INTERPOLATOR_TYPE_EASEOUTEXPO:
- // exponential (2^t) easing out - decelerating to zero velocity
- if (t==d)
- return (b+c);
- else
- return (c * (-powf(2,-10*t/d)+1)+b);
- default:
- return 0;
- }
-}
diff --git a/ndk/sources/android/helper/perfMonitor.cpp b/ndk/sources/android/helper/perfMonitor.cpp
deleted file mode 100644
index bc4f337..0000000
--- a/ndk/sources/android/helper/perfMonitor.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "perfMonitor.h"
-
-perfMonitor::perfMonitor():
- _dLastTick(0.f),
- _tvLastSec(0),
- _tickindex(0),
- _ticksum(0)
-{
- for(int32_t i = 0; i < NUM_SAMPLES; ++i )
- _ticklist[i] = 0;
-}
-
-perfMonitor::~perfMonitor() {
-}
-
-double perfMonitor::updateTick(double currentTick)
-{
- _ticksum -= _ticklist[_tickindex];
- _ticksum += currentTick;
- _ticklist[_tickindex] = currentTick;
- _tickindex = (_tickindex+1)%NUM_SAMPLES;
-
- return((double)_ticksum/NUM_SAMPLES);
-}
-
-bool perfMonitor::update(float &fFPS)
-{
- struct timeval Time;
- gettimeofday( &Time, NULL );
-
- double time = Time.tv_sec + Time.tv_usec * 1.0/1000000.0;
- double dTick = time - _dLastTick;
- double d = updateTick( dTick );
- _dLastTick = time;
-
- if( Time.tv_sec - _tvLastSec >= 1 )
- {
- double time = Time.tv_sec + Time.tv_usec * 1.0/1000000.0;
- _fCurrentFPS = 1.f / d;
- _tvLastSec = Time.tv_sec;
- fFPS = _fCurrentFPS;
- return true;
- }
- else
- {
- fFPS = _fCurrentFPS;
- return false;
- }
-}
diff --git a/ndk/sources/android/helper/shader.cpp b/ndk/sources/android/helper/shader.cpp
deleted file mode 100644
index f361a7a..0000000
--- a/ndk/sources/android/helper/shader.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "shader.h"
-#include "JNIHelper.h"
-
-#define DEBUG (1)
-
-bool shader::compileShader(GLuint *shader, const GLenum type,
- const char *strFileName, const std::map<std::string, std::string>& mapParameters)
-{
- std::vector<uint8_t> data;
- bool b = JNIHelper::readFile(strFileName, data);
- if (!b)
- {
- LOGI("Can not open a file:%s", strFileName);
- return false;
- }
-
- //Fill-in parameters
- std::string str(data.begin(), data.end());
- std::map<std::string, std::string>::const_iterator it = mapParameters.begin();
- std::map<std::string, std::string>::const_iterator itEnd = mapParameters.end();
- while( it != itEnd )
- {
- size_t pos = 0;
- while( (pos = str.find( it->first, pos )) != std::string::npos )
- {
- str.replace( pos, it->first.length(), it->second );
- pos += it->second.length();
- }
- it++;
- }
-
- std::vector<uint8_t> v( str.begin(), str.end() );
- str.clear();
- return shader::compileShader( shader, type, v );
-}
-
-bool shader::compileShader(GLuint *shader, const GLenum type,
- const GLchar *source, const int32_t iSize)
-{
- if( source == NULL || iSize <= 0 )
- return false;
-
- *shader = glCreateShader(type);
- glShaderSource(*shader, 1, &source, &iSize); //Not specifying 3rd parameter (size) could be troublesome..
-
- glCompileShader(*shader);
-
-#if defined(DEBUG)
- GLint logLength;
- glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength);
- if (logLength > 0) {
- GLchar *log = (GLchar *) malloc(logLength);
- glGetShaderInfoLog(*shader, logLength, &logLength, log);
- LOGI("Shader compile log:\n%s", log);
- free(log);
- }
-#endif
-
- GLint status;
- glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);
- if (status == 0) {
- glDeleteShader(*shader);
- return false;
- }
-
- return true;
-}
-
-bool shader::compileShader(GLuint *shader, const GLenum type,
- std::vector<uint8_t>& data)
-{
- if( !data.size() )
- return false;
-
- const GLchar *source = (GLchar *) &data[0];
- int32_t iSize = data.size();
- return shader::compileShader( shader, type, source, iSize );
-}
-
-bool shader::compileShader(GLuint *shader, const GLenum type,
- const char *strFileName) {
- std::vector<uint8_t> data;
- bool b = JNIHelper::readFile(strFileName, data);
- if (!b)
- {
- LOGI("Can not open a file:%s", strFileName);
- return false;
- }
-
- return shader::compileShader( shader, type, data );
-}
-
-bool shader::linkProgram(const GLuint prog) {
- GLint status;
-
- glLinkProgram(prog);
-
-#if defined(DEBUG)
- GLint logLength;
- glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
- if (logLength > 0) {
- GLchar *log = (GLchar *) malloc(logLength);
- glGetProgramInfoLog(prog, logLength, &logLength, log);
- LOGI("Program link log:\n%s", log);
- free(log);
- }
-#endif
-
- glGetProgramiv(prog, GL_LINK_STATUS, &status);
- if (status == 0) {
- LOGI("Program link failed\n");
- return false;
- }
-
- return true;
-}
-
-bool shader::validateProgram(const GLuint prog) {
- GLint logLength, status;
-
- glValidateProgram(prog);
- glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength);
- if (logLength > 0) {
- GLchar *log = (GLchar *) malloc(logLength);
- glGetProgramInfoLog(prog, logLength, &logLength, log);
- LOGI("Program validate log:\n%s", log);
- free(log);
- }
-
- glGetProgramiv(prog, GL_VALIDATE_STATUS, &status);
- if (status == 0)
- return false;
-
- return true;
-}
diff --git a/ndk/sources/android/helper/shader.h b/ndk/sources/android/helper/shader.h
deleted file mode 100644
index 3cdfeb4..0000000
--- a/ndk/sources/android/helper/shader.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef SHADER_H_
-#define SHADER_H_
-
-#include <jni.h>
-#include <errno.h>
-
-#include <vector>
-#include <map>
-#include <string>
-
-#include <EGL/egl.h>
-#include <GLES/gl.h>
-
-#include <android/sensor.h>
-#include <android/log.h>
-#include <android_native_app_glue.h>
-#include <android/native_window_jni.h>
-#include <cpu-features.h>
-
-#include "JNIHelper.h"
-
-/******************************************************************
- * Shader compiler helper
- *
- * compileShader() with std::map helps patching on a shader on the fly.
- * For a example,
- * map : %KEY% -> %VALUE% replaces all %KEY% entries in the given shader code to %VALUE"
- *
- */
-class shader {
-public:
- static bool compileShader(GLuint *shader, const GLenum type,
- std::vector<uint8_t>& data);
- static bool compileShader(GLuint *shader, const GLenum type,
- const GLchar *source, const int32_t iSize);
- static bool compileShader(GLuint *shader, const GLenum type,
- const char *strFileName);
- static bool compileShader(GLuint *shader, const GLenum type,
- const char *strFileName, const std::map<std::string, std::string>& mapParameters);
- static bool linkProgram(const GLuint prog);
- static bool validateProgram(const GLuint prog);
-};
-
-
-
-
-#endif /* SHADER_H_ */
diff --git a/ndk/sources/android/helper/tapCamera.cpp b/ndk/sources/android/helper/tapCamera.cpp
deleted file mode 100644
index 0b0f94b..0000000
--- a/ndk/sources/android/helper/tapCamera.cpp
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//----------------------------------------------------------
-// tapCamera.cpp
-// Camera control with tap
-//
-//----------------------------------------------------------
-
-#include <fstream>
-#include "tapCamera.h"
-
-const float TRANSFORM_FACTOR = 15.f;
-const float TRANSFORM_FACTORZ = 10.f;
-
-const float MOMENTUM_FACTOR_DECREASE = 0.85f;
-const float MOMENTUM_FACTOR_DECREASE_SHIFT = 0.9f;
-const float MOMENTUM_FACTOR = 0.8f;
-const float MOMENTUM_FACTOR_THRESHOLD = 0.001f;
-
-//----------------------------------------------------------
-// Ctor
-//----------------------------------------------------------
-tapCamera::tapCamera():
- _bDragging(false),
- _bPinching( false ),
- _bMomentum(false),
- _fBallRadius( 0.75f ),
- _fPinchStartDistanceSQ( 0.f ),
- _fRotation( 0.f ),
- _fRotationStart( 0.f ),
- _fRotationNow( 0.f ),
- _fMomentumSteps( 0.f ),
- _fFlipZ( 0.f )
-{
- //Init offset
- initParameters();
-
- _vFlip = vec2( 1.f, -1.f );
- _fFlipZ = -1.f;
- _vPinchTransformFactor = vec3( 1.f, 1.f, 1.f );
-
- _vBallCenter = vec2( 0, 0 );
- _vBallNow = vec2( 0, 0 );
- _vBallDown = vec2( 0, 0 );
-
- _vecPinchStart = vec2( 0, 0 );
- _vecPinchStartCenter = vec2( 0, 0 );
-
- _vFlip = vec2( 0, 0 );
-
-}
-
-void tapCamera::initParameters()
-{
- //Init parameters
- _vecOffset = vec3();
- _vecOffsetNow = vec3();
-
- _qBallRot = quaternion();
- _qBallNow = quaternion();
- _qBallNow.toMatrix(_mRotation);
- _fRotation = 0.f;
-
- _vDragDelta = vec2();
- _vecOffsetDelta = vec3();
-
- _bMomentum = false;
-}
-
-//----------------------------------------------------------
-// Dtor
-//----------------------------------------------------------
-tapCamera::~tapCamera()
-{
-
-}
-
-void tapCamera::update()
-{
- if( _bMomentum )
- {
- float fMomenttumSteps = _fMomentumSteps;
-
- //Momentum rotation
- vec2 v = _vDragDelta;
- beginDrag(vec2() ); //NOTE:This call reset _VDragDelta
- drag(v * _vFlip);
-
- //Momentum shift
- _vecOffset += _vecOffsetDelta;
-
- ballUpdate();
- endDrag();
-
- //Decrease deltas
- _vDragDelta = v * MOMENTUM_FACTOR_DECREASE;
- _vecOffsetDelta = _vecOffsetDelta * MOMENTUM_FACTOR_DECREASE_SHIFT;
-
- //Count steps
- _fMomentumSteps = fMomenttumSteps * MOMENTUM_FACTOR_DECREASE;
- if( _fMomentumSteps < MOMENTUM_FACTOR_THRESHOLD )
- {
- _bMomentum = false;
- }
- }
- else
- {
- _vDragDelta *= MOMENTUM_FACTOR;
- _vecOffsetDelta = _vecOffsetDelta * MOMENTUM_FACTOR;
- ballUpdate();
- }
-
- vec3 vec = _vecOffset + _vecOffsetNow;
- vec3 vecTmp(TRANSFORM_FACTOR, -TRANSFORM_FACTOR, TRANSFORM_FACTORZ);
-
- vec *= vecTmp * _vPinchTransformFactor;
-
- _mTransform = mat4::translation(vec);
-}
-
-mat4& tapCamera::getRotationMatrix()
-{
- return _mRotation;
-}
-
-mat4& tapCamera::getTransformMatrix()
-{
- return _mTransform;
-}
-
-void tapCamera::reset(const bool bAnimate)
-{
- initParameters();
- update();
-
-}
-
-//----------------------------------------------------------
-//Drag control
-//----------------------------------------------------------
-void tapCamera::beginDrag(const vec2& v)
-{
- if( _bDragging )
- endDrag();
-
- if( _bPinching )
- endPinch();
-
- vec2 vec = v * _vFlip;
- _vBallNow = vec;
- _vBallDown = _vBallNow;
-
- _bDragging = true;
- _bMomentum = false;
- _vLastInput = vec;
- _vDragDelta = vec2();
-}
-
-void tapCamera::endDrag()
-{
- int i;
- _qBallDown = _qBallNow;
- _qBallRot = quaternion();
-
- _bDragging = false;
- _bMomentum = true;
- _fMomentumSteps = 1.0f;
-}
-
-void tapCamera::drag(const vec2& v )
-{
- if( !_bDragging )
- return;
-
- vec2 vec = v * _vFlip;
- _vBallNow = vec;
-
- _vDragDelta = _vDragDelta * MOMENTUM_FACTOR + (vec - _vLastInput);
- _vLastInput = vec;
-}
-
-//----------------------------------------------------------
-//Pinch controll
-//----------------------------------------------------------
-void tapCamera::beginPinch(const vec2& v1, const vec2& v2)
-{
- if( _bDragging )
- endDrag();
-
- if( _bPinching )
- endPinch();
-
- beginDrag( vec2() );
-
- _vecPinchStartCenter = (v1 + v2) / 2.f;
-
- vec2 vec = v1 - v2;
- float fXDiff;
- float fYDiff;
- vec.value( fXDiff, fYDiff );
-
- _fPinchStartDistanceSQ = fXDiff*fXDiff + fYDiff*fYDiff;
- _fRotationStart = atan2f( fYDiff, fXDiff );
- _fRotationNow = 0;
-
- _bPinching = true;
- _bMomentum = false;
-
- //Init momentum factors
- _vecOffsetDelta = vec3();
-}
-
-
-void tapCamera::endPinch()
-{
- _bPinching = false;
- _bMomentum = true;
- _fMomentumSteps = 1.f;
- _vecOffset += _vecOffsetNow;
- _fRotation += _fRotationNow;
- _vecOffsetNow = vec3();
-
- _fRotationNow = 0;
-
- endDrag();
-}
-
-void tapCamera::pinch(const vec2& v1, const vec2& v2)
-{
- if( !_bPinching )
- return;
-
- //Update momentum factor
- _vecOffsetLast = _vecOffsetNow;
-
- float fXDiff, fYDiff;
- vec2 vec = v1 - v2;
- vec.value(fXDiff, fYDiff);
-
- float fDistanceSQ = fXDiff * fXDiff + fYDiff * fYDiff;
-
- float f = _fPinchStartDistanceSQ / fDistanceSQ;
- if( f < 1.f)
- f = -1.f / f + 1.0f;
- else
- f = f - 1.f;
- if( isnan(f) ) f = 0.f;
-
- vec = (v1 + v2) / 2.f - _vecPinchStartCenter;
- _vecOffsetNow = vec3( vec,
- _fFlipZ * f );
-
- //Update momentum factor
- _vecOffsetDelta = _vecOffsetDelta * MOMENTUM_FACTOR + (_vecOffsetNow - _vecOffsetLast);
-
- //
- //Update ration quaternion
- float fRotation = atan2f( fYDiff, fXDiff );
- _fRotationNow = fRotation - _fRotationStart;
-
- //Trackball rotation
- _qBallRot = quaternion( 0.f, 0.f, sinf(-_fRotationNow*0.5f), cosf(-_fRotationNow*0.5f) );
-}
-
-//----------------------------------------------------------
-//Trackball controll
-//----------------------------------------------------------
-void tapCamera::ballUpdate()
-{
- if (_bDragging) {
- vec3 vFrom = pointOnSphere(_vBallDown);
- vec3 vTo = pointOnSphere(_vBallNow);
-
- vec3 vec = vFrom.cross(vTo);
- float w = vFrom.dot( vTo );
-
- quaternion qDrag = quaternion(vec, w);
- qDrag = qDrag * _qBallDown;
- _qBallNow = _qBallRot * qDrag;
- }
- _qBallNow.toMatrix(_mRotation);
-}
-
-vec3 tapCamera::pointOnSphere(vec2& point)
-{
- vec3 ballMouse;
- float mag;
- vec2 vec = (point - _vBallCenter) / _fBallRadius;
- mag = vec.dot( vec );
- if (mag > 1.f)
- {
- float scale = 1.f / sqrtf(mag);
- vec *= scale;
- ballMouse = vec3( vec, 0.f );
- } else {
- ballMouse = vec3( vec, sqrtf(1.f - mag) );
- }
- return (ballMouse);
-}
diff --git a/ndk/sources/android/helper/tapCamera.h b/ndk/sources/android/helper/tapCamera.h
deleted file mode 100644
index 0c013c5..0000000
--- a/ndk/sources/android/helper/tapCamera.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-#include <vector>
-#include <string>
-#include <GLES2/gl2.h>
-
-#include "JNIHelper.h"
-#include "vecmath.h"
-#include "interpolator.h"
-
-/******************************************************************
- * Camera control helper class with a tap gesture
- * This class is mainly used for 3D space camera control in samples.
- *
- */
-class tapCamera
-{
-private:
- //Trackball
- vec2 _vBallCenter;
- float _fBallRadius;
- quaternion _qBallNow;
- quaternion _qBallDown;
- vec2 _vBallNow;
- vec2 _vBallDown;
- quaternion _qBallRot;
-
- bool _bDragging;
- bool _bPinching;
-
- //Pinch related info
- vec2 _vecPinchStart;
- vec2 _vecPinchStartCenter;
- float _fPinchStartDistanceSQ;
-
- //Camera shift
- vec3 _vecOffset;
- vec3 _vecOffsetNow;
-
- //Camera Rotation
- float _fRotation;
- float _fRotationStart;
- float _fRotationNow;
-
- //Momentum support
- bool _bMomentum;
- vec2 _vDragDelta;
- vec2 _vLastInput;
- vec3 _vecOffsetLast;
- vec3 _vecOffsetDelta;
- float _fMomentumSteps;
-
- vec2 _vFlip;
- float _fFlipZ;
-
- mat4 _mRotation;
- mat4 _mTransform;
-
- vec3 pointOnSphere(vec2& point);
- void ballUpdate();
- void initParameters();
-
- vec3 _vPinchTransformFactor;
-
-public:
- tapCamera();
- virtual ~tapCamera();
- void beginDrag(const vec2& vec);
- void endDrag();
- void drag(const vec2& vec);
- void update();
-
- mat4& getRotationMatrix();
- mat4& getTransformMatrix();
-
- void beginPinch(const vec2& v1, const vec2& v2);
- void endPinch();
- void pinch(const vec2& v1, const vec2& v2);
-
- void setFlip(const float fX, const float fY, const float fZ)
- {
- _vFlip = vec2( fX, fY );
- _fFlipZ = fZ;
- }
-
- void setPinchTransformFactor(const float fX, const float fY, const float fZ)
- {
- _vPinchTransformFactor = vec3( fX, fY, fZ);
- }
-
- void reset(const bool bAnimate);
-
-};
diff --git a/ndk/sources/android/helper/vecmath.cpp b/ndk/sources/android/helper/vecmath.cpp
deleted file mode 100644
index 1008523..0000000
--- a/ndk/sources/android/helper/vecmath.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//--------------------------------------------------------------------------------
-// vecmath.cpp
-//--------------------------------------------------------------------------------
-
-#include "vecmath.h"
-
-//--------------------------------------------------------------------------------
-// vec3
-//--------------------------------------------------------------------------------
-vec3::vec3(const vec4& vec)
-{
- x = vec.x; y = vec.y; z = vec.z;
-}
-
-//--------------------------------------------------------------------------------
-// vec4
-//--------------------------------------------------------------------------------
-vec4 vec4::operator*(const mat4& rhs) const
-{
- vec4 out;
- out.x = x * rhs.f[0] + y * rhs.f[1] + z * rhs.f[2] + w * rhs.f[3];
- out.y = x * rhs.f[4] + y * rhs.f[5] + z * rhs.f[6] + w * rhs.f[7];
- out.z = x * rhs.f[8] + y * rhs.f[9] + z * rhs.f[10] + w * rhs.f[11];
- out.w = x * rhs.f[12] + y * rhs.f[13] + z * rhs.f[14] + w * rhs.f[15];
- return out;
-}
-
-//--------------------------------------------------------------------------------
-// mat4
-//--------------------------------------------------------------------------------
-mat4::mat4()
-{
- for(int32_t i = 0; i < 16; ++i)
- f[i] = 0.f;
-}
-
-mat4::mat4(const float* mIn )
-{
- for(int32_t i = 0; i < 16; ++i)
- f[i] = mIn[i];
-}
-
-mat4 mat4::operator*(const mat4& rhs) const
-{
- mat4 ret;
- ret.f[0] = f[0]*rhs.f[0] + f[4]*rhs.f[1] + f[8]*rhs.f[2] + f[12]*rhs.f[3];
- ret.f[1] = f[1]*rhs.f[0] + f[5]*rhs.f[1] + f[9]*rhs.f[2] + f[13]*rhs.f[3];
- ret.f[2] = f[2]*rhs.f[0] + f[6]*rhs.f[1] + f[10]*rhs.f[2] + f[14]*rhs.f[3];
- ret.f[3] = f[3]*rhs.f[0] + f[7]*rhs.f[1] + f[11]*rhs.f[2] + f[15]*rhs.f[3];
-
- ret.f[4] = f[0]*rhs.f[4] + f[4]*rhs.f[5] + f[8]*rhs.f[6] + f[12]*rhs.f[7];
- ret.f[5] = f[1]*rhs.f[4] + f[5]*rhs.f[5] + f[9]*rhs.f[6] + f[13]*rhs.f[7];
- ret.f[6] = f[2]*rhs.f[4] + f[6]*rhs.f[5] + f[10]*rhs.f[6] + f[14]*rhs.f[7];
- ret.f[7] = f[3]*rhs.f[4] + f[7]*rhs.f[5] + f[11]*rhs.f[6] + f[15]*rhs.f[7];
-
- ret.f[8] = f[0]*rhs.f[8] + f[4]*rhs.f[9] + f[8]*rhs.f[10] + f[12]*rhs.f[11];
- ret.f[9] = f[1]*rhs.f[8] + f[5]*rhs.f[9] + f[9]*rhs.f[10] + f[13]*rhs.f[11];
- ret.f[10] = f[2]*rhs.f[8] + f[6]*rhs.f[9] + f[10]*rhs.f[10] + f[14]*rhs.f[11];
- ret.f[11] = f[3]*rhs.f[8] + f[7]*rhs.f[9] + f[11]*rhs.f[10] + f[15]*rhs.f[11];
-
- ret.f[12] = f[0]*rhs.f[12] + f[4]*rhs.f[13] + f[8]*rhs.f[14] + f[12]*rhs.f[15];
- ret.f[13] = f[1]*rhs.f[12] + f[5]*rhs.f[13] + f[9]*rhs.f[14] + f[13]*rhs.f[15];
- ret.f[14] = f[2]*rhs.f[12] + f[6]*rhs.f[13] + f[10]*rhs.f[14] + f[14]*rhs.f[15];
- ret.f[15] = f[3]*rhs.f[12] + f[7]*rhs.f[13] + f[11]*rhs.f[14] + f[15]*rhs.f[15];
-
- return ret;
-}
-
-vec4 mat4::operator*(const vec4& rhs) const
-{
- vec4 ret;
- ret.x = rhs.x*f[0] + rhs.y*f[4] + rhs.z*f[8] + rhs.w*f[12];
- ret.y = rhs.x*f[1] + rhs.y*f[5] + rhs.z*f[9] + rhs.w*f[13];
- ret.z = rhs.x*f[2] + rhs.y*f[6] + rhs.z*f[10] + rhs.w*f[14];
- ret.w = rhs.x*f[3] + rhs.y*f[7] + rhs.z*f[11] + rhs.w*f[15];
- return ret;
-}
-
-mat4 mat4::inverse()
-{
- mat4 ret;
- float det_1;
- float pos = 0;
- float neg = 0;
- float temp;
-
- temp = f[0] * f[5] * f[10];
- if (temp >= 0) pos += temp; else neg += temp;
- temp = f[4] * f[9] * f[2];
- if (temp >= 0) pos += temp; else neg += temp;
- temp = f[8] * f[1] * f[6];
- if (temp >= 0) pos += temp; else neg += temp;
- temp = -f[8] * f[5] * f[2];
- if (temp >= 0) pos += temp; else neg += temp;
- temp = -f[4] * f[1] * f[10];
- if (temp >= 0) pos += temp; else neg += temp;
- temp = -f[0] * f[9] * f[6];
- if (temp >= 0) pos += temp; else neg += temp;
- det_1 = pos + neg;
-
- if (det_1 == 0.0)
- {
- //Error
- }
- else
- {
- det_1 = 1.0f / det_1;
- ret.f[0] = ( f[ 5] * f[10] - f[ 9] * f[ 6] ) * det_1;
- ret.f[1] = -( f[ 1] * f[10] - f[ 9] * f[ 2] ) * det_1;
- ret.f[2] = ( f[ 1] * f[ 6] - f[ 5] * f[ 2] ) * det_1;
- ret.f[4] = -( f[ 4] * f[10] - f[ 8] * f[ 6] ) * det_1;
- ret.f[5] = ( f[ 0] * f[10] - f[ 8] * f[ 2] ) * det_1;
- ret.f[6] = -( f[ 0] * f[ 6] - f[ 4] * f[ 2] ) * det_1;
- ret.f[8] = ( f[ 4] * f[ 9] - f[ 8] * f[ 5] ) * det_1;
- ret.f[9] = -( f[ 0] * f[ 9] - f[ 8] * f[ 1] ) * det_1;
- ret.f[10] = ( f[ 0] * f[ 5] - f[ 4] * f[ 1] ) * det_1;
-
- /* Calculate -C * inverse(A) */
- ret.f[12] = - ( f[12] *ret.f[0] + f[13] * ret.f[4] + f[14] *ret.f[8] );
- ret.f[13] = - ( f[12] * ret.f[1] + f[13] * ret.f[5] + f[14] * ret.f[9] );
- ret.f[14] = - ( f[12] * ret.f[2] + f[13] * ret.f[6] + f[14] * ret.f[10] );
-
- ret.f[ 3] = 0.0f;
- ret.f[ 7] = 0.0f;
- ret.f[11] = 0.0f;
- ret.f[15] = 1.0f;
- }
-
- *this = ret;
- return *this;
-}
-
-//--------------------------------------------------------------------------------
-// Misc
-//--------------------------------------------------------------------------------
-mat4 mat4::rotationX(
- const float fAngle)
-{
- mat4 ret;
- float fCosine, fSine;
-
- fCosine = cosf(fAngle);
- fSine = sinf(fAngle);
-
- ret.f[ 0]=1.0f; ret.f[ 4]=0.0f; ret.f[ 8]=0.0f; ret.f[12]=0.0f;
- ret.f[ 1]=0.0f; ret.f[ 5]=fCosine; ret.f[ 9]=fSine; ret.f[13]=0.0f;
- ret.f[ 2]=0.0f; ret.f[ 6]=-fSine; ret.f[10]=fCosine; ret.f[14]=0.0f;
- ret.f[ 3]=0.0f; ret.f[ 7]=0.0f; ret.f[11]=0.0f; ret.f[15]=1.0f;
- return ret;
-}
-
-mat4 mat4::rotationY(
- const float fAngle)
-{
- mat4 ret;
- float fCosine, fSine;
-
- fCosine = cosf(fAngle);
- fSine = sinf(fAngle);
-
- ret.f[ 0]=fCosine; ret.f[ 4]=0.0f; ret.f[ 8]=-fSine; ret.f[12]=0.0f;
- ret.f[ 1]=0.0f; ret.f[ 5]=1.0f; ret.f[ 9]=0.0f; ret.f[13]=0.0f;
- ret.f[ 2]=fSine; ret.f[ 6]=0.0f; ret.f[10]=fCosine; ret.f[14]=0.0f;
- ret.f[ 3]=0.0f; ret.f[ 7]=0.0f; ret.f[11]=0.0f; ret.f[15]=1.0f;
- return ret;
-
-}
-
-mat4 mat4::rotationZ(
- const float fAngle)
-{
- mat4 ret;
- float fCosine, fSine;
-
- fCosine = cosf(fAngle);
- fSine = sinf(fAngle);
-
- ret.f[ 0]=fCosine; ret.f[ 4]=fSine; ret.f[ 8]=0.0f; ret.f[12]=0.0f;
- ret.f[ 1]=-fSine; ret.f[ 5]=fCosine; ret.f[ 9]=0.0f; ret.f[13]=0.0f;
- ret.f[ 2]=0.0f; ret.f[ 6]=0.0f; ret.f[10]=1.0f; ret.f[14]=0.0f;
- ret.f[ 3]=0.0f; ret.f[ 7]=0.0f; ret.f[11]=0.0f; ret.f[15]=1.0f;
- return ret;
-}
-
-mat4 mat4::translation(
- const float fX,
- const float fY,
- const float fZ)
-{
- mat4 ret;
- ret.f[ 0]=1.0f; ret.f[ 4]=0.0f; ret.f[ 8]=0.0f; ret.f[12]=fX;
- ret.f[ 1]=0.0f; ret.f[ 5]=1.0f; ret.f[ 9]=0.0f; ret.f[13]=fY;
- ret.f[ 2]=0.0f; ret.f[ 6]=0.0f; ret.f[10]=1.0f; ret.f[14]=fZ;
- ret.f[ 3]=0.0f; ret.f[ 7]=0.0f; ret.f[11]=0.0f; ret.f[15]=1.0f;
- return ret;
-}
-
-mat4 mat4::translation(
- const vec3 vec)
-{
- mat4 ret;
- ret.f[ 0]=1.0f; ret.f[ 4]=0.0f; ret.f[ 8]=0.0f; ret.f[12]=vec.x;
- ret.f[ 1]=0.0f; ret.f[ 5]=1.0f; ret.f[ 9]=0.0f; ret.f[13]=vec.y;
- ret.f[ 2]=0.0f; ret.f[ 6]=0.0f; ret.f[10]=1.0f; ret.f[14]=vec.z;
- ret.f[ 3]=0.0f; ret.f[ 7]=0.0f; ret.f[11]=0.0f; ret.f[15]=1.0f;
- return ret;
-}
-
-mat4 mat4::perspective(
- float width,
- float height,
- float nearPlane, float farPlane)
-{
- float n2 = 2.0f * nearPlane;
- float rcpnmf = 1.f/(nearPlane - farPlane);
-
- mat4 result;
- result.f[0] = n2 / width; result.f[4] = 0; result.f[8] = 0; result.f[12] = 0;
- result.f[1] = 0; result.f[5] = n2 / height; result.f[9] = 0; result.f[13] = 0;
- result.f[2] = 0; result.f[6] = 0; result.f[10] = (farPlane+nearPlane)*rcpnmf; result.f[14] = farPlane*rcpnmf*n2;
- result.f[3] = 0; result.f[7] = 0; result.f[11] = -1.0; result.f[15]=0;
-
- return result;
-}
-
-mat4 mat4::lookAt(const vec3& vEye, const vec3& vAt, const vec3& vUp)
-{
- vec3 vForward, vUpNorm, vSide;
- mat4 result;
-
- vForward.x = vEye.x - vAt.x;
- vForward.y = vEye.y - vAt.y;
- vForward.z = vEye.z - vAt.z;
-
- vForward.normalize();
- vUpNorm = vUp;
- vUpNorm.normalize();
- vSide = vUpNorm.cross( vForward);
- vUpNorm = vForward.cross(vSide);
-
- result.f[0]=vSide.x; result.f[4]=vSide.y; result.f[8]=vSide.z; result.f[12]=0;
- result.f[1]=vUpNorm.x; result.f[5]=vUpNorm.y; result.f[9]=vUpNorm.z; result.f[13]=0;
- result.f[2]=vForward.x; result.f[6]=vForward.y; result.f[10]=vForward.z; result.f[14]=0;
- result.f[3]=0; result.f[7]=0; result.f[11]=0; result.f[15]=1.0;
-
- result.postTranslate(-vEye.x, -vEye.y, -vEye.z);
- return result;
-}
-
diff --git a/ndk/sources/android/helper/vecmath.h b/ndk/sources/android/helper/vecmath.h
deleted file mode 100644
index a959dff..0000000
--- a/ndk/sources/android/helper/vecmath.h
+++ /dev/null
@@ -1,1051 +0,0 @@
-/*
- * Copyright 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef VECMATH_H_
-#define VECMATH_H_
-
-#include <math.h>
-#include "JNIHelper.h"
-
-/******************************************************************
- * Helper class for vector math operations
- * Currently all implementations are in pure C++.
- * Each class is an opaque class so caller does not have a direct access
- * to each element. This is for an ease of future optimization to use vector operations.
- *
- */
-
-class vec2;
-class vec3;
-class vec4;
-class mat4;
-
-/******************************************************************
- * 2 elements vector class
- *
- */
-class vec2
-{
-private:
- float x,y;
-
-public:
- friend class vec3;
- friend class vec4;
- friend class mat4;
- friend class quaternion;
-
- vec2()
- {
- x = y = 0.f;
- }
-
- vec2(const float fX, const float fY)
- {
- x = fX; y = fY;
- }
-
- vec2(const vec2& vec)
- {
- x = vec.x;
- y = vec.y;
- }
-
- vec2(const float* pVec)
- {
- x = (*pVec++); y = (*pVec++);
- }
-
- //Operators
- vec2 operator*(const vec2& rhs) const
- {
- vec2 ret;
- ret.x = x*rhs.x;
- ret.y = y*rhs.y;
- return ret;
- }
-
- vec2 operator/(const vec2& rhs) const
- {
- vec2 ret;
- ret.x = x/rhs.x;
- ret.y = y/rhs.y;
- return ret;
- }
-
- vec2 operator+(const vec2& rhs) const
- {
- vec2 ret;
- ret.x = x + rhs.x;
- ret.y = y + rhs.y;
- return ret;
- }
-
- vec2 operator-(const vec2& rhs) const
- {
- vec2 ret;
- ret.x = x - rhs.x;
- ret.y = y - rhs.y;
- return ret;
- }
-
- vec2& operator+=(const vec2& rhs)
- {
- x += rhs.x;
- y += rhs.y;
- return *this;
- }
-
- vec2& operator-=(const vec2& rhs)
- {
- x -= rhs.x;
- y -= rhs.y;
- return *this;
- }
-
- vec2& operator*=(const vec2& rhs)
- {
- x *= rhs.x;
- y *= rhs.y;
- return *this;
- }
-
- vec2& operator/=(const vec2& rhs)
- {
- x /= rhs.x;
- y /= rhs.y;
- return *this;
- }
-
- //External operators
- friend vec2 operator-(const vec2& rhs) { return vec2(rhs) *= -1; }
-
- friend vec2 operator*(const float lhs, const vec2& rhs)
- {
- vec2 ret;
- ret.x = lhs * rhs.x;
- ret.y = lhs * rhs.y;
- return ret;
- }
-
- friend vec2 operator/(const float lhs, const vec2& rhs)
- {
- vec2 ret;
- ret.x = lhs / rhs.x;
- ret.y = lhs / rhs.y;
- return ret;
- }
-
- //Operators with float
- vec2 operator*(const float& rhs) const
- {
- vec2 ret;
- ret.x = x * rhs;
- ret.y = y * rhs;
- return ret;
- }
-
- vec2& operator*=(const float& rhs)
- {
- x = x * rhs;
- y = y * rhs;
- return *this;
- }
-
- vec2 operator/(const float& rhs) const
- {
- vec2 ret;
- ret.x = x / rhs;
- ret.y = y / rhs;
- return ret;
- }
-
- vec2& operator/=(const float& rhs)
- {
- x = x / rhs;
- y = y / rhs;
- return *this;
- }
-
- //Compare
- bool operator==(const vec2& rhs) const
- {
- if(x != rhs.x || y != rhs.y ) return false;
- return true;
- }
-
- bool operator!=(const vec2& rhs) const
- {
- if(x == rhs.x)
- return false;
-
- return true;
- }
-
- float length() const
- {
- return sqrtf(x*x + y*y);
- }
-
- vec2 normalize()
- {
- float len = length();
- x = x / len;
- y = y / len;
- return *this;
- }
-
- float dot(const vec2& rhs)
- {
- return x * rhs.x + y*rhs.y;
- }
-
- bool validate()
- {
- if( isnan( x ) || isnan( y ) )
- return false;
- return true;
- }
-
- void value(float& fX, float& fY)
- {
- fX = x;
- fY = y;
- }
-
- void dump()
- {
- LOGI("vec2 %f %f", x, y);
- }
-};
-
-/******************************************************************
- * 3 elements vector class
- *
- */
-class vec3
-{
-private:
- float x,y,z;
-
-public:
- friend class vec4;
- friend class mat4;
- friend class quaternion;
-
- vec3()
- {
- x = y = z = 0.f;
- }
-
- vec3(const float fX, const float fY, const float fZ)
- {
- x = fX; y = fY; z = fZ;
- }
-
- vec3(const vec3& vec)
- {
- x = vec.x;
- y = vec.y;
- z = vec.z;
- }
-
- vec3(const float* pVec)
- {
- x = (*pVec++); y = (*pVec++); z = *pVec;
- }
-
- vec3(const vec2& vec, float f )
- {
- x = vec.x;
- y = vec.y;
- z = f;
- }
-
- vec3(const vec4& vec );
-
- //Operators
- vec3 operator*(const vec3& rhs) const
- {
- vec3 ret;
- ret.x = x*rhs.x;
- ret.y = y*rhs.y;
- ret.z = z*rhs.z;
- return ret;
- }
-
- vec3 operator/(const vec3& rhs) const
- {
- vec3 ret;
- ret.x = x/rhs.x;
- ret.y = y/rhs.y;
- ret.z = z/rhs.z;
- return ret;
- }
-
- vec3 operator+(const vec3& rhs) const
- {
- vec3 ret;
- ret.x = x + rhs.x;
- ret.y = y + rhs.y;
- ret.z = z + rhs.z;
- return ret;
- }
-
- vec3 operator-(const vec3& rhs) const
- {
- vec3 ret;
- ret.x = x - rhs.x;
- ret.y = y - rhs.y;
- ret.z = z - rhs.z;
- return ret;
- }
-
- vec3& operator+=(const vec3& rhs)
- {
- x += rhs.x;
- y += rhs.y;
- z += rhs.z;
- return *this;
- }
-
- vec3& operator-=(const vec3& rhs)
- {
- x -= rhs.x;
- y -= rhs.y;
- z -= rhs.z;
- return *this;
- }
-
- vec3& operator*=(const vec3& rhs)
- {
- x *= rhs.x;
- y *= rhs.y;
- z *= rhs.z;
- return *this;
- }
-
- vec3& operator/=(const vec3& rhs)
- {
- x /= rhs.x;
- y /= rhs.y;
- z /= rhs.z;
- return *this;
- }
-
- //External operators
- friend vec3 operator-(const vec3& rhs) { return vec3(rhs) *= -1; }
-
- friend vec3 operator*(const float lhs, const vec3& rhs)
- {
- vec3 ret;
- ret.x = lhs * rhs.x;
- ret.y = lhs * rhs.y;
- ret.z = lhs * rhs.z;
- return ret;
- }
-
- friend vec3 operator/(const float lhs, const vec3& rhs)
- {
- vec3 ret;
- ret.x = lhs / rhs.x;
- ret.y = lhs / rhs.y;
- ret.z = lhs / rhs.z;
- return ret;
- }
-
- //Operators with float
- vec3 operator*(const float& rhs) const
- {
- vec3 ret;
- ret.x = x * rhs;
- ret.y = y * rhs;
- ret.z = z * rhs;
- return ret;
- }
-
- vec3& operator*=(const float& rhs)
- {
- x = x * rhs;
- y = y * rhs;
- z = z * rhs;
- return *this;
- }
-
- vec3 operator/(const float& rhs) const
- {
- vec3 ret;
- ret.x = x / rhs;
- ret.y = y / rhs;
- ret.z = z / rhs;
- return ret;
- }
-
- vec3& operator/=(const float& rhs)
- {
- x = x / rhs;
- y = y / rhs;
- z = z / rhs;
- return *this;
- }
-
- //Compare
- bool operator==(const vec3& rhs) const
- {
- if(x != rhs.x || y != rhs.y || z != rhs.z) return false;
- return true;
- }
-
- bool operator!=(const vec3& rhs) const
- {
- if(x == rhs.x)
- return false;
-
- return true;
- }
-
- float length() const
- {
- return sqrtf(x*x + y*y + z*z);
- }
-
- vec3 normalize()
- {
- float len = length();
- x = x / len;
- y = y / len;
- z = z / len;
- return *this;
- }
-
- float dot(const vec3& rhs)
- {
- return x * rhs.x + y*rhs.y + z*rhs.z;
- }
-
- vec3 cross(const vec3& rhs)
- {
- vec3 ret;
- ret.x = y*rhs.z - z*rhs.y;
- ret.y = z*rhs.x - x*rhs.z;
- ret.z = x*rhs.y - y*rhs.x;
- return ret;
- }
-
- bool validate()
- {
- if( isnan( x ) || isnan( y ) || isnan( z ) )
- return false;
- return true;
- }
-
- void value(float& fX, float& fY, float& fZ)
- {
- fX = x;
- fY = y;
- fZ = z;
- }
-
- void dump()
- {
- LOGI("vec3 %f %f %f", x, y, z);
- }
-};
-
-/******************************************************************
- * 4 elements vector class
- *
- */
-class vec4
-{
-private:
- float x,y,z,w;
-
-public:
- friend class vec3;
- friend class mat4;
- friend class quaternion;
-
- vec4()
- {
- x = y = z = w = 0.f;
- }
-
- vec4(const float fX, const float fY, const float fZ, const float fW )
- {
- x = fX; y = fY; z = fZ; w = fW;
- }
-
- vec4(const vec4& vec)
- {
- x = vec.x;
- y = vec.y;
- z = vec.z;
- w = vec.w;
- }
-
- vec4(const vec3& vec, const float fW )
- {
- x = vec.x; y = vec.y; z = vec.z; w = fW;
- }
-
- vec4(const float* pVec)
- {
- x = (*pVec++); y = (*pVec++); z = *pVec; w = *pVec;
- }
-
- //Operators
- vec4 operator*(const vec4& rhs) const
- {
- vec4 ret;
- ret.x = x*rhs.x;
- ret.y = y*rhs.y;
- ret.z = z*rhs.z;
- ret.w = z*rhs.w;
- return ret;
- }
-
- vec4 operator/(const vec4& rhs) const
- {
- vec4 ret;
- ret.x = x/rhs.x;
- ret.y = y/rhs.y;
- ret.z = z/rhs.z;
- ret.w = z/rhs.w;
- return ret;
- }
-
- vec4 operator+(const vec4& rhs) const
- {
- vec4 ret;
- ret.x = x+rhs.x;
- ret.y = y+rhs.y;
- ret.z = z+rhs.z;
- ret.w = z+rhs.w;
- return ret;
- }
-
- vec4 operator-(const vec4& rhs) const
- {
- vec4 ret;
- ret.x = x-rhs.x;
- ret.y = y-rhs.y;
- ret.z = z-rhs.z;
- ret.w = z-rhs.w;
- return ret;
- }
-
- vec4& operator+=(const vec4& rhs)
- {
- x += rhs.x;
- y += rhs.y;
- z += rhs.z;
- w += rhs.w;
- return *this;
- }
-
- vec4& operator-=(const vec4& rhs)
- {
- x -= rhs.x;
- y -= rhs.y;
- z -= rhs.z;
- w -= rhs.w;
- return *this;
- }
-
- vec4& operator*=(const vec4& rhs)
- {
- x *= rhs.x;
- y *= rhs.y;
- z *= rhs.z;
- w *= rhs.w;
- return *this;
- }
-
- vec4& operator/=(const vec4& rhs)
- {
- x /= rhs.x;
- y /= rhs.y;
- z /= rhs.z;
- w /= rhs.w;
- return *this;
- }
-
- //External operators
- friend vec4 operator-(const vec4& rhs) { return vec4(rhs) *= -1; }
-
- friend vec4 operator*(const float lhs, const vec4& rhs)
- {
- vec4 ret;
- ret.x = lhs * rhs.x;
- ret.y = lhs * rhs.y;
- ret.z = lhs * rhs.z;
- ret.w = lhs * rhs.w;
- return ret;
- }
-
- friend vec4 operator/(const float lhs, const vec4& rhs)
- {
- vec4 ret;
- ret.x = lhs / rhs.x;
- ret.y = lhs / rhs.y;
- ret.z = lhs / rhs.z;
- ret.w = lhs / rhs.w;
- return ret;
- }
-
- //Operators with float
- vec4 operator*(const float& rhs) const
- {
- vec4 ret;
- ret.x = x * rhs;
- ret.y = y * rhs;
- ret.z = z * rhs;
- ret.w = w * rhs;
- return ret;
- }
-
- vec4& operator*=(const float& rhs)
- {
- x = x * rhs;
- y = y * rhs;
- z = z * rhs;
- w = w * rhs;
- return *this;
- }
-
- vec4 operator/(const float& rhs) const
- {
- vec4 ret;
- ret.x = x / rhs;
- ret.y = y / rhs;
- ret.z = z /rhs;
- ret.w = w /rhs;
- return ret;
- }
-
- vec4& operator/=(const float& rhs)
- {
- x = x / rhs;
- y = y / rhs;
- z = z / rhs;
- w = w / rhs;
- return *this;
- }
-
- //Compare
- bool operator==(const vec4& rhs) const
- {
- if(x != rhs.x || y != rhs.y || z != rhs.z || w != rhs.w) return false;
- return true;
- }
-
- bool operator!=(const vec4& rhs) const
- {
- if(x == rhs.x)
- return false;
-
- return true;
- }
-
- vec4 operator*(const mat4& rhs) const;
-
- float length() const
- {
- return sqrtf(x*x + y*y + z*z + w*w);
- }
-
- vec4 normalize()
- {
- float len = length();
- x = x / len;
- y = y / len;
- z = z / len;
- w = w / len;
- return *this;
- }
-
- float dot(const vec3& rhs)
- {
- return x * rhs.x + y*rhs.y + z*rhs.z;
- }
-
- vec3 cross(const vec3& rhs)
- {
- vec3 ret;
- ret.x = y*rhs.z - z*rhs.y;
- ret.y = z*rhs.x - x*rhs.z;
- ret.z = x*rhs.y - y*rhs.x;
- return ret;
- }
-
- bool validate()
- {
- if( isnan( x ) || isnan( y ) || isnan( z ) || isnan( w ))
- return false;
- return true;
- }
-
- void value(float& fX, float& fY, float& fZ, float& fW)
- {
- fX = x;
- fY = y;
- fZ = z;
- fW = w;
- }
-};
-
-/******************************************************************
- * 4x4 matrix
- *
- */
-class mat4
-{
-private:
- float f[16];
-
-public:
- friend class vec3;
- friend class vec4;
- friend class quaternion;
-
- mat4();
- mat4(const float*);
-
- mat4 operator*(const mat4& rhs) const;
- vec4 operator*(const vec4& rhs) const;
-
- mat4 operator+(const mat4& rhs) const
- {
- mat4 ret;
- for(int32_t i=0; i < 16; ++i)
- {
- ret.f[i] = f[i] + rhs.f[i];
- }
- return ret;
- }
-
- mat4 operator-(const mat4& rhs) const
- {
- mat4 ret;
- for(int32_t i=0; i < 16; ++i)
- {
- ret.f[i] = f[i] - rhs.f[i];
- }
- return ret;
- }
-
- mat4& operator+=(const mat4& rhs)
- {
- for(int32_t i=0; i < 16; ++i)
- {
- f[i] += rhs.f[i];
- }
- return *this;
- }
-
- mat4& operator-=(const mat4& rhs)
- {
- for(int32_t i=0; i < 16; ++i)
- {
- f[i] -= rhs.f[i];
- }
- return *this;
- }
-
- mat4& operator*=(const mat4& rhs)
- {
- mat4 ret;
- ret.f[0] = f[0] * rhs.f[0] + f[4] * rhs.f[1] + f[8] * rhs.f[2] + f[12] * rhs.f[3];
- ret.f[1] = f[1] * rhs.f[0] + f[5] * rhs.f[1] + f[9] * rhs.f[2] + f[13] * rhs.f[3];
- ret.f[2] = f[2] * rhs.f[0] + f[6] * rhs.f[1] + f[10] * rhs.f[2] + f[14] * rhs.f[3];
- ret.f[3] = f[3] * rhs.f[0] + f[7] * rhs.f[1] + f[11] * rhs.f[2] + f[15] * rhs.f[3];
-
- ret.f[4] = f[0] * rhs.f[4] + f[4] * rhs.f[5] + f[8] * rhs.f[6] + f[12] * rhs.f[7];
- ret.f[5] = f[1] * rhs.f[4] + f[5] * rhs.f[5] + f[9] * rhs.f[6] + f[13] * rhs.f[7];
- ret.f[6] = f[2] * rhs.f[4] + f[6] * rhs.f[5] + f[10] * rhs.f[6] + f[14] * rhs.f[7];
- ret.f[7] = f[3] * rhs.f[4] + f[7] * rhs.f[5] + f[11] * rhs.f[6] + f[15] * rhs.f[7];
-
- ret.f[8] = f[0] * rhs.f[8] + f[4] * rhs.f[9] + f[8] * rhs.f[10] + f[12] * rhs.f[11];
- ret.f[9] = f[1] * rhs.f[8] + f[5] * rhs.f[9] + f[9] * rhs.f[10] + f[13] * rhs.f[11];
- ret.f[10] = f[2] * rhs.f[8] + f[6] * rhs.f[9] + f[10] * rhs.f[10] + f[14] * rhs.f[11];
- ret.f[11] = f[3] * rhs.f[8] + f[7] * rhs.f[9] + f[11] * rhs.f[10] + f[15] * rhs.f[11];
-
- ret.f[12] = f[0] * rhs.f[12] + f[4] * rhs.f[13] + f[8] * rhs.f[14] + f[12] * rhs.f[15];
- ret.f[13] = f[1] * rhs.f[12] + f[5] * rhs.f[13] + f[9] * rhs.f[14] + f[13] * rhs.f[15];
- ret.f[14] = f[2] * rhs.f[12] + f[6] * rhs.f[13] + f[10] * rhs.f[14] + f[14] * rhs.f[15];
- ret.f[15] = f[3] * rhs.f[12] + f[7] * rhs.f[13] + f[11] * rhs.f[14] + f[15] * rhs.f[15];
-
- *this = ret;
- return *this;
- }
-
- mat4 operator*(const float rhs)
- {
- mat4 ret;
- for(int32_t i=0; i < 16; ++i)
- {
- ret.f[i] = f[i] * rhs;
- }
- return ret;
- }
-
- mat4& operator*=(const float rhs)
- {
- for(int32_t i=0; i < 16; ++i)
- {
- f[i] *= rhs;
- }
- return *this;
- }
-
- mat4& operator=(const mat4& rhs)
- {
- for(int32_t i=0; i < 16; ++i)
- {
- f[i] = rhs.f[i];
- }
- return *this;
- }
-
- mat4 inverse();
-
- mat4 transpose()
- {
- mat4 ret;
- ret.f[0] = f[0]; ret.f[1] = f[4]; ret.f[2] = f[8]; ret.f[3] = f[12];
- ret.f[4] = f[1]; ret.f[5] = f[5]; ret.f[6] = f[9]; ret.f[7] = f[13];
- ret.f[8] = f[2]; ret.f[9] = f[6]; ret.f[10] = f[10]; ret.f[11] = f[14];
- ret.f[12] = f[3]; ret.f[13] = f[7]; ret.f[14] = f[11]; ret.f[15] = f[15];
- *this = ret;
- return *this;
- }
-
- mat4& postTranslate(float tx, float ty, float tz)
- {
- f[12] += (tx*f[0])+(ty*f[4])+(tz*f[8]);
- f[13] += (tx*f[1])+(ty*f[5])+(tz*f[9]);
- f[14] += (tx*f[2])+(ty*f[6])+(tz*f[10]);
- f[15] += (tx*f[3])+(ty*f[7])+(tz*f[11]);
- return *this;
- }
-
- float* ptr() {
- return f;
- }
-
- //--------------------------------------------------------------------------------
- // Misc
- //--------------------------------------------------------------------------------
- static mat4 perspective(
- float width,
- float height,
- float nearPlane, float farPlane);
-
- static mat4 lookAt(const vec3& vEye, const vec3& vAt, const vec3& vUp);
-
- static mat4 translation(
- const float fX,
- const float fY,
- const float fZ);
- static mat4 translation(
- const vec3 vec);
-
- static mat4 rotationX(
- const float fAngle);
-
- static mat4 rotationY(const float fAngle);
-
- static mat4 rotationZ(const float fAngle);
-
- static mat4 identity()
- {
- mat4 ret;
- ret.f[0] = 1.f; ret.f[1] = 0; ret.f[2] = 0; ret.f[3] = 0;
- ret.f[4] = 0; ret.f[5] = 1.f; ret.f[6] = 0; ret.f[7] = 0;
- ret.f[8] = 0; ret.f[9] = 0; ret.f[10] = 1.f;ret.f[11] = 0;
- ret.f[12] = 0; ret.f[13] = 0; ret.f[14] = 0; ret.f[15] = 1.f;
- return ret;
- }
-
- void dump()
- {
- LOGI("%f %f %f %f", f[0], f[1], f[2], f[3]);
- LOGI("%f %f %f %f", f[4], f[5], f[6], f[7]);
- LOGI("%f %f %f %f", f[8], f[9], f[10], f[11]);
- LOGI("%f %f %f %f", f[12], f[13], f[14], f[15]);
- }
-};
-
-/******************************************************************
- * quaternion class
- *
- */
-class quaternion
-{
-private:
- float x,y,z,w;
-
-public:
- friend class vec3;
- friend class vec4;
- friend class mat4;
-
- quaternion()
- {
- x = 0.f;
- y = 0.f;
- z = 0.f;
- w = 1.f;
- }
-
- quaternion(const float fX, const float fY, const float fZ, const float fW)
- {
- x = fX;
- y = fY;
- z = fZ;
- w = fW;
- }
-
- quaternion(const vec3 vec, const float fW)
- {
- x = vec.x;
- y = vec.y;
- z = vec.z;
- w = fW;
- }
-
- quaternion(const float* p)
- {
- x = *p++;
- y = *p++;
- z = *p++;
- w = *p++;
- }
-
- quaternion operator*(const quaternion rhs)
- {
- quaternion ret;
- ret.x = x * rhs.w + y * rhs.z - z * rhs.y + w * rhs.x;
- ret.y = -x * rhs.z + y * rhs.w + z * rhs.x + w * rhs.y;
- ret.z = x * rhs.y - y * rhs.x + z * rhs.w + w * rhs.z;
- ret.w = -x * rhs.x - y * rhs.y - z * rhs.z + w * rhs.w;
- return ret;
- }
-
- quaternion& operator*=(const quaternion rhs)
- {
- quaternion ret;
- ret.x = x * rhs.w + y * rhs.z - z * rhs.y + w * rhs.x;
- ret.y = -x * rhs.z + y * rhs.w + z * rhs.x + w * rhs.y;
- ret.z = x * rhs.y - y * rhs.x + z * rhs.w + w * rhs.z;
- ret.w = -x * rhs.x - y * rhs.y - z * rhs.z + w * rhs.w;
- *this = ret;
- return *this;
- }
-
- quaternion conjugate()
- {
- x = -x;
- y = -y;
- z = -z;
- return *this;
- }
-
- //Non destuctive version
- quaternion conjugated()
- {
- quaternion ret;
- ret.x = -x;
- ret.y = -y;
- ret.z = -z;
- ret.w = w;
- return ret;
- }
-
- void toMatrix(mat4& mat)
- {
- float x2 = x * x * 2.0f;
- float y2 = y * y * 2.0f;
- float z2 = z * z * 2.0f;
- float xy = x * y * 2.0f;
- float yz = y * z * 2.0f;
- float zx = z * x * 2.0f;
- float xw = x * w * 2.0f;
- float yw = y * w * 2.0f;
- float zw = z * w * 2.0f;
-
- mat.f[0] = 1.0f - y2 - z2;
- mat.f[1] = xy + zw;
- mat.f[2] = zx - yw;
- mat.f[4] = xy - zw;
- mat.f[5] = 1.0f - z2 - x2;
- mat.f[6] = yz + xw;
- mat.f[8] = zx + yw;
- mat.f[9] = yz - xw;
- mat.f[10] = 1.0f - x2 - y2;
-
- mat.f[3] = mat.f[7] = mat.f[11] = mat.f[12] = mat.f[13] = mat.f[14] = 0.0f;
- mat.f[15] = 1.0f;
- }
-
- void toMatrixPreserveTranslate(mat4& mat)
- {
- float x2 = x * x * 2.0f;
- float y2 = y * y * 2.0f;
- float z2 = z * z * 2.0f;
- float xy = x * y * 2.0f;
- float yz = y * z * 2.0f;
- float zx = z * x * 2.0f;
- float xw = x * w * 2.0f;
- float yw = y * w * 2.0f;
- float zw = z * w * 2.0f;
-
- mat.f[0] = 1.0f - y2 - z2;
- mat.f[1] = xy + zw;
- mat.f[2] = zx - yw;
- mat.f[4] = xy - zw;
- mat.f[5] = 1.0f - z2 - x2;
- mat.f[6] = yz + xw;
- mat.f[8] = zx + yw;
- mat.f[9] = yz - xw;
- mat.f[10] = 1.0f - x2 - y2;
-
- mat.f[3] = mat.f[7] = mat.f[11] = 0.0f;
- mat.f[15] = 1.0f;
- }
-
- static quaternion rotationAxis(const vec3 axis, const float angle )
- {
- quaternion ret;
- float s = sinf(angle / 2);
- ret.x = s * axis.x;
- ret.y = s * axis.y;
- ret.z = s * axis.z;
- ret.w = cosf( angle / 2 );
- return ret;
- }
-
- void value(float& fX, float& fY, float& fZ, float& fW)
- {
- fX = x;
- fY = y;
- fZ = z;
- fW = w;
- }
-};
-
-#endif /* VECMATH_H_ */
diff --git a/ndk/sources/android/helper/Android.mk b/ndk/sources/android/ndk_helper/Android.mk
similarity index 94%
rename from ndk/sources/android/helper/Android.mk
rename to ndk/sources/android/ndk_helper/Android.mk
index a5c3be4..e7134da 100644
--- a/ndk/sources/android/helper/Android.mk
+++ b/ndk/sources/android/ndk_helper/Android.mk
@@ -2,7 +2,7 @@
include $(CLEAR_VARS)
-LOCAL_MODULE:= helper
+LOCAL_MODULE:= ndk_helper
LOCAL_SRC_FILES:= JNIHelper.cpp interpolator.cpp tapCamera.cpp gestureDetector.cpp perfMonitor.cpp vecmath.cpp GLContext.cpp shader.cpp gl3stub.c
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
diff --git a/ndk/sources/android/ndk_helper/GLContext.cpp b/ndk/sources/android/ndk_helper/GLContext.cpp
new file mode 100644
index 0000000..edfdd6c
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/GLContext.cpp
@@ -0,0 +1,294 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// GLContext.cpp
+//--------------------------------------------------------------------------------
+//--------------------------------------------------------------------------------
+// includes
+//--------------------------------------------------------------------------------
+#include <unistd.h>
+#include "GLContext.h"
+#include "gl3stub.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// eGLContext
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// Ctor
+//--------------------------------------------------------------------------------
+GLContext::GLContext() :
+ display_( EGL_NO_DISPLAY ),
+ surface_( EGL_NO_SURFACE ),
+ context_( EGL_NO_CONTEXT ),
+ screen_width_( 0 ),
+ screen_height_( 0 ),
+ es3_supported_( false ),
+ egl_context_initialized_( false ),
+ gles_initialized_( false )
+{
+}
+
+void GLContext::InitGLES()
+{
+ if( gles_initialized_ )
+ return;
+ //
+ //Initialize OpenGL ES 3 if available
+ //
+ const char* versionStr = (const char*) glGetString( GL_VERSION );
+ if( strstr( versionStr, "OpenGL ES 3." ) && gl3stubInit() )
+ {
+ es3_supported_ = true;
+ gl_version_ = 3.0f;
+ }
+ else
+ {
+ gl_version_ = 2.0f;
+ }
+
+ gles_initialized_ = true;
+}
+
+//--------------------------------------------------------------------------------
+// Dtor
+//--------------------------------------------------------------------------------
+GLContext::~GLContext()
+{
+ Terminate();
+}
+
+bool GLContext::Init( ANativeWindow* window )
+{
+ if( egl_context_initialized_ )
+ return true;
+
+ //
+ //Initialize EGL
+ //
+ window_ = window;
+ InitEGLSurface();
+ InitEGLContext();
+ InitGLES();
+
+ egl_context_initialized_ = true;
+
+ return true;
+}
+
+bool GLContext::InitEGLSurface()
+{
+ display_ = eglGetDisplay( EGL_DEFAULT_DISPLAY );
+ eglInitialize( display_, 0, 0 );
+
+ /*
+ * Here specify the attributes of the desired configuration.
+ * Below, we select an EGLConfig with at least 8 bits per color
+ * component compatible with on-screen windows
+ */
+ const EGLint attribs[] = { EGL_RENDERABLE_TYPE,
+ EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8,
+ EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_NONE };
+ color_size_ = 8;
+ depth_size_ = 24;
+
+ EGLint num_configs;
+ eglChooseConfig( display_, attribs, &config_, 1, &num_configs );
+
+ if( !num_configs )
+ {
+ //Fall back to 16bit depth buffer
+ const EGLint attribs[] = { EGL_RENDERABLE_TYPE,
+ EGL_OPENGL_ES2_BIT, //Request opengl ES2.0
+ EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8,
+ EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 16, EGL_NONE };
+ eglChooseConfig( display_, attribs, &config_, 1, &num_configs );
+ depth_size_ = 16;
+ }
+
+ if( !num_configs )
+ {
+ LOGW( "Unable to retrieve EGL config" );
+ return false;
+ }
+
+ surface_ = eglCreateWindowSurface( display_, config_, window_, NULL );
+ eglQuerySurface( display_, surface_, EGL_WIDTH, &screen_width_ );
+ eglQuerySurface( display_, surface_, EGL_HEIGHT, &screen_height_ );
+
+ /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
+ * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
+ * As soon as we picked a EGLConfig, we can safely reconfigure the
+ * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
+ EGLint format;
+ eglGetConfigAttrib( display_, config_, EGL_NATIVE_VISUAL_ID, &format );
+ ANativeWindow_setBuffersGeometry( window_, 0, 0, format );
+
+ return true;
+}
+
+bool GLContext::InitEGLContext()
+{
+ const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, //Request opengl ES2.0
+ EGL_NONE };
+ context_ = eglCreateContext( display_, config_, NULL, context_attribs );
+
+ if( eglMakeCurrent( display_, surface_, surface_, context_ ) == EGL_FALSE )
+ {
+ LOGW( "Unable to eglMakeCurrent" );
+ return false;
+ }
+
+ context_valid_ = true;
+ return true;
+}
+
+EGLint GLContext::Swap()
+{
+ bool b = eglSwapBuffers( display_, surface_ );
+ if( !b )
+ {
+ EGLint err = eglGetError();
+ if( err == EGL_BAD_SURFACE )
+ {
+ //Recreate surface
+ InitEGLSurface();
+ return EGL_SUCCESS; //Still consider glContext is valid
+ }
+ else if( err == EGL_CONTEXT_LOST || err == EGL_BAD_CONTEXT )
+ {
+ //Context has been lost!!
+ context_valid_ = false;
+ Terminate();
+ InitEGLContext();
+ }
+ return err;
+ }
+ return EGL_SUCCESS;
+}
+
+void GLContext::Terminate()
+{
+ if( display_ != EGL_NO_DISPLAY )
+ {
+ eglMakeCurrent( display_, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT );
+ if( context_ != EGL_NO_CONTEXT )
+ {
+ eglDestroyContext( display_, context_ );
+ }
+
+ if( surface_ != EGL_NO_SURFACE )
+ {
+ eglDestroySurface( display_, surface_ );
+ }
+ eglTerminate( display_ );
+ }
+
+ display_ = EGL_NO_DISPLAY;
+ context_ = EGL_NO_CONTEXT;
+ surface_ = EGL_NO_SURFACE;
+ context_valid_ = false;
+
+}
+
+EGLint GLContext::Resume( ANativeWindow* window )
+{
+ if( egl_context_initialized_ == false )
+ {
+ Init( window );
+ return EGL_SUCCESS;
+ }
+
+ int32_t original_widhth = screen_width_;
+ int32_t original_height = screen_height_;
+
+ //Create surface
+ window_ = window;
+ surface_ = eglCreateWindowSurface( display_, config_, window_, NULL );
+ eglQuerySurface( display_, surface_, EGL_WIDTH, &screen_width_ );
+ eglQuerySurface( display_, surface_, EGL_HEIGHT, &screen_height_ );
+
+ if( screen_width_ != original_widhth || screen_height_ != original_height )
+ {
+ //Screen resized
+ LOGI( "Screen resized" );
+ }
+
+ if( eglMakeCurrent( display_, surface_, surface_, context_ ) == EGL_TRUE )
+ return EGL_SUCCESS;
+
+ EGLint err = eglGetError();
+ LOGW( "Unable to eglMakeCurrent %d", err );
+
+ if( err == EGL_CONTEXT_LOST )
+ {
+ //Recreate context
+ LOGI( "Re-creating egl context" );
+ InitEGLContext();
+ }
+ else
+ {
+ //Recreate surface
+ Terminate();
+ InitEGLSurface();
+ InitEGLContext();
+ }
+
+ return err;
+
+}
+
+void GLContext::Suspend()
+{
+ if( surface_ != EGL_NO_SURFACE )
+ {
+ eglDestroySurface( display_, surface_ );
+ surface_ = EGL_NO_SURFACE;
+ }
+}
+
+bool GLContext::Invalidate()
+{
+ Terminate();
+
+ egl_context_initialized_ = false;
+ return true;
+}
+
+bool GLContext::CheckExtension( const char* extension )
+{
+ if( extension == NULL )
+ return false;
+
+ std::string extensions = std::string( (char*) glGetString( GL_EXTENSIONS ) );
+ std::string str = std::string( extension );
+ str.append( " " );
+
+ size_t pos = 0;
+ if( extensions.find( extension, pos ) != std::string::npos )
+ {
+ return true;
+ }
+
+ return false;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/helper/GLContext.h b/ndk/sources/android/ndk_helper/GLContext.h
similarity index 60%
rename from ndk/sources/android/helper/GLContext.h
rename to ndk/sources/android/ndk_helper/GLContext.h
index 29692f2..cc0db46 100644
--- a/ndk/sources/android/helper/GLContext.h
+++ b/ndk/sources/android/ndk_helper/GLContext.h
@@ -15,18 +15,20 @@
*/
//--------------------------------------------------------------------------------
-// glContext.h
+// GLContext.h
//--------------------------------------------------------------------------------
-
#ifndef GLCONTEXT_H_
#define GLCONTEXT_H_
-#include <android/sensor.h>
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
#include <android/log.h>
-#include <android_native_app_glue.h>
-#include <android/native_window_jni.h>
+
#include "JNIHelper.h"
+namespace ndk_helper
+{
+
//--------------------------------------------------------------------------------
// Constants
//--------------------------------------------------------------------------------
@@ -42,36 +44,44 @@
*
* Also the class initializes OpenGL ES3 when the compatible driver is installed in the device.
* getGLVersion() returns 3.0~ when the device supports OpenGLES3.0
+ *
+ * Thread safety: OpenGL context is expecting used within dedicated single thread,
+ * thus GLContext class is not designed as a thread-safe
*/
class GLContext
{
private:
- //ELG configurations
- ANativeWindow* _window;
- EGLDisplay _display;
- EGLSurface _surface;
- EGLContext _context;
- EGLConfig _config;
+ //EGL configurations
+ ANativeWindow* window_;
+ EGLDisplay display_;
+ EGLSurface surface_;
+ EGLContext context_;
+ EGLConfig config_;
//Screen parameters
- int32_t _iWidth;
- int32_t _iHeight;
- int32_t _iColorSize;
- int32_t _iDepthSize;
+ int32_t screen_width_;
+ int32_t screen_height_;
+ int32_t color_size_;
+ int32_t depth_size_;
//Flags
- bool _bGLESInitialized;
- bool _bEGLContextInitialized;
- bool _bES3Support;
- float _fGLVersion;
+ bool gles_initialized_;
+ bool egl_context_initialized_;
+ bool es3_supported_;
+ float gl_version_;
+ bool context_valid_;
- void initGLES();
- bool _bContextValid;
- void terminate();
- bool initEGLSurface();
- bool initEGLContext();
+ void InitGLES();
+ void Terminate();
+ bool InitEGLSurface();
+ bool InitEGLContext();
+
+ GLContext( GLContext const& );
+ void operator=( GLContext const& );
+ GLContext();
+ virtual ~GLContext();
public:
- static GLContext* getInstance()
+ static GLContext* GetInstance()
{
//Singleton
static GLContext instance;
@@ -79,26 +89,37 @@
return &instance;
}
- GLContext( GLContext const& );
- void operator=( GLContext const& );
+ bool Init( ANativeWindow* window );
+ EGLint Swap();
+ bool Invalidate();
- GLContext();
- virtual ~GLContext();
+ void Suspend();
+ EGLint Resume( ANativeWindow* window );
- bool init( ANativeWindow* window );
- EGLint swap();
- bool invalidate();
+ int32_t GetScreenWidth()
+ {
+ return screen_width_;
+ }
+ int32_t GetScreenHeight()
+ {
+ return screen_height_;
+ }
- void suspend();
- EGLint resume(ANativeWindow* window);
-
- int32_t getScreenWidth() { return _iWidth; }
- int32_t getScreenHeight() { return _iHeight; }
-
- int32_t getBufferColorSize() { return _iColorSize; }
- int32_t getBufferDepthSize() { return _iDepthSize; }
- float getGLVersion() { return _fGLVersion; }
- bool checkExtension( const char* extension );
+ int32_t GetBufferColorSize()
+ {
+ return color_size_;
+ }
+ int32_t GetBufferDepthSize()
+ {
+ return depth_size_;
+ }
+ float GetGLVersion()
+ {
+ return gl_version_;
+ }
+ bool CheckExtension( const char* extension );
};
+} //namespace ndkHelper
+
#endif /* GLCONTEXT_H_ */
diff --git a/ndk/sources/android/ndk_helper/JNIHelper.cpp b/ndk/sources/android/ndk_helper/JNIHelper.cpp
new file mode 100644
index 0000000..e06520a
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/JNIHelper.cpp
@@ -0,0 +1,376 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+#include <fstream>
+#include <iostream>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+#define CLASS_NAME "android/app/NativeActivity"
+
+//---------------------------------------------------------------------------
+//JNI Helper functions
+//---------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------
+//Singleton
+//---------------------------------------------------------------------------
+JNIHelper* JNIHelper::GetInstance()
+{
+ static JNIHelper helper;
+ return &helper;
+}
+
+//---------------------------------------------------------------------------
+//Ctor
+//---------------------------------------------------------------------------
+JNIHelper::JNIHelper()
+{
+ pthread_mutex_init( &mutex_, NULL );
+}
+
+//---------------------------------------------------------------------------
+//Dtor
+//---------------------------------------------------------------------------
+JNIHelper::~JNIHelper()
+{
+ pthread_mutex_lock( &mutex_ );
+
+ JNIEnv *env;
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ env->DeleteGlobalRef( jni_helper_java_ref_ );
+ env->DeleteGlobalRef( jni_helper_java_class_ );
+
+ activity_->vm->DetachCurrentThread();
+
+ pthread_mutex_destroy( &mutex_ );
+}
+
+//---------------------------------------------------------------------------
+//Init
+//---------------------------------------------------------------------------
+void JNIHelper::Init( ANativeActivity* activity,
+ const char* helper_class_name )
+{
+ JNIHelper& helper = *GetInstance();
+ pthread_mutex_lock( &helper.mutex_ );
+
+ helper.activity_ = activity;
+
+ JNIEnv *env;
+ helper.activity_->vm->AttachCurrentThread( &env, NULL );
+
+ //Retrieve app name
+ jclass android_content_Context = env->GetObjectClass( helper.activity_->clazz );
+ jmethodID midGetPackageName = env->GetMethodID( android_content_Context, "getPackageName",
+ "()Ljava/lang/String;" );
+
+ jstring packageName = (jstring) env->CallObjectMethod( helper.activity_->clazz,
+ midGetPackageName );
+ const char* appname = env->GetStringUTFChars( packageName, NULL );
+ helper.app_name_ = std::string( appname );
+
+ jclass cls = helper.RetrieveClass( env, helper_class_name );
+ helper.jni_helper_java_class_ = (jclass) env->NewGlobalRef( cls );
+
+ jmethodID constructor = env->GetMethodID( helper.jni_helper_java_class_, "<init>", "()V" );
+ helper.jni_helper_java_ref_ = env->NewObject( helper.jni_helper_java_class_, constructor );
+ helper.jni_helper_java_ref_ = env->NewGlobalRef( helper.jni_helper_java_ref_ );
+
+ env->ReleaseStringUTFChars( packageName, appname );
+ helper.activity_->vm->DetachCurrentThread();
+
+ pthread_mutex_unlock( &helper.mutex_ );
+}
+
+//---------------------------------------------------------------------------
+//readFile
+//---------------------------------------------------------------------------
+bool JNIHelper::ReadFile( const char* fileName,
+ std::vector<uint8_t>* buffer_ref )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized.Call init() to initialize the helper" );
+ return false;
+ }
+
+ //First, try reading from externalFileDir;
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ jstring str_path = GetExternalFilesDirJString( env );
+ const char* path = env->GetStringUTFChars( str_path, NULL );
+ std::string s( path );
+
+ if( fileName[0] != '/' )
+ {
+ s.append( "/" );
+ }
+ s.append( fileName );
+ std::ifstream f( s.c_str(), std::ios::binary );
+
+ env->DeleteLocalRef( str_path );
+ env->ReleaseStringUTFChars( str_path, path );
+ activity_->vm->DetachCurrentThread();
+
+ if( f )
+ {
+ LOGI( "reading:%s", s.c_str() );
+ f.seekg( 0, std::ifstream::end );
+ int32_t fileSize = f.tellg();
+ f.seekg( 0, std::ifstream::beg );
+ buffer_ref->reserve( fileSize );
+ buffer_ref->assign( std::istreambuf_iterator<char>( f ), std::istreambuf_iterator<char>() );
+ f.close();
+ pthread_mutex_unlock( &mutex_ );
+ return true;
+ }
+ else
+ {
+ //Fallback to assetManager
+ AAssetManager* assetManager = activity_->assetManager;
+ AAsset* assetFile = AAssetManager_open( assetManager, fileName, AASSET_MODE_BUFFER );
+ if( !assetFile )
+ {
+ pthread_mutex_unlock( &mutex_ );
+ return false;
+ }
+ uint8_t* data = (uint8_t*) AAsset_getBuffer( assetFile );
+ int32_t size = AAsset_getLength( assetFile );
+ if( data == NULL )
+ {
+ AAsset_close( assetFile );
+
+ LOGI( "Failed to load:%s", fileName );
+ pthread_mutex_unlock( &mutex_ );
+ return false;
+ }
+
+ buffer_ref->reserve( size );
+ buffer_ref->assign( data, data + size );
+
+ AAsset_close( assetFile );
+ pthread_mutex_unlock( &mutex_ );
+ return true;
+ }
+}
+
+std::string JNIHelper::GetExternalFilesDir()
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return std::string( "" );
+ }
+
+ pthread_mutex_lock( &mutex_ );
+
+ //First, try reading from externalFileDir;
+ JNIEnv *env;
+ jmethodID mid;
+
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ jstring strPath = GetExternalFilesDirJString( env );
+ const char* path = env->GetStringUTFChars( strPath, NULL );
+ std::string s( path );
+
+ env->DeleteLocalRef( strPath );
+ env->ReleaseStringUTFChars( strPath, path );
+ activity_->vm->DetachCurrentThread();
+
+ pthread_mutex_unlock( &mutex_ );
+ return s;
+}
+
+uint32_t JNIHelper::LoadTexture( const char* file_name )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return 0;
+ }
+
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ jstring name = env->NewStringUTF( file_name );
+
+ GLuint tex;
+ glGenTextures( 1, &tex );
+ glBindTexture( GL_TEXTURE_2D, tex );
+
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+ glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+
+ mid = env->GetMethodID( jni_helper_java_class_, "loadTexture", "(Ljava/lang/String;)Z" );
+ jboolean ret = env->CallBooleanMethod( jni_helper_java_ref_, mid, name );
+ if( !ret )
+ {
+ glDeleteTextures( 1, &tex );
+ tex = -1;
+ LOGI( "Texture load failed %s", file_name );
+ }
+
+ //Generate mipmap
+ glGenerateMipmap( GL_TEXTURE_2D );
+
+ env->DeleteLocalRef( name );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return tex;
+
+}
+
+std::string JNIHelper::ConvertString( const char* str,
+ const char* encode )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return std::string( "" );
+ }
+
+ JNIEnv *env;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ int32_t iLength = strlen( (const char*) str );
+
+ jbyteArray array = env->NewByteArray( iLength );
+ env->SetByteArrayRegion( array, 0, iLength, (const signed char*) str );
+
+ jstring strEncode = env->NewStringUTF( encode );
+
+ jclass cls = env->FindClass( "java/lang/String" );
+ jmethodID ctor = env->GetMethodID( cls, "<init>", "([BLjava/lang/String;)V" );
+ jstring object = (jstring) env->NewObject( cls, ctor, array, strEncode );
+
+ const char *cparam = env->GetStringUTFChars( object, NULL );
+
+ std::string s = std::string( cparam );
+
+ env->DeleteLocalRef( strEncode );
+ env->DeleteLocalRef( object );
+ env->ReleaseStringUTFChars( object, cparam );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return s;
+}
+
+//---------------------------------------------------------------------------
+//Audio helpers
+//---------------------------------------------------------------------------
+int32_t JNIHelper::GetNativeAudioBufferSize()
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return 0;
+ }
+
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ mid = env->GetMethodID( jni_helper_java_class_, "getNativeAudioBufferSize", "()I" );
+ int32_t i = env->CallIntMethod( jni_helper_java_ref_, mid );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return i;
+}
+
+int32_t JNIHelper::GetNativeAudioSampleRate()
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return 0;
+ }
+
+ JNIEnv *env;
+ jmethodID mid;
+
+ pthread_mutex_lock( &mutex_ );
+ activity_->vm->AttachCurrentThread( &env, NULL );
+
+ mid = env->GetMethodID( jni_helper_java_class_, "getNativeAudioSampleRate", "()I" );
+ int32_t i = env->CallIntMethod( jni_helper_java_ref_, mid );
+ activity_->vm->DetachCurrentThread();
+ pthread_mutex_unlock( &mutex_ );
+
+ return i;
+}
+
+//---------------------------------------------------------------------------
+//Misc implementations
+//---------------------------------------------------------------------------
+jclass JNIHelper::RetrieveClass( JNIEnv *jni,
+ const char* class_name )
+{
+ jclass activity_class = jni->FindClass( CLASS_NAME );
+ jmethodID get_class_loader = jni->GetMethodID( activity_class, "getClassLoader",
+ "()Ljava/lang/ClassLoader;" );
+ jobject cls = jni->CallObjectMethod( activity_->clazz, get_class_loader );
+ jclass class_loader = jni->FindClass( "java/lang/ClassLoader" );
+ jmethodID find_class = jni->GetMethodID( class_loader, "loadClass",
+ "(Ljava/lang/String;)Ljava/lang/Class;" );
+
+ jstring str_class_name = jni->NewStringUTF( class_name );
+ jclass class_retrieved = (jclass) jni->CallObjectMethod( cls, find_class, str_class_name );
+ jni->DeleteLocalRef( str_class_name );
+ return class_retrieved;
+}
+
+jstring JNIHelper::GetExternalFilesDirJString( JNIEnv *env )
+{
+ if( activity_ == NULL )
+ {
+ LOGI( "JNIHelper has not been initialized. Call init() to initialize the helper" );
+ return NULL;
+ }
+
+ // Invoking getExternalFilesDir() java API
+ jclass cls_Env = env->FindClass( CLASS_NAME );
+ jmethodID mid = env->GetMethodID( cls_Env, "getExternalFilesDir",
+ "(Ljava/lang/String;)Ljava/io/File;" );
+ jobject obj_File = env->CallObjectMethod( activity_->clazz, mid, NULL );
+ jclass cls_File = env->FindClass( "java/io/File" );
+ jmethodID mid_getPath = env->GetMethodID( cls_File, "getPath", "()Ljava/lang/String;" );
+ jstring obj_Path = (jstring) env->CallObjectMethod( obj_File, mid_getPath );
+
+ return obj_Path;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/JNIHelper.h b/ndk/sources/android/ndk_helper/JNIHelper.h
new file mode 100644
index 0000000..7a77d76
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/JNIHelper.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <jni.h>
+#include <vector>
+#include <string>
+
+#include <android/log.h>
+#include <android_native_app_glue.h>
+
+#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, ndk_helper::JNIHelper::GetInstance()->GetAppName(), __VA_ARGS__))
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Helper functions for JNI calls
+ * This class wraps JNI calls and provides handy interface calling commonly used features
+ * in Java SDK.
+ * Such as
+ * - loading graphics files (e.g. PNG, JPG)
+ * - character code conversion
+ * - retrieving system properties which only supported in Java SDK
+ *
+ * NOTE: To use this class, add NDKHelper.java as a corresponding helpers in Java code
+ */
+class JNIHelper
+{
+private:
+ std::string app_name_;
+
+ ANativeActivity* activity_;
+ jobject jni_helper_java_ref_;
+ jclass jni_helper_java_class_;
+
+ //mutex for synchronization
+ //This class uses singleton pattern and can be invoked from multiple threads,
+ //each methods locks the mutex for a thread safety
+ mutable pthread_mutex_t mutex_;
+
+ jstring GetExternalFilesDirJString( JNIEnv *env );
+ jclass RetrieveClass( JNIEnv *jni,
+ const char* class_name );
+
+ JNIHelper();
+ ~JNIHelper();
+ JNIHelper( const JNIHelper& rhs );
+ JNIHelper& operator=( const JNIHelper& rhs );
+
+public:
+ /*
+ * To load your own Java classes, JNIHelper requires to be initialized with a ANativeActivity handle.
+ * This methods need to be called before any call to the helper class.
+ * Static member of the class
+ *
+ * arguments:
+ * in: activity, pointer to ANativeActivity. Used internally to set up JNI environment
+ * in: helper_class_name, pointer to Java side helper class name. (e.g. "com/sample/helper/NDKHelper" in samples )
+ */
+ static void Init( ANativeActivity* activity,
+ const char* helper_class_name );
+
+ /*
+ * Retrieve the singleton object of the helper.
+ * Static member of the class
+
+ * Methods in the class are designed as thread safe.
+ */
+ static JNIHelper* GetInstance();
+
+ /*
+ * Read a file from a strorage.
+ * First, the method tries to read the file from an external storage.
+ * If it fails to read, it falls back to use assset manager and try to read the file from APK asset.
+ *
+ * arguments:
+ * in: file_name, file name to read
+ * out: buffer_ref, pointer to a vector buffer to read a file.
+ * when the call succeeded, the buffer includes contents of specified file
+ * when the call failed, contents of the buffer remains same
+ * return:
+ * true when file read succeeded
+ * false when it failed to read the file
+ */
+ bool ReadFile( const char* file_name,
+ std::vector<uint8_t>* buffer_ref );
+
+ /*
+ * Load and create OpenGL texture from given file name.
+ * The method invokes BitmapFactory in Java so it can read jpeg/png formatted files
+ *
+ * The methods creates mip-map and set texture parameters like this,
+ * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST );
+ * glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ * glGenerateMipmap( GL_TEXTURE_2D );
+ *
+ * arguments:
+ * in: file_name, file name to read, PNG&JPG is supported
+ * return:
+ * OpenGL texture name when the call succeeded
+ * When it failed to load the texture, it returns -1
+ */
+ uint32_t LoadTexture( const char* file_name );
+
+ /*
+ * Convert string from character code other than UTF-8
+ *
+ * arguments:
+ * in: str, pointer to a string which is encoded other than UTF-8
+ * in: encoding, pointer to a character encoding string.
+ * The encoding string can be any valid java.nio.charset.Charset name
+ * e.g. "UTF-16", "Shift_JIS"
+ * return: converted input string as an UTF-8 std::string
+ */
+ std::string ConvertString( const char* str,
+ const char* encode );
+ /*
+ * Retrieve external file directory through JNI call
+ *
+ * return: std::string containing external file diretory
+ */
+ std::string GetExternalFilesDir();
+
+ /*
+ * Audio helper
+ * Retrieves native audio buffer size which is required to achieve low latency audio
+ *
+ * return: Native audio buffer size which is a hint to achieve low latency audio
+ * If the API is not supported (API level < 17), it returns 0
+ */
+ int32_t GetNativeAudioBufferSize();
+
+ /*
+ * Audio helper
+ * Retrieves native audio sample rate which is required to achieve low latency audio
+ *
+ * return: Native audio sample rate which is a hint to achieve low latency audio
+ */
+ int32_t GetNativeAudioSampleRate();
+
+ /*
+ * Retrieves application bundle name
+ *
+ * return: pointer to an app name string
+ *
+ */
+ const char* GetAppName()
+ {
+ return app_name_.c_str();
+ }
+
+};
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/helper/NDKHelper.h b/ndk/sources/android/ndk_helper/NDKHelper.h
similarity index 79%
rename from ndk/sources/android/helper/NDKHelper.h
rename to ndk/sources/android/ndk_helper/NDKHelper.h
index da7dc61..de2a10e 100644
--- a/ndk/sources/android/helper/NDKHelper.h
+++ b/ndk/sources/android/ndk_helper/NDKHelper.h
@@ -19,7 +19,13 @@
/******************************************************************
* NDK support helpers
+ * Utility module to provide misc functionalities that is used widely in native applications,
+ * such as gesture detection, jni bridge, openGL context etc.
*
+ * The purpose of this module is,
+ * - Provide best practices using NDK
+ * - Provide handy utility functions for NDK development
+ * - Make NDK samples more simpler and readable
*/
#include "gl3stub.h" //GLES3 stubs
#include "GLContext.h" //EGL & OpenGL manager
@@ -30,5 +36,4 @@
#include "gestureDetector.h" //Tap/Doubletap/Pinch detector
#include "perfMonitor.h" //FPS counter
#include "interpolator.h" //Interpolator
-
#endif
diff --git a/ndk/sources/android/ndk_helper/gestureDetector.cpp b/ndk/sources/android/ndk_helper/gestureDetector.cpp
new file mode 100644
index 0000000..19d8212
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gestureDetector.cpp
@@ -0,0 +1,350 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gestureDetector.h"
+
+//--------------------------------------------------------------------------------
+// gestureDetector.cpp
+//--------------------------------------------------------------------------------
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// includes
+//--------------------------------------------------------------------------------
+
+//--------------------------------------------------------------------------------
+// GestureDetector
+//--------------------------------------------------------------------------------
+GestureDetector::GestureDetector()
+{
+ dp_factor_ = 1.f;
+}
+
+void GestureDetector::SetConfiguration( AConfiguration* config )
+{
+ dp_factor_ = 160.f / AConfiguration_getDensity( config );
+}
+
+//--------------------------------------------------------------------------------
+// TapDetector
+//--------------------------------------------------------------------------------
+GESTURE_STATE TapDetector::Detect( const AInputEvent* motion_event )
+{
+ if( AMotionEvent_getPointerCount( motion_event ) > 1 )
+ {
+ //Only support single touch
+ return false;
+ }
+
+ int32_t action = AMotionEvent_getAction( motion_event );
+ unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ down_pointer_id_ = AMotionEvent_getPointerId( motion_event, 0 );
+ down_x_ = AMotionEvent_getX( motion_event, 0 );
+ down_y_ = AMotionEvent_getY( motion_event, 0 );
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ {
+ int64_t eventTime = AMotionEvent_getEventTime( motion_event );
+ int64_t downTime = AMotionEvent_getDownTime( motion_event );
+ if( eventTime - downTime <= TAP_TIMEOUT )
+ {
+ if( down_pointer_id_ == AMotionEvent_getPointerId( motion_event, 0 ) )
+ {
+ float x = AMotionEvent_getX( motion_event, 0 ) - down_x_;
+ float y = AMotionEvent_getY( motion_event, 0 ) - down_y_;
+ if( x * x + y * y < TOUCH_SLOP * TOUCH_SLOP * dp_factor_ )
+ {
+ LOGI( "TapDetector: Tap detected" );
+ return GESTURE_STATE_ACTION;
+ }
+ }
+ }
+ break;
+ }
+ }
+ return GESTURE_STATE_NONE;
+}
+
+//--------------------------------------------------------------------------------
+// DoubletapDetector
+//--------------------------------------------------------------------------------
+GESTURE_STATE DoubletapDetector::Detect( const AInputEvent* motion_event )
+{
+ if( AMotionEvent_getPointerCount( motion_event ) > 1 )
+ {
+ //Only support single double tap
+ return false;
+ }
+
+ bool tap_detected = tap_detector_.Detect( motion_event );
+
+ int32_t action = AMotionEvent_getAction( motion_event );
+ unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ {
+ int64_t eventTime = AMotionEvent_getEventTime( motion_event );
+ if( eventTime - last_tap_time_ <= DOUBLE_TAP_TIMEOUT )
+ {
+ float x = AMotionEvent_getX( motion_event, 0 ) - last_tap_x_;
+ float y = AMotionEvent_getY( motion_event, 0 ) - last_tap_y_;
+ if( x * x + y * y < DOUBLE_TAP_SLOP * DOUBLE_TAP_SLOP * dp_factor_ )
+ {
+ LOGI( "DoubletapDetector: Doubletap detected" );
+ return GESTURE_STATE_ACTION;
+ }
+ }
+ break;
+ }
+ case AMOTION_EVENT_ACTION_UP:
+ if( tap_detected )
+ {
+ last_tap_time_ = AMotionEvent_getEventTime( motion_event );
+ last_tap_x_ = AMotionEvent_getX( motion_event, 0 );
+ last_tap_y_ = AMotionEvent_getY( motion_event, 0 );
+ }
+ break;
+ }
+ return GESTURE_STATE_NONE;
+}
+
+void DoubletapDetector::SetConfiguration( AConfiguration* config )
+{
+ dp_factor_ = 160.f / AConfiguration_getDensity( config );
+ tap_detector_.SetConfiguration( config );
+}
+
+//--------------------------------------------------------------------------------
+// PinchDetector
+//--------------------------------------------------------------------------------
+
+int32_t PinchDetector::FindIndex( const AInputEvent* event, int32_t id )
+{
+ int32_t count = AMotionEvent_getPointerCount( event );
+ for( uint32_t i = 0; i < count; ++i )
+ {
+ if( id == AMotionEvent_getPointerId( event, i ) )
+ return i;
+ }
+ return -1;
+}
+
+GESTURE_STATE PinchDetector::Detect( const AInputEvent* event )
+{
+ GESTURE_STATE ret = GESTURE_STATE_NONE;
+ int32_t action = AMotionEvent_getAction( event );
+ uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
+ event_ = event;
+
+ int32_t count = AMotionEvent_getPointerCount( event );
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, 0 ) );
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_DOWN:
+ {
+ int32_t iIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+ >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, iIndex ) );
+ if( count == 2 )
+ {
+ //Start new pinch
+ ret = GESTURE_STATE_START;
+ }
+ }
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ vec_pointers_.pop_back();
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_UP:
+ {
+ int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+ >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+ int32_t released_pointer_id = AMotionEvent_getPointerId( event, index );
+
+ std::vector<int32_t>::iterator it = vec_pointers_.begin();
+ std::vector<int32_t>::iterator it_end = vec_pointers_.end();
+ int32_t i = 0;
+ for( ; it != it_end; ++it, ++i )
+ {
+ if( *it == released_pointer_id )
+ {
+ vec_pointers_.erase( it );
+ break;
+ }
+ }
+
+ if( i <= 1 )
+ {
+ //Reset pinch or drag
+ if( count != 2 )
+ {
+ //Start new pinch
+ ret = GESTURE_STATE_START | GESTURE_STATE_END;
+ }
+ }
+ }
+ break;
+ case AMOTION_EVENT_ACTION_MOVE:
+ switch( count )
+ {
+ case 1:
+ break;
+ default:
+ //Multi touch
+ ret = GESTURE_STATE_MOVE;
+ break;
+ }
+ break;
+ case AMOTION_EVENT_ACTION_CANCEL:
+ break;
+ }
+
+ return ret;
+}
+
+bool PinchDetector::GetPointers( Vec2& v1, Vec2& v2 )
+{
+ if( vec_pointers_.size() < 2 )
+ return false;
+
+ int32_t index = FindIndex( event_, vec_pointers_[0] );
+ if( index == -1 )
+ return false;
+
+ float x = AMotionEvent_getX( event_, index );
+ float y = AMotionEvent_getY( event_, index );
+
+ index = FindIndex( event_, vec_pointers_[1] );
+ if( index == -1 )
+ return false;
+
+ float x2 = AMotionEvent_getX( event_, index );
+ float y2 = AMotionEvent_getY( event_, index );
+
+ v1 = Vec2( x, y );
+ v2 = Vec2( x2, y2 );
+
+ return true;
+}
+
+//--------------------------------------------------------------------------------
+// DragDetector
+//--------------------------------------------------------------------------------
+
+int32_t DragDetector::FindIndex( const AInputEvent* event, int32_t id )
+{
+ int32_t count = AMotionEvent_getPointerCount( event );
+ for( uint32_t i = 0; i < count; ++i )
+ {
+ if( id == AMotionEvent_getPointerId( event, i ) )
+ return i;
+ }
+ return -1;
+}
+
+GESTURE_STATE DragDetector::Detect( const AInputEvent* event )
+{
+ GESTURE_STATE ret = GESTURE_STATE_NONE;
+ int32_t action = AMotionEvent_getAction( event );
+ int32_t index = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)
+ >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+ uint32_t flags = action & AMOTION_EVENT_ACTION_MASK;
+ event_ = event;
+
+ int32_t count = AMotionEvent_getPointerCount( event );
+ switch( flags )
+ {
+ case AMOTION_EVENT_ACTION_DOWN:
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, 0 ) );
+ ret = GESTURE_STATE_START;
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_DOWN:
+ vec_pointers_.push_back( AMotionEvent_getPointerId( event, index ) );
+ break;
+ case AMOTION_EVENT_ACTION_UP:
+ vec_pointers_.pop_back();
+ ret = GESTURE_STATE_END;
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_UP:
+ {
+ int32_t released_pointer_id = AMotionEvent_getPointerId( event, index );
+
+ std::vector<int32_t>::iterator it = vec_pointers_.begin();
+ std::vector<int32_t>::iterator it_end = vec_pointers_.end();
+ int32_t i = 0;
+ for( ; it != it_end; ++it, ++i )
+ {
+ if( *it == released_pointer_id )
+ {
+ vec_pointers_.erase( it );
+ break;
+ }
+ }
+
+ if( i <= 1 )
+ {
+ //Reset pinch or drag
+ if( count == 2 )
+ {
+ ret = GESTURE_STATE_START;
+ }
+ }
+ break;
+ }
+ case AMOTION_EVENT_ACTION_MOVE:
+ switch( count )
+ {
+ case 1:
+ //Drag
+ ret = GESTURE_STATE_MOVE;
+ break;
+ default:
+ break;
+ }
+ break;
+ case AMOTION_EVENT_ACTION_CANCEL:
+ break;
+ }
+
+ return ret;
+}
+
+bool DragDetector::GetPointer( Vec2& v )
+{
+ if( vec_pointers_.size() < 1 )
+ return false;
+
+ int32_t iIndex = FindIndex( event_, vec_pointers_[0] );
+ if( iIndex == -1 )
+ return false;
+
+ float x = AMotionEvent_getX( event_, iIndex );
+ float y = AMotionEvent_getY( event_, iIndex );
+
+ v = Vec2( x, y );
+
+ return true;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/helper/gestureDetector.h b/ndk/sources/android/ndk_helper/gestureDetector.h
similarity index 61%
rename from ndk/sources/android/helper/gestureDetector.h
rename to ndk/sources/android/ndk_helper/gestureDetector.h
index f3c8942..6ae5d80 100644
--- a/ndk/sources/android/helper/gestureDetector.h
+++ b/ndk/sources/android/ndk_helper/gestureDetector.h
@@ -17,7 +17,6 @@
//--------------------------------------------------------------------------------
// gestureDetector.h
//--------------------------------------------------------------------------------
-
#ifndef GESTUREDETECTOR_H_
#define GESTUREDETECTOR_H_
@@ -30,6 +29,8 @@
#include "JNIHelper.h"
#include "vecmath.h"
+namespace ndk_helper
+{
//--------------------------------------------------------------------------------
// Constants
//--------------------------------------------------------------------------------
@@ -38,11 +39,14 @@
const int32_t DOUBLE_TAP_SLOP = 100;
const int32_t TOUCH_SLOP = 8;
-#define GESTURE_STATE_NONE (0)
-#define GESTURE_STATE_START (1)
-#define GESTURE_STATE_MOVE (2)
-#define GESTURE_STATE_END (4)
-#define GESTURE_STATE_ACTION (GESTURE_STATE_START | GESTURE_STATE_END)
+enum
+{
+ GESTURE_STATE_NONE = 0,
+ GESTURE_STATE_START = 1,
+ GESTURE_STATE_MOVE = 2,
+ GESTURE_STATE_END = 4,
+ GESTURE_STATE_ACTION = (GESTURE_STATE_START | GESTURE_STATE_END),
+};
typedef int32_t GESTURE_STATE;
/******************************************************************
@@ -55,13 +59,15 @@
class GestureDetector
{
protected:
- float _fDpFactor;
+ float dp_factor_;
public:
GestureDetector();
- virtual ~GestureDetector() {}
- virtual void setConfiguration(AConfiguration* config);
+ virtual ~GestureDetector()
+ {
+ }
+ virtual void SetConfiguration( AConfiguration* config );
- virtual GESTURE_STATE detect(const AInputEvent* motion_event) = 0;
+ virtual GESTURE_STATE Detect( const AInputEvent* motion_event ) = 0;
};
/******************************************************************
@@ -69,16 +75,20 @@
* Returns GESTURE_STATE_ACTION when a tap gesture is detected
*
*/
-class TapDetector : public GestureDetector
+class TapDetector: public GestureDetector
{
private:
- int32_t _iDownPointerID;
- float _fDownX;
- float _fDownY;
+ int32_t down_pointer_id_;
+ float down_x_;
+ float down_y_;
public:
- TapDetector() {}
- virtual ~TapDetector() {}
- virtual GESTURE_STATE detect(const AInputEvent* motion_event);
+ TapDetector()
+ {
+ }
+ virtual ~TapDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* motion_event );
};
/******************************************************************
@@ -86,19 +96,23 @@
* Returns GESTURE_STATE_ACTION when a double-tap gesture is detected
*
*/
-class DoubletapDetector : public GestureDetector
+class DoubletapDetector: public GestureDetector
{
private:
- TapDetector _tapDetector;
- int64_t _lastTapTime;
- float _fLastTapX;
- float _fLastTapY;
+ TapDetector tap_detector_;
+ int64_t last_tap_time_;
+ float last_tap_x_;
+ float last_tap_y_;
public:
- DoubletapDetector() {}
- virtual ~DoubletapDetector() {}
- virtual GESTURE_STATE detect(const AInputEvent* motion_event);
- virtual void setConfiguration(AConfiguration* config);
+ DoubletapDetector()
+ {
+ }
+ virtual ~DoubletapDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* motion_event );
+ virtual void SetConfiguration( AConfiguration* config );
};
/******************************************************************
@@ -108,18 +122,22 @@
* When the finger 1,2,3 are tapped and then finger 1 is released,
* the detector start new pinch gesture with finger 2 & 3.
*/
-class PinchDetector : public GestureDetector
+class PinchDetector: public GestureDetector
{
private:
- int32_t findIndex( const AInputEvent* event, int32_t iID );
- const AInputEvent* _event;
- std::vector<int32_t> _vecPointers;
+ int32_t FindIndex( const AInputEvent* event, int32_t id );
+ const AInputEvent* event_;
+ std::vector<int32_t> vec_pointers_;
public:
- PinchDetector() {}
- virtual ~PinchDetector() {}
- virtual GESTURE_STATE detect(const AInputEvent* event);
- bool getPointers( vec2& v1, vec2& v2 );
+ PinchDetector()
+ {
+ }
+ virtual ~PinchDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* event );
+ bool GetPointers( Vec2& v1, Vec2& v2 );
};
/******************************************************************
@@ -127,17 +145,22 @@
* Returns drag gesture state when a drag-tap gesture is detected
*
*/
-class DragDetector : public GestureDetector
+class DragDetector: public GestureDetector
{
private:
- int32_t findIndex( const AInputEvent* event, int32_t iID );
- const AInputEvent* _event;
- std::vector<int32_t> _vecPointers;
+ int32_t FindIndex( const AInputEvent* event, int32_t id );
+ const AInputEvent* event_;
+ std::vector<int32_t> vec_pointers_;
public:
- DragDetector() {}
- virtual ~DragDetector() {}
- virtual GESTURE_STATE detect(const AInputEvent* event);
- bool getPointer( vec2& v );
+ DragDetector()
+ {
+ }
+ virtual ~DragDetector()
+ {
+ }
+ virtual GESTURE_STATE Detect( const AInputEvent* event );
+ bool GetPointer( Vec2& v );
};
+} //namespace ndkHelper
#endif /* GESTUREDETECTOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/gl3stub.c b/ndk/sources/android/ndk_helper/gl3stub.c
new file mode 100644
index 0000000..c34d791
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/gl3stub.c
@@ -0,0 +1,512 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <EGL/egl.h>
+#include "gl3stub.h"
+
+GLboolean gl3stubInit()
+{
+#define FIND_PROC(s) s = (void*)eglGetProcAddress(#s);
+ FIND_PROC( glReadBuffer );
+ FIND_PROC( glDrawRangeElements );
+ FIND_PROC( glTexImage3D );
+ FIND_PROC( glTexSubImage3D );
+ FIND_PROC( glCopyTexSubImage3D );
+ FIND_PROC( glCompressedTexImage3D );
+ FIND_PROC( glCompressedTexSubImage3D );
+ FIND_PROC( glGenQueries );
+ FIND_PROC( glDeleteQueries );
+ FIND_PROC( glIsQuery );
+ FIND_PROC( glBeginQuery );
+ FIND_PROC( glEndQuery );
+ FIND_PROC( glGetQueryiv );
+ FIND_PROC( glGetQueryObjectuiv );
+ FIND_PROC( glUnmapBuffer );
+ FIND_PROC( glGetBufferPointerv );
+ FIND_PROC( glDrawBuffers );
+ FIND_PROC( glUniformMatrix2x3fv );
+ FIND_PROC( glUniformMatrix3x2fv );
+ FIND_PROC( glUniformMatrix2x4fv );
+ FIND_PROC( glUniformMatrix4x2fv );
+ FIND_PROC( glUniformMatrix3x4fv );
+ FIND_PROC( glUniformMatrix4x3fv );
+ FIND_PROC( glBlitFramebuffer );
+ FIND_PROC( glRenderbufferStorageMultisample );
+ FIND_PROC( glFramebufferTextureLayer );
+ FIND_PROC( glMapBufferRange );
+ FIND_PROC( glFlushMappedBufferRange );
+ FIND_PROC( glBindVertexArray );
+ FIND_PROC( glDeleteVertexArrays );
+ FIND_PROC( glGenVertexArrays );
+ FIND_PROC( glIsVertexArray );
+ FIND_PROC( glGetIntegeri_v );
+ FIND_PROC( glBeginTransformFeedback );
+ FIND_PROC( glEndTransformFeedback );
+ FIND_PROC( glBindBufferRange );
+ FIND_PROC( glBindBufferBase );
+ FIND_PROC( glTransformFeedbackVaryings );
+ FIND_PROC( glGetTransformFeedbackVarying );
+ FIND_PROC( glVertexAttribIPointer );
+ FIND_PROC( glGetVertexAttribIiv );
+ FIND_PROC( glGetVertexAttribIuiv );
+ FIND_PROC( glVertexAttribI4i );
+ FIND_PROC( glVertexAttribI4ui );
+ FIND_PROC( glVertexAttribI4iv );
+ FIND_PROC( glVertexAttribI4uiv );
+ FIND_PROC( glGetUniformuiv );
+ FIND_PROC( glGetFragDataLocation );
+ FIND_PROC( glUniform1ui );
+ FIND_PROC( glUniform2ui );
+ FIND_PROC( glUniform3ui );
+ FIND_PROC( glUniform4ui );
+ FIND_PROC( glUniform1uiv );
+ FIND_PROC( glUniform2uiv );
+ FIND_PROC( glUniform3uiv );
+ FIND_PROC( glUniform4uiv );
+ FIND_PROC( glClearBufferiv );
+ FIND_PROC( glClearBufferuiv );
+ FIND_PROC( glClearBufferfv );
+ FIND_PROC( glClearBufferfi );
+ FIND_PROC( glGetStringi );
+ FIND_PROC( glCopyBufferSubData );
+ FIND_PROC( glGetUniformIndices );
+ FIND_PROC( glGetActiveUniformsiv );
+ FIND_PROC( glGetUniformBlockIndex );
+ FIND_PROC( glGetActiveUniformBlockiv );
+ FIND_PROC( glGetActiveUniformBlockName );
+ FIND_PROC( glUniformBlockBinding );
+ FIND_PROC( glDrawArraysInstanced );
+ FIND_PROC( glDrawElementsInstanced );
+ FIND_PROC( glFenceSync );
+ FIND_PROC( glIsSync );
+ FIND_PROC( glDeleteSync );
+ FIND_PROC( glClientWaitSync );
+ FIND_PROC( glWaitSync );
+ FIND_PROC( glGetInteger64v );
+ FIND_PROC( glGetSynciv );
+ FIND_PROC( glGetInteger64i_v );
+ FIND_PROC( glGetBufferParameteri64v );
+ FIND_PROC( glGenSamplers );
+ FIND_PROC( glDeleteSamplers );
+ FIND_PROC( glIsSampler );
+ FIND_PROC( glBindSampler );
+ FIND_PROC( glSamplerParameteri );
+ FIND_PROC( glSamplerParameteriv );
+ FIND_PROC( glSamplerParameterf );
+ FIND_PROC( glSamplerParameterfv );
+ FIND_PROC( glGetSamplerParameteriv );
+ FIND_PROC( glGetSamplerParameterfv );
+ FIND_PROC( glVertexAttribDivisor );
+ FIND_PROC( glBindTransformFeedback );
+ FIND_PROC( glDeleteTransformFeedbacks );
+ FIND_PROC( glGenTransformFeedbacks );
+ FIND_PROC( glIsTransformFeedback );
+ FIND_PROC( glPauseTransformFeedback );
+ FIND_PROC( glResumeTransformFeedback );
+ FIND_PROC( glGetProgramBinary );
+ FIND_PROC( glProgramBinary );
+ FIND_PROC( glProgramParameteri );
+ FIND_PROC( glInvalidateFramebuffer );
+ FIND_PROC( glInvalidateSubFramebuffer );
+ FIND_PROC( glTexStorage2D );
+ FIND_PROC( glTexStorage3D );
+ FIND_PROC( glGetInternalformativ );
+#undef FIND_PROC
+
+ if( !glReadBuffer || !glDrawRangeElements || !glTexImage3D || !glTexSubImage3D
+ || !glCopyTexSubImage3D || !glCompressedTexImage3D
+ || !glCompressedTexSubImage3D || !glGenQueries || !glDeleteQueries
+ || !glIsQuery || !glBeginQuery || !glEndQuery || !glGetQueryiv
+ || !glGetQueryObjectuiv || !glUnmapBuffer || !glGetBufferPointerv
+ || !glDrawBuffers || !glUniformMatrix2x3fv || !glUniformMatrix3x2fv
+ || !glUniformMatrix2x4fv || !glUniformMatrix4x2fv || !glUniformMatrix3x4fv
+ || !glUniformMatrix4x3fv || !glBlitFramebuffer
+ || !glRenderbufferStorageMultisample || !glFramebufferTextureLayer
+ || !glMapBufferRange || !glFlushMappedBufferRange || !glBindVertexArray
+ || !glDeleteVertexArrays || !glGenVertexArrays || !glIsVertexArray
+ || !glGetIntegeri_v || !glBeginTransformFeedback || !glEndTransformFeedback
+ || !glBindBufferRange || !glBindBufferBase || !glTransformFeedbackVaryings
+ || !glGetTransformFeedbackVarying || !glVertexAttribIPointer
+ || !glGetVertexAttribIiv || !glGetVertexAttribIuiv || !glVertexAttribI4i
+ || !glVertexAttribI4ui || !glVertexAttribI4iv || !glVertexAttribI4uiv
+ || !glGetUniformuiv || !glGetFragDataLocation || !glUniform1ui
+ || !glUniform2ui || !glUniform3ui || !glUniform4ui || !glUniform1uiv
+ || !glUniform2uiv || !glUniform3uiv || !glUniform4uiv || !glClearBufferiv
+ || !glClearBufferuiv || !glClearBufferfv || !glClearBufferfi || !glGetStringi
+ || !glCopyBufferSubData || !glGetUniformIndices || !glGetActiveUniformsiv
+ || !glGetUniformBlockIndex || !glGetActiveUniformBlockiv
+ || !glGetActiveUniformBlockName || !glUniformBlockBinding
+ || !glDrawArraysInstanced || !glDrawElementsInstanced || !glFenceSync
+ || !glIsSync || !glDeleteSync || !glClientWaitSync || !glWaitSync
+ || !glGetInteger64v || !glGetSynciv || !glGetInteger64i_v
+ || !glGetBufferParameteri64v || !glGenSamplers || !glDeleteSamplers
+ || !glIsSampler || !glBindSampler || !glSamplerParameteri
+ || !glSamplerParameteriv || !glSamplerParameterf || !glSamplerParameterfv
+ || !glGetSamplerParameteriv || !glGetSamplerParameterfv
+ || !glVertexAttribDivisor || !glBindTransformFeedback
+ || !glDeleteTransformFeedbacks || !glGenTransformFeedbacks
+ || !glIsTransformFeedback || !glPauseTransformFeedback
+ || !glResumeTransformFeedback || !glGetProgramBinary || !glProgramBinary
+ || !glProgramParameteri || !glInvalidateFramebuffer
+ || !glInvalidateSubFramebuffer || !glTexStorage2D || !glTexStorage3D
+ || !glGetInternalformativ )
+ {
+ return GL_FALSE;
+ }
+
+ return GL_TRUE;
+}
+
+/* Function pointer definitions */GL_APICALL void (* GL_APIENTRY glReadBuffer)( GLenum mode );
+GL_APICALL void (* GL_APIENTRY glDrawRangeElements)( GLenum mode,
+ GLuint start,
+ GLuint end,
+ GLsizei count,
+ GLenum type,
+ const GLvoid* indices );
+GL_APICALL void (* GL_APIENTRY glTexImage3D)( GLenum target,
+ GLint level,
+ GLint internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLint border,
+ GLenum format,
+ GLenum type,
+ const GLvoid* pixels );
+GL_APICALL void (* GL_APIENTRY glTexSubImage3D)( GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLint zoffset,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLenum format,
+ GLenum type,
+ const GLvoid* pixels );
+GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D)( GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLint zoffset,
+ GLint x,
+ GLint y,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D)( GLenum target,
+ GLint level,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLint border,
+ GLsizei imageSize,
+ const GLvoid* data );
+GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D)( GLenum target,
+ GLint level,
+ GLint xoffset,
+ GLint yoffset,
+ GLint zoffset,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth,
+ GLenum format,
+ GLsizei imageSize,
+ const GLvoid* data );
+GL_APICALL void (* GL_APIENTRY glGenQueries)( GLsizei n, GLuint* ids );
+GL_APICALL void (* GL_APIENTRY glDeleteQueries)( GLsizei n, const GLuint* ids );
+GL_APICALL GLboolean (* GL_APIENTRY glIsQuery)( GLuint id );
+GL_APICALL void (* GL_APIENTRY glBeginQuery)( GLenum target, GLuint id );
+GL_APICALL void (* GL_APIENTRY glEndQuery)( GLenum target );
+GL_APICALL void (* GL_APIENTRY glGetQueryiv)( GLenum target, GLenum pname, GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv)( GLuint id,
+ GLenum pname,
+ GLuint* params );
+GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer)( GLenum target );
+GL_APICALL void (* GL_APIENTRY glGetBufferPointerv)( GLenum target,
+ GLenum pname,
+ GLvoid** params );
+GL_APICALL void (* GL_APIENTRY glDrawBuffers)( GLsizei n, const GLenum* bufs );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv)( GLint location,
+ GLsizei count,
+ GLboolean transpose,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glBlitFramebuffer)( GLint srcX0,
+ GLint srcY0,
+ GLint srcX1,
+ GLint srcY1,
+ GLint dstX0,
+ GLint dstY0,
+ GLint dstX1,
+ GLint dstY1,
+ GLbitfield mask,
+ GLenum filter );
+GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample)( GLenum target,
+ GLsizei samples,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer)( GLenum target,
+ GLenum attachment,
+ GLuint texture,
+ GLint level,
+ GLint layer );
+GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange)( GLenum target,
+ GLintptr offset,
+ GLsizeiptr length,
+ GLbitfield access );
+GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange)( GLenum target,
+ GLintptr offset,
+ GLsizeiptr length );
+GL_APICALL void (* GL_APIENTRY glBindVertexArray)( GLuint array );
+GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays)( GLsizei n, const GLuint* arrays );
+GL_APICALL void (* GL_APIENTRY glGenVertexArrays)( GLsizei n, GLuint* arrays );
+GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray)( GLuint array );
+GL_APICALL void (* GL_APIENTRY glGetIntegeri_v)( GLenum target,
+ GLuint index,
+ GLint* data );
+GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback)( GLenum primitiveMode );
+GL_APICALL void (* GL_APIENTRY glEndTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glBindBufferRange)( GLenum target,
+ GLuint index,
+ GLuint buffer,
+ GLintptr offset,
+ GLsizeiptr size );
+GL_APICALL void (* GL_APIENTRY glBindBufferBase)( GLenum target,
+ GLuint index,
+ GLuint buffer );
+GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings)( GLuint program,
+ GLsizei count,
+ const GLchar* const * varyings,
+ GLenum bufferMode );
+GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying)( GLuint program,
+ GLuint index,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLsizei* size,
+ GLenum* type,
+ GLchar* name );
+GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer)( GLuint index,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const GLvoid* pointer );
+GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv)( GLuint index,
+ GLenum pname,
+ GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv)( GLuint index,
+ GLenum pname,
+ GLuint* params );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4i)( GLuint index,
+ GLint x,
+ GLint y,
+ GLint z,
+ GLint w );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui)( GLuint index,
+ GLuint x,
+ GLuint y,
+ GLuint z,
+ GLuint w );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv)( GLuint index, const GLint* v );
+GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv)( GLuint index, const GLuint* v );
+GL_APICALL void (* GL_APIENTRY glGetUniformuiv)( GLuint program,
+ GLint location,
+ GLuint* params );
+GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation)( GLuint program,
+ const GLchar *name );
+GL_APICALL void (* GL_APIENTRY glUniform1ui)( GLint location, GLuint v0 );
+GL_APICALL void (* GL_APIENTRY glUniform2ui)( GLint location, GLuint v0, GLuint v1 );
+GL_APICALL void (* GL_APIENTRY glUniform3ui)( GLint location,
+ GLuint v0,
+ GLuint v1,
+ GLuint v2 );
+GL_APICALL void (* GL_APIENTRY glUniform4ui)( GLint location,
+ GLuint v0,
+ GLuint v1,
+ GLuint v2,
+ GLuint v3 );
+GL_APICALL void (* GL_APIENTRY glUniform1uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform2uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform3uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glUniform4uiv)( GLint location,
+ GLsizei count,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferiv)( GLenum buffer,
+ GLint drawbuffer,
+ const GLint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferuiv)( GLenum buffer,
+ GLint drawbuffer,
+ const GLuint* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferfv)( GLenum buffer,
+ GLint drawbuffer,
+ const GLfloat* value );
+GL_APICALL void (* GL_APIENTRY glClearBufferfi)( GLenum buffer,
+ GLint drawbuffer,
+ GLfloat depth,
+ GLint stencil );
+GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi)( GLenum name, GLuint index );
+GL_APICALL void (* GL_APIENTRY glCopyBufferSubData)( GLenum readTarget,
+ GLenum writeTarget,
+ GLintptr readOffset,
+ GLintptr writeOffset,
+ GLsizeiptr size );
+GL_APICALL void (* GL_APIENTRY glGetUniformIndices)( GLuint program,
+ GLsizei uniformCount,
+ const GLchar* const * uniformNames,
+ GLuint* uniformIndices );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv)( GLuint program,
+ GLsizei uniformCount,
+ const GLuint* uniformIndices,
+ GLenum pname,
+ GLint* params );
+GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex)( GLuint program,
+ const GLchar* uniformBlockName );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv)( GLuint program,
+ GLuint uniformBlockIndex,
+ GLenum pname,
+ GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName)( GLuint program,
+ GLuint uniformBlockIndex,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLchar* uniformBlockName );
+GL_APICALL void (* GL_APIENTRY glUniformBlockBinding)( GLuint program,
+ GLuint uniformBlockIndex,
+ GLuint uniformBlockBinding );
+GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced)( GLenum mode,
+ GLint first,
+ GLsizei count,
+ GLsizei instanceCount );
+GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced)( GLenum mode,
+ GLsizei count,
+ GLenum type,
+ const GLvoid* indices,
+ GLsizei instanceCount );
+GL_APICALL GLsync (* GL_APIENTRY glFenceSync)( GLenum condition, GLbitfield flags );
+GL_APICALL GLboolean (* GL_APIENTRY glIsSync)( GLsync sync );
+GL_APICALL void (* GL_APIENTRY glDeleteSync)( GLsync sync );
+GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync)( GLsync sync,
+ GLbitfield flags,
+ GLuint64 timeout );
+GL_APICALL void (* GL_APIENTRY glWaitSync)( GLsync sync,
+ GLbitfield flags,
+ GLuint64 timeout );
+GL_APICALL void (* GL_APIENTRY glGetInteger64v)( GLenum pname, GLint64* params );
+GL_APICALL void (* GL_APIENTRY glGetSynciv)( GLsync sync,
+ GLenum pname,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLint* values );
+GL_APICALL void (* GL_APIENTRY glGetInteger64i_v)( GLenum target,
+ GLuint index,
+ GLint64* data );
+GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v)( GLenum target,
+ GLenum pname,
+ GLint64* params );
+GL_APICALL void (* GL_APIENTRY glGenSamplers)( GLsizei count, GLuint* samplers );
+GL_APICALL void (* GL_APIENTRY glDeleteSamplers)( GLsizei count, const GLuint* samplers );
+GL_APICALL GLboolean (* GL_APIENTRY glIsSampler)( GLuint sampler );
+GL_APICALL void (* GL_APIENTRY glBindSampler)( GLuint unit, GLuint sampler );
+GL_APICALL void (* GL_APIENTRY glSamplerParameteri)( GLuint sampler,
+ GLenum pname,
+ GLint param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameteriv)( GLuint sampler,
+ GLenum pname,
+ const GLint* param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameterf)( GLuint sampler,
+ GLenum pname,
+ GLfloat param );
+GL_APICALL void (* GL_APIENTRY glSamplerParameterfv)( GLuint sampler,
+ GLenum pname,
+ const GLfloat* param );
+GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv)( GLuint sampler,
+ GLenum pname,
+ GLint* params );
+GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv)( GLuint sampler,
+ GLenum pname,
+ GLfloat* params );
+GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor)( GLuint index, GLuint divisor );
+GL_APICALL void (* GL_APIENTRY glBindTransformFeedback)( GLenum target, GLuint id );
+GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks)( GLsizei n, const GLuint* ids );
+GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks)( GLsizei n, GLuint* ids );
+GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback)( GLuint id );
+GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback)( void );
+GL_APICALL void (* GL_APIENTRY glGetProgramBinary)( GLuint program,
+ GLsizei bufSize,
+ GLsizei* length,
+ GLenum* binaryFormat,
+ GLvoid* binary );
+GL_APICALL void (* GL_APIENTRY glProgramBinary)( GLuint program,
+ GLenum binaryFormat,
+ const GLvoid* binary,
+ GLsizei length );
+GL_APICALL void (* GL_APIENTRY glProgramParameteri)( GLuint program,
+ GLenum pname,
+ GLint value );
+GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer)( GLenum target,
+ GLsizei numAttachments,
+ const GLenum* attachments );
+GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer)( GLenum target,
+ GLsizei numAttachments,
+ const GLenum* attachments,
+ GLint x,
+ GLint y,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glTexStorage2D)( GLenum target,
+ GLsizei levels,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height );
+GL_APICALL void (* GL_APIENTRY glTexStorage3D)( GLenum target,
+ GLsizei levels,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height,
+ GLsizei depth );
+GL_APICALL void (* GL_APIENTRY glGetInternalformativ)( GLenum target,
+ GLenum internalformat,
+ GLenum pname,
+ GLsizei bufSize,
+ GLint* params );
diff --git a/ndk/sources/android/helper/gl3stub.h b/ndk/sources/android/ndk_helper/gl3stub.h
similarity index 60%
rename from ndk/sources/android/helper/gl3stub.h
rename to ndk/sources/android/ndk_helper/gl3stub.h
index a6ca636..537dd28 100644
--- a/ndk/sources/android/helper/gl3stub.h
+++ b/ndk/sources/android/ndk_helper/gl3stub.h
@@ -16,31 +16,32 @@
#include <GLES2/gl2.h>
#ifdef __cplusplus
-extern "C" {
+extern "C"
+{
#endif
/*
-** Copyright (c) 2007-2013 The Khronos Group Inc.
-**
-** Permission is hereby granted, free of charge, to any person obtaining a
-** copy of this software and/or associated documentation files (the
-** "Materials"), to deal in the Materials without restriction, including
-** without limitation the rights to use, copy, modify, merge, publish,
-** distribute, sublicense, and/or sell copies of the Materials, and to
-** permit persons to whom the Materials are furnished to do so, subject to
-** the following conditions:
-**
-** The above copyright notice and this permission notice shall be included
-** in all copies or substantial portions of the Materials.
-**
-** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
-*/
+ ** Copyright (c) 2007-2013 The Khronos Group Inc.
+ **
+ ** Permission is hereby granted, free of charge, to any person obtaining a
+ ** copy of this software and/or associated documentation files (the
+ ** "Materials"), to deal in the Materials without restriction, including
+ ** without limitation the rights to use, copy, modify, merge, publish,
+ ** distribute, sublicense, and/or sell copies of the Materials, and to
+ ** permit persons to whom the Materials are furnished to do so, subject to
+ ** the following conditions:
+ **
+ ** The above copyright notice and this permission notice shall be included
+ ** in all copies or substantial portions of the Materials.
+ **
+ ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ */
/*
* This files is for apps that want to use ES3 if present,
@@ -62,8 +63,8 @@
/* OpenGL ES 3.0 */
-typedef unsigned short GLhalf;
-typedef khronos_int64_t GLint64;
+typedef unsigned short GLhalf;
+typedef khronos_int64_t GLint64;
typedef khronos_uint64_t GLuint64;
typedef struct __GLsync *GLsync;
@@ -388,110 +389,110 @@
/* OpenGL ES 3.0 */
-extern GL_APICALL void (* GL_APIENTRY glReadBuffer) (GLenum mode);
-extern GL_APICALL void (* GL_APIENTRY glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices);
-extern GL_APICALL void (* GL_APIENTRY glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
-extern GL_APICALL void (* GL_APIENTRY glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
-extern GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-extern GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
-extern GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
-extern GL_APICALL void (* GL_APIENTRY glGenQueries) (GLsizei n, GLuint* ids);
-extern GL_APICALL void (* GL_APIENTRY glDeleteQueries) (GLsizei n, const GLuint* ids);
-extern GL_APICALL GLboolean (* GL_APIENTRY glIsQuery) (GLuint id);
-extern GL_APICALL void (* GL_APIENTRY glBeginQuery) (GLenum target, GLuint id);
-extern GL_APICALL void (* GL_APIENTRY glEndQuery) (GLenum target);
-extern GL_APICALL void (* GL_APIENTRY glGetQueryiv) (GLenum target, GLenum pname, GLint* params);
-extern GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint* params);
-extern GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer) (GLenum target);
-extern GL_APICALL void (* GL_APIENTRY glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid** params);
-extern GL_APICALL void (* GL_APIENTRY glDrawBuffers) (GLsizei n, const GLenum* bufs);
-extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-extern GL_APICALL void (* GL_APIENTRY glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
-extern GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
-extern GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
-extern GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
-extern GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length);
-extern GL_APICALL void (* GL_APIENTRY glBindVertexArray) (GLuint array);
-extern GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays) (GLsizei n, const GLuint* arrays);
-extern GL_APICALL void (* GL_APIENTRY glGenVertexArrays) (GLsizei n, GLuint* arrays);
-extern GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray) (GLuint array);
-extern GL_APICALL void (* GL_APIENTRY glGetIntegeri_v) (GLenum target, GLuint index, GLint* data);
-extern GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback) (GLenum primitiveMode);
-extern GL_APICALL void (* GL_APIENTRY glEndTransformFeedback) (void);
-extern GL_APICALL void (* GL_APIENTRY glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
-extern GL_APICALL void (* GL_APIENTRY glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
-extern GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
-extern GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
-extern GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint* params);
-extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint* params);
-extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w);
-extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
-extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv) (GLuint index, const GLint* v);
-extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv) (GLuint index, const GLuint* v);
-extern GL_APICALL void (* GL_APIENTRY glGetUniformuiv) (GLuint program, GLint location, GLuint* params);
-extern GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation) (GLuint program, const GLchar *name);
-extern GL_APICALL void (* GL_APIENTRY glUniform1ui) (GLint location, GLuint v0);
-extern GL_APICALL void (* GL_APIENTRY glUniform2ui) (GLint location, GLuint v0, GLuint v1);
-extern GL_APICALL void (* GL_APIENTRY glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2);
-extern GL_APICALL void (* GL_APIENTRY glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
-extern GL_APICALL void (* GL_APIENTRY glUniform1uiv) (GLint location, GLsizei count, const GLuint* value);
-extern GL_APICALL void (* GL_APIENTRY glUniform2uiv) (GLint location, GLsizei count, const GLuint* value);
-extern GL_APICALL void (* GL_APIENTRY glUniform3uiv) (GLint location, GLsizei count, const GLuint* value);
-extern GL_APICALL void (* GL_APIENTRY glUniform4uiv) (GLint location, GLsizei count, const GLuint* value);
-extern GL_APICALL void (* GL_APIENTRY glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint* value);
-extern GL_APICALL void (* GL_APIENTRY glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint* value);
-extern GL_APICALL void (* GL_APIENTRY glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
-extern GL_APICALL void (* GL_APIENTRY glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
+extern GL_APICALL void (* GL_APIENTRY glReadBuffer) (GLenum mode);
+extern GL_APICALL void (* GL_APIENTRY glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices);
+extern GL_APICALL void (* GL_APIENTRY glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
+extern GL_APICALL void (* GL_APIENTRY glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
+extern GL_APICALL void (* GL_APIENTRY glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
+extern GL_APICALL void (* GL_APIENTRY glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
+extern GL_APICALL void (* GL_APIENTRY glGenQueries) (GLsizei n, GLuint* ids);
+extern GL_APICALL void (* GL_APIENTRY glDeleteQueries) (GLsizei n, const GLuint* ids);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsQuery) (GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glBeginQuery) (GLenum target, GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glEndQuery) (GLenum target);
+extern GL_APICALL void (* GL_APIENTRY glGetQueryiv) (GLenum target, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint* params);
+extern GL_APICALL GLboolean (* GL_APIENTRY glUnmapBuffer) (GLenum target);
+extern GL_APICALL void (* GL_APIENTRY glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid** params);
+extern GL_APICALL void (* GL_APIENTRY glDrawBuffers) (GLsizei n, const GLenum* bufs);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+extern GL_APICALL void (* GL_APIENTRY glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
+extern GL_APICALL GLvoid* (* GL_APIENTRY glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
+extern GL_APICALL void (* GL_APIENTRY glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length);
+extern GL_APICALL void (* GL_APIENTRY glBindVertexArray) (GLuint array);
+extern GL_APICALL void (* GL_APIENTRY glDeleteVertexArrays) (GLsizei n, const GLuint* arrays);
+extern GL_APICALL void (* GL_APIENTRY glGenVertexArrays) (GLsizei n, GLuint* arrays);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsVertexArray) (GLuint array);
+extern GL_APICALL void (* GL_APIENTRY glGetIntegeri_v) (GLenum target, GLuint index, GLint* data);
+extern GL_APICALL void (* GL_APIENTRY glBeginTransformFeedback) (GLenum primitiveMode);
+extern GL_APICALL void (* GL_APIENTRY glEndTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+extern GL_APICALL void (* GL_APIENTRY glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
+extern GL_APICALL void (* GL_APIENTRY glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
+extern GL_APICALL void (* GL_APIENTRY glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
+extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint* params);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4iv) (GLuint index, const GLint* v);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribI4uiv) (GLuint index, const GLuint* v);
+extern GL_APICALL void (* GL_APIENTRY glGetUniformuiv) (GLuint program, GLint location, GLuint* params);
+extern GL_APICALL GLint (* GL_APIENTRY glGetFragDataLocation) (GLuint program, const GLchar *name);
+extern GL_APICALL void (* GL_APIENTRY glUniform1ui) (GLint location, GLuint v0);
+extern GL_APICALL void (* GL_APIENTRY glUniform2ui) (GLint location, GLuint v0, GLuint v1);
+extern GL_APICALL void (* GL_APIENTRY glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2);
+extern GL_APICALL void (* GL_APIENTRY glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
+extern GL_APICALL void (* GL_APIENTRY glUniform1uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform2uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform3uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glUniform4uiv) (GLint location, GLsizei count, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
+extern GL_APICALL void (* GL_APIENTRY glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
extern GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi) (GLenum name, GLuint index);
-extern GL_APICALL void (* GL_APIENTRY glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
-extern GL_APICALL void (* GL_APIENTRY glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
-extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
-extern GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex) (GLuint program, const GLchar* uniformBlockName);
-extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
-extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
-extern GL_APICALL void (* GL_APIENTRY glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
-extern GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
-extern GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount);
-extern GL_APICALL GLsync (* GL_APIENTRY glFenceSync) (GLenum condition, GLbitfield flags);
-extern GL_APICALL GLboolean (* GL_APIENTRY glIsSync) (GLsync sync);
-extern GL_APICALL void (* GL_APIENTRY glDeleteSync) (GLsync sync);
-extern GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
-extern GL_APICALL void (* GL_APIENTRY glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
-extern GL_APICALL void (* GL_APIENTRY glGetInteger64v) (GLenum pname, GLint64* params);
-extern GL_APICALL void (* GL_APIENTRY glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values);
-extern GL_APICALL void (* GL_APIENTRY glGetInteger64i_v) (GLenum target, GLuint index, GLint64* data);
-extern GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64* params);
-extern GL_APICALL void (* GL_APIENTRY glGenSamplers) (GLsizei count, GLuint* samplers);
-extern GL_APICALL void (* GL_APIENTRY glDeleteSamplers) (GLsizei count, const GLuint* samplers);
-extern GL_APICALL GLboolean (* GL_APIENTRY glIsSampler) (GLuint sampler);
-extern GL_APICALL void (* GL_APIENTRY glBindSampler) (GLuint unit, GLuint sampler);
-extern GL_APICALL void (* GL_APIENTRY glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param);
-extern GL_APICALL void (* GL_APIENTRY glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint* param);
-extern GL_APICALL void (* GL_APIENTRY glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param);
-extern GL_APICALL void (* GL_APIENTRY glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat* param);
-extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint* params);
-extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat* params);
-extern GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor) (GLuint index, GLuint divisor);
-extern GL_APICALL void (* GL_APIENTRY glBindTransformFeedback) (GLenum target, GLuint id);
-extern GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks) (GLsizei n, const GLuint* ids);
-extern GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks) (GLsizei n, GLuint* ids);
-extern GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback) (GLuint id);
-extern GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback) (void);
-extern GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback) (void);
-extern GL_APICALL void (* GL_APIENTRY glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary);
-extern GL_APICALL void (* GL_APIENTRY glProgramBinary) (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length);
-extern GL_APICALL void (* GL_APIENTRY glProgramParameteri) (GLuint program, GLenum pname, GLint value);
-extern GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
-extern GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
-extern GL_APICALL void (* GL_APIENTRY glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
-extern GL_APICALL void (* GL_APIENTRY glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
-extern GL_APICALL void (* GL_APIENTRY glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+extern GL_APICALL void (* GL_APIENTRY glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
+extern GL_APICALL GLuint (* GL_APIENTRY glGetUniformBlockIndex) (GLuint program, const GLchar* uniformBlockName);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
+extern GL_APICALL void (* GL_APIENTRY glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+extern GL_APICALL void (* GL_APIENTRY glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
+extern GL_APICALL void (* GL_APIENTRY glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount);
+extern GL_APICALL GLsync (* GL_APIENTRY glFenceSync) (GLenum condition, GLbitfield flags);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsSync) (GLsync sync);
+extern GL_APICALL void (* GL_APIENTRY glDeleteSync) (GLsync sync);
+extern GL_APICALL GLenum (* GL_APIENTRY glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+extern GL_APICALL void (* GL_APIENTRY glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
+extern GL_APICALL void (* GL_APIENTRY glGetInteger64v) (GLenum pname, GLint64* params);
+extern GL_APICALL void (* GL_APIENTRY glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values);
+extern GL_APICALL void (* GL_APIENTRY glGetInteger64i_v) (GLenum target, GLuint index, GLint64* data);
+extern GL_APICALL void (* GL_APIENTRY glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64* params);
+extern GL_APICALL void (* GL_APIENTRY glGenSamplers) (GLsizei count, GLuint* samplers);
+extern GL_APICALL void (* GL_APIENTRY glDeleteSamplers) (GLsizei count, const GLuint* samplers);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsSampler) (GLuint sampler);
+extern GL_APICALL void (* GL_APIENTRY glBindSampler) (GLuint unit, GLuint sampler);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint* param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param);
+extern GL_APICALL void (* GL_APIENTRY glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat* param);
+extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint* params);
+extern GL_APICALL void (* GL_APIENTRY glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat* params);
+extern GL_APICALL void (* GL_APIENTRY glVertexAttribDivisor) (GLuint index, GLuint divisor);
+extern GL_APICALL void (* GL_APIENTRY glBindTransformFeedback) (GLenum target, GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glDeleteTransformFeedbacks) (GLsizei n, const GLuint* ids);
+extern GL_APICALL void (* GL_APIENTRY glGenTransformFeedbacks) (GLsizei n, GLuint* ids);
+extern GL_APICALL GLboolean (* GL_APIENTRY glIsTransformFeedback) (GLuint id);
+extern GL_APICALL void (* GL_APIENTRY glPauseTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glResumeTransformFeedback) (void);
+extern GL_APICALL void (* GL_APIENTRY glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary);
+extern GL_APICALL void (* GL_APIENTRY glProgramBinary) (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length);
+extern GL_APICALL void (* GL_APIENTRY glProgramParameteri) (GLuint program, GLenum pname, GLint value);
+extern GL_APICALL void (* GL_APIENTRY glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
+extern GL_APICALL void (* GL_APIENTRY glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
+extern GL_APICALL void (* GL_APIENTRY glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
+extern GL_APICALL void (* GL_APIENTRY glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
#ifdef __cplusplus
}
diff --git a/ndk/sources/android/ndk_helper/interpolator.cpp b/ndk/sources/android/ndk_helper/interpolator.cpp
new file mode 100644
index 0000000..4167051
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/interpolator.cpp
@@ -0,0 +1,181 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "interpolator.h"
+#include <math.h>
+#include "interpolator.h"
+
+namespace ndk_helper
+{
+
+//-------------------------------------------------
+//Ctor
+//-------------------------------------------------
+Interpolator::Interpolator()
+{
+ list_params_.clear();
+}
+
+//-------------------------------------------------
+//Dtor
+//-------------------------------------------------
+Interpolator::~Interpolator()
+{
+ list_params_.clear();
+}
+
+void Interpolator::Clear()
+{
+ list_params_.clear();
+}
+
+Interpolator& Interpolator::Set( const float start,
+ const float dest,
+ const INTERPOLATOR_TYPE type,
+ const double duration )
+{
+ //init the parameters for the interpolation process
+ start_time_ = PerfMonitor::GetCurrentTime();
+ dest_time_ = start_time_ + duration;
+ type_ = type;
+
+ start_value_ = start;
+ dest_value_ = dest;
+ return *this;
+}
+
+Interpolator& Interpolator::Add( const float dest,
+ const INTERPOLATOR_TYPE type,
+ const double duration )
+{
+ InterpolatorParams param;
+ param.dest_value_ = dest;
+ param.type_ = type;
+ param.duration_ = duration;
+ list_params_.push_back( param );
+ return *this;
+}
+
+bool Interpolator::Update( const double current_time, float& p )
+{
+ bool bContinue;
+ if( current_time >= dest_time_ )
+ {
+ p = dest_value_;
+ if( list_params_.size() )
+ {
+ InterpolatorParams& item = list_params_.front();
+ Set( dest_value_, item.dest_value_, item.type_, item.duration_ );
+ list_params_.pop_front();
+
+ bContinue = true;
+ }
+ else
+ {
+ bContinue = false;
+ }
+ }
+ else
+ {
+ float t = (float) (current_time - start_time_);
+ float d = (float) (dest_time_ - start_time_);
+ float b = start_value_;
+ float c = dest_value_ - start_value_;
+ p = GetFormula( type_, t, b, d, c );
+
+ bContinue = true;
+ }
+ return bContinue;
+}
+
+float Interpolator::GetFormula( const INTERPOLATOR_TYPE type,
+ const float t,
+ const float b,
+ const float d,
+ const float c )
+{
+ float t1;
+ switch( type )
+ {
+ case INTERPOLATOR_TYPE_LINEAR:
+ // simple linear interpolation - no easing
+ return (c * t / d + b);
+
+ case INTERPOLATOR_TYPE_EASEINQUAD:
+ // quadratic (t^2) easing in - accelerating from zero velocity
+ t1 = t / d;
+ return (c * t1 * t1 + b);
+
+ case INTERPOLATOR_TYPE_EASEOUTQUAD:
+ // quadratic (t^2) easing out - decelerating to zero velocity
+ t1 = t / d;
+ return (-c * t1 * (t1 - 2) + b);
+
+ case INTERPOLATOR_TYPE_EASEINOUTQUAD:
+ // quadratic easing in/out - acceleration until halfway, then deceleration
+ t1 = t / d / 2;
+ if( t1 < 1 )
+ return (c / 2 * t1 * t1 + b);
+ else
+ {
+ t1 = t1 - 1;
+ return (-c / 2 * (t1 * (t1 - 2) - 1) + b);
+ }
+ case INTERPOLATOR_TYPE_EASEINCUBIC:
+ // cubic easing in - accelerating from zero velocity
+ t1 = t / d;
+ return (c * t1 * t1 * t1 + b);
+
+ case INTERPOLATOR_TYPE_EASEOUTCUBIC:
+ // cubic easing in - accelerating from zero velocity
+ t1 = t / d - 1;
+ return (c * (t1 * t1 * t1 + 1) + b);
+
+ case INTERPOLATOR_TYPE_EASEINOUTCUBIC:
+ // cubic easing in - accelerating from zero velocity
+ t1 = t / d / 2;
+
+ if( t1 < 1 )
+ return (c / 2 * t1 * t1 * t1 + b);
+ else
+ {
+ t1 -= 2;
+ return (c / 2 * (t1 * t1 * t1 + 2) + b);
+ }
+ case INTERPOLATOR_TYPE_EASEINQUART:
+ // quartic easing in - accelerating from zero velocity
+ t1 = t / d;
+ return (c * t1 * t1 * t1 * t1 + b);
+
+ case INTERPOLATOR_TYPE_EASEINEXPO:
+ // exponential (2^t) easing in - accelerating from zero velocity
+ if( t == 0 )
+ return b;
+ else
+ return (c * powf( 2, (10 * (t / d - 1)) ) + b);
+
+ case INTERPOLATOR_TYPE_EASEOUTEXPO:
+ // exponential (2^t) easing out - decelerating to zero velocity
+ if( t == d )
+ return (b + c);
+ else
+ return (c * (-powf( 2, -10 * t / d ) + 1) + b);
+ default:
+ return 0;
+ }
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/helper/interpolator.h b/ndk/sources/android/ndk_helper/interpolator.h
similarity index 61%
rename from ndk/sources/android/helper/interpolator.h
rename to ndk/sources/android/ndk_helper/interpolator.h
index 66e887b..1226e33 100644
--- a/ndk/sources/android/helper/interpolator.h
+++ b/ndk/sources/android/ndk_helper/interpolator.h
@@ -24,6 +24,9 @@
#include "perfMonitor.h"
#include <list>
+namespace ndk_helper
+{
+
enum INTERPOLATOR_TYPE
{
INTERPOLATOR_TYPE_LINEAR,
@@ -38,41 +41,49 @@
INTERPOLATOR_TYPE_EASEOUTEXPO,
};
-struct interpolatorParam {
- float fDestValue;
- INTERPOLATOR_TYPE type;
- double dDuration;
+struct InterpolatorParams
+{
+ float dest_value_;
+ INTERPOLATOR_TYPE type_;
+ double duration_;
};
/******************************************************************
* Interpolates values with several interpolation methods
*/
-class interpolator {
+class Interpolator
+{
private:
- double _dStartTime;
- double _dDestTime;
- INTERPOLATOR_TYPE _type;
+ double start_time_;
+ double dest_time_;
+ INTERPOLATOR_TYPE type_;
- float _fStartValue;
- float _fDestValue;
- std::list< interpolatorParam > m_listParams;
+ float start_value_;
+ float dest_value_;
+ std::list<InterpolatorParams> list_params_;
- float getFormula(INTERPOLATOR_TYPE type, float t, float b, float d, float c);
+ float GetFormula( const INTERPOLATOR_TYPE type,
+ const float t,
+ const float b,
+ const float d,
+ const float c );
public:
- interpolator();
- ~interpolator();
+ Interpolator();
+ ~Interpolator();
- interpolator& set(const float start,
+ Interpolator& Set( const float start,
const float dest,
- INTERPOLATOR_TYPE type, double duration);
+ const INTERPOLATOR_TYPE type,
+ double duration );
- interpolator& add(const float dest,
- INTERPOLATOR_TYPE type, double duration);
+ Interpolator& Add( const float dest,
+ const INTERPOLATOR_TYPE type,
+ const double duration );
- bool update( const double currentTime, float& p );
+ bool Update( const double currentTime, float& p );
- void clear();
+ void Clear();
};
-
+} //namespace ndkHelper
#endif /* INTERPOLATOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/perfMonitor.cpp b/ndk/sources/android/ndk_helper/perfMonitor.cpp
new file mode 100644
index 0000000..dad0e68
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/perfMonitor.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "perfMonitor.h"
+
+namespace ndk_helper
+{
+
+PerfMonitor::PerfMonitor() :
+ last_tick_( 0.f ),
+ tv_last_sec_( 0 ),
+ tickindex_( 0 ),
+ ticksum_( 0 )
+{
+ for( int32_t i = 0; i < NUM_SAMPLES; ++i )
+ ticklist_[i] = 0;
+}
+
+PerfMonitor::~PerfMonitor()
+{
+}
+
+double PerfMonitor::UpdateTick( double currentTick )
+{
+ ticksum_ -= ticklist_[tickindex_];
+ ticksum_ += currentTick;
+ ticklist_[tickindex_] = currentTick;
+ tickindex_ = (tickindex_ + 1) % NUM_SAMPLES;
+
+ return ((double) ticksum_ / NUM_SAMPLES);
+}
+
+bool PerfMonitor::Update( float &fFPS )
+{
+ struct timeval Time;
+ gettimeofday( &Time, NULL );
+
+ double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
+ double tick = time - last_tick_;
+ double d = UpdateTick( tick );
+ last_tick_ = time;
+
+ if( Time.tv_sec - tv_last_sec_ >= 1 )
+ {
+ double time = Time.tv_sec + Time.tv_usec * 1.0 / 1000000.0;
+ current_FPS_ = 1.f / d;
+ tv_last_sec_ = Time.tv_sec;
+ fFPS = current_FPS_;
+ return true;
+ }
+ else
+ {
+ fFPS = current_FPS_;
+ return false;
+ }
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/helper/perfMonitor.h b/ndk/sources/android/ndk_helper/perfMonitor.h
similarity index 65%
rename from ndk/sources/android/helper/perfMonitor.h
rename to ndk/sources/android/ndk_helper/perfMonitor.h
index c57f45b..f418c43 100644
--- a/ndk/sources/android/helper/perfMonitor.h
+++ b/ndk/sources/android/ndk_helper/perfMonitor.h
@@ -22,35 +22,40 @@
#include <time.h>
#include "JNIHelper.h"
+namespace ndk_helper
+{
+
const int32_t NUM_SAMPLES = 100;
/******************************************************************
* Helper class for a performance monitoring and get current tick time
*/
-class perfMonitor {
+class PerfMonitor
+{
private:
- float _fCurrentFPS;
- time_t _tvLastSec;
+ float current_FPS_;
+ time_t tv_last_sec_;
- double _dLastTick;
- int32_t _tickindex;
- double _ticksum;
- double _ticklist[ NUM_SAMPLES ];
+ double last_tick_;
+ int32_t tickindex_;
+ double ticksum_;
+ double ticklist_[NUM_SAMPLES];
- double updateTick(double currentTick);
+ double UpdateTick( double current_tick );
public:
- perfMonitor();
- virtual ~perfMonitor();
+ PerfMonitor();
+ virtual ~PerfMonitor();
- bool update(float &fFPS);
+ bool Update( float &fFPS );
- static double getCurrentTime()
+ static double GetCurrentTime()
{
- struct timeval Time;
- gettimeofday( &Time, NULL );
- double dTime = Time.tv_sec + Time.tv_usec * 1.0/1000000.0;
- return dTime;
+ struct timeval time;
+ gettimeofday( &time, NULL );
+ double ret = time.tv_sec + time.tv_usec * 1.0 / 1000000.0;
+ return ret;
}
};
+} //namespace ndkHelper
#endif /* PERFMONITOR_H_ */
diff --git a/ndk/sources/android/ndk_helper/shader.cpp b/ndk/sources/android/ndk_helper/shader.cpp
new file mode 100644
index 0000000..74b3887
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/shader.cpp
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <EGL/egl.h>
+#include <GLES2/gl2.h>
+
+#include "shader.h"
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+#define DEBUG (1)
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ const char *str_file_name,
+ const std::map<std::string, std::string>& map_parameters )
+{
+ std::vector<uint8_t> data;
+ if( !JNIHelper::GetInstance()->ReadFile( str_file_name, &data ) )
+ {
+ LOGI( "Can not open a file:%s", str_file_name );
+ return false;
+ }
+
+ const char REPLACEMENT_TAG = '*';
+ //Fill-in parameters
+ std::string str( data.begin(), data.end() );
+ std::string str_replacement_map( data.size(), ' ' );
+
+ std::map<std::string, std::string>::const_iterator it = map_parameters.begin();
+ std::map<std::string, std::string>::const_iterator itEnd = map_parameters.end();
+ while( it != itEnd )
+ {
+ size_t pos = 0;
+ while( (pos = str.find( it->first, pos )) != std::string::npos )
+ {
+ //Check if the sub string is already touched
+
+ size_t replaced_pos = str_replacement_map.find( REPLACEMENT_TAG, pos );
+ if( replaced_pos == std::string::npos || replaced_pos > pos )
+ {
+
+ str.replace( pos, it->first.length(), it->second );
+ str_replacement_map.replace( pos, it->first.length(), it->first.length(),
+ REPLACEMENT_TAG );
+ pos += it->second.length();
+ }
+ else
+ {
+ //The replacement target has been touched by other tag, skipping them
+ pos += it->second.length();
+ }
+ }
+ it++;
+ }
+
+ LOGI( "Patched Shdader:\n%s", str.c_str() );
+
+ std::vector<uint8_t> v( str.begin(), str.end() );
+ str.clear();
+ return shader::CompileShader( shader, type, v );
+}
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ const GLchar *source,
+ const int32_t iSize )
+{
+ if( source == NULL || iSize <= 0 )
+ return false;
+
+ *shader = glCreateShader( type );
+ glShaderSource( *shader, 1, &source, &iSize ); //Not specifying 3rd parameter (size) could be troublesome..
+
+ glCompileShader( *shader );
+
+#if defined(DEBUG)
+ GLint logLength;
+ glGetShaderiv( *shader, GL_INFO_LOG_LENGTH, &logLength );
+ if( logLength > 0 )
+ {
+ GLchar *log = (GLchar *) malloc( logLength );
+ glGetShaderInfoLog( *shader, logLength, &logLength, log );
+ LOGI( "Shader compile log:\n%s", log );
+ free( log );
+ }
+#endif
+
+ GLint status;
+ glGetShaderiv( *shader, GL_COMPILE_STATUS, &status );
+ if( status == 0 )
+ {
+ glDeleteShader( *shader );
+ return false;
+ }
+
+ return true;
+}
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ std::vector<uint8_t>& data )
+{
+ if( !data.size() )
+ return false;
+
+ const GLchar *source = (GLchar *) &data[0];
+ int32_t iSize = data.size();
+ return shader::CompileShader( shader, type, source, iSize );
+}
+
+bool shader::CompileShader( GLuint *shader,
+ const GLenum type,
+ const char *strFileName )
+{
+ std::vector<uint8_t> data;
+ bool b = JNIHelper::GetInstance()->ReadFile( strFileName, &data );
+ if( !b )
+ {
+ LOGI( "Can not open a file:%s", strFileName );
+ return false;
+ }
+
+ return shader::CompileShader( shader, type, data );
+}
+
+bool shader::LinkProgram( const GLuint prog )
+{
+ GLint status;
+
+ glLinkProgram( prog );
+
+#if defined(DEBUG)
+ GLint logLength;
+ glGetProgramiv( prog, GL_INFO_LOG_LENGTH, &logLength );
+ if( logLength > 0 )
+ {
+ GLchar *log = (GLchar *) malloc( logLength );
+ glGetProgramInfoLog( prog, logLength, &logLength, log );
+ LOGI( "Program link log:\n%s", log );
+ free( log );
+ }
+#endif
+
+ glGetProgramiv( prog, GL_LINK_STATUS, &status );
+ if( status == 0 )
+ {
+ LOGI( "Program link failed\n" );
+ return false;
+ }
+
+ return true;
+}
+
+bool shader::ValidateProgram( const GLuint prog )
+{
+ GLint logLength, status;
+
+ glValidateProgram( prog );
+ glGetProgramiv( prog, GL_INFO_LOG_LENGTH, &logLength );
+ if( logLength > 0 )
+ {
+ GLchar *log = (GLchar *) malloc( logLength );
+ glGetProgramInfoLog( prog, logLength, &logLength, log );
+ LOGI( "Program validate log:\n%s", log );
+ free( log );
+ }
+
+ glGetProgramiv( prog, GL_VALIDATE_STATUS, &status );
+ if( status == 0 )
+ return false;
+
+ return true;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/shader.h b/ndk/sources/android/ndk_helper/shader.h
new file mode 100644
index 0000000..d362a53
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/shader.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef SHADER_H_
+#define SHADER_H_
+
+#include <jni.h>
+
+#include <vector>
+#include <map>
+#include <string>
+
+#include <EGL/egl.h>
+#include <GLES/gl.h>
+
+#include <android/log.h>
+
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+namespace shader
+{
+
+/******************************************************************
+ * Shader compiler helper
+ * namespace: ndkHelper::shader
+ *
+ */
+
+/******************************************************************
+ * CompileShader() with vector
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: data, source vector
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader, const GLenum type, std::vector<uint8_t>& data );
+
+/******************************************************************
+ * CompileShader() with buffer
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: source, source buffer
+ * in: iSize, buffer size
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader,
+ const GLenum type,
+ const GLchar *source,
+ const int32_t iSize );
+
+/******************************************************************
+ * CompileShader() with filename
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: strFilename, filename
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader, const GLenum type, const char *strFileName );
+
+/******************************************************************
+ * CompileShader() with std::map helps patching on a shader on the fly.
+ *
+ * arguments:
+ * out: shader, shader variable
+ * in: type, shader type (i.e. GL_VERTEX_SHADER/GL_FRAGMENT_SHADER)
+ * in: mapParameters
+ * For a example,
+ * map : %KEY% -> %VALUE% replaces all %KEY% entries in the given shader code to %VALUE"
+ * return: true if a shader compilation succeeded, false if it failed
+ *
+ */
+bool CompileShader( GLuint *shader,
+ const GLenum type,
+ const char *str_file_name,
+ const std::map<std::string, std::string>& map_parameters );
+
+/******************************************************************
+ * LinkProgram()
+ *
+ * arguments:
+ * in: program, program
+ * return: true if a shader linkage succeeded, false if it failed
+ *
+ */
+bool LinkProgram( const GLuint prog );
+
+/******************************************************************
+ * validateProgram()
+ *
+ * arguments:
+ * in: program, program
+ * return: true if a shader validation succeeded, false if it failed
+ *
+ */
+bool ValidateProgram( const GLuint prog );
+} //namespace shader
+
+} //namespace ndkHelper
+#endif /* SHADER_H_ */
diff --git a/ndk/sources/android/ndk_helper/tapCamera.cpp b/ndk/sources/android/ndk_helper/tapCamera.cpp
new file mode 100644
index 0000000..5a4ff8b
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/tapCamera.cpp
@@ -0,0 +1,320 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//----------------------------------------------------------
+// tapCamera.cpp
+// Camera control with tap
+//
+//----------------------------------------------------------
+#include <fstream>
+#include "tapCamera.h"
+
+namespace ndk_helper
+{
+
+const float TRANSFORM_FACTOR = 15.f;
+const float TRANSFORM_FACTORZ = 10.f;
+
+const float MOMENTUM_FACTOR_DECREASE = 0.85f;
+const float MOMENTUM_FACTOR_DECREASE_SHIFT = 0.9f;
+const float MOMENTUM_FACTOR = 0.8f;
+const float MOMENTUM_FACTOR_THRESHOLD = 0.001f;
+
+//----------------------------------------------------------
+// Ctor
+//----------------------------------------------------------
+TapCamera::TapCamera() :
+ dragging_( false ),
+ pinching_( false ),
+ momentum_( false ),
+ ball_radius_( 0.75f ),
+ pinch_start_distance_SQ_( 0.f ),
+ camera_rotation_( 0.f ),
+ camera_rotation_start_( 0.f ),
+ camera_rotation_now_( 0.f ),
+ momemtum_steps_( 0.f ),
+ flip_z_( 0.f )
+{
+ //Init offset
+ InitParameters();
+
+ vec_flip_ = Vec2( 1.f, -1.f );
+ flip_z_ = -1.f;
+ vec_pinch_transform_factor_ = Vec3( 1.f, 1.f, 1.f );
+
+ vec_ball_center_ = Vec2( 0, 0 );
+ vec_ball_now_ = Vec2( 0, 0 );
+ vec_ball_down_ = Vec2( 0, 0 );
+
+ vec_pinch_start_ = Vec2( 0, 0 );
+ vec_pinch_start_center_ = Vec2( 0, 0 );
+
+ vec_flip_ = Vec2( 0, 0 );
+
+}
+
+void TapCamera::InitParameters()
+{
+ //Init parameters
+ vec_offset_ = Vec3();
+ vec_offset_now_ = Vec3();
+
+ quat_ball_rot_ = Quaternion();
+ quat_ball_now_ = Quaternion();
+ quat_ball_now_.ToMatrix( mat_rotation_ );
+ camera_rotation_ = 0.f;
+
+ vec_drag_delta_ = Vec2();
+ vec_offset_delta_ = Vec3();
+
+ momentum_ = false;
+}
+
+//----------------------------------------------------------
+// Dtor
+//----------------------------------------------------------
+TapCamera::~TapCamera()
+{
+
+}
+
+void TapCamera::Update()
+{
+ if( momentum_ )
+ {
+ float momenttum_steps = momemtum_steps_;
+
+ //Momentum rotation
+ Vec2 v = vec_drag_delta_;
+ BeginDrag( Vec2() ); //NOTE:This call reset _VDragDelta
+ Drag( v * vec_flip_ );
+
+ //Momentum shift
+ vec_offset_ += vec_offset_delta_;
+
+ BallUpdate();
+ EndDrag();
+
+ //Decrease deltas
+ vec_drag_delta_ = v * MOMENTUM_FACTOR_DECREASE;
+ vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR_DECREASE_SHIFT;
+
+ //Count steps
+ momemtum_steps_ = momenttum_steps * MOMENTUM_FACTOR_DECREASE;
+ if( momemtum_steps_ < MOMENTUM_FACTOR_THRESHOLD )
+ {
+ momentum_ = false;
+ }
+ }
+ else
+ {
+ vec_drag_delta_ *= MOMENTUM_FACTOR;
+ vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR;
+ BallUpdate();
+ }
+
+ Vec3 vec = vec_offset_ + vec_offset_now_;
+ Vec3 vec_tmp( TRANSFORM_FACTOR, -TRANSFORM_FACTOR, TRANSFORM_FACTORZ );
+
+ vec *= vec_tmp * vec_pinch_transform_factor_;
+
+ mat_transform_ = Mat4::Translation( vec );
+}
+
+Mat4& TapCamera::GetRotationMatrix()
+{
+ return mat_rotation_;
+}
+
+Mat4& TapCamera::GetTransformMatrix()
+{
+ return mat_transform_;
+}
+
+void TapCamera::Reset( const bool bAnimate )
+{
+ InitParameters();
+ Update();
+
+}
+
+//----------------------------------------------------------
+//Drag control
+//----------------------------------------------------------
+void TapCamera::BeginDrag( const Vec2& v )
+{
+ if( dragging_ )
+ EndDrag();
+
+ if( pinching_ )
+ EndPinch();
+
+ Vec2 vec = v * vec_flip_;
+ vec_ball_now_ = vec;
+ vec_ball_down_ = vec_ball_now_;
+
+ dragging_ = true;
+ momentum_ = false;
+ vec_last_input_ = vec;
+ vec_drag_delta_ = Vec2();
+}
+
+void TapCamera::EndDrag()
+{
+ quat_ball_down_ = quat_ball_now_;
+ quat_ball_rot_ = Quaternion();
+
+ dragging_ = false;
+ momentum_ = true;
+ momemtum_steps_ = 1.0f;
+}
+
+void TapCamera::Drag( const Vec2& v )
+{
+ if( !dragging_ )
+ return;
+
+ Vec2 vec = v * vec_flip_;
+ vec_ball_now_ = vec;
+
+ vec_drag_delta_ = vec_drag_delta_ * MOMENTUM_FACTOR + (vec - vec_last_input_);
+ vec_last_input_ = vec;
+}
+
+//----------------------------------------------------------
+//Pinch controll
+//----------------------------------------------------------
+void TapCamera::BeginPinch( const Vec2& v1, const Vec2& v2 )
+{
+ if( dragging_ )
+ EndDrag();
+
+ if( pinching_ )
+ EndPinch();
+
+ BeginDrag( Vec2() );
+
+ vec_pinch_start_center_ = (v1 + v2) / 2.f;
+
+ Vec2 vec = v1 - v2;
+ float x_diff;
+ float y_diff;
+ vec.Value( x_diff, y_diff );
+
+ pinch_start_distance_SQ_ = x_diff * x_diff + y_diff * y_diff;
+ camera_rotation_start_ = atan2f( y_diff, x_diff );
+ camera_rotation_now_ = 0;
+
+ pinching_ = true;
+ momentum_ = false;
+
+ //Init momentum factors
+ vec_offset_delta_ = Vec3();
+}
+
+void TapCamera::EndPinch()
+{
+ pinching_ = false;
+ momentum_ = true;
+ momemtum_steps_ = 1.f;
+ vec_offset_ += vec_offset_now_;
+ camera_rotation_ += camera_rotation_now_;
+ vec_offset_now_ = Vec3();
+
+ camera_rotation_now_ = 0;
+
+ EndDrag();
+}
+
+void TapCamera::Pinch( const Vec2& v1, const Vec2& v2 )
+{
+ if( !pinching_ )
+ return;
+
+ //Update momentum factor
+ vec_offset_last_ = vec_offset_now_;
+
+ float x_diff, y_diff;
+ Vec2 vec = v1 - v2;
+ vec.Value( x_diff, y_diff );
+
+ float fDistanceSQ = x_diff * x_diff + y_diff * y_diff;
+
+ float f = pinch_start_distance_SQ_ / fDistanceSQ;
+ if( f < 1.f )
+ f = -1.f / f + 1.0f;
+ else
+ f = f - 1.f;
+ if( isnan( f ) )
+ f = 0.f;
+
+ vec = (v1 + v2) / 2.f - vec_pinch_start_center_;
+ vec_offset_now_ = Vec3( vec, flip_z_ * f );
+
+ //Update momentum factor
+ vec_offset_delta_ = vec_offset_delta_ * MOMENTUM_FACTOR
+ + (vec_offset_now_ - vec_offset_last_);
+
+ //
+ //Update ration quaternion
+ float fRotation = atan2f( y_diff, x_diff );
+ camera_rotation_now_ = fRotation - camera_rotation_start_;
+
+ //Trackball rotation
+ quat_ball_rot_ = Quaternion( 0.f, 0.f, sinf( -camera_rotation_now_ * 0.5f ),
+ cosf( -camera_rotation_now_ * 0.5f ) );
+}
+
+//----------------------------------------------------------
+//Trackball controll
+//----------------------------------------------------------
+void TapCamera::BallUpdate()
+{
+ if( dragging_ )
+ {
+ Vec3 vec_from = PointOnSphere( vec_ball_down_ );
+ Vec3 vec_to = PointOnSphere( vec_ball_now_ );
+
+ Vec3 vec = vec_from.Cross( vec_to );
+ float w = vec_from.Dot( vec_to );
+
+ Quaternion qDrag = Quaternion( vec, w );
+ qDrag = qDrag * quat_ball_down_;
+ quat_ball_now_ = quat_ball_rot_ * qDrag;
+ }
+ quat_ball_now_.ToMatrix( mat_rotation_ );
+}
+
+Vec3 TapCamera::PointOnSphere( Vec2& point )
+{
+ Vec3 ball_mouse;
+ float mag;
+ Vec2 vec = (point - vec_ball_center_) / ball_radius_;
+ mag = vec.Dot( vec );
+ if( mag > 1.f )
+ {
+ float scale = 1.f / sqrtf( mag );
+ vec *= scale;
+ ball_mouse = Vec3( vec, 0.f );
+ }
+ else
+ {
+ ball_mouse = Vec3( vec, sqrtf( 1.f - mag ) );
+ }
+ return ball_mouse;
+}
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/tapCamera.h b/ndk/sources/android/ndk_helper/tapCamera.h
new file mode 100644
index 0000000..7d124e8
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/tapCamera.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+#include <vector>
+#include <string>
+#include <GLES2/gl2.h>
+
+#include "JNIHelper.h"
+#include "vecmath.h"
+#include "interpolator.h"
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Camera control helper class with a tap gesture
+ * This class is mainly used for 3D space camera control in samples.
+ *
+ */
+class TapCamera
+{
+private:
+ //Trackball
+ Vec2 vec_ball_center_;
+ float ball_radius_;
+ Quaternion quat_ball_now_;
+ Quaternion quat_ball_down_;
+ Vec2 vec_ball_now_;
+ Vec2 vec_ball_down_;
+ Quaternion quat_ball_rot_;
+
+ bool dragging_;
+ bool pinching_;
+
+ //Pinch related info
+ Vec2 vec_pinch_start_;
+ Vec2 vec_pinch_start_center_;
+ float pinch_start_distance_SQ_;
+
+ //Camera shift
+ Vec3 vec_offset_;
+ Vec3 vec_offset_now_;
+
+ //Camera Rotation
+ float camera_rotation_;
+ float camera_rotation_start_;
+ float camera_rotation_now_;
+
+ //Momentum support
+ bool momentum_;
+ Vec2 vec_drag_delta_;
+ Vec2 vec_last_input_;
+ Vec3 vec_offset_last_;
+ Vec3 vec_offset_delta_;
+ float momemtum_steps_;
+
+ Vec2 vec_flip_;
+ float flip_z_;
+
+ Mat4 mat_rotation_;
+ Mat4 mat_transform_;
+
+ Vec3 vec_pinch_transform_factor_;
+
+ Vec3 PointOnSphere( Vec2& point );
+ void BallUpdate();
+ void InitParameters();
+public:
+ TapCamera();
+ virtual ~TapCamera();
+ void BeginDrag( const Vec2& vec );
+ void EndDrag();
+ void Drag( const Vec2& vec );
+ void Update();
+
+ Mat4& GetRotationMatrix();
+ Mat4& GetTransformMatrix();
+
+ void BeginPinch( const Vec2& v1, const Vec2& v2 );
+ void EndPinch();
+ void Pinch( const Vec2& v1, const Vec2& v2 );
+
+ void SetFlip( const float x, const float y, const float z )
+ {
+ vec_flip_ = Vec2( x, y );
+ flip_z_ = z;
+ }
+
+ void SetPinchTransformFactor( const float x, const float y, const float z )
+ {
+ vec_pinch_transform_factor_ = Vec3( x, y, z );
+ }
+
+ void Reset( const bool bAnimate );
+
+};
+
+} //namespace ndkHelper
diff --git a/ndk/sources/android/ndk_helper/vecmath.cpp b/ndk/sources/android/ndk_helper/vecmath.cpp
new file mode 100644
index 0000000..f4ae5f3
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/vecmath.cpp
@@ -0,0 +1,379 @@
+/*
+ * Copy_right 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * y_ou may_ not use this file ex_cept in compliance with the License.
+ * You may_ obtain a copy_ of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by_ applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either ex_press or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//--------------------------------------------------------------------------------
+// vecmath.cpp
+//--------------------------------------------------------------------------------
+#include "vecmath.h"
+
+namespace ndk_helper
+{
+
+//--------------------------------------------------------------------------------
+// vec3
+//--------------------------------------------------------------------------------
+Vec3::Vec3( const Vec4& vec )
+{
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+}
+
+//--------------------------------------------------------------------------------
+// vec4
+//--------------------------------------------------------------------------------
+Vec4 Vec4::operator*( const Mat4& rhs ) const
+{
+ Vec4 out;
+ out.x_ = x_ * rhs.f_[0] + y_ * rhs.f_[1] + z_ * rhs.f_[2] + w_ * rhs.f_[3];
+ out.y_ = x_ * rhs.f_[4] + y_ * rhs.f_[5] + z_ * rhs.f_[6] + w_ * rhs.f_[7];
+ out.z_ = x_ * rhs.f_[8] + y_ * rhs.f_[9] + z_ * rhs.f_[10] + w_ * rhs.f_[11];
+ out.w_ = x_ * rhs.f_[12] + y_ * rhs.f_[13] + z_ * rhs.f_[14] + w_ * rhs.f_[15];
+ return out;
+}
+
+//--------------------------------------------------------------------------------
+// mat4
+//--------------------------------------------------------------------------------
+Mat4::Mat4()
+{
+ for( int32_t i = 0; i < 16; ++i )
+ f_[i] = 0.f;
+}
+
+Mat4::Mat4( const float* mIn )
+{
+ for( int32_t i = 0; i < 16; ++i )
+ f_[i] = mIn[i];
+}
+
+Mat4 Mat4::operator*( const Mat4& rhs ) const
+{
+ Mat4 ret;
+ ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2]
+ + f_[12] * rhs.f_[3];
+ ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2]
+ + f_[13] * rhs.f_[3];
+ ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2]
+ + f_[14] * rhs.f_[3];
+ ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2]
+ + f_[15] * rhs.f_[3];
+
+ ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6]
+ + f_[12] * rhs.f_[7];
+ ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6]
+ + f_[13] * rhs.f_[7];
+ ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6]
+ + f_[14] * rhs.f_[7];
+ ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6]
+ + f_[15] * rhs.f_[7];
+
+ ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10]
+ + f_[12] * rhs.f_[11];
+ ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10]
+ + f_[13] * rhs.f_[11];
+ ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10]
+ + f_[14] * rhs.f_[11];
+ ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10]
+ + f_[15] * rhs.f_[11];
+
+ ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14]
+ + f_[12] * rhs.f_[15];
+ ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14]
+ + f_[13] * rhs.f_[15];
+ ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14]
+ + f_[14] * rhs.f_[15];
+ ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14]
+ + f_[15] * rhs.f_[15];
+
+ return ret;
+}
+
+Vec4 Mat4::operator*( const Vec4& rhs ) const
+{
+ Vec4 ret;
+ ret.x_ = rhs.x_ * f_[0] + rhs.y_ * f_[4] + rhs.z_ * f_[8] + rhs.w_ * f_[12];
+ ret.y_ = rhs.x_ * f_[1] + rhs.y_ * f_[5] + rhs.z_ * f_[9] + rhs.w_ * f_[13];
+ ret.z_ = rhs.x_ * f_[2] + rhs.y_ * f_[6] + rhs.z_ * f_[10] + rhs.w_ * f_[14];
+ ret.w_ = rhs.x_ * f_[3] + rhs.y_ * f_[7] + rhs.z_ * f_[11] + rhs.w_ * f_[15];
+ return ret;
+}
+
+Mat4 Mat4::Inverse()
+{
+ Mat4 ret;
+ float det_1;
+ float pos = 0;
+ float neg = 0;
+ float temp;
+
+ temp = f_[0] * f_[5] * f_[10];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = f_[4] * f_[9] * f_[2];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = f_[8] * f_[1] * f_[6];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = -f_[8] * f_[5] * f_[2];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = -f_[4] * f_[1] * f_[10];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ temp = -f_[0] * f_[9] * f_[6];
+ if( temp >= 0 )
+ pos += temp;
+ else
+ neg += temp;
+ det_1 = pos + neg;
+
+ if( det_1 == 0.0 )
+ {
+ //Error
+ }
+ else
+ {
+ det_1 = 1.0f / det_1;
+ ret.f_[0] = (f_[5] * f_[10] - f_[9] * f_[6]) * det_1;
+ ret.f_[1] = -(f_[1] * f_[10] - f_[9] * f_[2]) * det_1;
+ ret.f_[2] = (f_[1] * f_[6] - f_[5] * f_[2]) * det_1;
+ ret.f_[4] = -(f_[4] * f_[10] - f_[8] * f_[6]) * det_1;
+ ret.f_[5] = (f_[0] * f_[10] - f_[8] * f_[2]) * det_1;
+ ret.f_[6] = -(f_[0] * f_[6] - f_[4] * f_[2]) * det_1;
+ ret.f_[8] = (f_[4] * f_[9] - f_[8] * f_[5]) * det_1;
+ ret.f_[9] = -(f_[0] * f_[9] - f_[8] * f_[1]) * det_1;
+ ret.f_[10] = (f_[0] * f_[5] - f_[4] * f_[1]) * det_1;
+
+ /* Calculate -C * inverse(A) */
+ ret.f_[12] = -(f_[12] * ret.f_[0] + f_[13] * ret.f_[4] + f_[14] * ret.f_[8]);
+ ret.f_[13] = -(f_[12] * ret.f_[1] + f_[13] * ret.f_[5] + f_[14] * ret.f_[9]);
+ ret.f_[14] = -(f_[12] * ret.f_[2] + f_[13] * ret.f_[6] + f_[14] * ret.f_[10]);
+
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ }
+
+ *this = ret;
+ return *this;
+}
+
+//--------------------------------------------------------------------------------
+// Misc
+//--------------------------------------------------------------------------------
+Mat4 Mat4::RotationX( const float fAngle )
+{
+ Mat4 ret;
+ float fCosine, fSine;
+
+ fCosine = cosf( fAngle );
+ fSine = sinf( fAngle );
+
+ ret.f_[0] = 1.0f;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = 0.0f;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = fCosine;
+ ret.f_[9] = fSine;
+ ret.f_[13] = 0.0f;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = -fSine;
+ ret.f_[10] = fCosine;
+ ret.f_[14] = 0.0f;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::RotationY( const float fAngle )
+{
+ Mat4 ret;
+ float fCosine, fSine;
+
+ fCosine = cosf( fAngle );
+ fSine = sinf( fAngle );
+
+ ret.f_[0] = fCosine;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = -fSine;
+ ret.f_[12] = 0.0f;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = 1.0f;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = 0.0f;
+ ret.f_[2] = fSine;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = fCosine;
+ ret.f_[14] = 0.0f;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+
+}
+
+Mat4 Mat4::RotationZ( const float fAngle )
+{
+ Mat4 ret;
+ float fCosine, fSine;
+
+ fCosine = cosf( fAngle );
+ fSine = sinf( fAngle );
+
+ ret.f_[0] = fCosine;
+ ret.f_[4] = fSine;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = 0.0f;
+ ret.f_[1] = -fSine;
+ ret.f_[5] = fCosine;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = 0.0f;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = 1.0f;
+ ret.f_[14] = 0.0f;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::Translation( const float fX, const float fY, const float fZ )
+{
+ Mat4 ret;
+ ret.f_[0] = 1.0f;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = fX;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = 1.0f;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = fY;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = 1.0f;
+ ret.f_[14] = fZ;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::Translation( const Vec3 vec )
+{
+ Mat4 ret;
+ ret.f_[0] = 1.0f;
+ ret.f_[4] = 0.0f;
+ ret.f_[8] = 0.0f;
+ ret.f_[12] = vec.x_;
+ ret.f_[1] = 0.0f;
+ ret.f_[5] = 1.0f;
+ ret.f_[9] = 0.0f;
+ ret.f_[13] = vec.y_;
+ ret.f_[2] = 0.0f;
+ ret.f_[6] = 0.0f;
+ ret.f_[10] = 1.0f;
+ ret.f_[14] = vec.z_;
+ ret.f_[3] = 0.0f;
+ ret.f_[7] = 0.0f;
+ ret.f_[11] = 0.0f;
+ ret.f_[15] = 1.0f;
+ return ret;
+}
+
+Mat4 Mat4::Perspective( float width, float height, float nearPlane, float farPlane )
+{
+ float n2 = 2.0f * nearPlane;
+ float rcpnmf = 1.f / (nearPlane - farPlane);
+
+ Mat4 result;
+ result.f_[0] = n2 / width;
+ result.f_[4] = 0;
+ result.f_[8] = 0;
+ result.f_[12] = 0;
+ result.f_[1] = 0;
+ result.f_[5] = n2 / height;
+ result.f_[9] = 0;
+ result.f_[13] = 0;
+ result.f_[2] = 0;
+ result.f_[6] = 0;
+ result.f_[10] = (farPlane + nearPlane) * rcpnmf;
+ result.f_[14] = farPlane * rcpnmf * n2;
+ result.f_[3] = 0;
+ result.f_[7] = 0;
+ result.f_[11] = -1.0;
+ result.f_[15] = 0;
+
+ return result;
+}
+
+Mat4 Mat4::LookAt( const Vec3& vec_eye, const Vec3& vec_at, const Vec3& vec_up )
+{
+ Vec3 vec_forward, vec_up_norm, vec_side;
+ Mat4 result;
+
+ vec_forward.x_ = vec_eye.x_ - vec_at.x_;
+ vec_forward.y_ = vec_eye.y_ - vec_at.y_;
+ vec_forward.z_ = vec_eye.z_ - vec_at.z_;
+
+ vec_forward.Normalize();
+ vec_up_norm = vec_up;
+ vec_up_norm.Normalize();
+ vec_side = vec_up_norm.Cross( vec_forward );
+ vec_up_norm = vec_forward.Cross( vec_side );
+
+ result.f_[0] = vec_side.x_;
+ result.f_[4] = vec_side.y_;
+ result.f_[8] = vec_side.z_;
+ result.f_[12] = 0;
+ result.f_[1] = vec_up_norm.x_;
+ result.f_[5] = vec_up_norm.y_;
+ result.f_[9] = vec_up_norm.z_;
+ result.f_[13] = 0;
+ result.f_[2] = vec_forward.x_;
+ result.f_[6] = vec_forward.y_;
+ result.f_[10] = vec_forward.z_;
+ result.f_[14] = 0;
+ result.f_[3] = 0;
+ result.f_[7] = 0;
+ result.f_[11] = 0;
+ result.f_[15] = 1.0;
+
+ result.PostTranslate( -vec_eye.x_, -vec_eye.y_, -vec_eye.z_ );
+ return result;
+}
+
+} //namespace ndkHelper
+
diff --git a/ndk/sources/android/ndk_helper/vecmath.h b/ndk/sources/android/ndk_helper/vecmath.h
new file mode 100644
index 0000000..0692e3d
--- /dev/null
+++ b/ndk/sources/android/ndk_helper/vecmath.h
@@ -0,0 +1,1116 @@
+/*
+ * Copyright 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef VECMATH_H_
+#define VECMATH_H_
+
+#include <math.h>
+#include "JNIHelper.h"
+
+namespace ndk_helper
+{
+
+/******************************************************************
+ * Helper class for vector math operations
+ * Currently all implementations are in pure C++.
+ * Each class is an opaque class so caller does not have a direct access
+ * to each element. This is for an ease of future optimization to use vector operations.
+ *
+ */
+
+class Vec2;
+class Vec3;
+class Vec4;
+class Mat4;
+
+/******************************************************************
+ * 2 elements vector class
+ *
+ */
+class Vec2
+{
+private:
+ float x_;
+ float y_;
+
+public:
+ friend class Vec3;
+ friend class Vec4;
+ friend class Mat4;
+ friend class Quaternion;
+
+ Vec2()
+ {
+ x_ = y_ = 0.f;
+ }
+
+ Vec2( const float fX, const float fY )
+ {
+ x_ = fX;
+ y_ = fY;
+ }
+
+ Vec2( const Vec2& vec )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ }
+
+ Vec2( const float* pVec )
+ {
+ x_ = (*pVec++);
+ y_ = (*pVec++);
+ }
+
+ //Operators
+ Vec2 operator*( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ * rhs.x_;
+ ret.y_ = y_ * rhs.y_;
+ return ret;
+ }
+
+ Vec2 operator/( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ / rhs.x_;
+ ret.y_ = y_ / rhs.y_;
+ return ret;
+ }
+
+ Vec2 operator+( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ + rhs.x_;
+ ret.y_ = y_ + rhs.y_;
+ return ret;
+ }
+
+ Vec2 operator-( const Vec2& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ - rhs.x_;
+ ret.y_ = y_ - rhs.y_;
+ return ret;
+ }
+
+ Vec2& operator+=( const Vec2& rhs )
+ {
+ x_ += rhs.x_;
+ y_ += rhs.y_;
+ return *this;
+ }
+
+ Vec2& operator-=( const Vec2& rhs )
+ {
+ x_ -= rhs.x_;
+ y_ -= rhs.y_;
+ return *this;
+ }
+
+ Vec2& operator*=( const Vec2& rhs )
+ {
+ x_ *= rhs.x_;
+ y_ *= rhs.y_;
+ return *this;
+ }
+
+ Vec2& operator/=( const Vec2& rhs )
+ {
+ x_ /= rhs.x_;
+ y_ /= rhs.y_;
+ return *this;
+ }
+
+ //External operators
+ friend Vec2 operator-( const Vec2& rhs )
+ {
+ return Vec2( rhs ) *= -1;
+ }
+
+ friend Vec2 operator*( const float lhs, const Vec2& rhs )
+ {
+ Vec2 ret;
+ ret.x_ = lhs * rhs.x_;
+ ret.y_ = lhs * rhs.y_;
+ return ret;
+ }
+
+ friend Vec2 operator/( const float lhs, const Vec2& rhs )
+ {
+ Vec2 ret;
+ ret.x_ = lhs / rhs.x_;
+ ret.y_ = lhs / rhs.y_;
+ return ret;
+ }
+
+ //Operators with float
+ Vec2 operator*( const float& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ * rhs;
+ ret.y_ = y_ * rhs;
+ return ret;
+ }
+
+ Vec2& operator*=( const float& rhs )
+ {
+ x_ = x_ * rhs;
+ y_ = y_ * rhs;
+ return *this;
+ }
+
+ Vec2 operator/( const float& rhs ) const
+ {
+ Vec2 ret;
+ ret.x_ = x_ / rhs;
+ ret.y_ = y_ / rhs;
+ return ret;
+ }
+
+ Vec2& operator/=( const float& rhs )
+ {
+ x_ = x_ / rhs;
+ y_ = y_ / rhs;
+ return *this;
+ }
+
+ //Compare
+ bool operator==( const Vec2& rhs ) const
+ {
+ if( x_ != rhs.x_ || y_ != rhs.y_ )
+ return false;
+ return true;
+ }
+
+ bool operator!=( const Vec2& rhs ) const
+ {
+ if( x_ == rhs.x_ )
+ return false;
+
+ return true;
+ }
+
+ float Length() const
+ {
+ return sqrtf( x_ * x_ + y_ * y_ );
+ }
+
+ Vec2 Normalize()
+ {
+ float len = Length();
+ x_ = x_ / len;
+ y_ = y_ / len;
+ return *this;
+ }
+
+ float Dot( const Vec2& rhs )
+ {
+ return x_ * rhs.x_ + y_ * rhs.y_;
+ }
+
+ bool Validate()
+ {
+ if( isnan( x_ ) || isnan( y_ ) )
+ return false;
+ return true;
+ }
+
+ void Value( float& fX, float& fY )
+ {
+ fX = x_;
+ fY = y_;
+ }
+
+ void Dump()
+ {
+ LOGI( "Vec2 %f %f", x_, y_ );
+ }
+};
+
+/******************************************************************
+ * 3 elements vector class
+ *
+ */
+class Vec3
+{
+private:
+ float x_, y_, z_;
+
+public:
+ friend class Vec4;
+ friend class Mat4;
+ friend class Quaternion;
+
+ Vec3()
+ {
+ x_ = y_ = z_ = 0.f;
+ }
+
+ Vec3( const float fX, const float fY, const float fZ )
+ {
+ x_ = fX;
+ y_ = fY;
+ z_ = fZ;
+ }
+
+ Vec3( const Vec3& vec )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ }
+
+ Vec3( const float* pVec )
+ {
+ x_ = (*pVec++);
+ y_ = (*pVec++);
+ z_ = *pVec;
+ }
+
+ Vec3( const Vec2& vec, float f )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = f;
+ }
+
+ Vec3( const Vec4& vec );
+
+ //Operators
+ Vec3 operator*( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ * rhs.x_;
+ ret.y_ = y_ * rhs.y_;
+ ret.z_ = z_ * rhs.z_;
+ return ret;
+ }
+
+ Vec3 operator/( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ / rhs.x_;
+ ret.y_ = y_ / rhs.y_;
+ ret.z_ = z_ / rhs.z_;
+ return ret;
+ }
+
+ Vec3 operator+( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ + rhs.x_;
+ ret.y_ = y_ + rhs.y_;
+ ret.z_ = z_ + rhs.z_;
+ return ret;
+ }
+
+ Vec3 operator-( const Vec3& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ - rhs.x_;
+ ret.y_ = y_ - rhs.y_;
+ ret.z_ = z_ - rhs.z_;
+ return ret;
+ }
+
+ Vec3& operator+=( const Vec3& rhs )
+ {
+ x_ += rhs.x_;
+ y_ += rhs.y_;
+ z_ += rhs.z_;
+ return *this;
+ }
+
+ Vec3& operator-=( const Vec3& rhs )
+ {
+ x_ -= rhs.x_;
+ y_ -= rhs.y_;
+ z_ -= rhs.z_;
+ return *this;
+ }
+
+ Vec3& operator*=( const Vec3& rhs )
+ {
+ x_ *= rhs.x_;
+ y_ *= rhs.y_;
+ z_ *= rhs.z_;
+ return *this;
+ }
+
+ Vec3& operator/=( const Vec3& rhs )
+ {
+ x_ /= rhs.x_;
+ y_ /= rhs.y_;
+ z_ /= rhs.z_;
+ return *this;
+ }
+
+ //External operators
+ friend Vec3 operator-( const Vec3& rhs )
+ {
+ return Vec3( rhs ) *= -1;
+ }
+
+ friend Vec3 operator*( const float lhs, const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = lhs * rhs.x_;
+ ret.y_ = lhs * rhs.y_;
+ ret.z_ = lhs * rhs.z_;
+ return ret;
+ }
+
+ friend Vec3 operator/( const float lhs, const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = lhs / rhs.x_;
+ ret.y_ = lhs / rhs.y_;
+ ret.z_ = lhs / rhs.z_;
+ return ret;
+ }
+
+ //Operators with float
+ Vec3 operator*( const float& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ * rhs;
+ ret.y_ = y_ * rhs;
+ ret.z_ = z_ * rhs;
+ return ret;
+ }
+
+ Vec3& operator*=( const float& rhs )
+ {
+ x_ = x_ * rhs;
+ y_ = y_ * rhs;
+ z_ = z_ * rhs;
+ return *this;
+ }
+
+ Vec3 operator/( const float& rhs ) const
+ {
+ Vec3 ret;
+ ret.x_ = x_ / rhs;
+ ret.y_ = y_ / rhs;
+ ret.z_ = z_ / rhs;
+ return ret;
+ }
+
+ Vec3& operator/=( const float& rhs )
+ {
+ x_ = x_ / rhs;
+ y_ = y_ / rhs;
+ z_ = z_ / rhs;
+ return *this;
+ }
+
+ //Compare
+ bool operator==( const Vec3& rhs ) const
+ {
+ if( x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_ )
+ return false;
+ return true;
+ }
+
+ bool operator!=( const Vec3& rhs ) const
+ {
+ if( x_ == rhs.x_ )
+ return false;
+
+ return true;
+ }
+
+ float Length() const
+ {
+ return sqrtf( x_ * x_ + y_ * y_ + z_ * z_ );
+ }
+
+ Vec3 Normalize()
+ {
+ float len = Length();
+ x_ = x_ / len;
+ y_ = y_ / len;
+ z_ = z_ / len;
+ return *this;
+ }
+
+ float Dot( const Vec3& rhs )
+ {
+ return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_;
+ }
+
+ Vec3 Cross( const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;
+ ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;
+ return ret;
+ }
+
+ bool Validate()
+ {
+ if( isnan( x_ ) || isnan( y_ ) || isnan( z_ ) )
+ return false;
+ return true;
+ }
+
+ void Value( float& fX, float& fY, float& fZ )
+ {
+ fX = x_;
+ fY = y_;
+ fZ = z_;
+ }
+
+ void Dump()
+ {
+ LOGI( "Vec3 %f %f %f", x_, y_, z_ );
+ }
+};
+
+/******************************************************************
+ * 4 elements vector class
+ *
+ */
+class Vec4
+{
+private:
+ float x_, y_, z_, w_;
+
+public:
+ friend class Vec3;
+ friend class Mat4;
+ friend class Quaternion;
+
+ Vec4()
+ {
+ x_ = y_ = z_ = w_ = 0.f;
+ }
+
+ Vec4( const float fX, const float fY, const float fZ, const float fW )
+ {
+ x_ = fX;
+ y_ = fY;
+ z_ = fZ;
+ w_ = fW;
+ }
+
+ Vec4( const Vec4& vec )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ w_ = vec.w_;
+ }
+
+ Vec4( const Vec3& vec, const float fW )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ w_ = fW;
+ }
+
+ Vec4( const float* pVec )
+ {
+ x_ = (*pVec++);
+ y_ = (*pVec++);
+ z_ = *pVec;
+ w_ = *pVec;
+ }
+
+ //Operators
+ Vec4 operator*( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ * rhs.x_;
+ ret.y_ = y_ * rhs.y_;
+ ret.z_ = z_ * rhs.z_;
+ ret.w_ = z_ * rhs.w_;
+ return ret;
+ }
+
+ Vec4 operator/( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ / rhs.x_;
+ ret.y_ = y_ / rhs.y_;
+ ret.z_ = z_ / rhs.z_;
+ ret.w_ = z_ / rhs.w_;
+ return ret;
+ }
+
+ Vec4 operator+( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ + rhs.x_;
+ ret.y_ = y_ + rhs.y_;
+ ret.z_ = z_ + rhs.z_;
+ ret.w_ = z_ + rhs.w_;
+ return ret;
+ }
+
+ Vec4 operator-( const Vec4& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ - rhs.x_;
+ ret.y_ = y_ - rhs.y_;
+ ret.z_ = z_ - rhs.z_;
+ ret.w_ = z_ - rhs.w_;
+ return ret;
+ }
+
+ Vec4& operator+=( const Vec4& rhs )
+ {
+ x_ += rhs.x_;
+ y_ += rhs.y_;
+ z_ += rhs.z_;
+ w_ += rhs.w_;
+ return *this;
+ }
+
+ Vec4& operator-=( const Vec4& rhs )
+ {
+ x_ -= rhs.x_;
+ y_ -= rhs.y_;
+ z_ -= rhs.z_;
+ w_ -= rhs.w_;
+ return *this;
+ }
+
+ Vec4& operator*=( const Vec4& rhs )
+ {
+ x_ *= rhs.x_;
+ y_ *= rhs.y_;
+ z_ *= rhs.z_;
+ w_ *= rhs.w_;
+ return *this;
+ }
+
+ Vec4& operator/=( const Vec4& rhs )
+ {
+ x_ /= rhs.x_;
+ y_ /= rhs.y_;
+ z_ /= rhs.z_;
+ w_ /= rhs.w_;
+ return *this;
+ }
+
+ //External operators
+ friend Vec4 operator-( const Vec4& rhs )
+ {
+ return Vec4( rhs ) *= -1;
+ }
+
+ friend Vec4 operator*( const float lhs, const Vec4& rhs )
+ {
+ Vec4 ret;
+ ret.x_ = lhs * rhs.x_;
+ ret.y_ = lhs * rhs.y_;
+ ret.z_ = lhs * rhs.z_;
+ ret.w_ = lhs * rhs.w_;
+ return ret;
+ }
+
+ friend Vec4 operator/( const float lhs, const Vec4& rhs )
+ {
+ Vec4 ret;
+ ret.x_ = lhs / rhs.x_;
+ ret.y_ = lhs / rhs.y_;
+ ret.z_ = lhs / rhs.z_;
+ ret.w_ = lhs / rhs.w_;
+ return ret;
+ }
+
+ //Operators with float
+ Vec4 operator*( const float& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ * rhs;
+ ret.y_ = y_ * rhs;
+ ret.z_ = z_ * rhs;
+ ret.w_ = w_ * rhs;
+ return ret;
+ }
+
+ Vec4& operator*=( const float& rhs )
+ {
+ x_ = x_ * rhs;
+ y_ = y_ * rhs;
+ z_ = z_ * rhs;
+ w_ = w_ * rhs;
+ return *this;
+ }
+
+ Vec4 operator/( const float& rhs ) const
+ {
+ Vec4 ret;
+ ret.x_ = x_ / rhs;
+ ret.y_ = y_ / rhs;
+ ret.z_ = z_ / rhs;
+ ret.w_ = w_ / rhs;
+ return ret;
+ }
+
+ Vec4& operator/=( const float& rhs )
+ {
+ x_ = x_ / rhs;
+ y_ = y_ / rhs;
+ z_ = z_ / rhs;
+ w_ = w_ / rhs;
+ return *this;
+ }
+
+ //Compare
+ bool operator==( const Vec4& rhs ) const
+ {
+ if( x_ != rhs.x_ || y_ != rhs.y_ || z_ != rhs.z_ || w_ != rhs.w_ )
+ return false;
+ return true;
+ }
+
+ bool operator!=( const Vec4& rhs ) const
+ {
+ if( x_ == rhs.x_ )
+ return false;
+
+ return true;
+ }
+
+ Vec4 operator*( const Mat4& rhs ) const;
+
+ float Length() const
+ {
+ return sqrtf( x_ * x_ + y_ * y_ + z_ * z_ + w_ * w_ );
+ }
+
+ Vec4 Normalize()
+ {
+ float len = Length();
+ x_ = x_ / len;
+ y_ = y_ / len;
+ z_ = z_ / len;
+ w_ = w_ / len;
+ return *this;
+ }
+
+ float Dot( const Vec3& rhs )
+ {
+ return x_ * rhs.x_ + y_ * rhs.y_ + z_ * rhs.z_;
+ }
+
+ Vec3 Cross( const Vec3& rhs )
+ {
+ Vec3 ret;
+ ret.x_ = y_ * rhs.z_ - z_ * rhs.y_;
+ ret.y_ = z_ * rhs.x_ - x_ * rhs.z_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_;
+ return ret;
+ }
+
+ bool Validate()
+ {
+ if( isnan( x_ ) || isnan( y_ ) || isnan( z_ ) || isnan( w_ ) )
+ return false;
+ return true;
+ }
+
+ void Value( float& fX, float& fY, float& fZ, float& fW )
+ {
+ fX = x_;
+ fY = y_;
+ fZ = z_;
+ fW = w_;
+ }
+};
+
+/******************************************************************
+ * 4x4 matrix
+ *
+ */
+class Mat4
+{
+private:
+ float f_[16];
+
+public:
+ friend class Vec3;
+ friend class Vec4;
+ friend class Quaternion;
+
+ Mat4();
+ Mat4( const float* );
+
+ Mat4 operator*( const Mat4& rhs ) const;
+ Vec4 operator*( const Vec4& rhs ) const;
+
+ Mat4 operator+( const Mat4& rhs ) const
+ {
+ Mat4 ret;
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ ret.f_[i] = f_[i] + rhs.f_[i];
+ }
+ return ret;
+ }
+
+ Mat4 operator-( const Mat4& rhs ) const
+ {
+ Mat4 ret;
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ ret.f_[i] = f_[i] - rhs.f_[i];
+ }
+ return ret;
+ }
+
+ Mat4& operator+=( const Mat4& rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] += rhs.f_[i];
+ }
+ return *this;
+ }
+
+ Mat4& operator-=( const Mat4& rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] -= rhs.f_[i];
+ }
+ return *this;
+ }
+
+ Mat4& operator*=( const Mat4& rhs )
+ {
+ Mat4 ret;
+ ret.f_[0] = f_[0] * rhs.f_[0] + f_[4] * rhs.f_[1] + f_[8] * rhs.f_[2]
+ + f_[12] * rhs.f_[3];
+ ret.f_[1] = f_[1] * rhs.f_[0] + f_[5] * rhs.f_[1] + f_[9] * rhs.f_[2]
+ + f_[13] * rhs.f_[3];
+ ret.f_[2] = f_[2] * rhs.f_[0] + f_[6] * rhs.f_[1] + f_[10] * rhs.f_[2]
+ + f_[14] * rhs.f_[3];
+ ret.f_[3] = f_[3] * rhs.f_[0] + f_[7] * rhs.f_[1] + f_[11] * rhs.f_[2]
+ + f_[15] * rhs.f_[3];
+
+ ret.f_[4] = f_[0] * rhs.f_[4] + f_[4] * rhs.f_[5] + f_[8] * rhs.f_[6]
+ + f_[12] * rhs.f_[7];
+ ret.f_[5] = f_[1] * rhs.f_[4] + f_[5] * rhs.f_[5] + f_[9] * rhs.f_[6]
+ + f_[13] * rhs.f_[7];
+ ret.f_[6] = f_[2] * rhs.f_[4] + f_[6] * rhs.f_[5] + f_[10] * rhs.f_[6]
+ + f_[14] * rhs.f_[7];
+ ret.f_[7] = f_[3] * rhs.f_[4] + f_[7] * rhs.f_[5] + f_[11] * rhs.f_[6]
+ + f_[15] * rhs.f_[7];
+
+ ret.f_[8] = f_[0] * rhs.f_[8] + f_[4] * rhs.f_[9] + f_[8] * rhs.f_[10]
+ + f_[12] * rhs.f_[11];
+ ret.f_[9] = f_[1] * rhs.f_[8] + f_[5] * rhs.f_[9] + f_[9] * rhs.f_[10]
+ + f_[13] * rhs.f_[11];
+ ret.f_[10] = f_[2] * rhs.f_[8] + f_[6] * rhs.f_[9] + f_[10] * rhs.f_[10]
+ + f_[14] * rhs.f_[11];
+ ret.f_[11] = f_[3] * rhs.f_[8] + f_[7] * rhs.f_[9] + f_[11] * rhs.f_[10]
+ + f_[15] * rhs.f_[11];
+
+ ret.f_[12] = f_[0] * rhs.f_[12] + f_[4] * rhs.f_[13] + f_[8] * rhs.f_[14]
+ + f_[12] * rhs.f_[15];
+ ret.f_[13] = f_[1] * rhs.f_[12] + f_[5] * rhs.f_[13] + f_[9] * rhs.f_[14]
+ + f_[13] * rhs.f_[15];
+ ret.f_[14] = f_[2] * rhs.f_[12] + f_[6] * rhs.f_[13] + f_[10] * rhs.f_[14]
+ + f_[14] * rhs.f_[15];
+ ret.f_[15] = f_[3] * rhs.f_[12] + f_[7] * rhs.f_[13] + f_[11] * rhs.f_[14]
+ + f_[15] * rhs.f_[15];
+
+ *this = ret;
+ return *this;
+ }
+
+ Mat4 operator*( const float rhs )
+ {
+ Mat4 ret;
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ ret.f_[i] = f_[i] * rhs;
+ }
+ return ret;
+ }
+
+ Mat4& operator*=( const float rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] *= rhs;
+ }
+ return *this;
+ }
+
+ Mat4& operator=( const Mat4& rhs )
+ {
+ for( int32_t i = 0; i < 16; ++i )
+ {
+ f_[i] = rhs.f_[i];
+ }
+ return *this;
+ }
+
+ Mat4 Inverse();
+
+ Mat4 Transpose()
+ {
+ Mat4 ret;
+ ret.f_[0] = f_[0];
+ ret.f_[1] = f_[4];
+ ret.f_[2] = f_[8];
+ ret.f_[3] = f_[12];
+ ret.f_[4] = f_[1];
+ ret.f_[5] = f_[5];
+ ret.f_[6] = f_[9];
+ ret.f_[7] = f_[13];
+ ret.f_[8] = f_[2];
+ ret.f_[9] = f_[6];
+ ret.f_[10] = f_[10];
+ ret.f_[11] = f_[14];
+ ret.f_[12] = f_[3];
+ ret.f_[13] = f_[7];
+ ret.f_[14] = f_[11];
+ ret.f_[15] = f_[15];
+ *this = ret;
+ return *this;
+ }
+
+ Mat4& PostTranslate( float tx, float ty, float tz )
+ {
+ f_[12] += (tx * f_[0]) + (ty * f_[4]) + (tz * f_[8]);
+ f_[13] += (tx * f_[1]) + (ty * f_[5]) + (tz * f_[9]);
+ f_[14] += (tx * f_[2]) + (ty * f_[6]) + (tz * f_[10]);
+ f_[15] += (tx * f_[3]) + (ty * f_[7]) + (tz * f_[11]);
+ return *this;
+ }
+
+ float* Ptr()
+ {
+ return f_;
+ }
+
+ //--------------------------------------------------------------------------------
+ // Misc
+ //--------------------------------------------------------------------------------
+ static Mat4 Perspective( float width, float height, float nearPlane, float farPlane );
+
+ static Mat4 LookAt( const Vec3& vEye, const Vec3& vAt, const Vec3& vUp );
+
+ static Mat4 Translation( const float fX, const float fY, const float fZ );
+ static Mat4 Translation( const Vec3 vec );
+
+ static Mat4 RotationX( const float angle );
+
+ static Mat4 RotationY( const float angle );
+
+ static Mat4 RotationZ( const float angle );
+
+ static Mat4 Identity()
+ {
+ Mat4 ret;
+ ret.f_[0] = 1.f;
+ ret.f_[1] = 0;
+ ret.f_[2] = 0;
+ ret.f_[3] = 0;
+ ret.f_[4] = 0;
+ ret.f_[5] = 1.f;
+ ret.f_[6] = 0;
+ ret.f_[7] = 0;
+ ret.f_[8] = 0;
+ ret.f_[9] = 0;
+ ret.f_[10] = 1.f;
+ ret.f_[11] = 0;
+ ret.f_[12] = 0;
+ ret.f_[13] = 0;
+ ret.f_[14] = 0;
+ ret.f_[15] = 1.f;
+ return ret;
+ }
+
+ void Dump()
+ {
+ LOGI( "%f %f %f %f", f_[0], f_[1], f_[2], f_[3] );
+ LOGI( "%f %f %f %f", f_[4], f_[5], f_[6], f_[7] );
+ LOGI( "%f %f %f %f", f_[8], f_[9], f_[10], f_[11] );
+ LOGI( "%f %f %f %f", f_[12], f_[13], f_[14], f_[15] );
+ }
+};
+
+/******************************************************************
+ * Quaternion class
+ *
+ */
+class Quaternion
+{
+private:
+ float x_, y_, z_, w_;
+
+public:
+ friend class Vec3;
+ friend class Vec4;
+ friend class Mat4;
+
+ Quaternion()
+ {
+ x_ = 0.f;
+ y_ = 0.f;
+ z_ = 0.f;
+ w_ = 1.f;
+ }
+
+ Quaternion( const float fX, const float fY, const float fZ, const float fW )
+ {
+ x_ = fX;
+ y_ = fY;
+ z_ = fZ;
+ w_ = fW;
+ }
+
+ Quaternion( const Vec3 vec, const float fW )
+ {
+ x_ = vec.x_;
+ y_ = vec.y_;
+ z_ = vec.z_;
+ w_ = fW;
+ }
+
+ Quaternion( const float* p )
+ {
+ x_ = *p++;
+ y_ = *p++;
+ z_ = *p++;
+ w_ = *p++;
+ }
+
+ Quaternion operator*( const Quaternion rhs )
+ {
+ Quaternion ret;
+ ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;
+ ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;
+ ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;
+ return ret;
+ }
+
+ Quaternion& operator*=( const Quaternion rhs )
+ {
+ Quaternion ret;
+ ret.x_ = x_ * rhs.w_ + y_ * rhs.z_ - z_ * rhs.y_ + w_ * rhs.x_;
+ ret.y_ = -x_ * rhs.z_ + y_ * rhs.w_ + z_ * rhs.x_ + w_ * rhs.y_;
+ ret.z_ = x_ * rhs.y_ - y_ * rhs.x_ + z_ * rhs.w_ + w_ * rhs.z_;
+ ret.w_ = -x_ * rhs.x_ - y_ * rhs.y_ - z_ * rhs.z_ + w_ * rhs.w_;
+ *this = ret;
+ return *this;
+ }
+
+ Quaternion Conjugate()
+ {
+ x_ = -x_;
+ y_ = -y_;
+ z_ = -z_;
+ return *this;
+ }
+
+ //Non destuctive version
+ Quaternion Conjugated()
+ {
+ Quaternion ret;
+ ret.x_ = -x_;
+ ret.y_ = -y_;
+ ret.z_ = -z_;
+ ret.w_ = w_;
+ return ret;
+ }
+
+ void ToMatrix( Mat4& mat )
+ {
+ float x2 = x_ * x_ * 2.0f;
+ float y2 = y_ * y_ * 2.0f;
+ float z2 = z_ * z_ * 2.0f;
+ float xy = x_ * y_ * 2.0f;
+ float yz = y_ * z_ * 2.0f;
+ float zx = z_ * x_ * 2.0f;
+ float xw = x_ * w_ * 2.0f;
+ float yw = y_ * w_ * 2.0f;
+ float zw = z_ * w_ * 2.0f;
+
+ mat.f_[0] = 1.0f - y2 - z2;
+ mat.f_[1] = xy + zw;
+ mat.f_[2] = zx - yw;
+ mat.f_[4] = xy - zw;
+ mat.f_[5] = 1.0f - z2 - x2;
+ mat.f_[6] = yz + xw;
+ mat.f_[8] = zx + yw;
+ mat.f_[9] = yz - xw;
+ mat.f_[10] = 1.0f - x2 - y2;
+
+ mat.f_[3] = mat.f_[7] = mat.f_[11] = mat.f_[12] = mat.f_[13] = mat.f_[14] = 0.0f;
+ mat.f_[15] = 1.0f;
+ }
+
+ void ToMatrixPreserveTranslate( Mat4& mat )
+ {
+ float x2 = x_ * x_ * 2.0f;
+ float y2 = y_ * y_ * 2.0f;
+ float z2 = z_ * z_ * 2.0f;
+ float xy = x_ * y_ * 2.0f;
+ float yz = y_ * z_ * 2.0f;
+ float zx = z_ * x_ * 2.0f;
+ float xw = x_ * w_ * 2.0f;
+ float yw = y_ * w_ * 2.0f;
+ float zw = z_ * w_ * 2.0f;
+
+ mat.f_[0] = 1.0f - y2 - z2;
+ mat.f_[1] = xy + zw;
+ mat.f_[2] = zx - yw;
+ mat.f_[4] = xy - zw;
+ mat.f_[5] = 1.0f - z2 - x2;
+ mat.f_[6] = yz + xw;
+ mat.f_[8] = zx + yw;
+ mat.f_[9] = yz - xw;
+ mat.f_[10] = 1.0f - x2 - y2;
+
+ mat.f_[3] = mat.f_[7] = mat.f_[11] = 0.0f;
+ mat.f_[15] = 1.0f;
+ }
+
+ static Quaternion RotationAxis( const Vec3 axis, const float angle )
+ {
+ Quaternion ret;
+ float s = sinf( angle / 2 );
+ ret.x_ = s * axis.x_;
+ ret.y_ = s * axis.y_;
+ ret.z_ = s * axis.z_;
+ ret.w_ = cosf( angle / 2 );
+ return ret;
+ }
+
+ void Value( float& fX, float& fY, float& fZ, float& fW )
+ {
+ fX = x_;
+ fY = y_;
+ fZ = z_;
+ fW = w_;
+ }
+};
+
+} //namespace ndk_helper
+#endif /* VECMATH_H_ */