void DrawKeyFrame(ref float[] mvpMatrix)
        {
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);

            GL.UseProgram(mKeyframe_Program_GL_ID);

            RenderUtils.CheckGLError();

            var vertexHandle       = GL.GetAttribLocation(mKeyframe_Program_GL_ID, "vertexPosition");
            var textureCoordHandle = GL.GetAttribLocation(mKeyframe_Program_GL_ID, "vertexTexCoord");
            var mvpMatrixHandle    = GL.GetUniformLocation(mKeyframe_Program_GL_ID, "modelViewProjectionMatrix");
            var texSampler2DHandle = GL.GetUniformLocation(mKeyframe_Program_GL_ID, "texSampler2D");

            RenderUtils.CheckGLError();

            GL.VertexAttribPointer(vertexHandle, 3, VertexAttribPointerType.Float, false, 0, mVertices);
            GL.VertexAttribPointer(textureCoordHandle, 2, VertexAttribPointerType.Float, false, 0, mTexCoords);


            GL.EnableVertexAttribArray(vertexHandle);
            GL.EnableVertexAttribArray(textureCoordHandle);

            RenderUtils.CheckGLError();

            GL.ActiveTexture(TextureUnit.Texture0);
            GL.BindTexture(TextureTarget.Texture2D, mKeyframeTexture_GL_ID);
            GL.Uniform1(texSampler2DHandle, 0);

            RenderUtils.CheckGLError();

            GL.Ext.PushGroupMarker(0, "Draw Pikkart KeyFrame");

            GL.UniformMatrix4(mvpMatrixHandle, 1, false, mvpMatrix);

            GL.DrawElements(BeginMode.Triangles, mIndices_Number, DrawElementsType.UnsignedShort, mIndex);

            GL.Ext.PopGroupMarker();

            RenderUtils.CheckGLError();

            GL.DisableVertexAttribArray(vertexHandle);
            GL.DisableVertexAttribArray(textureCoordHandle);

            RenderUtils.CheckGLError();

            GL.UseProgram(0);
            GL.Disable(EnableCap.Blend);

            RenderUtils.CheckGLError();
        }
        public bool InitMesh(string movieUrl, string keyFrameUrl, int seekPosition,
                             bool autoStart, PikkartVideoPlayer videoPlayerParam)
        {
            GenerateMesh();

            if (videoPlayer == null)
            {
                videoPlayer = new PikkartVideoPlayer();
            }
            else
            {
                videoPlayer = videoPlayerParam;
            }
            CGSize dims = CGSize.Empty;

            mMovieUrl = movieUrl;
            mKeyframeTexture_GL_ID = RenderUtils.LoadTextureFromFileName(keyFrameUrl, out dims);
            keyframeAspectRatio    = (float)(dims.Height / dims.Width);
            mSeekPosition          = seekPosition;
            mAutostart             = autoStart;

            string   mediaBundlePath = NSBundle.MainBundle.BundlePath + "/media.bundle";
            NSBundle mediaBundle     = new NSBundle(mediaBundlePath);

            mIconBusyTexture_GL_ID  = RenderUtils.LoadTextureFromFileName(mediaBundle.PathForResource("busy", "png"));
            mIconPlayTexture_GL_ID  = RenderUtils.LoadTextureFromFileName(mediaBundle.PathForResource("play", "png"));
            mIconErrorTexture_GL_ID = RenderUtils.LoadTextureFromFileName(mediaBundle.PathForResource("error", "png"));

            mKeyframe_Program_GL_ID = RenderUtils.CreateProgram(VERTEX_SHADER, KEYFRAME_FRAGMENT_SHADER);
            mVideo_Program_GL_ID    = RenderUtils.CreateProgram(VERTEX_SHADER, VIDEO_FRAGMENT_SHADER);
            mVideoTexture_GL_ID     = RenderUtils.CreateVideoTexture();

            if (mVideoTexture_GL_ID != 0)
            {
                videoPlayer.TextureHandle = mVideoTexture_GL_ID;
                videoPlayer.Load(movieUrl, mAutostart, seekPosition);
            }

            return(true);
        }
