Android Open Source - droidengine2d Texture Manager






From Project

Back to project page droidengine2d.

License

The source code is released under:

Apache License

If you think the Android project droidengine2d listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*   Copyright 2013-2014 Miguel Vicente Linares
 *//from  w ww .j a va 2  s.c  o  m
 *  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.miviclin.droidengine2d.graphics.texture;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.util.SparseArray;

import com.miviclin.droidengine2d.graphics.text.Font;

/**
 * TextureManager.
 * 
 * @author Miguel Vicente Linares
 * 
 */
public final class TextureManager {

  private Context context;
  private HashMap<String, TextureRegion> textureRegions;
  private ArrayList<Texture> activeTextures;
  private ArrayList<Texture> removedTextures;
  private int texturesToLoad;

  /**
   * Creates a new TextureManager with an initial capacity of 16.
   * 
   * @param context Context.
   */
  public TextureManager(Context context) {
    this(16, 16, context);
  }

  /**
   * Creates a new TextureManager.
   * 
   * @param initialCapacityForTextures Initial capacity for textures.
   * @param initialCapacityForTextureRegions Initial capacity for texture regions.
   * @param context Context.
   */
  public TextureManager(int initialCapacityForTextures, int initialCapacityForTextureRegions, Context context) {
    int mapCapacity = (int) ((initialCapacityForTextureRegions / 0.75f) + 1);
    this.textureRegions = new HashMap<String, TextureRegion>(mapCapacity);
    this.context = context;
    this.activeTextures = new ArrayList<Texture>(initialCapacityForTextures);
    this.removedTextures = new ArrayList<Texture>(initialCapacityForTextures);
    this.texturesToLoad = 0;
  }

  /**
   * Adds a TextureRegion to this TextureManager.<br>
   * The specified key can be used to retrieve that TextureRegion later. If there is already a TextureRegion
   * registered with the specified key in this TextureManager, it will be replaced.
   * 
   * @param key Identifies the TextureRegion.
   * @param textureRegion TextureRegion.
   * @return Returns the TextureRegion previously registered with this key, or null if there wasn't any.
   */
  public TextureRegion addTextureRegion(String key, TextureRegion textureRegion) {
    addTexture(textureRegion.getTexture());
    return textureRegions.put(key, textureRegion);
  }

  /**
   * Removes the TextureRegion associated to the specified key.
   * 
   * @param key Key.
   * @return Removed TextureRegion or null
   */
  public TextureRegion removeTextureRegion(String key) {
    return textureRegions.remove(key);
  }

  /**
   * Returns the TextureRegion associated to the specified key.
   * 
   * @param key Key.
   * @return TextureRegion or null
   */
  public TextureRegion getTextureRegion(String key) {
    return textureRegions.get(key);
  }

  /**
   * Adds all TextureRegions of the specified TextureAtlas to this TextureManager. The source texture of the specified
   * TextureAtlas is also added to this TextureManager.
   * 
   * @param textureAtlas TextureAtlas.
   */
  public void addTextureAtlas(TextureAtlas textureAtlas) {
    Map<String, TextureRegion> atlasContent = textureAtlas.getTextureRegions();
    for (Map.Entry<String, TextureRegion> entry : atlasContent.entrySet()) {
      textureRegions.put(entry.getKey(), entry.getValue());
    }
    addTexture(textureAtlas.getSourceTexture());
  }

  /**
   * Removes all TextureRegions of the specified TextureAtlas from this TextureManager.<br>
   * The source texture of the specified TextureAtlas will not be removed from this TextureManager.
   * 
   * @param textureAtlas TextureAtlas.
   */
  public void removeTextureAtlas(TextureAtlas textureAtlas) {
    Map<String, TextureRegion> atlasContent = textureAtlas.getTextureRegions();
    for (Map.Entry<String, TextureRegion> entry : atlasContent.entrySet()) {
      textureRegions.remove(entry.getKey());
    }
  }

  /**
   * Adds the specified Texture to this TextureManager.
   * 
   * @param texture Texture.
   * @return true if it has been added, false if a Texture with the same path (relative to the assets folder) was
   *         previously registered in this TextureManager
   */
  public boolean addTexture(Texture texture) {
    int j;
    Texture aux;
    if (activeTextures.contains(texture)) {
      return false;
    }
    activeTextures.add(texture);
    j = activeTextures.size() - 1;
    for (int i = j - 1; i >= 0; i--) {
      if (activeTextures.get(i).compareTo(activeTextures.get(j)) == 0) {
        break;
      }
      if (activeTextures.get(i).compareTo(activeTextures.get(j)) > 0) {
        aux = activeTextures.set(i, activeTextures.get(j));
        activeTextures.set(j, aux);
        j--;
      } else {
        break;
      }
    }
    if (!texture.isLoaded()) {
      texturesToLoad++;
    }
    return true;
  }

