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