예제 #3
0
        internal static int BuildTexture(demoImage image)
        {
            int texName = 0;

            // Create a texture object to apply to model
            unsafe  {
                GL.GenTextures(1, &texName);
                GL.BindTexture(TextureTarget.Texture2D, texName);

                // Set up filter and wrap modes for this texture object
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (float)All.Nearest);


                // Allocate and load image data into texture
                GL.TexImage2D(TextureTarget.Texture2D, 0, (PixelInternalFormat)image.format,
                              (int)image.width, (int)image.height, 0,
                              image.format, image.type, Marshal.UnsafeAddrOfPinnedArrayElement(image.data, 0));
                RenderUtils.CheckGLError();
            }

            return(texName);
        }
        void DrawVideo(ref float[] mvpMatrix)
        {
            GL.UseProgram(mVideo_Program_GL_ID);

            var vertexHandle       = GL.GetAttribLocation(mVideo_Program_GL_ID, "vertexPosition");
            var textureCoordHandle = GL.GetAttribLocation(mVideo_Program_GL_ID, "vertexTexCoord");
            var mvpMatrixHandle    = GL.GetUniformLocation(mVideo_Program_GL_ID, "modelViewProjectionMatrix");
            var texSampler2DHandle = GL.GetUniformLocation(mVideo_Program_GL_ID, "texSamplerOES");

            RenderUtils.CheckGLError();

            GL.VertexAttribPointer(vertexHandle, 3, VertexAttribPointerType.Float, false, 0, mVertices);
            GL.VertexAttribPointer(textureCoordHandle, 2, VertexAttribPointerType.Float, false, 0, videoTextureCoordsTransformed);

            GL.EnableVertexAttribArray(vertexHandle);
            GL.EnableVertexAttribArray(textureCoordHandle);

            RenderUtils.CheckGLError();

            GL.ActiveTexture(TextureUnit.Texture0);
            GL.BindTexture(TextureTarget.Texture2D, mVideoTexture_GL_ID);
            GL.Uniform1(texSampler2DHandle, 0);

            RenderUtils.CheckGLError();

            GL.UniformMatrix4(mvpMatrixHandle, 1, false, mvpMatrix);

            // Render
            GL.DrawElements(BeginMode.Triangles, mIndices_Number, DrawElementsType.UnsignedShort, mIndex);

            RenderUtils.CheckGLError();

            GL.UseProgram(0);

            GL.DisableVertexAttribArray(vertexHandle);
            GL.DisableVertexAttribArray(textureCoordHandle);

            RenderUtils.CheckGLError();
        }
        public override void DrawInRect(GLKView view, CoreGraphics.CGRect rect)
        {
            if (!isActive())
            {
                return;
            }
            UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;
            CGSize size;

            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            if (firstGLUpdate == false)
            {
                ApplyCameraGlOrientation(orientation);
                firstGLUpdate = true;
            }

            size = new CGSize(ViewportWidth, ViewportHeight);
            RenderCamera(size, Angle);

            if (isTracking())
            {
                if (CurrentMarker != null)
                {
                    if (CurrentMarker.Id == "3_543")
                    {
                        float[] mvMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                        float[] pMatrix  = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                        if (computeModelViewProjectionMatrix(ref mvMatrix, ref pMatrix))
                        {
                            _videoMesh.DrawMesh(ref mvMatrix, ref pMatrix);
                            RenderUtils.CheckGLError();
                        }
                    }
                }
            }

            GL.Finish();
        }
        public void DrawMesh(ref float [] modelView, ref float[] projection)
        {
            var viewCtrl = _parentCtrl as RecognitionViewController;

            if (viewCtrl != null)
            {
                var currentStatus = PKTVIDEO_STATE.NOT_READY;
                if (mPikkartVideoPlayer != null)
                {
                    currentStatus = mPikkartVideoPlayer.Status;
                    if (currentStatus == PKTVIDEO_STATE.PLAYING)
                    {
                        mPikkartVideoPlayer.UpdateVideoData();
                        videoAspectRatio = (float)(mPikkartVideoPlayer.Size.Height / mPikkartVideoPlayer.Size.Width);
                    }
                }

                PKTMarker currentMarker = viewCtrl.CurrentMarker;
                if (currentMarker != null)
                {
                    var markerSize = new CGSize(currentMarker.Width, currentMarker.Height);
                    GL.Enable(EnableCap.DepthTest);
                    GL.Disable(EnableCap.CullFace);

                    if ((currentStatus == PKTVIDEO_STATE.READY) ||
                        (currentStatus == PKTVIDEO_STATE.REACHED_END) ||
                        (currentStatus == PKTVIDEO_STATE.NOT_READY) ||
                        (currentStatus == PKTVIDEO_STATE.ERROR))
                    {
                        float[] scaleMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                        RenderUtils.MtxLoadIdentity(ref scaleMatrix);
                        scaleMatrix[0]  = (float)markerSize.Width;
                        scaleMatrix[5]  = (float)(markerSize.Width * keyframeAspectRatio);
                        scaleMatrix[10] = (float)markerSize.Width;

                        float[] temp_mv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                        RenderUtils.MatrixMultiply(4, 4, ref modelView, 4, 4, ref scaleMatrix, ref temp_mv);

                        float[] temp_mvp = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                        RenderUtils.MatrixMultiply(4, 4, ref projection, 4, 4, ref temp_mv, ref temp_mvp);

                        float[] mvpMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                        RenderUtils.MtxTranspose(ref temp_mvp,
                                                 ref mvpMatrix);

                        DrawKeyFrame(ref mvpMatrix);
                    }
                    else
                    {
                        float[] scaleMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                        RenderUtils.MtxLoadIdentity(ref scaleMatrix);
                        scaleMatrix[0]  = (float)(markerSize.Width);
                        scaleMatrix[5]  = (float)(markerSize.Width * videoAspectRatio);
                        scaleMatrix[10] = (float)(markerSize.Width);


                        float[] temp_mv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                        RenderUtils.MatrixMultiply(4, 4, ref modelView, 4, 4, ref scaleMatrix, ref temp_mv);


                        float[] temp_mvp = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                        RenderUtils.MatrixMultiply(4, 4, ref projection, 4, 4, ref temp_mv, ref temp_mvp);

                        float[] mvpMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                        RenderUtils.MtxTranspose(ref temp_mvp,
                                                 ref mvpMatrix);

                        DrawVideo(ref mvpMatrix);
                    }

                    if ((currentStatus == PKTVIDEO_STATE.READY) ||
                        (currentStatus == PKTVIDEO_STATE.REACHED_END) ||
                        (currentStatus == PKTVIDEO_STATE.PAUSED) ||
                        (currentStatus == PKTVIDEO_STATE.NOT_READY) ||
                        (currentStatus == PKTVIDEO_STATE.ERROR))
                    {
                        float[] translateMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                        RenderUtils.MtxLoadIdentity(ref translateMatrix);
                        //scale a bit
                        translateMatrix[0]  = 0.4f;
                        translateMatrix[5]  = 0.4f;
                        translateMatrix[10] = 0.4f;
                        //translate a bit
                        translateMatrix[3]  = 0;
                        translateMatrix[7]  = 0.45f;
                        translateMatrix[11] = -0.05f;

                        float[] temp_mv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                        RenderUtils.MatrixMultiply(4, 4, ref modelView, 4, 4, ref translateMatrix, ref temp_mv);

                        float[] temp_mvp = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                        RenderUtils.MatrixMultiply(4, 4, ref projection, 4, 4, ref temp_mv, ref temp_mvp);

                        float[] mvpMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

                        RenderUtils.MtxTranspose(ref temp_mvp,
                                                 ref mvpMatrix);

                        DrawIcon(ref mvpMatrix, currentStatus);
                    }
                    RenderUtils.CheckGLError();
                }
            }
        }
        void DrawIcon(ref float[] mvpMatrix, PikkartVideoPlayerBindingLibrary.PKTVIDEO_STATE status)
        {
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);

            GL.UseProgram(mKeyframe_Program_GL_ID);


            RenderUtils.CheckGLError();

            var vertexHandle       = GL.GetAttribLocation(mKeyframe_Program_GL_ID, "vertexPosition");
            var textureCoordHandle = GL.GetAttribLocation(mKeyframe_Program_GL_ID, "vertexTexCoord");
            var mvpMatrixHandle    = GL.GetUniformLocation(mKeyframe_Program_GL_ID, "modelViewProjectionMatrix");
            var texSampler2DHandle = GL.GetUniformLocation(mKeyframe_Program_GL_ID, "texSampler2D");

            GL.VertexAttribPointer(vertexHandle, 3, VertexAttribPointerType.Float, false, 0, mVertices);
            GL.VertexAttribPointer(textureCoordHandle, 2, VertexAttribPointerType.Float, false, 0, mTexCoords);

            RenderUtils.CheckGLError();

            GL.EnableVertexAttribArray(vertexHandle);
            GL.EnableVertexAttribArray(textureCoordHandle);

            RenderUtils.CheckGLError();

            GL.ActiveTexture(TextureUnit.Texture0);

            switch ((long)status)
            {
            case 0:        //end
                GL.BindTexture(TextureTarget.Texture2D, mIconPlayTexture_GL_ID);
                break;

            case 1:        //pasued
                GL.BindTexture(TextureTarget.Texture2D, mIconPlayTexture_GL_ID);
                break;

            case 2:        //stopped
                GL.BindTexture(TextureTarget.Texture2D, mIconPlayTexture_GL_ID);
                break;

            case 3:        //playing
                GL.BindTexture(TextureTarget.Texture2D, mIconPlayTexture_GL_ID);
                break;

            case 4:        //ready
                GL.BindTexture(TextureTarget.Texture2D, mIconPlayTexture_GL_ID);
                break;

            case 5:        //not ready
                GL.BindTexture(TextureTarget.Texture2D, mIconBusyTexture_GL_ID);
                break;

            case 6:        //buffering
                GL.BindTexture(TextureTarget.Texture2D, mIconBusyTexture_GL_ID);
                break;

            case 7:        //error
                GL.BindTexture(TextureTarget.Texture2D, mIconErrorTexture_GL_ID);
                break;

            default:
                GL.BindTexture(TextureTarget.Texture2D, mIconBusyTexture_GL_ID);
                break;
            }
            RenderUtils.CheckGLError();

            GL.Uniform1(texSampler2DHandle, 0);

            GL.UniformMatrix4(mvpMatrixHandle, 1, false, mvpMatrix);

            RenderUtils.CheckGLError();

            GL.DrawElements(BeginMode.Triangles, mIndices_Number, DrawElementsType.UnsignedShort, mIndex);


            RenderUtils.CheckGLError();
            GL.UseProgram(0);

            GL.Disable(EnableCap.Blend);
            GL.DisableVertexAttribArray(vertexHandle);
            GL.DisableVertexAttribArray(textureCoordHandle);

            RenderUtils.CheckGLError();
        }
        bool computeProjectionMatrix(ref float[] mvpMatrix)
        {
            float w = 640, h = 480;

            RenderUtils.MtxLoadIdentity(ref mvpMatrix);

            float ar = (float)(ViewportHeight / ViewportWidth);

            if (ViewportHeight > ViewportWidth)
            {
                ar = 1f / ar;
            }

            float h1 = h, w1 = w;

            if (ar < h / w)
            {
                h1 = w * ar;
            }
            else
            {
                w1 = h / ar;
            }

            float a = 0, b = 0;

            switch (Angle)
            {
            case 0:
                a = 1; b = 0;
                break;

            case 90:
                a = 0; b = 1;
                break;

            case 180:
                a = -1; b = 0;
                break;

            case 270:
                a = 0; b = -1;
                break;

            default: break;
            }

            float[] angleMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

            angleMatrix[0]  = a; angleMatrix[1] = b; angleMatrix[2] = 0; angleMatrix[3] = 0;
            angleMatrix[4]  = -b; angleMatrix[5] = a; angleMatrix[6] = 0; angleMatrix[7] = 0;
            angleMatrix[8]  = 0; angleMatrix[9] = 0; angleMatrix[10] = 1; angleMatrix[11] = 0;
            angleMatrix[12] = 0; angleMatrix[13] = 0; angleMatrix[14] = 0; angleMatrix[15] = 1;

            IntPtr tempPtr = IntPtr.Zero;

            GetCurrentProjectionMatrix(ref tempPtr);

            float[] projectionMatrix = new float[16];

            Marshal.Copy(tempPtr, projectionMatrix, 0, 16);

            projectionMatrix[5] = projectionMatrix[5] * (h / h1);


            RenderUtils.MatrixMultiply(4, 4, ref angleMatrix, 4, 4, ref projectionMatrix, ref mvpMatrix);

            return(false);
        }
        bool computeModelViewProjectionMatrix(ref float[] mvpMatrix)
        {
            float w = 640f, h = 480f;

            RenderUtils.MtxLoadIdentity(ref mvpMatrix);

            float ar = (float)(ViewportHeight / ViewportWidth);

            if (ViewportHeight > ViewportWidth)
            {
                ar = 1f / ar;
            }

            float h1 = h, w1 = w;

            if (ar < h / w)
            {
                h1 = (float)(w * ar);
            }
            else
            {
                w1 = (float)(h / ar);
            }

            float a = 0, b = 0;

            switch (Angle)
            {
            case 0:
                a = 1; b = 0;
                break;

            case 90:
                a = 0; b = 1;
                break;

            case 180:
                a = -1; b = 0;
                break;

            case 270:
                a = 0; b = -1;
                break;

            default: break;
            }

            float [] angleMatrix = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

            angleMatrix[0]  = a; angleMatrix[1] = b; angleMatrix[2] = 0; angleMatrix[3] = 0;
            angleMatrix[4]  = -b; angleMatrix[5] = a; angleMatrix[6] = 0; angleMatrix[7] = 0;
            angleMatrix[8]  = 0; angleMatrix[9] = 0; angleMatrix[10] = 1f; angleMatrix[11] = 0f;
            angleMatrix[12] = 0f; angleMatrix[13] = 0f; angleMatrix[14] = 0f; angleMatrix[15] = 1f;

            IntPtr tempPtr = IntPtr.Zero;

            GetCurrentProjectionMatrix(ref tempPtr);

            float[] projectionMatrix = new float[16];

            Marshal.Copy(tempPtr, projectionMatrix, 0, 16);

            projectionMatrix[5] = projectionMatrix[5] * (h / h1);

            float[] correctedProjection = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

            RenderUtils.MatrixMultiply(4, 4, ref angleMatrix, 4, 4, ref projectionMatrix, ref correctedProjection);

            if (isTracking())
            {
                IntPtr  modelviewMatrixPtr = IntPtr.Zero;
                float[] temp_mvp           = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
                float[] modelviewMatrix    = new float[16];

                GetCurrentModelViewMatrix(ref modelviewMatrixPtr);

                Marshal.Copy(modelviewMatrixPtr, modelviewMatrix, 0, 16);

                RenderUtils.MatrixMultiply(4, 4, ref correctedProjection, 4, 4, ref modelviewMatrix, ref temp_mvp);
                RenderUtils.MtxTranspose(ref temp_mvp, ref mvpMatrix);

                return(true);
            }

            return(false);
        }