LISTING PROGRAM Kode Program splash_screen.xml:

  

LISTING PROGRAM

Kode Program splash_screen.xml:

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@color/holo_light_blue" android:contentDescription="@string/content_desc_vuforia_backgroun

  d">

  <TextView android:id="@+id/splash_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="24dp" android:gravity="center" android:text="@string/splash_title" android:textColor="@color/white" android:textSize="@dimen/splash_title" android:textStyle="bold" /> <ImageView android:id="@+id/logo_digipro" android:layout_width="200dp" android:layout_height="200dp" android:layout_above="@+id/about_me" android:layout_centerHorizontal="true" android:layout_marginBottom="54dp" android:contentDescription="@string/content_desc_vuforia_logo" android:scaleType="fitEnd" android:src="@drawable/logo_digipro" /> <TextView android:id="@+id/nim_ku" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="10dp" android:gravity="center" android:text="@string/nim_ku" android:textColor="@color/white" android:textSize="@dimen/about_title" android:textStyle="bold" /> <TextView android:id="@+id/about_me" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/nim_ku" android:layout_centerHorizontal="true" android:layout_marginBottom="17dp" android:gravity="center" android:text="@string/about_me" android:textColor="@color/white" android:textSize="@dimen/about_title" android:textStyle="bold" /> </RelativeLayout>

  Kode Program about_screen.xml:

  <?xml version="1.0" encoding="utf-8"?>

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="15dip" android:padding="10dip" android:text="@string/about_title" android:textColor="@color/holo_light_blue" android:textSize="@dimen/about_title" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_marginTop="10dp" android:background="@color/holo_light_blue" /> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:layout_weight="1"> <TextView android:id="@+id/about_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="20dp" android:textColor="@color/white" android:textSize="@dimen/about_text" /> </ScrollView> <Button android:id="@+id/button_start" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal|center_vertical" android:text="@string/button_start" /> </LinearLayout>

  Kode Program camera_overlay.xml:

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/camera_overlay_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <ProgressBar android:id="@+id/loading_indicator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" /> </RelativeLayout>

  Kode Program AboutScreen.java:

  package com.qualcomm.QCARSamples.ImageTargets; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.Html; import android.text.method.LinkMovementMethod; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class AboutScreen extends Activity implements OnClickListener { private TextView mAboutText; private Button mStartButton; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.about_screen); mAboutText = (TextView) findViewById(R.id.about_text); mAboutText.setText(Html.fromHtml(getString(R.string.about_text))); mAboutText.setMovementMethod(LinkMovementMethod.getInstance()); mAboutText.setLinkTextColor(getResources().getColor( R.color.holo_light_blue)); mStartButton = (Button) findViewById(R.id.button_start); mStartButton.setOnClickListener(this); } private void startARActivity() { Intent i = new Intent(this, ImageTargets.class); startActivity(i); } public void onClick(View v) { switch (v.getId()) { case R.id.button_start: startARActivity(); break;

  } }}

  Kode Program ImageTargets.java:

  package com.qualcomm.QCARSamples.ImageTargets; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.util.Vector; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.view.WindowManager; import android.widget.RelativeLayout; import android.widget.Toast; import com.qualcomm.QCAR.QCAR; public class ImageTargets extends Activity { private static final int FOCUS_MODE_NORMAL = 0; private static final int FOCUS_MODE_CONTINUOUS_AUTO = 1; private static final int APPSTATUS_UNINITED = -1; private static final int APPSTATUS_INIT_APP = 0; private static final int APPSTATUS_INIT_QCAR = 1; private static final int APPSTATUS_INIT_TRACKER = 2; private static final int APPSTATUS_INIT_APP_AR = 3; private static final int APPSTATUS_LOAD_TRACKER = 4; private static final int APPSTATUS_INITED = 5; private static final int APPSTATUS_CAMERA_STOPPED = 6; private static final int APPSTATUS_CAMERA_RUNNING = 7; private static final String NATIVE_LIB_SAMPLE = "ImageTargets"; private static final String NATIVE_LIB_QCAR = "QCAR"; static final int HIDE_LOADING_DIALOG = 0; static final int SHOW_LOADING_DIALOG = 1; private View mLoadingDialogContainer; private QCARSampleGLView mGlView; private ImageTargetsRenderer mRenderer; private int mScreenWidth = 0; private int mScreenHeight = 0; private static final int INVALID_SCREEN_ROTATION = -1; private int mLastScreenRotation = INVALID_SCREEN_ROTATION; private int mAppStatus = APPSTATUS_UNINITED; private InitQCARTask mInitQCARTask; private LoadTrackerTask mLoadTrackerTask; private Object mShutdownLock = new Object(); private int mQCARFlags = 0; private Vector<Texture> mTextures; private GestureDetector mGestureDetector; private boolean mFlash = false; private boolean mContAutofocus = false; MenuItem mDataSetMenuItem = null; boolean mIsMarkerDataSetActive = false; private RelativeLayout mUILayout; static { loadLibrary(NATIVE_LIB_QCAR); loadLibrary(NATIVE_LIB_SAMPLE); } static class LoadingDialogHandler extends Handler { private final WeakReference<ImageTargets> mImageTargets; LoadingDialogHandler(ImageTargets imageTargets) { mImageTargets = new WeakReference<ImageTargets>( imageTargets); }

public void handleMessage(Message msg) { ImageTargets imageTargets = mImageTargets.get(); if (imageTargets == null) { return; } if (msg.what == SHOW_LOADING_DIALOG) { imageTargets.mLoadingDialogContainer .setVisibility(View.VISIBLE); } else if (msg.what == HIDE_LOADING_DIALOG) { imageTargets.mLoadingDialogContainer.setVisibility(View.GONE); } } } private Handler loadingDialogHandler = new LoadingDialogHandler(this); private class InitQCARTask extends AsyncTask<Void, Integer, Boolean> { private int mProgressValue = -1; protected Boolean doInBackground(Void... params) { synchronized (mShutdownLock) { QCAR.setInitParameters(ImageTargets.this, mQCARFlags); do { mProgressValue = QCAR.init(); publishProgress(mProgressValue); } while (!isCancelled() && mProgressValue >= 0 && mProgressValue < 100); return (mProgressValue > 0); } }

protected void onProgressUpdate(Integer... values) { } protected void onPostExecute(Boolean result) { if (result) { DebugLog.LOGD("InitQCARTask::onPostExecute: QCAR "

  • "initialization successful"); updateApplicationStatus(APPSTATUS_INIT_TRACKER); } else { AlertDialog dialogError = new AlertDialog.Builder (

  ImageTargets.this ).create(); dialogError.setButton ( DialogInterface.BUTTON_POSITIVE, "Close", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { System.exit(1); } } ); String logMessage; if (mProgressValue == QCAR.INIT_DEVICE_NOT_SUPPORTED) { logMessage = "Failed to initialize QCAR because this " + "device is not supported."; } else { logMessage = "Failed to initialize QCAR."; } DebugLog.LOGE("InitQCARTask::onPostExecute: " + logMessage +

  " Exiting."); dialogError.setMessage(logMessage); dialogError.show(); } } } private class LoadTrackerTask extends AsyncTask<Void, Integer, Boolean> { protected Boolean doInBackground(Void... params) { synchronized (mShutdownLock) { return (loadTrackerData() > 0); } } protected void onPostExecute(Boolean result) { DebugLog.LOGD("LoadTrackerTask::onPostExecute: execution " + (result ? "successful" : "failed")); if (result) { mIsMarkerDataSetActive = true; updateApplicationStatus(APPSTATUS_INITED); } else { AlertDialog dialogError = new AlertDialog.Builder ( ImageTargets.this ).create(); dialogError.setButton ( DialogInterface.BUTTON_POSITIVE, "Close", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { System.exit(1); } } ); dialogError.setMessage("Failed to load tracker data."); dialogError.show(); } } } private void storeScreenDimensions() { DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); mScreenWidth = metrics.widthPixels; mScreenHeight = metrics.heightPixels; } protected void onCreate(Bundle savedInstanceState) { DebugLog.LOGD("ImageTargets::onCreate"); super.onCreate(savedInstanceState); mTextures = new Vector<Texture>(); loadTextures(); mQCARFlags = getInitializationFlags(); mGestureDetector = new GestureDetector(this, new GestureListener()); updateApplicationStatus(APPSTATUS_INIT_APP); } private void loadTextures() { mTextures.add(Texture.loadTextureFromApk("TextureBajuPertama 1.png", getAssets())); mTextures.add(Texture.loadTextureFromApk("TextureBajuKedua2. png", getAssets())); } private int getInitializationFlags() { int flags = 0; if (getOpenGlEsVersionNative() == 1) { flags = QCAR.GL_11; }

else { flags = QCAR.GL_20; } return flags; } public native int getOpenGlEsVersionNative(); public native int initTracker(); public native void deinitTracker(); public native int loadTrackerData(); public native void destroyTrackerData(); public native void onQCARInitializedNative(); private native void startCamera(); private native void stopCamera(); private native void setProjectionMatrix(); protected void onResume() { DebugLog.LOGD("ImageTargets::onResume"); super.onResume(); QCAR.onResume(); if (mAppStatus == APPSTATUS_CAMERA_STOPPED) { updateApplicationStatus(APPSTATUS_CAMERA_RUNNING); } if (mGlView != null) { mGlView.setVisibility(View.VISIBLE); mGlView.onResume(); } } private void updateActivityOrientation() { Configuration config = getResources().getConfiguration(); boolean isPortrait = false; switch (config.orientation) { case Configuration.ORIENTATION_PORTRAIT:

isPortrait = true; break; case Configuration.ORIENTATION_LANDSCAPE: isPortrait = false; break; case Configuration.ORIENTATION_UNDEFINED: default: break; } DebugLog.LOGI("Activity is in "

  • (isPortrait ? "PORTRAIT" : "LANDSCAPE")); setActivityPortraitMode(isPortrait); } public void updateRenderView() { int currentScreenRotation = getWindowManager().getDefaultDisplay().getRotation(); if (currentScreenRotation != mLastScreenRotation) { if (QCAR.isInitialized() && (mAppStatus == APPSTATUS_CAMERA_RUNNING)) {

  DebugLog.LOGD("ImageTargets::updateRenderView"); storeScreenDimensions(); mRenderer.updateRendering(mScreenWidth, mScreenHeight); setProjectionMatrix(); mLastScreenRotation = currentScreenRotation; } } } public void onConfigurationChanged(Configuration config) { DebugLog.LOGD("ImageTargets::onConfigurationChanged"); super.onConfigurationChanged(config); updateActivityOrientation(); storeScreenDimensions(); mLastScreenRotation = INVALID_SCREEN_ROTATION; } protected void onPause()

  { DebugLog.LOGD("ImageTargets::onPause"); super.onPause(); if (mGlView != null) { mGlView.setVisibility(View.INVISIBLE); mGlView.onPause(); } if (mAppStatus == APPSTATUS_CAMERA_RUNNING) { updateApplicationStatus(APPSTATUS_CAMERA_STOPPED); } if (mFlash) { mFlash = false; activateFlash(mFlash); } QCAR.onPause(); } private native void deinitApplicationNative(); protected void onDestroy() { DebugLog.LOGD("ImageTargets::onDestroy"); super.onDestroy(); if (mInitQCARTask != null && mInitQCARTask.getStatus() != InitQCARTask.Status.FINISHED) { mInitQCARTask.cancel(true); mInitQCARTask = null; } if (mLoadTrackerTask != null && mLoadTrackerTask.getStatus() != LoadTrackerTask.Status.FINISHED) { mLoadTrackerTask.cancel(true); mLoadTrackerTask = null; } synchronized (mShutdownLock) { deinitApplicationNative(); mTextures.clear(); mTextures = null; destroyTrackerData(); deinitTracker(); QCAR.deinit(); } System.gc(); } private synchronized void updateApplicationStatus(int appStatus) { if (mAppStatus == appStatus) return; mAppStatus = appStatus; switch (mAppStatus) { case APPSTATUS_INIT_APP: initApplication(); updateApplicationStatus(APPSTATUS_INIT_QCAR); break; case APPSTATUS_INIT_QCAR: try { mInitQCARTask = new InitQCARTask(); mInitQCARTask.execute(); } catch (Exception e) { DebugLog.LOGE("Initializing QCAR SDK failed"); } break; case APPSTATUS_INIT_TRACKER: if (initTracker() > 0) { updateApplicationStatus(APPSTATUS_INIT_APP_AR); } break; case APPSTATUS_INIT_APP_AR: initApplicationAR(); updateApplicationStatus(APPSTATUS_LOAD_TRACKER); break;

case APPSTATUS_LOAD_TRACKER: try { mLoadTrackerTask = new LoadTrackerTask(); mLoadTrackerTask.execute(); } catch (Exception e) { DebugLog.LOGE("Loading tracking data set failed"); } break; case APPSTATUS_INITED: onQCARInitializedNative(); mRenderer.mIsActive = true; addContentView(mGlView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mUILayout.bringToFront(); updateApplicationStatus(APPSTATUS_CAMERA_RUNNING); break; case APPSTATUS_CAMERA_STOPPED: stopCamera(); break; case APPSTATUS_CAMERA_RUNNING: startCamera(); loadingDialogHandler.sendEmptyMessage(HIDE_LOADING_DIALOG); mUILayout.setBackgroundColor(Color.TRANSPARENT); if (!setFocusMode(FOCUS_MODE_CONTINUOUS_AUTO)) { mContAutofocus = false; setFocusMode(FOCUS_MODE_NORMAL); } else { mContAutofocus = true; } break; default:

throw new RuntimeException("Invalid application state"); } } private native void setActivityPortraitMode(boolean isPortrait); private void initApplication() { int screenOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR; if (screenOrientation == ActivityInfo.SCREEN_ORIENTATION_SENSOR) { try { Field fullSensorField = ActivityInfo.class .getField("SCREEN_ORIENTATION_FULL_SENSOR"); screenOrientation = fullSensorField.getInt(null); } catch (NoSuchFieldException e) { } catch (Exception e) { e.printStackTrace(); } } setRequestedOrientation(screenOrientation); updateActivityOrientation(); storeScreenDimensions(); getWindow().setFlags( WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } private native void initApplicationNative(int width, int height); private void initApplicationAR() { initApplicationNative(mScreenWidth, mScreenHeight);

int depthSize = 16; int stencilSize = 0; boolean translucent = QCAR.requiresAlpha(); mGlView = new QCARSampleGLView(this); mGlView.init(mQCARFlags, translucent, depthSize, stencilSize); mRenderer = new ImageTargetsRenderer(); mRenderer.mActivity = this; mGlView.setRenderer(mRenderer); LayoutInflater inflater = LayoutInflater.from(this); mUILayout = (RelativeLayout) inflater.inflate(R.layout.camera_overlay, null, false); mUILayout.setVisibility(View.VISIBLE); mUILayout.setBackgroundColor(Color.BLACK); mLoadingDialogContainer = mUILayout.findViewById(R.id.loading_indicator); loadingDialogHandler.sendEmptyMessage(SHOW_LOADING_DIALOG); addContentView(mUILayout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); } private native void switchDatasetAsap(); private native boolean autofocus(); private native boolean setFocusMode(int mode); private native boolean activateFlash(boolean flash); public int getTextureCount() { return mTextures.size(); } public Texture getTexture(int i) { return mTextures.elementAt(i); } public static boolean loadLibrary(String nLibName)

  { try { System.loadLibrary(nLibName); DebugLog.LOGI("Native library lib" + nLibName + ".so loaded"); return true; } catch (UnsatisfiedLinkError ulee) { DebugLog.LOGE("The library lib" + nLibName + ".so could not be loaded"); } catch (SecurityException se) { DebugLog.LOGE("The library lib" + nLibName + ".so was not allowed to be loaded"); } return false; } public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { showCameraOptionsDialog(); return true; } return super.onKeyUp(keyCode, event); } public boolean onTouchEvent(MotionEvent event) { return mGestureDetector.onTouchEvent(event); } private class GestureListener extends GestureDetector.SimpleOnGestureListener { public boolean onDown(MotionEvent e) { return true; } public boolean onSingleTapUp(MotionEvent e) { autofocus(); mContAutofocus = false; return true; } public boolean onDoubleTap(MotionEvent e) { showCameraOptionsDialog(); return true; } } private void showCameraOptionsDialog() { if (mAppStatus < APPSTATUS_INITED) { return; } final int itemCameraIndex = 0; final int itemAutofocusIndex = 1; final int itemSwitchDatasetIndex = 2; AlertDialog cameraOptionsDialog = null; CharSequence[] items = { getString(R.string.menu_flash_on), getString(R.string.menu_contAutofocus_off), }; if (mFlash) { items[itemCameraIndex] = (getString(R.string.menu_flash_off)); } else { items[itemCameraIndex] = (getString(R.string.menu_flash_on)); } if (mContAutofocus) { items[itemAutofocusIndex] = (getString(R.string.menu_contAutofocus_off)); } else { items[itemAutofocusIndex] = (getString(R.string.menu_contAutofocus_on)); }

  AlertDialog.Builder cameraOptionsDialogBuilder = new AlertDialog.Builder( ImageTargets.this); cameraOptionsDialogBuilder .setTitle(getString(R.string.menu_camera_title)); cameraOptionsDialogBuilder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { if (item == itemCameraIndex) { if (activateFlash(!mFlash)) { mFlash = !mFlash; } else { Toast.makeText ( ImageTargets.this, "Unable to turn " + (mFlash ? "off" : "on") + " flash", Toast.LENGTH_SHORT ).show(); } dialog.dismiss(); } else if (item == itemAutofocusIndex) { if (mContAutofocus) { if (setFocusMode(FOCUS_MODE_NORMAL)) { mContAutofocus = false; } else { Toast.makeText ( ImageTargets.this, "Unable to deactivate Continuous Auto-Focus", Toast.LENGTH_SHORT ).show(); } } else { if (setFocusMode(FOCUS_MODE_CONTINUOUS_AUTO)) { mContAutofocus = true; } else { Toast.makeText ( ImageTargets.this, "Unable to activate Continuous Auto-Focus", Toast.LENGTH_SHORT ).show(); } } dialog.dismiss(); } else if (item == itemSwitchDatasetIndex) { switchDatasetAsap(); mIsMarkerDataSetActive = !mIsMarkerDataSetActive; dialog.dismiss(); } } }); cameraOptionsDialog = cameraOptionsDialogBuilder.create(); cameraOptionsDialog.show(); } }

  Kode Program ImageTargets.cpp: #include <jni.h> #include <android/log.h> #include

  <QCAR/DataSet.h>

  textureCount = 0; Texture** textures = 0;

  #endif int

  {

  #ifdef __cplusplus extern "C"

  TOTAL_ANIMATION_DURATION 5.0f //seconds

  float animationTime = 0; #define

  lastTrackableId = -1;

  #include "bajuKedua.h" #include <sys/time.h> int

  "bajuPertama.h"

  #include "Texture.h" #include "CubeShaders.h" #include

  "SampleUtils.h"

  #include

  #include <QCAR/CameraCalibration.h> #include <QCAR/UpdateCallback.h> #include

  <stdio.h>

  <QCAR/ImageTracker.h>

  #include <QCAR/Tracker.h> #include <QCAR/TrackerManager.h> #include

  <QCAR/Tool.h>

  #include <QCAR/Trackable.h> #include <QCAR/TrackableResult.h> #include

  <QCAR/VideoBackgroundConfig.h>

  #include <QCAR/CameraDevice.h> #include <QCAR/Renderer.h> #include

  <QCAR/QCAR.h>

  #endif #include

  <GLES2/gl2ext.h>

  #else #include <GLES2/gl2.h> #include

  <GLES/glext.h>

  #include <string.h> #include <assert.h> #ifdef USE_OPENGL_ES_1_1 #include <GLES/gl.h> #include

  #ifdef USE_OPENGL_ES_2_0

  unsignedint

  shaderProgramID = 0; GLint vertexHandle = 0; GLint textureCoordHandle = 0; GLint mvpMatrixHandle = 0; GLint texSampler2DHandle = 0;

  #endif unsignedint screenWidth = 0; unsignedint screenHeight = 0; bool isActivityInPortraitMode = false;

  QCAR::Matrix44F projectionMatrix;

  staticconstfloat kObjectScale = 1500.0f;

  QCAR::DataSet* dataSetMarker = 0;

  bool

  switchDataSetAsap = false;

  class

  ImageTargets_UpdateCallback : public QCAR::UpdateCallback {

  virtualvoidQCAR_onUpdate (QCAR::State&/*state*/)

  {

  if (switchDataSetAsap)

  { switchDataSetAsap = false; QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); QCAR::ImageTracker* imageTracker =

  static_cast <QCAR::ImageTracker*>(

  trackerManager.getTracker(QCAR::Tracker::IMAGE_TRACKER));

  if (imageTracker == 0 || dataSetMarker == 0 ||

  imageTracker->getActiveDataSet() == 0) { LOG("Failed to switch data set.");

  return

  ; } } } }; ImageTargets_UpdateCallback updateCallback; JNIEXPORT int JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_getOpenGlE sVersionNative(JNIEnv *, jobject) {

  #ifdef USE_OPENGL_ES_1_1 return

  1;

  #else

  return

  2;

  #endif

  } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_setActivit yPortraitMode(JNIEnv *, jobject, jboolean isPortrait) { isActivityInPortraitMode = isPortrait; } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_switchData setAsap(JNIEnv *, jobject) { switchDataSetAsap = true; } JNIEXPORT int JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_initTracke r(JNIEnv *, jobject) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_initT racker"); QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); QCAR::Tracker* tracker = trackerManager.initTracker(QCAR::Tracker::IMAGE_TRACKER);

  if (tracker == NULL)

  { LOG("Failed to initialize ImageTracker.");

  return 0;

  } LOG("Successfully initialized ImageTracker.");

  return 1;

  } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_deinitTrac ker(JNIEnv *, jobject) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_deini tTracker");

  QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); trackerManager.deinitTracker(QCAR::Tracker::IMAGE_TRACKER); } JNIEXPORT int JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_loadTracke rData(JNIEnv *, jobject) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_loadT rackerData"); QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); QCAR::ImageTracker* imageTracker =

  static_cast <QCAR::ImageTracker*>(

  trackerManager.getTracker(QCAR::Tracker::IMAGE_TRACKER));

  if (imageTracker == NULL)

  { LOG("Failed to load tracking data set because the ImageTracker has not" " been initialized.");

  return 0;

  } dataSetMarker = imageTracker->createDataSet();

  if (dataSetMarker == 0)

  { LOG("Failed to create a new tracking data.");

  return 0;

  }

  if (!dataSetMarker->load("Marker.xml",

  QCAR::DataSet::STORAGE_APPRESOURCE)) { LOG("Failed to load data set.");

  return

  0; }

  if

  (!imageTracker->activateDataSet(dataSetMarker)) { LOG("Failed to activate data set.");

  return 0;

  } LOG("Successfully loaded and activated data set.");

  return 1;

  } JNIEXPORT int JNICALL

  Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_destroyTra ckerData(JNIEnv *, jobject) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_destr oyTrackerData"); QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); QCAR::ImageTracker* imageTracker =

  static_cast <QCAR::ImageTracker*>(

  trackerManager.getTracker(QCAR::Tracker::IMAGE_TRACKER));

  if

  (imageTracker == NULL) { LOG("Failed to destroy the tracking data set because the ImageTracker has not" " been initialized.");

  return 0;

  }

  if (dataSetMarker != 0)

  {

  if (imageTracker->getActiveDataSet() == dataSetMarker &&

  !imageTracker->deactivateDataSet(dataSetMarker)) { LOG("Failed to destroy the tracking data set StonesAndChips because the data set " "could not be deactivated.");

  return 0;

  }

  if (!imageTracker->destroyDataSet(dataSetMarker))

  { LOG("Failed to destroy the tracking data set Marker.");

  return 0;

  } LOG("Successfully destroyed the data set Marker."); dataSetMarker = 0; }

  return

  1; } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_onQCARInit ializedNative(JNIEnv *, jobject) { QCAR::setHint(QCAR::HINT_MAX_SIMULTANEOUS_IMAGE_TARGETS, 2); }

  unsignedlonggetCurrentTimeMilliseconds ()

  {

  struct

  timeval tv; gettimeofday(&tv, NULL);

  unsignedlong s = tv.tv_sec * 1000; unsignedlong

  us = tv.tv_usec / 1000;

  return s + us;

  } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_re nderFrame(JNIEnv *, jobject) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); QCAR::State state = QCAR::Renderer::getInstance().begin(); QCAR::Renderer::getInstance().drawVideoBackground();

  #ifdef USE_OPENGL_ES_1_1

  glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); glDisable(GL_LIGHTING);

  #endif

  glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK);

  if (QCAR::Renderer::getInstance().getVideoBackgroundConfig().mRefle

  ction == QCAR::VIDEO_BACKGROUND_REFLECTION_ON) glFrontFace(GL_CW);

  else

  glFrontFace(GL_CCW);

  staticfloat lastTime = 0.001f * getCurrentTimeMilliseconds(); if

  (state.getNumTrackableResults() == 0) { lastTime = 0.001f * getCurrentTimeMilliseconds(); animationTime = 0; lastTrackableId = -1;

  }

  for

  (int tIdx = 0; tIdx < state.getNumTrackableResults(); tIdx++) {

  const QCAR::TrackableResult* result =

  state.getTrackableResult(tIdx);

  const QCAR::Trackable& trackable = result->getTrackable(); if (trackable.getId() != lastTrackableId)

  { animationTime = 0; lastTrackableId = trackable.getId(); }

  float currentTime = 0.001f * getCurrentTimeMilliseconds(); float

  elapsedTime = currentTime - lastTime; animationTime += elapsedTime; lastTime = currentTime;

  if

  (animationTime > TOTAL_ANIMATION_DURATION) { animationTime = 0; } QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result->getPose());

  int textureIndex; if

  (strcmp(trackable.getName(), "MarkerSatu") == 0) { textureIndex = 0; glVertexAttribPointer(vertexHandle,3, GL_FLOAT, GL_FALSE, 0, bajuPertamaVerts); glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, bajuPertamaTexCoords); }

  elseif (strcmp(trackable.getName(), "MarkerDua") == 0)

  { textureIndex = 1; glVertexAttribPointer(vertexHandle,3, GL_FLOAT, GL_FALSE, 0, bajuKeduaVerts); glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, bajuKeduaTexCoords); }

  const Texture* const thisTexture = textures[textureIndex]; #ifdef

  USE_OPENGL_ES_1_1 glMatrixMode(GL_PROJECTION); glLoadMatrixf(projectionMatrix.data); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(modelViewMatrix.data); glTranslatef(0.f, 0.f, kObjectScale); glScalef(kObjectScale, kObjectScale, kObjectScale); glBindTexture(GL_TEXTURE_2D, thisTexture->mTextureID);

  if (textureIndex==0)

  glDrawArrays(GL_TRIANGLES, 0, bajuPertamaNumVerts);

  elseif

  (textureIndex==1) glDrawArrays(GL_TRIANGLES, 0, bajuKeduaNumVerts);

  #else

  QCAR::Matrix44F modelViewProjection;

  float angle = 90.0f; float

  totalRotationAngle = 90.0f;

  float currentRotationAngle = 360.0f * (animationTime /

  TOTAL_ANIMATION_DURATION); SampleUtils::rotatePoseMatrix(currentRotationAngle, 0.f, 0.f, 1.f,

  &modelViewMatrix.data[0]); SampleUtils::translatePoseMatrix(0.0f, 0.0f, 100, &modelViewMatrix.data[0]); SampleUtils::rotatePoseMatrix(angle, 1.0f, 0.0f, 0.0f, &modelViewMatrix.data[0]); SampleUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale, &modelViewMatrix.data[0]); SampleUtils::multiplyMatrix(&projectionMatrix.data[0], &modelViewMatrix.data[0] , &modelViewProjection.data[0]); glUseProgram(shaderProgramID); glEnableVertexAttribArray(vertexHandle); glEnableVertexAttribArray(textureCoordHandle); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, thisTexture->mTextureID); glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/); glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjection.data[0] );

  if (textureIndex==0)

  glDrawArrays(GL_TRIANGLES, 0, bajuPertamaNumVerts);

  elseif (textureIndex==1)

  glDrawArrays(GL_TRIANGLES, 0, bajuKeduaNumVerts); SampleUtils::checkGlError("ImageTargets renderFrame");

  #endif

  } glDisable(GL_DEPTH_TEST);

  #ifdef USE_OPENGL_ES_1_1

  glDisable(GL_TEXTURE_2D); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY);

  #else

  glDisableVertexAttribArray(vertexHandle); glDisableVertexAttribArray(textureCoordHandle);

  #endif

  QCAR::Renderer::getInstance().end(); }

  void configureVideoBackground ()

  { QCAR::CameraDevice& cameraDevice = QCAR::CameraDevice::getInstance(); QCAR::VideoMode videoMode = cameraDevice. getVideoMode(QCAR::CameraDevice::MODE_DEFAULT); QCAR::VideoBackgroundConfig config; config.mEnabled = true; config.mSynchronous = true; config.mPosition.data[0] = 0.0f; config.mPosition.data[1] = 0.0f;

  if (isActivityInPortraitMode)

  { config.mSize.data[0] = videoMode.mHeight

  • (screenHeight / (float)videoMode.mWidth); config.mSize.data[1] = screenHeight;

  if (config.mSize.data[0] < screenWidth)

  { LOG("Correcting rendering background size to handle missmatch between screen and video aspect ratios."); config.mSize.data[0] = screenWidth; config.mSize.data[1] = screenWidth * (videoMode.mWidth / (float)videoMode.mHeight); } }

  else

  { config.mSize.data[0] = screenWidth; config.mSize.data[1] = videoMode.mHeight

  • (screenWidth / (float)videoMode.mWidth);

  if

  (config.mSize.data[1] < screenHeight) { LOG("Correcting rendering background size to handle missmatch between screen and video aspect ratios."); config.mSize.data[0] = screenHeight

  • (videoMode.mWidth / (float)videoMode.mHeight); config.mSize.data[1] = screenHeight;

  } } LOG("Configure Video Background : Video (%d,%d), Screen (%d,%d), mSize (%d,%d)", videoMode.mWidth, videoMode.mHeight, screenWidth, screenHeight, config.mSize.data[0], config.mSize.data[1]); QCAR::Renderer::getInstance().setVideoBackgroundConfig(config); } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_initApplic ationNative( JNIEnv* env, jobject obj, jint width, jint height) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_initA pplicationNative"); screenWidth = width; screenHeight = height; jclass activityClass = env->GetObjectClass(obj); jmethodID getTextureCountMethodID = env- >GetMethodID(activityClass, "getTextureCount", "()I");

  if (getTextureCountMethodID == 0)

  { LOG("Function getTextureCount() not found.");

  return ;

  } textureCount = env->CallIntMethod(obj, getTextureCountMethodID);

  if

  (!textureCount) { LOG("getTextureCount() returned zero.");

  return

  ; } textures = new Texture*[textureCount]; jmethodID getTextureMethodID = env->GetMethodID(activityClass, "getTexture", "(I)Lcom/qualcomm/QCARSamples/ImageTargets/Texture;");

  if (getTextureMethodID == 0)

  { LOG("Function getTexture() not found.");

  return

  ; }

  for

  (int i = 0; i < textureCount; ++i) { jobject textureObject = env->CallObjectMethod(obj, getTextureMethodID, i);

  if (textureObject == NULL)

  { LOG("GetTexture() returned zero pointer");

  return ;

  } textures[i] = Texture::create(env, textureObject); } LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_initA pplicationNative finished"); } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_deinitAppl icationNative( JNIEnv* env, jobject obj) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_deini tApplicationNative");

  if (textures != 0)

  {

  for (int i = 0; i < textureCount; ++i)

  {

  delete

  textures[i]; textures[i] = NULL; }

  delete []textures;

  textures = NULL; textureCount = 0; } } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_startCamer a(JNIEnv *, jobject) {

  LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_start Camera"); QCAR::CameraDevice::CAMERA camera = QCAR::CameraDevice::CAMERA_DEFAULT;

  if (!QCAR::CameraDevice::getInstance().init(camera)) return ;

  configureVideoBackground();

  if (!QCAR::CameraDevice::getInstance().selectVideoMode(

  QCAR::CameraDevice::MODE_DEFAULT))

  return ; if

  (!QCAR::CameraDevice::getInstance().start())

  return ;

  QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); QCAR::Tracker* imageTracker = trackerManager.getTracker(QCAR::Tracker::IMAGE_TRACKER);

  if (imageTracker != 0)

  imageTracker->start(); } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_stopCamera (JNIEnv *, jobject) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_stopC amera"); QCAR::TrackerManager& trackerManager = QCAR::TrackerManager::getInstance(); QCAR::Tracker* imageTracker = trackerManager.getTracker(QCAR::Tracker::IMAGE_TRACKER);

  if

  (imageTracker != 0) imageTracker->stop(); QCAR::CameraDevice::getInstance().stop(); QCAR::CameraDevice::getInstance().deinit(); } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_setProject ionMatrix(JNIEnv *, jobject) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_setPr ojectionMatrix");

  const QCAR::CameraCalibration& cameraCalibration =

  QCAR::CameraDevice::getInstance().getCameraCalibration(); projectionMatrix = QCAR::Tool::getProjectionGL(cameraCalibration, 2.0f, 2500.0f); } JNIEXPORT jboolean JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_activateFl ash(JNIEnv*, jobject, jboolean flash) {

  return

  QCAR::CameraDevice::getInstance().setFlashTorchMode((flash==JNI_TR UE)) ? JNI_TRUE : JNI_FALSE; } JNIEXPORT jboolean JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_autofocus( JNIEnv*, jobject) {

  return

  QCAR::CameraDevice::getInstance().setFocusMode(QCAR::CameraDevice: :FOCUS_MODE_TRIGGERAUTO) ? JNI_TRUE : JNI_FALSE; } JNIEXPORT jboolean JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargets_setFocusMo de(JNIEnv*, jobject, jint mode) {

  int qcarFocusMode; switch

  ((int)mode) {

  case 0:

  qcarFocusMode = QCAR::CameraDevice::FOCUS_MODE_NORMAL;

  break ; case

  1: qcarFocusMode = QCAR::CameraDevice::FOCUS_MODE_CONTINUOUSAUTO;

  break

  ;

  case 2:

  qcarFocusMode = QCAR::CameraDevice::FOCUS_MODE_INFINITY;

  break ; case 3:

  qcarFocusMode = QCAR::CameraDevice::FOCUS_MODE_MACRO;

  break ; default :

  return

  JNI_FALSE; }

  return

  QCAR::CameraDevice::getInstance().setFocusMode(qcarFocusMode) ? JNI_TRUE : JNI_FALSE; } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_in itRendering( JNIEnv* env, jobject obj) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRender er_initRendering"); glClearColor(0.0f, 0.0f, 0.0f, QCAR::requiresAlpha() ? 0.0f : 1.0f);

  for (int i = 0; i < textureCount; ++i)

  { glGenTextures(1, &(textures[i]->mTextureID)); glBindTexture(GL_TEXTURE_2D, textures[i]->mTextureID); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textures[i]- >mWidth, textures[i]->mHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) textures[i]->mData); }

  #ifndef

  USE_OPENGL_ES_1_1 shaderProgramID = SampleUtils::createProgramFromBuffer(cubeMeshVertexShader, cubeFragmentShader); vertexHandle = glGetAttribLocation(shaderProgramID, "vertexPosition"); textureCoordHandle = glGetAttribLocation(shaderProgramID, "vertexTexCoord"); mvpMatrixHandle = glGetUniformLocation(shaderProgramID, "modelViewProjectionMatrix"); texSampler2DHandle = glGetUniformLocation(shaderProgramID, "texSampler2D");

  #endif

  } JNIEXPORT void JNICALL Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRenderer_up dateRendering( JNIEnv* env, jobject obj, jint width, jint height) { LOG("Java_com_qualcomm_QCARSamples_ImageTargets_ImageTargetsRender er_updateRendering"); screenWidth = width; screenHeight = height; configureVideoBackground(); }

  #ifdef __cplusplus

  }

  #endif

