OSDN Git Service

Support NyARToolkit-2.5.1.
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / android_group / artoolkit / ARToolkitDrawer.java
1 package jp.android_group.artoolkit;
2
3 import java.io.InputStream;
4
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;
17
18 public class ARToolkitDrawer {
19         
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();
26
27         
28         private ModelRenderer mRenderer = null;
29         private InputStream camePara = null;
30         private InputStream patt = null;
31         
32         private VoicePlayer mVoiceSound = null;
33         
34         public ARToolkitDrawer(InputStream camePara, InputStream patt, ModelRenderer mRenderer) {
35                 this.camePara = camePara;
36                 this.patt = patt;
37                 this.mRenderer = mRenderer;
38         }
39         
40         private void createNyARTool(int w, int h) {
41                 // NyARToolkit setting.
42                 try {
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);
53                         }
54                         Log.d("nyar", "resources have been loaded");
55                 } catch (Exception e) {
56                         Log.e("nyar", "resource loading failed", e);
57                 }
58
59         }
60
61         public void setVoicePlayer(VoicePlayer mVoiceSound) {
62                 this.mVoiceSound = mVoiceSound;
63         }
64
65         public void draw(byte[] data) {
66                 
67                 if(data == null) {
68                         Log.d("AR draw", "data= null");
69                         return;
70                 }
71                 Log.d("AR draw", "data.length= " + data.length);
72                 
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);
78                 }
79
80                 if (bitmap == null) {
81                         Log.d("AR draw", "data is not BitMap data.");
82                         return;
83                 }
84                                         
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];
94                 
95                 boolean is_marker_exist = false;
96                 bitmap.getPixels(pixels, 0, w, 0, 0, w, h);
97                 Log.d("AR draw", "pixels:" + pixels.length);
98
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);
105                         buf[i * 3] = r;
106                         buf[i * 3 + 1] = g;
107                         buf[i * 3 + 2] = b;
108                         argb = pixels[i];
109                 }
110                 
111                 createNyARTool(w, h);
112                 // Marker detection 
113                 try {
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);
120                         return;
121                 }
122                 
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);
129                         try {
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);
135                                 return;
136                         }
137                         mRenderer.objectPointChanged(resultf, cameraRHf);
138                         if(mVoiceSound != null)
139                                 mVoiceSound.startVoice();
140                 } else {
141                         Log.d("AR draw", "not exist marker.");
142                         if(mVoiceSound != null)
143                                 mVoiceSound.stopVoice();
144                         mRenderer.objectClear();
145                 }
146
147         }
148         
149 }