public void startAnimation() {
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                animator = ValueAnimator.ofFloat(0, -Const.PLANE_HEIGHT * 2); // plane height
                animator.setDuration(mAnimationDuration);
                animator.setInterpolator(new AccelerateDecelerateInterpolator());

                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        float value = (float) animation.getAnimatedValue();
                        deltaPosX = value;
                        mGlSurfaceView.requestRender();
                    }
                });
                animator.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        mGlSurfaceView.requestRender();
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        mListener.onAnimationFinished();
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });

                animator.start();

            }
        });
    }
Allocate storage for the final combined matrix. This will be passed into the shader program.
library/src/main/java/com/yalantis/starwars/render/StarWarsRenderer.java