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