blob: 878fffc904c0661c15f26f40dfec1d72d6a7af13 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.replica.replicaisland;
public class MotionBlurComponent extends GameComponent {
private static final int STEP_COUNT = 4;
private static final float STEP_DELAY = 0.1f;
private static final float OPACITY_STEP = 1.0f / (STEP_COUNT + 1);
private BlurRecord[] mHistory;
private RenderComponent mBlurTarget;
private float mStepDelay;
private int mCurrentStep;
private float mTimeSinceLastStep;
private int mTargetPriority;
private class BlurRecord {
public Vector2 position = new Vector2();
public Texture texture;
public int width;
public int height;
public int[] crop = new int[4];
}
public MotionBlurComponent() {
super();
mHistory = new BlurRecord[STEP_COUNT];
for (int x = 0; x < STEP_COUNT; x++) {
mHistory[x] = new BlurRecord();
}
reset();
setPhase(ComponentPhases.PRE_DRAW.ordinal());
}
@Override
public void reset() {
for (int x = 0; x < STEP_COUNT; x++) {
mHistory[x].texture = null;
mHistory[x].position.zero();
}
mStepDelay = STEP_DELAY;
mBlurTarget = null;
mCurrentStep = 0;
mTimeSinceLastStep = 0.0f;
}
public void setTarget(RenderComponent target) {
mBlurTarget = target;
}
@Override
public void update(float timeDelta, BaseObject parent) {
if (mBlurTarget != null) {
mTimeSinceLastStep += timeDelta;
if (mTimeSinceLastStep > mStepDelay) {
DrawableBitmap drawable = (DrawableBitmap)mBlurTarget.getDrawable();
if (drawable != null) {
Texture currentTexture = drawable.getTexture();
mTargetPriority = mBlurTarget.getPriority();
mHistory[mCurrentStep].texture = currentTexture;
mHistory[mCurrentStep].position.set(((GameObject)parent).getPosition());
mHistory[mCurrentStep].width = drawable.getWidth();
mHistory[mCurrentStep].height = drawable.getHeight();
final int[] drawableCrop = drawable.getCrop();
mHistory[mCurrentStep].crop[0] = drawableCrop[0];
mHistory[mCurrentStep].crop[1] = drawableCrop[1];
mHistory[mCurrentStep].crop[2] = drawableCrop[2];
mHistory[mCurrentStep].crop[3] = drawableCrop[3];
mCurrentStep = (mCurrentStep + 1) % STEP_COUNT;
mTimeSinceLastStep = 0.0f;
}
}
RenderSystem renderer = sSystemRegistry.renderSystem;
final int startStep = mCurrentStep > 0 ? mCurrentStep - 1 : STEP_COUNT - 1;
// draw each step
for (int x = 0; x < STEP_COUNT; x++) {
final int step = (startStep - x) < 0 ? (STEP_COUNT + (startStep - x)) : (startStep - x);
final BlurRecord record = mHistory[step];
if (record.texture != null) {
DrawableBitmap stepImage = sSystemRegistry.drawableFactory.allocateDrawableBitmap();
stepImage.setTexture(record.texture);
stepImage.setWidth(record.width);
stepImage.setHeight(record.height);
stepImage.setCrop(record.crop[0], record.crop[1], record.crop[2], -record.crop[3]);
final float opacity = (STEP_COUNT - x) * OPACITY_STEP;
stepImage.setOpacity(opacity);
renderer.scheduleForDraw(stepImage, record.position, mTargetPriority - (x + 1), true);
}
}
}
}
}