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