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 * ObjectManagers are "group nodes" in the game graph. They contain child objects, and updating 21cfd74d65d832137e20e193c960802afba73b5d38sm * an object manager invokes update on its children. ObjectManagers themselves are derived from 22cfd74d65d832137e20e193c960802afba73b5d38sm * BaseObject, so they may be strung together into a hierarchy of objects. ObjectManager may 23cfd74d65d832137e20e193c960802afba73b5d38sm * be specialized to implement special types of traversals (e.g. PhasedObjectManager sorts its 24cfd74d65d832137e20e193c960802afba73b5d38sm * children). 25cfd74d65d832137e20e193c960802afba73b5d38sm */ 26cfd74d65d832137e20e193c960802afba73b5d38smpublic class ObjectManager extends BaseObject { 27cfd74d65d832137e20e193c960802afba73b5d38sm protected static final int DEFAULT_ARRAY_SIZE = 64; 28cfd74d65d832137e20e193c960802afba73b5d38sm 29cfd74d65d832137e20e193c960802afba73b5d38sm private FixedSizeArray<BaseObject> mObjects; 30cfd74d65d832137e20e193c960802afba73b5d38sm private FixedSizeArray<BaseObject> mPendingAdditions; 31cfd74d65d832137e20e193c960802afba73b5d38sm private FixedSizeArray<BaseObject> mPendingRemovals; 32cfd74d65d832137e20e193c960802afba73b5d38sm 33cfd74d65d832137e20e193c960802afba73b5d38sm public ObjectManager() { 34cfd74d65d832137e20e193c960802afba73b5d38sm super(); 35cfd74d65d832137e20e193c960802afba73b5d38sm mObjects = new FixedSizeArray<BaseObject>(DEFAULT_ARRAY_SIZE); 36cfd74d65d832137e20e193c960802afba73b5d38sm mPendingAdditions = new FixedSizeArray<BaseObject>(DEFAULT_ARRAY_SIZE); 37cfd74d65d832137e20e193c960802afba73b5d38sm mPendingRemovals = new FixedSizeArray<BaseObject>(DEFAULT_ARRAY_SIZE); 38cfd74d65d832137e20e193c960802afba73b5d38sm } 39cfd74d65d832137e20e193c960802afba73b5d38sm 40cfd74d65d832137e20e193c960802afba73b5d38sm public ObjectManager(int arraySize) { 41cfd74d65d832137e20e193c960802afba73b5d38sm super(); 42cfd74d65d832137e20e193c960802afba73b5d38sm mObjects = new FixedSizeArray<BaseObject>(arraySize); 43cfd74d65d832137e20e193c960802afba73b5d38sm mPendingAdditions = new FixedSizeArray<BaseObject>(arraySize); 44cfd74d65d832137e20e193c960802afba73b5d38sm mPendingRemovals = new FixedSizeArray<BaseObject>(arraySize); 45cfd74d65d832137e20e193c960802afba73b5d38sm } 46cfd74d65d832137e20e193c960802afba73b5d38sm 47cfd74d65d832137e20e193c960802afba73b5d38sm @Override 48cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 49cfd74d65d832137e20e193c960802afba73b5d38sm commitUpdates(); 50cfd74d65d832137e20e193c960802afba73b5d38sm final int count = mObjects.getCount(); 51cfd74d65d832137e20e193c960802afba73b5d38sm for (int i = 0; i < count; i++) { 52cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject object = mObjects.get(i); 53cfd74d65d832137e20e193c960802afba73b5d38sm object.reset(); 54cfd74d65d832137e20e193c960802afba73b5d38sm } 55cfd74d65d832137e20e193c960802afba73b5d38sm } 56cfd74d65d832137e20e193c960802afba73b5d38sm 57cfd74d65d832137e20e193c960802afba73b5d38sm public void commitUpdates() { 58cfd74d65d832137e20e193c960802afba73b5d38sm final int additionCount = mPendingAdditions.getCount(); 59cfd74d65d832137e20e193c960802afba73b5d38sm if (additionCount > 0) { 60cfd74d65d832137e20e193c960802afba73b5d38sm final Object[] additionsArray = mPendingAdditions.getArray(); 61cfd74d65d832137e20e193c960802afba73b5d38sm for (int i = 0; i < additionCount; i++) { 62cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject object = (BaseObject)additionsArray[i]; 63cfd74d65d832137e20e193c960802afba73b5d38sm mObjects.add(object); 64cfd74d65d832137e20e193c960802afba73b5d38sm } 65cfd74d65d832137e20e193c960802afba73b5d38sm mPendingAdditions.clear(); 66cfd74d65d832137e20e193c960802afba73b5d38sm } 67cfd74d65d832137e20e193c960802afba73b5d38sm 68cfd74d65d832137e20e193c960802afba73b5d38sm final int removalCount = mPendingRemovals.getCount(); 69cfd74d65d832137e20e193c960802afba73b5d38sm if (removalCount > 0) { 70cfd74d65d832137e20e193c960802afba73b5d38sm final Object[] removalsArray = mPendingRemovals.getArray(); 71cfd74d65d832137e20e193c960802afba73b5d38sm 72cfd74d65d832137e20e193c960802afba73b5d38sm for (int i = 0; i < removalCount; i++) { 73cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject object = (BaseObject)removalsArray[i]; 74cfd74d65d832137e20e193c960802afba73b5d38sm mObjects.remove(object, true); 75cfd74d65d832137e20e193c960802afba73b5d38sm } 76cfd74d65d832137e20e193c960802afba73b5d38sm mPendingRemovals.clear(); 77cfd74d65d832137e20e193c960802afba73b5d38sm } 78cfd74d65d832137e20e193c960802afba73b5d38sm } 79cfd74d65d832137e20e193c960802afba73b5d38sm 80cfd74d65d832137e20e193c960802afba73b5d38sm @Override 81cfd74d65d832137e20e193c960802afba73b5d38sm public void update(float timeDelta, BaseObject parent) { 82cfd74d65d832137e20e193c960802afba73b5d38sm commitUpdates(); 83cfd74d65d832137e20e193c960802afba73b5d38sm final int count = mObjects.getCount(); 84cfd74d65d832137e20e193c960802afba73b5d38sm if (count > 0) { 85cfd74d65d832137e20e193c960802afba73b5d38sm final Object[] objectArray = mObjects.getArray(); 86cfd74d65d832137e20e193c960802afba73b5d38sm for (int i = 0; i < count; i++) { 87cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject object = (BaseObject)objectArray[i]; 88cfd74d65d832137e20e193c960802afba73b5d38sm object.update(timeDelta, this); 89cfd74d65d832137e20e193c960802afba73b5d38sm } 90cfd74d65d832137e20e193c960802afba73b5d38sm } 91cfd74d65d832137e20e193c960802afba73b5d38sm } 92cfd74d65d832137e20e193c960802afba73b5d38sm 93cfd74d65d832137e20e193c960802afba73b5d38sm public final FixedSizeArray<BaseObject> getObjects() { 94cfd74d65d832137e20e193c960802afba73b5d38sm return mObjects; 95cfd74d65d832137e20e193c960802afba73b5d38sm } 96cfd74d65d832137e20e193c960802afba73b5d38sm 97cfd74d65d832137e20e193c960802afba73b5d38sm public final int getCount() { 98cfd74d65d832137e20e193c960802afba73b5d38sm return mObjects.getCount(); 99cfd74d65d832137e20e193c960802afba73b5d38sm } 100cfd74d65d832137e20e193c960802afba73b5d38sm 101cfd74d65d832137e20e193c960802afba73b5d38sm /** Returns the count after the next commitUpdates() is called. */ 102cfd74d65d832137e20e193c960802afba73b5d38sm public final int getConcreteCount() { 103cfd74d65d832137e20e193c960802afba73b5d38sm return mObjects.getCount() + mPendingAdditions.getCount() - mPendingRemovals.getCount(); 104cfd74d65d832137e20e193c960802afba73b5d38sm } 105cfd74d65d832137e20e193c960802afba73b5d38sm 106cfd74d65d832137e20e193c960802afba73b5d38sm public final BaseObject get(int index) { 107cfd74d65d832137e20e193c960802afba73b5d38sm return mObjects.get(index); 108cfd74d65d832137e20e193c960802afba73b5d38sm } 109cfd74d65d832137e20e193c960802afba73b5d38sm 110cfd74d65d832137e20e193c960802afba73b5d38sm public void add(BaseObject object) { 111cfd74d65d832137e20e193c960802afba73b5d38sm mPendingAdditions.add(object); 112cfd74d65d832137e20e193c960802afba73b5d38sm } 113cfd74d65d832137e20e193c960802afba73b5d38sm 114cfd74d65d832137e20e193c960802afba73b5d38sm public void remove(BaseObject object) { 115cfd74d65d832137e20e193c960802afba73b5d38sm mPendingRemovals.add(object); 116cfd74d65d832137e20e193c960802afba73b5d38sm } 117cfd74d65d832137e20e193c960802afba73b5d38sm 118cfd74d65d832137e20e193c960802afba73b5d38sm public void removeAll() { 119cfd74d65d832137e20e193c960802afba73b5d38sm final int count = mObjects.getCount(); 120cfd74d65d832137e20e193c960802afba73b5d38sm final Object[] objectArray = mObjects.getArray(); 121cfd74d65d832137e20e193c960802afba73b5d38sm for (int i = 0; i < count; i++) { 122cfd74d65d832137e20e193c960802afba73b5d38sm mPendingRemovals.add((BaseObject)objectArray[i]); 123cfd74d65d832137e20e193c960802afba73b5d38sm } 124cfd74d65d832137e20e193c960802afba73b5d38sm mPendingAdditions.clear(); 125cfd74d65d832137e20e193c960802afba73b5d38sm } 126cfd74d65d832137e20e193c960802afba73b5d38sm 127cfd74d65d832137e20e193c960802afba73b5d38sm /** 128cfd74d65d832137e20e193c960802afba73b5d38sm * Finds a child object by its type. Note that this may invoke the class loader and therefore 129cfd74d65d832137e20e193c960802afba73b5d38sm * may be slow. 130cfd74d65d832137e20e193c960802afba73b5d38sm * @param classObject The class type to search for (e.g. BaseObject.class). 131cfd74d65d832137e20e193c960802afba73b5d38sm * @return 132cfd74d65d832137e20e193c960802afba73b5d38sm */ 133cfd74d65d832137e20e193c960802afba73b5d38sm public <T> T findByClass(Class<T> classObject) { 134cfd74d65d832137e20e193c960802afba73b5d38sm T object = null; 135cfd74d65d832137e20e193c960802afba73b5d38sm final int count = mObjects.getCount(); 136cfd74d65d832137e20e193c960802afba73b5d38sm for (int i = 0; i < count; i++) { 137cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject currentObject = mObjects.get(i); 138cfd74d65d832137e20e193c960802afba73b5d38sm if (currentObject.getClass() == classObject) { 139cfd74d65d832137e20e193c960802afba73b5d38sm object = classObject.cast(currentObject); 140cfd74d65d832137e20e193c960802afba73b5d38sm break; 141cfd74d65d832137e20e193c960802afba73b5d38sm } 142cfd74d65d832137e20e193c960802afba73b5d38sm } 143cfd74d65d832137e20e193c960802afba73b5d38sm return object; 144cfd74d65d832137e20e193c960802afba73b5d38sm } 145cfd74d65d832137e20e193c960802afba73b5d38sm 146cfd74d65d832137e20e193c960802afba73b5d38sm protected FixedSizeArray<BaseObject> getPendingObjects() { 147cfd74d65d832137e20e193c960802afba73b5d38sm return mPendingAdditions; 148cfd74d65d832137e20e193c960802afba73b5d38sm } 149cfd74d65d832137e20e193c960802afba73b5d38sm 150cfd74d65d832137e20e193c960802afba73b5d38sm} 151