Dokumen yang terkait

Studi Perspektif Masyarakat untuk Program Restorasi Ekosistem Hutan Mangrove (Studi Kasus Masyarakat Desa Bogak Kecamatan Tanjung Tiram Kabupaten Batu Bara)

0 1 5

Studi Perspektif Masyarakat untuk Program Restorasi Ekosistem Hutan Mangrove (Studi Kasus Masyarakat Desa Bogak Kecamatan Tanjung Tiram Kabupaten Batu Bara)

0 2 10

BAB II TINJAUAN PUSTAKA 2.1 Kebijakan Publik 2.1.1 Pengertian Kebijakan Publik - Implementasi Program Bantuan Operasional Sekolah (BOS) Tahun 2014 di Sekolah Dasar Luar Biasa Negeri (Studi Pada Sekolah Dasar Luar Biasa Negeri Kebayakan Gunung Balohen Keca

0 1 26

BAB I PENDAHULUAN 1.1 Latar Belakang - Implementasi Program Bantuan Operasional Sekolah (BOS) Tahun 2014 di Sekolah Dasar Luar Biasa Negeri (Studi Pada Sekolah Dasar Luar Biasa Negeri Kebayakan Gunung Balohen Kecamatan Kebayakan Kabupaten Aceh Tengah)

0 2 9

Implementasi Program Bantuan Operasional Sekolah (BOS) Tahun 2014 di Sekolah Dasar Luar Biasa Negeri (Studi Pada Sekolah Dasar Luar Biasa Negeri Kebayakan Gunung Balohen Kecamatan Kebayakan Kabupaten Aceh Tengah)

0 0 14

BAB 1 PENDAHULUAN 1.1.Latar Belakang - Implementasi Kebijakan Program Pelayanan Administrasi Terpadu Kecamatan (PATEN) Studi Pada Kantor Camat Perbaungan Kabupaten Serdang Bedagai

0 1 28

KATA PENGANTAR - Implementasi Program Beras Untuk Masyarakat Miskin di Desa Lau Gumba Kecamatan Berastagi

0 0 53

Pengetahuan Mahasiswa Program Studi S1 Keperawatan (Reguler) Universitas Sumatera Utara tentang UU RI No. 38 Tahun 2014 tentang Keperawatan

0 0 44

BAB 2 TINJAUAN PUSTAKA - Pengetahuan Mahasiswa Program Studi S1 Keperawatan (Reguler) Universitas Sumatera Utara tentang UU RI No. 38 Tahun 2014 tentang Keperawatan

0 0 31

Pengetahuan Mahasiswa Program Studi S1 Keperawatan (Reguler) Universitas Sumatera Utara tentang UU RI No. 38 Tahun 2014 tentang Keperawatan

0 0 13