// set render texture or colors if render texture is used (stills handled in AMTake)
        private void setRenderTexture(AMITarget itarget,  AMCameraFade cf, float frame, int firstTargetType, int secondTargetType, bool isReversed, 
	        AMCameraSwitcherKey action)
        {
            Camera firstCamera = (isReversed ? action.getCameraEnd(itarget) : action.getCamera(itarget));
            Camera secondCamera = (isReversed ? action.getCamera(itarget) : action.getCameraEnd(itarget));

            if(isReversed && frame == action.frame) {
                if(firstTargetType == 0) AMUtil.SetTopCamera(firstCamera, GetCachedCameras(itarget));
            }
            else {
                if(secondTargetType == 0) AMUtil.SetTopCamera(secondCamera, GetCachedCameras(itarget));
            }

            if(action.still || (firstTargetType != 0 && secondTargetType != 0)) return;

            bool isPro = AMTakeData.isProLicense;
            // first target is camera, set render texture
            if(firstTargetType == 0) {
                // if should update render texture
                if(/*!cf.tex ||*/ cf.shouldUpdateRenderTexture || (isPro && (!firstCamera.targetTexture || !cf.isRenderTextureSetupFor(firstCamera)/*|| firstCamera.targetTexture != cf.tex*/))) {
                    if(isPro) {
                        cf.setupRenderTexture(firstCamera);

                    }
                    else {
                        cf.useRenderTexture = false;
                        // show place-holder if non-pro
                        cf.colorTex = Color.white;
                        cf.hasColorTex = false;
                        cf.clearScreenTex();
                        cf.placeholder = true;
                    }
                }
            }
        }
            //private float[] mFadeParams;
            public void Apply(AMCameraSwitcherKey camSwitcher, int frameRate, AMITarget itarget, Camera[] allCameras, bool backwards)
            {
                if(mCamSwitcher != camSwitcher) {
                    mCamSwitcher = camSwitcher;

                    float[] fadeParams = mCamSwitcher.cameraFadeParameters.ToArray();
                    mIsReversed = AMUtil.isTransitionReversed(mCamSwitcher.type, fadeParams);
                    mCam = mCamSwitcher.getCamera(itarget);
                    mCamEnd = mCamSwitcher.getCameraEnd(itarget);
                    mAllCams = allCameras;

                    if(mCamSwitcher.cameraFadeType == (int)Fade.None) {
                        mCamSwitcher.CameraFadeNoneTargets(mCamSwitcher.typeEnd, mCamSwitcher.colorEnd, mCamEnd, mAllCams);
                        mCamSwitcher.CameraEnd(mIsReversed, mCam, mCamEnd, mAllCams);
                    }
                    else {
                        mCamSwitcher.CameraGenerateFadeTargets(mIsReversed, mCam, mCamEnd, mAllCams, fadeParams);
                    }
                }

                mBackwards = backwards;
            }
        private void previewCameraFade(AMITarget itarget, float frame, AMCameraSwitcherKey action)
        {
            // if transition is None, show end camera / color
            if(action.cameraFadeType == (int)AMCameraSwitcherKey.Fade.None) {
                // reset camera fade if visible
                // camera
                if(action.typeEnd == 0) {
                    Camera endCam = action.getCameraEnd(itarget);
                    if(endCam) AMUtil.SetTopCamera(endCam, GetCachedCameras(itarget));
                    AMCameraFade.reset();
                }
                else {
                    showColor(action.colorEnd);
                }
                return;
            }
            // Get camerafade
            AMCameraFade cf = AMCameraFade.getCameraFade();
            cf.isReset = false;
            bool isReversed = action.isReversed();
            int firstTargetType = (isReversed ? action.typeEnd : action.type);
            int secondTargetType = (isReversed ? action.type : action.typeEnd);
            // Set render texture or colors if render texture is used
            setRenderTexture(itarget, cf, frame, firstTargetType, secondTargetType, isReversed, action);
            setColors(cf, firstTargetType, secondTargetType, isReversed, action);

            if(cf.irisShape != action.irisShape) cf.irisShape = action.irisShape;
            cf.mode = action.cameraFadeType;
            cf.setupMaterials();
            cf.r = action.cameraFadeParameters.ToArray();

            float percentage = (float)(frame-action.frame)/(float)(action.endFrame-action.frame);
            float value;

            // calculate and set value
            if(action.hasCustomEase()) {
                value = AMUtil.EaseCustom(1.0f, -1.0f, percentage, action.easeCurve);
            }
            else {
                TweenDelegate.EaseFunc ease = AMUtil.GetEasingFunction((EaseType)action.easeType);
                value = ease(percentage, 1.0f, -1.0f, 1.0f, action.amplitude, action.period);
            }

            cf.value = value;
            cf.percent = percentage;
        }