1*5eae8ebbSCole Faust /* 2*5eae8ebbSCole Faust * Copyright (C) 2010 The Android Open Source Project 3*5eae8ebbSCole Faust * 4*5eae8ebbSCole Faust * Licensed under the Apache License, Version 2.0 (the "License"); 5*5eae8ebbSCole Faust * you may not use this file except in compliance with the License. 6*5eae8ebbSCole Faust * You may obtain a copy of the License at 7*5eae8ebbSCole Faust * 8*5eae8ebbSCole Faust * http://www.apache.org/licenses/LICENSE-2.0 9*5eae8ebbSCole Faust * 10*5eae8ebbSCole Faust * Unless required by applicable law or agreed to in writing, software 11*5eae8ebbSCole Faust * distributed under the License is distributed on an "AS IS" BASIS, 12*5eae8ebbSCole Faust * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*5eae8ebbSCole Faust * See the License for the specific language governing permissions and 14*5eae8ebbSCole Faust * limitations under the License. 15*5eae8ebbSCole Faust */ 16*5eae8ebbSCole Faust 17*5eae8ebbSCole Faust package com.replica.replicaisland; 18*5eae8ebbSCole Faust 19*5eae8ebbSCole Faust public class MotionBlurComponent extends GameComponent { 20*5eae8ebbSCole Faust private static final int STEP_COUNT = 4; 21*5eae8ebbSCole Faust private static final float STEP_DELAY = 0.1f; 22*5eae8ebbSCole Faust private static final float OPACITY_STEP = 1.0f / (STEP_COUNT + 1); 23*5eae8ebbSCole Faust private BlurRecord[] mHistory; 24*5eae8ebbSCole Faust private RenderComponent mBlurTarget; 25*5eae8ebbSCole Faust private float mStepDelay; 26*5eae8ebbSCole Faust private int mCurrentStep; 27*5eae8ebbSCole Faust private float mTimeSinceLastStep; 28*5eae8ebbSCole Faust private int mTargetPriority; 29*5eae8ebbSCole Faust 30*5eae8ebbSCole Faust private class BlurRecord { 31*5eae8ebbSCole Faust public Vector2 position = new Vector2(); 32*5eae8ebbSCole Faust public Texture texture; 33*5eae8ebbSCole Faust public int width; 34*5eae8ebbSCole Faust public int height; 35*5eae8ebbSCole Faust public int[] crop = new int[4]; 36*5eae8ebbSCole Faust } MotionBlurComponent()37*5eae8ebbSCole Faust public MotionBlurComponent() { 38*5eae8ebbSCole Faust super(); 39*5eae8ebbSCole Faust mHistory = new BlurRecord[STEP_COUNT]; 40*5eae8ebbSCole Faust for (int x = 0; x < STEP_COUNT; x++) { 41*5eae8ebbSCole Faust mHistory[x] = new BlurRecord(); 42*5eae8ebbSCole Faust } 43*5eae8ebbSCole Faust reset(); 44*5eae8ebbSCole Faust setPhase(ComponentPhases.PRE_DRAW.ordinal()); 45*5eae8ebbSCole Faust } 46*5eae8ebbSCole Faust 47*5eae8ebbSCole Faust @Override reset()48*5eae8ebbSCole Faust public void reset() { 49*5eae8ebbSCole Faust for (int x = 0; x < STEP_COUNT; x++) { 50*5eae8ebbSCole Faust mHistory[x].texture = null; 51*5eae8ebbSCole Faust mHistory[x].position.zero(); 52*5eae8ebbSCole Faust } 53*5eae8ebbSCole Faust mStepDelay = STEP_DELAY; 54*5eae8ebbSCole Faust mBlurTarget = null; 55*5eae8ebbSCole Faust mCurrentStep = 0; 56*5eae8ebbSCole Faust mTimeSinceLastStep = 0.0f; 57*5eae8ebbSCole Faust } 58*5eae8ebbSCole Faust setTarget(RenderComponent target)59*5eae8ebbSCole Faust public void setTarget(RenderComponent target) { 60*5eae8ebbSCole Faust mBlurTarget = target; 61*5eae8ebbSCole Faust } 62*5eae8ebbSCole Faust 63*5eae8ebbSCole Faust @Override update(float timeDelta, BaseObject parent)64*5eae8ebbSCole Faust public void update(float timeDelta, BaseObject parent) { 65*5eae8ebbSCole Faust if (mBlurTarget != null) { 66*5eae8ebbSCole Faust mTimeSinceLastStep += timeDelta; 67*5eae8ebbSCole Faust if (mTimeSinceLastStep > mStepDelay) { 68*5eae8ebbSCole Faust DrawableBitmap drawable = (DrawableBitmap)mBlurTarget.getDrawable(); 69*5eae8ebbSCole Faust if (drawable != null) { 70*5eae8ebbSCole Faust Texture currentTexture = drawable.getTexture(); 71*5eae8ebbSCole Faust mTargetPriority = mBlurTarget.getPriority(); 72*5eae8ebbSCole Faust mHistory[mCurrentStep].texture = currentTexture; 73*5eae8ebbSCole Faust mHistory[mCurrentStep].position.set(((GameObject)parent).getPosition()); 74*5eae8ebbSCole Faust mHistory[mCurrentStep].width = drawable.getWidth(); 75*5eae8ebbSCole Faust mHistory[mCurrentStep].height = drawable.getHeight(); 76*5eae8ebbSCole Faust final int[] drawableCrop = drawable.getCrop(); 77*5eae8ebbSCole Faust mHistory[mCurrentStep].crop[0] = drawableCrop[0]; 78*5eae8ebbSCole Faust mHistory[mCurrentStep].crop[1] = drawableCrop[1]; 79*5eae8ebbSCole Faust mHistory[mCurrentStep].crop[2] = drawableCrop[2]; 80*5eae8ebbSCole Faust mHistory[mCurrentStep].crop[3] = drawableCrop[3]; 81*5eae8ebbSCole Faust mCurrentStep = (mCurrentStep + 1) % STEP_COUNT; 82*5eae8ebbSCole Faust mTimeSinceLastStep = 0.0f; 83*5eae8ebbSCole Faust } 84*5eae8ebbSCole Faust } 85*5eae8ebbSCole Faust 86*5eae8ebbSCole Faust 87*5eae8ebbSCole Faust RenderSystem renderer = sSystemRegistry.renderSystem; 88*5eae8ebbSCole Faust 89*5eae8ebbSCole Faust 90*5eae8ebbSCole Faust final int startStep = mCurrentStep > 0 ? mCurrentStep - 1 : STEP_COUNT - 1; 91*5eae8ebbSCole Faust // draw each step 92*5eae8ebbSCole Faust for (int x = 0; x < STEP_COUNT; x++) { 93*5eae8ebbSCole Faust final int step = (startStep - x) < 0 ? (STEP_COUNT + (startStep - x)) : (startStep - x); 94*5eae8ebbSCole Faust final BlurRecord record = mHistory[step]; 95*5eae8ebbSCole Faust if (record.texture != null) { 96*5eae8ebbSCole Faust DrawableBitmap stepImage = sSystemRegistry.drawableFactory.allocateDrawableBitmap(); 97*5eae8ebbSCole Faust stepImage.setTexture(record.texture); 98*5eae8ebbSCole Faust stepImage.setWidth(record.width); 99*5eae8ebbSCole Faust stepImage.setHeight(record.height); 100*5eae8ebbSCole Faust stepImage.setCrop(record.crop[0], record.crop[1], record.crop[2], -record.crop[3]); 101*5eae8ebbSCole Faust final float opacity = (STEP_COUNT - x) * OPACITY_STEP; 102*5eae8ebbSCole Faust stepImage.setOpacity(opacity); 103*5eae8ebbSCole Faust 104*5eae8ebbSCole Faust 105*5eae8ebbSCole Faust renderer.scheduleForDraw(stepImage, record.position, mTargetPriority - (x + 1), true); 106*5eae8ebbSCole Faust } 107*5eae8ebbSCole Faust } 108*5eae8ebbSCole Faust } 109*5eae8ebbSCole Faust } 110*5eae8ebbSCole Faust } 111