xref: /aosp_15_r20/external/replicaisland/src/com/replica/replicaisland/MotionBlurComponent.java (revision 5eae8ebb3c5756e41e77a1f7201fcf94b0eade1f)
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