  /**
   * Adds all textures of a Font to this TextureManager.
   * 
   * @param font Font.
   */
  public void addFontTextures(Font font) {
    SparseArray<Texture> texturePages = font.getTexturePages();
    for (int i = 0; i < texturePages.size(); i++) {
      addTexture(texturePages.valueAt(i));
    }
  }

  /**
   * Removes the specified Texture from the collection of active textures.<br>
   * The texture is moved to a pool so it won't be reloaded but the object will not be collected by the GC until
   * {@link #clearRemovedTextures()} is called.
   * 
   * @param texture Texture to be removed from the collection of active textures.
   */
  public void removeTexture(Texture texture) {
    Texture removedTexture;
    int mid;
    int low = 0;
    int high = activeTextures.size() - 1;
    while (low <= high) {
      mid = (low + high) / 2;
      if (activeTextures.get(mid).compareTo(texture) < 0) {
        low = mid + 1;
      } else if (activeTextures.get(mid).compareTo(texture) > 0) {
        high = mid - 1;
      } else {
        removedTexture = activeTextures.remove(mid);
        removedTextures.add(removedTexture);
        if (!removedTexture.isLoaded()) {
          texturesToLoad--;
        }
      }
    }
  }

  /**
   * Removes all Textures from the collection of active textures.<br>
   * The textures are moved to a pool so they won't be reloaded but the objects will not be collected by the GC until
   * {@link #clearRemovedTextures()} is called.
   */
  public void removeAllTextures() {
    for (int i = activeTextures.size() - 1; i >= 0; i--) {
      removedTextures.add(activeTextures.remove(i));
    }
    texturesToLoad = 0;
  }

  /**
   * Removes all textures from the pool of removed textures. Active textures won't be removed.<br>
   * This method must be called from the rendering thread.
   * 
   * @see #removeTexture(Texture)
   * @see #removeAllTextures()
   */
  public void clearRemovedTextures() {
    for (int i = removedTextures.size() - 1; i >= 0; i--) {
      removedTextures.get(i).delete();
    }
  }

  /**
   * Removes all textures stored in this TextureManager.<br>
   * This method must be called from the rendering thread.
   */
  public void clearAll() {
    int activeTexturesSize = activeTextures.size();
    int removedTexturesSize = removedTextures.size();
    int maxSize = Math.max(activeTexturesSize, removedTexturesSize);
    for (int i = maxSize - 1; i >= 0; i--) {
      if (i < activeTexturesSize) {
        activeTextures.remove(i).delete();
      }
      if (i < removedTexturesSize) {
        removedTextures.get(i).delete();
      }
    }
    texturesToLoad = 0;
    textureRegions.clear();
  }

  /**
   * Loads all textures that have not been previously loaded.<br>
   * This method must be called from the rendering thread.
   */
  public void loadTextures() {
    if (texturesToLoad > 0) {
      for (int i = 0; i < activeTextures.size(); i++) {
        if (!activeTextures.get(i).isLoaded()) {
          activeTextures.get(i).loadTexture(context);
          texturesToLoad--;
          if (texturesToLoad == 0) {
            break;
          }
        }
      }
      texturesToLoad = 0;
    }
  }

  /**
   * Loads all textures.<br>
   * This method must be called from the rendering thread.
   */
  public void loadAllTextures() {
    for (int i = 0; i < activeTextures.size(); i++) {
      activeTextures.get(i).loadTexture(context);
    }
    texturesToLoad = 0;
  }

}




Java Source Code List

