1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * 4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 7cfd74d65d832137e20e193c960802afba73b5d38sm * 8cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 9cfd74d65d832137e20e193c960802afba73b5d38sm * 10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 15cfd74d65d832137e20e193c960802afba73b5d38sm */ 16cfd74d65d832137e20e193c960802afba73b5d38sm 17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 18cfd74d65d832137e20e193c960802afba73b5d38sm 19cfd74d65d832137e20e193c960802afba73b5d38sm/** 20cfd74d65d832137e20e193c960802afba73b5d38sm * Implements rendering of a drawable object for a game object. If a drawable is set on this 21cfd74d65d832137e20e193c960802afba73b5d38sm * component it will be passed to the renderer and drawn on the screen every frame. Drawable 22cfd74d65d832137e20e193c960802afba73b5d38sm * objects may be set to be "camera-relative" (meaning their screen position is relative to the 23cfd74d65d832137e20e193c960802afba73b5d38sm * location of the camera focus in the scene) or not (meaning their screen position is relative to 24cfd74d65d832137e20e193c960802afba73b5d38sm * the origin at the lower-left corner of the display). 25cfd74d65d832137e20e193c960802afba73b5d38sm */ 26cfd74d65d832137e20e193c960802afba73b5d38smpublic class RenderComponent extends GameComponent { 27cfd74d65d832137e20e193c960802afba73b5d38sm private DrawableObject mDrawable; 28cfd74d65d832137e20e193c960802afba73b5d38sm private int mPriority; 29cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mCameraRelative; 30cfd74d65d832137e20e193c960802afba73b5d38sm private Vector2 mPositionWorkspace; 31cfd74d65d832137e20e193c960802afba73b5d38sm private Vector2 mScreenLocation; 32cfd74d65d832137e20e193c960802afba73b5d38sm private Vector2 mDrawOffset; 33cfd74d65d832137e20e193c960802afba73b5d38sm 34cfd74d65d832137e20e193c960802afba73b5d38sm public RenderComponent() { 35cfd74d65d832137e20e193c960802afba73b5d38sm super(); 36cfd74d65d832137e20e193c960802afba73b5d38sm setPhase(ComponentPhases.DRAW.ordinal()); 37cfd74d65d832137e20e193c960802afba73b5d38sm 38cfd74d65d832137e20e193c960802afba73b5d38sm mPositionWorkspace = new Vector2(); 39cfd74d65d832137e20e193c960802afba73b5d38sm mScreenLocation = new Vector2(); 40cfd74d65d832137e20e193c960802afba73b5d38sm mDrawOffset = new Vector2(); 41cfd74d65d832137e20e193c960802afba73b5d38sm reset(); 42cfd74d65d832137e20e193c960802afba73b5d38sm } 43cfd74d65d832137e20e193c960802afba73b5d38sm 44cfd74d65d832137e20e193c960802afba73b5d38sm @Override 45cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 46cfd74d65d832137e20e193c960802afba73b5d38sm mPriority = 0; 47cfd74d65d832137e20e193c960802afba73b5d38sm mCameraRelative = true; 48cfd74d65d832137e20e193c960802afba73b5d38sm mDrawable = null; 49cfd74d65d832137e20e193c960802afba73b5d38sm mDrawOffset.zero(); 50cfd74d65d832137e20e193c960802afba73b5d38sm } 51cfd74d65d832137e20e193c960802afba73b5d38sm 52cfd74d65d832137e20e193c960802afba73b5d38sm public void update(float timeDelta, BaseObject parent) { 53cfd74d65d832137e20e193c960802afba73b5d38sm if (mDrawable != null) { 54cfd74d65d832137e20e193c960802afba73b5d38sm RenderSystem system = sSystemRegistry.renderSystem; 55cfd74d65d832137e20e193c960802afba73b5d38sm if (system != null) { 56cfd74d65d832137e20e193c960802afba73b5d38sm mPositionWorkspace.set(((GameObject)parent).getPosition()); 57cfd74d65d832137e20e193c960802afba73b5d38sm mPositionWorkspace.add(mDrawOffset); 58cfd74d65d832137e20e193c960802afba73b5d38sm if (mCameraRelative) { 59cfd74d65d832137e20e193c960802afba73b5d38sm CameraSystem camera = sSystemRegistry.cameraSystem; 60cfd74d65d832137e20e193c960802afba73b5d38sm ContextParameters params = sSystemRegistry.contextParameters; 61cfd74d65d832137e20e193c960802afba73b5d38sm mScreenLocation.x = (mPositionWorkspace.x - camera.getFocusPositionX() 62cfd74d65d832137e20e193c960802afba73b5d38sm + (params.gameWidth / 2)); 63cfd74d65d832137e20e193c960802afba73b5d38sm mScreenLocation.y = (mPositionWorkspace.y - camera.getFocusPositionY() 64cfd74d65d832137e20e193c960802afba73b5d38sm + (params.gameHeight / 2)); 65cfd74d65d832137e20e193c960802afba73b5d38sm } 66cfd74d65d832137e20e193c960802afba73b5d38sm // It might be better not to do culling here, as doing it in the render thread 67cfd74d65d832137e20e193c960802afba73b5d38sm // would allow us to have multiple views into the same scene and things like that. 68cfd74d65d832137e20e193c960802afba73b5d38sm // But at the moment significant CPU is being spent on sorting the list of objects 69cfd74d65d832137e20e193c960802afba73b5d38sm // to draw per frame, so I'm going to go ahead and cull early. 70cfd74d65d832137e20e193c960802afba73b5d38sm if (mDrawable.visibleAtPosition(mScreenLocation)) { 71cfd74d65d832137e20e193c960802afba73b5d38sm system.scheduleForDraw(mDrawable, mPositionWorkspace, mPriority, mCameraRelative); 72cfd74d65d832137e20e193c960802afba73b5d38sm } else if (mDrawable.getParentPool() != null) { 73cfd74d65d832137e20e193c960802afba73b5d38sm // Normally the render system releases drawable objects back to the factory 74cfd74d65d832137e20e193c960802afba73b5d38sm // pool, but in this case we're short-circuiting the render system, so we 75cfd74d65d832137e20e193c960802afba73b5d38sm // need to release the object manually. 76cfd74d65d832137e20e193c960802afba73b5d38sm sSystemRegistry.drawableFactory.release(mDrawable); 77cfd74d65d832137e20e193c960802afba73b5d38sm mDrawable = null; 78cfd74d65d832137e20e193c960802afba73b5d38sm } 79cfd74d65d832137e20e193c960802afba73b5d38sm } 80cfd74d65d832137e20e193c960802afba73b5d38sm } 81cfd74d65d832137e20e193c960802afba73b5d38sm } 82cfd74d65d832137e20e193c960802afba73b5d38sm 83cfd74d65d832137e20e193c960802afba73b5d38sm public DrawableObject getDrawable() { 84cfd74d65d832137e20e193c960802afba73b5d38sm return mDrawable; 85cfd74d65d832137e20e193c960802afba73b5d38sm } 86cfd74d65d832137e20e193c960802afba73b5d38sm 87cfd74d65d832137e20e193c960802afba73b5d38sm public void setDrawable(DrawableObject drawable) { 88cfd74d65d832137e20e193c960802afba73b5d38sm mDrawable = drawable; 89cfd74d65d832137e20e193c960802afba73b5d38sm } 90cfd74d65d832137e20e193c960802afba73b5d38sm 91cfd74d65d832137e20e193c960802afba73b5d38sm public void setPriority(int priority) { 92cfd74d65d832137e20e193c960802afba73b5d38sm mPriority = priority; 93cfd74d65d832137e20e193c960802afba73b5d38sm } 94cfd74d65d832137e20e193c960802afba73b5d38sm 95cfd74d65d832137e20e193c960802afba73b5d38sm public int getPriority() { 96cfd74d65d832137e20e193c960802afba73b5d38sm return mPriority; 97cfd74d65d832137e20e193c960802afba73b5d38sm } 98cfd74d65d832137e20e193c960802afba73b5d38sm 99cfd74d65d832137e20e193c960802afba73b5d38sm public void setCameraRelative(boolean relative) { 100cfd74d65d832137e20e193c960802afba73b5d38sm mCameraRelative = relative; 101cfd74d65d832137e20e193c960802afba73b5d38sm } 102cfd74d65d832137e20e193c960802afba73b5d38sm 103cfd74d65d832137e20e193c960802afba73b5d38sm public void setDrawOffset(float x, float y) { 104cfd74d65d832137e20e193c960802afba73b5d38sm mDrawOffset.set(x, y); 105cfd74d65d832137e20e193c960802afba73b5d38sm } 106cfd74d65d832137e20e193c960802afba73b5d38sm 107cfd74d65d832137e20e193c960802afba73b5d38sm} 108