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 19cfd74d65d832137e20e193c960802afba73b5d38smimport java.io.IOException; 20cfd74d65d832137e20e193c960802afba73b5d38smimport java.io.InputStream; 21cfd74d65d832137e20e193c960802afba73b5d38sm 22cfd74d65d832137e20e193c960802afba73b5d38smimport javax.microedition.khronos.opengles.GL10; 23cfd74d65d832137e20e193c960802afba73b5d38smimport javax.microedition.khronos.opengles.GL11; 24cfd74d65d832137e20e193c960802afba73b5d38smimport javax.microedition.khronos.opengles.GL11Ext; 25cfd74d65d832137e20e193c960802afba73b5d38sm 26cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.Context; 27cfd74d65d832137e20e193c960802afba73b5d38smimport android.graphics.Bitmap; 28cfd74d65d832137e20e193c960802afba73b5d38smimport android.graphics.BitmapFactory; 29cfd74d65d832137e20e193c960802afba73b5d38smimport android.opengl.GLU; 30cfd74d65d832137e20e193c960802afba73b5d38smimport android.opengl.GLUtils; 31cfd74d65d832137e20e193c960802afba73b5d38sm 32cfd74d65d832137e20e193c960802afba73b5d38sm/** 33cfd74d65d832137e20e193c960802afba73b5d38sm * The Texture Library manages all textures in the game. Textures are pooled and handed out to 34cfd74d65d832137e20e193c960802afba73b5d38sm * requesting parties via allocateTexture(). However, the texture data itself is not immediately 35cfd74d65d832137e20e193c960802afba73b5d38sm * loaded at that time; it may have already been loaded or it may be loaded in the future via 36cfd74d65d832137e20e193c960802afba73b5d38sm * a call to loadTexture() or loadAllTextures(). This allows Texture objects to be dispersed to 37cfd74d65d832137e20e193c960802afba73b5d38sm * various game systems and while the texture data itself is streamed in or loaded as necessary. 38cfd74d65d832137e20e193c960802afba73b5d38sm */ 39cfd74d65d832137e20e193c960802afba73b5d38smpublic class TextureLibrary extends BaseObject { 40cfd74d65d832137e20e193c960802afba73b5d38sm // Textures are stored in a simple hash. This class implements its own array-based hash rather 41cfd74d65d832137e20e193c960802afba73b5d38sm // than using HashMap for performance. 42cfd74d65d832137e20e193c960802afba73b5d38sm Texture[] mTextureHash; 43cfd74d65d832137e20e193c960802afba73b5d38sm int[] mTextureNameWorkspace; 44cfd74d65d832137e20e193c960802afba73b5d38sm int[] mCropWorkspace; 45cfd74d65d832137e20e193c960802afba73b5d38sm static final int DEFAULT_SIZE = 512; 46cfd74d65d832137e20e193c960802afba73b5d38sm static BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options(); 47cfd74d65d832137e20e193c960802afba73b5d38sm 48cfd74d65d832137e20e193c960802afba73b5d38sm public TextureLibrary() { 49cfd74d65d832137e20e193c960802afba73b5d38sm super(); 50cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash = new Texture[DEFAULT_SIZE]; 51cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < mTextureHash.length; x++) { 52cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[x] = new Texture(); 53cfd74d65d832137e20e193c960802afba73b5d38sm } 54cfd74d65d832137e20e193c960802afba73b5d38sm 55cfd74d65d832137e20e193c960802afba73b5d38sm mTextureNameWorkspace = new int[1]; 56cfd74d65d832137e20e193c960802afba73b5d38sm mCropWorkspace = new int[4]; 57cfd74d65d832137e20e193c960802afba73b5d38sm 58cfd74d65d832137e20e193c960802afba73b5d38sm sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565; 59cfd74d65d832137e20e193c960802afba73b5d38sm } 60cfd74d65d832137e20e193c960802afba73b5d38sm 61cfd74d65d832137e20e193c960802afba73b5d38sm @Override 62cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 63cfd74d65d832137e20e193c960802afba73b5d38sm removeAll(); 64cfd74d65d832137e20e193c960802afba73b5d38sm } 65cfd74d65d832137e20e193c960802afba73b5d38sm 66cfd74d65d832137e20e193c960802afba73b5d38sm /** 67cfd74d65d832137e20e193c960802afba73b5d38sm * Creates a Texture object that is mapped to the passed resource id. If a texture has already 68cfd74d65d832137e20e193c960802afba73b5d38sm * been allocated for this id, the previously allocated Texture object is returned. 69cfd74d65d832137e20e193c960802afba73b5d38sm * @param resourceID 70cfd74d65d832137e20e193c960802afba73b5d38sm * @return 71cfd74d65d832137e20e193c960802afba73b5d38sm */ 72cfd74d65d832137e20e193c960802afba73b5d38sm public Texture allocateTexture(int resourceID) { 73cfd74d65d832137e20e193c960802afba73b5d38sm Texture texture = getTextureByResource(resourceID); 74cfd74d65d832137e20e193c960802afba73b5d38sm if (texture == null) { 75cfd74d65d832137e20e193c960802afba73b5d38sm texture = addTexture(resourceID, -1, 0, 0); 76cfd74d65d832137e20e193c960802afba73b5d38sm } 77cfd74d65d832137e20e193c960802afba73b5d38sm 78cfd74d65d832137e20e193c960802afba73b5d38sm return texture; 79cfd74d65d832137e20e193c960802afba73b5d38sm } 80cfd74d65d832137e20e193c960802afba73b5d38sm 81cfd74d65d832137e20e193c960802afba73b5d38sm /** Loads a single texture into memory. Does nothing if the texture is already loaded. */ 82cfd74d65d832137e20e193c960802afba73b5d38sm public Texture loadTexture(Context context, GL10 gl, int resourceID) { 83cfd74d65d832137e20e193c960802afba73b5d38sm Texture texture = allocateTexture(resourceID); 84cfd74d65d832137e20e193c960802afba73b5d38sm texture = loadBitmap(context, gl, texture); 85cfd74d65d832137e20e193c960802afba73b5d38sm return texture; 86cfd74d65d832137e20e193c960802afba73b5d38sm } 87cfd74d65d832137e20e193c960802afba73b5d38sm 88cfd74d65d832137e20e193c960802afba73b5d38sm /** Loads all unloaded textures into OpenGL memory. Already-loaded textures are ignored. */ 89cfd74d65d832137e20e193c960802afba73b5d38sm public void loadAll(Context context, GL10 gl) { 90cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < mTextureHash.length; x++) { 91cfd74d65d832137e20e193c960802afba73b5d38sm if (mTextureHash[x].resource != -1 && mTextureHash[x].loaded == false) { 92cfd74d65d832137e20e193c960802afba73b5d38sm loadBitmap(context, gl, mTextureHash[x]); 93cfd74d65d832137e20e193c960802afba73b5d38sm } 94cfd74d65d832137e20e193c960802afba73b5d38sm } 95cfd74d65d832137e20e193c960802afba73b5d38sm } 96cfd74d65d832137e20e193c960802afba73b5d38sm 97cfd74d65d832137e20e193c960802afba73b5d38sm /** Flushes all textures from OpenGL memory */ 98cfd74d65d832137e20e193c960802afba73b5d38sm public void deleteAll(GL10 gl) { 99cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < mTextureHash.length; x++) { 100cfd74d65d832137e20e193c960802afba73b5d38sm if (mTextureHash[x].resource != -1 && mTextureHash[x].loaded) { 101cfd74d65d832137e20e193c960802afba73b5d38sm assert mTextureHash[x].name != -1; 102cfd74d65d832137e20e193c960802afba73b5d38sm mTextureNameWorkspace[0] = mTextureHash[x].name; 103cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[x].name = -1; 104cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[x].loaded = false; 105cfd74d65d832137e20e193c960802afba73b5d38sm gl.glDeleteTextures(1, mTextureNameWorkspace, 0); 106cfd74d65d832137e20e193c960802afba73b5d38sm int error = gl.glGetError(); 107cfd74d65d832137e20e193c960802afba73b5d38sm if (error != GL10.GL_NO_ERROR) { 108cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("Texture Delete", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + mTextureHash[x].resource); 109cfd74d65d832137e20e193c960802afba73b5d38sm } 110cfd74d65d832137e20e193c960802afba73b5d38sm 111cfd74d65d832137e20e193c960802afba73b5d38sm assert error == GL10.GL_NO_ERROR; 112cfd74d65d832137e20e193c960802afba73b5d38sm } 113cfd74d65d832137e20e193c960802afba73b5d38sm } 114cfd74d65d832137e20e193c960802afba73b5d38sm } 115cfd74d65d832137e20e193c960802afba73b5d38sm 116cfd74d65d832137e20e193c960802afba73b5d38sm /** Marks all textures as unloaded */ 117cfd74d65d832137e20e193c960802afba73b5d38sm public void invalidateAll() { 118cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < mTextureHash.length; x++) { 119cfd74d65d832137e20e193c960802afba73b5d38sm if (mTextureHash[x].resource != -1 && mTextureHash[x].loaded) { 120cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[x].name = -1; 121cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[x].loaded = false; 122cfd74d65d832137e20e193c960802afba73b5d38sm } 123cfd74d65d832137e20e193c960802afba73b5d38sm } 124cfd74d65d832137e20e193c960802afba73b5d38sm } 125cfd74d65d832137e20e193c960802afba73b5d38sm 126cfd74d65d832137e20e193c960802afba73b5d38sm /** Loads a bitmap into OpenGL and sets up the common parameters for 2D texture maps. */ 127cfd74d65d832137e20e193c960802afba73b5d38sm protected Texture loadBitmap(Context context, GL10 gl, Texture texture) { 128cfd74d65d832137e20e193c960802afba73b5d38sm assert gl != null; 129cfd74d65d832137e20e193c960802afba73b5d38sm assert context != null; 130cfd74d65d832137e20e193c960802afba73b5d38sm assert texture != null; 131cfd74d65d832137e20e193c960802afba73b5d38sm if (texture.loaded == false && texture.resource != -1) { 132cfd74d65d832137e20e193c960802afba73b5d38sm gl.glGenTextures(1, mTextureNameWorkspace, 0); 133cfd74d65d832137e20e193c960802afba73b5d38sm 134cfd74d65d832137e20e193c960802afba73b5d38sm int error = gl.glGetError(); 135cfd74d65d832137e20e193c960802afba73b5d38sm if (error != GL10.GL_NO_ERROR) { 136cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("Texture Load 1", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + texture.resource); 137cfd74d65d832137e20e193c960802afba73b5d38sm } 138cfd74d65d832137e20e193c960802afba73b5d38sm 139cfd74d65d832137e20e193c960802afba73b5d38sm assert error == GL10.GL_NO_ERROR; 140cfd74d65d832137e20e193c960802afba73b5d38sm 141cfd74d65d832137e20e193c960802afba73b5d38sm int textureName = mTextureNameWorkspace[0]; 142cfd74d65d832137e20e193c960802afba73b5d38sm 143cfd74d65d832137e20e193c960802afba73b5d38sm gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName); 144cfd74d65d832137e20e193c960802afba73b5d38sm 145cfd74d65d832137e20e193c960802afba73b5d38sm error = gl.glGetError(); 146cfd74d65d832137e20e193c960802afba73b5d38sm if (error != GL10.GL_NO_ERROR) { 147cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("Texture Load 2", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + texture.resource); 148cfd74d65d832137e20e193c960802afba73b5d38sm } 149cfd74d65d832137e20e193c960802afba73b5d38sm 150cfd74d65d832137e20e193c960802afba73b5d38sm assert error == GL10.GL_NO_ERROR; 151cfd74d65d832137e20e193c960802afba73b5d38sm 152cfd74d65d832137e20e193c960802afba73b5d38sm gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 153cfd74d65d832137e20e193c960802afba73b5d38sm gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 154cfd74d65d832137e20e193c960802afba73b5d38sm 155cfd74d65d832137e20e193c960802afba73b5d38sm gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 156cfd74d65d832137e20e193c960802afba73b5d38sm gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 157cfd74d65d832137e20e193c960802afba73b5d38sm 158cfd74d65d832137e20e193c960802afba73b5d38sm gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); //GL10.GL_REPLACE); 159cfd74d65d832137e20e193c960802afba73b5d38sm 160cfd74d65d832137e20e193c960802afba73b5d38sm InputStream is = context.getResources().openRawResource(texture.resource); 161cfd74d65d832137e20e193c960802afba73b5d38sm Bitmap bitmap; 162cfd74d65d832137e20e193c960802afba73b5d38sm try { 163cfd74d65d832137e20e193c960802afba73b5d38sm bitmap = BitmapFactory.decodeStream(is); 164cfd74d65d832137e20e193c960802afba73b5d38sm } finally { 165cfd74d65d832137e20e193c960802afba73b5d38sm try { 166cfd74d65d832137e20e193c960802afba73b5d38sm is.close(); 167cfd74d65d832137e20e193c960802afba73b5d38sm } catch (IOException e) { 168cfd74d65d832137e20e193c960802afba73b5d38sm e.printStackTrace(); 169cfd74d65d832137e20e193c960802afba73b5d38sm // Ignore. 170cfd74d65d832137e20e193c960802afba73b5d38sm } 171cfd74d65d832137e20e193c960802afba73b5d38sm } 172cfd74d65d832137e20e193c960802afba73b5d38sm 173cfd74d65d832137e20e193c960802afba73b5d38sm GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 174cfd74d65d832137e20e193c960802afba73b5d38sm 175cfd74d65d832137e20e193c960802afba73b5d38sm error = gl.glGetError(); 176cfd74d65d832137e20e193c960802afba73b5d38sm if (error != GL10.GL_NO_ERROR) { 177cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("Texture Load 3", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + texture.resource); 178cfd74d65d832137e20e193c960802afba73b5d38sm } 179cfd74d65d832137e20e193c960802afba73b5d38sm 180cfd74d65d832137e20e193c960802afba73b5d38sm assert error == GL10.GL_NO_ERROR; 181cfd74d65d832137e20e193c960802afba73b5d38sm 182cfd74d65d832137e20e193c960802afba73b5d38sm mCropWorkspace[0] = 0; 183cfd74d65d832137e20e193c960802afba73b5d38sm mCropWorkspace[1] = bitmap.getHeight(); 184cfd74d65d832137e20e193c960802afba73b5d38sm mCropWorkspace[2] = bitmap.getWidth(); 185cfd74d65d832137e20e193c960802afba73b5d38sm mCropWorkspace[3] = -bitmap.getHeight(); 186cfd74d65d832137e20e193c960802afba73b5d38sm 187cfd74d65d832137e20e193c960802afba73b5d38sm ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, GL11Ext.GL_TEXTURE_CROP_RECT_OES, 188cfd74d65d832137e20e193c960802afba73b5d38sm mCropWorkspace, 0); 189cfd74d65d832137e20e193c960802afba73b5d38sm 190cfd74d65d832137e20e193c960802afba73b5d38sm texture.name = textureName; 191cfd74d65d832137e20e193c960802afba73b5d38sm texture.width = bitmap.getWidth(); 192cfd74d65d832137e20e193c960802afba73b5d38sm texture.height = bitmap.getHeight(); 193cfd74d65d832137e20e193c960802afba73b5d38sm 194cfd74d65d832137e20e193c960802afba73b5d38sm bitmap.recycle(); 195cfd74d65d832137e20e193c960802afba73b5d38sm 196cfd74d65d832137e20e193c960802afba73b5d38sm error = gl.glGetError(); 197cfd74d65d832137e20e193c960802afba73b5d38sm if (error != GL10.GL_NO_ERROR) { 198cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("Texture Load 4", "GLError: " + error + " (" + GLU.gluErrorString(error) + "): " + texture.resource); 199cfd74d65d832137e20e193c960802afba73b5d38sm } 200cfd74d65d832137e20e193c960802afba73b5d38sm 201cfd74d65d832137e20e193c960802afba73b5d38sm assert error == GL10.GL_NO_ERROR; 202cfd74d65d832137e20e193c960802afba73b5d38sm 203cfd74d65d832137e20e193c960802afba73b5d38sm texture.loaded = true; 204cfd74d65d832137e20e193c960802afba73b5d38sm 205cfd74d65d832137e20e193c960802afba73b5d38sm } 206cfd74d65d832137e20e193c960802afba73b5d38sm 207cfd74d65d832137e20e193c960802afba73b5d38sm return texture; 208cfd74d65d832137e20e193c960802afba73b5d38sm } 209cfd74d65d832137e20e193c960802afba73b5d38sm 210cfd74d65d832137e20e193c960802afba73b5d38sm public boolean isTextureLoaded(int resourceID) { 211cfd74d65d832137e20e193c960802afba73b5d38sm return getTextureByResource(resourceID) != null; 212cfd74d65d832137e20e193c960802afba73b5d38sm } 213cfd74d65d832137e20e193c960802afba73b5d38sm 214cfd74d65d832137e20e193c960802afba73b5d38sm /** 215cfd74d65d832137e20e193c960802afba73b5d38sm * Returns the texture associated with the passed Android resource ID. 216cfd74d65d832137e20e193c960802afba73b5d38sm * @param resourceID The resource ID of a bitmap defined in R.java. 217cfd74d65d832137e20e193c960802afba73b5d38sm * @return An associated Texture object, or null if there is no associated 218cfd74d65d832137e20e193c960802afba73b5d38sm * texture in the library. 219cfd74d65d832137e20e193c960802afba73b5d38sm */ 220cfd74d65d832137e20e193c960802afba73b5d38sm public Texture getTextureByResource(int resourceID) { 221cfd74d65d832137e20e193c960802afba73b5d38sm int index = getHashIndex(resourceID); 222cfd74d65d832137e20e193c960802afba73b5d38sm int realIndex = findFirstKey(index, resourceID); 223cfd74d65d832137e20e193c960802afba73b5d38sm Texture texture = null; 224cfd74d65d832137e20e193c960802afba73b5d38sm if (realIndex != -1) { 225cfd74d65d832137e20e193c960802afba73b5d38sm texture = mTextureHash[realIndex]; 226cfd74d65d832137e20e193c960802afba73b5d38sm } 227cfd74d65d832137e20e193c960802afba73b5d38sm return texture; 228cfd74d65d832137e20e193c960802afba73b5d38sm } 229cfd74d65d832137e20e193c960802afba73b5d38sm 230cfd74d65d832137e20e193c960802afba73b5d38sm private int getHashIndex(int id) { 231cfd74d65d832137e20e193c960802afba73b5d38sm return id % mTextureHash.length; 232cfd74d65d832137e20e193c960802afba73b5d38sm } 233cfd74d65d832137e20e193c960802afba73b5d38sm 234cfd74d65d832137e20e193c960802afba73b5d38sm /** 235cfd74d65d832137e20e193c960802afba73b5d38sm * Locates the texture in the hash. This hash uses a simple linear probe chaining mechanism: 236cfd74d65d832137e20e193c960802afba73b5d38sm * if the hash slot is occupied by some other entry, the next empty array index is used. 237cfd74d65d832137e20e193c960802afba73b5d38sm * This is O(n) for the worst case (every slot is a cache miss) but the average case is 238cfd74d65d832137e20e193c960802afba73b5d38sm * constant time. 239cfd74d65d832137e20e193c960802afba73b5d38sm * @param startIndex 240cfd74d65d832137e20e193c960802afba73b5d38sm * @param key 241cfd74d65d832137e20e193c960802afba73b5d38sm * @return 242cfd74d65d832137e20e193c960802afba73b5d38sm */ 243cfd74d65d832137e20e193c960802afba73b5d38sm private int findFirstKey(int startIndex, int key) { 244cfd74d65d832137e20e193c960802afba73b5d38sm int index = -1; 245cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < mTextureHash.length; x++) { 246cfd74d65d832137e20e193c960802afba73b5d38sm final int actualIndex = (startIndex + x) % mTextureHash.length; 247cfd74d65d832137e20e193c960802afba73b5d38sm if (mTextureHash[actualIndex].resource == key) { 248cfd74d65d832137e20e193c960802afba73b5d38sm index = actualIndex; 249cfd74d65d832137e20e193c960802afba73b5d38sm break; 250cfd74d65d832137e20e193c960802afba73b5d38sm } else if (mTextureHash[actualIndex].resource == -1) { 251cfd74d65d832137e20e193c960802afba73b5d38sm break; 252cfd74d65d832137e20e193c960802afba73b5d38sm } 253cfd74d65d832137e20e193c960802afba73b5d38sm } 254cfd74d65d832137e20e193c960802afba73b5d38sm return index; 255cfd74d65d832137e20e193c960802afba73b5d38sm } 256cfd74d65d832137e20e193c960802afba73b5d38sm 257cfd74d65d832137e20e193c960802afba73b5d38sm /** Inserts a texture into the hash */ 258cfd74d65d832137e20e193c960802afba73b5d38sm protected Texture addTexture(int id, int name, int width, int height) { 259cfd74d65d832137e20e193c960802afba73b5d38sm int index = findFirstKey(getHashIndex(id), -1); 260cfd74d65d832137e20e193c960802afba73b5d38sm Texture texture = null; 261cfd74d65d832137e20e193c960802afba73b5d38sm assert index != -1; 262cfd74d65d832137e20e193c960802afba73b5d38sm 263cfd74d65d832137e20e193c960802afba73b5d38sm if (index != -1) { 264cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[index].resource = id; 265cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[index].name = name; 266cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[index].width = width; 267cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[index].height = height; 268cfd74d65d832137e20e193c960802afba73b5d38sm texture = mTextureHash[index]; 269cfd74d65d832137e20e193c960802afba73b5d38sm } 270cfd74d65d832137e20e193c960802afba73b5d38sm 271cfd74d65d832137e20e193c960802afba73b5d38sm return texture; 272cfd74d65d832137e20e193c960802afba73b5d38sm } 273cfd74d65d832137e20e193c960802afba73b5d38sm 274cfd74d65d832137e20e193c960802afba73b5d38sm public void removeAll() { 275cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < mTextureHash.length; x++) { 276cfd74d65d832137e20e193c960802afba73b5d38sm mTextureHash[x].reset(); 277cfd74d65d832137e20e193c960802afba73b5d38sm } 278cfd74d65d832137e20e193c960802afba73b5d38sm } 279cfd74d65d832137e20e193c960802afba73b5d38sm 280cfd74d65d832137e20e193c960802afba73b5d38sm} 281