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
17package com.replica.replicaisland;
18
19public 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