OSDN Git Service

[bugfix]nyartoolkit
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Wed, 27 Jan 2010 11:58:52 +0000 (11:58 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Wed, 27 Jan 2010 11:58:52 +0000 (11:58 +0000)
+processorのサンプルが間違っていたので修正した。

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit@416 7cac0a50-4618-4814-88d0-24b83990f816

trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/SingleARMarker.java
trunk/sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/SingleNyIdMarker.java

index f4d73ec..c617940 100644 (file)
@@ -77,38 +77,39 @@ public class SingleARMarker implements GLEventListener, JmfCaptureListener
         *\r
         */\r
        class MarkerProcessor extends SingleARMarkerProcesser\r
-       {       \r
-               private Object _sync_object=new Object();\r
-               public NyARTransMatResult transmat=null;\r
+       {\r
+               private NyARGLUtil _glnya;\r
+               public double[] gltransmat=new double[16];\r
+               \r
                public int current_code=-1;\r
 \r
-               public MarkerProcessor(NyARParam i_cparam,int i_raster_format) throws NyARException\r
+               public MarkerProcessor(NyARParam i_cparam,int i_raster_format,NyARGLUtil i_glutil) throws NyARException\r
                {\r
                        //アプリケーションフレームワークの初期化\r
                        super();\r
                        initInstance(i_cparam,i_raster_format);\r
+                       this._glnya=i_glutil;\r
                        return;\r
                }\r
                protected void onEnterHandler(int i_code)\r
                {\r
-                       synchronized(this._sync_object){\r
-                               current_code=i_code;\r
-                       }\r
+                       current_code=i_code;\r
                }\r
                protected void onLeaveHandler()\r
                {\r
-                       synchronized(this._sync_object){\r
-                               current_code=-1;\r
-                               this.transmat=null;\r
-                       }\r
+                       current_code=-1;\r
                        return;                 \r
                }\r
-\r
+               /**\r
+                * i_square,resultの有効期間は、この関数の終了までです。\r
+                */\r
                protected void onUpdateHandler(NyARSquare i_square, NyARTransMatResult result)\r
                {\r
-                       synchronized(this._sync_object){\r
-                               this.transmat=result;\r
-                       }                       \r
+                       try{\r
+                               this._glnya.toCameraViewRH(result, this.gltransmat);\r
+                       }catch(Exception e){\r
+                               e.printStackTrace();\r
+                       }\r
                }\r
        }\r
        \r
@@ -148,9 +149,6 @@ public class SingleARMarker implements GLEventListener, JmfCaptureListener
 \r
                this._code_table[0]=new NyARCode(16,16);\r
                this._code_table[0].loadARPattFromFile(CARCODE_FILE1);\r
-               //プロセッサの準備\r
-               this._processor=new MarkerProcessor(i_cparam,this._cap_image.getBufferType());\r
-               this._processor.setARCodeTable(_code_table,16,80.0);\r
                \r
                //OpenGLフレームの準備(OpenGLリソースの初期化、カメラの撮影開始は、initコールバック関数内で実行)\r
                Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
@@ -183,6 +181,10 @@ public class SingleARMarker implements GLEventListener, JmfCaptureListener
                //NyARToolkitの準備\r
                try {\r
                        this._glnya = new NyARGLUtil(this._gl);\r
+                       //プロセッサの準備\r
+                       this._processor=new MarkerProcessor(this._ar_param,this._cap_image.getBufferType(),this._glnya);\r
+                       this._processor.setARCodeTable(_code_table,16,80.0);\r
+\r
                        //カメラパラメータの計算\r
                        this._glnya.toCameraFrustumRH(this._ar_param,this._camera_projection);\r
                        //キャプチャ開始\r
@@ -208,32 +210,30 @@ public class SingleARMarker implements GLEventListener, JmfCaptureListener
                _gl.glMatrixMode(GL.GL_MODELVIEW);\r
                _gl.glLoadIdentity();\r
        }\r
-       private double[] __display_wk=new double[16];\r
        \r
        \r
        public void display(GLAutoDrawable drawable)\r
        {\r
-               NyARTransMatResult transmat_result = this._processor.transmat;\r
                if (!_cap_image.hasBuffer()) {\r
                        return;\r
                }\r
                // 背景を書く\r
                this._gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.\r
-               this._glnya.drawBackGround(this._cap_image, 1.0);                       \r
-               if(this._processor.current_code<0 || transmat_result==null){\r
-                       \r
-               }else{\r
-                       try{\r
-                               synchronized(this._sync_object){\r
+               this._glnya.drawBackGround(this._cap_image, 1.0);\r
+               //OnEnter,OnUpdateの間に、transmatに初回行列がストアされる実行されることを防ぎます。\r
+               synchronized(this._sync_object)\r
+               {\r
+                       if(this._processor.current_code<0){\r
+                               \r
+                       }else{\r
+                               try{\r
                                        // Projection transformation.\r
                                        this._gl.glMatrixMode(GL.GL_PROJECTION);\r
                                        this._gl.glLoadMatrixd(_camera_projection, 0);\r
                                        this._gl.glMatrixMode(GL.GL_MODELVIEW);\r
                                        // Viewing transformation.\r
                                        this._gl.glLoadIdentity();\r
-                                       // 変換行列をOpenGL形式に変換\r
-                                       this._glnya.toCameraViewRH(transmat_result, __display_wk);\r
-                                       this._gl.glLoadMatrixd(__display_wk, 0);\r
+                                       this._gl.glLoadMatrixd(this._processor.gltransmat, 0);\r
                                        // All other lighting and geometry goes here.\r
                                        this._gl.glPushMatrix();\r
                                        this._gl.glDisable(GL.GL_LIGHTING);\r
@@ -248,12 +248,12 @@ public class SingleARMarker implements GLEventListener, JmfCaptureListener
                                        this._gl.glRotatef(90,1.0f,0f,0f);\r
                                        this._panel.draw("MarkerId:"+this._processor.current_code,0.01f);\r
                                        this._gl.glPopMatrix();\r
+                                       Thread.sleep(1);// タスク実行権限を一旦渡す\r
+                               }catch(Exception e){\r
+                                       e.printStackTrace();\r
                                }\r
-                               Thread.sleep(1);// タスク実行権限を一旦渡す\r
-                       }catch(Exception e){\r
-                               e.printStackTrace();\r
                        }\r
-               }               \r
+               }\r
                return;\r
 \r
        }\r
index 0cfc624..142cbca 100644 (file)
@@ -72,15 +72,16 @@ class TextPanel
  */\r
 class MarkerProcessor extends SingleNyIdMarkerProcesser\r
 {      \r
-       private Object _sync_object=new Object();\r
-       public NyARTransMatResult transmat=null;\r
+       private NyARGLUtil _glnya;      \r
+       public double[] gltransmat=new double[16];\r
        public int current_id=-1;\r
 \r
-       public MarkerProcessor(NyARParam i_cparam,int i_width,int i_raster_format) throws NyARException\r
+       public MarkerProcessor(NyARParam i_cparam,int i_width,int i_raster_format,NyARGLUtil i_glutil) throws NyARException\r
        {\r
                //アプリケーションフレームワークの初期化\r
                super();\r
                initInstance(i_cparam,new NyIdMarkerDataEncoder_RawBit(),100,i_raster_format);\r
+               this._glnya=i_glutil;\r
                return;\r
        }\r
        /**\r
@@ -88,19 +89,16 @@ class MarkerProcessor extends SingleNyIdMarkerProcesser
         */\r
        protected void onEnterHandler(INyIdMarkerData i_code)\r
        {\r
-               synchronized(this._sync_object){\r
-                       NyIdMarkerData_RawBit code=(NyIdMarkerData_RawBit)i_code;\r
-                       if(code.length>4){\r
-                               //4バイト以上の時はint変換しない。\r
-                               this.current_id=-1;//undefined_id\r
-                       }else{\r
-                               this.current_id=0;\r
-                               //最大4バイト繋げて1個のint値に変換\r
-                               for(int i=0;i<code.length;i++){\r
-                                       this.current_id=(this.current_id<<8)|code.packet[i];\r
-                               }\r
+               NyIdMarkerData_RawBit code=(NyIdMarkerData_RawBit)i_code;\r
+               if(code.length>4){\r
+                       //4バイト以上の時はint変換しない。\r
+                       this.current_id=-1;//undefined_id\r
+               }else{\r
+                       this.current_id=0;\r
+                       //最大4バイト繋げて1個のint値に変換\r
+                       for(int i=0;i<code.length;i++){\r
+                               this.current_id=(this.current_id<<8)|code.packet[i];\r
                        }\r
-                       this.transmat=null;\r
                }\r
        }\r
        /**\r
@@ -108,20 +106,20 @@ class MarkerProcessor extends SingleNyIdMarkerProcesser
         */\r
        protected void onLeaveHandler()\r
        {\r
-               synchronized(this._sync_object){\r
-                       this.current_id=-1;\r
-                       this.transmat=null;\r
-               }\r
+               this.current_id=-1;\r
                return;\r
        }\r
        /**\r
         * アプリケーションフレームワークのハンドラ(マーカ更新)\r
+        * i_squareとresultの有効期間は個のコールバック関数が終了するまでです。\r
         */\r
        protected void onUpdateHandler(NyARSquare i_square, NyARTransMatResult result)\r
        {\r
-               synchronized(this._sync_object){\r
-                       this.transmat=result;\r
-               }\r
+               try{\r
+                       this._glnya.toCameraViewRH(result, this.gltransmat);\r
+               }catch(Exception e){\r
+                       e.printStackTrace();\r
+               }               \r
        }\r
 }\r
 \r
@@ -157,9 +155,6 @@ public class SingleNyIdMarker implements GLEventListener, JmfCaptureListener
                }\r
                this._capture.setOnCapture(this);\r
                this._cap_image = new GLNyARRaster_RGB(i_cparam,this._capture.getCaptureFormat());      \r
-\r
-               //プロセッサの準備\r
-               this._processor=new MarkerProcessor(i_cparam,100,this._cap_image.getBufferType());\r
                \r
                //OpenGLフレームの準備(OpenGLリソースの初期化、カメラの撮影開始は、initコールバック関数内で実行)\r
                Frame frame = new Frame("Java simpleLite with NyARToolkit");\r
@@ -194,6 +189,9 @@ public class SingleNyIdMarker implements GLEventListener, JmfCaptureListener
                        this._glnya = new NyARGLUtil(this._gl);\r
                        //カメラパラメータの計算\r
                        this._glnya.toCameraFrustumRH(this._ar_param,this._camera_projection);\r
+                       //プロセッサの準備\r
+                       this._processor=new MarkerProcessor(this._ar_param,100,this._cap_image.getBufferType(),this._glnya);\r
+                       \r
                        //キャプチャ開始\r
                        this._capture.start();\r
                } catch (Exception e) {\r
@@ -217,23 +215,22 @@ public class SingleNyIdMarker implements GLEventListener, JmfCaptureListener
                _gl.glMatrixMode(GL.GL_MODELVIEW);\r
                _gl.glLoadIdentity();\r
        }\r
-       private double[] __display_wk=new double[16];\r
        \r
        \r
        public void display(GLAutoDrawable drawable)\r
        {\r
-               NyARTransMatResult transmat_result = this._processor.transmat;\r
                if (!_cap_image.hasBuffer()) {\r
                        return;\r
                }\r
                // 背景を書く\r
                this._gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear the buffers for new frame.\r
                this._glnya.drawBackGround(this._cap_image, 1.0);                       \r
-               if(this._processor.current_id<0 || transmat_result==null){\r
-                       \r
-               }else{\r
-                       try{\r
-                               synchronized(this._sync_object){\r
+               synchronized(this._sync_object)\r
+               {\r
+                       if(this._processor.current_id<0){\r
+                               \r
+                       }else{\r
+                               try{\r
                                        // Projection transformation.\r
                                        this._gl.glMatrixMode(GL.GL_PROJECTION);\r
                                        this._gl.glLoadMatrixd(_camera_projection, 0);\r
@@ -241,12 +238,11 @@ public class SingleNyIdMarker implements GLEventListener, JmfCaptureListener
                                        // Viewing transformation.\r
                                        this._gl.glLoadIdentity();\r
                                        // 変換行列をOpenGL形式に変換\r
-                                       this._glnya.toCameraViewRH(transmat_result, __display_wk);\r
-                                       this._gl.glLoadMatrixd(__display_wk, 0);\r
+                                       this._gl.glLoadMatrixd(this._processor.gltransmat, 0);\r
                                        // All other lighting and geometry goes here.\r
                                        this._gl.glPushMatrix();\r
                                        this._gl.glDisable(GL.GL_LIGHTING);\r
-\r
+       \r
                                        \r
                                        //マーカのXZ平面をマーカの左上、表示開始位置を10cm上空へ。\r
                                        //くるーんくるん\r
@@ -257,10 +253,10 @@ public class SingleNyIdMarker implements GLEventListener, JmfCaptureListener
                                        this._gl.glRotatef(90,1.0f,0f,0f);\r
                                        this._panel.draw("MarkerId:"+this._processor.current_id,0.01f);\r
                                        this._gl.glPopMatrix();\r
+                                       Thread.sleep(1);// タスク実行権限を一旦渡す\r
+                               }catch(Exception e){\r
+                                       e.printStackTrace();\r
                                }\r
-                               Thread.sleep(1);// タスク実行権限を一旦渡す\r
-                       }catch(Exception e){\r
-                               e.printStackTrace();\r
                        }\r
                }               \r
                return;\r