1 package jp.android_group.artoolkit;
3 import java.io.InputStream;
5 import jp.android_group.artoolkit.model.VoicePlayer;
6 import jp.nyatla.nyartoolkit.NyARException;
7 import jp.nyatla.nyartoolkit.core.NyARCode;
8 import jp.nyatla.nyartoolkit.core.param.NyARParam;
9 import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster_RGB;
10 import jp.nyatla.nyartoolkit.core.transmat.NyARTransMatResult;
11 import jp.nyatla.nyartoolkit.core.types.NyARBufferType;
12 import jp.nyatla.nyartoolkit.detector.NyARSingleDetectMarker;
13 import jp.nyatla.nyartoolkit.jogl.utils.NyARGLUtil;
14 import android.graphics.Bitmap;
15 import android.graphics.BitmapFactory;
16 import android.util.Log;
18 public class ARToolkitDrawer {
20 private NyARSingleDetectMarker nya = null;
21 private NyARRgbRaster_RGB raster = null;
22 private NyARGLUtil ar_util = null;
23 private NyARParam ar_param = null;
24 private NyARCode ar_code = null;
25 private NyARTransMatResult ar_transmat_result = new NyARTransMatResult();
28 private ModelRenderer mRenderer = null;
29 private InputStream camePara = null;
30 private InputStream patt = null;
32 private VoicePlayer mVoiceSound = null;
34 public ARToolkitDrawer(InputStream camePara, InputStream patt, ModelRenderer mRenderer) {
35 this.camePara = camePara;
37 this.mRenderer = mRenderer;
40 private void createNyARTool(int w, int h) {
41 // NyARToolkit setting.
43 if (ar_param == null) {
44 ar_util = new NyARGLUtil();
45 ar_param = new NyARParam();
46 ar_param.loadARParam(camePara);
47 ar_code = new NyARCode(16, 16);
48 ar_code.loadARPatt(patt);
49 //TODO 本当は、ここはifの外でないと行けない。だけど、出すとOutOfMemory
50 ar_param.changeScreenSize(w, h);
51 nya = new NyARSingleDetectMarker(ar_param, ar_code, 80.0, NyARBufferType.BYTE1D_B8G8R8_24);
52 nya.setContinueMode(false);
54 Log.d("nyar", "resources have been loaded");
55 } catch (Exception e) {
56 Log.e("nyar", "resource loading failed", e);
61 public void setVoicePlayer(VoicePlayer mVoiceSound) {
62 this.mVoiceSound = mVoiceSound;
65 public void draw(byte[] data) {
68 Log.d("AR draw", "data= null");
71 Log.d("AR draw", "data.length= " + data.length);
73 BitmapFactory.Options options = new BitmapFactory.Options();
74 options.inSampleSize = 4;
75 Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options);
76 if(bitmap.getHeight() < 240) {
77 bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
81 Log.d("AR draw", "data is not BitMap data.");
85 Log.d("AR draw", "bitmap.getHeight()= " + bitmap.getHeight());
86 Log.d("AR draw", "bitmap.getWidth()= " + bitmap.getWidth());
87 mRenderer.setBgBitmap(bitmap);
88 // start coordinates calculation.
89 int w = bitmap.getWidth();
90 int h = bitmap.getHeight();
91 int[] pixels = new int[w * h];
92 byte[] buf = new byte[pixels.length * 3];
93 float[] resultf = new float[16];
95 boolean is_marker_exist = false;
96 bitmap.getPixels(pixels, 0, w, 0, 0, w, h);
97 Log.d("AR draw", "pixels:" + pixels.length);
99 for (int i = 0; i < pixels.length; i++) {
100 int argb = pixels[i];
101 // byte a = (byte) (argb & 0xFF000000 >> 24);
102 byte r = (byte) (argb & 0x00FF0000 >> 16);
103 byte g = (byte) (argb & 0x0000FF00 >> 8);
104 byte b = (byte) (argb & 0x000000FF);
111 createNyARTool(w, h);
114 Log.d("AR draw", "Marker detection.");
115 raster = new NyARRgbRaster_RGB(w, h);
116 raster.wrapBuffer(buf);
117 is_marker_exist = nya.detectMarkerLite(raster, 100);
118 } catch (NyARException e) {
119 Log.e("AR draw", "marker detection failed", e);
123 // An OpenGL object will be drawn if matched.
124 if (is_marker_exist) {
125 Log.d("AR draw", "!!!!!!!!!!!exist marker.!!!!!!!!!!!");
126 // Projection transformation.
127 float[] cameraRHf = new float[16];
128 ar_util.toCameraFrustumRHf(ar_param, cameraRHf);
130 NyARTransMatResult transmat_result = ar_transmat_result;
131 nya.getTransmationMatrix(transmat_result);
132 ar_util.toCameraViewRHf(transmat_result, resultf);
133 } catch (NyARException e) {
134 Log.e("AR draw", "getCameraViewRH failed", e);
137 mRenderer.objectPointChanged(resultf, cameraRHf);
138 if(mVoiceSound != null)
139 mVoiceSound.startVoice();
141 Log.d("AR draw", "not exist marker.");
142 if(mVoiceSound != null)
143 mVoiceSound.stopVoice();
144 mRenderer.objectClear();