com.miviclin.droidengine2d.AbstractGame.java
com.miviclin.droidengine2d.EngineActivity.java
com.miviclin.droidengine2d.EngineLock.java
com.miviclin.droidengine2d.Engine.java
com.miviclin.droidengine2d.GameThread.java
com.miviclin.droidengine2d.Game.java
com.miviclin.droidengine2d.audio.MusicPlayer.java
com.miviclin.droidengine2d.audio.SoundManager.java
com.miviclin.droidengine2d.gamestate.GameStateAdapter.java
com.miviclin.droidengine2d.gamestate.GameStateManager.java
com.miviclin.droidengine2d.gamestate.GameStateNotRegisteredException.java
com.miviclin.droidengine2d.gamestate.GameState.java
com.miviclin.droidengine2d.gamestate.OnGameStateChangeListener.java
com.miviclin.droidengine2d.graphics.Color.java
com.miviclin.droidengine2d.graphics.DefaultRenderer.java
com.miviclin.droidengine2d.graphics.EngineRenderer.java
com.miviclin.droidengine2d.graphics.GLDebugger.java
com.miviclin.droidengine2d.graphics.GLRenderer.java
com.miviclin.droidengine2d.graphics.GLView.java
com.miviclin.droidengine2d.graphics.Graphics.java
com.miviclin.droidengine2d.graphics.animation.AnimationFrame.java
com.miviclin.droidengine2d.graphics.animation.AnimationStateAdapter.java
com.miviclin.droidengine2d.graphics.animation.AnimationStateListener.java
com.miviclin.droidengine2d.graphics.animation.Animation.java
com.miviclin.droidengine2d.graphics.cameras.Camera.java
com.miviclin.droidengine2d.graphics.cameras.OrthographicCamera.java
com.miviclin.droidengine2d.graphics.material.BlendingOptions.java
com.miviclin.droidengine2d.graphics.material.ColorMaterial.java
com.miviclin.droidengine2d.graphics.material.Material.java
com.miviclin.droidengine2d.graphics.material.TextureColorMaterial.java
com.miviclin.droidengine2d.graphics.material.TextureHsvMaterial.java
com.miviclin.droidengine2d.graphics.material.TextureMaterial.java
com.miviclin.droidengine2d.graphics.material.TransparentTextureMaterial.java
com.miviclin.droidengine2d.graphics.material.UnsupportedMaterialException.java
com.miviclin.droidengine2d.graphics.mesh.ColorMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.Geometry.java
com.miviclin.droidengine2d.graphics.mesh.GraphicsBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.RectangleBatchGeometry.java
com.miviclin.droidengine2d.graphics.mesh.RectangleBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TextureColorMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TextureHsvMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TextureMaterialBatchRendererBase.java
com.miviclin.droidengine2d.graphics.mesh.TextureMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.mesh.TransparentTextureMaterialBatchRenderer.java
com.miviclin.droidengine2d.graphics.shader.ShaderProgramException.java
com.miviclin.droidengine2d.graphics.shader.ShaderProgram.java
com.miviclin.droidengine2d.graphics.shader.ShaderVars.java
com.miviclin.droidengine2d.graphics.text.BitmapFont.java
com.miviclin.droidengine2d.graphics.text.FontChar.java
com.miviclin.droidengine2d.graphics.text.Font.java
com.miviclin.droidengine2d.graphics.text.UndefinedCharacterException.java
com.miviclin.droidengine2d.graphics.texture.TextureAtlas.java
com.miviclin.droidengine2d.graphics.texture.TextureManager.java
com.miviclin.droidengine2d.graphics.texture.TexturePackerAtlas.java
com.miviclin.droidengine2d.graphics.texture.TextureRegion.java
com.miviclin.droidengine2d.graphics.texture.Texture.java
com.miviclin.droidengine2d.input.DefaultKeyEventProcessor.java
com.miviclin.droidengine2d.input.GameInputManager.java
com.miviclin.droidengine2d.input.GameStateInputManager.java
com.miviclin.droidengine2d.input.KeyEventInfo.java
com.miviclin.droidengine2d.input.KeyEventProcessor.java
com.miviclin.droidengine2d.input.KeyProcessor.java
com.miviclin.droidengine2d.input.MotionEventProcessor.java
com.miviclin.droidengine2d.input.TouchProcessor.java
com.miviclin.droidengine2d.input.sensor.AccelerometerValuesListener.java
com.miviclin.droidengine2d.input.sensor.Accelerometer.java
com.miviclin.droidengine2d.input.sensor.SensorUtilities.java
com.miviclin.droidengine2d.resources.AssetsLoader.java
com.miviclin.droidengine2d.util.ActivityUtilities.java
com.miviclin.droidengine2d.util.MutexLock.java
com.miviclin.droidengine2d.util.PrimitiveTypeSize.java
com.miviclin.droidengine2d.util.TransformUtilities.java
com.miviclin.droidengine2d.util.Transform.java
com.miviclin.droidengine2d.util.math.Matrix4.java
com.miviclin.droidengine2d.util.math.MatrixFix.java
com.miviclin.droidengine2d.util.math.Vector2.java
com.miviclin.droidengine2d.util.math.Vector3.java
com.miviclin.droidengine2d.util.time.TimeConstants.java
com.miviclin.droidengine2d.util.time.TimeCounter.java