From 09e4183b1462093e2a47acac2325f39886a76e1e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 13 Apr 2012 19:16:09 -0700 Subject: [PATCH 001/252] Merged 'width'/'height' into Entity (default is 0/0). IEntity extends ITouchArea (instead of Shape), which leads to quite a few renamings. Rotation/Scale/Skew-Centers are now relative (ranging from 0 to 1, but can exceed those). Added OffsetCenter/X/Y. Added convenience methods AnchorCenter/X/Y the sets all Offset/Rotation/Scale/Skew-Centers at the same time. --- src/org/andengine/engine/camera/Camera.java | 13 +- src/org/andengine/entity/Entity.java | 373 +++++++++++++++--- src/org/andengine/entity/IEntity.java | 57 ++- .../OffCameraExpireParticleModifier.java | 6 +- src/org/andengine/entity/primitive/Line.java | 14 +- src/org/andengine/entity/primitive/Mesh.java | 15 +- .../andengine/entity/primitive/Rectangle.java | 9 +- .../andengine/entity/scene/CameraScene.java | 14 +- .../scene/background/ParallaxBackground.java | 20 +- .../entity/scene/menu/item/IMenuItem.java | 4 +- .../item/decorator/BaseMenuItemDecorator.java | 83 +++- .../andengine/entity/shape/IAreaShape.java | 28 -- src/org/andengine/entity/shape/IShape.java | 5 +- .../entity/shape/RectangularShape.java | 146 ------- src/org/andengine/entity/shape/Shape.java | 21 +- src/org/andengine/entity/sprite/Sprite.java | 9 +- .../entity/sprite/batch/SpriteBatch.java | 4 +- src/org/andengine/entity/text/Text.java | 18 +- .../collision/BaseCollisionChecker.java | 185 +++++++-- .../collision/EntityCollisionChecker.java | 142 +++++++ .../collision/LineCollisionChecker.java | 2 +- .../RectangularShapeCollisionChecker.java | 143 ------- .../collision/ShapeCollisionChecker.java | 180 --------- 23 files changed, 815 insertions(+), 676 deletions(-) delete mode 100644 src/org/andengine/entity/shape/IAreaShape.java delete mode 100644 src/org/andengine/entity/shape/RectangularShape.java create mode 100644 src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java delete mode 100644 src/org/andengine/util/algorithm/collision/RectangularShapeCollisionChecker.java delete mode 100644 src/org/andengine/util/algorithm/collision/ShapeCollisionChecker.java diff --git a/src/org/andengine/engine/camera/Camera.java b/src/org/andengine/engine/camera/Camera.java index 15d3c0b53..482d6c60d 100644 --- a/src/org/andengine/engine/camera/Camera.java +++ b/src/org/andengine/engine/camera/Camera.java @@ -5,12 +5,11 @@ import org.andengine.engine.handler.UpdateHandlerList; import org.andengine.entity.IEntity; import org.andengine.entity.primitive.Line; -import org.andengine.entity.shape.RectangularShape; import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.util.GLState; import org.andengine.util.Constants; import org.andengine.util.adt.transformation.Transformation; -import org.andengine.util.algorithm.collision.RectangularShapeCollisionChecker; +import org.andengine.util.algorithm.collision.EntityCollisionChecker; import org.andengine.util.math.MathUtils; /** @@ -277,15 +276,15 @@ public void updateChaseEntity() { } public boolean isLineVisible(final Line pLine) { - return RectangularShapeCollisionChecker.isVisible(this, pLine); + return EntityCollisionChecker.isVisible(this, pLine); } - public boolean isRectangularShapeVisible(final RectangularShape pRectangularShape) { - return RectangularShapeCollisionChecker.isVisible(this, pRectangularShape); + public boolean isEntityVisible(final IEntity pEntity) { + return EntityCollisionChecker.isVisible(this, pEntity); } - public boolean isRectangularShapeVisible(final float pX, final float pY, final float pWidth, final float pHeight, final Transformation pLocalToSceneTransformation) { - return RectangularShapeCollisionChecker.isVisible(this, pX, pY, pWidth, pHeight, pLocalToSceneTransformation); + public boolean isEntityVisible(final float pX, final float pY, final float pWidth, final float pHeight, final Transformation pLocalToSceneTransformation) { + return EntityCollisionChecker.isVisible(this, pX, pY, pWidth, pHeight, pLocalToSceneTransformation); } public void onApplySceneMatrix(final GLState pGLState) { diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index e844d4e96..e977e0576 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -9,10 +9,13 @@ import org.andengine.entity.modifier.EntityModifierList; import org.andengine.entity.modifier.IEntityModifier; import org.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher; +import org.andengine.entity.primitive.Line; +import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.util.GLState; import org.andengine.util.Constants; import org.andengine.util.adt.list.SmartList; import org.andengine.util.adt.transformation.Transformation; +import org.andengine.util.algorithm.collision.EntityCollisionChecker; import org.andengine.util.call.ParameterCallable; import org.andengine.util.color.Color; @@ -56,9 +59,9 @@ public void call(final IEntity pEntity) { protected boolean mChildrenIgnoreUpdate; protected boolean mChildrenSortPending; - protected int mTag = IEntity.TAG_INVALID; + protected int mTag = IEntity.TAG_DEFAULT; - protected int mZIndex = 0; + protected int mZIndex = IEntity.ZINDEX_DEFAULT; private IEntity mParent; @@ -71,31 +74,45 @@ public void call(final IEntity pEntity) { protected float mX; protected float mY; - protected float mRotation = 0; + protected float mOffsetCenterX = IEntity.OFFSET_CENTER_X_DEFAULT; + protected float mOffsetCenterY = IEntity.OFFSET_CENTER_Y_DEFAULT; + private float mAbsoluteOffsetCenterX; + private float mAbsoluteOffsetCenterY; - protected float mRotationCenterX = 0; - protected float mRotationCenterY = 0; + private float mWidth; + private float mHeight; - protected float mScaleX = 1; - protected float mScaleY = 1; + protected float mRotation = IEntity.ROTATION_DEFAULT; - protected float mScaleCenterX = 0; - protected float mScaleCenterY = 0; + protected float mRotationCenterX = IEntity.ROTATION_CENTER_X_DEFAULT; + protected float mRotationCenterY = IEntity.ROTATION_CENTER_Y_DEFAULT; + private float mAbsoluteRotationCenterX; + private float mAbsoluteRotationCenterY; - protected float mSkewX = 0; - protected float mSkewY = 0; + protected float mScaleX = IEntity.SCALE_X_DEFAULT; + protected float mScaleY = IEntity.SCALE_Y_DEFAULT; - protected float mSkewCenterX = 0; - protected float mSkewCenterY = 0; + protected float mScaleCenterX = IEntity.SCALE_CENTER_X_DEFAULT; + protected float mScaleCenterY = IEntity.SCALE_CENTER_Y_DEFAULT; + private float mAbsoluteScaleCenterX; + private float mAbsoluteScaleCenterY; + + protected float mSkewX = IEntity.SKEW_X_DEFAULT; + protected float mSkewY = IEntity.SKEW_Y_DEFAULT; + + protected float mSkewCenterX = IEntity.SKEW_CENTER_X_DEFAULT; + protected float mSkewCenterY = IEntity.SKEW_CENTER_Y_DEFAULT; + private float mAbsoluteSkewCenterX; + private float mAbsoluteSkewCenterY; private boolean mLocalToParentTransformationDirty = true; private boolean mParentToLocalTransformationDirty = true; - private final Transformation mLocalToParentTransformation = new Transformation(); - private final Transformation mParentToLocalTransformation = new Transformation(); + private final Transformation mLocalToParentTransformation = new Transformation(); // TODO Lazy init? + private final Transformation mParentToLocalTransformation = new Transformation(); // TODO Lazy init? - private final Transformation mLocalToSceneTransformation = new Transformation(); - private final Transformation mSceneToLocalTransformation = new Transformation(); + private final Transformation mLocalToSceneTransformation = new Transformation(); // TODO Lazy init! + private final Transformation mSceneToLocalTransformation = new Transformation(); // TODO Lazy init! private Object mUserData; @@ -110,6 +127,18 @@ public Entity() { public Entity(final float pX, final float pY) { this.mX = pX; this.mY = pY; + + this.updateAbsoluteOffsetCenter(); + this.updateAbsoluteRotationCenter(); + this.updateAbsoluteScaleCenter(); + this.updateAbsoluteSkewCenter(); + } + + public Entity(final float pX, final float pY, final float pWidth, final float pHeight) { + this.mX = pX; + this.mY = pY; + + this.setSize(pWidth, pHeight); } // =========================================================== @@ -151,6 +180,25 @@ public void setCullingEnabled(final boolean pCullingEnabled) { @Override public boolean isCulled(final Camera pCamera) { + return !EntityCollisionChecker.isVisible(pCamera, this); + } + + @Override + public boolean collidesWith(final IEntity pOtherEntity) { + if(pOtherEntity instanceof Line) { + return EntityCollisionChecker.checkCollision(this, (Line) pOtherEntity); + } else { + return EntityCollisionChecker.checkCollision(this, pOtherEntity); + } + } + + @Override + public boolean contains(final float pX, final float pY) { + return EntityCollisionChecker.checkContains(this, pX, pY); + } + + @Override + public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { return false; } @@ -259,6 +307,100 @@ public void setPosition(final float pX, final float pY) { this.mParentToLocalTransformationDirty = true; } + @Override + public float getWidth() { + return this.mWidth; + } + + @Deprecated + @Override + public float getWidthScaled() { + return this.mWidth * this.mScaleX; + } + + @Override + public void setWidth(final float pWidth) { + this.mWidth = pWidth; + + this.updateAbsoluteOffsetCenterX(); + this.updateAbsoluteRotationCenterX(); + this.updateAbsoluteScaleCenterX(); + this.updateAbsoluteSkewCenterX(); + } + + @Override + public float getHeight() { + return this.mHeight; + } + + @Deprecated + @Override + public float getHeightScaled() { + return this.mHeight * this.mScaleY; + } + + @Override + public void setHeight(final float pHeight) { + this.mHeight = pHeight; + + this.updateAbsoluteOffsetCenterY(); + this.updateAbsoluteRotationCenterY(); + this.updateAbsoluteScaleCenterY(); + this.updateAbsoluteSkewCenterY(); + } + + @Override + public void setSize(final float pWidth, final float pHeight) { + this.mWidth = pWidth; + this.mHeight = pHeight; + + this.updateAbsoluteOffsetCenter(); + this.updateAbsoluteRotationCenter(); + this.updateAbsoluteScaleCenter(); + this.updateAbsoluteSkewCenter(); + } + + @Override + public float getOffsetCenterX() { + return this.mOffsetCenterX; + } + + @Override + public float getOffsetCenterY() { + return this.mOffsetCenterY; + } + + @Override + public void setOffsetCenterX(final float pOffsetCenterX) { + this.mOffsetCenterX = pOffsetCenterX; + + this.updateAbsoluteOffsetCenterX(); + + this.mLocalToParentTransformationDirty = true; + this.mParentToLocalTransformationDirty = true; + } + + @Override + public void setOffsetCenterY(final float pOffsetCenterY) { + this.mOffsetCenterY = pOffsetCenterY; + + this.updateAbsoluteOffsetCenterY(); + + this.mLocalToParentTransformationDirty = true; + this.mParentToLocalTransformationDirty = true; + } + + @Override + public void setOffsetCenter(final float pOffsetCenterX, final float pOffsetCenterY) { + this.mOffsetCenterX = pOffsetCenterX; + this.mOffsetCenterY = pOffsetCenterY; + + this.updateAbsoluteOffsetCenter(); + + this.mLocalToParentTransformationDirty = true; + this.mParentToLocalTransformationDirty = true; + } + @Override public float getRotation() { return this.mRotation; @@ -291,6 +433,8 @@ public float getRotationCenterY() { public void setRotationCenterX(final float pRotationCenterX) { this.mRotationCenterX = pRotationCenterX; + this.updateAbsoluteRotationCenterX(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -299,6 +443,8 @@ public void setRotationCenterX(final float pRotationCenterX) { public void setRotationCenterY(final float pRotationCenterY) { this.mRotationCenterY = pRotationCenterY; + this.updateAbsoluteRotationCenterY(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -308,6 +454,8 @@ public void setRotationCenter(final float pRotationCenterX, final float pRotatio this.mRotationCenterX = pRotationCenterX; this.mRotationCenterY = pRotationCenterY; + this.updateAbsoluteRotationCenter(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -345,11 +493,7 @@ public void setScaleY(final float pScaleY) { @Override public void setScale(final float pScale) { - this.mScaleX = pScale; - this.mScaleY = pScale; - - this.mLocalToParentTransformationDirty = true; - this.mParentToLocalTransformationDirty = true; + this.setScale(pScale, pScale); } @Override @@ -375,6 +519,8 @@ public float getScaleCenterY() { public void setScaleCenterX(final float pScaleCenterX) { this.mScaleCenterX = pScaleCenterX; + this.updateAbsoluteScaleCenterX(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -383,6 +529,8 @@ public void setScaleCenterX(final float pScaleCenterX) { public void setScaleCenterY(final float pScaleCenterY) { this.mScaleCenterY = pScaleCenterY; + this.updateAbsoluteScaleCenterY(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -392,6 +540,8 @@ public void setScaleCenter(final float pScaleCenterX, final float pScaleCenterY) this.mScaleCenterX = pScaleCenterX; this.mScaleCenterY = pScaleCenterY; + this.updateAbsoluteScaleCenter(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -429,11 +579,7 @@ public void setSkewY(final float pSkewY) { @Override public void setSkew(final float pSkew) { - this.mSkewX = pSkew; - this.mSkewY = pSkew; - - this.mLocalToParentTransformationDirty = true; - this.mParentToLocalTransformationDirty = true; + this.setSkew(pSkew, pSkew); } @Override @@ -459,6 +605,8 @@ public float getSkewCenterY() { public void setSkewCenterX(final float pSkewCenterX) { this.mSkewCenterX = pSkewCenterX; + this.updateAbsoluteSkewCenterX(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -467,6 +615,8 @@ public void setSkewCenterX(final float pSkewCenterX) { public void setSkewCenterY(final float pSkewCenterY) { this.mSkewCenterY = pSkewCenterY; + this.updateAbsoluteSkewCenterY(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -476,6 +626,8 @@ public void setSkewCenter(final float pSkewCenterX, final float pSkewCenterY) { this.mSkewCenterX = pSkewCenterX; this.mSkewCenterY = pSkewCenterY; + this.updateAbsoluteSkewCenter(); + this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; } @@ -485,6 +637,30 @@ public boolean isRotatedOrScaledOrSkewed() { return (this.mRotation != 0) || (this.mScaleX != 1) || (this.mScaleY != 1) || (this.mSkewX != 0) || (this.mSkewY != 0); } + @Override + public void setAnchorCenterX(final float pAnchorCenterX) { + this.setOffsetCenterX(pAnchorCenterX); + this.setRotationCenterX(pAnchorCenterX); + this.setScaleCenterX(pAnchorCenterX); + this.setSkewCenterX(pAnchorCenterX); + } + + @Override + public void setAnchorCenterY(final float pAnchorCenterY) { + this.setOffsetCenterY(pAnchorCenterY); + this.setRotationCenterY(pAnchorCenterY); + this.setScaleCenterY(pAnchorCenterY); + this.setSkewCenterY(pAnchorCenterY); + } + + @Override + public void setAnchorCenter(final float pAnchorCenterX, final float pAnchorCenterY) { + this.setOffsetCenter(pAnchorCenterX, pAnchorCenterY); + this.setRotationCenter(pAnchorCenterX, pAnchorCenterY); + this.setScaleCenter(pAnchorCenterX, pAnchorCenterY); + this.setSkewCenter(pAnchorCenterX, pAnchorCenterY); + } + @Override public float getRed() { return this.mColor.getRed(); @@ -845,7 +1021,7 @@ public void clearEntityModifiers() { @Override public float[] getSceneCenterCoordinates() { - return this.convertLocalToSceneCoordinates(0, 0); + return this.convertLocalToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f); } @Override @@ -854,12 +1030,15 @@ public Transformation getLocalToParentTransformation() { if(this.mLocalToParentTransformationDirty) { localToParentTransformation.setToIdentity(); + /* Offset. */ + localToParentTransformation.postTranslate(this.mAbsoluteOffsetCenterX, this.mAbsoluteOffsetCenterY); + /* Scale. */ final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; if((scaleX != 1) || (scaleY != 1)) { - final float scaleCenterX = this.mScaleCenterX; - final float scaleCenterY = this.mScaleCenterY; + final float scaleCenterX = this.mAbsoluteScaleCenterX; + final float scaleCenterY = this.mAbsoluteScaleCenterY; /* TODO Check if it is worth to check for scaleCenterX == 0 && scaleCenterY == 0 as the two postTranslate can be saved. * The same obviously applies for all similar occurrences of this pattern in this class. */ @@ -873,8 +1052,8 @@ public Transformation getLocalToParentTransformation() { final float skewX = this.mSkewX; final float skewY = this.mSkewY; if((skewX != 0) || (skewY != 0)) { - final float skewCenterX = this.mSkewCenterX; - final float skewCenterY = this.mSkewCenterY; + final float skewCenterX = this.mAbsoluteSkewCenterX; + final float skewCenterY = this.mAbsoluteSkewCenterY; localToParentTransformation.postTranslate(-skewCenterX, -skewCenterY); localToParentTransformation.postSkew(skewX, skewY); @@ -884,8 +1063,8 @@ public Transformation getLocalToParentTransformation() { /* Rotation. */ final float rotation = this.mRotation; if(rotation != 0) { - final float rotationCenterX = this.mRotationCenterX; - final float rotationCenterY = this.mRotationCenterY; + final float rotationCenterX = this.mAbsoluteRotationCenterX; + final float rotationCenterY = this.mAbsoluteRotationCenterY; localToParentTransformation.postTranslate(-rotationCenterX, -rotationCenterY); localToParentTransformation.postRotate(rotation); @@ -912,38 +1091,41 @@ public Transformation getParentToLocalTransformation() { /* Rotation. */ final float rotation = this.mRotation; if(rotation != 0) { - final float rotationCenterX = this.mRotationCenterX; - final float rotationCenterY = this.mRotationCenterY; + final float absoluteRotationCenterX = this.mAbsoluteRotationCenterX; + final float absoluteRotationCenterY = this.mAbsoluteRotationCenterY; - parentToLocalTransformation.postTranslate(-rotationCenterX, -rotationCenterY); + parentToLocalTransformation.postTranslate(-absoluteRotationCenterX, -absoluteRotationCenterY); parentToLocalTransformation.postRotate(-rotation); - parentToLocalTransformation.postTranslate(rotationCenterX, rotationCenterY); + parentToLocalTransformation.postTranslate(absoluteRotationCenterX, absoluteRotationCenterY); } /* Skew. */ final float skewX = this.mSkewX; final float skewY = this.mSkewY; if((skewX != 0) || (skewY != 0)) { - final float skewCenterX = this.mSkewCenterX; - final float skewCenterY = this.mSkewCenterY; + final float absoluteSkewCenterX = this.mAbsoluteSkewCenterX; + final float absoluteSkewCenterY = this.mAbsoluteSkewCenterY; - parentToLocalTransformation.postTranslate(-skewCenterX, -skewCenterY); + parentToLocalTransformation.postTranslate(-absoluteSkewCenterX, -absoluteSkewCenterY); parentToLocalTransformation.postSkew(-skewX, -skewY); - parentToLocalTransformation.postTranslate(skewCenterX, skewCenterY); + parentToLocalTransformation.postTranslate(absoluteSkewCenterX, absoluteSkewCenterY); } /* Scale. */ final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; if((scaleX != 1) || (scaleY != 1)) { - final float scaleCenterX = this.mScaleCenterX; - final float scaleCenterY = this.mScaleCenterY; + final float absoluteScaleCenterX = this.mAbsoluteScaleCenterX; + final float absoluteScaleCenterY = this.mAbsoluteScaleCenterY; - parentToLocalTransformation.postTranslate(-scaleCenterX, -scaleCenterY); + parentToLocalTransformation.postTranslate(-absoluteScaleCenterX, -absoluteScaleCenterY); parentToLocalTransformation.postScale(1 / scaleX, 1 / scaleY); // TODO Division could be replaced by a multiplication of 'scale(X/Y)Inverse'... - parentToLocalTransformation.postTranslate(scaleCenterX, scaleCenterY); + parentToLocalTransformation.postTranslate(absoluteScaleCenterX, absoluteScaleCenterY); } + /* Offset. */ + parentToLocalTransformation.postTranslate(-this.mAbsoluteOffsetCenterX, -this.mAbsoluteOffsetCenterY); + this.mParentToLocalTransformationDirty = false; } return parentToLocalTransformation; @@ -1113,6 +1295,10 @@ public void reset() { this.mSkewX = 0; this.mSkewY = 0; + this.resetRotationCenter(); + this.resetSkewCenter(); + this.resetScaleCenter(); + this.mColor.reset(); if(this.mEntityModifiers != null) { @@ -1210,6 +1396,9 @@ private void allocateUpdateHandlers() { } protected void onApplyTransformations(final GLState pGLState) { + /* Offset. */ + this.applyOffset(pGLState); + /* Translation. */ this.applyTranslation(pGLState); @@ -1223,6 +1412,10 @@ protected void onApplyTransformations(final GLState pGLState) { this.applyScale(pGLState); } + protected void applyOffset(final GLState pGLState) { + pGLState.translateModelViewGLMatrixf(-this.mAbsoluteOffsetCenterX, -this.mAbsoluteOffsetCenterY, 0); + } + protected void applyTranslation(final GLState pGLState) { pGLState.translateModelViewGLMatrixf(this.mX, this.mY, 0); } @@ -1231,12 +1424,12 @@ protected void applyRotation(final GLState pGLState) { final float rotation = this.mRotation; if(rotation != 0) { - final float rotationCenterX = this.mRotationCenterX; - final float rotationCenterY = this.mRotationCenterY; + final float absoluteRotationCenterX = this.mAbsoluteRotationCenterX; + final float absoluteRotationCenterY = this.mAbsoluteRotationCenterY; - pGLState.translateModelViewGLMatrixf(rotationCenterX, rotationCenterY, 0); + pGLState.translateModelViewGLMatrixf(absoluteRotationCenterX, absoluteRotationCenterY, 0); pGLState.rotateModelViewGLMatrixf(rotation, 0, 0, 1); - pGLState.translateModelViewGLMatrixf(-rotationCenterX, -rotationCenterY, 0); + pGLState.translateModelViewGLMatrixf(-absoluteRotationCenterX, -absoluteRotationCenterY, 0); /* TODO There is a special, but very likely case when mRotationCenter and mScaleCenter are the same. * In that case the last glTranslatef of the rotation and the first glTranslatef of the scale is superfluous. @@ -1249,12 +1442,12 @@ protected void applySkew(final GLState pGLState) { final float skewY = this.mSkewY; if((skewX != 0) || (skewY != 0)) { - final float skewCenterX = this.mSkewCenterX; - final float skewCenterY = this.mSkewCenterY; + final float absoluteSkewCenterX = this.mAbsoluteSkewCenterX; + final float absoluteSkewCenterY = this.mAbsoluteSkewCenterY; - pGLState.translateModelViewGLMatrixf(skewCenterX, skewCenterY, 0); + pGLState.translateModelViewGLMatrixf(absoluteSkewCenterX, absoluteSkewCenterY, 0); pGLState.skewModelViewGLMatrixf(skewX, skewY); - pGLState.translateModelViewGLMatrixf(-skewCenterX, -skewCenterY, 0); + pGLState.translateModelViewGLMatrixf(-absoluteSkewCenterX, -absoluteSkewCenterY, 0); } } @@ -1263,12 +1456,12 @@ protected void applyScale(final GLState pGLState) { final float scaleY = this.mScaleY; if((scaleX != 1) || (scaleY != 1)) { - final float scaleCenterX = this.mScaleCenterX; - final float scaleCenterY = this.mScaleCenterY; + final float absoluteScaleCenterX = this.mAbsoluteScaleCenterX; + final float absoluteScaleCenterY = this.mAbsoluteScaleCenterY; - pGLState.translateModelViewGLMatrixf(scaleCenterX, scaleCenterY, 0); + pGLState.translateModelViewGLMatrixf(absoluteScaleCenterX, absoluteScaleCenterY, 0); pGLState.scaleModelViewGLMatrixf(scaleX, scaleY, 1); - pGLState.translateModelViewGLMatrixf(-scaleCenterX, -scaleCenterY, 0); + pGLState.translateModelViewGLMatrixf(-absoluteScaleCenterX, -absoluteScaleCenterY, 0); } } @@ -1334,6 +1527,70 @@ protected void onManagedUpdate(final float pSecondsElapsed) { } } } + + private void updateAbsoluteOffsetCenter() { + this.updateAbsoluteOffsetCenterX(); + this.updateAbsoluteOffsetCenterY(); + } + + private void updateAbsoluteOffsetCenterX() { + this.mAbsoluteOffsetCenterX = this.mOffsetCenterX * this.mWidth; + } + + private void updateAbsoluteOffsetCenterY() { + this.mAbsoluteOffsetCenterY = this.mOffsetCenterY * this.mHeight; + } + + private void updateAbsoluteRotationCenter() { + this.updateAbsoluteRotationCenterX(); + this.updateAbsoluteRotationCenterY(); + } + + private void updateAbsoluteRotationCenterX() { + this.mAbsoluteRotationCenterX = this.mRotationCenterX * this.mWidth; + } + + private void updateAbsoluteRotationCenterY() { + this.mAbsoluteRotationCenterY = this.mRotationCenterY * this.mHeight; + } + + private void updateAbsoluteScaleCenter() { + this.updateAbsoluteScaleCenterX(); + this.updateAbsoluteScaleCenterY(); + } + + private void updateAbsoluteScaleCenterX() { + this.mAbsoluteScaleCenterX = this.mScaleCenterX * this.mWidth; + } + + private void updateAbsoluteScaleCenterY() { + this.mAbsoluteScaleCenterY = this.mScaleCenterY * this.mHeight; + } + + private void updateAbsoluteSkewCenter() { + this.updateAbsoluteSkewCenterX(); + this.updateAbsoluteSkewCenterY(); + } + + private void updateAbsoluteSkewCenterX() { + this.mAbsoluteSkewCenterX = this.mSkewCenterX * this.mWidth; + } + + private void updateAbsoluteSkewCenterY() { + this.mAbsoluteSkewCenterY = this.mSkewCenterY * this.mHeight; + } + + public void resetRotationCenter() { + this.setRotationCenter(IEntity.ROTATION_CENTER_X_DEFAULT, IEntity.ROTATION_CENTER_Y_DEFAULT); + } + + public void resetScaleCenter() { + this.setScaleCenter(IEntity.SCALE_CENTER_X_DEFAULT, IEntity.SCALE_CENTER_Y_DEFAULT); + } + + public void resetSkewCenter() { + this.setSkewCenter(IEntity.SKEW_CENTER_X_DEFAULT, IEntity.SKEW_CENTER_Y_DEFAULT); + } private void assertEntityHasNoParent(final IEntity pEntity) throws IllegalStateException { if(pEntity.hasParent()) { diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index f01a885e3..1b3560a41 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -11,6 +11,7 @@ import org.andengine.engine.handler.runnable.RunnableHandler; import org.andengine.entity.modifier.IEntityModifier; import org.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher; +import org.andengine.entity.scene.ITouchArea; import org.andengine.entity.scene.Scene; import org.andengine.util.IDisposable; import org.andengine.util.adt.transformation.Transformation; @@ -24,12 +25,30 @@ * @author Nicolas Gramlich * @since 11:20:25 - 08.03.2010 */ -public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable { +public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITouchArea { // =========================================================== // Constants // =========================================================== - public static final int TAG_INVALID = Integer.MIN_VALUE; + public static final int TAG_DEFAULT = 0; + public static final int ZINDEX_DEFAULT = 0; + + public static final float OFFSET_CENTER_X_DEFAULT = 0.5f; + public static final float OFFSET_CENTER_Y_DEFAULT = 0.5f; + + public static final float ROTATION_DEFAULT = 0; + public static final float ROTATION_CENTER_X_DEFAULT = 0.5f; + public static final float ROTATION_CENTER_Y_DEFAULT = 0.5f; + + public static final float SCALE_X_DEFAULT = 1; + public static final float SCALE_Y_DEFAULT = 1; + public static final float SCALE_CENTER_X_DEFAULT = 0.5f; + public static final float SCALE_CENTER_Y_DEFAULT = 0.5f; + + public static final float SKEW_X_DEFAULT = 0; + public static final float SKEW_Y_DEFAULT = 0; + public static final float SKEW_CENTER_X_DEFAULT = 0.5f; + public static final float SKEW_CENTER_Y_DEFAULT = 0.5f; // =========================================================== // Methods @@ -65,6 +84,32 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable { public void setPosition(final IEntity pOtherEntity); public void setPosition(final float pX, final float pY); + public float getWidth(); + public float getHeight(); + + /** + * It is very likely you do NOT want to use this method! + * @return + */ + @Deprecated + public float getWidthScaled(); + /** + * It is very likely you do NOT want to use this method! + * @return + */ + @Deprecated + public float getHeightScaled(); + + public void setHeight(final float pHeight); + public void setWidth(final float pWidth); + public void setSize(final float pWidth, final float pHeight); + + public float getOffsetCenterX(); + public float getOffsetCenterY(); + public void setOffsetCenterX(final float pOffsetCenterX); + public void setOffsetCenterY(final float pOffsetCenterY); + public void setOffsetCenter(final float pOffsetCenterX, final float pOffsetCenterY); + public boolean isRotated(); public float getRotation(); public void setRotation(final float pRotation); @@ -103,7 +148,11 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable { public void setSkewCenterY(final float pSkewCenterY); public void setSkewCenter(final float pSkewCenterX, final float pSkewCenterY); - public boolean isRotatedOrScaledOrSkewed(); + public boolean isRotatedOrScaledOrSkewed(); // TODO What about the new offset? + + public void setAnchorCenterX(final float pAnchorCenterX); + public void setAnchorCenterY(final float pAnchorCenterY); + public void setAnchorCenter(final float pAnchorCenterX, final float pAnchorCenterY); public float getRed(); public float getGreen(); @@ -294,6 +343,8 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable { */ public boolean isCulled(final Camera pCamera); + public boolean collidesWith(final IEntity pOtherEntity); + public void setUserData(final Object pUserData); public Object getUserData(); diff --git a/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java b/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java index 711ec363e..50ee85f97 100644 --- a/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java @@ -2,8 +2,8 @@ import org.andengine.engine.camera.Camera; +import org.andengine.entity.IEntity; import org.andengine.entity.particle.Particle; -import org.andengine.entity.shape.RectangularShape; /** * (c) 2010 Nicolas Gramlich @@ -12,7 +12,7 @@ * @author Nicolas Gramlich * @since 21:21:10 - 14.03.2010 */ -public class OffCameraExpireParticleModifier implements IParticleModifier { +public class OffCameraExpireParticleModifier implements IParticleModifier { // =========================================================== // Constants // =========================================================== @@ -50,7 +50,7 @@ public void onInitializeParticle(final Particle pParticle) { @Override public void onUpdateParticle(final Particle pParticle) { - if(!this.mCamera.isRectangularShapeVisible(pParticle.getEntity())) { + if(!this.mCamera.isEntityVisible(pParticle.getEntity())) { pParticle.setExpired(true); } } diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java index 18e236fbe..efbe499c8 100644 --- a/src/org/andengine/entity/primitive/Line.java +++ b/src/org/andengine/entity/primitive/Line.java @@ -1,10 +1,9 @@ package org.andengine.entity.primitive; import org.andengine.engine.camera.Camera; +import org.andengine.entity.IEntity; import org.andengine.entity.primitive.vbo.HighPerformanceLineVertexBufferObject; import org.andengine.entity.primitive.vbo.ILineVertexBufferObject; -import org.andengine.entity.shape.IShape; -import org.andengine.entity.shape.RectangularShape; import org.andengine.entity.shape.Shape; import org.andengine.opengl.shader.PositionColorShaderProgram; import org.andengine.opengl.shader.constants.ShaderProgramConstants; @@ -15,7 +14,6 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; import org.andengine.util.algorithm.collision.LineCollisionChecker; -import org.andengine.util.algorithm.collision.RectangularShapeCollisionChecker; import org.andengine.util.exception.MethodNotSupportedException; import android.opengl.GLES20; @@ -265,14 +263,12 @@ public boolean contains(final float pX, final float pY) { } @Override - public boolean collidesWith(final IShape pOtherShape) { - if(pOtherShape instanceof Line) { - final Line otherLine = (Line) pOtherShape; + public boolean collidesWith(final IEntity pOtherEntity) { + if(pOtherEntity instanceof Line) { + final Line otherLine = (Line) pOtherEntity; return LineCollisionChecker.checkLineCollision(this.mX, this.mY, this.mX2, this.mY2, otherLine.mX, otherLine.mY, otherLine.mX2, otherLine.mY2); - } else if(pOtherShape instanceof RectangularShape) { - return RectangularShapeCollisionChecker.checkCollision((RectangularShape) pOtherShape, this); } else { - return false; + return super.collidesWith(pOtherEntity); } } diff --git a/src/org/andengine/entity/primitive/Mesh.java b/src/org/andengine/entity/primitive/Mesh.java index ba2656349..df0c82999 100644 --- a/src/org/andengine/entity/primitive/Mesh.java +++ b/src/org/andengine/entity/primitive/Mesh.java @@ -1,11 +1,10 @@ package org.andengine.entity.primitive; import org.andengine.engine.camera.Camera; +import org.andengine.entity.IEntity; import org.andengine.entity.primitive.vbo.DrawMode; import org.andengine.entity.primitive.vbo.HighPerformanceMeshVertexBufferObject; import org.andengine.entity.primitive.vbo.IMeshVertexBufferObject; -import org.andengine.entity.shape.IShape; -import org.andengine.entity.shape.RectangularShape; import org.andengine.entity.shape.Shape; import org.andengine.opengl.shader.PositionColorShaderProgram; import org.andengine.opengl.shader.constants.ShaderProgramConstants; @@ -140,15 +139,15 @@ public boolean contains(final float pX, final float pY) { } @Override - public boolean collidesWith(final IShape pOtherShape) { - if(pOtherShape instanceof Line) { + public boolean collidesWith(final IEntity pOtherEntity) { + if(pOtherEntity instanceof Mesh) { // TODO - return false; - } else if(pOtherShape instanceof RectangularShape) { + return super.collidesWith(pOtherEntity); + } else if(pOtherEntity instanceof Line) { // TODO - return false; + return super.collidesWith(pOtherEntity); } else { - return false; + return super.collidesWith(pOtherEntity); } } diff --git a/src/org/andengine/entity/primitive/Rectangle.java b/src/org/andengine/entity/primitive/Rectangle.java index 1eeab4434..bedd658bd 100644 --- a/src/org/andengine/entity/primitive/Rectangle.java +++ b/src/org/andengine/entity/primitive/Rectangle.java @@ -3,7 +3,7 @@ import org.andengine.engine.camera.Camera; import org.andengine.entity.primitive.vbo.HighPerformanceRectangleVertexBufferObject; import org.andengine.entity.primitive.vbo.IRectangleVertexBufferObject; -import org.andengine.entity.shape.RectangularShape; +import org.andengine.entity.shape.Shape; import org.andengine.opengl.shader.PositionColorShaderProgram; import org.andengine.opengl.shader.constants.ShaderProgramConstants; import org.andengine.opengl.util.GLState; @@ -22,7 +22,7 @@ * @author Nicolas Gramlich * @since 12:18:49 - 13.03.2010 */ -public class Rectangle extends RectangularShape { +public class Rectangle extends Shape { // =========================================================== // Constants // =========================================================== @@ -65,11 +65,12 @@ public Rectangle(final float pX, final float pY, final float pWidth, final float } public Rectangle(final float pX, final float pY, final float pWidth, final float pHeight, final IRectangleVertexBufferObject pRectangleVertexBufferObject) { - super(pX, pY, pWidth, pHeight, PositionColorShaderProgram.getInstance()); + super(pX, pY, PositionColorShaderProgram.getInstance()); this.mRectangleVertexBufferObject = pRectangleVertexBufferObject; - this.onUpdateVertices(); + this.setSize(pWidth, pHeight); + this.onUpdateColor(); this.setBlendingEnabled(true); diff --git a/src/org/andengine/entity/scene/CameraScene.java b/src/org/andengine/entity/scene/CameraScene.java index eef5adc5a..3e56b06ab 100644 --- a/src/org/andengine/entity/scene/CameraScene.java +++ b/src/org/andengine/entity/scene/CameraScene.java @@ -1,7 +1,7 @@ package org.andengine.entity.scene; import org.andengine.engine.camera.Camera; -import org.andengine.entity.shape.IAreaShape; +import org.andengine.entity.IEntity; import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.util.GLState; @@ -94,17 +94,17 @@ protected void onApplyMatrix(final GLState pGLState, final Camera pCamera) { // Methods // =========================================================== - public void centerShapeInCamera(final IAreaShape pAreaShape) { + public void centerEntityInCamera(final IEntity pEntity) { final Camera camera = this.mCamera; - pAreaShape.setPosition((camera.getWidth() - pAreaShape.getWidth()) * 0.5f, (camera.getHeight() - pAreaShape.getHeight()) * 0.5f); + pEntity.setPosition((camera.getWidth() - pEntity.getWidth()) * 0.5f, (camera.getHeight() - pEntity.getHeight()) * 0.5f); } - public void centerShapeInCameraHorizontally(final IAreaShape pAreaShape) { - pAreaShape.setPosition((this.mCamera.getWidth() - pAreaShape.getWidth()) * 0.5f, pAreaShape.getY()); + public void centerEntityInCameraHorizontally(final IEntity pEntity) { + pEntity.setPosition((this.mCamera.getWidth() - pEntity.getWidth()) * 0.5f, pEntity.getY()); } - public void centerShapeInCameraVertically(final IAreaShape pAreaShape) { - pAreaShape.setPosition(pAreaShape.getX(), (this.mCamera.getHeight() - pAreaShape.getHeight()) * 0.5f); + public void centerEntityInCameraVertically(final IEntity pEntity) { + pEntity.setPosition(pEntity.getX(), (this.mCamera.getHeight() - pEntity.getHeight()) * 0.5f); } // =========================================================== diff --git a/src/org/andengine/entity/scene/background/ParallaxBackground.java b/src/org/andengine/entity/scene/background/ParallaxBackground.java index 22bb53979..955def9ff 100644 --- a/src/org/andengine/entity/scene/background/ParallaxBackground.java +++ b/src/org/andengine/entity/scene/background/ParallaxBackground.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import org.andengine.engine.camera.Camera; -import org.andengine.entity.shape.IAreaShape; +import org.andengine.entity.IEntity; import org.andengine.opengl.util.GLState; /** @@ -91,15 +91,15 @@ public static class ParallaxEntity { // =========================================================== final float mParallaxFactor; - final IAreaShape mAreaShape; + final IEntity mEntity; // =========================================================== // Constructors // =========================================================== - public ParallaxEntity(final float pParallaxFactor, final IAreaShape pAreaShape) { + public ParallaxEntity(final float pParallaxFactor, final IEntity pEntity) { this.mParallaxFactor = pParallaxFactor; - this.mAreaShape = pAreaShape; + this.mEntity = pEntity; } // =========================================================== @@ -118,20 +118,20 @@ public void onDraw(final GLState pGLState, final Camera pCamera, final float pPa pGLState.pushModelViewGLMatrix(); { final float cameraWidth = pCamera.getWidth(); - final float shapeWidthScaled = this.mAreaShape.getWidthScaled(); - float baseOffset = (pParallaxValue * this.mParallaxFactor) % shapeWidthScaled; + final float entityWidthScaled = this.mEntity.getWidth() * this.mEntity.getScaleX(); + float baseOffset = (pParallaxValue * this.mParallaxFactor) % entityWidthScaled; while(baseOffset > 0) { - baseOffset -= shapeWidthScaled; + baseOffset -= entityWidthScaled; } pGLState.translateModelViewGLMatrixf(baseOffset, 0, 0); float currentMaxX = baseOffset; do { - this.mAreaShape.onDraw(pGLState, pCamera); - pGLState.translateModelViewGLMatrixf(shapeWidthScaled, 0, 0); - currentMaxX += shapeWidthScaled; + this.mEntity.onDraw(pGLState, pCamera); + pGLState.translateModelViewGLMatrixf(entityWidthScaled, 0, 0); + currentMaxX += entityWidthScaled; } while(currentMaxX < cameraWidth); } pGLState.popModelViewGLMatrix(); diff --git a/src/org/andengine/entity/scene/menu/item/IMenuItem.java b/src/org/andengine/entity/scene/menu/item/IMenuItem.java index 77b340cf5..bb1c6a49c 100644 --- a/src/org/andengine/entity/scene/menu/item/IMenuItem.java +++ b/src/org/andengine/entity/scene/menu/item/IMenuItem.java @@ -1,6 +1,6 @@ package org.andengine.entity.scene.menu.item; -import org.andengine.entity.shape.IAreaShape; +import org.andengine.entity.shape.IShape; /** * (c) 2010 Nicolas Gramlich @@ -9,7 +9,7 @@ * @author Nicolas Gramlich * @since 13:27:16 - 07.07.2010 */ -public interface IMenuItem extends IAreaShape { +public interface IMenuItem extends IShape { // =========================================================== // Constants // =========================================================== diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index de6039c18..250336d19 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -12,7 +12,6 @@ import org.andengine.entity.modifier.IEntityModifier; import org.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher; import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.entity.shape.IShape; import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.shader.ShaderProgram; import org.andengine.opengl.util.GLState; @@ -122,7 +121,8 @@ public void setPosition(final float pX, final float pY) { public float getWidth() { return this.mMenuItem.getWidth(); } - + + @Deprecated @Override public float getWidthScaled() { return this.mMenuItem.getWidthScaled(); @@ -132,7 +132,8 @@ public float getWidthScaled() { public float getHeight() { return this.mMenuItem.getHeight(); } - + + @Deprecated @Override public float getHeightScaled() { return this.mMenuItem.getHeightScaled(); @@ -213,6 +214,31 @@ public void setColor(final float pRed, final float pGreen, final float pBlue, fi this.mMenuItem.setColor(pRed, pGreen, pBlue, pAlpha); } + @Override + public float getOffsetCenterX() { + return this.mMenuItem.getOffsetCenterX(); + } + + @Override + public float getOffsetCenterY() { + return this.mMenuItem.getOffsetCenterY(); + } + + @Override + public void setOffsetCenterX(final float pOffsetCenterX) { + this.mMenuItem.setOffsetCenterX(pOffsetCenterX); + } + + @Override + public void setOffsetCenterY(final float pOffsetCenterY) { + this.mMenuItem.setOffsetCenterY(pOffsetCenterY); + } + + @Override + public void setOffsetCenter(final float pOffsetCenterX, final float pOffsetCenterY) { + this.mMenuItem.setOffsetCenter(pOffsetCenterX, pOffsetCenterY); + } + @Override public boolean isRotated() { return this.mMenuItem.isRotated(); @@ -312,62 +338,62 @@ public void setScaleCenterY(final float pScaleCenterY) { public void setScaleCenter(final float pScaleCenterX, final float pScaleCenterY) { this.mMenuItem.setScaleCenter(pScaleCenterX, pScaleCenterY); } - + @Override public boolean isSkewed() { return this.mMenuItem.isSkewed(); } - + @Override public float getSkewX() { return this.mMenuItem.getSkewX(); } - + @Override public float getSkewY() { return this.mMenuItem.getSkewY(); } - + @Override public void setSkew(final float pSkew) { this.mMenuItem.setSkew(pSkew); } - + @Override public void setSkew(final float pSkewX, final float pSkewY) { this.mMenuItem.setSkew(pSkewX, pSkewY); } - + @Override public void setSkewX(final float pSkewX) { this.mMenuItem.setSkewX(pSkewX); } - + @Override public void setSkewY(final float pSkewY) { this.mMenuItem.setSkewY(pSkewY); } - + @Override public float getSkewCenterX() { return this.mMenuItem.getSkewCenterX(); } - + @Override public float getSkewCenterY() { return this.mMenuItem.getSkewCenterY(); } - + @Override public void setSkewCenterX(final float pSkewCenterX) { this.mMenuItem.setSkewCenterX(pSkewCenterX); } - + @Override public void setSkewCenterY(final float pSkewCenterY) { this.mMenuItem.setSkewCenterY(pSkewCenterY); } - + @Override public void setSkewCenter(final float pSkewCenterX, final float pSkewCenterY) { this.mMenuItem.setSkewCenter(pSkewCenterX, pSkewCenterY); @@ -377,10 +403,25 @@ public void setSkewCenter(final float pSkewCenterX, final float pSkewCenterY) { public boolean isRotatedOrScaledOrSkewed() { return this.mMenuItem.isRotatedOrScaledOrSkewed(); } - + @Override - public boolean collidesWith(final IShape pOtherShape) { - return this.mMenuItem.collidesWith(pOtherShape); + public void setAnchorCenterX(final float pAnchorCenterX) { + this.setAnchorCenterX(pAnchorCenterX); + } + + @Override + public void setAnchorCenterY(final float pAnchorCenterY) { + this.setAnchorCenterY(pAnchorCenterY); + } + + @Override + public void setAnchorCenter(final float pAnchorCenterX, final float pAnchorCenterY) { + this.mMenuItem.setAnchorCenter(pAnchorCenterX, pAnchorCenterY); + } + + @Override + public boolean collidesWith(final IEntity pOtherEntity) { + return this.mMenuItem.collidesWith(pOtherEntity); } @Override @@ -575,7 +616,7 @@ public IEntity getChild(final int pTag) { } @Override - public IEntity getChild(IEntityMatcher pEntityMatcher) { + public IEntity getChild(final IEntityMatcher pEntityMatcher) { return this.mMenuItem.getChild(pEntityMatcher); } @@ -584,6 +625,7 @@ public ArrayList query(final IEntityMatcher pEntityMatcher) { return this.mMenuItem.query(pEntityMatcher); } + @Override public > L query(final IEntityMatcher pEntityMatcher, final L pResult) { return this.mMenuItem.query(pEntityMatcher, pResult); } @@ -593,6 +635,7 @@ public ArrayList queryForSubclass(final IEntityMatcher pE return this.mMenuItem.queryForSubclass(pEntityMatcher); } + @Override public , S extends IEntity> L queryForSubclass(final IEntityMatcher pEntityMatcher, final L pResult) throws ClassCastException { return this.mMenuItem.queryForSubclass(pEntityMatcher, pResult); } @@ -601,7 +644,7 @@ public , S extends IEntity> L queryForSubclass(final IEntityMa public void sortChildren() { this.mMenuItem.sortChildren(); } - + @Override public void sortChildren(final boolean pImmediate) { this.mMenuItem.sortChildren(pImmediate); diff --git a/src/org/andengine/entity/shape/IAreaShape.java b/src/org/andengine/entity/shape/IAreaShape.java deleted file mode 100644 index 429b829cb..000000000 --- a/src/org/andengine/entity/shape/IAreaShape.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.andengine.entity.shape; - - -/** - * (c) Zynga 2011 - * - * @author Nicolas Gramlich - * @since 19:01:16 - 07.08.2011 - */ -public interface IAreaShape extends IShape { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - public float getWidth(); - public float getHeight(); - - public float getWidthScaled(); - public float getHeightScaled(); - - public void setHeight(final float pHeight); - public void setWidth(final float pWidth); - public void setSize(final float pWidth, final float pHeight); -} diff --git a/src/org/andengine/entity/shape/IShape.java b/src/org/andengine/entity/shape/IShape.java index 16336cafb..d14d14cf0 100644 --- a/src/org/andengine/entity/shape/IShape.java +++ b/src/org/andengine/entity/shape/IShape.java @@ -1,7 +1,6 @@ package org.andengine.entity.shape; import org.andengine.entity.IEntity; -import org.andengine.entity.scene.ITouchArea; import org.andengine.opengl.shader.ShaderProgram; import org.andengine.opengl.vbo.IVertexBufferObject; import org.andengine.opengl.vbo.VertexBufferObjectManager; @@ -15,7 +14,7 @@ * @author Nicolas Gramlich * @since 13:32:52 - 07.07.2010 */ -public interface IShape extends IEntity, ITouchArea { +public interface IShape extends IEntity { // =========================================================== // Constants // =========================================================== @@ -30,8 +29,6 @@ public interface IShape extends IEntity, ITouchArea { // Methods // =========================================================== - public boolean collidesWith(final IShape pOtherShape); - public boolean isBlendingEnabled(); public void setBlendingEnabled(final boolean pBlendingEnabled); public int getSourceBlendFunction(); diff --git a/src/org/andengine/entity/shape/RectangularShape.java b/src/org/andengine/entity/shape/RectangularShape.java deleted file mode 100644 index 24588f8cd..000000000 --- a/src/org/andengine/entity/shape/RectangularShape.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.andengine.entity.shape; - -import org.andengine.engine.camera.Camera; -import org.andengine.entity.primitive.Line; -import org.andengine.opengl.shader.ShaderProgram; -import org.andengine.util.algorithm.collision.RectangularShapeCollisionChecker; - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 11:37:50 - 04.04.2010 - */ -public abstract class RectangularShape extends Shape implements IAreaShape { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - protected float mWidth; - protected float mHeight; - - // =========================================================== - // Constructors - // =========================================================== - - public RectangularShape(final float pX, final float pY, final float pWidth, final float pHeight, final ShaderProgram pShaderProgram) { - super(pX, pY, pShaderProgram); - - this.mWidth = pWidth; - this.mHeight = pHeight; - - this.resetRotationCenter(); - this.resetScaleCenter(); - this.resetSkewCenter(); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - @Override - public float getWidth() { - return this.mWidth; - } - - @Override - public float getHeight() { - return this.mHeight; - } - - @Override - public void setWidth(final float pWidth) { - this.mWidth = pWidth; - this.onUpdateVertices(); - } - - @Override - public void setHeight(final float pHeight) { - this.mHeight = pHeight; - this.onUpdateVertices(); - } - - @Override - public void setSize(final float pWidth, final float pHeight) { - this.mWidth = pWidth; - this.mHeight = pHeight; - this.onUpdateVertices(); - } - - @Override - public float getWidthScaled() { - return this.getWidth() * this.mScaleX; - } - - @Override - public float getHeightScaled() { - return this.getHeight() * this.mScaleY; - } - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - @Override - public boolean isCulled(final Camera pCamera) { - return !RectangularShapeCollisionChecker.isVisible(pCamera, this); - } - - @Override - public void reset() { - super.reset(); - - this.resetRotationCenter(); - this.resetSkewCenter(); - this.resetScaleCenter(); - } - - @Override - public boolean contains(final float pX, final float pY) { - return RectangularShapeCollisionChecker.checkContains(this, pX, pY); - } - - @Override - public float[] getSceneCenterCoordinates() { - return this.convertLocalToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f); - } - - @Override - public boolean collidesWith(final IShape pOtherShape) { - if(pOtherShape instanceof RectangularShape) { - return RectangularShapeCollisionChecker.checkCollision(this, (RectangularShape) pOtherShape); - } else if(pOtherShape instanceof Line) { - return RectangularShapeCollisionChecker.checkCollision(this, (Line) pOtherShape); - } else { - return false; - } - } - - // =========================================================== - // Methods - // =========================================================== - - public void resetRotationCenter() { - this.mRotationCenterX = this.mWidth * 0.5f; - this.mRotationCenterY = this.mHeight * 0.5f; - } - - public void resetScaleCenter() { - this.mScaleCenterX = this.mWidth * 0.5f; - this.mScaleCenterY = this.mHeight * 0.5f; - } - - public void resetSkewCenter() { - this.mSkewCenterX = this.mWidth * 0.5f; - this.mSkewCenterY = this.mHeight * 0.5f; - } - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/entity/shape/Shape.java b/src/org/andengine/entity/shape/Shape.java index 6c8548368..8036fea07 100644 --- a/src/org/andengine/entity/shape/Shape.java +++ b/src/org/andengine/entity/shape/Shape.java @@ -2,7 +2,6 @@ import org.andengine.engine.camera.Camera; import org.andengine.entity.Entity; -import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.shader.ShaderProgram; import org.andengine.opengl.texture.ITexture; import org.andengine.opengl.texture.TextureOptions; @@ -111,8 +110,24 @@ protected void postDraw(final GLState pGLState, final Camera pCamera) { } @Override - public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { - return false; + public void setWidth(final float pWidth) { + super.setWidth(pWidth); + + this.onUpdateVertices(); + } + + @Override + public void setHeight(final float pHeight) { + super.setHeight(pHeight); + + this.onUpdateVertices(); + } + + @Override + public void setSize(final float pWidth, final float pHeight) { + super.setSize(pWidth, pHeight); + + this.onUpdateVertices(); } @Override diff --git a/src/org/andengine/entity/sprite/Sprite.java b/src/org/andengine/entity/sprite/Sprite.java index 43435caa4..179bd8eaa 100644 --- a/src/org/andengine/entity/sprite/Sprite.java +++ b/src/org/andengine/entity/sprite/Sprite.java @@ -1,7 +1,7 @@ package org.andengine.entity.sprite; import org.andengine.engine.camera.Camera; -import org.andengine.entity.shape.RectangularShape; +import org.andengine.entity.shape.Shape; import org.andengine.entity.sprite.vbo.HighPerformanceSpriteVertexBufferObject; import org.andengine.entity.sprite.vbo.ISpriteVertexBufferObject; import org.andengine.opengl.shader.PositionColorTextureCoordinatesShaderProgram; @@ -23,7 +23,7 @@ * @author Nicolas Gramlich * @since 19:22:38 - 09.03.2010 */ -public class Sprite extends RectangularShape { +public class Sprite extends Shape { // =========================================================== // Constants // =========================================================== @@ -103,7 +103,7 @@ public Sprite(final float pX, final float pY, final float pWidth, final float pH } public Sprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final ISpriteVertexBufferObject pSpriteVertexBufferObject, final ShaderProgram pShaderProgram) { - super(pX, pY, pWidth, pHeight, pShaderProgram); + super(pX, pY, pShaderProgram); this.mTextureRegion = pTextureRegion; this.mSpriteVertexBufferObject = pSpriteVertexBufferObject; @@ -111,7 +111,8 @@ public Sprite(final float pX, final float pY, final float pWidth, final float pH this.setBlendingEnabled(true); this.initBlendFunction(pTextureRegion); - this.onUpdateVertices(); + this.setSize(pWidth, pHeight); + this.onUpdateColor(); this.onUpdateTextureCoordinates(); } diff --git a/src/org/andengine/entity/sprite/batch/SpriteBatch.java b/src/org/andengine/entity/sprite/batch/SpriteBatch.java index ce2ab9c6b..c30b71134 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/SpriteBatch.java @@ -1,7 +1,7 @@ package org.andengine.entity.sprite.batch; import org.andengine.engine.camera.Camera; -import org.andengine.entity.shape.IShape; +import org.andengine.entity.IEntity; import org.andengine.entity.shape.Shape; import org.andengine.entity.sprite.Sprite; import org.andengine.entity.sprite.batch.vbo.HighPerformanceSpriteBatchVertexBufferObject; @@ -162,7 +162,7 @@ public ISpriteBatchVertexBufferObject getVertexBufferObject() { } @Override - public boolean collidesWith(final IShape pOtherShape) { + public boolean collidesWith(final IEntity pOtherEntity) { return false; } diff --git a/src/org/andengine/entity/text/Text.java b/src/org/andengine/entity/text/Text.java index 6e9a88043..0f882f8ca 100644 --- a/src/org/andengine/entity/text/Text.java +++ b/src/org/andengine/entity/text/Text.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import org.andengine.engine.camera.Camera; -import org.andengine.entity.shape.RectangularShape; +import org.andengine.entity.shape.Shape; import org.andengine.entity.text.exception.OutOfCharactersException; import org.andengine.entity.text.vbo.HighPerformanceTextVertexBufferObject; import org.andengine.entity.text.vbo.ITextVertexBufferObject; @@ -33,7 +33,7 @@ * @author Nicolas Gramlich * @since 10:54:59 - 03.04.2010 */ -public class Text extends RectangularShape { +public class Text extends Shape { // =========================================================== // Constants // =========================================================== @@ -147,7 +147,7 @@ public Text(final float pX, final float pY, final IFont pFont, final CharSequenc } public Text(final float pX, final float pY, final IFont pFont, final CharSequence pText, final int pCharactersMaximum, final TextOptions pTextOptions, final ITextVertexBufferObject pTextVertexBufferObject, final ShaderProgram pShaderProgram) { - super(pX, pY, 0, 0, pShaderProgram); + super(pX, pY, pShaderProgram); this.mFont = pFont; this.mTextOptions = pTextOptions; @@ -211,16 +211,10 @@ public void setText(final CharSequence pText) throws OutOfCharactersException { this.mLineAlignmentWidth = this.mTextOptions.mAutoWrapWidth; } - super.mWidth = this.mLineAlignmentWidth; - super.mHeight = lineCount * font.getLineHeight() + (lineCount - 1) * this.mTextOptions.mLeading; + final float width = this.mLineAlignmentWidth; + final float height = lineCount * font.getLineHeight() + (lineCount - 1) * this.mTextOptions.mLeading; - this.mRotationCenterX = super.mWidth * 0.5f; - this.mRotationCenterY = super.mHeight * 0.5f; - - this.mScaleCenterX = this.mRotationCenterX; - this.mScaleCenterY = this.mRotationCenterY; - - this.onUpdateVertices(); + this.setSize(width, height); } public ArrayList getLines() { diff --git a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java index f3e03e490..303d58e7f 100644 --- a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java +++ b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java @@ -1,5 +1,8 @@ package org.andengine.util.algorithm.collision; +import org.andengine.opengl.util.VertexUtils; +import org.andengine.util.Constants; + /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -33,25 +36,25 @@ public class BaseCollisionChecker { // =========================================================== public static boolean checkAxisAlignedRectangleCollision(final float pLeftA, final float pTopA, final float pRightA, final float pBottomA, final float pLeftB, final float pTopB, final float pRightB, final float pBottomB) { - return pLeftA < pRightB && - pLeftB < pRightA && - pTopA < pBottomB && - pTopB < pBottomA; + return (pLeftA < pRightB) && + (pLeftB < pRightA) && + (pTopA < pBottomB) && + (pTopB < pBottomA); } public static boolean checkAxisAlignedRectangleContains(final float pLeft, final float pTop, final float pRight, final float pBottom, final float pX, final float pY) { - return pX > pLeft && - pX < pRight && - pY > pTop && - pY < pBottom; + return (pX > pLeft) && + (pX < pRight) && + (pY > pTop) && + (pY < pBottom); } /** - * Returns an indicator of where the specified point (PX, PY) lies with - * respect to the line segment from (X1, Y1) to (X2, Y2). The + * Returns an indicator of where the specified point (PX, PY) lies with + * respect to the line segment from (X1, Y1) to (X2, Y2). The * return value can be either 1, -1, or 0 and indicates in which direction - * the specified line must pivot around its first endpoint, (X1, Y1), - * in order to point at the specified point (PX, PY). + * the specified line must pivot around its first endpoint, (X1, Y1), + * in order to point at the specified point (PX, PY). *

* A return value of 1 indicates that the line segment must turn in the * direction that takes the positive X axis towards the negative Y axis. In @@ -68,16 +71,16 @@ public static boolean checkAxisAlignedRectangleContains(final float pLeft, final *

* If the point is colinear with the line segment, but not between the * endpoints, then the value will be -1 if the point lies - * "beyond (X1, Y1)" or 1 if the point lies "beyond (X2, Y2)". + * "beyond (X1, Y1)" or 1 if the point lies "beyond (X2, Y2)". * - * @param pX1 - * , Y1 the coordinates of the beginning of the specified + * @param pX1 , + * @param pY1 the coordinates of the beginning of the specified * line segment - * @param pX2 - * , Y2 the coordinates of the end of the specified line + * @param pX2 , + * @param pY2 the coordinates of the end of the specified line * segment - * @param pPX - * , PY the coordinates of the specified point to be + * @param pPX , + * @param pPY the coordinates of the specified point to be * compared with the specified line segment * @return an integer that indicates the position of the third specified * coordinates with respect to the line segment formed by the first @@ -88,7 +91,7 @@ public static int relativeCCW(final float pX1, final float pY1, float pX2, float pY2 -= pY1; pPX -= pX1; pPY -= pY1; - float ccw = pPX * pY2 - pPY * pX2; + float ccw = (pPX * pY2) - (pPY * pX2); if (ccw == 0.0f) { // The point is colinear, classify based on which side of // the segment the point falls on. We can calculate a @@ -96,7 +99,7 @@ public static int relativeCCW(final float pX1, final float pY1, float pX2, float // segment - a negative value indicates the point projects // outside of the segment in the direction of the particular // endpoint used as the origin for the projection. - ccw = pPX * pX2 + pPY * pY2; + ccw = (pPX * pX2) + (pPY * pY2); if (ccw > 0.0f) { // Reverse the projection to be relative to the original X2,Y2 // X2 and Y2 are simply negated. @@ -107,7 +110,7 @@ public static int relativeCCW(final float pX1, final float pY1, float pX2, float // the inverse anyway - thus we leave X2 & Y2 negated. pPX -= pX2; pPY -= pY2; - ccw = pPX * pX2 + pPY * pY2; + ccw = (pPX * pX2) + (pPY * pY2); if (ccw < 0.0f) { ccw = 0.0f; } @@ -116,6 +119,144 @@ public static int relativeCCW(final float pX1, final float pY1, float pX2, float return (ccw < 0.0f) ? -1 : ((ccw > 0.0f) ? 1 : 0); } + /** + * Calls through to {@link BaseCollisionChecker#checkCollisionSub(float[], int, int, int, int, int, float[], int, int, int, int)} with the default parameters internally used by different AndEngine primitives. + * @param pVerticesA + * @param pVertexCountA the number of vertices in pVerticesA + * @param pVerticesB + * @param pVertexCountB the number of vertices in pVerticesB + * @return + */ + public static boolean checkCollision(final float[] pVerticesA, final int pVertexCountA, final float[] pVerticesB, final int pVertexCountB) { + return BaseCollisionChecker.checkCollision(pVerticesA, pVertexCountA, Constants.VERTEX_INDEX_X, Constants.VERTEX_INDEX_Y, 2, pVerticesB, pVertexCountB, Constants.VERTEX_INDEX_X, Constants.VERTEX_INDEX_Y, 2); + } + + /** + * @param pVerticesA + * @param pVertexCountA the number of vertices in pVerticesA + * @param pVertexOffsetXA + * @param pVertexOffsetYA + * @param pVertexStrideA + * @param pVerticesB + * @param pVertexCountB the number of vertices in pVerticesB + * @param pVertexOffsetXB + * @param pVertexOffsetYB + * @param pVertexStrideB + * @return + */ + public static boolean checkCollision(final float[] pVerticesA, final int pVertexCountA, final int pVertexOffsetXA, final int pVertexOffsetYA, final int pVertexStrideA, final float[] pVerticesB, final int pVertexCountB, final int pVertexOffsetXB, final int pVertexOffsetYB, final int pVertexStrideB) { + /* Check all the lines of A ... */ + for(int a = pVertexCountA - 2; a >= 0; a--) { + /* ... against all lines in B. */ + if(BaseCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, a, a + 1, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)){ + return true; + } + } + /* Also check the 'around the corner of the array' line of A against all lines in B. */ + if(BaseCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, pVertexCountA - 1, 0, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)){ + return true; + } else { + /* At last check if one polygon 'contains' the other one by checking + * if one vertex of the one vertices is contained by all of the other vertices. */ + if(BaseCollisionChecker.checkContains(pVerticesA, pVertexCountA, VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, 0), VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, 0))) { + return true; + } else if(BaseCollisionChecker.checkContains(pVerticesB, pVertexCountB, VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, 0), VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, 0))) { + return true; + } else { + return false; + } + } + } + + /** + * Checks line specified by pVertexIndexA1 and pVertexIndexA2 in pVerticesA against all lines in pVerticesB. + * + * @param pVerticesA + * @param pVertexOffsetXA + * @param pVertexOffsetYA + * @param pVertexStrideA + * @param pVertexIndexA1 the first point of the line in pVerticesA + * @param pVertexIndexA2 the second point of the line in pVerticesA + * @param pVerticesB + * @param pVertexCountB the number of vertices in pVerticesB + * @param pVertexOffsetXB + * @param pVertexOffsetYB + * @param pVertexStrideB + * @return + */ + static boolean checkCollisionSub(final float[] pVerticesA, final int pVertexOffsetXA, final int pVertexOffsetYA, final int pVertexStrideA, final int pVertexIndexA1, final int pVertexIndexA2, final float[] pVerticesB, final int pVertexCountB, final int pVertexOffsetXB, final int pVertexOffsetYB, final int pVertexStrideB) { + /* Check against all the lines of B. */ + final float vertexA1X = VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, pVertexIndexA1); + final float vertexA1Y = VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, pVertexIndexA1); + final float vertexA2X = VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, pVertexIndexA2); + final float vertexA2Y = VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, pVertexIndexA2); + + for(int b = pVertexCountB - 2; b >= 0; b--) { + final float vertexB1X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, b); + final float vertexB1Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, b); + final float vertexB2X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, b + 1); + final float vertexB2Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, b + 1); + if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)){ + return true; + } + } + /* Also check the 'around the corner of the array' line of B. */ + final float vertexB1X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, pVertexCountB - 1); + final float vertexB1Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, pVertexCountB - 1); + final float vertexB2X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, 0); + final float vertexB2Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, 0); + if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)){ + return true; + } + return false; + } + + /** + * Calls through to {@link BaseCollisionChecker#checkContains(float[], int, int, int, int, float, float)} with the default parameters internally used by different AndEngine primitives. + * + * @param pVertices + * @param pVertexCount the number of vertices in pVertices + * @param pX + * @param pY + * @return + */ + public static boolean checkContains(final float[] pVertices, final int pVertexCount, final float pX, final float pY) { + return BaseCollisionChecker.checkContains(pVertices, pVertexCount, Constants.VERTEX_INDEX_X, Constants.VERTEX_INDEX_Y, 2, pX, pY); + } + + /** + * Works with complex polygons! + * + * @see http://alienryderflex.com/polygon/ + * + * @param pVertices + * @param pVertexCount the number of vertices in pVertices + * @param pVertexOffsetX + * @param pVertexOffsetY + * @param pVertexStride + * @param pX + * @param pY + * @return true when the point defined by (pX, pY) is inside the polygon defined by pVertices, false. If the point is exactly on the edge of the polygon, the result can be true or false. + */ + public static boolean checkContains(final float[] pVertices, final int pVertexCount, final int pVertexOffsetX, final int pVertexOffsetY, final int pVertexStride, final float pX, final float pY) { + boolean odd = false; + + int j = pVertexCount - 1; + for(int i = 0; i < pVertexCount; i++) { + final float vertexXI = VertexUtils.getVertex(pVertices, pVertexOffsetX, pVertexStride, i); + final float vertexYI = VertexUtils.getVertex(pVertices, pVertexOffsetY, pVertexStride, i); + final float vertexXJ = VertexUtils.getVertex(pVertices, pVertexOffsetX, pVertexStride, j); + final float vertexYJ = VertexUtils.getVertex(pVertices, pVertexOffsetY, pVertexStride, j); + + if((((vertexYI < pY) && (vertexYJ >= pY)) || ((vertexYJ < pY) && (vertexYI >= pY))) && ((vertexXI <= pX) || (vertexXJ <= pX))) { + odd ^= ((vertexXI + (((pY - vertexYI) / (vertexYJ - vertexYI)) * (vertexXJ - vertexXI))) < pX); + } + j = i; + } + + return odd; + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java new file mode 100644 index 000000000..89f44a8f3 --- /dev/null +++ b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java @@ -0,0 +1,142 @@ +package org.andengine.util.algorithm.collision; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.IEntity; +import org.andengine.entity.primitive.Line; +import org.andengine.util.Constants; +import org.andengine.util.adt.transformation.Transformation; +import org.andengine.util.math.MathUtils; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 11:50:19 - 11.03.2010 + */ +public class EntityCollisionChecker { + // =========================================================== + // Constants + // =========================================================== + + public static final int RECTANGULARSHAPE_VERTEX_COUNT = 4; + + private static final float[] VERTICES_CONTAINS_TMP = new float[2 * EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT]; + private static final float[] VERTICES_COLLISION_TMP_A = new float[2 * EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT]; + private static final float[] VERTICES_COLLISION_TMP_B = new float[2 * EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT]; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean checkContains(final float pLocalX, final float pLocalY, final float pLocalWidth, final float pLocalHeight, final Transformation pLocalToSceneTransformation, final float pX, final float pY) { + EntityCollisionChecker.fillVertices(pLocalX, pLocalY, pLocalWidth, pLocalHeight, pLocalToSceneTransformation, EntityCollisionChecker.VERTICES_CONTAINS_TMP); + return BaseCollisionChecker.checkContains(EntityCollisionChecker.VERTICES_CONTAINS_TMP, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); + } + + public static boolean checkContains(final IEntity pEntity, final float pLocalWidth, final float pLocalHeight, final float pX, final float pY) { + EntityCollisionChecker.fillVertices(pEntity.getX(), pEntity.getY(), pLocalWidth, pLocalHeight, pEntity.getLocalToSceneTransformation(), EntityCollisionChecker.VERTICES_CONTAINS_TMP); + return BaseCollisionChecker.checkContains(EntityCollisionChecker.VERTICES_CONTAINS_TMP, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); + } + + public static boolean checkContains(final IEntity pEntity, final float pX, final float pY) { + EntityCollisionChecker.fillVertices(pEntity, EntityCollisionChecker.VERTICES_CONTAINS_TMP); + return BaseCollisionChecker.checkContains(EntityCollisionChecker.VERTICES_CONTAINS_TMP, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); + } + + public static boolean isVisible(final Camera pCamera, final IEntity pEntity) { + EntityCollisionChecker.fillVertices(pCamera, EntityCollisionChecker.VERTICES_COLLISION_TMP_A); + EntityCollisionChecker.fillVertices(pEntity, EntityCollisionChecker.VERTICES_COLLISION_TMP_B); + + return BaseCollisionChecker.checkCollision(EntityCollisionChecker.VERTICES_COLLISION_TMP_A, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, EntityCollisionChecker.VERTICES_COLLISION_TMP_B, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT); + } + + public static boolean isVisible(final Camera pCamera, final float pX, final float pY, final float pWidth, final float pHeight, final Transformation pLocalToSceneTransformation) { + EntityCollisionChecker.fillVertices(pCamera, EntityCollisionChecker.VERTICES_COLLISION_TMP_A); + EntityCollisionChecker.fillVertices(pX, pY, pWidth, pHeight, pLocalToSceneTransformation, EntityCollisionChecker.VERTICES_COLLISION_TMP_B); + + return BaseCollisionChecker.checkCollision(EntityCollisionChecker.VERTICES_COLLISION_TMP_A, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, EntityCollisionChecker.VERTICES_COLLISION_TMP_B, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT); + } + + public static boolean isVisible(final Camera pCamera, final Line pLine) { + EntityCollisionChecker.fillVertices(pCamera, EntityCollisionChecker.VERTICES_COLLISION_TMP_A); + LineCollisionChecker.fillVertices(pLine, EntityCollisionChecker.VERTICES_COLLISION_TMP_B); + + return BaseCollisionChecker.checkCollision(EntityCollisionChecker.VERTICES_COLLISION_TMP_A, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, EntityCollisionChecker.VERTICES_COLLISION_TMP_B, LineCollisionChecker.LINE_VERTEX_COUNT); + } + + public static boolean checkCollision(final IEntity pEntityA, final IEntity pEntityB) { + EntityCollisionChecker.fillVertices(pEntityA, EntityCollisionChecker.VERTICES_COLLISION_TMP_A); + EntityCollisionChecker.fillVertices(pEntityB, EntityCollisionChecker.VERTICES_COLLISION_TMP_B); + + return BaseCollisionChecker.checkCollision(EntityCollisionChecker.VERTICES_COLLISION_TMP_A, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, EntityCollisionChecker.VERTICES_COLLISION_TMP_B, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT); + } + + public static boolean checkCollision(final IEntity pEntity, final Line pLine) { + EntityCollisionChecker.fillVertices(pEntity, EntityCollisionChecker.VERTICES_COLLISION_TMP_A); + LineCollisionChecker.fillVertices(pLine, EntityCollisionChecker.VERTICES_COLLISION_TMP_B); + + return BaseCollisionChecker.checkCollision(EntityCollisionChecker.VERTICES_COLLISION_TMP_A, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, EntityCollisionChecker.VERTICES_COLLISION_TMP_B, LineCollisionChecker.LINE_VERTEX_COUNT); + } + + public static void fillVertices(final IEntity pEntity, final float[] pVertices) { + EntityCollisionChecker.fillVertices(0, 0, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToSceneTransformation(), pVertices); + } + + public static void fillVertices(final float pLocalX, final float pLocalY, final float pLocalWidth, final float pLocalHeight, final Transformation pLocalToSceneTransformation, final float[] pVertices) { + final float localXMin = pLocalX; + final float localXMax = pLocalX + pLocalWidth; + final float localYMin = pLocalY; + final float localYMax = pLocalY + pLocalHeight; + + pVertices[0 + Constants.VERTEX_INDEX_X] = localXMin; + pVertices[0 + Constants.VERTEX_INDEX_Y] = localYMin; + + pVertices[2 + Constants.VERTEX_INDEX_X] = localXMax; + pVertices[2 + Constants.VERTEX_INDEX_Y] = localYMin; + + pVertices[4 + Constants.VERTEX_INDEX_X] = localXMax; + pVertices[4 + Constants.VERTEX_INDEX_Y] = localYMax; + + pVertices[6 + Constants.VERTEX_INDEX_X] = localXMin; + pVertices[6 + Constants.VERTEX_INDEX_Y] = localYMax; + + pLocalToSceneTransformation.transform(pVertices); + } + + private static void fillVertices(final Camera pCamera, final float[] pVertices) { + pVertices[0 + Constants.VERTEX_INDEX_X] = pCamera.getXMin(); + pVertices[0 + Constants.VERTEX_INDEX_Y] = pCamera.getYMin(); + + pVertices[2 + Constants.VERTEX_INDEX_X] = pCamera.getXMax(); + pVertices[2 + Constants.VERTEX_INDEX_Y] = pCamera.getYMin(); + + pVertices[4 + Constants.VERTEX_INDEX_X] = pCamera.getXMax(); + pVertices[4 + Constants.VERTEX_INDEX_Y] = pCamera.getYMax(); + + pVertices[6 + Constants.VERTEX_INDEX_X] = pCamera.getXMin(); + pVertices[6 + Constants.VERTEX_INDEX_Y] = pCamera.getYMax(); + + MathUtils.rotateAroundCenter(pVertices, pCamera.getRotation(), pCamera.getCenterX(), pCamera.getCenterY()); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java b/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java index 4c80902e7..1af4bb8ea 100644 --- a/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java +++ b/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java @@ -12,7 +12,7 @@ * @author Nicolas Gramlich * @since 19:27:22 - 17.07.2010 */ -public class LineCollisionChecker extends ShapeCollisionChecker { +public class LineCollisionChecker { // =========================================================== // Constants // =========================================================== diff --git a/src/org/andengine/util/algorithm/collision/RectangularShapeCollisionChecker.java b/src/org/andengine/util/algorithm/collision/RectangularShapeCollisionChecker.java deleted file mode 100644 index b6751240d..000000000 --- a/src/org/andengine/util/algorithm/collision/RectangularShapeCollisionChecker.java +++ /dev/null @@ -1,143 +0,0 @@ -package org.andengine.util.algorithm.collision; - -import org.andengine.engine.camera.Camera; -import org.andengine.entity.Entity; -import org.andengine.entity.primitive.Line; -import org.andengine.entity.shape.RectangularShape; -import org.andengine.util.Constants; -import org.andengine.util.adt.transformation.Transformation; -import org.andengine.util.math.MathUtils; - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 11:50:19 - 11.03.2010 - */ -public class RectangularShapeCollisionChecker extends ShapeCollisionChecker { - // =========================================================== - // Constants - // =========================================================== - - public static final int RECTANGULARSHAPE_VERTEX_COUNT = 4; - - private static final float[] VERTICES_CONTAINS_TMP = new float[2 * RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT]; - private static final float[] VERTICES_COLLISION_TMP_A = new float[2 * RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT]; - private static final float[] VERTICES_COLLISION_TMP_B = new float[2 * RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT]; - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - public static boolean checkContains(final float pLocalX, final float pLocalY, final float pLocalWidth, final float pLocalHeight, final Transformation pLocalToSceneTransformation, final float pX, final float pY) { - RectangularShapeCollisionChecker.fillVertices(pLocalX, pLocalY, pLocalWidth, pLocalHeight, pLocalToSceneTransformation, RectangularShapeCollisionChecker.VERTICES_CONTAINS_TMP); - return ShapeCollisionChecker.checkContains(RectangularShapeCollisionChecker.VERTICES_CONTAINS_TMP, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); - } - - public static boolean checkContains(final Entity pEntity, final float pLocalWidth, final float pLocalHeight, final float pX, final float pY) { - RectangularShapeCollisionChecker.fillVertices(pEntity.getX(), pEntity.getY(), pLocalWidth, pLocalHeight, pEntity.getLocalToSceneTransformation(), RectangularShapeCollisionChecker.VERTICES_CONTAINS_TMP); - return ShapeCollisionChecker.checkContains(RectangularShapeCollisionChecker.VERTICES_CONTAINS_TMP, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); - } - - public static boolean checkContains(final RectangularShape pRectangularShape, final float pX, final float pY) { - RectangularShapeCollisionChecker.fillVertices(pRectangularShape, RectangularShapeCollisionChecker.VERTICES_CONTAINS_TMP); - return ShapeCollisionChecker.checkContains(RectangularShapeCollisionChecker.VERTICES_CONTAINS_TMP, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); - } - - public static boolean isVisible(final Camera pCamera, final RectangularShape pRectangularShape) { - RectangularShapeCollisionChecker.fillVertices(pCamera, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A); - RectangularShapeCollisionChecker.fillVertices(pRectangularShape, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B); - - return ShapeCollisionChecker.checkCollision(RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT); - } - - public static boolean isVisible(final Camera pCamera, final float pX, final float pY, final float pWidth, final float pHeight, final Transformation pLocalToSceneTransformation) { - RectangularShapeCollisionChecker.fillVertices(pCamera, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A); - RectangularShapeCollisionChecker.fillVertices(pX, pY, pWidth, pHeight, pLocalToSceneTransformation, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B); - - return ShapeCollisionChecker.checkCollision(RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT); - } - - public static boolean isVisible(final Camera pCamera, final Line pLine) { - RectangularShapeCollisionChecker.fillVertices(pCamera, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A); - LineCollisionChecker.fillVertices(pLine, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B); - - return ShapeCollisionChecker.checkCollision(RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B, LineCollisionChecker.LINE_VERTEX_COUNT); - } - - public static boolean checkCollision(final RectangularShape pRectangularShapeA, final RectangularShape pRectangularShapeB) { - RectangularShapeCollisionChecker.fillVertices(pRectangularShapeA, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A); - RectangularShapeCollisionChecker.fillVertices(pRectangularShapeB, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B); - - return ShapeCollisionChecker.checkCollision(RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT); - } - - public static boolean checkCollision(final RectangularShape pRectangularShape, final Line pLine) { - RectangularShapeCollisionChecker.fillVertices(pRectangularShape, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A); - LineCollisionChecker.fillVertices(pLine, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B); - - return ShapeCollisionChecker.checkCollision(RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_A, RectangularShapeCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, RectangularShapeCollisionChecker.VERTICES_COLLISION_TMP_B, LineCollisionChecker.LINE_VERTEX_COUNT); - } - - public static void fillVertices(final RectangularShape pRectangularShape, final float[] pVertices) { - RectangularShapeCollisionChecker.fillVertices(0, 0, pRectangularShape.getWidth(), pRectangularShape.getHeight(), pRectangularShape.getLocalToSceneTransformation(), pVertices); - } - - public static void fillVertices(final float pLocalX, final float pLocalY, final float pLocalWidth, final float pLocalHeight, final Transformation pLocalToSceneTransformation, final float[] pVertices) { - final float localXMin = pLocalX; - final float localXMax = pLocalX + pLocalWidth; - final float localYMin = pLocalY; - final float localYMax = pLocalY + pLocalHeight; - - pVertices[0 + Constants.VERTEX_INDEX_X] = localXMin; - pVertices[0 + Constants.VERTEX_INDEX_Y] = localYMin; - - pVertices[2 + Constants.VERTEX_INDEX_X] = localXMax; - pVertices[2 + Constants.VERTEX_INDEX_Y] = localYMin; - - pVertices[4 + Constants.VERTEX_INDEX_X] = localXMax; - pVertices[4 + Constants.VERTEX_INDEX_Y] = localYMax; - - pVertices[6 + Constants.VERTEX_INDEX_X] = localXMin; - pVertices[6 + Constants.VERTEX_INDEX_Y] = localYMax; - - pLocalToSceneTransformation.transform(pVertices); - } - - private static void fillVertices(final Camera pCamera, final float[] pVertices) { - pVertices[0 + Constants.VERTEX_INDEX_X] = pCamera.getXMin(); - pVertices[0 + Constants.VERTEX_INDEX_Y] = pCamera.getYMin(); - - pVertices[2 + Constants.VERTEX_INDEX_X] = pCamera.getXMax(); - pVertices[2 + Constants.VERTEX_INDEX_Y] = pCamera.getYMin(); - - pVertices[4 + Constants.VERTEX_INDEX_X] = pCamera.getXMax(); - pVertices[4 + Constants.VERTEX_INDEX_Y] = pCamera.getYMax(); - - pVertices[6 + Constants.VERTEX_INDEX_X] = pCamera.getXMin(); - pVertices[6 + Constants.VERTEX_INDEX_Y] = pCamera.getYMax(); - - MathUtils.rotateAroundCenter(pVertices, pCamera.getRotation(), pCamera.getCenterX(), pCamera.getCenterY()); - } - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/util/algorithm/collision/ShapeCollisionChecker.java b/src/org/andengine/util/algorithm/collision/ShapeCollisionChecker.java deleted file mode 100644 index 02e468cac..000000000 --- a/src/org/andengine/util/algorithm/collision/ShapeCollisionChecker.java +++ /dev/null @@ -1,180 +0,0 @@ -package org.andengine.util.algorithm.collision; - -import org.andengine.opengl.util.VertexUtils; -import org.andengine.util.Constants; - - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 11:50:19 - 11.03.2010 - */ -public class ShapeCollisionChecker extends BaseCollisionChecker { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - /** - * Calls through to {@link ShapeCollisionChecker#checkCollisionSub(float[], int, int, int, int, int, float[], int, int, int, int)} with the default parameters internally used by different AndEngine primitives. - * @param pVerticesA - * @param pVertexCountA the number of vertices in pVerticesA - * @param pVerticesB - * @param pVertexCountB the number of vertices in pVerticesB - * @return - */ - public static boolean checkCollision(final float[] pVerticesA, final int pVertexCountA, final float[] pVerticesB, final int pVertexCountB) { - return ShapeCollisionChecker.checkCollision(pVerticesA, pVertexCountA, Constants.VERTEX_INDEX_X, Constants.VERTEX_INDEX_Y, 2, pVerticesB, pVertexCountB, Constants.VERTEX_INDEX_X, Constants.VERTEX_INDEX_Y, 2); - } - - /** - * @param pVerticesA - * @param pVertexCountA the number of vertices in pVerticesA - * @param pVertexOffsetXA - * @param pVertexOffsetYA - * @param pVertexStrideA - * @param pVerticesB - * @param pVertexCountB the number of vertices in pVerticesB - * @param pVertexOffsetXB - * @param pVertexOffsetYB - * @param pVertexStrideB - * @return - */ - public static boolean checkCollision(final float[] pVerticesA, final int pVertexCountA, final int pVertexOffsetXA, final int pVertexOffsetYA, final int pVertexStrideA, final float[] pVerticesB, final int pVertexCountB, final int pVertexOffsetXB, final int pVertexOffsetYB, final int pVertexStrideB) { - /* Check all the lines of A ... */ - for(int a = pVertexCountA - 2; a >= 0; a--) { - /* ... against all lines in B. */ - if(ShapeCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, a, a + 1, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)){ - return true; - } - } - /* Also check the 'around the corner of the array' line of A against all lines in B. */ - if(ShapeCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, pVertexCountA - 1, 0, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)){ - return true; - } else { - /* At last check if one polygon 'contains' the other one by checking - * if one vertex of the one vertices is contained by all of the other vertices. */ - if(ShapeCollisionChecker.checkContains(pVerticesA, pVertexCountA, VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, 0), VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, 0))) { - return true; - } else if(ShapeCollisionChecker.checkContains(pVerticesB, pVertexCountB, VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, 0), VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, 0))) { - return true; - } else { - return false; - } - } - } - - /** - * Checks line specified by pVertexIndexA1 and pVertexIndexA2 in pVerticesA against all lines in pVerticesB. - * - * @param pVerticesA - * @param pVertexOffsetXA - * @param pVertexOffsetYA - * @param pVertexStrideA - * @param pVertexIndexA1 the first point of the line in pVerticesA - * @param pVertexIndexA2 the second point of the line in pVerticesA - * @param pVerticesB - * @param pVertexCountB the number of vertices in pVerticesB - * @param pVertexOffsetXB - * @param pVertexOffsetYB - * @param pVertexStrideB - * @return - */ - private static boolean checkCollisionSub(final float[] pVerticesA, final int pVertexOffsetXA, final int pVertexOffsetYA, final int pVertexStrideA, final int pVertexIndexA1, final int pVertexIndexA2, final float[] pVerticesB, final int pVertexCountB, final int pVertexOffsetXB, final int pVertexOffsetYB, final int pVertexStrideB) { - /* Check against all the lines of B. */ - final float vertexA1X = VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, pVertexIndexA1); - final float vertexA1Y = VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, pVertexIndexA1); - final float vertexA2X = VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, pVertexIndexA2); - final float vertexA2Y = VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, pVertexIndexA2); - - for(int b = pVertexCountB - 2; b >= 0; b--) { - final float vertexB1X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, b); - final float vertexB1Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, b); - final float vertexB2X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, b + 1); - final float vertexB2Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, b + 1); - if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)){ - return true; - } - } - /* Also check the 'around the corner of the array' line of B. */ - final float vertexB1X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, pVertexCountB - 1); - final float vertexB1Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, pVertexCountB - 1); - final float vertexB2X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, 0); - final float vertexB2Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, 0); - if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)){ - return true; - } - return false; - } - - /** - * Calls through to {@link ShapeCollisionChecker#checkContains(float[], int, int, int, int, float, float)} with the default parameters internally used by different AndEngine primitives. - * - * @param pVertices - * @param pVertexCount the number of vertices in pVertices - * @param pX - * @param pY - * @return - */ - public static boolean checkContains(final float[] pVertices, final int pVertexCount, final float pX, final float pY) { - return ShapeCollisionChecker.checkContains(pVertices, pVertexCount, Constants.VERTEX_INDEX_X, Constants.VERTEX_INDEX_Y, 2, pX, pY); - } - - /** - * Works with complex polygons! - * - * @see http://alienryderflex.com/polygon/ - * - * @param pVertices - * @param pVertexCount the number of vertices in pVertices - * @param pVertexOffsetX - * @param pVertexOffsetY - * @param pVertexStride - * @param pX - * @param pY - * @return true when the point defined by (pX, pY) is inside the polygon defined by pVertices, false. If the point is exactly on the edge of the polygon, the result can be true or false. - */ - public static boolean checkContains(final float[] pVertices, final int pVertexCount, final int pVertexOffsetX, final int pVertexOffsetY, final int pVertexStride, final float pX, final float pY) { - boolean odd = false; - - int j = pVertexCount - 1; - for(int i = 0; i < pVertexCount; i++) { - final float vertexXI = VertexUtils.getVertex(pVertices, pVertexOffsetX, pVertexStride, i); - final float vertexYI = VertexUtils.getVertex(pVertices, pVertexOffsetY, pVertexStride, i); - final float vertexXJ = VertexUtils.getVertex(pVertices, pVertexOffsetX, pVertexStride, j); - final float vertexYJ = VertexUtils.getVertex(pVertices, pVertexOffsetY, pVertexStride, j); - - if((((vertexYI < pY) && (vertexYJ >= pY)) || ((vertexYJ < pY) && (vertexYI >= pY))) && ((vertexXI <= pX) || (vertexXJ <= pX))) { - odd ^= ((vertexXI + (((pY - vertexYI) / (vertexYJ - vertexYI)) * (vertexXJ - vertexXI))) < pX); - } - j = i; - } - - return odd; - } - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} From 798de0f695173a5b4ed9a95f4d8f9c0151bffce0 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 17 Apr 2012 15:49:50 -0700 Subject: [PATCH 002/252] Important fix for AStarPathFinder operating on negative y coordinates. --- .../andengine/util/algorithm/path/astar/AStarPathFinder.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java index 534fc785e..2dc63cc2b 100644 --- a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java +++ b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java @@ -4,7 +4,6 @@ import org.andengine.util.adt.map.LongSparseArray; import org.andengine.util.adt.queue.IQueue; import org.andengine.util.adt.queue.SortedQueue; -import org.andengine.util.adt.queue.UniqueQueue; import org.andengine.util.adt.spatial.bounds.util.IntBoundsUtils; import org.andengine.util.algorithm.path.ICostFunction; import org.andengine.util.algorithm.path.IPathFinder; @@ -186,7 +185,7 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi // Inner and Anonymous Classes // =========================================================== - private static final class Node implements Comparable { + /* package */ static final class Node implements Comparable { // =========================================================== // Constants // =========================================================== @@ -265,7 +264,7 @@ public String toString() { // =========================================================== public static long calculateID(final int pX, final int pY) { - return (((long)pX) << 32) | pY; + return (((long)pX) << 32) | (((long)pY) & 0xFFFFFFFFL); } public boolean equals(final Node pNode) { From b605e887e1dc1c1166f83e7ae9fb09b5f9cb1c0a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 17 Apr 2012 17:57:41 -0700 Subject: [PATCH 003/252] Fixed applying mAbsoluteOffsetCenterX/Y in getLocalToParentTransformation and getParentToLocalTransformation. --- src/org/andengine/entity/Entity.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index e977e0576..fe3d4b541 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1030,9 +1030,6 @@ public Transformation getLocalToParentTransformation() { if(this.mLocalToParentTransformationDirty) { localToParentTransformation.setToIdentity(); - /* Offset. */ - localToParentTransformation.postTranslate(this.mAbsoluteOffsetCenterX, this.mAbsoluteOffsetCenterY); - /* Scale. */ final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; @@ -1074,6 +1071,9 @@ public Transformation getLocalToParentTransformation() { /* Translation. */ localToParentTransformation.postTranslate(this.mX, this.mY); + /* Offset. */ + localToParentTransformation.postTranslate(-this.mAbsoluteOffsetCenterX, -this.mAbsoluteOffsetCenterY); + this.mLocalToParentTransformationDirty = false; } return localToParentTransformation; @@ -1085,6 +1085,9 @@ public Transformation getParentToLocalTransformation() { if(this.mParentToLocalTransformationDirty) { parentToLocalTransformation.setToIdentity(); + /* Offset. */ + parentToLocalTransformation.postTranslate(this.mAbsoluteOffsetCenterX, this.mAbsoluteOffsetCenterY); + /* Translation. */ parentToLocalTransformation.postTranslate(-this.mX, -this.mY); @@ -1123,9 +1126,6 @@ public Transformation getParentToLocalTransformation() { parentToLocalTransformation.postTranslate(absoluteScaleCenterX, absoluteScaleCenterY); } - /* Offset. */ - parentToLocalTransformation.postTranslate(-this.mAbsoluteOffsetCenterX, -this.mAbsoluteOffsetCenterY); - this.mParentToLocalTransformationDirty = false; } return parentToLocalTransformation; From da34967567034842c02fa738ba4797a9425e4e9f Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 18 Apr 2012 12:17:10 -0700 Subject: [PATCH 004/252] Renamed 'absolute'XYZCenters to 'local'XYZCenters in Entity. Added a few constructors in Shape and subclasses. --- src/org/andengine/entity/Entity.java | 213 +++++++++--------- src/org/andengine/entity/primitive/Line.java | 49 ++-- src/org/andengine/entity/primitive/Mesh.java | 24 +- .../andengine/entity/primitive/Rectangle.java | 4 +- src/org/andengine/entity/shape/Shape.java | 6 + 5 files changed, 171 insertions(+), 125 deletions(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index fe3d4b541..286063381 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -76,34 +76,34 @@ public void call(final IEntity pEntity) { protected float mOffsetCenterX = IEntity.OFFSET_CENTER_X_DEFAULT; protected float mOffsetCenterY = IEntity.OFFSET_CENTER_Y_DEFAULT; - private float mAbsoluteOffsetCenterX; - private float mAbsoluteOffsetCenterY; + protected float mLocalOffsetCenterX; + protected float mLocalOffsetCenterY; - private float mWidth; - private float mHeight; + protected float mWidth; + protected float mHeight; protected float mRotation = IEntity.ROTATION_DEFAULT; protected float mRotationCenterX = IEntity.ROTATION_CENTER_X_DEFAULT; protected float mRotationCenterY = IEntity.ROTATION_CENTER_Y_DEFAULT; - private float mAbsoluteRotationCenterX; - private float mAbsoluteRotationCenterY; + protected float mLocalRotationCenterX; + protected float mLocalRotationCenterY; protected float mScaleX = IEntity.SCALE_X_DEFAULT; protected float mScaleY = IEntity.SCALE_Y_DEFAULT; protected float mScaleCenterX = IEntity.SCALE_CENTER_X_DEFAULT; protected float mScaleCenterY = IEntity.SCALE_CENTER_Y_DEFAULT; - private float mAbsoluteScaleCenterX; - private float mAbsoluteScaleCenterY; + protected float mLocalScaleCenterX; + protected float mLocalScaleCenterY; protected float mSkewX = IEntity.SKEW_X_DEFAULT; protected float mSkewY = IEntity.SKEW_Y_DEFAULT; protected float mSkewCenterX = IEntity.SKEW_CENTER_X_DEFAULT; protected float mSkewCenterY = IEntity.SKEW_CENTER_Y_DEFAULT; - private float mAbsoluteSkewCenterX; - private float mAbsoluteSkewCenterY; + protected float mLocalSkewCenterX; + protected float mLocalSkewCenterY; private boolean mLocalToParentTransformationDirty = true; private boolean mParentToLocalTransformationDirty = true; @@ -125,20 +125,17 @@ public Entity() { } public Entity(final float pX, final float pY) { - this.mX = pX; - this.mY = pY; - - this.updateAbsoluteOffsetCenter(); - this.updateAbsoluteRotationCenter(); - this.updateAbsoluteScaleCenter(); - this.updateAbsoluteSkewCenter(); + this(pX, pY, 0, 0); } public Entity(final float pX, final float pY, final float pWidth, final float pHeight) { this.mX = pX; this.mY = pY; - this.setSize(pWidth, pHeight); + this.mWidth = pWidth; + this.mHeight = pHeight; + + this.updateLocalCenters(); } // =========================================================== @@ -322,10 +319,7 @@ public float getWidthScaled() { public void setWidth(final float pWidth) { this.mWidth = pWidth; - this.updateAbsoluteOffsetCenterX(); - this.updateAbsoluteRotationCenterX(); - this.updateAbsoluteScaleCenterX(); - this.updateAbsoluteSkewCenterX(); + this.updateLocalCentersXs(); } @Override @@ -343,10 +337,7 @@ public float getHeightScaled() { public void setHeight(final float pHeight) { this.mHeight = pHeight; - this.updateAbsoluteOffsetCenterY(); - this.updateAbsoluteRotationCenterY(); - this.updateAbsoluteScaleCenterY(); - this.updateAbsoluteSkewCenterY(); + this.updateLocalCentersYs(); } @Override @@ -354,10 +345,7 @@ public void setSize(final float pWidth, final float pHeight) { this.mWidth = pWidth; this.mHeight = pHeight; - this.updateAbsoluteOffsetCenter(); - this.updateAbsoluteRotationCenter(); - this.updateAbsoluteScaleCenter(); - this.updateAbsoluteSkewCenter(); + this.updateLocalCenters(); } @Override @@ -374,7 +362,7 @@ public float getOffsetCenterY() { public void setOffsetCenterX(final float pOffsetCenterX) { this.mOffsetCenterX = pOffsetCenterX; - this.updateAbsoluteOffsetCenterX(); + this.updateLocalOffsetCenterX(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -384,7 +372,7 @@ public void setOffsetCenterX(final float pOffsetCenterX) { public void setOffsetCenterY(final float pOffsetCenterY) { this.mOffsetCenterY = pOffsetCenterY; - this.updateAbsoluteOffsetCenterY(); + this.updateLocalOffsetCenterY(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -395,7 +383,7 @@ public void setOffsetCenter(final float pOffsetCenterX, final float pOffsetCente this.mOffsetCenterX = pOffsetCenterX; this.mOffsetCenterY = pOffsetCenterY; - this.updateAbsoluteOffsetCenter(); + this.updateLocalOffsetCenter(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -433,7 +421,7 @@ public float getRotationCenterY() { public void setRotationCenterX(final float pRotationCenterX) { this.mRotationCenterX = pRotationCenterX; - this.updateAbsoluteRotationCenterX(); + this.updateLocalRotationCenterX(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -443,7 +431,7 @@ public void setRotationCenterX(final float pRotationCenterX) { public void setRotationCenterY(final float pRotationCenterY) { this.mRotationCenterY = pRotationCenterY; - this.updateAbsoluteRotationCenterY(); + this.updateLocalRotationCenterY(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -454,7 +442,7 @@ public void setRotationCenter(final float pRotationCenterX, final float pRotatio this.mRotationCenterX = pRotationCenterX; this.mRotationCenterY = pRotationCenterY; - this.updateAbsoluteRotationCenter(); + this.updateLocalRotationCenter(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -519,7 +507,7 @@ public float getScaleCenterY() { public void setScaleCenterX(final float pScaleCenterX) { this.mScaleCenterX = pScaleCenterX; - this.updateAbsoluteScaleCenterX(); + this.updateLocalScaleCenterX(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -529,7 +517,7 @@ public void setScaleCenterX(final float pScaleCenterX) { public void setScaleCenterY(final float pScaleCenterY) { this.mScaleCenterY = pScaleCenterY; - this.updateAbsoluteScaleCenterY(); + this.updateLocalScaleCenterY(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -540,7 +528,7 @@ public void setScaleCenter(final float pScaleCenterX, final float pScaleCenterY) this.mScaleCenterX = pScaleCenterX; this.mScaleCenterY = pScaleCenterY; - this.updateAbsoluteScaleCenter(); + this.updateLocalScaleCenter(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -605,7 +593,7 @@ public float getSkewCenterY() { public void setSkewCenterX(final float pSkewCenterX) { this.mSkewCenterX = pSkewCenterX; - this.updateAbsoluteSkewCenterX(); + this.updateLocalSkewCenterX(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -615,7 +603,7 @@ public void setSkewCenterX(final float pSkewCenterX) { public void setSkewCenterY(final float pSkewCenterY) { this.mSkewCenterY = pSkewCenterY; - this.updateAbsoluteSkewCenterY(); + this.updateLocalSkewCenterY(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -626,7 +614,7 @@ public void setSkewCenter(final float pSkewCenterX, final float pSkewCenterY) { this.mSkewCenterX = pSkewCenterX; this.mSkewCenterY = pSkewCenterY; - this.updateAbsoluteSkewCenter(); + this.updateLocalSkewCenter(); this.mLocalToParentTransformationDirty = true; this.mParentToLocalTransformationDirty = true; @@ -1034,8 +1022,8 @@ public Transformation getLocalToParentTransformation() { final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; if((scaleX != 1) || (scaleY != 1)) { - final float scaleCenterX = this.mAbsoluteScaleCenterX; - final float scaleCenterY = this.mAbsoluteScaleCenterY; + final float scaleCenterX = this.mLocalScaleCenterX; + final float scaleCenterY = this.mLocalScaleCenterY; /* TODO Check if it is worth to check for scaleCenterX == 0 && scaleCenterY == 0 as the two postTranslate can be saved. * The same obviously applies for all similar occurrences of this pattern in this class. */ @@ -1049,8 +1037,8 @@ public Transformation getLocalToParentTransformation() { final float skewX = this.mSkewX; final float skewY = this.mSkewY; if((skewX != 0) || (skewY != 0)) { - final float skewCenterX = this.mAbsoluteSkewCenterX; - final float skewCenterY = this.mAbsoluteSkewCenterY; + final float skewCenterX = this.mLocalSkewCenterX; + final float skewCenterY = this.mLocalSkewCenterY; localToParentTransformation.postTranslate(-skewCenterX, -skewCenterY); localToParentTransformation.postSkew(skewX, skewY); @@ -1060,8 +1048,8 @@ public Transformation getLocalToParentTransformation() { /* Rotation. */ final float rotation = this.mRotation; if(rotation != 0) { - final float rotationCenterX = this.mAbsoluteRotationCenterX; - final float rotationCenterY = this.mAbsoluteRotationCenterY; + final float rotationCenterX = this.mLocalRotationCenterX; + final float rotationCenterY = this.mLocalRotationCenterY; localToParentTransformation.postTranslate(-rotationCenterX, -rotationCenterY); localToParentTransformation.postRotate(rotation); @@ -1072,7 +1060,7 @@ public Transformation getLocalToParentTransformation() { localToParentTransformation.postTranslate(this.mX, this.mY); /* Offset. */ - localToParentTransformation.postTranslate(-this.mAbsoluteOffsetCenterX, -this.mAbsoluteOffsetCenterY); + localToParentTransformation.postTranslate(-this.mLocalOffsetCenterX, -this.mLocalOffsetCenterY); this.mLocalToParentTransformationDirty = false; } @@ -1086,7 +1074,7 @@ public Transformation getParentToLocalTransformation() { parentToLocalTransformation.setToIdentity(); /* Offset. */ - parentToLocalTransformation.postTranslate(this.mAbsoluteOffsetCenterX, this.mAbsoluteOffsetCenterY); + parentToLocalTransformation.postTranslate(this.mLocalOffsetCenterX, this.mLocalOffsetCenterY); /* Translation. */ parentToLocalTransformation.postTranslate(-this.mX, -this.mY); @@ -1094,36 +1082,36 @@ public Transformation getParentToLocalTransformation() { /* Rotation. */ final float rotation = this.mRotation; if(rotation != 0) { - final float absoluteRotationCenterX = this.mAbsoluteRotationCenterX; - final float absoluteRotationCenterY = this.mAbsoluteRotationCenterY; + final float localRotationCenterX = this.mLocalRotationCenterX; + final float localRotationCenterY = this.mLocalRotationCenterY; - parentToLocalTransformation.postTranslate(-absoluteRotationCenterX, -absoluteRotationCenterY); + parentToLocalTransformation.postTranslate(-localRotationCenterX, -localRotationCenterY); parentToLocalTransformation.postRotate(-rotation); - parentToLocalTransformation.postTranslate(absoluteRotationCenterX, absoluteRotationCenterY); + parentToLocalTransformation.postTranslate(localRotationCenterX, localRotationCenterY); } /* Skew. */ final float skewX = this.mSkewX; final float skewY = this.mSkewY; if((skewX != 0) || (skewY != 0)) { - final float absoluteSkewCenterX = this.mAbsoluteSkewCenterX; - final float absoluteSkewCenterY = this.mAbsoluteSkewCenterY; + final float localSkewCenterX = this.mLocalSkewCenterX; + final float localSkewCenterY = this.mLocalSkewCenterY; - parentToLocalTransformation.postTranslate(-absoluteSkewCenterX, -absoluteSkewCenterY); + parentToLocalTransformation.postTranslate(-localSkewCenterX, -localSkewCenterY); parentToLocalTransformation.postSkew(-skewX, -skewY); - parentToLocalTransformation.postTranslate(absoluteSkewCenterX, absoluteSkewCenterY); + parentToLocalTransformation.postTranslate(localSkewCenterX, localSkewCenterY); } /* Scale. */ final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; if((scaleX != 1) || (scaleY != 1)) { - final float absoluteScaleCenterX = this.mAbsoluteScaleCenterX; - final float absoluteScaleCenterY = this.mAbsoluteScaleCenterY; + final float localScaleCenterX = this.mLocalScaleCenterX; + final float localScaleCenterY = this.mLocalScaleCenterY; - parentToLocalTransformation.postTranslate(-absoluteScaleCenterX, -absoluteScaleCenterY); + parentToLocalTransformation.postTranslate(-localScaleCenterX, -localScaleCenterY); parentToLocalTransformation.postScale(1 / scaleX, 1 / scaleY); // TODO Division could be replaced by a multiplication of 'scale(X/Y)Inverse'... - parentToLocalTransformation.postTranslate(absoluteScaleCenterX, absoluteScaleCenterY); + parentToLocalTransformation.postTranslate(localScaleCenterX, localScaleCenterY); } this.mParentToLocalTransformationDirty = false; @@ -1413,7 +1401,7 @@ protected void onApplyTransformations(final GLState pGLState) { } protected void applyOffset(final GLState pGLState) { - pGLState.translateModelViewGLMatrixf(-this.mAbsoluteOffsetCenterX, -this.mAbsoluteOffsetCenterY, 0); + pGLState.translateModelViewGLMatrixf(-this.mLocalOffsetCenterX, -this.mLocalOffsetCenterY, 0); } protected void applyTranslation(final GLState pGLState) { @@ -1424,12 +1412,12 @@ protected void applyRotation(final GLState pGLState) { final float rotation = this.mRotation; if(rotation != 0) { - final float absoluteRotationCenterX = this.mAbsoluteRotationCenterX; - final float absoluteRotationCenterY = this.mAbsoluteRotationCenterY; + final float localRotationCenterX = this.mLocalRotationCenterX; + final float localRotationCenterY = this.mLocalRotationCenterY; - pGLState.translateModelViewGLMatrixf(absoluteRotationCenterX, absoluteRotationCenterY, 0); + pGLState.translateModelViewGLMatrixf(localRotationCenterX, localRotationCenterY, 0); pGLState.rotateModelViewGLMatrixf(rotation, 0, 0, 1); - pGLState.translateModelViewGLMatrixf(-absoluteRotationCenterX, -absoluteRotationCenterY, 0); + pGLState.translateModelViewGLMatrixf(-localRotationCenterX, -localRotationCenterY, 0); /* TODO There is a special, but very likely case when mRotationCenter and mScaleCenter are the same. * In that case the last glTranslatef of the rotation and the first glTranslatef of the scale is superfluous. @@ -1442,12 +1430,12 @@ protected void applySkew(final GLState pGLState) { final float skewY = this.mSkewY; if((skewX != 0) || (skewY != 0)) { - final float absoluteSkewCenterX = this.mAbsoluteSkewCenterX; - final float absoluteSkewCenterY = this.mAbsoluteSkewCenterY; + final float localSkewCenterX = this.mLocalSkewCenterX; + final float localSkewCenterY = this.mLocalSkewCenterY; - pGLState.translateModelViewGLMatrixf(absoluteSkewCenterX, absoluteSkewCenterY, 0); + pGLState.translateModelViewGLMatrixf(localSkewCenterX, localSkewCenterY, 0); pGLState.skewModelViewGLMatrixf(skewX, skewY); - pGLState.translateModelViewGLMatrixf(-absoluteSkewCenterX, -absoluteSkewCenterY, 0); + pGLState.translateModelViewGLMatrixf(-localSkewCenterX, -localSkewCenterY, 0); } } @@ -1456,12 +1444,12 @@ protected void applyScale(final GLState pGLState) { final float scaleY = this.mScaleY; if((scaleX != 1) || (scaleY != 1)) { - final float absoluteScaleCenterX = this.mAbsoluteScaleCenterX; - final float absoluteScaleCenterY = this.mAbsoluteScaleCenterY; + final float localScaleCenterX = this.mLocalScaleCenterX; + final float localScaleCenterY = this.mLocalScaleCenterY; - pGLState.translateModelViewGLMatrixf(absoluteScaleCenterX, absoluteScaleCenterY, 0); + pGLState.translateModelViewGLMatrixf(localScaleCenterX, localScaleCenterY, 0); pGLState.scaleModelViewGLMatrixf(scaleX, scaleY, 1); - pGLState.translateModelViewGLMatrixf(-absoluteScaleCenterX, -absoluteScaleCenterY, 0); + pGLState.translateModelViewGLMatrixf(-localScaleCenterX, -localScaleCenterY, 0); } } @@ -1527,57 +1515,76 @@ protected void onManagedUpdate(final float pSecondsElapsed) { } } } + + protected void updateLocalCenters() { + this.updateLocalCentersXs(); + this.updateLocalCentersYs(); + } + + protected void updateLocalCentersXs() { + this.updateLocalOffsetCenterX(); + this.updateLocalRotationCenterX(); + this.updateLocalScaleCenterX(); + this.updateLocalSkewCenterX(); + } + + protected void updateLocalCentersYs() { + this.updateLocalOffsetCenterY(); + this.updateLocalRotationCenterY(); + this.updateLocalScaleCenterY(); + this.updateLocalSkewCenterY(); + } - private void updateAbsoluteOffsetCenter() { - this.updateAbsoluteOffsetCenterX(); - this.updateAbsoluteOffsetCenterY(); + protected void updateLocalOffsetCenter() { + this.updateLocalOffsetCenterX(); + this.updateLocalOffsetCenterY(); } - private void updateAbsoluteOffsetCenterX() { - this.mAbsoluteOffsetCenterX = this.mOffsetCenterX * this.mWidth; + protected void updateLocalOffsetCenterX() { + this.mLocalOffsetCenterX = this.mOffsetCenterX * this.mWidth; } - private void updateAbsoluteOffsetCenterY() { - this.mAbsoluteOffsetCenterY = this.mOffsetCenterY * this.mHeight; + protected void updateLocalOffsetCenterY() { + this.mLocalOffsetCenterY = this.mOffsetCenterY * this.mHeight; } - private void updateAbsoluteRotationCenter() { - this.updateAbsoluteRotationCenterX(); - this.updateAbsoluteRotationCenterY(); + protected void updateLocalRotationCenter() { + this.updateLocalRotationCenterX(); + this.updateLocalRotationCenterY(); } - private void updateAbsoluteRotationCenterX() { - this.mAbsoluteRotationCenterX = this.mRotationCenterX * this.mWidth; + protected void updateLocalRotationCenterX() { + this.mLocalRotationCenterX = this.mRotationCenterX * this.mWidth; } - private void updateAbsoluteRotationCenterY() { - this.mAbsoluteRotationCenterY = this.mRotationCenterY * this.mHeight; + protected void updateLocalRotationCenterY() { + this.mLocalRotationCenterY = this.mRotationCenterY * this.mHeight; } - private void updateAbsoluteScaleCenter() { - this.updateAbsoluteScaleCenterX(); - this.updateAbsoluteScaleCenterY(); + protected void updateLocalScaleCenter() { + this.updateLocalScaleCenterX(); + this.updateLocalScaleCenterY(); } - private void updateAbsoluteScaleCenterX() { - this.mAbsoluteScaleCenterX = this.mScaleCenterX * this.mWidth; + protected void updateLocalScaleCenterX() { + this.mLocalScaleCenterX = this.mScaleCenterX * this.mWidth; } - private void updateAbsoluteScaleCenterY() { - this.mAbsoluteScaleCenterY = this.mScaleCenterY * this.mHeight; + protected void updateLocalScaleCenterY() { + this.mLocalScaleCenterY = this.mScaleCenterY * this.mHeight; } - private void updateAbsoluteSkewCenter() { - this.updateAbsoluteSkewCenterX(); - this.updateAbsoluteSkewCenterY(); + protected void updateLocalSkewCenter() { + this.updateLocalSkewCenterX(); + this.updateLocalSkewCenterY(); } - private void updateAbsoluteSkewCenterX() { - this.mAbsoluteSkewCenterX = this.mSkewCenterX * this.mWidth; + protected void updateLocalSkewCenterX() { + this.mLocalSkewCenterX = this.mSkewCenterX * this.mWidth; } - private void updateAbsoluteSkewCenterY() { - this.mAbsoluteSkewCenterY = this.mSkewCenterY * this.mHeight; + protected void updateLocalSkewCenterY() { + this.mLocalSkewCenterY = this.mSkewCenterY * this.mHeight; } public void resetRotationCenter() { diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java index efbe499c8..35647fcc9 100644 --- a/src/org/andengine/entity/primitive/Line.java +++ b/src/org/andengine/entity/primitive/Line.java @@ -86,11 +86,13 @@ public Line(final float pX1, final float pY1, final float pX2, final float pY2, } public Line(final float pX1, final float pY1, final float pX2, final float pY2, final float pLineWidth, final ILineVertexBufferObject pLineVertexBufferObject) { - super(pX1, pY1, PositionColorShaderProgram.getInstance()); + super(pX1, pY1, pX2 - pX1, pY2 - pY1, PositionColorShaderProgram.getInstance()); this.mX2 = pX2; this.mY2 = pY2; + this.setOffsetCenter(0, 0); + this.mLineWidth = pLineWidth; this.mLineVertexBufferObject = pLineVertexBufferObject; @@ -98,15 +100,6 @@ public Line(final float pX1, final float pY1, final float pX2, final float pY2, this.onUpdateVertices(); this.onUpdateColor(); - final float centerX = (this.mX2 - this.mX) * 0.5f; - final float centerY = (this.mY2 - this.mY) * 0.5f; - - this.mRotationCenterX = centerX; - this.mRotationCenterY = centerY; - - this.mScaleCenterX = this.mRotationCenterX; - this.mScaleCenterY = this.mRotationCenterY; - this.setBlendingEnabled(true); } @@ -164,9 +157,11 @@ public void setLineWidth(final float pLineWidth) { public void setX(final float pX) { final float dX = this.mX - pX; + this.mX2 += dX; + super.setX(pX); - this.mX2 += dX; + this.onUpdateVertices(); } /** @@ -176,10 +171,12 @@ public void setX(final float pX) { @Override public void setY(final float pY) { final float dY = this.mY - pY; - - super.setY(pY); - + this.mY2 += dY; + + super.setY(pY); + + this.onUpdateVertices(); } /** @@ -191,10 +188,12 @@ public void setPosition(final float pX, final float pY) { final float dX = this.mX - pX; final float dY = this.mY - pY; - super.setPosition(pX, pY); - this.mX2 += dX; this.mY2 += dY; + + super.setPosition(pX, pY); + + this.onUpdateVertices(); } public void setPosition(final float pX1, final float pY1, final float pX2, final float pY2) { @@ -206,6 +205,24 @@ public void setPosition(final float pX1, final float pY1, final float pX2, final this.onUpdateVertices(); } + @Deprecated + @Override + public void setWidth(final float pWidth) { + super.setWidth(pWidth); + } + + @Deprecated + @Override + public void setHeight(final float pHeight) { + super.setHeight(pHeight); + } + + @Deprecated + @Override + public void setSize(float pWidth, float pHeight) { + super.setSize(pWidth, pHeight); + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== diff --git a/src/org/andengine/entity/primitive/Mesh.java b/src/org/andengine/entity/primitive/Mesh.java index df0c82999..92898b6b3 100644 --- a/src/org/andengine/entity/primitive/Mesh.java +++ b/src/org/andengine/entity/primitive/Mesh.java @@ -56,18 +56,36 @@ public class Mesh extends Shape { * Uses a default {@link HighPerformanceMeshVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link Mesh#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. */ public Mesh(final float pX, final float pY, final float[] pBufferData, final int pVertexCount, final DrawMode pDrawMode, final VertexBufferObjectManager pVertexBufferObjectManager) { - this(pX, pY, pBufferData, pVertexCount, pDrawMode, pVertexBufferObjectManager, DrawType.STATIC); + this(pX, pY, 0, 0, pBufferData, pVertexCount, pDrawMode, pVertexBufferObjectManager); + } + + /** + * Uses a default {@link HighPerformanceMeshVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link Mesh#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + */ + public Mesh(final float pX, final float pY, final float pWidth, final float pHeight, final float[] pBufferData, final int pVertexCount, final DrawMode pDrawMode, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(pX, pY, pWidth, pHeight, pBufferData, pVertexCount, pDrawMode, pVertexBufferObjectManager, DrawType.STATIC); } /** * Uses a default {@link HighPerformanceMeshVertexBufferObject} with the {@link VertexBufferObjectAttribute}s: {@link Mesh#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. */ public Mesh(final float pX, final float pY, final float[] pBufferData, final int pVertexCount, final DrawMode pDrawMode, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { - this(pX, pY, pVertexCount, pDrawMode, new HighPerformanceMeshVertexBufferObject(pVertexBufferObjectManager, pBufferData, pVertexCount, pDrawType, true, Mesh.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT)); + this(pX, pY, 0, 0, pBufferData, pVertexCount, pDrawMode, pVertexBufferObjectManager, pDrawType); + } + + /** + * Uses a default {@link HighPerformanceMeshVertexBufferObject} with the {@link VertexBufferObjectAttribute}s: {@link Mesh#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + */ + public Mesh(final float pX, final float pY, final float pWidth, final float pHeight, final float[] pBufferData, final int pVertexCount, final DrawMode pDrawMode, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + this(pX, pY, pWidth, pHeight, pVertexCount, pDrawMode, new HighPerformanceMeshVertexBufferObject(pVertexBufferObjectManager, pBufferData, pVertexCount, pDrawType, true, Mesh.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT)); } public Mesh(final float pX, final float pY, final int pVertexCount, final DrawMode pDrawMode, final IMeshVertexBufferObject pMeshVertexBufferObject) { - super(pX, pY, PositionColorShaderProgram.getInstance()); + this(pX, pY, 0, 0, pVertexCount, pDrawMode, pMeshVertexBufferObject); + } + + public Mesh(final float pX, final float pY, final float pWidth, final float pHeight, final int pVertexCount, final DrawMode pDrawMode, final IMeshVertexBufferObject pMeshVertexBufferObject) { + super(pX, pY, pWidth, pHeight, PositionColorShaderProgram.getInstance()); this.mDrawMode = pDrawMode.getDrawMode(); this.mMeshVertexBufferObject = pMeshVertexBufferObject; diff --git a/src/org/andengine/entity/primitive/Rectangle.java b/src/org/andengine/entity/primitive/Rectangle.java index bedd658bd..28e0f9dec 100644 --- a/src/org/andengine/entity/primitive/Rectangle.java +++ b/src/org/andengine/entity/primitive/Rectangle.java @@ -65,12 +65,10 @@ public Rectangle(final float pX, final float pY, final float pWidth, final float } public Rectangle(final float pX, final float pY, final float pWidth, final float pHeight, final IRectangleVertexBufferObject pRectangleVertexBufferObject) { - super(pX, pY, PositionColorShaderProgram.getInstance()); + super(pX, pY, pWidth, pHeight, PositionColorShaderProgram.getInstance()); this.mRectangleVertexBufferObject = pRectangleVertexBufferObject; - this.setSize(pWidth, pHeight); - this.onUpdateColor(); this.setBlendingEnabled(true); diff --git a/src/org/andengine/entity/shape/Shape.java b/src/org/andengine/entity/shape/Shape.java index 8036fea07..b31ab5139 100644 --- a/src/org/andengine/entity/shape/Shape.java +++ b/src/org/andengine/entity/shape/Shape.java @@ -43,6 +43,12 @@ public Shape(final float pX, final float pY, final ShaderProgram pShaderProgram) this.mShaderProgram = pShaderProgram; } + public Shape(final float pX, final float pY, final float pWidth, final float pHeight, final ShaderProgram pShaderProgram) { + super(pX, pY, pWidth, pHeight); + + this.mShaderProgram = pShaderProgram; + } + // =========================================================== // Getter & Setter // =========================================================== From a8dbc71d9a75e645fdeb79411577fbce8765bdd0 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 19 Apr 2012 16:49:31 -0700 Subject: [PATCH 005/252] Updated LevelLoader framework to be more flexible (AndEngineCocosBuilderExtension). Added SimleLevelLoader implementation hiding a bit of the hassle. --- .../andengine/util/level/EntityLoader.java | 49 +++++++++ .../andengine/util/level/IEntityLoader.java | 8 +- .../util/level/IEntityLoaderDataSource.java | 17 +++ .../util/level/ILevelLoaderResult.java | 17 +++ src/org/andengine/util/level/LevelLoader.java | 102 ++++++++---------- ...er.java => LevelLoaderContentHandler.java} | 47 +++++--- .../level/exception/LevelLoaderException.java | 57 ++++++++++ .../SimpleLevelEntityLoaderDataSource.java | 50 +++++++++ .../util/level/simple/SimpleLevelLoader.java | 52 +++++++++ .../SimpleLevelLoaderContentHandler.java | 52 +++++++++ .../level/simple/SimpleLevelLoaderResult.java | 50 +++++++++ 11 files changed, 425 insertions(+), 76 deletions(-) create mode 100644 src/org/andengine/util/level/EntityLoader.java create mode 100644 src/org/andengine/util/level/IEntityLoaderDataSource.java create mode 100644 src/org/andengine/util/level/ILevelLoaderResult.java rename src/org/andengine/util/level/{LevelParser.java => LevelLoaderContentHandler.java} (59%) create mode 100644 src/org/andengine/util/level/exception/LevelLoaderException.java create mode 100644 src/org/andengine/util/level/simple/SimpleLevelEntityLoaderDataSource.java create mode 100644 src/org/andengine/util/level/simple/SimpleLevelLoader.java create mode 100644 src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java create mode 100644 src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java diff --git a/src/org/andengine/util/level/EntityLoader.java b/src/org/andengine/util/level/EntityLoader.java new file mode 100644 index 000000000..5d81bdb9b --- /dev/null +++ b/src/org/andengine/util/level/EntityLoader.java @@ -0,0 +1,49 @@ +package org.andengine.util.level; + + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:05:31 - 19.04.2012 + */ +public abstract class EntityLoader implements IEntityLoader { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final String[] mEntityNames; + + // =========================================================== + // Constructors + // =========================================================== + + public EntityLoader(final String ... pEntityNames) { + this.mEntityNames = pEntityNames; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public String[] getEntityNames() { + return this.mEntityNames; + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/level/IEntityLoader.java b/src/org/andengine/util/level/IEntityLoader.java index 716b47447..f676912ba 100644 --- a/src/org/andengine/util/level/IEntityLoader.java +++ b/src/org/andengine/util/level/IEntityLoader.java @@ -1,5 +1,7 @@ package org.andengine.util.level; +import java.io.IOException; + import org.andengine.entity.IEntity; import org.xml.sax.Attributes; @@ -9,7 +11,7 @@ * @author Nicolas Gramlich * @since 18:38:40 - 18.04.2012 */ -public interface IEntityLoader { +public interface IEntityLoader { // =========================================================== // Constants // =========================================================== @@ -18,5 +20,7 @@ public interface IEntityLoader { // Methods // =========================================================== - public IEntity onLoadEntity(final String pEntityName, final Attributes pAttributes); + public String[] getEntityNames(); + + public IEntity onLoadEntity(final String pEntityName, final Attributes pAttributes, final T pEntityLoaderDataSource) throws IOException; } \ No newline at end of file diff --git a/src/org/andengine/util/level/IEntityLoaderDataSource.java b/src/org/andengine/util/level/IEntityLoaderDataSource.java new file mode 100644 index 000000000..b77ba88e3 --- /dev/null +++ b/src/org/andengine/util/level/IEntityLoaderDataSource.java @@ -0,0 +1,17 @@ +package org.andengine.util.level; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 2:21:46 PM - Apr 19, 2012 + */ +public interface IEntityLoaderDataSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/src/org/andengine/util/level/ILevelLoaderResult.java b/src/org/andengine/util/level/ILevelLoaderResult.java new file mode 100644 index 000000000..89688d27c --- /dev/null +++ b/src/org/andengine/util/level/ILevelLoaderResult.java @@ -0,0 +1,17 @@ +package org.andengine.util.level; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:08:08 - 19.04.2012 + */ +public interface ILevelLoaderResult { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== +} diff --git a/src/org/andengine/util/level/LevelLoader.java b/src/org/andengine/util/level/LevelLoader.java index e6f6e6681..b3b11ad27 100644 --- a/src/org/andengine/util/level/LevelLoader.java +++ b/src/org/andengine/util/level/LevelLoader.java @@ -5,29 +5,25 @@ import java.io.InputStream; import java.util.HashMap; -import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; -import org.andengine.entity.IEntity; import org.andengine.util.StreamUtils; -import org.andengine.util.debug.Debug; -import org.xml.sax.Attributes; +import org.andengine.util.level.exception.LevelLoaderException; import org.xml.sax.InputSource; -import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import android.content.res.AssetManager; -import android.content.res.Resources; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich + * @param * @since 14:16:19 - 11.10.2010 */ -public class LevelLoader { +public abstract class LevelLoader { // =========================================================== // Constants // =========================================================== @@ -36,108 +32,94 @@ public class LevelLoader { // Fields // =========================================================== - private String mAssetBasePath; - - private IEntityLoader mDefaultEntityLoader; - private final HashMap mEntityLoaders = new HashMap(); + private final HashMap> mEntityLoaders = new HashMap>(); + private IEntityLoader mDefaultEntityLoader; + private T mEntityLoaderDataSource; // =========================================================== // Constructors // =========================================================== public LevelLoader() { - this(""); + + } + + public LevelLoader(final T pEntityLoaderDataSource) { + this.mEntityLoaderDataSource = pEntityLoaderDataSource; } - public LevelLoader(final String pAssetBasePath) { - this.setAssetBasePath(pAssetBasePath); + public LevelLoader(final IEntityLoader pDefaultEntityLoader) { + this.mDefaultEntityLoader = pDefaultEntityLoader; + } + + public LevelLoader(final T pEntityLoaderDataSource, final IEntityLoader pDefaultEntityLoader) { + this.mEntityLoaderDataSource = pEntityLoaderDataSource; + this.mDefaultEntityLoader = pDefaultEntityLoader; } // =========================================================== // Getter & Setter // =========================================================== - public IEntityLoader getDefaultEntityLoader() { - return this.mDefaultEntityLoader; - } - - public void setDefaultEntityLoader(final IEntityLoader pDefaultEntityLoader) { + public void setDefaultEntityLoader(final IEntityLoader pDefaultEntityLoader) { this.mDefaultEntityLoader = pDefaultEntityLoader; } - /** - * @param pAssetBasePath must end with '/' or have .length() == 0. - */ - public void setAssetBasePath(final String pAssetBasePath) { - if(pAssetBasePath.endsWith("/") || (pAssetBasePath.length() == 0)) { - this.mAssetBasePath = pAssetBasePath; - } else { - throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); - } + public void setEntityLoaderDataSource(final T pEntityLoaderDataSource) { + this.mEntityLoaderDataSource = pEntityLoaderDataSource; } // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== - protected void onAfterLoadLevel() { - - } - - protected void onBeforeLoadLevel() { - - } - // =========================================================== // Methods // =========================================================== - public void registerEntityLoader(final String pEntityName, final IEntityLoader pEntityLoader) { - this.mEntityLoaders.put(pEntityName, pEntityLoader); - } - - public void registerEntityLoader(final String[] pEntityNames, final IEntityLoader pEntityLoader) { - final HashMap entityLoaders = this.mEntityLoaders; + protected abstract LevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final T pEntityLoaderDataSource); - for(int i = pEntityNames.length - 1; i >= 0; i--) { - entityLoaders.put(pEntityNames[i], pEntityLoader); + public void registerEntityLoader(final IEntityLoader pEntityLoader) { + final String[] entityNames = pEntityLoader.getEntityNames(); + for(int i = 0; i < entityNames.length; i++) { + final String entityName = entityNames[i]; + this.mEntityLoaders.put(entityName, pEntityLoader); } } - public void loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath) throws IOException { - this.loadLevelFromStream(pAssetManager.open(this.mAssetBasePath + pAssetPath)); + public void clearEntityLoaders() { + this.mEntityLoaders.clear(); } - public void loadLevelFromResource(final Resources pResources, final int pRawResourceID) throws IOException { - this.loadLevelFromStream(pResources.openRawResource(pRawResourceID)); + public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath) throws LevelLoaderException { + try { + return this.loadLevelFromStream(pAssetManager.open(pAssetPath)); + } catch (final IOException e) { + throw new LevelLoaderException(e); + } } - public void loadLevelFromStream(final InputStream pInputStream) throws IOException { + public R loadLevelFromStream(final InputStream pInputStream) throws LevelLoaderException { try{ final SAXParserFactory spf = SAXParserFactory.newInstance(); final SAXParser sp = spf.newSAXParser(); final XMLReader xr = sp.getXMLReader(); - this.onBeforeLoadLevel(); - - final LevelParser levelParser = new LevelParser(this.mDefaultEntityLoader, this.mEntityLoaders); - xr.setContentHandler(levelParser); + final LevelLoaderContentHandler levelContentHandler = this.onCreateLevelLoaderContentHandler(this.mEntityLoaders, this.mDefaultEntityLoader, this.mEntityLoaderDataSource); + xr.setContentHandler(levelContentHandler); xr.parse(new InputSource(new BufferedInputStream(pInputStream))); - this.onAfterLoadLevel(); - } catch (final SAXException se) { - Debug.e(se); - /* Doesn't happen. */ - } catch (final ParserConfigurationException pe) { - Debug.e(pe); - /* Doesn't happen. */ + return levelContentHandler.getLevelLoaderResult(); + } catch (final Exception e) { + throw new LevelLoaderException(e); } finally { StreamUtils.close(pInputStream); } } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/util/level/LevelParser.java b/src/org/andengine/util/level/LevelLoaderContentHandler.java similarity index 59% rename from src/org/andengine/util/level/LevelParser.java rename to src/org/andengine/util/level/LevelLoaderContentHandler.java index 05800e4d6..4bfb47a7c 100644 --- a/src/org/andengine/util/level/LevelParser.java +++ b/src/org/andengine/util/level/LevelLoaderContentHandler.java @@ -1,9 +1,11 @@ package org.andengine.util.level; +import java.io.IOException; import java.util.HashMap; import org.andengine.entity.IEntity; import org.andengine.util.adt.list.SmartList; +import org.andengine.util.level.exception.LevelLoaderException; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -15,7 +17,7 @@ * @author Nicolas Gramlich * @since 14:35:32 - 11.10.2010 */ -public class LevelParser extends DefaultHandler { +public abstract class LevelLoaderContentHandler extends DefaultHandler { // =========================================================== // Constants // =========================================================== @@ -24,46 +26,63 @@ public class LevelParser extends DefaultHandler { // Fields // =========================================================== - private final IEntityLoader mDefaultEntityLoader; - private final HashMap mEntityLoaders; + private final IEntityLoader mDefaultEntityLoader; + private final HashMap> mEntityLoaders; + private final T mEntityLoaderDataSource; - private SmartList mParentEntityStack = new SmartList(); + private final SmartList mParentEntityStack = new SmartList(); + + protected IEntity mRootEntity; // =========================================================== // Constructors // =========================================================== - public LevelParser(final IEntityLoader pDefaultEntityLoader, final HashMap pEntityLoaders) { + public LevelLoaderContentHandler(final IEntityLoader pDefaultEntityLoader, final HashMap> pEntityLoaders, final T pEntityLoaderDataSource) { this.mDefaultEntityLoader = pDefaultEntityLoader; this.mEntityLoaders = pEntityLoaders; + this.mEntityLoaderDataSource = pEntityLoaderDataSource; } // =========================================================== // Getter & Setter // =========================================================== + public abstract R getLevelLoaderResult(); + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @Override - public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException { + public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException, LevelLoaderException { final String entityName = pLocalName; final IEntity parent = (this.mParentEntityStack.isEmpty()) ? null : this.mParentEntityStack.getLast(); - final IEntityLoader entityLoader = this.mEntityLoaders.get(entityName); + IEntityLoader entityLoader = this.mEntityLoaders.get(entityName); + if(entityLoader == null) { + if(this.mDefaultEntityLoader == null) { + throw new LevelLoaderException("Unexpected tag: '" + entityName + "'."); + } else { + entityLoader = this.mDefaultEntityLoader; + } + } final IEntity entity; - if(entityLoader != null) { - entity = entityLoader.onLoadEntity(entityName, pAttributes); - } else if(this.mDefaultEntityLoader != null) { - entity = this.mDefaultEntityLoader.onLoadEntity(entityName, pAttributes); - } else { - throw new IllegalArgumentException("Unexpected tag: '" + entityName + "'."); + try { + entity = entityLoader.onLoadEntity(entityName, pAttributes, this.mEntityLoaderDataSource); + } catch (final IOException e) { + throw new LevelLoaderException("Exception when loading entity: '" + entityName + "'.", e); } - if(parent != null && entity != null) { + if(entity == null) { + throw new LevelLoaderException(); + } + + if(parent == null) { + this.mRootEntity = entity; + } else { parent.attachChild(entity); } diff --git a/src/org/andengine/util/level/exception/LevelLoaderException.java b/src/org/andengine/util/level/exception/LevelLoaderException.java new file mode 100644 index 000000000..8ed6ada93 --- /dev/null +++ b/src/org/andengine/util/level/exception/LevelLoaderException.java @@ -0,0 +1,57 @@ +package org.andengine.util.level.exception; + +import org.andengine.util.exception.AndEngineRuntimeException; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:59:01 - 19.04.2012 + */ +public class LevelLoaderException extends AndEngineRuntimeException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 1027781104016235328L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LevelLoaderException() { + + } + + public LevelLoaderException(final String pMessage) { + super(pMessage); + } + + public LevelLoaderException(final Throwable pThrowable) { + super(pThrowable); + } + + public LevelLoaderException(final String pMessage, final Throwable pThrowable) { + super(pMessage, pThrowable); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderDataSource.java b/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderDataSource.java new file mode 100644 index 000000000..21f328dbd --- /dev/null +++ b/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderDataSource.java @@ -0,0 +1,50 @@ +package org.andengine.util.level.simple; + +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.util.level.IEntityLoaderDataSource; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 16:13:09 - 19.04.2012 + */ +public class SimpleLevelEntityLoaderDataSource implements IEntityLoaderDataSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final VertexBufferObjectManager mVertexBufferObjectManager; + + // =========================================================== + // Constructors + // =========================================================== + + public SimpleLevelEntityLoaderDataSource(final VertexBufferObjectManager pVertexBufferObjectManager) { + this.mVertexBufferObjectManager = pVertexBufferObjectManager; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public VertexBufferObjectManager getVertexBufferObjectManager() { + return this.mVertexBufferObjectManager; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoader.java b/src/org/andengine/util/level/simple/SimpleLevelLoader.java new file mode 100644 index 000000000..925bb6fa9 --- /dev/null +++ b/src/org/andengine/util/level/simple/SimpleLevelLoader.java @@ -0,0 +1,52 @@ +package org.andengine.util.level.simple; + +import java.util.HashMap; + +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.util.level.IEntityLoader; +import org.andengine.util.level.LevelLoader; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 4:11:17 - 19.04.2012 + */ +public class SimpleLevelLoader extends LevelLoader { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SimpleLevelLoader(final VertexBufferObjectManager pVertexBufferObjectManager) { + super(new SimpleLevelEntityLoaderDataSource(pVertexBufferObjectManager)); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected SimpleLevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final SimpleLevelEntityLoaderDataSource pEntityLoaderDataSource) { + return new SimpleLevelLoaderContentHandler(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderDataSource); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java new file mode 100644 index 000000000..c630e1fa4 --- /dev/null +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java @@ -0,0 +1,52 @@ +package org.andengine.util.level.simple; + +import java.util.HashMap; + +import org.andengine.entity.scene.Scene; +import org.andengine.util.level.IEntityLoader; +import org.andengine.util.level.LevelLoaderContentHandler; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 16:12:23 - 19.04.2012 + */ +public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SimpleLevelLoaderContentHandler(IEntityLoader pDefaultEntityLoader, HashMap> pEntityLoaders, SimpleLevelEntityLoaderDataSource pEntityLoaderDataSource) { + super(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderDataSource); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public SimpleLevelLoaderResult getLevelLoaderResult() { + return new SimpleLevelLoaderResult((Scene) this.mRootEntity); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java new file mode 100644 index 000000000..3b31077c7 --- /dev/null +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java @@ -0,0 +1,50 @@ +package org.andengine.util.level.simple; + +import org.andengine.entity.scene.Scene; +import org.andengine.util.level.ILevelLoaderResult; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 16:13:38 - 19.04.2012 + */ +public class SimpleLevelLoaderResult implements ILevelLoaderResult { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final Scene mScene; + + // =========================================================== + // Constructors + // =========================================================== + + public SimpleLevelLoaderResult(final Scene pScene) { + this.mScene = pScene; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public Scene getScene() { + return this.mScene; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 15ef391694b2751510749d44a4736e50b5ed00ab Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 23 Apr 2012 12:37:27 -0700 Subject: [PATCH 006/252] Fixed Rectangles not drawing. --- src/org/andengine/entity/primitive/Rectangle.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/andengine/entity/primitive/Rectangle.java b/src/org/andengine/entity/primitive/Rectangle.java index 28e0f9dec..cc497800e 100644 --- a/src/org/andengine/entity/primitive/Rectangle.java +++ b/src/org/andengine/entity/primitive/Rectangle.java @@ -69,6 +69,7 @@ public Rectangle(final float pX, final float pY, final float pWidth, final float this.mRectangleVertexBufferObject = pRectangleVertexBufferObject; + this.onUpdateVertices(); this.onUpdateColor(); this.setBlendingEnabled(true); From 835fbfb338ec59274857f2f7e6e54b02891f2b48 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 23 Apr 2012 17:00:44 -0700 Subject: [PATCH 007/252] Added Gradient entity. --- src/org/andengine/entity/Entity.java | 10 +- .../andengine/entity/primitive/Gradient.java | 450 ++++++++++++++++++ ...PerformanceGradientVertexBufferObject.java | 132 +++++ ...HighPerformanceLineVertexBufferObject.java | 12 +- ...erformanceRectangleVertexBufferObject.java | 24 +- .../vbo/IGradientVertexBufferObject.java | 23 + .../LowMemoryGradientVertexBufferObject.java | 134 ++++++ .../vbo/LowMemoryLineVertexBufferObject.java | 12 +- .../LowMemoryRectangleVertexBufferObject.java | 24 +- .../andengine/util/math/MathConstants.java | 4 + 10 files changed, 784 insertions(+), 41 deletions(-) create mode 100644 src/org/andengine/entity/primitive/Gradient.java create mode 100644 src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java create mode 100644 src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java create mode 100644 src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 7f112c379..d3dd02311 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -69,7 +69,7 @@ public void call(final IEntity pEntity) { private EntityModifierList mEntityModifiers; private UpdateHandlerList mUpdateHandlers; - protected Color mColor = new Color(1, 1, 1, 1); + protected Color mColor = new Color(Color.WHITE); protected float mX; protected float mY; @@ -686,7 +686,7 @@ public void setColor(final Color pColor) { */ @Override public void setRed(final float pRed) { - if(this.mColor.setRedChecking(pRed)) { + if(this.mColor.setRedChecking(pRed)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -696,7 +696,7 @@ public void setRed(final float pRed) { */ @Override public void setGreen(final float pGreen) { - if(this.mColor.setGreenChecking(pGreen)) { + if(this.mColor.setGreenChecking(pGreen)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -706,7 +706,7 @@ public void setGreen(final float pGreen) { */ @Override public void setBlue(final float pBlue) { - if(this.mColor.setBlueChecking(pBlue)) { + if(this.mColor.setBlueChecking(pBlue)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -716,7 +716,7 @@ public void setBlue(final float pBlue) { */ @Override public void setAlpha(final float pAlpha) { - if(this.mColor.setAlphaChecking(pAlpha)) { + if(this.mColor.setAlphaChecking(pAlpha)) { // TODO Is this check worth it? this.onUpdateColor(); } } diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java new file mode 100644 index 000000000..ac87ffc1a --- /dev/null +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -0,0 +1,450 @@ +package org.andengine.entity.primitive; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.primitive.vbo.HighPerformanceGradientVertexBufferObject; +import org.andengine.entity.primitive.vbo.IGradientVertexBufferObject; +import org.andengine.entity.shape.Shape; +import org.andengine.opengl.shader.PositionColorShaderProgram; +import org.andengine.opengl.shader.constants.ShaderProgramConstants; +import org.andengine.opengl.util.GLState; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttribute; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; +import org.andengine.util.color.Color; + +import android.opengl.GLES20; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:23:56 - 23.04.2012 + */ +public class Gradient extends Shape { + // =========================================================== + // Constants + // =========================================================== + + public static final int VERTEX_INDEX_X = 0; + public static final int VERTEX_INDEX_Y = Gradient.VERTEX_INDEX_X + 1; + public static final int COLOR_INDEX = Gradient.VERTEX_INDEX_Y + 1; + + public static final int VERTEX_SIZE = 2 + 1; + public static final int VERTICES_PER_RECTANGLE = 4; + public static final int RECTANGLE_SIZE = Gradient.VERTEX_SIZE * Gradient.VERTICES_PER_RECTANGLE; + + public static final VertexBufferObjectAttributes VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT = new VertexBufferObjectAttributesBuilder(2) + .add(ShaderProgramConstants.ATTRIBUTE_POSITION_LOCATION, ShaderProgramConstants.ATTRIBUTE_POSITION, 2, GLES20.GL_FLOAT, false) + .add(ShaderProgramConstants.ATTRIBUTE_COLOR_LOCATION, ShaderProgramConstants.ATTRIBUTE_COLOR, 4, GLES20.GL_UNSIGNED_BYTE, true) + .build(); + + // =========================================================== + // Fields + // =========================================================== + + protected final IGradientVertexBufferObject mGradientVertexBufferObject; + + private final Color mToColor = new Color(Color.WHITE); + private float mGradientVectorX = 0; + private float mGradientVectorY = -1; + private boolean mCompressedInterpolation; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * Uses a default {@link HighPerformanceGradientVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link Gradient#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + */ + public Gradient(final float pX, final float pY, final float pWidth, final float pHeight, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(pX, pY, pWidth, pHeight, pVertexBufferObjectManager, DrawType.STATIC); + } + + /** + * Uses a default {@link HighPerformanceGradientVertexBufferObject} with the {@link VertexBufferObjectAttribute}s: {@link Gradient#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + */ + public Gradient(final float pX, final float pY, final float pWidth, final float pHeight, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + this(pX, pY, pWidth, pHeight, new HighPerformanceGradientVertexBufferObject(pVertexBufferObjectManager, Gradient.RECTANGLE_SIZE, pDrawType, true, Gradient.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT)); + } + + public Gradient(final float pX, final float pY, final float pWidth, final float pHeight, final IGradientVertexBufferObject pGradientVertexBufferObject) { + super(pX, pY, pWidth, pHeight, PositionColorShaderProgram.getInstance()); + + this.mGradientVertexBufferObject = pGradientVertexBufferObject; + + this.onUpdateVertices(); + this.onUpdateColor(); + + this.setBlendingEnabled(true); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isCompressedInterpolation() { + return this.mCompressedInterpolation; + } + + public void setCompressedInterpolation(final boolean pCompressedInterpolation) { + if(this.mCompressedInterpolation != pCompressedInterpolation) { + this.mCompressedInterpolation = pCompressedInterpolation; + + this.onUpdateColor(); + } + } + + @Deprecated + @Override + public float getRed() { + return super.getRed(); + } + + @Deprecated + @Override + public float getGreen() { + return super.getGreen(); + } + + @Deprecated + @Override + public float getBlue() { + return super.getBlue(); + } + + @Deprecated + @Override + public float getAlpha() { + return super.getAlpha(); + } + + @Deprecated + @Override + public Color getColor() { + return super.getColor(); + } + + @Deprecated + @Override + public void setRed(final float pRed) { + super.setRed(pRed); + } + + @Deprecated + @Override + public void setGreen(final float pGreen) { + super.setGreen(pGreen); + } + + @Deprecated + @Override + public void setBlue(final float pBlue) { + super.setBlue(pBlue); + } + + @Deprecated + @Override + public void setAlpha(final float pAlpha) { + super.setAlpha(pAlpha); + } + + @Deprecated + @Override + public void setColor(final Color pColor) { + super.setColor(pColor); + } + + @Deprecated + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue) { + super.setColor(pRed, pGreen, pBlue); + } + + @Deprecated + @Override + public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + super.setColor(pRed, pGreen, pBlue, pAlpha); + } + + public float getFromRed() { + return super.getRed(); + } + + public float getFromGreen() { + return super.getGreen(); + } + + public float getFromBlue() { + return super.getBlue(); + } + + public float getFromAlpha() { + return super.getAlpha(); + } + + public Color getFromColor() { + return super.getColor(); + } + + /** + * @param pRed from 0.0f to 1.0f + */ + public void setFromRed(final float pRed) { + super.setRed(pRed); + } + + /** + * @param pGreen from 0.0f to 1.0f + */ + public void setFromGreen(final float pGreen) { + super.setGreen(pGreen); + } + + /** + * @param pBlue from 0.0f to 1.0f + */ + public void setFromBlue(final float pBlue) { + super.setBlue(pBlue); + } + + /** + * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) + */ + public void setFromAlpha(final float pAlpha) { + super.setAlpha(pAlpha); + } + + /** + * @param pRed from 0.0f to 1.0f + * @param pGreen from 0.0f to 1.0f + * @param pBlue from 0.0f to 1.0f + */ + public void setFromColor(final float pRed, final float pGreen, final float pBlue) { + super.setColor(pRed, pGreen, pBlue); + } + + /** + * @param pRed from 0.0f to 1.0f + * @param pGreen from 0.0f to 1.0f + * @param pBlue from 0.0f to 1.0f + * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) + */ + public void setFromColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + super.setColor(pRed, pGreen, pBlue, pAlpha); + } + + public void setFromColor(final Color pColor) { + super.setColor(pColor); + } + + public float getToRed() { + return this.mToColor.getRed(); + } + + public float getToGreen() { + return this.mToColor.getGreen(); + } + + public float getToBlue() { + return this.mToColor.getBlue(); + } + + public float getToAlpha() { + return this.mToColor.getAlpha(); + } + + public Color getToColor() { + return this.mToColor; + } + + /** + * @param pRed from 0.0f to 1.0f + */ + public void setToRed(final float pRed) { + if(this.mToColor.setRedChecking(pRed)) { // TODO Is this check worth it? + this.onUpdateColor(); + } + } + + /** + * @param pGreen from 0.0f to 1.0f + */ + public void setToGreen(final float pGreen) { + if(this.mToColor.setGreenChecking(pGreen)) { // TODO Is this check worth it? + this.onUpdateColor(); + } + } + + /** + * @param pBlue from 0.0f to 1.0f + */ + public void setToBlue(final float pBlue) { + if(this.mToColor.setBlueChecking(pBlue)) { // TODO Is this check worth it? + this.onUpdateColor(); + } + } + + /** + * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) + */ + public void setToAlpha(final float pAlpha) { + if(this.mToColor.setAlphaChecking(pAlpha)) { // TODO Is this check worth it? + this.onUpdateColor(); + } + } + + /** + * @param pRed from 0.0f to 1.0f + * @param pGreen from 0.0f to 1.0f + * @param pBlue from 0.0f to 1.0f + */ + public void setToColor(final float pRed, final float pGreen, final float pBlue) { + if(this.mToColor.setChecking(pRed, pGreen, pBlue)) { // TODO Is this check worth it? + this.onUpdateColor(); + } + } + + /** + * @param pRed from 0.0f to 1.0f + * @param pGreen from 0.0f to 1.0f + * @param pBlue from 0.0f to 1.0f + * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) + */ + public void setToColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + if(this.mToColor.setChecking(pRed, pGreen, pBlue, pAlpha)) { // TODO Is this check worth it? + this.onUpdateColor(); + } + } + + public void setToColor(final Color pColor) { + if(this.mToColor.setChecking(pColor)) { // TODO Is this check worth it? + this.onUpdateColor(); + } + } + + public float getGradientVectorX() { + return this.mGradientVectorX; + } + + public float getGradientVectorY() { + return this.mGradientVectorY; + } + + public void setGradientVectorX(final float pGradientVectorX) { + this.mGradientVectorX = pGradientVectorX; + + this.onUpdateColor(); + } + + public void setGradientVectorY(final float pGradientVectorY) { + this.mGradientVectorY = pGradientVectorY; + + this.onUpdateColor(); + } + + public void setGradientVector(final float pGradientVectorX, final float pGradientVectorY) { + this.mGradientVectorY = pGradientVectorY; + this.mGradientVectorX = pGradientVectorX; + + this.onUpdateColor(); + } + + public void setGradientColor(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue) { + this.mColor.set(pFromRed, pFromGreen, pFromBlue); + this.mToColor.set(pToRed, pToGreen, pToBlue); + + this.onUpdateColor(); + } + + public void setGradientColor(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final float pFromAlpha, final float pToAlpha) { + this.mColor.set(pFromRed, pFromGreen, pFromBlue, pFromAlpha); + this.mToColor.set(pToRed, pToGreen, pToBlue, pToAlpha); + + this.onUpdateColor(); + } + + public void setGradientColor(final Color pFromColor, final Color pToColor) { + this.mColor.set(pFromColor); + this.mToColor.set(pToColor); + + this.onUpdateColor(); + } + + public void setGradient(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final float pGradientVectorX, final float pGradientVectorY) { + this.mGradientVectorX = pGradientVectorX; + this.mGradientVectorY = pGradientVectorY; + + this.mColor.set(pFromRed, pFromGreen, pFromBlue); + this.mToColor.set(pToRed, pToGreen, pToBlue); + + this.onUpdateColor(); + } + + public void setGradient(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue, final float pFromAlpha, final float pToAlpha, final float pGradientVectorX, final float pGradientVectorY) { + this.mGradientVectorX = pGradientVectorX; + this.mGradientVectorY = pGradientVectorY; + + this.mColor.set(pFromRed, pFromGreen, pFromBlue, pFromAlpha); + this.mToColor.set(pToRed, pToGreen, pToBlue, pToAlpha); + + this.onUpdateColor(); + } + + public void setGradient(final Color pFromColor, final Color pToColor, final float pGradientVectorX, final float pGradientVectorY) { + this.mGradientVectorX = pGradientVectorX; + this.mGradientVectorY = pGradientVectorY; + + this.mColor.set(pFromColor); + this.mToColor.set(pToColor); + + this.onUpdateColor(); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public IGradientVertexBufferObject getVertexBufferObject() { + return this.mGradientVertexBufferObject; + } + + @Override + protected void preDraw(final GLState pGLState, final Camera pCamera) { + super.preDraw(pGLState, pCamera); + + this.mGradientVertexBufferObject.bind(pGLState, this.mShaderProgram); + } + + @Override + protected void draw(final GLState pGLState, final Camera pCamera) { + this.mGradientVertexBufferObject.draw(GLES20.GL_TRIANGLE_STRIP, Gradient.VERTICES_PER_RECTANGLE); + } + + @Override + protected void postDraw(final GLState pGLState, final Camera pCamera) { + this.mGradientVertexBufferObject.unbind(pGLState, this.mShaderProgram); + + super.postDraw(pGLState, pCamera); + } + + @Override + protected void onUpdateColor() { + this.mGradientVertexBufferObject.onUpdateColor(this); + } + + @Override + protected void onUpdateVertices() { + this.mGradientVertexBufferObject.onUpdateVertices(this); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java new file mode 100644 index 000000000..f74a29e48 --- /dev/null +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java @@ -0,0 +1,132 @@ +package org.andengine.entity.primitive.vbo; + +import org.andengine.entity.primitive.Gradient; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.HighPerformanceVertexBufferObject; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; +import org.andengine.util.color.ColorUtils; +import org.andengine.util.math.MathConstants; +import org.andengine.util.math.MathUtils; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:27:09 - 23.04.2012 + */ +public class HighPerformanceGradientVertexBufferObject extends HighPerformanceVertexBufferObject implements IGradientVertexBufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public HighPerformanceGradientVertexBufferObject(final VertexBufferObjectManager pVertexBufferObjectManager, final int pCapacity, final DrawType pDrawType, final boolean pAutoDispose, final VertexBufferObjectAttributes pVertexBufferObjectAttributes) { + super(pVertexBufferObjectManager, pCapacity, pDrawType, pAutoDispose, pVertexBufferObjectAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdateColor(final Gradient pGradient) { + final float[] bufferData = this.mBufferData; + + final float gradientVectorX = pGradient.getGradientVectorX(); + final float gradientVectorY = pGradient.getGradientVectorY(); + + final float length = MathUtils.length(gradientVectorX, gradientVectorY); + if (length == 0) { + return; + } + + float dX = gradientVectorX / length; + float dY = gradientVectorY / length; + + final float c = MathConstants.SQRT_2; + final float c2 = 2 * c; + + /* Compressed Interpolation mode. */ + if(pGradient.isCompressedInterpolation()) { + final float tmp = 1 / (Math.abs(dX) + Math.abs(dY)); + dX *= tmp * c; + dY *= tmp * c; + } + + final float fromRed = pGradient.getFromRed(); + final float fromGreen = pGradient.getFromGreen(); + final float fromBlue = pGradient.getFromBlue(); + final float fromAlpha = pGradient.getFromAlpha(); // TODO * 'this.mOverallOpactity' + + final float toRed = pGradient.getToRed(); + final float toGreen = pGradient.getToGreen(); + final float toBlue = pGradient.getToBlue(); + final float toAlpha = pGradient.getToAlpha(); // TODO * 'this.mOverallOpactity' + + /* Pre-fetch some calculations. */ + final float dRed = fromRed - toRed; + final float dGreen = fromGreen - toGreen; + final float dBlue = fromBlue - toBlue; + final float dAlpha = fromAlpha - toAlpha; + + + final float v0 = (c + dX + dY) / c2; + bufferData[(0 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX] = ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v0), toGreen + (dGreen * v0), toBlue + (dBlue * v0), toAlpha + (dAlpha * v0)); + + final float v1 = (c + dX - dY) / c2; + bufferData[(1 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX] = ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v1), toGreen + (dGreen * v1), toBlue + (dBlue * v1), toAlpha + (dAlpha * v1)); + + final float v2 = (c - dX + dY) / c2; + bufferData[(2 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX] = ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v2), toGreen + (dGreen * v2), toBlue + (dBlue * v2), toAlpha + (dAlpha * v2)); + + final float v3 = (c - dX - dY) / c2; + bufferData[(3 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX] = ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v3), toGreen + (dGreen * v3), toBlue + (dBlue * v3), toAlpha + (dAlpha * v3)); + + + this.setDirtyOnHardware(); + } + + @Override + public void onUpdateVertices(final Gradient pGradient) { + final float[] bufferData = this.mBufferData; + + final float x = 0; + final float y = 0; + final float x2 = pGradient.getWidth(); // TODO Optimize with field access? + final float y2 = pGradient.getHeight(); // TODO Optimize with field access? + + bufferData[(0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x; + bufferData[(0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y; + + bufferData[(1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x; + bufferData[(1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y2; + + bufferData[(2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x2; + bufferData[(2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y; + + bufferData[(3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x2; + bufferData[(3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y2; + + this.setDirtyOnHardware(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java index 31665570a..869315cde 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java @@ -43,8 +43,8 @@ public void onUpdateColor(final Line pLine) { final float packedColor = pLine.getColor().getABGRPackedFloat(); - bufferData[0 * Line.VERTEX_SIZE + Line.COLOR_INDEX] = packedColor; - bufferData[1 * Line.VERTEX_SIZE + Line.COLOR_INDEX] = packedColor; + bufferData[(0 * Line.VERTEX_SIZE) + Line.COLOR_INDEX] = packedColor; + bufferData[(1 * Line.VERTEX_SIZE) + Line.COLOR_INDEX] = packedColor; this.setDirtyOnHardware(); } @@ -53,11 +53,11 @@ public void onUpdateColor(final Line pLine) { public void onUpdateVertices(final Line pLine) { final float[] bufferData = this.mBufferData; - bufferData[0 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_X] = 0; - bufferData[0 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_Y] = 0; + bufferData[(0 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_X] = 0; + bufferData[(0 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_Y] = 0; - bufferData[1 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_X] = pLine.getX2() - pLine.getX1(); - bufferData[1 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_Y] = pLine.getY2() - pLine.getY1(); + bufferData[(1 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_X] = pLine.getX2() - pLine.getX1(); + bufferData[(1 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_Y] = pLine.getY2() - pLine.getY1(); this.setDirtyOnHardware(); } diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java index e1b79c40a..e28b54dc1 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java @@ -43,10 +43,10 @@ public void onUpdateColor(final Rectangle pRectangle) { final float packedColor = pRectangle.getColor().getABGRPackedFloat(); - bufferData[0 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX] = packedColor; - bufferData[1 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX] = packedColor; - bufferData[2 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX] = packedColor; - bufferData[3 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX] = packedColor; + bufferData[(0 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX] = packedColor; + bufferData[(1 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX] = packedColor; + bufferData[(2 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX] = packedColor; + bufferData[(3 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX] = packedColor; this.setDirtyOnHardware(); } @@ -60,17 +60,17 @@ public void onUpdateVertices(final Rectangle pRectangle) { final float x2 = pRectangle.getWidth(); // TODO Optimize with field access? final float y2 = pRectangle.getHeight(); // TODO Optimize with field access? - bufferData[0 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X] = x; - bufferData[0 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y] = y; + bufferData[(0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x; + bufferData[(0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y; - bufferData[1 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X] = x; - bufferData[1 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y] = y2; + bufferData[(1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x; + bufferData[(1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y2; - bufferData[2 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X] = x2; - bufferData[2 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y] = y; + bufferData[(2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x2; + bufferData[(2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y; - bufferData[3 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X] = x2; - bufferData[3 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y] = y2; + bufferData[(3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x2; + bufferData[(3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y2; this.setDirtyOnHardware(); } diff --git a/src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java new file mode 100644 index 000000000..678e0f3ef --- /dev/null +++ b/src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java @@ -0,0 +1,23 @@ +package org.andengine.entity.primitive.vbo; + +import org.andengine.entity.primitive.Gradient; +import org.andengine.opengl.vbo.IVertexBufferObject; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:27:22 - 23.04.2012 + */ +public interface IGradientVertexBufferObject extends IVertexBufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onUpdateColor(final Gradient pGradient); + public void onUpdateVertices(final Gradient pGradient); +} \ No newline at end of file diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java new file mode 100644 index 000000000..f63c49348 --- /dev/null +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java @@ -0,0 +1,134 @@ +package org.andengine.entity.primitive.vbo; + +import java.nio.FloatBuffer; + +import org.andengine.entity.primitive.Gradient; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.LowMemoryVertexBufferObject; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; +import org.andengine.util.color.ColorUtils; +import org.andengine.util.math.MathConstants; +import org.andengine.util.math.MathUtils; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:27:33 - 23.04.2012 + */ +public class LowMemoryGradientVertexBufferObject extends LowMemoryVertexBufferObject implements IGradientVertexBufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LowMemoryGradientVertexBufferObject(final VertexBufferObjectManager pVertexBufferObjectManager, final int pCapacity, final DrawType pDrawType, final boolean pAutoDispose, final VertexBufferObjectAttributes pVertexBufferObjectAttributes) { + super(pVertexBufferObjectManager, pCapacity, pDrawType, pAutoDispose, pVertexBufferObjectAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdateColor(final Gradient pGradient) { + final FloatBuffer bufferData = this.mFloatBuffer; + + final float gradientVectorX = pGradient.getGradientVectorX(); + final float gradientVectorY = pGradient.getGradientVectorY(); + + final float length = MathUtils.length(gradientVectorX, gradientVectorY); + if (length == 0) { + return; + } + + float dX = gradientVectorX / length; + float dY = gradientVectorY / length; + + final float c = MathConstants.SQRT_2; + final float c2 = 2 * c; + + /* Compressed Interpolation mode. */ + if(pGradient.isCompressedInterpolation()) { + final float tmp = 1 / (Math.abs(dX) + Math.abs(dY)); + dX *= tmp * c; + dY *= tmp * c; + } + + final float fromRed = pGradient.getFromRed(); + final float fromGreen = pGradient.getFromGreen(); + final float fromBlue = pGradient.getFromBlue(); + final float fromAlpha = pGradient.getFromAlpha(); // TODO * 'this.mOverallOpactity' + + final float toRed = pGradient.getToRed(); + final float toGreen = pGradient.getToGreen(); + final float toBlue = pGradient.getToBlue(); + final float toAlpha = pGradient.getToAlpha(); // TODO * 'this.mOverallOpactity' + + /* Pre-fetch some calculations. */ + final float dRed = fromRed - toRed; + final float dGreen = fromGreen - toGreen; + final float dBlue = fromBlue - toBlue; + final float dAlpha = fromAlpha - toAlpha; + + + final float v0 = (c + dX + dY) / c2; + bufferData.put((0 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX, ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v0), toGreen + (dGreen * v0), toBlue + (dBlue * v0), toAlpha + (dAlpha * v0))); + + final float v1 = (c + dX - dY) / c2; + bufferData.put((1 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX, ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v1), toGreen + (dGreen * v1), toBlue + (dBlue * v1), toAlpha + (dAlpha * v1))); + + final float v2 = (c - dX + dY) / c2; + bufferData.put((2 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX, ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v2), toGreen + (dGreen * v2), toBlue + (dBlue * v2), toAlpha + (dAlpha * v2))); + + final float v3 = (c - dX - dY) / c2; + bufferData.put((3 * Gradient.VERTEX_SIZE) + Gradient.COLOR_INDEX, ColorUtils.convertRGBAToABGRPackedFloat(toRed + (dRed * v3), toGreen + (dGreen * v3), toBlue + (dBlue * v3), toAlpha + (dAlpha * v3))); + + + this.setDirtyOnHardware(); + } + + @Override + public void onUpdateVertices(final Gradient pGradient) { + final FloatBuffer bufferData = this.mFloatBuffer; + + final float x = 0; + final float y = 0; + final float x2 = pGradient.getWidth(); + final float y2 = pGradient.getHeight(); + + bufferData.put((0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x); + bufferData.put((0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y); + + bufferData.put((1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x); + bufferData.put((1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y2); + + bufferData.put((2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x2); + bufferData.put((2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y); + + bufferData.put((3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x2); + bufferData.put((3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y2); + + this.setDirtyOnHardware(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java index 42da35b4c..922c6d9b5 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java @@ -45,8 +45,8 @@ public void onUpdateColor(final Line pLine) { final float packedColor = pLine.getColor().getABGRPackedFloat(); - bufferData.put(0 * Line.VERTEX_SIZE + Line.COLOR_INDEX, packedColor); - bufferData.put(1 * Line.VERTEX_SIZE + Line.COLOR_INDEX, packedColor); + bufferData.put((0 * Line.VERTEX_SIZE) + Line.COLOR_INDEX, packedColor); + bufferData.put((1 * Line.VERTEX_SIZE) + Line.COLOR_INDEX, packedColor); this.setDirtyOnHardware(); } @@ -55,11 +55,11 @@ public void onUpdateColor(final Line pLine) { public void onUpdateVertices(final Line pLine) { final FloatBuffer bufferData = this.mFloatBuffer; - bufferData.put(0 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_X, 0); - bufferData.put(0 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_Y, 0); + bufferData.put((0 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_X, 0); + bufferData.put((0 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_Y, 0); - bufferData.put(1 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_X, pLine.getX2() - pLine.getX1()); // TODO Optimize with field access? - bufferData.put(1 * Line.VERTEX_SIZE + Line.VERTEX_INDEX_Y, pLine.getY2() - pLine.getY1()); // TODO Optimize with field access? + bufferData.put((1 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_X, pLine.getX2() - pLine.getX1()); // TODO Optimize with field access? + bufferData.put((1 * Line.VERTEX_SIZE) + Line.VERTEX_INDEX_Y, pLine.getY2() - pLine.getY1()); // TODO Optimize with field access? this.setDirtyOnHardware(); } diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java index 798d1a774..b8f0314d7 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java @@ -45,10 +45,10 @@ public void onUpdateColor(final Rectangle pRectangle) { final float packedColor = pRectangle.getColor().getABGRPackedFloat(); - bufferData.put(0 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX, packedColor); - bufferData.put(1 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX, packedColor); - bufferData.put(2 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX, packedColor); - bufferData.put(3 * Rectangle.VERTEX_SIZE + Rectangle.COLOR_INDEX, packedColor); + bufferData.put((0 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX, packedColor); + bufferData.put((1 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX, packedColor); + bufferData.put((2 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX, packedColor); + bufferData.put((3 * Rectangle.VERTEX_SIZE) + Rectangle.COLOR_INDEX, packedColor); this.setDirtyOnHardware(); } @@ -62,17 +62,17 @@ public void onUpdateVertices(final Rectangle pRectangle) { final float x2 = pRectangle.getWidth(); final float y2 = pRectangle.getHeight(); - bufferData.put(0 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X, x); - bufferData.put(0 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y, y); + bufferData.put((0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x); + bufferData.put((0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y); - bufferData.put(1 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X, x); - bufferData.put(1 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y, y2); + bufferData.put((1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x); + bufferData.put((1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y2); - bufferData.put(2 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X, x2); - bufferData.put(2 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y, y); + bufferData.put((2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x2); + bufferData.put((2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y); - bufferData.put(3 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_X, x2); - bufferData.put(3 * Rectangle.VERTEX_SIZE + Rectangle.VERTEX_INDEX_Y, y2); + bufferData.put((3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x2); + bufferData.put((3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y2); this.setDirtyOnHardware(); } diff --git a/src/org/andengine/util/math/MathConstants.java b/src/org/andengine/util/math/MathConstants.java index d839498f1..7baf36b82 100644 --- a/src/org/andengine/util/math/MathConstants.java +++ b/src/org/andengine/util/math/MathConstants.java @@ -1,5 +1,7 @@ package org.andengine.util.math; +import android.util.FloatMath; + /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -20,6 +22,8 @@ public interface MathConstants { public static final float DEG_TO_RAD = PI / 180.0f; public static final float RAD_TO_DEG = 180.0f / PI; + public static final float SQRT_2 = FloatMath.sqrt(2); + // =========================================================== // Methods // =========================================================== From c0d9e846ba9c8f3f589c63ae0350487d94473f7d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 23 Apr 2012 17:27:00 -0700 Subject: [PATCH 008/252] Added some convenience methods to GLState around different OpenGL states. --- src/org/andengine/opengl/util/GLState.java | 215 ++++++++++++++++----- 1 file changed, 170 insertions(+), 45 deletions(-) diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index e56fbae7c..0fcb86bbc 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -61,12 +61,12 @@ public class GLState { private int mCurrentSourceBlendMode = -1; private int mCurrentDestinationBlendMode = -1; - private boolean mEnableDither = true; - private boolean mEnableDepthTest = true; + private boolean mDitherEnabled = true; + private boolean mDepthTestEnabled = true; - private boolean mEnableScissorTest = false; - private boolean mEnableBlend = false; - private boolean mEnableCulling = false; + private boolean mScissorTestEnabled = false; + private boolean mBlendEnabled = false; + private boolean mCullingEnabled = false; private float mLineWidth = 1; @@ -166,68 +166,193 @@ public void reset(final RenderOptions pRenderOptions, final ConfigChooser pConfi this.mLineWidth = 1; } - public void enableScissorTest() { - if(!this.mEnableScissorTest) { - this.mEnableScissorTest = true; - GLES20.glEnable(GLES20.GL_SCISSOR_TEST); + public boolean isScissorTestEnabled() { + return this.mScissorTestEnabled; + } + /** + * @return the previous state. + */ + public boolean enableScissorTest() { + if(this.mScissorTestEnabled) { + return true; + } + + this.mScissorTestEnabled = true; + GLES20.glEnable(GLES20.GL_SCISSOR_TEST); + return false; + } + /** + * @return the previous state. + */ + public boolean disableScissorTest() { + if(!this.mScissorTestEnabled) { + return false; } + + this.mScissorTestEnabled = false; + GLES20.glDisable(GLES20.GL_SCISSOR_TEST); + return true; } - public void disableScissorTest() { - if(this.mEnableScissorTest) { - this.mEnableScissorTest = false; - GLES20.glDisable(GLES20.GL_SCISSOR_TEST); + /** + * @return the previous state. + */ + public boolean setScissorTestEnabled(final boolean pEnabled) { + if(pEnabled) { + return this.enableScissorTest(); + } else { + return this.disableScissorTest(); } } - public void enableBlend() { - if(!this.mEnableBlend) { - this.mEnableBlend = true; - GLES20.glEnable(GLES20.GL_BLEND); + public boolean isBlendEnabled() { + return this.mBlendEnabled; + } + /** + * @return the previous state. + */ + public boolean enableBlend() { + if(this.mBlendEnabled) { + return true; + } + + this.mBlendEnabled = true; + GLES20.glEnable(GLES20.GL_BLEND); + return false; + } + /** + * @return the previous state. + */ + public boolean disableBlend() { + if(!this.mBlendEnabled) { + return false; } + + this.mBlendEnabled = false; + GLES20.glDisable(GLES20.GL_BLEND); + return true; } - public void disableBlend() { - if(this.mEnableBlend) { - this.mEnableBlend = false; - GLES20.glDisable(GLES20.GL_BLEND); + /** + * @return the previous state. + */ + public boolean setBlendEnabled(final boolean pEnabled) { + if(pEnabled) { + return this.enableBlend(); + } else { + return this.disableBlend(); } } - public void enableCulling() { - if(!this.mEnableCulling) { - this.mEnableCulling = true; - GLES20.glEnable(GLES20.GL_CULL_FACE); + public boolean isCullingEnabled() { + return this.mCullingEnabled; + } + /** + * @return the previous state. + */ + public boolean enableCulling() { + if(this.mCullingEnabled) { + return true; } + + this.mCullingEnabled = true; + GLES20.glEnable(GLES20.GL_CULL_FACE); + return false; } - public void disableCulling() { - if(this.mEnableCulling) { - this.mEnableCulling = false; - GLES20.glDisable(GLES20.GL_CULL_FACE); + /** + * @return the previous state. + */ + public boolean disableCulling() { + if(!this.mCullingEnabled) { + return false; + } + + this.mCullingEnabled = false; + GLES20.glDisable(GLES20.GL_CULL_FACE); + return true; + } + /** + * @return the previous state. + */ + public boolean setCullingEnabled(final boolean pEnabled) { + if(pEnabled) { + return this.enableCulling(); + } else { + return this.disableCulling(); } } - public void enableDither() { - if(!this.mEnableDither) { - this.mEnableDither = true; - GLES20.glEnable(GLES20.GL_DITHER); + public boolean isDitherEnabled() { + return this.mDitherEnabled; + } + /** + * @return the previous state. + */ + public boolean enableDither() { + if(this.mDitherEnabled) { + return true; } + + this.mDitherEnabled = true; + GLES20.glEnable(GLES20.GL_DITHER); + return false; } - public void disableDither() { - if(this.mEnableDither) { - this.mEnableDither = false; - GLES20.glDisable(GLES20.GL_DITHER); + /** + * @return the previous state. + */ + public boolean disableDither() { + if(!this.mDitherEnabled) { + return false; + } + + this.mDitherEnabled = false; + GLES20.glDisable(GLES20.GL_DITHER); + return true; + } + /** + * @return the previous state. + */ + public boolean setDitherEnabled(final boolean pEnabled) { + if(pEnabled) { + return this.enableDither(); + } else { + return this.disableDither(); } } - public void enableDepthTest() { - if(!this.mEnableDepthTest) { - this.mEnableDepthTest = true; - GLES20.glEnable(GLES20.GL_DEPTH_TEST); + public boolean isDepthTestEnabled() { + return this.mDepthTestEnabled; + } + /** + * @return the previous state. + */ + public boolean enableDepthTest() { + if(this.mDepthTestEnabled) { + return true; } + + this.mDepthTestEnabled = true; + GLES20.glEnable(GLES20.GL_DEPTH_TEST); + return false; } - public void disableDepthTest() { - if(this.mEnableDepthTest) { - this.mEnableDepthTest = false; - GLES20.glDisable(GLES20.GL_DEPTH_TEST); + /** + * @return the previous state. + */ + public boolean disableDepthTest() { + if(!this.mDepthTestEnabled) { + return false; + } + + this.mDepthTestEnabled = false; + GLES20.glDisable(GLES20.GL_DEPTH_TEST); + return true; + } + /** + * @return the previous state. + */ + public boolean setDepthTestEnabled(final boolean pEnabled) { + if(pEnabled) { + return this.enableDepthTest(); + } else { + return this.disableDepthTest(); } } From a98a8e39d669992c5e292fe8fdd9e0e40b2b91f8 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 23 Apr 2012 17:27:23 -0700 Subject: [PATCH 009/252] Added possibility to enable dither for a Gradient. --- .../andengine/entity/primitive/Gradient.java | 34 +++++++++++++++---- ...PerformanceGradientVertexBufferObject.java | 3 +- .../LowMemoryGradientVertexBufferObject.java | 3 +- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index ac87ffc1a..bde25812b 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -49,7 +49,8 @@ public class Gradient extends Shape { private final Color mToColor = new Color(Color.WHITE); private float mGradientVectorX = 0; private float mGradientVectorY = -1; - private boolean mCompressedInterpolation; + private boolean mGradientFitToBounds; + private boolean mDitherEnabled; // =========================================================== // Constructors @@ -84,18 +85,29 @@ public Gradient(final float pX, final float pY, final float pWidth, final float // Getter & Setter // =========================================================== - public boolean isCompressedInterpolation() { - return this.mCompressedInterpolation; + public boolean isGradientFitToBounds() { + return this.mGradientFitToBounds; } - public void setCompressedInterpolation(final boolean pCompressedInterpolation) { - if(this.mCompressedInterpolation != pCompressedInterpolation) { - this.mCompressedInterpolation = pCompressedInterpolation; + /** + * @param pGradientFitToBounds + */ + public void setGradientFitToBounds(final boolean pGradientFitToBounds) { + if(this.mGradientFitToBounds != pGradientFitToBounds) { + this.mGradientFitToBounds = pGradientFitToBounds; this.onUpdateColor(); } } + public boolean isDitherEnabled() { + return this.mDitherEnabled; + } + + public void setDitherEnabled(final boolean pDitherEnabled) { + this.mDitherEnabled = pDitherEnabled; + } + @Deprecated @Override public float getRed() { @@ -420,7 +432,15 @@ protected void preDraw(final GLState pGLState, final Camera pCamera) { @Override protected void draw(final GLState pGLState, final Camera pCamera) { - this.mGradientVertexBufferObject.draw(GLES20.GL_TRIANGLE_STRIP, Gradient.VERTICES_PER_RECTANGLE); + if(this.mDitherEnabled) { + final boolean wasDitherEnabled = pGLState.enableDither(); + + this.mGradientVertexBufferObject.draw(GLES20.GL_TRIANGLE_STRIP, Gradient.VERTICES_PER_RECTANGLE); + + pGLState.setDitherEnabled(wasDitherEnabled); + } else { + this.mGradientVertexBufferObject.draw(GLES20.GL_TRIANGLE_STRIP, Gradient.VERTICES_PER_RECTANGLE); + } } @Override diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java index f74a29e48..8b89c65e4 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java @@ -58,8 +58,7 @@ public void onUpdateColor(final Gradient pGradient) { final float c = MathConstants.SQRT_2; final float c2 = 2 * c; - /* Compressed Interpolation mode. */ - if(pGradient.isCompressedInterpolation()) { + if(pGradient.isGradientFitToBounds()) { final float tmp = 1 / (Math.abs(dX) + Math.abs(dY)); dX *= tmp * c; dY *= tmp * c; diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java index f63c49348..446f117ed 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java @@ -60,8 +60,7 @@ public void onUpdateColor(final Gradient pGradient) { final float c = MathConstants.SQRT_2; final float c2 = 2 * c; - /* Compressed Interpolation mode. */ - if(pGradient.isCompressedInterpolation()) { + if(pGradient.isGradientFitToBounds()) { final float tmp = 1 / (Math.abs(dX) + Math.abs(dY)); dX *= tmp * c; dY *= tmp * c; From eb1d4f2a96ba68c97bc135c1ded20aa7218dc23d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 23 Apr 2012 17:30:47 -0700 Subject: [PATCH 010/252] Added javadoc in Gradient.setDitherEnabled. --- src/org/andengine/entity/primitive/Gradient.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index bde25812b..15c89ea6c 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -104,6 +104,9 @@ public boolean isDitherEnabled() { return this.mDitherEnabled; } + /** + * @param pDitherEnabled true to enable dither, false to use the currently active dither setting in {@link GLState}. + */ public void setDitherEnabled(final boolean pDitherEnabled) { this.mDitherEnabled = pDitherEnabled; } From 86956b7bd6f572f3979cebc1bc25bdeff11930d7 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 23 Apr 2012 17:56:51 -0700 Subject: [PATCH 011/252] Added possibility to set the vector of a Gradient by angle (degrees) and not through it's x/y component. --- src/org/andengine/entity/primitive/Gradient.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index 15c89ea6c..54c1cbcf3 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -13,8 +13,10 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; import org.andengine.util.color.Color; +import org.andengine.util.math.MathUtils; import android.opengl.GLES20; +import android.util.FloatMath; /** * (c) Zynga 2012 @@ -360,12 +362,21 @@ public void setGradientVectorY(final float pGradientVectorY) { } public void setGradientVector(final float pGradientVectorX, final float pGradientVectorY) { - this.mGradientVectorY = pGradientVectorY; this.mGradientVectorX = pGradientVectorX; + this.mGradientVectorY = pGradientVectorY; this.onUpdateColor(); } + /** + * @param pGradientAngle in degrees. 0 is a 'left-to-right', 90 is 'top-to-bottom', ... + */ + public void setGradientAngle(final float pGradientAngle) { + final float angleInRad = MathUtils.degToRad(pGradientAngle); + + this.setGradientVector(FloatMath.cos(angleInRad), FloatMath.sin(angleInRad)); + } + public void setGradientColor(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue) { this.mColor.set(pFromRed, pFromGreen, pFromBlue); this.mToColor.set(pToRed, pToGreen, pToBlue); From e2f7f1766fec940052c9d986c55235e0c6ba7ebe Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 23 Apr 2012 18:22:27 -0700 Subject: [PATCH 012/252] Minor changes to gradient. --- .../andengine/entity/primitive/Gradient.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index 54c1cbcf3..479c9ea18 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -52,7 +52,7 @@ public class Gradient extends Shape { private float mGradientVectorX = 0; private float mGradientVectorY = -1; private boolean mGradientFitToBounds; - private boolean mDitherEnabled; + private boolean mGradientDitherEnabled; // =========================================================== // Constructors @@ -92,7 +92,8 @@ public boolean isGradientFitToBounds() { } /** - * @param pGradientFitToBounds + * @param pGradientFitToBounds If true ensures the from and to color are always on the bounds of the {@link Gradient} entity. + * If false the from and to color might exceed the bounds of the {@link Gradient} entity, depending on the angle/vector supplied. */ public void setGradientFitToBounds(final boolean pGradientFitToBounds) { if(this.mGradientFitToBounds != pGradientFitToBounds) { @@ -102,15 +103,15 @@ public void setGradientFitToBounds(final boolean pGradientFitToBounds) { } } - public boolean isDitherEnabled() { - return this.mDitherEnabled; + public boolean isGradientDitherEnabled() { + return this.mGradientDitherEnabled; } /** - * @param pDitherEnabled true to enable dither, false to use the currently active dither setting in {@link GLState}. + * @param pGradientDitherEnabled true to enable dither, false to use the currently active dither setting in {@link GLState}. */ - public void setDitherEnabled(final boolean pDitherEnabled) { - this.mDitherEnabled = pDitherEnabled; + public void setGradientDitherEnabled(final boolean pGradientDitherEnabled) { + this.mGradientDitherEnabled = pGradientDitherEnabled; } @Deprecated @@ -446,7 +447,7 @@ protected void preDraw(final GLState pGLState, final Camera pCamera) { @Override protected void draw(final GLState pGLState, final Camera pCamera) { - if(this.mDitherEnabled) { + if(this.mGradientDitherEnabled) { final boolean wasDitherEnabled = pGLState.enableDither(); this.mGradientVertexBufferObject.draw(GLES20.GL_TRIANGLE_STRIP, Gradient.VERTICES_PER_RECTANGLE); From 6652d740d14984d753793f975cc194a15fa2e178 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 24 Apr 2012 16:02:01 -0700 Subject: [PATCH 013/252] Added EmptyTexture convenience class. --- .../opengl/texture/EmptyTexture.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/org/andengine/opengl/texture/EmptyTexture.java diff --git a/src/org/andengine/opengl/texture/EmptyTexture.java b/src/org/andengine/opengl/texture/EmptyTexture.java new file mode 100644 index 000000000..bc5ba3778 --- /dev/null +++ b/src/org/andengine/opengl/texture/EmptyTexture.java @@ -0,0 +1,77 @@ +package org.andengine.opengl.texture; + +import java.io.IOException; + +import org.andengine.opengl.util.GLState; + +import android.opengl.GLES20; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 3:07:48 PM - Apr 24, 2012 + */ +public class EmptyTexture extends Texture{ + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final int mWidth; + private final int mHeight; + + // =========================================================== + // Constructors + // ========================================================== + + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions) { + this(pTextureManager, pWidth, pHeight, pPixelFormat, pTextureOptions, null); + } + + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) throws IllegalArgumentException { + super(pTextureManager, pPixelFormat, pTextureOptions, pTextureStateListener); + + this.mWidth = pWidth; + this.mHeight = pHeight; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getWidth() { + return this.mWidth; + } + + @Override + public int getHeight() { + return this.mHeight; + } + + @Override + protected void writeTextureToHardware(final GLState pGLState) throws IOException { + final PixelFormat pixelFormat = this.mPixelFormat; + final int glInternalFormat = pixelFormat.getGLInternalFormat(); + final int glFormat = pixelFormat.getGLFormat(); + final int glType = pixelFormat.getGLType(); + + GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, glInternalFormat, this.mWidth, this.mHeight, 0, glFormat, glType, null); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 9d3f20b269eb97967a61b359b92d980f9116fe57 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 24 Apr 2012 16:04:36 -0700 Subject: [PATCH 014/252] Moved HorizontalAlign and VerticalAlign to a separate package. Changes in FontManager to use new EmptyTexture instead of BitmapTextureAtlas. --- .../menu/animator/AlphaMenuAnimator.java | 2 +- .../scene/menu/animator/BaseMenuAnimator.java | 2 +- .../menu/animator/DirectMenuAnimator.java | 2 +- .../menu/animator/SlideMenuAnimator.java | 2 +- src/org/andengine/entity/text/Text.java | 6 +- .../andengine/entity/text/TextOptions.java | 2 +- src/org/andengine/entity/text/TickerText.java | 2 +- .../andengine/opengl/font/FontFactory.java | 28 ++++---- .../andengine/opengl/font/FontManager.java | 67 ++++++++++++++++++- .../util/{ => align}/HorizontalAlign.java | 2 +- .../util/{ => align}/VerticalAlign.java | 2 +- 11 files changed, 92 insertions(+), 25 deletions(-) rename src/org/andengine/util/{ => align}/HorizontalAlign.java (97%) rename src/org/andengine/util/{ => align}/VerticalAlign.java (97%) diff --git a/src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java index 01d1bcc63..22109bd78 100644 --- a/src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java @@ -4,7 +4,7 @@ import org.andengine.entity.modifier.AlphaModifier; import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.HorizontalAlign; +import org.andengine.util.align.HorizontalAlign; import org.andengine.util.modifier.ease.IEaseFunction; /** diff --git a/src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java index 083a7c120..6fe91137b 100644 --- a/src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.HorizontalAlign; +import org.andengine.util.align.HorizontalAlign; import org.andengine.util.modifier.ease.EaseLinear; import org.andengine.util.modifier.ease.IEaseFunction; diff --git a/src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java index 7d0639292..bc54dcc9e 100644 --- a/src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.HorizontalAlign; +import org.andengine.util.align.HorizontalAlign; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java index fe7e72664..cab8ad32b 100644 --- a/src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java @@ -4,7 +4,7 @@ import org.andengine.entity.modifier.MoveModifier; import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.HorizontalAlign; +import org.andengine.util.align.HorizontalAlign; import org.andengine.util.modifier.ease.IEaseFunction; /** diff --git a/src/org/andengine/entity/text/Text.java b/src/org/andengine/entity/text/Text.java index 0f882f8ca..85731b76a 100644 --- a/src/org/andengine/entity/text/Text.java +++ b/src/org/andengine/entity/text/Text.java @@ -17,10 +17,10 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; -import org.andengine.util.HorizontalAlign; import org.andengine.util.adt.DataConstants; import org.andengine.util.adt.list.FloatArrayList; import org.andengine.util.adt.list.IFloatList; +import org.andengine.util.align.HorizontalAlign; import android.opengl.GLES20; @@ -134,6 +134,10 @@ public Text(final float pX, final float pY, final IFont pFont, final CharSequenc this(pX, pY, pFont, pText, pCharactersMaximum, pTextOptions, pVertexBufferObjectManager, DrawType.STATIC); } + public Text(final float pX, final float pY, final IFont pFont, final CharSequence pText, final int pCharactersMaximum, final TextOptions pTextOptions, final VertexBufferObjectManager pVertexBufferObjectManager, final ShaderProgram pShaderProgram) { + this(pX, pY, pFont, pText, pCharactersMaximum, pTextOptions, pVertexBufferObjectManager, DrawType.STATIC, pShaderProgram); + } + public Text(final float pX, final float pY, final IFont pFont, final CharSequence pText, final int pCharactersMaximum, final TextOptions pTextOptions, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { this(pX, pY, pFont, pText, pCharactersMaximum, pTextOptions, new HighPerformanceTextVertexBufferObject(pVertexBufferObjectManager, Text.LETTER_SIZE * pCharactersMaximum, pDrawType, true, Text.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT)); } diff --git a/src/org/andengine/entity/text/TextOptions.java b/src/org/andengine/entity/text/TextOptions.java index 13200b353..90e6071d4 100644 --- a/src/org/andengine/entity/text/TextOptions.java +++ b/src/org/andengine/entity/text/TextOptions.java @@ -1,6 +1,6 @@ package org.andengine.entity.text; -import org.andengine.util.HorizontalAlign; +import org.andengine.util.align.HorizontalAlign; /** * (c) Zynga 2012 diff --git a/src/org/andengine/entity/text/TickerText.java b/src/org/andengine/entity/text/TickerText.java index 4a8e471fc..d81882ac4 100644 --- a/src/org/andengine/entity/text/TickerText.java +++ b/src/org/andengine/entity/text/TickerText.java @@ -5,7 +5,7 @@ import org.andengine.opengl.font.IFont; import org.andengine.opengl.util.GLState; import org.andengine.opengl.vbo.VertexBufferObjectManager; -import org.andengine.util.HorizontalAlign; +import org.andengine.util.align.HorizontalAlign; import android.opengl.GLES20; diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java index 9ece71bac..0095326a2 100644 --- a/src/org/andengine/opengl/font/FontFactory.java +++ b/src/org/andengine/opengl/font/FontFactory.java @@ -1,10 +1,10 @@ package org.andengine.opengl.font; +import org.andengine.opengl.texture.EmptyTexture; import org.andengine.opengl.texture.ITexture; +import org.andengine.opengl.texture.PixelFormat; import org.andengine.opengl.texture.TextureManager; import org.andengine.opengl.texture.TextureOptions; -import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; -import org.andengine.opengl.texture.bitmap.BitmapTextureFormat; import org.andengine.util.color.Color; import android.content.res.AssetManager; @@ -115,23 +115,23 @@ public static Font create(final FontManager pFontManager, final TextureManager p } public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor) { - return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, BitmapTextureFormat.RGBA_8888, pTextureOptions, pTypeface, pSize, pAntiAlias, pColor); + return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, PixelFormat.RGBA_8888, pTextureOptions, pTypeface, pSize, pAntiAlias, pColor); } - public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final BitmapTextureFormat pBitmapTextureFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize) { - return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pBitmapTextureFormat, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, FontFactory.COLOR_DEFAULT); + public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize) { + return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, FontFactory.COLOR_DEFAULT); } - public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final BitmapTextureFormat pBitmapTextureFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias) { - return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pBitmapTextureFormat, pTextureOptions, pTypeface, pSize, pAntiAlias, FontFactory.COLOR_DEFAULT); + public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias) { + return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions, pTypeface, pSize, pAntiAlias, FontFactory.COLOR_DEFAULT); } - public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final BitmapTextureFormat pBitmapTextureFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final int pColor) { - return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pBitmapTextureFormat, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, pColor); + public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final int pColor) { + return FontFactory.create(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, pColor); } - public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final BitmapTextureFormat pBitmapTextureFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor) { - return FontFactory.create(pFontManager, new BitmapTextureAtlas(pTextureManager, pTextureWidth, pTextureHeight, pBitmapTextureFormat, pTextureOptions), pTypeface, pSize, pAntiAlias, pColor); + public static Font create(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor) { + return FontFactory.create(pFontManager, new EmptyTexture(pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions), pTypeface, pSize, pAntiAlias, pColor); } public static Font create(final FontManager pFontManager, final ITexture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor) { @@ -148,11 +148,11 @@ public static Font createFromAsset(final FontManager pFontManager, final Texture } public static Font createFromAsset(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor) { - return FontFactory.createFromAsset(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, BitmapTextureFormat.RGBA_8888, pTextureOptions, pAssetManager, pAssetPath, pSize, pAntiAlias, pColor); + return FontFactory.createFromAsset(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, PixelFormat.RGBA_8888, pTextureOptions, pAssetManager, pAssetPath, pSize, pAntiAlias, pColor); } - public static Font createFromAsset(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final BitmapTextureFormat pBitmapTextureFormat, final TextureOptions pTextureOptions, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor) { - return new Font(pFontManager, new BitmapTextureAtlas(pTextureManager, pTextureWidth, pTextureHeight, pBitmapTextureFormat, pTextureOptions), Typeface.createFromAsset(pAssetManager, FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor); + public static Font createFromAsset(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor) { + return new Font(pFontManager, new EmptyTexture(pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions), Typeface.createFromAsset(pAssetManager, FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor); } diff --git a/src/org/andengine/opengl/font/FontManager.java b/src/org/andengine/opengl/font/FontManager.java index 9032f45e0..5d906511e 100644 --- a/src/org/andengine/opengl/font/FontManager.java +++ b/src/org/andengine/opengl/font/FontManager.java @@ -1,6 +1,7 @@ package org.andengine.opengl.font; import java.util.ArrayList; +import java.util.HashMap; import org.andengine.opengl.util.GLState; @@ -22,6 +23,8 @@ public class FontManager { // =========================================================== private final ArrayList mFontsManaged = new ArrayList(); + private final ArrayList mBitmapFontsManaged = new ArrayList(); + private final HashMap mFontsMapped = new HashMap(); // =========================================================== // Constructors @@ -50,6 +53,40 @@ public synchronized void onDestroy() { } this.mFontsManaged.clear(); + this.mBitmapFontsManaged.clear(); + this.mFontsMapped.clear(); + } + + public synchronized boolean hasMappedFont(final String pID) { + if(pID == null) { + throw new IllegalArgumentException("pID must not be null!"); + } + return this.mFontsMapped.containsKey(pID); + } + + public synchronized IFont getMappedFont(final String pID) { + if(pID == null) { + throw new IllegalArgumentException("pID must not be null!"); + } + return this.mFontsMapped.get(pID); + } + + public synchronized void addMappedFont(final String pID, final IFont pFont) throws IllegalArgumentException { + if(pID == null) { + throw new IllegalArgumentException("pID must not be null!"); + } else if(pFont == null) { + throw new IllegalArgumentException("pFont must not be null!"); + } else if(this.mFontsMapped.containsKey(pID)) { + throw new IllegalArgumentException("Collision for pID: '" + pID + "'."); + } + this.mFontsMapped.put(pID, pFont); + } + + public synchronized IFont removedMappedFont(final String pID) { + if(pID == null) { + throw new IllegalArgumentException("pID must not be null!"); + } + return this.mFontsMapped.remove(pID); } public synchronized void loadFont(final Font pFont) { @@ -59,12 +96,25 @@ public synchronized void loadFont(final Font pFont) { this.mFontsManaged.add(pFont); } - public synchronized void loadFonts(final Font ...pFonts) { + public synchronized void loadFont(final BitmapFont pBitmapFont) { + if(pBitmapFont == null) { + throw new IllegalArgumentException("pBitmapFont must not be null!"); + } + this.mBitmapFontsManaged.add(pBitmapFont); + } + + public synchronized void loadFonts(final Font ... pFonts) { for(int i = 0; i < pFonts.length; i++) { this.loadFont(pFonts[i]); } } + public synchronized void loadFonts(final BitmapFont ... pBitmapFonts) { + for(int i = 0; i < pBitmapFonts.length; i++) { + this.loadFont(pBitmapFonts[i]); + } + } + public synchronized void unloadFont(final Font pFont) { if(pFont == null) { throw new IllegalArgumentException("pFont must not be null!"); @@ -72,12 +122,25 @@ public synchronized void unloadFont(final Font pFont) { this.mFontsManaged.remove(pFont); } - public synchronized void unloadFonts(final Font ...pFonts) { + public synchronized void unloadFont(final BitmapFont pBitmapFont) { + if(pBitmapFont == null) { + throw new IllegalArgumentException("pBitmapFont must not be null!"); + } + this.mBitmapFontsManaged.remove(pBitmapFont); + } + + public synchronized void unloadFonts(final Font ... pFonts) { for(int i = 0; i < pFonts.length; i++) { this.unloadFont(pFonts[i]); } } + public synchronized void unloadFonts(final BitmapFont ... pBitmapFonts) { + for(int i = 0; i < pBitmapFonts.length; i++) { + this.unloadFont(pBitmapFonts[i]); + } + } + public synchronized void updateFonts(final GLState pGLState) { final ArrayList fonts = this.mFontsManaged; final int fontCount = fonts.size(); diff --git a/src/org/andengine/util/HorizontalAlign.java b/src/org/andengine/util/align/HorizontalAlign.java similarity index 97% rename from src/org/andengine/util/HorizontalAlign.java rename to src/org/andengine/util/align/HorizontalAlign.java index 66f0f631a..4155d93ef 100644 --- a/src/org/andengine/util/HorizontalAlign.java +++ b/src/org/andengine/util/align/HorizontalAlign.java @@ -1,4 +1,4 @@ -package org.andengine.util; +package org.andengine.util.align; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/util/VerticalAlign.java b/src/org/andengine/util/align/VerticalAlign.java similarity index 97% rename from src/org/andengine/util/VerticalAlign.java rename to src/org/andengine/util/align/VerticalAlign.java index 526e76fcd..edf491f10 100644 --- a/src/org/andengine/util/VerticalAlign.java +++ b/src/org/andengine/util/align/VerticalAlign.java @@ -1,4 +1,4 @@ -package org.andengine.util; +package org.andengine.util.align; /** * (c) 2010 Nicolas Gramlich From 4aa6535141206744f03baf7eeab8e24c68ce67c9 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 24 Apr 2012 16:05:05 -0700 Subject: [PATCH 015/252] Minor cleanup. --- .../util/level/simple/SimpleLevelLoaderContentHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java index c630e1fa4..61e269adb 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java @@ -25,7 +25,7 @@ public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler pDefaultEntityLoader, HashMap> pEntityLoaders, SimpleLevelEntityLoaderDataSource pEntityLoaderDataSource) { + public SimpleLevelLoaderContentHandler(final IEntityLoader pDefaultEntityLoader, final HashMap> pEntityLoaders, SimpleLevelEntityLoaderDataSource pEntityLoaderDataSource) { super(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderDataSource); } From b34f1bd24dffac8ec8e8ab82092c38d1b37cfcef Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 25 Apr 2012 11:05:35 -0700 Subject: [PATCH 016/252] Changed coordinate system to lower left. Updated Sprite, SpriteBatch, Rectangle, Gradient and Text VBOs to respect the coordinate system change. --- src/org/andengine/engine/camera/Camera.java | 6 +- src/org/andengine/entity/Entity.java | 6 +- ...PerformanceGradientVertexBufferObject.java | 22 +++---- ...erformanceRectangleVertexBufferObject.java | 22 +++---- .../LowMemoryGradientVertexBufferObject.java | 22 +++---- .../LowMemoryRectangleVertexBufferObject.java | 22 +++---- .../entity/sprite/UniformColorSprite.java | 5 ++ ...formanceSpriteBatchVertexBufferObject.java | 24 +++---- ...owMemorySpriteBatchVertexBufferObject.java | 24 +++---- ...rmanceDiamondSpriteVertexBufferObject.java | 54 ++++++++------- ...ghPerformanceSpriteVertexBufferObject.java | 30 ++++----- ...formanceTiledSpriteVertexBufferObject.java | 42 ++++++------ ...anceUncoloredSpriteVertexBufferObject.java | 35 +++++----- ...eUniformColorSpriteVertexBufferObject.java | 30 ++++----- ...MemoryDiamondSpriteVertexBufferObject.java | 54 ++++++++------- .../LowMemorySpriteVertexBufferObject.java | 30 ++++----- ...owMemoryTiledSpriteVertexBufferObject.java | 42 ++++++------ ...moryUncoloredSpriteVertexBufferObject.java | 66 +++++++++---------- ...yUniformColorSpriteVertexBufferObject.java | 32 +++++---- ...HighPerformanceTextVertexBufferObject.java | 20 +++--- .../vbo/LowMemoryTextVertexBufferObject.java | 20 +++--- 21 files changed, 295 insertions(+), 313 deletions(-) diff --git a/src/org/andengine/engine/camera/Camera.java b/src/org/andengine/engine/camera/Camera.java index 482d6c60d..5eab33def 100644 --- a/src/org/andengine/engine/camera/Camera.java +++ b/src/org/andengine/engine/camera/Camera.java @@ -288,7 +288,7 @@ public boolean isEntityVisible(final float pX, final float pY, final float pWidt } public void onApplySceneMatrix(final GLState pGLState) { - pGLState.orthoProjectionGLMatrixf(this.getXMin(), this.getXMax(), this.getYMax(), this.getYMin(), this.mZNear, this.mZFar); + pGLState.orthoProjectionGLMatrixf(this.getXMin(), this.getXMax(), this.getYMin(), this.getYMax(), this.mZNear, this.mZFar); final float rotation = this.mRotation; if(rotation != 0) { @@ -300,7 +300,7 @@ public void onApplySceneBackgroundMatrix(final GLState pGLState) { final float widthRaw = this.getWidthRaw(); final float heightRaw = this.getHeightRaw(); - pGLState.orthoProjectionGLMatrixf(0, widthRaw, heightRaw, 0, this.mZNear, this.mZFar); + pGLState.orthoProjectionGLMatrixf(0, widthRaw, 0, heightRaw, this.mZNear, this.mZFar); final float rotation = this.mRotation; if(rotation != 0) { @@ -311,7 +311,7 @@ public void onApplySceneBackgroundMatrix(final GLState pGLState) { public void onApplyCameraSceneMatrix(final GLState pGLState) { final float widthRaw = this.getWidthRaw(); final float heightRaw = this.getHeightRaw(); - pGLState.orthoProjectionGLMatrixf(0, widthRaw, heightRaw, 0, this.mZNear, this.mZFar); + pGLState.orthoProjectionGLMatrixf(0, widthRaw, 0, heightRaw, this.mZNear, this.mZFar); final float cameraSceneRotation = this.mCameraSceneRotation; if(cameraSceneRotation != 0) { diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index d3dd02311..acc3391a7 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1064,7 +1064,7 @@ public Transformation getLocalToParentTransformation() { final float rotationCenterY = this.mLocalRotationCenterY; localToParentTransformation.postTranslate(-rotationCenterX, -rotationCenterY); - localToParentTransformation.postRotate(rotation); + localToParentTransformation.postRotate(-rotation); localToParentTransformation.postTranslate(rotationCenterX, rotationCenterY); } @@ -1102,7 +1102,7 @@ public Transformation getParentToLocalTransformation() { final float localRotationCenterY = this.mLocalRotationCenterY; parentToLocalTransformation.postTranslate(-localRotationCenterX, -localRotationCenterY); - parentToLocalTransformation.postRotate(-rotation); + parentToLocalTransformation.postRotate(rotation); parentToLocalTransformation.postTranslate(localRotationCenterX, localRotationCenterY); } @@ -1440,7 +1440,7 @@ protected void applyRotation(final GLState pGLState) { final float localRotationCenterY = this.mLocalRotationCenterY; pGLState.translateModelViewGLMatrixf(localRotationCenterX, localRotationCenterY, 0); - pGLState.rotateModelViewGLMatrixf(rotation, 0, 0, 1); + pGLState.rotateModelViewGLMatrixf(-rotation, 0, 0, 1); pGLState.translateModelViewGLMatrixf(-localRotationCenterX, -localRotationCenterY, 0); /* TODO There is a special, but very likely case when mRotationCenter and mScaleCenter are the same. diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java index 8b89c65e4..cc788fd73 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java @@ -101,22 +101,20 @@ public void onUpdateColor(final Gradient pGradient) { public void onUpdateVertices(final Gradient pGradient) { final float[] bufferData = this.mBufferData; - final float x = 0; - final float y = 0; - final float x2 = pGradient.getWidth(); // TODO Optimize with field access? - final float y2 = pGradient.getHeight(); // TODO Optimize with field access? + final float width = pGradient.getWidth(); // TODO Optimize with field access? + final float height = pGradient.getHeight(); // TODO Optimize with field access? - bufferData[(0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x; - bufferData[(0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y; + bufferData[(0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = 0; + bufferData[(0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = 0; - bufferData[(1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x; - bufferData[(1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y2; + bufferData[(1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = 0; + bufferData[(1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = height; - bufferData[(2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x2; - bufferData[(2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y; + bufferData[(2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = width; + bufferData[(2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = 0; - bufferData[(3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = x2; - bufferData[(3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = y2; + bufferData[(3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X] = width; + bufferData[(3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y] = height; this.setDirtyOnHardware(); } diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java index e28b54dc1..8b6fdda60 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java @@ -55,22 +55,20 @@ public void onUpdateColor(final Rectangle pRectangle) { public void onUpdateVertices(final Rectangle pRectangle) { final float[] bufferData = this.mBufferData; - final float x = 0; - final float y = 0; - final float x2 = pRectangle.getWidth(); // TODO Optimize with field access? - final float y2 = pRectangle.getHeight(); // TODO Optimize with field access? + final float width = pRectangle.getWidth(); // TODO Optimize with field access? + final float height = pRectangle.getHeight(); // TODO Optimize with field access? - bufferData[(0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x; - bufferData[(0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y; + bufferData[(0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = 0; + bufferData[(0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = 0; - bufferData[(1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x; - bufferData[(1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y2; + bufferData[(1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = 0; + bufferData[(1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = height; - bufferData[(2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x2; - bufferData[(2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y; + bufferData[(2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = width; + bufferData[(2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = 0; - bufferData[(3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = x2; - bufferData[(3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = y2; + bufferData[(3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X] = width; + bufferData[(3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y] = height; this.setDirtyOnHardware(); } diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java index 446f117ed..178fc41f0 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java @@ -103,22 +103,20 @@ public void onUpdateColor(final Gradient pGradient) { public void onUpdateVertices(final Gradient pGradient) { final FloatBuffer bufferData = this.mFloatBuffer; - final float x = 0; - final float y = 0; - final float x2 = pGradient.getWidth(); - final float y2 = pGradient.getHeight(); + final float width = pGradient.getWidth(); // TODO Optimize with field access? + final float height = pGradient.getHeight(); // TODO Optimize with field access? - bufferData.put((0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x); - bufferData.put((0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y); + bufferData.put((0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, 0); + bufferData.put((0 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, 0); - bufferData.put((1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x); - bufferData.put((1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y2); + bufferData.put((1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, 0); + bufferData.put((1 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, height); - bufferData.put((2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x2); - bufferData.put((2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y); + bufferData.put((2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, width); + bufferData.put((2 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, 0); - bufferData.put((3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, x2); - bufferData.put((3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, y2); + bufferData.put((3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_X, width); + bufferData.put((3 * Gradient.VERTEX_SIZE) + Gradient.VERTEX_INDEX_Y, height); this.setDirtyOnHardware(); } diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java index b8f0314d7..04ca9b85e 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java @@ -57,22 +57,20 @@ public void onUpdateColor(final Rectangle pRectangle) { public void onUpdateVertices(final Rectangle pRectangle) { final FloatBuffer bufferData = this.mFloatBuffer; - final float x = 0; - final float y = 0; - final float x2 = pRectangle.getWidth(); - final float y2 = pRectangle.getHeight(); + final float width = pRectangle.getWidth(); // TODO Optimize with field access? + final float height = pRectangle.getHeight(); // TODO Optimize with field access? - bufferData.put((0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x); - bufferData.put((0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y); + bufferData.put((0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, 0); + bufferData.put((0 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, 0); - bufferData.put((1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x); - bufferData.put((1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y2); + bufferData.put((1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, 0); + bufferData.put((1 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, height); - bufferData.put((2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x2); - bufferData.put((2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y); + bufferData.put((2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, width); + bufferData.put((2 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, 0); - bufferData.put((3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, x2); - bufferData.put((3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, y2); + bufferData.put((3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_X, width); + bufferData.put((3 * Rectangle.VERTEX_SIZE) + Rectangle.VERTEX_INDEX_Y, height); this.setDirtyOnHardware(); } diff --git a/src/org/andengine/entity/sprite/UniformColorSprite.java b/src/org/andengine/entity/sprite/UniformColorSprite.java index a37e4013c..caa7eb99f 100644 --- a/src/org/andengine/entity/sprite/UniformColorSprite.java +++ b/src/org/andengine/entity/sprite/UniformColorSprite.java @@ -105,6 +105,11 @@ public UniformColorSprite(final float pX, final float pY, final float pWidth, fi // Methods for/from SuperClass/Interfaces // =========================================================== + @Override + protected void onUpdateColor() { + /* Nothing. */ + } + @Override protected void preDraw(final GLState pGLState, final Camera pCamera) { super.preDraw(pGLState, pCamera); diff --git a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java index 037f0f799..d2adb63a7 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java @@ -114,37 +114,37 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x3; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y3; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x3; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y3; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x4; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y4; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; } this.mBufferDataOffset += SpriteBatch.SPRITE_SIZE; @@ -211,37 +211,37 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; } this.mBufferDataOffset += SpriteBatch.SPRITE_SIZE; diff --git a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java index b9e00ae7f..093844c22 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java @@ -116,37 +116,37 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x3); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y3); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x3); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y3); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x4); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y4); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); } this.mBufferDataOffset += SpriteBatch.SPRITE_SIZE; @@ -213,37 +213,37 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); } this.mBufferDataOffset += SpriteBatch.SPRITE_SIZE; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java index 943817973..c919e9c54 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java @@ -41,25 +41,23 @@ public HighPerformanceDiamondSpriteVertexBufferObject(final VertexBufferObjectMa public void onUpdateVertices(final Sprite pSprite) { final float[] bufferData = this.mBufferData; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - final float xCenter = (x + x2) * 0.5f; - final float yCenter = (y + y2) * 0.5f; + final float halfWidth = width * 0.5f; + final float halfHeight = height * 0.5f; - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x; - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = yCenter; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = halfWidth; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = 0; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = xCenter; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y2; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = 0; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = halfHeight; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = xCenter; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = width; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = halfHeight; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x2; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = yCenter; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = halfWidth; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = height; this.setDirtyOnHardware(); } @@ -105,29 +103,29 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float vCenter = (v + v2) * 0.5f; if(textureRegion.isRotated()) { - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; - - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; - - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; - - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; - } else { bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; + } else { + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; + + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; + + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; + + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java index 2e0ba3dde..1b597de48 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java @@ -56,22 +56,20 @@ public void onUpdateColor(final Sprite pSprite) { public void onUpdateVertices(final Sprite pSprite) { final float[] bufferData = this.mBufferData; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x; - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = 0; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = 0; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y2; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = 0; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = height; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x2; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = width; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = 0; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x2; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y2; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = width; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = height; this.setDirtyOnHardware(); } @@ -127,16 +125,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java index 6a536496c..0cfacee56 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java @@ -65,31 +65,29 @@ public void onUpdateColor(final TiledSprite pTiledSprite) { public void onUpdateVertices(final TiledSprite pTiledSprite) { final float[] bufferData = this.mBufferData; - final float x = 0; - final float y = 0; - final float x2 = pTiledSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pTiledSprite.getHeight(); // TODO Optimize with field access? + final float width = pTiledSprite.getWidth(); // TODO Optimize with field access? + final float height = pTiledSprite.getHeight(); // TODO Optimize with field access? final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; for(int i = 0; i < tileCount; i++) { - bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x; - bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y; + bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = 0; + bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = 0; - bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x; - bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = 0; + bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = height; - bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y; + bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = width; + bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = 0; - bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y; + bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = width; + bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = 0; - bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x; - bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = 0; + bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = height; - bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = width; + bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = height; bufferDataOffset += TiledSprite.TILEDSPRITE_SIZE; } @@ -159,22 +157,22 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; } bufferDataOffset += TiledSprite.TILEDSPRITE_SIZE; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java index bab9b28a0..6ff14af05 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java @@ -38,26 +38,29 @@ public HighPerformanceUncoloredSpriteVertexBufferObject(final VertexBufferObject // Methods for/from SuperClass/Interfaces // =========================================================== + @Override + public void onUpdateColor(final Sprite pSprite) { + /* Nothing. */ + } + @Override public void onUpdateVertices(final Sprite pSprite) { final float[] bufferData = this.mBufferData; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = x; - bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = y; + bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = 0; + bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = 0; - bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = x; - bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = y2; + bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = 0; + bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = height; - bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = x2; - bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = y; + bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = width; + bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = 0; - bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = x2; - bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = y2; + bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X] = width; + bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y] = height; this.setDirtyOnHardware(); } @@ -113,16 +116,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v; bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v; } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java index 9ade337b7..c4179d16d 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java @@ -48,22 +48,20 @@ public void onUpdateColor(final Sprite pSprite) { public void onUpdateVertices(final Sprite pSprite) { final float[] bufferData = this.mBufferData; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = x; - bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = y; + bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = 0; + bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = 0; - bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = x; - bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = y2; + bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = 0; + bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = height; - bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = x2; - bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = y; + bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = width; + bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = 0; - bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = x2; - bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = y2; + bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X] = width; + bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y] = height; this.setDirtyOnHardware(); } @@ -119,16 +117,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v; bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u2; - bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v; } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java index bf9af4997..2333c0ee9 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java @@ -43,25 +43,23 @@ public LowMemoryDiamondSpriteVertexBufferObject(final VertexBufferObjectManager public void onUpdateVertices(final Sprite pSprite) { final FloatBuffer bufferData = this.mFloatBuffer; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - final float xCenter = (x + x2) * 0.5f; - final float yCenter = (y + y2) * 0.5f; + final float halfWidth = width * 0.5f; + final float halfHeight = height * 0.5f; - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, yCenter); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, halfWidth); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, 0); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, xCenter); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y2); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, 0); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, halfHeight); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, xCenter); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, width); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, halfHeight); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, yCenter); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, halfWidth); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, height); this.setDirtyOnHardware(); } @@ -107,29 +105,29 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float vCenter = (v + v2) * 0.5f; if(textureRegion.isRotated()) { - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); - - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); - - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); - - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); - } else { bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); + } else { + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); + + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); + + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java index 5d1574b6b..ca655bb01 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java @@ -58,22 +58,20 @@ public void onUpdateColor(final Sprite pSprite) { public void onUpdateVertices(final Sprite pSprite) { final FloatBuffer bufferData = this.mFloatBuffer; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, 0); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, 0); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y2); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, 0); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, height); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x2); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, width); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, 0); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y2); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, width); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, height); this.setDirtyOnHardware(); } @@ -129,16 +127,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java index 28f91e4b5..d5fa16379 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java @@ -67,31 +67,29 @@ public void onUpdateColor(final TiledSprite pTiledSprite) { public void onUpdateVertices(final TiledSprite pTiledSprite) { final FloatBuffer bufferData = this.mFloatBuffer; - final float x = 0; - final float y = 0; - final float x2 = pTiledSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pTiledSprite.getHeight(); // TODO Optimize with field access? + final float width = pTiledSprite.getWidth(); // TODO Optimize with field access? + final float height = pTiledSprite.getHeight(); // TODO Optimize with field access? final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; for(int i = 0; i < tileCount; i++) { - bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x); - bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y); + bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, 0); + bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, 0); - bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x); - bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, 0); + bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, height); - bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y); + bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, width); + bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, 0); - bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y); + bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, width); + bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, 0); - bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x); - bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, 0); + bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, height); - bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, width); + bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, height); bufferDataOffset += TiledSprite.TILEDSPRITE_SIZE; } @@ -161,22 +159,22 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); } bufferDataOffset += TiledSprite.TILEDSPRITE_SIZE; diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java index 16b80499e..6edd08698 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java @@ -3,6 +3,7 @@ import java.nio.FloatBuffer; import org.andengine.entity.sprite.Sprite; +import org.andengine.entity.sprite.UncoloredSprite; import org.andengine.opengl.texture.region.ITextureRegion; import org.andengine.opengl.vbo.DrawType; import org.andengine.opengl.vbo.VertexBufferObjectManager; @@ -39,29 +40,29 @@ public LowMemoryUncoloredSpriteVertexBufferObject(final VertexBufferObjectManage // Methods for/from SuperClass/Interfaces // =========================================================== + @Override + public void onUpdateColor(final Sprite pSprite) { + /* Nothing. */ + } + @Override public void onUpdateVertices(final Sprite pSprite) { final FloatBuffer bufferData = this.mFloatBuffer; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - final float xCenter = (x + x2) * 0.5f; - final float yCenter = (y + y2) * 0.5f; + bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X, 0); + bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y, 0); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, yCenter); + bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X, 0); + bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y, height); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, xCenter); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y2); + bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X, width); + bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y, 0); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, xCenter); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, y); - - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, x2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, yCenter); + bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_X, width); + bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.VERTEX_INDEX_Y, height); this.setDirtyOnHardware(); } @@ -103,33 +104,30 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } } - final float uCenter = (u + u2) * 0.5f; - final float vCenter = (v + v2) * 0.5f; - if(textureRegion.isRotated()) { - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); + bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); + bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v2); } else { - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); + bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); + bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v); } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java index b12ec7718..00c577a73 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java @@ -50,22 +50,20 @@ public void onUpdateColor(final Sprite pSprite) { public void onUpdateVertices(final Sprite pSprite) { final FloatBuffer bufferData = this.mFloatBuffer; - final float x = 0; - final float y = 0; - final float x2 = pSprite.getWidth(); // TODO Optimize with field access? - final float y2 = pSprite.getHeight(); // TODO Optimize with field access? + final float width = pSprite.getWidth(); // TODO Optimize with field access? + final float height = pSprite.getHeight(); // TODO Optimize with field access? - bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, x); - bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, y); + bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, 0); + bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, 0); - bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, x); - bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, y2); + bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, 0); + bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, height); - bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, x2); - bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, y); + bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, width); + bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, 0); - bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, x2); - bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, y2); + bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_X, width); + bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.VERTEX_INDEX_Y, height); this.setDirtyOnHardware(); } @@ -121,16 +119,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u2); - bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v); } this.setDirtyOnHardware(); diff --git a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java index 03c276ee4..97601d26e 100644 --- a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java @@ -121,31 +121,31 @@ public void onUpdateVertices(final Text pText) { bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x; bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v; + bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x; bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u; - bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v2; + bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v2; - bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; - bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x; + bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x; - bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; - bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x2; + bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v; bufferDataOffset += Text.LETTER_SIZE; diff --git a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java index 648c8a0bb..386ea059a 100644 --- a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java @@ -123,31 +123,31 @@ public void onUpdateVertices(final Text pText) { bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x); bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v); + bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x); bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u); - bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v2); + bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); - bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x); + bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x); - bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); - bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x2); + bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v); bufferDataOffset += Text.LETTER_SIZE; From 0283176176033e76b2c15f1a5cdbb5d8d76a22d7 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 25 Apr 2012 11:05:57 -0700 Subject: [PATCH 017/252] Better exception in Direction.fromDelta(...). --- src/org/andengine/util/algorithm/path/Direction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/algorithm/path/Direction.java b/src/org/andengine/util/algorithm/path/Direction.java index 7510eab6a..488fb153f 100644 --- a/src/org/andengine/util/algorithm/path/Direction.java +++ b/src/org/andengine/util/algorithm/path/Direction.java @@ -72,7 +72,7 @@ public static Direction fromDelta(final int pDeltaX, final int pDeltaY) { } break; } - throw new IllegalArgumentException(); + throw new IllegalArgumentException("Unexpected deltaX: '" + pDeltaX + "' deltaY: '" + pDeltaY + "'."); } // =========================================================== From a5c307fb0864d6bbcd0366c105a761e235879325 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 25 Apr 2012 12:40:40 -0700 Subject: [PATCH 018/252] Fixed letter placement and line offset in Text VBOs. --- ...HighPerformanceTextVertexBufferObject.java | 25 +++++++------- .../vbo/LowMemoryTextVertexBufferObject.java | 33 ++++++++++--------- src/org/andengine/opengl/font/BitmapFont.java | 5 +++ src/org/andengine/opengl/font/Font.java | 4 +-- src/org/andengine/opengl/font/IFont.java | 1 + 5 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java index 97601d26e..719c59af3 100644 --- a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java @@ -10,6 +10,7 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.util.adt.list.IFloatList; +import org.andengine.util.align.HorizontalAlign; /** * (c) Zynga 2012 @@ -68,11 +69,13 @@ public void onUpdateColor(final Text pText) { public void onUpdateVertices(final Text pText) { final float[] bufferData = this.mBufferData; - // TODO Optimize with field access? final IFont font = pText.getFont(); + final HorizontalAlign horizontalAlign = pText.getHorizontalAlign(); final ArrayList lines = pText.getLines(); final float lineHeight = font.getLineHeight(); final IFloatList lineWidths = pText.getLineWidths(); + final float leading = pText.getLeading(); + final float ascent = font.getAscent(); final float lineAlignmentWidth = pText.getLineAlignmentWidth(); @@ -84,7 +87,7 @@ public void onUpdateVertices(final Text pText) { final CharSequence line = lines.get(row); float xBase; - switch(pText.getHorizontalAlign()) { + switch(horizontalAlign) { case RIGHT: xBase = lineAlignmentWidth - lineWidths.get(row); break; @@ -96,7 +99,7 @@ public void onUpdateVertices(final Text pText) { xBase = 0; } - final float yBase = row * (lineHeight + pText.getLeading()); + final float yBase = (lineCount - row) * lineHeight + ((lineCount - row - 1) * leading) + ascent; final int lineLength = line.length(); Letter previousLetter = null; @@ -108,10 +111,10 @@ public void onUpdateVertices(final Text pText) { if(!letter.isWhitespace()) { final float x = xBase + letter.mOffsetX; - final float y = yBase + letter.mOffsetY; + final float y = yBase - letter.mOffsetY; - final float y2 = y + letter.mHeight; final float x2 = x + letter.mWidth; + final float y2 = y - letter.mHeight; final float u = letter.mU; final float v = letter.mV; @@ -119,32 +122,32 @@ public void onUpdateVertices(final Text pText) { final float v2 = letter.mV2; bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x; - bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; + bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x; - bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; + bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; + bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x; - bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X] = x2; - bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y2; + bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y] = y; bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V] = v; diff --git a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java index 386ea059a..2238ef96f 100644 --- a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java @@ -11,6 +11,7 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.util.adt.list.IFloatList; +import org.andengine.util.align.HorizontalAlign; /** * (c) Zynga 2012 @@ -69,11 +70,13 @@ public void onUpdateColor(final Text pText) { public void onUpdateVertices(final Text pText) { final FloatBuffer bufferData = this.mFloatBuffer; - // TODO Optimize with field access? final IFont font = pText.getFont(); + final HorizontalAlign horizontalAlign = pText.getHorizontalAlign(); final ArrayList lines = pText.getLines(); final float lineHeight = font.getLineHeight(); final IFloatList lineWidths = pText.getLineWidths(); + final float leading = pText.getLeading(); + final float ascent = font.getAscent(); final float lineAlignmentWidth = pText.getLineAlignmentWidth(); @@ -81,24 +84,24 @@ public void onUpdateVertices(final Text pText) { int bufferDataOffset = 0; final int lineCount = lines.size(); - for (int i = 0; i < lineCount; i++) { - final CharSequence line = lines.get(i); + for (int row = 0; row < lineCount; row++) { + final CharSequence line = lines.get(row); float xBase; - switch(pText.getHorizontalAlign()) { + switch(horizontalAlign) { case RIGHT: - xBase = lineAlignmentWidth - lineWidths.get(i); + xBase = lineAlignmentWidth - lineWidths.get(row); break; case CENTER: - xBase = (lineAlignmentWidth - lineWidths.get(i)) * 0.5f; + xBase = (lineAlignmentWidth - lineWidths.get(row)) * 0.5f; break; case LEFT: default: xBase = 0; } - final float yBase = i * (lineHeight + pText.getLeading()); + final float yBase = (lineCount - row) * lineHeight + ((lineCount - row - 1) * leading) + ascent; final int lineLength = line.length(); Letter previousLetter = null; @@ -110,10 +113,10 @@ public void onUpdateVertices(final Text pText) { if(!letter.isWhitespace()) { final float x = xBase + letter.mOffsetX; - final float y = yBase + letter.mOffsetY; + final float y = yBase - letter.mOffsetY; - final float y2 = y + letter.mHeight; final float x2 = x + letter.mWidth; + final float y2 = y - letter.mHeight; final float u = letter.mU; final float v = letter.mV; @@ -121,32 +124,32 @@ public void onUpdateVertices(final Text pText) { final float v2 = letter.mV2; bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x); - bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); + bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x); - bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); + bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); + bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 3 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x); - bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 4 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_X, x2); - bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y2); + bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.VERTEX_INDEX_Y, y); bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 5 * Text.VERTEX_SIZE + Text.TEXTURECOORDINATES_INDEX_V, v); diff --git a/src/org/andengine/opengl/font/BitmapFont.java b/src/org/andengine/opengl/font/BitmapFont.java index 027804b7f..b67e83a67 100644 --- a/src/org/andengine/opengl/font/BitmapFont.java +++ b/src/org/andengine/opengl/font/BitmapFont.java @@ -346,6 +346,11 @@ public void unload() { this.unloadTextures(); } + @Override + public float getAscent() { + return 0; + } + @Override public float getLineHeight() { return this.mLineHeight; diff --git a/src/org/andengine/opengl/font/Font.java b/src/org/andengine/opengl/font/Font.java index 14d788fc9..d5c4c4759 100644 --- a/src/org/andengine/opengl/font/Font.java +++ b/src/org/andengine/opengl/font/Font.java @@ -185,7 +185,7 @@ protected Bitmap getLetterBitmap(final Letter pLetter) throws FontException { /* Actually draw the character. */ final float drawLetterLeft = -pLetter.mOffsetX; - final float drawLetterTop = -(pLetter.mOffsetY + this.getAscent()); + final float drawLetterTop = -pLetter.mOffsetY; this.drawLetter(characterAsString, drawLetterLeft, drawLetterTop); @@ -241,7 +241,7 @@ private Letter createLetter(final char pCharacter) throws FontException { final float u2 = (this.mCurrentTextureX + letterWidth) / textureWidth; final float v2 = (this.mCurrentTextureY + letterHeight) / textureHeight; - letter = new Letter(pCharacter, this.mCurrentTextureX - Font.LETTER_TEXTURE_PADDING, this.mCurrentTextureY - Font.LETTER_TEXTURE_PADDING, letterWidth, letterHeight, letterLeft, letterTop - this.getAscent(), advance, u, v, u2, v2); + letter = new Letter(pCharacter, this.mCurrentTextureX - Font.LETTER_TEXTURE_PADDING, this.mCurrentTextureY - Font.LETTER_TEXTURE_PADDING, letterWidth, letterHeight, letterLeft, letterTop, advance, u, v, u2, v2); this.mCurrentTextureX += letterWidth + Font.LETTER_TEXTURE_PADDING; } diff --git a/src/org/andengine/opengl/font/IFont.java b/src/org/andengine/opengl/font/IFont.java index 99ff72d96..946238e4f 100644 --- a/src/org/andengine/opengl/font/IFont.java +++ b/src/org/andengine/opengl/font/IFont.java @@ -23,6 +23,7 @@ public interface IFont { public ITexture getTexture(); + public float getAscent(); public float getLineHeight(); public Letter getLetter(final char pChar) throws LetterNotFoundException; From 4c7c9fe8839815339016572531223f7203eafc71 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 25 Apr 2012 12:45:07 -0700 Subject: [PATCH 019/252] Minor change. --- .../entity/text/vbo/LowMemoryTextVertexBufferObject.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java index 2238ef96f..5b1ebe73d 100644 --- a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java @@ -105,8 +105,8 @@ public void onUpdateVertices(final Text pText) { final int lineLength = line.length(); Letter previousLetter = null; - for(int j = 0; j < lineLength; j++) { - final Letter letter = font.getLetter(line.charAt(j)); + for(int i = 0; i < lineLength; i++) { + final Letter letter = font.getLetter(line.charAt(i)); if(previousLetter != null) { xBase += previousLetter.getKerning(letter.mCharacter); } From b83195ba53e543b7357f4cdeae4bfe045f46738f Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 25 Apr 2012 17:52:06 -0700 Subject: [PATCH 020/252] Minor changes in Exception thrown by Entity.assertEntityHasNoParent(). --- src/org/andengine/entity/Entity.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index acc3391a7..225a2d487 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1625,10 +1625,10 @@ public void resetSkewCenter() { private void assertEntityHasNoParent(final IEntity pEntity) throws IllegalStateException { if(pEntity.hasParent()) { - final String entityName = pEntity.getClass().getSimpleName(); - final String currentParentName = pEntity.getParent().getClass().getSimpleName(); - final String newParentName = this.getClass().getSimpleName(); - throw new IllegalStateException("pEntity '" + entityName +"' already has a parent '" + currentParentName + ". New parent: '" + newParentName + "'!"); + final String entityClassName = pEntity.getClass().getSimpleName(); + final String currentParentClassName = pEntity.getParent().getClass().getSimpleName(); + final String newParentClassName = this.getClass().getSimpleName(); + throw new IllegalStateException("pEntity '" + entityClassName +"' already has a parent: '" + currentParentClassName + "'. New parent: '" + newParentClassName + "'!"); } } From 2dcb38480f000ce1d31144634d82069393c17a9c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 25 Apr 2012 17:52:51 -0700 Subject: [PATCH 021/252] Added NineSliceSprite. --- .../entity/sprite/NineSliceSprite.java | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 src/org/andengine/entity/sprite/NineSliceSprite.java diff --git a/src/org/andengine/entity/sprite/NineSliceSprite.java b/src/org/andengine/entity/sprite/NineSliceSprite.java new file mode 100644 index 000000000..efc96a4e5 --- /dev/null +++ b/src/org/andengine/entity/sprite/NineSliceSprite.java @@ -0,0 +1,205 @@ +package org.andengine.entity.sprite; + +import org.andengine.entity.Entity; +import org.andengine.entity.sprite.batch.SpriteBatch; +import org.andengine.opengl.shader.PositionColorTextureCoordinatesShaderProgram; +import org.andengine.opengl.shader.ShaderProgram; +import org.andengine.opengl.texture.ITexture; +import org.andengine.opengl.texture.region.ITextureRegion; +import org.andengine.opengl.texture.region.TextureRegion; +import org.andengine.opengl.vbo.VertexBufferObjectManager; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 16:50:42 - 25.04.2012 + */ +public class NineSliceSprite extends Entity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final ITextureRegion mTextureRegion; + + protected final ITextureRegion mTopLeftTextureRegion; + protected final ITextureRegion mTopCenterTextureRegion; + protected final ITextureRegion mTopRightTextureRegion; + protected final ITextureRegion mCenterLeftTextureRegion; + protected final ITextureRegion mCenterTextureRegion; + protected final ITextureRegion mCenterRightTextureRegion; + protected final ITextureRegion mBottomLeftTextureRegion; + protected final ITextureRegion mBottomCenterTextureRegion; + protected final ITextureRegion mBottomRightTextureRegion; + + protected final SpriteBatch mSpriteBatch; + + protected float mInsetLeft; + protected float mInsetTop; + protected float mInsetRight; + protected float mInsetBottom; + + // =========================================================== + // Constructors + // =========================================================== + + public NineSliceSprite(final float pX, final float pY, final ITextureRegion pTextureRegion, final float pInsetLeft, final float pInsetTop, final float pInsetRight, final float pInsetBottom, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(pX, pY, pTextureRegion, pInsetLeft, pInsetTop, pInsetRight, pInsetBottom, pVertexBufferObjectManager, PositionColorTextureCoordinatesShaderProgram.getInstance()); + } + + public NineSliceSprite(final float pX, final float pY, final ITextureRegion pTextureRegion, final float pInsetLeft, final float pInsetTop, final float pInsetRight, final float pInsetBottom, final VertexBufferObjectManager pVertexBufferObjectManager, final ShaderProgram pShaderProgram) { + this(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight(), pTextureRegion, pInsetLeft, pInsetTop, pInsetRight, pInsetBottom, pVertexBufferObjectManager, pShaderProgram); + } + + public NineSliceSprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final float pInsetLeft, final float pInsetTop, final float pInsetRight, final float pInsetBottom, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(pX, pY, pWidth, pHeight, pTextureRegion, pInsetLeft, pInsetTop, pInsetRight, pInsetBottom, pVertexBufferObjectManager, PositionColorTextureCoordinatesShaderProgram.getInstance()); + } + + public NineSliceSprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final float pInsetLeft, final float pInsetTop, final float pInsetRight, final float pInsetBottom, final VertexBufferObjectManager pVertexBufferObjectManager, final ShaderProgram pShaderProgram) { + super(pX, pY); + + this.mTextureRegion = pTextureRegion; + this.mInsetLeft = pInsetLeft; + this.mInsetTop = pInsetTop; + this.mInsetRight = pInsetRight; + this.mInsetBottom = pInsetBottom; + + final ITexture texture = pTextureRegion.getTexture(); + this.mSpriteBatch = new SpriteBatch(texture, 9, pVertexBufferObjectManager, pShaderProgram); + + this.mTopLeftTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mTopCenterTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mTopRightTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mCenterLeftTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mCenterTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mCenterRightTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mBottomLeftTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mBottomCenterTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + this.mBottomRightTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); + + this.updateTextureRegions(); + this.setSize(pWidth, pHeight); + + this.attachChild(this.mSpriteBatch); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void setWidth(final float pWidth) { + super.setWidth(pWidth); + + this.updateVertices(); + } + + @Override + public void setHeight(final float pHeight) { + super.setHeight(pHeight); + + this.updateVertices(); + } + + @Override + public void setSize(final float pWidth, final float pHeight) { + super.setSize(pWidth, pHeight); + + this.updateVertices(); + } + + @Override + protected void onUpdateColor() { + this.updateVertices(); + } + + @Override + public void dispose() { + super.dispose(); + + this.mSpriteBatch.dispose(); + } + + // =========================================================== + // Methods + // =========================================================== + + private void updateTextureRegions() { + final float baseX = this.mTextureRegion.getTextureX(); + final float baseY = this.mTextureRegion.getTextureY(); + final float baseWidth = this.mTextureRegion.getWidth(); + final float baseHeight = this.mTextureRegion.getHeight(); + + final float centerWidth = baseWidth - this.mInsetLeft - this.mInsetRight; + final float centerHeight = baseWidth - this.mInsetTop- this.mInsetBottom; + + /* Cache some variables. */ + final float leftX = baseX; + final float centerX = baseX + this.mInsetLeft; + final float rightX = (baseX + baseWidth) - this.mInsetRight; + + /* Top. */ + final float topY = baseY; + this.mTopLeftTextureRegion.set(leftX, topY, this.mInsetLeft, this.mInsetTop); + this.mTopCenterTextureRegion.set(centerX, topY, centerWidth, this.mInsetTop); + this.mTopRightTextureRegion.set(rightX, topY, this.mInsetRight, this.mInsetTop); + + /* Center. */ + final float centerY = baseY + this.mInsetTop; + this.mCenterLeftTextureRegion.set(leftX, centerY, this.mInsetLeft, centerHeight); + this.mCenterTextureRegion.set(centerX, centerY, centerWidth, centerHeight); + this.mCenterRightTextureRegion.set(rightX, centerY, this.mInsetRight, centerHeight); + + /* Bottom. */ + final float bottomY = (baseY + baseHeight) - this.mInsetBottom; + this.mBottomLeftTextureRegion.set(leftX, bottomY, this.mInsetLeft, this.mInsetBottom); + this.mBottomCenterTextureRegion.set(centerX, bottomY, centerWidth, this.mInsetBottom); + this.mBottomRightTextureRegion.set(rightX, bottomY, this.mInsetRight, this.mInsetBottom); + } + + private void updateVertices() { + this.mSpriteBatch.reset(); + + final float color = this.mColor.getABGRPackedFloat(); + + final float centerWidth = this.mWidth - this.mInsetLeft - this.mInsetRight; + final float centerHeight = this.mHeight - this.mInsetTop- this.mInsetBottom; + + /* Cache some variables. */ + final float leftX = 0; + final float centerX = this.mInsetLeft; + final float rightX = this.mWidth - this.mInsetRight; + + /* Top. */ + final float topY = this.mHeight - this.mInsetTop; + this.mSpriteBatch.draw(this.mTopLeftTextureRegion, leftX, topY, this.mInsetLeft, this.mInsetTop, color); + this.mSpriteBatch.draw(this.mTopCenterTextureRegion, centerX, topY, centerWidth, this.mInsetTop, color); + this.mSpriteBatch.draw(this.mTopRightTextureRegion, rightX, topY, this.mInsetRight, this.mInsetTop, color); + + /* Center. */ + final float centerY = this.mInsetBottom; + this.mSpriteBatch.draw(this.mCenterLeftTextureRegion, leftX, centerY, this.mInsetLeft, centerHeight, color); + this.mSpriteBatch.draw(this.mCenterTextureRegion, centerX, centerY, centerWidth, centerHeight, color); + this.mSpriteBatch.draw(this.mCenterRightTextureRegion, rightX, centerY, this.mInsetRight, centerHeight, color); + + /* Bottom. */ + final float bottomY = 0; + this.mSpriteBatch.draw(this.mBottomLeftTextureRegion, leftX, bottomY, this.mInsetLeft, this.mInsetBottom, color); + this.mSpriteBatch.draw(this.mBottomCenterTextureRegion, centerX, bottomY, centerWidth, this.mInsetBottom, color); + this.mSpriteBatch.draw(this.mBottomRightTextureRegion, rightX, bottomY, this.mInsetRight, this.mInsetBottom, color); + + this.mSpriteBatch.submit(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 508ae911d96824438709eb8300eb8956310683d5 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 25 Apr 2012 18:54:33 -0700 Subject: [PATCH 022/252] Added possibility to change insets of NineSliceSprite. --- .../entity/sprite/NineSliceSprite.java | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/entity/sprite/NineSliceSprite.java b/src/org/andengine/entity/sprite/NineSliceSprite.java index efc96a4e5..cdb85eeaf 100644 --- a/src/org/andengine/entity/sprite/NineSliceSprite.java +++ b/src/org/andengine/entity/sprite/NineSliceSprite.java @@ -60,7 +60,7 @@ public NineSliceSprite(final float pX, final float pY, final float pWidth, final } public NineSliceSprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final float pInsetLeft, final float pInsetTop, final float pInsetRight, final float pInsetBottom, final VertexBufferObjectManager pVertexBufferObjectManager, final ShaderProgram pShaderProgram) { - super(pX, pY); + super(pX, pY, pWidth, pHeight); this.mTextureRegion = pTextureRegion; this.mInsetLeft = pInsetLeft; @@ -82,7 +82,7 @@ public NineSliceSprite(final float pX, final float pY, final float pWidth, final this.mBottomRightTextureRegion = new TextureRegion(texture, 0, 0, 0, 0); this.updateTextureRegions(); - this.setSize(pWidth, pHeight); + this.updateVertices(); this.attachChild(this.mSpriteBatch); } @@ -91,6 +91,60 @@ public NineSliceSprite(final float pX, final float pY, final float pWidth, final // Getter & Setter // =========================================================== + public float getInsetLeft() { + return this.mInsetLeft; + } + + public void setInsetLeft(final float pInsetLeft) { + this.mInsetLeft = pInsetLeft; + + this.updateTextureRegions(); + this.updateVertices(); + } + + public float getInsetTop() { + return this.mInsetTop; + } + + public void setInsetTop(final float pInsetTop) { + this.mInsetTop = pInsetTop; + + this.updateTextureRegions(); + this.updateVertices(); + } + + public float getInsetRight() { + return this.mInsetRight; + } + + public void setInsetRight(final float pInsetRight) { + this.mInsetRight = pInsetRight; + + this.updateTextureRegions(); + this.updateVertices(); + } + + public float getInsetBottom() { + return this.mInsetBottom; + } + + public void setInsetBottom(final float pInsetBottom) { + this.mInsetBottom = pInsetBottom; + + this.updateTextureRegions(); + this.updateVertices(); + } + + public void setInsets(final float pInsetLeft, final float pInsetTop, final float pInsetRight, final float pInsetBottom) { + this.mInsetLeft = pInsetLeft; + this.mInsetTop = pInsetTop; + this.mInsetRight = pInsetRight; + this.mInsetBottom = pInsetBottom; + + this.updateTextureRegions(); + this.updateVertices(); + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== From d17bf42d3a96720246f5c4dfb6323b24ca4d7e3e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 26 Apr 2012 13:15:32 -0700 Subject: [PATCH 023/252] Added convenience methods in SAXUtils. --- src/org/andengine/util/SAXUtils.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/util/SAXUtils.java b/src/org/andengine/util/SAXUtils.java index 95240ed83..dd4b16d9e 100644 --- a/src/org/andengine/util/SAXUtils.java +++ b/src/org/andengine/util/SAXUtils.java @@ -3,7 +3,7 @@ import org.xml.sax.Attributes; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich @@ -34,6 +34,18 @@ public final class SAXUtils { // Methods // =========================================================== + public static final boolean hasAttribute(final Attributes pAttributes, final String pAttributeName) { + final String value = pAttributes.getValue("", pAttributeName); + return value != null; + } + + public static final void hasAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) throws IllegalArgumentException { + final String value = pAttributes.getValue("", pAttributeName); + if(value == null) { + throw new IllegalArgumentException("No value found for attribute: '" + pAttributeName + "'"); + } + } + public static final String getAttribute(final Attributes pAttributes, final String pAttributeName, final String pDefaultValue) { final String value = pAttributes.getValue("", pAttributeName); return (value != null) ? value : pDefaultValue; From 3f26c0f48ef66a5d588c17d378ea5e9b15b983f5 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 26 Apr 2012 16:11:49 -0700 Subject: [PATCH 024/252] Added generic IntLookupMap (2 way lookup, through combination of SparseArray and HashMap). Added Unescaper framework. Added XMLUnescaper. --- .../andengine/util/adt/map/IIntLookupMap.java | 21 ++++ .../andengine/util/adt/map/IntLookupMap.java | 65 +++++++++++++ src/org/andengine/util/escape/Unescaper.java | 96 +++++++++++++++++++ .../util/escape/UnescaperLookupMap.java | 57 +++++++++++ .../andengine/util/escape/XMLUnescaper.java | 56 +++++++++++ 5 files changed, 295 insertions(+) create mode 100644 src/org/andengine/util/adt/map/IIntLookupMap.java create mode 100644 src/org/andengine/util/adt/map/IntLookupMap.java create mode 100644 src/org/andengine/util/escape/Unescaper.java create mode 100644 src/org/andengine/util/escape/UnescaperLookupMap.java create mode 100644 src/org/andengine/util/escape/XMLUnescaper.java diff --git a/src/org/andengine/util/adt/map/IIntLookupMap.java b/src/org/andengine/util/adt/map/IIntLookupMap.java new file mode 100644 index 000000000..b3322ac55 --- /dev/null +++ b/src/org/andengine/util/adt/map/IIntLookupMap.java @@ -0,0 +1,21 @@ +package org.andengine.util.adt.map; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:31:34 - 26.04.2012 + */ +public interface IIntLookupMap { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void add(final T pItem, final int pValue); + public T item(final int pValue); + public int value(final T pItem); +} diff --git a/src/org/andengine/util/adt/map/IntLookupMap.java b/src/org/andengine/util/adt/map/IntLookupMap.java new file mode 100644 index 000000000..75e1960ef --- /dev/null +++ b/src/org/andengine/util/adt/map/IntLookupMap.java @@ -0,0 +1,65 @@ +package org.andengine.util.adt.map; + +import java.util.HashMap; + +import android.util.SparseArray; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:30:35 - 26.04.2012 + */ +public class IntLookupMap implements IIntLookupMap { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final HashMap mItemToValueMapping = new HashMap(); + private final SparseArray mValueToItemMapping = new SparseArray(); + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void add(final T pName, final int pValue) { + this.mItemToValueMapping.put(pName, Integer.valueOf(pValue)); + this.mValueToItemMapping.put(pValue, pName); + } + + @Override + public T item(final int pValue) { + return this.mValueToItemMapping.get(pValue); + } + + @Override + public int value(final T pName) { + final Integer value = this.mItemToValueMapping.get(pName); + if(value == null) { + return -1; + } else { + return value.intValue(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/util/escape/Unescaper.java b/src/org/andengine/util/escape/Unescaper.java new file mode 100644 index 000000000..34da63db7 --- /dev/null +++ b/src/org/andengine/util/escape/Unescaper.java @@ -0,0 +1,96 @@ +package org.andengine.util.escape; + +import org.andengine.util.adt.map.IIntLookupMap; + +import android.text.TextUtils; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:20:25 - 26.04.2012 + */ +/* package */final class Unescaper { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private Unescaper() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + *

Unescapes the entities in a {@link String}.

+ * + *

For example, if you have called addEntity("foo", 0xA1), + * unescape("&foo;") will return "\u00A1"

+ * + * @param pString The {@link String} to escape. + * @param pIntLookupMap the {@link IIntLookupMap} to look up entities. + * @return A new escaped {@link String}. + */ + public static String unescape(final CharSequence pCharSequence, final IIntLookupMap pIntLookupMap) { + final int stringLength = pCharSequence.length(); + final StringBuilder stringBuilder = new StringBuilder(stringLength); + + int i; + for(i = 0; i < stringLength; ++i) { + final char ch = pCharSequence.charAt(i); + if(ch == '&') { + final int semi = TextUtils.indexOf(pCharSequence, ';', i + 1); + if(semi == -1) { + stringBuilder.append(ch); + continue; + } + final CharSequence entityName = pCharSequence.subSequence(i + 1, semi); + int entityValue; + if(entityName.charAt(0) == '#') { + final char charAt1 = entityName.charAt(1); + if((charAt1 == 'x') || (charAt1 == 'X')) { + entityValue = Integer.valueOf(entityName.subSequence(2, entityName.length()).toString(), 16).intValue(); + } else { + entityValue = Integer.parseInt(entityName.subSequence(1, entityName.length()).toString()); + } + } else { + entityValue = pIntLookupMap.value(entityName); + } + if(entityValue == -1) { + stringBuilder.append('&'); + stringBuilder.append(entityName); + stringBuilder.append(';'); + } else { + stringBuilder.append((char) (entityValue)); + } + i = semi; + } else { + stringBuilder.append(ch); + } + } + + return stringBuilder.toString(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/escape/UnescaperLookupMap.java b/src/org/andengine/util/escape/UnescaperLookupMap.java new file mode 100644 index 000000000..5d24c27ef --- /dev/null +++ b/src/org/andengine/util/escape/UnescaperLookupMap.java @@ -0,0 +1,57 @@ +package org.andengine.util.escape; + +import org.andengine.util.adt.map.IntLookupMap; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:31:08 - 26.04.2012 + */ +public class UnescaperLookupMap extends IntLookupMap { + // =========================================================== + // Constants + // =========================================================== + + private static final int LOOKUP_TABLE_SIZE = 256; + + // =========================================================== + // Fields + // =========================================================== + + private final CharSequence[] mLookupTable = new CharSequence[UnescaperLookupMap.LOOKUP_TABLE_SIZE]; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @Override + public CharSequence item(final int pValue) { + if(pValue < UnescaperLookupMap.LOOKUP_TABLE_SIZE) { + return this.mLookupTable[pValue]; + } + return super.item(pValue); + } + + public void init() { + for(int i = 0; i < UnescaperLookupMap.LOOKUP_TABLE_SIZE; ++i) { + this.mLookupTable[i] = super.item(i); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/util/escape/XMLUnescaper.java b/src/org/andengine/util/escape/XMLUnescaper.java new file mode 100644 index 000000000..9de1f804a --- /dev/null +++ b/src/org/andengine/util/escape/XMLUnescaper.java @@ -0,0 +1,56 @@ +package org.andengine.util.escape; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 3:27:44 PM - Apr 26, 2012 + */ +public class XMLUnescaper { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private static final UnescaperLookupMap sUnescaperEntityMap = new UnescaperLookupMap() { + { + /* BASIC */ + this.add("quot", 34); // " - double-quote + this.add("amp", 38); // & - ampersand + this.add("lt", 60); // < - less-than + this.add("gt", 62); // > - greater-than + + /* XML */ + this.add("apos", 39); // XML apostrophe + + this.init(); + } + }; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static String unescape(final CharSequence pCharSequence) { + return Unescaper.unescape(pCharSequence, XMLUnescaper.sUnescaperEntityMap); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From eae6e590a81a85c228c35ad04cdefdc549930e9d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 26 Apr 2012 16:12:07 -0700 Subject: [PATCH 025/252] Minor change in TextureManager. --- src/org/andengine/opengl/texture/TextureManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/opengl/texture/TextureManager.java b/src/org/andengine/opengl/texture/TextureManager.java index bea334ab9..48ab3556a 100644 --- a/src/org/andengine/opengl/texture/TextureManager.java +++ b/src/org/andengine/opengl/texture/TextureManager.java @@ -5,10 +5,10 @@ import java.util.HashMap; import java.util.HashSet; +import org.andengine.opengl.texture.bitmap.AssetBitmapTexture; import org.andengine.opengl.texture.bitmap.BitmapTexture; import org.andengine.opengl.texture.bitmap.BitmapTextureFormat; import org.andengine.opengl.util.GLState; -import org.andengine.util.adt.io.in.AssetInputStreamOpener; import org.andengine.util.adt.io.in.IInputStreamOpener; import org.andengine.util.debug.Debug; @@ -281,7 +281,7 @@ public synchronized ITexture getTexture(final String pID, final AssetManager pAs if(this.hasMappedTexture(pID)) { return this.getMappedTexture(pID); } else { - final ITexture texture = new BitmapTexture(this, new AssetInputStreamOpener(pAssetManager, pAssetPath), pTextureOptions); + final ITexture texture = new AssetBitmapTexture(this, pAssetManager, pAssetPath, pTextureOptions); this.loadTexture(texture); this.addMappedTexture(pID, texture); From 032e1fb93380433ff55e4f32f34e9f0ab6653439 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 26 Apr 2012 16:13:48 -0700 Subject: [PATCH 026/252] Renamed IEntityLoaderDataSource to EntityLoaderData. Other minor changes. --- .../andengine/util/level/EntityLoader.java | 2 +- .../andengine/util/level/IEntityLoader.java | 4 +-- ...DataSource.java => IEntityLoaderData.java} | 2 +- src/org/andengine/util/level/LevelLoader.java | 36 +++++++++---------- .../util/level/LevelLoaderContentHandler.java | 10 +++--- ....java => SimpleLevelEntityLoaderData.java} | 6 ++-- .../util/level/simple/SimpleLevelLoader.java | 15 +++++--- .../SimpleLevelLoaderContentHandler.java | 6 ++-- 8 files changed, 43 insertions(+), 38 deletions(-) rename src/org/andengine/util/level/{IEntityLoaderDataSource.java => IEntityLoaderData.java} (91%) rename src/org/andengine/util/level/simple/{SimpleLevelEntityLoaderDataSource.java => SimpleLevelEntityLoaderData.java} (86%) diff --git a/src/org/andengine/util/level/EntityLoader.java b/src/org/andengine/util/level/EntityLoader.java index 5d81bdb9b..43bb0b208 100644 --- a/src/org/andengine/util/level/EntityLoader.java +++ b/src/org/andengine/util/level/EntityLoader.java @@ -7,7 +7,7 @@ * @author Nicolas Gramlich * @since 14:05:31 - 19.04.2012 */ -public abstract class EntityLoader implements IEntityLoader { +public abstract class EntityLoader implements IEntityLoader { // =========================================================== // Constants // =========================================================== diff --git a/src/org/andengine/util/level/IEntityLoader.java b/src/org/andengine/util/level/IEntityLoader.java index f676912ba..9a3e9dc6e 100644 --- a/src/org/andengine/util/level/IEntityLoader.java +++ b/src/org/andengine/util/level/IEntityLoader.java @@ -11,7 +11,7 @@ * @author Nicolas Gramlich * @since 18:38:40 - 18.04.2012 */ -public interface IEntityLoader { +public interface IEntityLoader { // =========================================================== // Constants // =========================================================== @@ -22,5 +22,5 @@ public interface IEntityLoader { public String[] getEntityNames(); - public IEntity onLoadEntity(final String pEntityName, final Attributes pAttributes, final T pEntityLoaderDataSource) throws IOException; + public IEntity onLoadEntity(final String pEntityName, final Attributes pAttributes, final T pEntityLoaderData) throws IOException; } \ No newline at end of file diff --git a/src/org/andengine/util/level/IEntityLoaderDataSource.java b/src/org/andengine/util/level/IEntityLoaderData.java similarity index 91% rename from src/org/andengine/util/level/IEntityLoaderDataSource.java rename to src/org/andengine/util/level/IEntityLoaderData.java index b77ba88e3..3dbc8fc26 100644 --- a/src/org/andengine/util/level/IEntityLoaderDataSource.java +++ b/src/org/andengine/util/level/IEntityLoaderData.java @@ -6,7 +6,7 @@ * @author Nicolas Gramlich * @since 2:21:46 PM - Apr 19, 2012 */ -public interface IEntityLoaderDataSource { +public interface IEntityLoaderData { // =========================================================== // Constants // =========================================================== diff --git a/src/org/andengine/util/level/LevelLoader.java b/src/org/andengine/util/level/LevelLoader.java index b3b11ad27..3593a7119 100644 --- a/src/org/andengine/util/level/LevelLoader.java +++ b/src/org/andengine/util/level/LevelLoader.java @@ -23,7 +23,7 @@ * @param * @since 14:16:19 - 11.10.2010 */ -public abstract class LevelLoader { +public abstract class LevelLoader { // =========================================================== // Constants // =========================================================== @@ -34,7 +34,6 @@ public abstract class LevelLoader> mEntityLoaders = new HashMap>(); private IEntityLoader mDefaultEntityLoader; - private T mEntityLoaderDataSource; // =========================================================== // Constructors @@ -44,19 +43,10 @@ public LevelLoader() { } - public LevelLoader(final T pEntityLoaderDataSource) { - this.mEntityLoaderDataSource = pEntityLoaderDataSource; - } - public LevelLoader(final IEntityLoader pDefaultEntityLoader) { this.mDefaultEntityLoader = pDefaultEntityLoader; } - public LevelLoader(final T pEntityLoaderDataSource, final IEntityLoader pDefaultEntityLoader) { - this.mEntityLoaderDataSource = pEntityLoaderDataSource; - this.mDefaultEntityLoader = pDefaultEntityLoader; - } - // =========================================================== // Getter & Setter // =========================================================== @@ -65,10 +55,6 @@ public void setDefaultEntityLoader(final IEntityLoader pDefaultEntityLoader) this.mDefaultEntityLoader = pDefaultEntityLoader; } - public void setEntityLoaderDataSource(final T pEntityLoaderDataSource) { - this.mEntityLoaderDataSource = pEntityLoaderDataSource; - } - // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @@ -77,7 +63,8 @@ public void setEntityLoaderDataSource(final T pEntityLoaderDataSource) { // Methods // =========================================================== - protected abstract LevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final T pEntityLoaderDataSource); + protected abstract T onCreateEntityLoaderData(); + protected abstract LevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final T pEntityLoaderData); public void registerEntityLoader(final IEntityLoader pEntityLoader) { final String[] entityNames = pEntityLoader.getEntityNames(); @@ -92,21 +79,33 @@ public void clearEntityLoaders() { } public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath) throws LevelLoaderException { + final T entityLoaderData = this.onCreateEntityLoaderData(); + + return this.loadLevelFromAsset(pAssetManager, pAssetPath, entityLoaderData); + } + + public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final T pEntityLoaderData) throws LevelLoaderException { try { - return this.loadLevelFromStream(pAssetManager.open(pAssetPath)); + return this.loadLevelFromStream(pAssetManager.open(pAssetPath), pEntityLoaderData); } catch (final IOException e) { throw new LevelLoaderException(e); } } public R loadLevelFromStream(final InputStream pInputStream) throws LevelLoaderException { + final T entityLoaderData = this.onCreateEntityLoaderData(); + + return this.loadLevelFromStream(pInputStream, entityLoaderData); + } + + public R loadLevelFromStream(final InputStream pInputStream, final T pEntityLoaderData) throws LevelLoaderException { try{ final SAXParserFactory spf = SAXParserFactory.newInstance(); final SAXParser sp = spf.newSAXParser(); final XMLReader xr = sp.getXMLReader(); - final LevelLoaderContentHandler levelContentHandler = this.onCreateLevelLoaderContentHandler(this.mEntityLoaders, this.mDefaultEntityLoader, this.mEntityLoaderDataSource); + final LevelLoaderContentHandler levelContentHandler = this.onCreateLevelLoaderContentHandler(this.mEntityLoaders, this.mDefaultEntityLoader, pEntityLoaderData); xr.setContentHandler(levelContentHandler); xr.parse(new InputSource(new BufferedInputStream(pInputStream))); @@ -119,7 +118,6 @@ public R loadLevelFromStream(final InputStream pInputStream) throws LevelLoaderE } } - // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/util/level/LevelLoaderContentHandler.java b/src/org/andengine/util/level/LevelLoaderContentHandler.java index 4bfb47a7c..174932206 100644 --- a/src/org/andengine/util/level/LevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/LevelLoaderContentHandler.java @@ -17,7 +17,7 @@ * @author Nicolas Gramlich * @since 14:35:32 - 11.10.2010 */ -public abstract class LevelLoaderContentHandler extends DefaultHandler { +public abstract class LevelLoaderContentHandler extends DefaultHandler { // =========================================================== // Constants // =========================================================== @@ -28,7 +28,7 @@ public abstract class LevelLoaderContentHandler mDefaultEntityLoader; private final HashMap> mEntityLoaders; - private final T mEntityLoaderDataSource; + private final T mEntityLoaderData; private final SmartList mParentEntityStack = new SmartList(); @@ -38,10 +38,10 @@ public abstract class LevelLoaderContentHandler pDefaultEntityLoader, final HashMap> pEntityLoaders, final T pEntityLoaderDataSource) { + public LevelLoaderContentHandler(final IEntityLoader pDefaultEntityLoader, final HashMap> pEntityLoaders, final T pEntityLoaderData) { this.mDefaultEntityLoader = pDefaultEntityLoader; this.mEntityLoaders = pEntityLoaders; - this.mEntityLoaderDataSource = pEntityLoaderDataSource; + this.mEntityLoaderData = pEntityLoaderData; } // =========================================================== @@ -71,7 +71,7 @@ public void startElement(final String pUri, final String pLocalName, final Strin final IEntity entity; try { - entity = entityLoader.onLoadEntity(entityName, pAttributes, this.mEntityLoaderDataSource); + entity = entityLoader.onLoadEntity(entityName, pAttributes, this.mEntityLoaderData); } catch (final IOException e) { throw new LevelLoaderException("Exception when loading entity: '" + entityName + "'.", e); } diff --git a/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderDataSource.java b/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderData.java similarity index 86% rename from src/org/andengine/util/level/simple/SimpleLevelEntityLoaderDataSource.java rename to src/org/andengine/util/level/simple/SimpleLevelEntityLoaderData.java index 21f328dbd..4adc54527 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderDataSource.java +++ b/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderData.java @@ -1,7 +1,7 @@ package org.andengine.util.level.simple; import org.andengine.opengl.vbo.VertexBufferObjectManager; -import org.andengine.util.level.IEntityLoaderDataSource; +import org.andengine.util.level.IEntityLoaderData; /** * (c) Zynga 2012 @@ -9,7 +9,7 @@ * @author Nicolas Gramlich * @since 16:13:09 - 19.04.2012 */ -public class SimpleLevelEntityLoaderDataSource implements IEntityLoaderDataSource { +public class SimpleLevelEntityLoaderData implements IEntityLoaderData { // =========================================================== // Constants // =========================================================== @@ -24,7 +24,7 @@ public class SimpleLevelEntityLoaderDataSource implements IEntityLoaderDataSourc // Constructors // =========================================================== - public SimpleLevelEntityLoaderDataSource(final VertexBufferObjectManager pVertexBufferObjectManager) { + public SimpleLevelEntityLoaderData(final VertexBufferObjectManager pVertexBufferObjectManager) { this.mVertexBufferObjectManager = pVertexBufferObjectManager; } diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoader.java b/src/org/andengine/util/level/simple/SimpleLevelLoader.java index 925bb6fa9..8f51cd949 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoader.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoader.java @@ -12,7 +12,7 @@ * @author Nicolas Gramlich * @since 4:11:17 - 19.04.2012 */ -public class SimpleLevelLoader extends LevelLoader { +public class SimpleLevelLoader extends LevelLoader { // =========================================================== // Constants // =========================================================== @@ -21,12 +21,14 @@ public class SimpleLevelLoader extends LevelLoader> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final SimpleLevelEntityLoaderDataSource pEntityLoaderDataSource) { - return new SimpleLevelLoaderContentHandler(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderDataSource); + protected SimpleLevelEntityLoaderData onCreateEntityLoaderData() { + return new SimpleLevelEntityLoaderData(this.mVertexBufferObjectManager); + } + + @Override + protected SimpleLevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final SimpleLevelEntityLoaderData pEntityLoaderData) { + return new SimpleLevelLoaderContentHandler(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderData); } // =========================================================== diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java index 61e269adb..3c400deb3 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java @@ -12,7 +12,7 @@ * @author Nicolas Gramlich * @since 16:12:23 - 19.04.2012 */ -public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler { +public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler { // =========================================================== // Constants // =========================================================== @@ -25,8 +25,8 @@ public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler pDefaultEntityLoader, final HashMap> pEntityLoaders, SimpleLevelEntityLoaderDataSource pEntityLoaderDataSource) { - super(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderDataSource); + public SimpleLevelLoaderContentHandler(final IEntityLoader pDefaultEntityLoader, final HashMap> pEntityLoaders, SimpleLevelEntityLoaderData pEntityLoaderData) { + super(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderData); } // =========================================================== From 36ea06cfb6d0ab96d85a1605e5f70edb7103afa9 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 1 May 2012 12:29:17 -0700 Subject: [PATCH 027/252] Added some convenience constructors to TextOptions. --- src/org/andengine/entity/text/TextOptions.java | 14 +++++++++----- src/org/andengine/entity/text/TickerText.java | 16 ++++++++++------ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/org/andengine/entity/text/TextOptions.java b/src/org/andengine/entity/text/TextOptions.java index 90e6071d4..9c73ee2b0 100644 --- a/src/org/andengine/entity/text/TextOptions.java +++ b/src/org/andengine/entity/text/TextOptions.java @@ -27,22 +27,26 @@ public class TextOptions { // =========================================================== public TextOptions() { - this(AutoWrap.NONE, 0, Text.LEADING_DEFAULT, HorizontalAlign.LEFT); + this(AutoWrap.NONE, 0, HorizontalAlign.LEFT, Text.LEADING_DEFAULT); } public TextOptions(final HorizontalAlign pHorizontalAlign) { - this(AutoWrap.NONE, 0, Text.LEADING_DEFAULT, pHorizontalAlign); + this(AutoWrap.NONE, 0, pHorizontalAlign, Text.LEADING_DEFAULT); } public TextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth) { - this(pAutoWrap, pAutoWrapWidth, Text.LEADING_DEFAULT, HorizontalAlign.LEFT); + this(pAutoWrap, pAutoWrapWidth, HorizontalAlign.LEFT, Text.LEADING_DEFAULT); } - public TextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final float pLeading, final HorizontalAlign pHorizontalAlign) { + public TextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign) { + this(pAutoWrap, pAutoWrapWidth, pHorizontalAlign, Text.LEADING_DEFAULT); + } + + public TextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign, final float pLeading) { this.mAutoWrap = pAutoWrap; this.mAutoWrapWidth = pAutoWrapWidth; - this.mLeading = pLeading; this.mHorizontalAlign = pHorizontalAlign; + this.mLeading = pLeading; } // =========================================================== diff --git a/src/org/andengine/entity/text/TickerText.java b/src/org/andengine/entity/text/TickerText.java index d81882ac4..b6511f0ff 100644 --- a/src/org/andengine/entity/text/TickerText.java +++ b/src/org/andengine/entity/text/TickerText.java @@ -155,19 +155,23 @@ public TickerTextOptions(final float pCharactersPerSecond, final boolean pRevers } public TickerTextOptions(final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond) { - this(AutoWrap.NONE, 0, Text.LEADING_DEFAULT, pHorizontalAlign, pCharactersPerSecond, false); + this(AutoWrap.NONE, 0, pHorizontalAlign, Text.LEADING_DEFAULT, pCharactersPerSecond, false); } public TickerTextOptions(final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond, final boolean pReverse) { - this(AutoWrap.NONE, 0, Text.LEADING_DEFAULT, pHorizontalAlign, pCharactersPerSecond, pReverse); + this(AutoWrap.NONE, 0, pHorizontalAlign, Text.LEADING_DEFAULT, pCharactersPerSecond, pReverse); } - public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final float pLeading, final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond) { - this(pAutoWrap, pAutoWrapWidth, pLeading, pHorizontalAlign, pCharactersPerSecond, false); + public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond) { + this(pAutoWrap, pAutoWrapWidth, pHorizontalAlign, Text.LEADING_DEFAULT, pCharactersPerSecond, false); } - public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final float pLeading, final HorizontalAlign pHorizontalAlign, final float pCharactersPerSecond, final boolean pReverse) { - super(pAutoWrap, pAutoWrapWidth, pLeading, pHorizontalAlign); + public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign, final float pLeading, final float pCharactersPerSecond) { + this(pAutoWrap, pAutoWrapWidth, pHorizontalAlign, pLeading, pCharactersPerSecond, false); + } + + public TickerTextOptions(final AutoWrap pAutoWrap, final float pAutoWrapWidth, final HorizontalAlign pHorizontalAlign, final float pLeading, final float pCharactersPerSecond, final boolean pReverse) { + super(pAutoWrap, pAutoWrapWidth, pHorizontalAlign, pLeading); this.mCharactersPerSecond = pCharactersPerSecond; this.mReverse = pReverse; From 56674951d8b463ae4da994e3d77e923e3247cadf Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 1 May 2012 12:30:26 -0700 Subject: [PATCH 028/252] Passing parent Entity to IEntityLoader (except for root node, where it is null). --- src/org/andengine/util/level/IEntityLoader.java | 10 +++++++++- .../util/level/LevelLoaderContentHandler.java | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/util/level/IEntityLoader.java b/src/org/andengine/util/level/IEntityLoader.java index 9a3e9dc6e..a7926585e 100644 --- a/src/org/andengine/util/level/IEntityLoader.java +++ b/src/org/andengine/util/level/IEntityLoader.java @@ -22,5 +22,13 @@ public interface IEntityLoader { public String[] getEntityNames(); - public IEntity onLoadEntity(final String pEntityName, final Attributes pAttributes, final T pEntityLoaderData) throws IOException; + /** + * @param pEntityName + * @param pParent can be null, i.e. for the root {@link IEntity}. + * @param pAttributes + * @param pEntityLoaderData + * @return + * @throws IOException + */ + public IEntity onLoadEntity(final String pEntityName, final IEntity pParent, final Attributes pAttributes, final T pEntityLoaderData) throws IOException; } \ No newline at end of file diff --git a/src/org/andengine/util/level/LevelLoaderContentHandler.java b/src/org/andengine/util/level/LevelLoaderContentHandler.java index 174932206..c39c7dc01 100644 --- a/src/org/andengine/util/level/LevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/LevelLoaderContentHandler.java @@ -71,7 +71,7 @@ public void startElement(final String pUri, final String pLocalName, final Strin final IEntity entity; try { - entity = entityLoader.onLoadEntity(entityName, pAttributes, this.mEntityLoaderData); + entity = entityLoader.onLoadEntity(entityName, parent, pAttributes, this.mEntityLoaderData); } catch (final IOException e) { throw new LevelLoaderException("Exception when loading entity: '" + entityName + "'.", e); } From 6f5fb6966ba85d207c38546e77806fa4e3760677 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 1 May 2012 12:30:46 -0700 Subject: [PATCH 029/252] Minor renamings. --- .../{UnescaperLookupMap.java => UnescaperEntityMap.java} | 8 ++++---- src/org/andengine/util/escape/XMLUnescaper.java | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) rename src/org/andengine/util/escape/{UnescaperLookupMap.java => UnescaperEntityMap.java} (87%) diff --git a/src/org/andengine/util/escape/UnescaperLookupMap.java b/src/org/andengine/util/escape/UnescaperEntityMap.java similarity index 87% rename from src/org/andengine/util/escape/UnescaperLookupMap.java rename to src/org/andengine/util/escape/UnescaperEntityMap.java index 5d24c27ef..83695bd5a 100644 --- a/src/org/andengine/util/escape/UnescaperLookupMap.java +++ b/src/org/andengine/util/escape/UnescaperEntityMap.java @@ -8,7 +8,7 @@ * @author Nicolas Gramlich * @since 15:31:08 - 26.04.2012 */ -public class UnescaperLookupMap extends IntLookupMap { +public class UnescaperEntityMap extends IntLookupMap { // =========================================================== // Constants // =========================================================== @@ -19,7 +19,7 @@ public class UnescaperLookupMap extends IntLookupMap { // Fields // =========================================================== - private final CharSequence[] mLookupTable = new CharSequence[UnescaperLookupMap.LOOKUP_TABLE_SIZE]; + private final CharSequence[] mLookupTable = new CharSequence[UnescaperEntityMap.LOOKUP_TABLE_SIZE]; // =========================================================== // Constructors @@ -39,14 +39,14 @@ public class UnescaperLookupMap extends IntLookupMap { @Override public CharSequence item(final int pValue) { - if(pValue < UnescaperLookupMap.LOOKUP_TABLE_SIZE) { + if(pValue < UnescaperEntityMap.LOOKUP_TABLE_SIZE) { return this.mLookupTable[pValue]; } return super.item(pValue); } public void init() { - for(int i = 0; i < UnescaperLookupMap.LOOKUP_TABLE_SIZE; ++i) { + for(int i = 0; i < UnescaperEntityMap.LOOKUP_TABLE_SIZE; ++i) { this.mLookupTable[i] = super.item(i); } } diff --git a/src/org/andengine/util/escape/XMLUnescaper.java b/src/org/andengine/util/escape/XMLUnescaper.java index 9de1f804a..f064f8a0d 100644 --- a/src/org/andengine/util/escape/XMLUnescaper.java +++ b/src/org/andengine/util/escape/XMLUnescaper.java @@ -15,7 +15,7 @@ public class XMLUnescaper { // Fields // =========================================================== - private static final UnescaperLookupMap sUnescaperEntityMap = new UnescaperLookupMap() { + private static final UnescaperEntityMap XMLUNESCAPER_ENTITYMAP = new UnescaperEntityMap() { { /* BASIC */ this.add("quot", 34); // " - double-quote @@ -47,7 +47,7 @@ public class XMLUnescaper { // =========================================================== public static String unescape(final CharSequence pCharSequence) { - return Unescaper.unescape(pCharSequence, XMLUnescaper.sUnescaperEntityMap); + return Unescaper.unescape(pCharSequence, XMLUnescaper.XMLUNESCAPER_ENTITYMAP); } // =========================================================== From 64d944ba202441d83ca6993bcd1894435e586b49 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 1 May 2012 15:54:39 -0700 Subject: [PATCH 030/252] Added queryFirst and queryFirstForSubclass convenience methods to IEntity/Entity. --- src/org/andengine/entity/Entity.java | 40 +++++++++++++++---- src/org/andengine/entity/IEntity.java | 17 ++++++-- .../item/decorator/BaseMenuItemDecorator.java | 10 +++++ 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 225a2d487..344162792 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -805,16 +805,40 @@ public ArrayList query(final IEntityMatcher pEntityMatcher) { return this.query(pEntityMatcher, new ArrayList()); } + @Override + public IEntity queryFirst(final IEntityMatcher pEntityMatcher) { + return this.queryFirstForSubclass(pEntityMatcher); + } + + @SuppressWarnings("unchecked") + @Override + public S queryFirstForSubclass(final IEntityMatcher pEntityMatcher) { + final int childCount = this.getChildCount(); + for(int i = 0; i < childCount; i++) { + final IEntity child = this.mChildren.get(i); + if(pEntityMatcher.matches(child)) { + return (S)child; + } + + final S childQueryFirst = child.queryFirstForSubclass(pEntityMatcher); + if(childQueryFirst != null) { + return childQueryFirst; + } + } + + return null; + } + @Override public > L query(final IEntityMatcher pEntityMatcher, final L pResult) { final int childCount = this.getChildCount(); for(int i = 0; i < childCount; i++) { - final IEntity item = this.mChildren.get(i); - if(pEntityMatcher.matches(item)) { - pResult.add(item); + final IEntity child = this.mChildren.get(i); + if(pEntityMatcher.matches(child)) { + pResult.add(child); } - item.query(pEntityMatcher, pResult); + child.query(pEntityMatcher, pResult); } return pResult; @@ -830,12 +854,12 @@ public ArrayList queryForSubclass(final IEntityMatcher pE public , S extends IEntity> L queryForSubclass(final IEntityMatcher pEntityMatcher, final L pResult) throws ClassCastException { final int childCount = this.getChildCount(); for(int i = 0; i < childCount; i++) { - final IEntity item = this.mChildren.get(i); - if(pEntityMatcher.matches(item)) { - pResult.add((S)item); + final IEntity child = this.mChildren.get(i); + if(pEntityMatcher.matches(child)) { + pResult.add((S)child); } - item.queryForSubclass(pEntityMatcher, pResult); + child.queryForSubclass(pEntityMatcher, pResult); } return pResult; diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index 59253f468..0635e421d 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -247,23 +247,34 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou * @return all children (recursively!) that match the supplied {@link IEntityMatcher}. */ public ArrayList query(final IEntityMatcher pEntityMatcher); + /** + * @param pEntityMatcher + * @return the first child (recursively!) that matches the supplied {@link IEntityMatcher} or null if none matches.. + */ + public IEntity queryFirst(final IEntityMatcher pEntityMatcher); /** * @param pEntityMatcher * @param pResult the {@link List} to put the result into. * @return all children (recursively!) that match the supplied {@link IEntityMatcher}. */ public > L query(final IEntityMatcher pEntityMatcher, final L pResult); + /** + * @param pEntityMatcher + * @return the first child (recursively!) that matches the supplied {@link IEntityMatcher} or null if none matches.. + * @throws ClassCastException when the supplied {@link IEntityMatcher} matched an {@link IEntity} that was not of the requested subtype. + */ + public S queryFirstForSubclass(final IEntityMatcher pEntityMatcher); /** * @param pEntityMatcher * @return all children (recursively!) that match the supplied {@link IEntityMatcher}. - * @throws ClassCastException when the supplied {@link IEntityMatcher} matched a {@link IEntity} that was not of the requested subtype. + * @throws ClassCastException when the supplied {@link IEntityMatcher} matched an {@link IEntity} that was not of the requested subtype. */ - public ArrayList queryForSubclass(IEntityMatcher pEntityMatcher) throws ClassCastException; + public ArrayList queryForSubclass(final IEntityMatcher pEntityMatcher) throws ClassCastException; /** * @param pEntityMatcher * @param pResult the {@link List} to put the result into. * @return all children (recursively!) that match the supplied {@link IEntityMatcher}. - * @throws ClassCastException when the supplied {@link IEntityMatcher} matched a {@link IEntity} that was not of the requested subtype. + * @throws ClassCastException when the supplied {@link IEntityMatcher} matched an {@link IEntity} that was not of the requested subtype. */ public , S extends IEntity> L queryForSubclass(final IEntityMatcher pEntityMatcher, final L pResult) throws ClassCastException; diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index 15ceaef15..cac9bdb7c 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -639,11 +639,21 @@ public ArrayList query(final IEntityMatcher pEntityMatcher) { return this.mMenuItem.query(pEntityMatcher); } + @Override + public IEntity queryFirst(final IEntityMatcher pEntityMatcher) { + return this.mMenuItem.queryFirst(pEntityMatcher); + } + @Override public > L query(final IEntityMatcher pEntityMatcher, final L pResult) { return this.mMenuItem.query(pEntityMatcher, pResult); } + @Override + public S queryFirstForSubclass(final IEntityMatcher pEntityMatcher) { + return this.mMenuItem.queryFirstForSubclass(pEntityMatcher); + } + @Override public ArrayList queryForSubclass(final IEntityMatcher pEntityMatcher) throws ClassCastException { return this.mMenuItem.queryForSubclass(pEntityMatcher); From 7beb75760c5c13417f083467196ee12190e22847 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 1 May 2012 15:54:53 -0700 Subject: [PATCH 031/252] Added TagEntityMatcher. --- .../andengine/entity/TagEntityMatcher.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/org/andengine/entity/TagEntityMatcher.java diff --git a/src/org/andengine/entity/TagEntityMatcher.java b/src/org/andengine/entity/TagEntityMatcher.java new file mode 100644 index 000000000..7d516a5ef --- /dev/null +++ b/src/org/andengine/entity/TagEntityMatcher.java @@ -0,0 +1,56 @@ +package org.andengine.entity; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:49:11 - 01.05.2012 + */ +public class TagEntityMatcher implements IEntityMatcher { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private int mTag; + + // =========================================================== + // Constructors + // =========================================================== + + public TagEntityMatcher(final int pTag) { + this.mTag = pTag; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getTag() { + return this.mTag; + } + + public void setTag(final int pTag) { + this.mTag = pTag; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean matches(final IEntity pEntity) { + return this.mTag == pEntity.getTag(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 08e114afe656a08d3066e034b94cab5905652f41 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 1 May 2012 16:52:45 -0700 Subject: [PATCH 032/252] Minor changes in LoopModifier. --- src/org/andengine/util/modifier/LoopModifier.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/util/modifier/LoopModifier.java b/src/org/andengine/util/modifier/LoopModifier.java index cd5ea9d64..bc90815d8 100644 --- a/src/org/andengine/util/modifier/LoopModifier.java +++ b/src/org/andengine/util/modifier/LoopModifier.java @@ -4,7 +4,7 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich @@ -40,7 +40,7 @@ public class LoopModifier extends BaseModifier implements IModifierListene // =========================================================== public LoopModifier(final IModifier pModifier) { - this(pModifier, LOOP_CONTINUOUS); + this(pModifier, LoopModifier.LOOP_CONTINUOUS); } public LoopModifier(final IModifier pModifier, final int pLoopCount) { @@ -65,7 +65,7 @@ public LoopModifier(final IModifier pModifier, final int pLoopCount, final IL this.mLoopModifierListener = pLoopModifierListener; this.mLoop = 0; - this.mDuration = pLoopCount == LOOP_CONTINUOUS ? Float.POSITIVE_INFINITY : pModifier.getDuration() * pLoopCount; // TODO Check if POSITIVE_INFINITY works correct with i.e. SequenceModifier + this.mDuration = (pLoopCount == LoopModifier.LOOP_CONTINUOUS) ? Float.POSITIVE_INFINITY : pModifier.getDuration() * pLoopCount; // TODO Check if POSITIVE_INFINITY works correct with i.e. SequenceModifier this.mModifier.addModifierListener(this); } @@ -113,7 +113,7 @@ public float onUpdate(final float pSecondsElapsed, final T pItem) { float secondsElapsedRemaining = pSecondsElapsed; this.mFinishedCached = false; - while(secondsElapsedRemaining > 0 && !this.mFinishedCached) { + while((secondsElapsedRemaining > 0) && !this.mFinishedCached) { secondsElapsedRemaining -= this.mModifier.onUpdate(secondsElapsedRemaining, pItem); } this.mFinishedCached = false; @@ -155,7 +155,7 @@ public void onModifierFinished(final IModifier pModifier, final T pItem) { this.mLoopModifierListener.onLoopFinished(this, this.mLoop, this.mLoopCount); } - if(this.mLoopCount == LOOP_CONTINUOUS) { + if(this.mLoopCount == LoopModifier.LOOP_CONTINUOUS) { this.mSecondsElapsed = 0; this.mModifier.reset(); } else { From ce857de8f18464f46b11013ec84be9f61664532d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 2 May 2012 16:50:16 -0700 Subject: [PATCH 033/252] Added IEntity.getRootEntity() convenience method. --- src/org/andengine/entity/Entity.java | 11 +++++++++++ src/org/andengine/entity/IEntity.java | 2 ++ .../menu/item/decorator/BaseMenuItemDecorator.java | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 344162792..193e89fe3 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -244,6 +244,17 @@ public void setParent(final IEntity pEntity) { this.mParent = pEntity; } + @Override + public IEntity getRootEntity() { + IEntity rootEntity = this; + + while (rootEntity.hasParent()) { + rootEntity = rootEntity.getParent(); + } + + return rootEntity; + } + @Override public int getTag() { return this.mTag; diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index 0635e421d..b9b95dfba 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -76,6 +76,8 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou public IEntity getParent(); public void setParent(final IEntity pEntity); + public IEntity getRootEntity(); + public float getX(); public float getY(); public void setX(final float pX); diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index cac9bdb7c..8333946bd 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -754,6 +754,11 @@ public void setParent(final IEntity pEntity) { this.mMenuItem.setParent(pEntity); } + @Override + public IEntity getRootEntity() { + return this.mMenuItem.getRootEntity(); + } + @Override public boolean isVisible() { return this.mMenuItem.isVisible(); From ae387c941b4371295093f607f9afb02cadc9f73c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 2 May 2012 16:53:11 -0700 Subject: [PATCH 034/252] Added an IEntityLoaderListener when loading a level through the LevelLoader. --- .../util/level/IEntityLoaderListener.java | 22 +++++++++++++++ src/org/andengine/util/level/LevelLoader.java | 28 +++++++++++++------ .../util/level/LevelLoaderContentHandler.java | 18 +++++++++--- .../util/level/simple/SimpleLevelLoader.java | 5 ++-- .../SimpleLevelLoaderContentHandler.java | 3 +- 5 files changed, 61 insertions(+), 15 deletions(-) create mode 100644 src/org/andengine/util/level/IEntityLoaderListener.java diff --git a/src/org/andengine/util/level/IEntityLoaderListener.java b/src/org/andengine/util/level/IEntityLoaderListener.java new file mode 100644 index 000000000..9d84e2bfb --- /dev/null +++ b/src/org/andengine/util/level/IEntityLoaderListener.java @@ -0,0 +1,22 @@ +package org.andengine.util.level; + +import org.andengine.entity.IEntity; +import org.xml.sax.Attributes; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:52:39 - 02.05.2012 + */ +public interface IEntityLoaderListener { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onEntityLoaded(final IEntity pEntity, final Attributes pAttributes); +} diff --git a/src/org/andengine/util/level/LevelLoader.java b/src/org/andengine/util/level/LevelLoader.java index 3593a7119..c77c19272 100644 --- a/src/org/andengine/util/level/LevelLoader.java +++ b/src/org/andengine/util/level/LevelLoader.java @@ -23,7 +23,7 @@ * @param * @since 14:16:19 - 11.10.2010 */ -public abstract class LevelLoader { +public abstract class LevelLoader { // =========================================================== // Constants // =========================================================== @@ -64,7 +64,7 @@ public void setDefaultEntityLoader(final IEntityLoader pDefaultEntityLoader) // =========================================================== protected abstract T onCreateEntityLoaderData(); - protected abstract LevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final T pEntityLoaderData); + protected abstract LevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final T pEntityLoaderData, final L pEntityLoaderListener); public void registerEntityLoader(final IEntityLoader pEntityLoader) { final String[] entityNames = pEntityLoader.getEntityNames(); @@ -79,33 +79,45 @@ public void clearEntityLoaders() { } public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath) throws LevelLoaderException { + return this.loadLevelFromAsset(pAssetManager, pAssetPath, (L)null); + } + + public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final L pEntityLoaderListener) throws LevelLoaderException { final T entityLoaderData = this.onCreateEntityLoaderData(); - return this.loadLevelFromAsset(pAssetManager, pAssetPath, entityLoaderData); + return this.loadLevelFromAsset(pAssetManager, pAssetPath, entityLoaderData, pEntityLoaderListener); } public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final T pEntityLoaderData) throws LevelLoaderException { + return this.loadLevelFromAsset(pAssetManager, pAssetPath, pEntityLoaderData, null); + } + + public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final T pEntityLoaderData, final L pEntityLoaderListener) throws LevelLoaderException { try { - return this.loadLevelFromStream(pAssetManager.open(pAssetPath), pEntityLoaderData); + return this.loadLevelFromStream(pAssetManager.open(pAssetPath), pEntityLoaderData, pEntityLoaderListener); } catch (final IOException e) { throw new LevelLoaderException(e); } } public R loadLevelFromStream(final InputStream pInputStream) throws LevelLoaderException { - final T entityLoaderData = this.onCreateEntityLoaderData(); + return this.loadLevelFromStream(pInputStream, null); + } - return this.loadLevelFromStream(pInputStream, entityLoaderData); + public R loadLevelFromStream(final InputStream pInputStream, final L pEntityLoaderListener) throws LevelLoaderException { + final T entityLoaderData = this.onCreateEntityLoaderData(); + + return this.loadLevelFromStream(pInputStream, entityLoaderData, pEntityLoaderListener); } - public R loadLevelFromStream(final InputStream pInputStream, final T pEntityLoaderData) throws LevelLoaderException { + public R loadLevelFromStream(final InputStream pInputStream, final T pEntityLoaderData, final L pEntityLoaderListener) throws LevelLoaderException { try{ final SAXParserFactory spf = SAXParserFactory.newInstance(); final SAXParser sp = spf.newSAXParser(); final XMLReader xr = sp.getXMLReader(); - final LevelLoaderContentHandler levelContentHandler = this.onCreateLevelLoaderContentHandler(this.mEntityLoaders, this.mDefaultEntityLoader, pEntityLoaderData); + final LevelLoaderContentHandler levelContentHandler = this.onCreateLevelLoaderContentHandler(this.mEntityLoaders, this.mDefaultEntityLoader, pEntityLoaderData, pEntityLoaderListener); xr.setContentHandler(levelContentHandler); xr.parse(new InputSource(new BufferedInputStream(pInputStream))); diff --git a/src/org/andengine/util/level/LevelLoaderContentHandler.java b/src/org/andengine/util/level/LevelLoaderContentHandler.java index c39c7dc01..67414a912 100644 --- a/src/org/andengine/util/level/LevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/LevelLoaderContentHandler.java @@ -17,7 +17,7 @@ * @author Nicolas Gramlich * @since 14:35:32 - 11.10.2010 */ -public abstract class LevelLoaderContentHandler extends DefaultHandler { +public abstract class LevelLoaderContentHandler extends DefaultHandler { // =========================================================== // Constants // =========================================================== @@ -26,22 +26,28 @@ public abstract class LevelLoaderContentHandler mDefaultEntityLoader; - private final HashMap> mEntityLoaders; - private final T mEntityLoaderData; + protected final IEntityLoader mDefaultEntityLoader; + protected final HashMap> mEntityLoaders; + protected final T mEntityLoaderData; private final SmartList mParentEntityStack = new SmartList(); protected IEntity mRootEntity; + protected L mEntityLoaderListener; // =========================================================== // Constructors // =========================================================== public LevelLoaderContentHandler(final IEntityLoader pDefaultEntityLoader, final HashMap> pEntityLoaders, final T pEntityLoaderData) { + this(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderData, null); + } + + public LevelLoaderContentHandler(final IEntityLoader pDefaultEntityLoader, final HashMap> pEntityLoaders, final T pEntityLoaderData, final L pEntityLoaderListener) { this.mDefaultEntityLoader = pDefaultEntityLoader; this.mEntityLoaders = pEntityLoaders; this.mEntityLoaderData = pEntityLoaderData; + this.mEntityLoaderListener = pEntityLoaderListener; } // =========================================================== @@ -86,6 +92,10 @@ public void startElement(final String pUri, final String pLocalName, final Strin parent.attachChild(entity); } + if(this.mEntityLoaderListener != null) { + this.mEntityLoaderListener.onEntityLoaded(entity, pAttributes); + } + this.mParentEntityStack.addLast(entity); } diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoader.java b/src/org/andengine/util/level/simple/SimpleLevelLoader.java index 8f51cd949..9203430b0 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoader.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoader.java @@ -4,6 +4,7 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.util.level.IEntityLoader; +import org.andengine.util.level.IEntityLoaderListener; import org.andengine.util.level.LevelLoader; /** @@ -12,7 +13,7 @@ * @author Nicolas Gramlich * @since 4:11:17 - 19.04.2012 */ -public class SimpleLevelLoader extends LevelLoader { +public class SimpleLevelLoader extends LevelLoader { // =========================================================== // Constants // =========================================================== @@ -45,7 +46,7 @@ protected SimpleLevelEntityLoaderData onCreateEntityLoaderData() { } @Override - protected SimpleLevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final SimpleLevelEntityLoaderData pEntityLoaderData) { + protected SimpleLevelLoaderContentHandler onCreateLevelLoaderContentHandler(final HashMap> pEntityLoaders, final IEntityLoader pDefaultEntityLoader, final SimpleLevelEntityLoaderData pEntityLoaderData, final IEntityLoaderListener pEntityLoaderListener) { return new SimpleLevelLoaderContentHandler(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderData); } diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java index 3c400deb3..2bec04df3 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java @@ -4,6 +4,7 @@ import org.andengine.entity.scene.Scene; import org.andengine.util.level.IEntityLoader; +import org.andengine.util.level.IEntityLoaderListener; import org.andengine.util.level.LevelLoaderContentHandler; /** @@ -12,7 +13,7 @@ * @author Nicolas Gramlich * @since 16:12:23 - 19.04.2012 */ -public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler { +public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler { // =========================================================== // Constants // =========================================================== From 4a801f5683be9537f94e7f4a08582636a9164810 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 2 May 2012 23:32:41 -0700 Subject: [PATCH 035/252] Fixed rotated TextureRegions being displayed upside down. --- ...formanceSpriteBatchVertexBufferObject.java | 24 +++++++++---------- ...owMemorySpriteBatchVertexBufferObject.java | 22 ++++++++--------- ...rmanceDiamondSpriteVertexBufferObject.java | 4 ++-- ...ghPerformanceSpriteVertexBufferObject.java | 8 +++---- ...formanceTiledSpriteVertexBufferObject.java | 12 +++++----- ...anceUncoloredSpriteVertexBufferObject.java | 8 +++---- ...eUniformColorSpriteVertexBufferObject.java | 8 +++---- ...MemoryDiamondSpriteVertexBufferObject.java | 4 ++-- .../LowMemorySpriteVertexBufferObject.java | 8 +++---- ...owMemoryTiledSpriteVertexBufferObject.java | 12 +++++----- ...moryUncoloredSpriteVertexBufferObject.java | 8 +++---- ...yUniformColorSpriteVertexBufferObject.java | 8 +++---- 12 files changed, 63 insertions(+), 63 deletions(-) diff --git a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java index d2adb63a7..e6ba7522e 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java @@ -77,37 +77,37 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x3; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y3; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x3; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y3; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x4; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y4; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; @@ -174,37 +174,37 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x2; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y2; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; - bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; diff --git a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java index 093844c22..3699b8c6a 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java @@ -85,31 +85,31 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x3); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y3); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x3); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y3); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x4); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y4); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); @@ -176,37 +176,37 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 1 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 2 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 3 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 4 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x2); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y2); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); - bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 5 * SpriteBatch.VERTEX_SIZE + SpriteBatch.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java index c919e9c54..6c19d3ebd 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java @@ -103,7 +103,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float vCenter = (v + v2) * 0.5f; if(textureRegion.isRotated()) { - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; @@ -112,7 +112,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; } else { bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = uCenter; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java index 1b597de48..374ae2936 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java @@ -112,16 +112,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } if(textureRegion.isRotated()) { - bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; - bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java index 0cfacee56..a0a46c0d7 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java @@ -138,22 +138,22 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { } if(textureRegion.isRotated()) { - bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; - bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; - bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java index 6ff14af05..ffdc8bc85 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java @@ -103,16 +103,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } if(textureRegion.isRotated()) { - bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v2; - bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java index c4179d16d..38f382ca5 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java @@ -104,16 +104,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } if(textureRegion.isRotated()) { - bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v; - bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u2; + bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v2; - bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; + bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v2; } else { bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java index 2333c0ee9..8d21b869b 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java @@ -105,7 +105,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float vCenter = (v + v2) * 0.5f; if(textureRegion.isRotated()) { - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); @@ -114,7 +114,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); } else { bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, uCenter); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java index ca655bb01..2ea394a5f 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java @@ -114,16 +114,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } if(textureRegion.isRotated()) { - bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(1 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(2 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(3 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java index d5fa16379..07a04bd97 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java @@ -140,22 +140,22 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { } if(textureRegion.isRotated()) { - bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 3 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 4 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(bufferDataOffset + 5 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java index 6edd08698..129e5b4c4 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java @@ -105,16 +105,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } if(textureRegion.isRotated()) { - bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(1 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(2 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(3 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java index 00c577a73..06a3da4d9 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java @@ -106,16 +106,16 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } if(textureRegion.isRotated()) { - bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(1 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v); - bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u2); + bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(2 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v2); - bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); + bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(3 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v2); } else { bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); From 7bf2ebc557654447f125dc55afc908e2f56d705e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 7 May 2012 14:09:08 -0700 Subject: [PATCH 036/252] Added/enhanced the primitive List implementations. --- .../util/adt/list/FloatArrayList.java | 7 + .../andengine/util/adt/list/IFloatList.java | 1 + src/org/andengine/util/adt/list/IIntList.java | 26 ++++ .../andengine/util/adt/list/ILongList.java | 26 ++++ .../andengine/util/adt/list/IntArrayList.java | 122 ++++++++++++++++++ .../util/adt/list/LongArrayList.java | 122 ++++++++++++++++++ 6 files changed, 304 insertions(+) create mode 100644 src/org/andengine/util/adt/list/IIntList.java create mode 100644 src/org/andengine/util/adt/list/ILongList.java create mode 100644 src/org/andengine/util/adt/list/IntArrayList.java create mode 100644 src/org/andengine/util/adt/list/LongArrayList.java diff --git a/src/org/andengine/util/adt/list/FloatArrayList.java b/src/org/andengine/util/adt/list/FloatArrayList.java index 7abf5311b..694eabf42 100644 --- a/src/org/andengine/util/adt/list/FloatArrayList.java +++ b/src/org/andengine/util/adt/list/FloatArrayList.java @@ -94,6 +94,13 @@ public void clear() { this.mSize = 0; } + @Override + public float[] toArray() { + final float[] array = new float[this.mSize]; + System.arraycopy(this.mItems, 0, array, 0, this.mSize); + return array ; + } + // =========================================================== // Methods // =========================================================== diff --git a/src/org/andengine/util/adt/list/IFloatList.java b/src/org/andengine/util/adt/list/IFloatList.java index f86a75cc9..1a9785bcc 100644 --- a/src/org/andengine/util/adt/list/IFloatList.java +++ b/src/org/andengine/util/adt/list/IFloatList.java @@ -22,4 +22,5 @@ public interface IFloatList { public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException; public int size(); public void clear(); + public float[] toArray(); } \ No newline at end of file diff --git a/src/org/andengine/util/adt/list/IIntList.java b/src/org/andengine/util/adt/list/IIntList.java new file mode 100644 index 000000000..264fb9938 --- /dev/null +++ b/src/org/andengine/util/adt/list/IIntList.java @@ -0,0 +1,26 @@ +package org.andengine.util.adt.list; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 19:21:53 - 03.05.2012 + */ +public interface IIntList { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isEmpty(); + public float get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public void add(final int pItem); + public void add(final int pIndex, final int pItem) throws ArrayIndexOutOfBoundsException; + public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int size(); + public void clear(); + public int[] toArray(); +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/list/ILongList.java b/src/org/andengine/util/adt/list/ILongList.java new file mode 100644 index 000000000..8bff7abf1 --- /dev/null +++ b/src/org/andengine/util/adt/list/ILongList.java @@ -0,0 +1,26 @@ +package org.andengine.util.adt.list; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 19:36:57 - 03.05.2012 + */ +public interface ILongList { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isEmpty(); + public float get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public void add(final long pItem); + public void add(final int pIndex, final long pItem) throws ArrayIndexOutOfBoundsException; + public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int size(); + public void clear(); + public long[] toArray(); +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/list/IntArrayList.java b/src/org/andengine/util/adt/list/IntArrayList.java new file mode 100644 index 000000000..4e85f1a7d --- /dev/null +++ b/src/org/andengine/util/adt/list/IntArrayList.java @@ -0,0 +1,122 @@ +package org.andengine.util.adt.list; + +/** + * TODO This class could take some kind of AllocationStrategy object. + * + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 19:22:29 - 03.05.2012 + */ +public class IntArrayList implements IIntList { + // =========================================================== + // Constants + // =========================================================== + + private static final int CAPACITY_INITIAL_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private int[] mItems; + private int mSize; + + // =========================================================== + // Constructors + // =========================================================== + + public IntArrayList() { + this(IntArrayList.CAPACITY_INITIAL_DEFAULT); + } + + public IntArrayList(final int pInitialCapacity) { + this.mItems = new int[pInitialCapacity]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isEmpty() { + return this.mSize == 0; + } + + @Override + public float get(final int pIndex) throws ArrayIndexOutOfBoundsException { + return this.mItems[pIndex]; + } + + @Override + public void add(final int pItem) { + this.ensureCapacity(this.mSize + 1); + + this.mItems[this.mSize] = pItem; + this.mSize++; + } + + @Override + public void add(final int pIndex, final int pItem) throws ArrayIndexOutOfBoundsException { + this.ensureCapacity(this.mSize + 1); + + System.arraycopy(this.mItems, pIndex, this.mItems, pIndex + 1, this.mSize - pIndex); + + this.mItems[pIndex] = pItem; + this.mSize++; + } + + @Override + public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final float oldValue = this.mItems[pIndex]; + + final int numMoved = this.mSize - pIndex - 1; + if(numMoved > 0) { + System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); + } + + this.mSize--; + + return oldValue; + } + + @Override + public int size() { + return this.mSize; + } + + @Override + public void clear() { + this.mSize = 0; + } + + @Override + public int[] toArray() { + final int[] array = new int[this.mSize]; + System.arraycopy(this.mItems, 0, array, 0, this.mSize); + return array ; + } + + // =========================================================== + // Methods + // =========================================================== + + private void ensureCapacity(final int pCapacity) { + final int currentCapacity = this.mItems.length; + if(currentCapacity < pCapacity) { + /* Increase array size. */ + final int newCapacity = ((currentCapacity * 3) >> 1) + 1; + final int newItems[] = new int[newCapacity]; + System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); + this.mItems = newItems; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/adt/list/LongArrayList.java b/src/org/andengine/util/adt/list/LongArrayList.java new file mode 100644 index 000000000..0871e5405 --- /dev/null +++ b/src/org/andengine/util/adt/list/LongArrayList.java @@ -0,0 +1,122 @@ +package org.andengine.util.adt.list; + +/** + * TODO This class could take some kind of AllocationStrategy object. + * + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 19:35:59 - 03.05.2012 + */ +public class LongArrayList implements ILongList { + // =========================================================== + // Constants + // =========================================================== + + private static final int CAPACITY_INITIAL_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private long[] mItems; + private int mSize; + + // =========================================================== + // Constructors + // =========================================================== + + public LongArrayList() { + this(LongArrayList.CAPACITY_INITIAL_DEFAULT); + } + + public LongArrayList(final int pInitialCapacity) { + this.mItems = new long[pInitialCapacity]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isEmpty() { + return this.mSize == 0; + } + + @Override + public float get(final int pIndex) throws ArrayIndexOutOfBoundsException { + return this.mItems[pIndex]; + } + + @Override + public void add(final long pItem) { + this.ensureCapacity(this.mSize + 1); + + this.mItems[this.mSize] = pItem; + this.mSize++; + } + + @Override + public void add(final int pIndex, final long pItem) throws ArrayIndexOutOfBoundsException { + this.ensureCapacity(this.mSize + 1); + + System.arraycopy(this.mItems, pIndex, this.mItems, pIndex + 1, this.mSize - pIndex); + + this.mItems[pIndex] = pItem; + this.mSize++; + } + + @Override + public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final float oldValue = this.mItems[pIndex]; + + final int numMoved = this.mSize - pIndex - 1; + if(numMoved > 0) { + System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); + } + + this.mSize--; + + return oldValue; + } + + @Override + public int size() { + return this.mSize; + } + + @Override + public void clear() { + this.mSize = 0; + } + + @Override + public long[] toArray() { + final long[] array = new long[this.mSize]; + System.arraycopy(this.mItems, 0, array, 0, this.mSize); + return array ; + } + + // =========================================================== + // Methods + // =========================================================== + + private void ensureCapacity(final int pCapacity) { + final int currentCapacity = this.mItems.length; + if(currentCapacity < pCapacity) { + /* Increase array size. */ + final int newCapacity = ((currentCapacity * 3) >> 1) + 1; + final long newItems[] = new long[newCapacity]; + System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); + this.mItems = newItems; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 7df8b2d2c1cfae064be3b781da168730bc0ac044 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 7 May 2012 18:43:02 -0700 Subject: [PATCH 037/252] Fixed surface/scene/camerascene conversions for the new coordinate system. --- src/org/andengine/engine/camera/Camera.java | 77 ++++++++++--------- .../entity/scene/menu/MenuScene.java | 14 ++-- src/org/andengine/input/touch/TouchEvent.java | 8 ++ 3 files changed, 55 insertions(+), 44 deletions(-) diff --git a/src/org/andengine/engine/camera/Camera.java b/src/org/andengine/engine/camera/Camera.java index 6627941a3..53e794c18 100644 --- a/src/org/andengine/engine/camera/Camera.java +++ b/src/org/andengine/engine/camera/Camera.java @@ -135,11 +135,11 @@ public float getHeight() { return this.mYMax - this.mYMin; } - public float getWidthRaw() { + public final float getCameraSceneWidth() { return this.mXMax - this.mXMin; } - public float getHeightRaw() { + public final float getCameraSceneHeight() { return this.mYMax - this.mYMin; } @@ -297,25 +297,25 @@ public void onApplySceneMatrix(final GLState pGLState) { } public void onApplySceneBackgroundMatrix(final GLState pGLState) { - final float widthRaw = this.getWidthRaw(); - final float heightRaw = this.getHeightRaw(); + final float cameraSceneWidth = this.getCameraSceneWidth(); + final float cameraSceneHeight = this.getCameraSceneHeight(); - pGLState.orthoProjectionGLMatrixf(0, widthRaw, 0, heightRaw, this.mZNear, this.mZFar); + pGLState.orthoProjectionGLMatrixf(0, cameraSceneWidth, 0, cameraSceneHeight, this.mZNear, this.mZFar); final float rotation = this.mRotation; if(rotation != 0) { - this.applyRotation(pGLState, widthRaw * 0.5f, heightRaw * 0.5f, rotation); + this.applyRotation(pGLState, cameraSceneWidth * 0.5f, cameraSceneHeight * 0.5f, rotation); } } public void onApplyCameraSceneMatrix(final GLState pGLState) { - final float widthRaw = this.getWidthRaw(); - final float heightRaw = this.getHeightRaw(); - pGLState.orthoProjectionGLMatrixf(0, widthRaw, 0, heightRaw, this.mZNear, this.mZFar); + final float cameraSceneWidth = this.getCameraSceneWidth(); + final float cameraSceneHeight = this.getCameraSceneHeight(); + pGLState.orthoProjectionGLMatrixf(0, cameraSceneWidth, 0, cameraSceneHeight, this.mZNear, this.mZFar); final float cameraSceneRotation = this.mCameraSceneRotation; if(cameraSceneRotation != 0) { - this.applyRotation(pGLState, widthRaw * 0.5f, heightRaw * 0.5f, cameraSceneRotation); + this.applyRotation(pGLState, cameraSceneWidth * 0.5f, cameraSceneHeight * 0.5f, cameraSceneRotation); } } @@ -396,17 +396,18 @@ protected void unapplySceneToCameraSceneOffset(final float[] pCameraSceneCoordin private void applySceneRotation(final float[] pCameraSceneCoordinates) { final float rotation = this.mRotation; if(rotation != 0) { - MathUtils.rotateAroundCenter(pCameraSceneCoordinates, -rotation, this.getCenterX(), this.getCenterY()); + MathUtils.rotateAroundCenter(pCameraSceneCoordinates, rotation, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! } } private void applySceneRotation(final TouchEvent pCameraSceneTouchEvent) { final float rotation = this.mRotation; + if(rotation != 0) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); - MathUtils.rotateAroundCenter(Camera.VERTICES_TMP, -rotation, this.getCenterX(), this.getCenterY()); + MathUtils.rotateAroundCenter(Camera.VERTICES_TMP, rotation, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! pCameraSceneTouchEvent.set(Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X], Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y]); } @@ -416,7 +417,7 @@ private void unapplySceneRotation(final float[] pSceneCoordinates) { final float rotation = this.mRotation; if(rotation != 0) { - MathUtils.revertRotateAroundCenter(pSceneCoordinates, rotation, this.getCenterX(), this.getCenterY()); + MathUtils.revertRotateAroundCenter(pSceneCoordinates, rotation, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! } } @@ -427,49 +428,49 @@ private void unapplySceneRotation(final TouchEvent pSceneTouchEvent) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); - MathUtils.revertRotateAroundCenter(Camera.VERTICES_TMP, rotation, this.getCenterX(), this.getCenterY()); + MathUtils.revertRotateAroundCenter(Camera.VERTICES_TMP, rotation, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! pSceneTouchEvent.set(Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X], Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y]); } } private void applyCameraSceneRotation(final float[] pSceneCoordinates) { - final float cameraSceneRotation = -this.mCameraSceneRotation; + final float cameraSceneRotation = this.mCameraSceneRotation; if(cameraSceneRotation != 0) { - MathUtils.rotateAroundCenter(pSceneCoordinates, cameraSceneRotation, (this.mXMax - this.mXMin) * 0.5f, (this.mYMax - this.mYMin) * 0.5f); + MathUtils.rotateAroundCenter(pSceneCoordinates, cameraSceneRotation, this.getCameraSceneWidth() * 0.5f, this.getCameraSceneHeight() * 0.5f); // TODO Use a Transformation object instead!?! } } private void applyCameraSceneRotation(final TouchEvent pSceneTouchEvent) { - final float cameraSceneRotation = -this.mCameraSceneRotation; + final float cameraSceneRotation = this.mCameraSceneRotation; if(cameraSceneRotation != 0) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); - MathUtils.rotateAroundCenter(Camera.VERTICES_TMP, cameraSceneRotation, (this.mXMax - this.mXMin) * 0.5f, (this.mYMax - this.mYMin) * 0.5f); + MathUtils.rotateAroundCenter(Camera.VERTICES_TMP, cameraSceneRotation, this.getCameraSceneWidth() * 0.5f, this.getCameraSceneHeight() * 0.5f); // TODO Use a Transformation object instead!?! pSceneTouchEvent.set(Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X], Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y]); } } private void unapplyCameraSceneRotation(final float[] pCameraSceneCoordinates) { - final float cameraSceneRotation = -this.mCameraSceneRotation; + final float cameraSceneRotation = this.mCameraSceneRotation; if(cameraSceneRotation != 0) { - MathUtils.revertRotateAroundCenter(pCameraSceneCoordinates, cameraSceneRotation, (this.mXMax - this.mXMin) * 0.5f, (this.mYMax - this.mYMin) * 0.5f); + MathUtils.revertRotateAroundCenter(pCameraSceneCoordinates, cameraSceneRotation, this.getCameraSceneWidth() * 0.5f, this.getCameraSceneHeight() * 0.5f); // TODO Use a Transformation object instead!?! } } private void unapplyCameraSceneRotation(final TouchEvent pCameraSceneTouchEvent) { - final float cameraSceneRotation = -this.mCameraSceneRotation; + final float cameraSceneRotation = this.mCameraSceneRotation; if(cameraSceneRotation != 0) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); - MathUtils.revertRotateAroundCenter(Camera.VERTICES_TMP, cameraSceneRotation, (this.mXMax - this.mXMin) * 0.5f, (this.mYMax - this.mYMin) * 0.5f); + MathUtils.revertRotateAroundCenter(Camera.VERTICES_TMP, cameraSceneRotation, this.getCameraSceneWidth() * 0.5f, this.getCameraSceneHeight() * 0.5f); // TODO Use a Transformation object instead!?! pCameraSceneTouchEvent.set(Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X], Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y]); } @@ -486,18 +487,18 @@ public void convertSurfaceToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, final float rotation = this.mRotation; if(rotation == 0) { relativeX = surfaceTouchEventX / pSurfaceWidth; - relativeY = surfaceTouchEventY / pSurfaceHeight; + relativeY = 1 - (surfaceTouchEventY / pSurfaceHeight); } else if(rotation == 180) { relativeX = 1 - (surfaceTouchEventX / pSurfaceWidth); - relativeY = 1 - (surfaceTouchEventY / pSurfaceHeight); + relativeY = surfaceTouchEventY / pSurfaceHeight; } else { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = surfaceTouchEventX; Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = surfaceTouchEventY; - MathUtils.rotateAroundCenter(Camera.VERTICES_TMP, rotation, pSurfaceWidth >> 1, pSurfaceHeight >> 1); + MathUtils.rotateAroundCenter(Camera.VERTICES_TMP, rotation, pSurfaceWidth >> 1, pSurfaceHeight >> 1); // TODO Use a Transformation object instead!?! relativeX = Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] / pSurfaceWidth; - relativeY = Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] / pSurfaceHeight; + relativeY = 1 - (Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] / pSurfaceHeight); } this.convertAxisAlignedSurfaceToSceneTouchEvent(pSurfaceTouchEvent, relativeX, relativeY); @@ -520,14 +521,14 @@ public void convertSceneToSurfaceTouchEvent(final TouchEvent pSceneTouchEvent, f final float rotation = this.mRotation; if(rotation == 0) { - /* Nothing to do. */ + pSceneTouchEvent.setY(pSurfaceHeight - pSceneTouchEvent.getY()); } else if(rotation == 180) { - pSceneTouchEvent.set(pSurfaceWidth - pSceneTouchEvent.getX(), pSurfaceHeight - pSceneTouchEvent.getY()); + pSceneTouchEvent.setX(pSurfaceWidth - pSceneTouchEvent.getX()); } else { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); - MathUtils.revertRotateAroundCenter(Camera.VERTICES_TMP, rotation, pSurfaceWidth >> 1, pSurfaceHeight >> 1); + MathUtils.revertRotateAroundCenter(Camera.VERTICES_TMP, -rotation, pSurfaceWidth >> 1, pSurfaceHeight >> 1); // TODO Use a Transformation object instead!?! pSceneTouchEvent.set(Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X], Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y]); } @@ -540,7 +541,7 @@ private void convertAxisAlignedSceneToSurfaceTouchEvent(final TouchEvent pSceneT final float yMax = this.getYMax(); final float relativeX = (pSceneTouchEvent.getX() - xMin) / (xMax - xMin); - final float relativeY = (pSceneTouchEvent.getY() - yMin) / (yMax - yMin); + final float relativeY = 1 - (pSceneTouchEvent.getY() - yMin) / (yMax - yMin); pSceneTouchEvent.set(relativeX * pSurfaceWidth, relativeY * pSurfaceHeight); } @@ -592,16 +593,16 @@ protected void onSurfaceSizeChanged(final int pOldSurfaceX, final int pOldSurfac final float centerX = this.getCenterX(); final float centerY = this.getCenterY(); - final float newWidthRaw = this.getWidthRaw() * surfaceWidthRatio; - final float newHeightRaw = this.getHeightRaw() * surfaceHeightRatio; + final float newWidth = (this.mXMax - this.mXMin) * surfaceWidthRatio; + final float newHeight = (this.mYMax - this.mYMin) * surfaceHeightRatio; - final float newWidthRawHalf = newWidthRaw * 0.5f; - final float newHeightRawHalf = newHeightRaw * 0.5f; + final float newWidthHalf = newWidth * 0.5f; + final float newHeightHalf = newHeight * 0.5f; - final float xMin = centerX - newWidthRawHalf; - final float yMin = centerY - newHeightRawHalf; - final float xMax = centerX + newWidthRawHalf; - final float yMax = centerY + newHeightRawHalf; + final float xMin = centerX - newWidthHalf; + final float yMin = centerY - newHeightHalf; + final float xMax = centerX + newWidthHalf; + final float yMax = centerY + newHeightHalf; this.set(xMin, yMin, xMax, yMax); } diff --git a/src/org/andengine/entity/scene/menu/MenuScene.java b/src/org/andengine/entity/scene/menu/MenuScene.java index 7de51199a..4ec4bf0d2 100644 --- a/src/org/andengine/entity/scene/menu/MenuScene.java +++ b/src/org/andengine/entity/scene/menu/MenuScene.java @@ -181,15 +181,17 @@ public void closeMenuScene() { public void buildAnimations() { this.prepareAnimations(); - final float cameraWidthRaw = this.mCamera.getWidthRaw(); - final float cameraHeightRaw = this.mCamera.getHeightRaw(); - this.mMenuAnimator.buildAnimations(this.mMenuItems, cameraWidthRaw, cameraHeightRaw); + final float cameraSceneWidth = this.mCamera.getCameraSceneWidth(); + final float cameraSceneHeight = this.mCamera.getCameraSceneHeight(); + + this.mMenuAnimator.buildAnimations(this.mMenuItems, cameraSceneWidth, cameraSceneHeight); } public void prepareAnimations() { - final float cameraWidthRaw = this.mCamera.getWidthRaw(); - final float cameraHeightRaw = this.mCamera.getHeightRaw(); - this.mMenuAnimator.prepareAnimations(this.mMenuItems, cameraWidthRaw, cameraHeightRaw); + final float cameraSceneWidth = this.mCamera.getCameraSceneWidth(); + final float cameraSceneHeight = this.mCamera.getCameraSceneHeight(); + + this.mMenuAnimator.prepareAnimations(this.mMenuItems, cameraSceneWidth, cameraSceneHeight); } // =========================================================== diff --git a/src/org/andengine/input/touch/TouchEvent.java b/src/org/andengine/input/touch/TouchEvent.java index a56be937c..00b26071b 100644 --- a/src/org/andengine/input/touch/TouchEvent.java +++ b/src/org/andengine/input/touch/TouchEvent.java @@ -77,6 +77,14 @@ public float getY() { return this.mY; } + public void setX(final float pX) { + this.mX = pX; + } + + public void setY(final float pY) { + this.mY = pY; + } + public void set(final float pX, final float pY) { this.mX = pX; this.mY = pY; From f7c42e2e533e7121fd139994afb1457d332e4c8f Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 8 May 2012 13:47:27 -0700 Subject: [PATCH 038/252] UpadteThread in Engine has to be started manually now (to avoid 'Starting a Thread in a Constructor' anti-pattern). --- src/org/andengine/engine/Engine.java | 3 +++ src/org/andengine/ui/activity/BaseGameActivity.java | 1 + 2 files changed, 4 insertions(+) diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index 3aafa8df5..4c7423f7a 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -172,6 +172,9 @@ public Engine(final EngineOptions pEngineOptions) { this.mUpdateThread = new UpdateThread(); } this.mUpdateThread.setEngine(this); + } + + public void startUpdateThread() throws IllegalThreadStateException { this.mUpdateThread.start(); } diff --git a/src/org/andengine/ui/activity/BaseGameActivity.java b/src/org/andengine/ui/activity/BaseGameActivity.java index 8d90fc6ed..1dea5af89 100644 --- a/src/org/andengine/ui/activity/BaseGameActivity.java +++ b/src/org/andengine/ui/activity/BaseGameActivity.java @@ -78,6 +78,7 @@ protected void onCreate(final Bundle pSavedInstanceState) { this.mGamePaused = true; this.mEngine = this.onCreateEngine(this.onCreateEngineOptions()); + this.mEngine.startUpdateThread(); this.applyEngineOptions(); From 1024e2afbd89368333c8d35d4601768bc6ed888e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 8 May 2012 14:10:10 -0700 Subject: [PATCH 039/252] Fixed BaseOnScreenControl on the recently flipped coordinate system. --- .../hud/controls/BaseOnScreenControl.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java index 43df2f888..ab37205d7 100644 --- a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java @@ -1,8 +1,5 @@ package org.andengine.engine.camera.hud.controls; -import static org.andengine.util.Constants.VERTEX_INDEX_X; -import static org.andengine.util.Constants.VERTEX_INDEX_Y; - import org.andengine.engine.camera.Camera; import org.andengine.engine.camera.hud.HUD; import org.andengine.engine.handler.timer.ITimerCallback; @@ -18,7 +15,7 @@ import android.view.MotionEvent; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich @@ -43,7 +40,7 @@ public abstract class BaseOnScreenControl extends HUD implements IOnSceneTouchLi private final IOnScreenControlListener mOnScreenControlListener; - private int mActivePointerID = INVALID_POINTER_ID; + private int mActivePointerID = BaseOnScreenControl.INVALID_POINTER_ID; // =========================================================== // Constructors @@ -76,7 +73,7 @@ public void onTimePassed(final TimerHandler pTimerHandler) { })); this.attachChild(this.mControlBase); - this.attachChild(this.mControlKnob); + this.mControlBase.attachChild(this.mControlKnob); this.setTouchAreaBindingOnActionDownEnabled(true); } @@ -110,7 +107,7 @@ public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouc switch(pSceneTouchEvent.getAction()) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: - this.mActivePointerID = INVALID_POINTER_ID; + this.mActivePointerID = BaseOnScreenControl.INVALID_POINTER_ID; } } return false; @@ -143,7 +140,7 @@ protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, switch(pSceneTouchEvent.getAction()) { case MotionEvent.ACTION_DOWN: - if(this.mActivePointerID == INVALID_POINTER_ID) { + if(this.mActivePointerID == BaseOnScreenControl.INVALID_POINTER_ID) { this.mActivePointerID = pointerID; this.updateControlKnob(pTouchAreaLocalX, pTouchAreaLocalY); return true; @@ -152,7 +149,7 @@ protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if(this.mActivePointerID == pointerID) { - this.mActivePointerID = INVALID_POINTER_ID; + this.mActivePointerID = BaseOnScreenControl.INVALID_POINTER_ID; this.onHandleControlKnobReleased(); return true; } @@ -170,15 +167,15 @@ protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, private void updateControlKnob(final float pTouchAreaLocalX, final float pTouchAreaLocalY) { final Sprite controlBase = this.mControlBase; - final float relativeX = MathUtils.bringToBounds(0, controlBase.getWidth(), pTouchAreaLocalX) / controlBase.getWidth() - 0.5f; - final float relativeY = MathUtils.bringToBounds(0, controlBase.getHeight(), pTouchAreaLocalY) / controlBase.getHeight() - 0.5f; + final float relativeX = (MathUtils.bringToBounds(0, controlBase.getWidth(), pTouchAreaLocalX) / controlBase.getWidth()) - 0.5f; + final float relativeY = (MathUtils.bringToBounds(0, controlBase.getHeight(), pTouchAreaLocalY) / controlBase.getHeight()) - 0.5f; this.onUpdateControlKnob(relativeX, relativeY); } /** - * @param pRelativeX from -0.5 (left) to 0.5 (right). - * @param pRelativeY from -0.5 (top) to 0.5 (bottom). + * @param pRelativeX from -0.5f (left) to 0.5 (right). + * @param pRelativeY from -0.5f (bottom) to 0.5f (top). */ protected void onUpdateControlKnob(final float pRelativeX, final float pRelativeY) { final Sprite controlBase = this.mControlBase; @@ -187,9 +184,8 @@ protected void onUpdateControlKnob(final float pRelativeX, final float pRelative this.mControlValueX = 2 * pRelativeX; this.mControlValueY = 2 * pRelativeY; - final float[] controlBaseSceneCenterCoordinates = controlBase.getSceneCenterCoordinates(); - final float x = controlBaseSceneCenterCoordinates[VERTEX_INDEX_X] - controlKnob.getWidth() * 0.5f + pRelativeX * controlBase.getWidthScaled(); - final float y = controlBaseSceneCenterCoordinates[VERTEX_INDEX_Y] - controlKnob.getHeight() * 0.5f + pRelativeY * controlBase.getHeightScaled(); + final float x = controlBase.getWidth() * (0.5f + pRelativeX); + final float y = controlBase.getHeight() * (0.5f + pRelativeY); controlKnob.setPosition(x, y); } From 8393c7c8318f4749acc9359577a46b44520affcc Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 9 May 2012 10:57:22 -0700 Subject: [PATCH 040/252] Reworked MenuScene framework (Added HorizontalAlign/VerticalAlign possibilities. Easier to add custom MenuSceneAnimators). Moved util.color and util.align packages to util.adt. --- src/org/andengine/entity/Entity.java | 40 ++-- src/org/andengine/entity/IEntity.java | 3 +- .../entity/modifier/ColorModifier.java | 2 +- .../entity/modifier/JumpModifier.java | 2 +- .../entity/modifier/MoveModifier.java | 12 +- .../entity/modifier/PathModifier.java | 2 +- .../initializer/ColorParticleInitializer.java | 2 +- .../andengine/entity/primitive/Gradient.java | 2 +- ...PerformanceGradientVertexBufferObject.java | 2 +- .../LowMemoryGradientVertexBufferObject.java | 2 +- .../andengine/entity/scene/CameraScene.java | 33 ++- src/org/andengine/entity/scene/Scene.java | 3 +- .../background/AutoParallaxBackground.java | 1 + .../entity/scene/background/Background.java | 2 +- .../entity/scene/background/IBackground.java | 2 +- .../scene/background/ParallaxBackground.java | 10 + .../modifier/ColorBackgroundModifier.java | 2 +- .../entity/scene/menu/MenuScene.java | 63 ++--- .../menu/animator/AlphaMenuAnimator.java | 127 ---------- .../menu/animator/AlphaMenuSceneAnimator.java | 99 ++++++++ .../scene/menu/animator/BaseMenuAnimator.java | 109 --------- .../menu/animator/DirectMenuAnimator.java | 98 -------- .../scene/menu/animator/IMenuAnimator.java | 27 --- .../menu/animator/IMenuSceneAnimator.java | 38 +++ .../menu/animator/MenuSceneAnimator.java | 219 ++++++++++++++++++ .../menu/animator/SlideMenuAnimator.java | 133 ----------- .../menu/animator/SlideMenuSceneAnimator.java | 168 ++++++++++++++ .../item/decorator/BaseMenuItemDecorator.java | 7 +- .../decorator/ColorMenuItemDecorator.java | 2 +- .../entity/sprite/batch/SpriteBatch.java | 2 +- src/org/andengine/entity/text/Text.java | 2 +- .../andengine/entity/text/TextOptions.java | 2 +- src/org/andengine/entity/text/TickerText.java | 2 +- ...HighPerformanceTextVertexBufferObject.java | 2 +- .../vbo/LowMemoryTextVertexBufferObject.java | 2 +- .../sensor/acceleration/AccelerationData.java | 8 +- src/org/andengine/opengl/font/Font.java | 2 +- .../andengine/opengl/font/FontFactory.java | 2 +- src/org/andengine/opengl/font/StrokeFont.java | 2 +- ...rKeyBitmapTextureAtlasSourceDecorator.java | 2 +- ...SwapBitmapTextureAtlasSourceDecorator.java | 2 +- .../opengl/texture/render/RenderTexture.java | 2 +- .../andengine/ui/activity/BaseActivity.java | 29 ++- src/org/andengine/util/ActivityUtils.java | 41 ++-- .../util/{ => adt}/align/HorizontalAlign.java | 2 +- .../util/{ => adt}/align/VerticalAlign.java | 2 +- .../andengine/util/{ => adt}/color/Color.java | 2 +- .../util/{ => adt}/color/ColorPool.java | 2 +- .../util/{ => adt}/color/ColorUtils.java | 2 +- .../color/constants/ColorConstants.java | 2 +- .../path => adt/spatial}/Direction.java | 26 +-- src/org/andengine/util/algorithm/Spiral.java | 2 +- .../andengine/util/algorithm/path/Path.java | 2 + 53 files changed, 737 insertions(+), 619 deletions(-) delete mode 100644 src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java create mode 100644 src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java delete mode 100644 src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java delete mode 100644 src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java delete mode 100644 src/org/andengine/entity/scene/menu/animator/IMenuAnimator.java create mode 100644 src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java create mode 100644 src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java delete mode 100644 src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java create mode 100644 src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java rename src/org/andengine/util/{ => adt}/align/HorizontalAlign.java (97%) rename src/org/andengine/util/{ => adt}/align/VerticalAlign.java (97%) rename src/org/andengine/util/{ => adt}/color/Color.java (99%) rename src/org/andengine/util/{ => adt}/color/ColorPool.java (97%) rename src/org/andengine/util/{ => adt}/color/ColorUtils.java (99%) rename src/org/andengine/util/{ => adt}/color/constants/ColorConstants.java (91%) rename src/org/andengine/util/{algorithm/path => adt/spatial}/Direction.java (96%) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 93fc24e5e..d5ba331e8 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -13,11 +13,11 @@ import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.util.GLState; import org.andengine.util.Constants; +import org.andengine.util.adt.color.Color; import org.andengine.util.adt.list.SmartList; import org.andengine.util.adt.transformation.Transformation; import org.andengine.util.algorithm.collision.EntityCollisionChecker; import org.andengine.util.call.ParameterCallable; -import org.andengine.util.color.Color; /** @@ -1042,6 +1042,13 @@ public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityMod return this.mEntityModifiers.removeAll(pEntityModifierMatcher); } + @Override + public void resetEntityModifiers() { + if(this.mEntityModifiers != null) { + this.mEntityModifiers.reset(); + } + } + @Override public void clearEntityModifiers() { if(this.mEntityModifiers == null) { @@ -1353,14 +1360,13 @@ public void reset() { this.mColor.reset(); - if(this.mEntityModifiers != null) { - this.mEntityModifiers.reset(); - } + this.resetEntityModifiers(); if(this.mChildren != null) { - final SmartList entities = this.mChildren; - for(int i = entities.size() - 1; i >= 0; i--) { - entities.get(i).reset(); + final SmartList children = this.mChildren; + for(int i = children.size() - 1; i >= 0; i--) { + final IEntity child = children.get(i); + child.reset(); } } } @@ -1395,11 +1401,16 @@ public void toString(final StringBuilder pStringBuilder) { pStringBuilder.append(this.getClass().getSimpleName()); if((this.mChildren != null) && (this.mChildren.size() > 0)) { + final SmartList children = this.mChildren; + pStringBuilder.append(" ["); - final SmartList entities = this.mChildren; - for(int i = 0; i < entities.size(); i++) { - entities.get(i).toString(pStringBuilder); - if(i < (entities.size() - 1)) { + + final int childCount = children.size(); + for(int i = 0; i < childCount; i++) { + final IEntity child = children.get(i); + child.toString(pStringBuilder); + + if(i < (childCount - 1)) { pStringBuilder.append(", "); } } @@ -1572,10 +1583,11 @@ protected void onManagedUpdate(final float pSecondsElapsed) { } if((this.mChildren != null) && !this.mChildrenIgnoreUpdate) { - final SmartList entities = this.mChildren; - final int entityCount = entities.size(); + final SmartList children = this.mChildren; + final int entityCount = children.size(); for(int i = 0; i < entityCount; i++) { - entities.get(i).onUpdate(pSecondsElapsed); + final IEntity child = children.get(i); + child.onUpdate(pSecondsElapsed); } } } diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index 70518c8e9..ba257987f 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -14,8 +14,8 @@ import org.andengine.entity.scene.ITouchArea; import org.andengine.entity.scene.Scene; import org.andengine.util.IDisposable; +import org.andengine.util.adt.color.Color; import org.andengine.util.adt.transformation.Transformation; -import org.andengine.util.color.Color; /** @@ -351,6 +351,7 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou public void registerEntityModifier(final IEntityModifier pEntityModifier); public boolean unregisterEntityModifier(final IEntityModifier pEntityModifier); public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityModifierMatcher); + public void resetEntityModifiers(); public void clearEntityModifiers(); public boolean isCullingEnabled(); diff --git a/src/org/andengine/entity/modifier/ColorModifier.java b/src/org/andengine/entity/modifier/ColorModifier.java index e230dcf76..e99a3d498 100644 --- a/src/org/andengine/entity/modifier/ColorModifier.java +++ b/src/org/andengine/entity/modifier/ColorModifier.java @@ -1,7 +1,7 @@ package org.andengine.entity.modifier; import org.andengine.entity.IEntity; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import org.andengine.util.modifier.ease.EaseLinear; import org.andengine.util.modifier.ease.IEaseFunction; diff --git a/src/org/andengine/entity/modifier/JumpModifier.java b/src/org/andengine/entity/modifier/JumpModifier.java index a98f444dd..36d9a2c49 100644 --- a/src/org/andengine/entity/modifier/JumpModifier.java +++ b/src/org/andengine/entity/modifier/JumpModifier.java @@ -57,7 +57,7 @@ public JumpModifier(final float pDuration, final float pFromX, final float pToX, } public JumpModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY, final float pJumpHeight, final int pJumpCount, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { - super(pDuration, pFromX, pToX, pFromY, pToY, pEntityModifierListener, pEaseFunction); + super(pDuration, pFromX, pFromY, pToX, pToY, pEntityModifierListener, pEaseFunction); this.mJumpHeight = pJumpHeight; this.mJumpCount = pJumpCount; diff --git a/src/org/andengine/entity/modifier/MoveModifier.java b/src/org/andengine/entity/modifier/MoveModifier.java index 6cd19afc0..cbf0212e2 100644 --- a/src/org/andengine/entity/modifier/MoveModifier.java +++ b/src/org/andengine/entity/modifier/MoveModifier.java @@ -24,19 +24,19 @@ public class MoveModifier extends DoubleValueSpanEntityModifier { // Constructors // =========================================================== - public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY) { - this(pDuration, pFromX, pToX, pFromY, pToY, null, EaseLinear.getInstance()); + public MoveModifier(final float pDuration, final float pFromX, final float pFromY, final float pToX, final float pToY) { + this(pDuration, pFromX, pFromY, pToX, pToY, null, EaseLinear.getInstance()); } - public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY, final IEaseFunction pEaseFunction) { - this(pDuration, pFromX, pToX, pFromY, pToY, null, pEaseFunction); + public MoveModifier(final float pDuration, final float pFromX, final float pFromY, final float pToX, final float pToY, final IEaseFunction pEaseFunction) { + this(pDuration, pFromX, pFromY, pToX, pToY, null, pEaseFunction); } - public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY, final IEntityModifierListener pEntityModifierListener) { + public MoveModifier(final float pDuration, final float pFromX, final float pFromY, final float pToX, final float pToY, final IEntityModifierListener pEntityModifierListener) { super(pDuration, pFromX, pToX, pFromY, pToY, pEntityModifierListener, EaseLinear.getInstance()); } - public MoveModifier(final float pDuration, final float pFromX, final float pToX, final float pFromY, final float pToY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { + public MoveModifier(final float pDuration, final float pFromX, final float pFromY, final float pToX, final float pToY, final IEntityModifierListener pEntityModifierListener, final IEaseFunction pEaseFunction) { super(pDuration, pFromX, pToX, pFromY, pToY, pEntityModifierListener, pEaseFunction); } diff --git a/src/org/andengine/entity/modifier/PathModifier.java b/src/org/andengine/entity/modifier/PathModifier.java index 453f7e0b1..9dd4b24ec 100644 --- a/src/org/andengine/entity/modifier/PathModifier.java +++ b/src/org/andengine/entity/modifier/PathModifier.java @@ -84,7 +84,7 @@ public PathModifier(final float pDuration, final Path pPath, final IEntityModifi final int modifierCount = moveModifiers.length; for(int i = 0; i < modifierCount; i++) { final float duration = pPath.getSegmentLength(i) / velocity; - moveModifiers[i] = new MoveModifier(duration, coordinatesX[i], coordinatesX[i + 1], coordinatesY[i], coordinatesY[i + 1], null, pEaseFunction); + moveModifiers[i] = new MoveModifier(duration, coordinatesX[i], coordinatesY[i], coordinatesX[i + 1], coordinatesY[i + 1], null, pEaseFunction); } /* Create a new SequenceModifier and register the listeners that diff --git a/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java b/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java index c9d7cae67..f552c7624 100644 --- a/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java @@ -2,7 +2,7 @@ import org.andengine.entity.IEntity; import org.andengine.entity.particle.Particle; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; /** diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index 479c9ea18..a6cdf43e0 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -12,7 +12,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttribute; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import org.andengine.util.math.MathUtils; import android.opengl.GLES20; diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java index cc788fd73..d45af09fb 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java @@ -5,7 +5,7 @@ import org.andengine.opengl.vbo.HighPerformanceVertexBufferObject; import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; -import org.andengine.util.color.ColorUtils; +import org.andengine.util.adt.color.ColorUtils; import org.andengine.util.math.MathConstants; import org.andengine.util.math.MathUtils; diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java index 178fc41f0..90ec45fd9 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java @@ -7,7 +7,7 @@ import org.andengine.opengl.vbo.LowMemoryVertexBufferObject; import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; -import org.andengine.util.color.ColorUtils; +import org.andengine.util.adt.color.ColorUtils; import org.andengine.util.math.MathConstants; import org.andengine.util.math.MathUtils; diff --git a/src/org/andengine/entity/scene/CameraScene.java b/src/org/andengine/entity/scene/CameraScene.java index 3e56b06ab..810b1b0c9 100644 --- a/src/org/andengine/entity/scene/CameraScene.java +++ b/src/org/andengine/entity/scene/CameraScene.java @@ -4,6 +4,7 @@ import org.andengine.entity.IEntity; import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.util.GLState; +import org.andengine.util.exception.MethodNotSupportedException; /** * (c) 2010 Nicolas Gramlich @@ -50,6 +51,31 @@ public void setCamera(final Camera pCamera) { this.mCamera = pCamera; } + @Override + public float getWidth() { + return this.mCamera.getCameraSceneWidth(); + } + + @Override + public float getHeight() { + return this.mCamera.getCameraSceneHeight(); + } + + @Override + public void setWidth(final float pWidth) { + throw new MethodNotSupportedException(); + } + + @Override + public void setHeight(final float pHeight) { + throw new MethodNotSupportedException(); + } + + @Override + public void setSize(final float pWidth, final float pHeight) { + throw new MethodNotSupportedException(); + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @@ -95,16 +121,15 @@ protected void onApplyMatrix(final GLState pGLState, final Camera pCamera) { // =========================================================== public void centerEntityInCamera(final IEntity pEntity) { - final Camera camera = this.mCamera; - pEntity.setPosition((camera.getWidth() - pEntity.getWidth()) * 0.5f, (camera.getHeight() - pEntity.getHeight()) * 0.5f); + pEntity.setPosition(this.mCamera.getCenterX(), this.mCamera.getCenterY()); } public void centerEntityInCameraHorizontally(final IEntity pEntity) { - pEntity.setPosition((this.mCamera.getWidth() - pEntity.getWidth()) * 0.5f, pEntity.getY()); + pEntity.setX(this.mCamera.getCenterX()); } public void centerEntityInCameraVertically(final IEntity pEntity) { - pEntity.setPosition(pEntity.getX(), (this.mCamera.getHeight() - pEntity.getHeight()) * 0.5f); + pEntity.setY(this.mCamera.getCenterY()); } // =========================================================== diff --git a/src/org/andengine/entity/scene/Scene.java b/src/org/andengine/entity/scene/Scene.java index f05966ea2..651be5288 100644 --- a/src/org/andengine/entity/scene/Scene.java +++ b/src/org/andengine/entity/scene/Scene.java @@ -4,7 +4,6 @@ import org.andengine.engine.handler.runnable.RunnableHandler; import org.andengine.entity.Entity; import org.andengine.entity.IEntity; -import org.andengine.entity.scene.ITouchArea.ITouchAreaMatcher; import org.andengine.entity.scene.background.Background; import org.andengine.entity.scene.background.IBackground; import org.andengine.entity.shape.IShape; @@ -12,8 +11,8 @@ import org.andengine.input.touch.TouchEvent; import org.andengine.opengl.util.GLState; import org.andengine.util.Constants; +import org.andengine.util.adt.color.Color; import org.andengine.util.adt.list.SmartList; -import org.andengine.util.color.Color; import android.util.SparseArray; diff --git a/src/org/andengine/entity/scene/background/AutoParallaxBackground.java b/src/org/andengine/entity/scene/background/AutoParallaxBackground.java index b1a997864..83d71855e 100644 --- a/src/org/andengine/entity/scene/background/AutoParallaxBackground.java +++ b/src/org/andengine/entity/scene/background/AutoParallaxBackground.java @@ -26,6 +26,7 @@ public class AutoParallaxBackground extends ParallaxBackground { public AutoParallaxBackground(final float pRed, final float pGreen, final float pBlue, final float pParallaxChangePerSecond) { super(pRed, pGreen, pBlue); + this.mParallaxChangePerSecond = pParallaxChangePerSecond; } diff --git a/src/org/andengine/entity/scene/background/Background.java b/src/org/andengine/entity/scene/background/Background.java index b023ab919..106bb3b66 100644 --- a/src/org/andengine/entity/scene/background/Background.java +++ b/src/org/andengine/entity/scene/background/Background.java @@ -2,7 +2,7 @@ import org.andengine.engine.camera.Camera; import org.andengine.opengl.util.GLState; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import org.andengine.util.modifier.IModifier; import org.andengine.util.modifier.ModifierList; diff --git a/src/org/andengine/entity/scene/background/IBackground.java b/src/org/andengine/entity/scene/background/IBackground.java index bce15fd9b..a4ebf6eeb 100644 --- a/src/org/andengine/entity/scene/background/IBackground.java +++ b/src/org/andengine/entity/scene/background/IBackground.java @@ -2,7 +2,7 @@ import org.andengine.engine.handler.IDrawHandler; import org.andengine.engine.handler.IUpdateHandler; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import org.andengine.util.modifier.IModifier; /** diff --git a/src/org/andengine/entity/scene/background/ParallaxBackground.java b/src/org/andengine/entity/scene/background/ParallaxBackground.java index 955def9ff..78d894336 100644 --- a/src/org/andengine/entity/scene/background/ParallaxBackground.java +++ b/src/org/andengine/entity/scene/background/ParallaxBackground.java @@ -5,6 +5,7 @@ import org.andengine.engine.camera.Camera; import org.andengine.entity.IEntity; import org.andengine.opengl.util.GLState; +import org.andengine.util.debug.Debug; /** * (c) 2010 Nicolas Gramlich @@ -100,6 +101,15 @@ public static class ParallaxEntity { public ParallaxEntity(final float pParallaxFactor, final IEntity pEntity) { this.mParallaxFactor = pParallaxFactor; this.mEntity = pEntity; + + // TODO Adjust onDraw calculations, so that these assumptions aren't necessary. + if(this.mEntity.getX() != 0) { + Debug.w("The X position of a " + this.getClass().getSimpleName() + " is expected to be 0."); + } + + if(this.mEntity.getOffsetCenterX() != 0) { + Debug.w("The OffsetCenterXposition of a " + this.getClass().getSimpleName() + " is expected to be 0."); + } } // =========================================================== diff --git a/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java index d59c046ef..b6e7a13e6 100644 --- a/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java @@ -1,7 +1,7 @@ package org.andengine.entity.scene.background.modifier; import org.andengine.entity.scene.background.IBackground; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import org.andengine.util.modifier.BaseTripleValueSpanModifier; import org.andengine.util.modifier.ease.EaseLinear; import org.andengine.util.modifier.ease.IEaseFunction; diff --git a/src/org/andengine/entity/scene/menu/MenuScene.java b/src/org/andengine/entity/scene/menu/MenuScene.java index 4ec4bf0d2..64087a999 100644 --- a/src/org/andengine/entity/scene/menu/MenuScene.java +++ b/src/org/andengine/entity/scene/menu/MenuScene.java @@ -8,14 +8,14 @@ import org.andengine.entity.scene.IOnSceneTouchListener; import org.andengine.entity.scene.ITouchArea; import org.andengine.entity.scene.Scene; -import org.andengine.entity.scene.menu.animator.IMenuAnimator; +import org.andengine.entity.scene.menu.animator.IMenuSceneAnimator; import org.andengine.entity.scene.menu.item.IMenuItem; import org.andengine.input.touch.TouchEvent; import android.view.MotionEvent; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich @@ -34,7 +34,7 @@ public class MenuScene extends CameraScene implements IOnAreaTouchListener, IOnS private IOnMenuItemClickListener mOnMenuItemClickListener; - private IMenuAnimator mMenuAnimator = IMenuAnimator.DEFAULT; + private IMenuSceneAnimator mMenuSceneAnimator = IMenuSceneAnimator.DEFAULT; private IMenuItem mSelectedMenuItem; @@ -56,6 +56,7 @@ public MenuScene(final Camera pCamera) { public MenuScene(final Camera pCamera, final IOnMenuItemClickListener pOnMenuItemClickListener) { super(pCamera); + this.mOnMenuItemClickListener = pOnMenuItemClickListener; this.setOnSceneTouchListener(this); this.setOnAreaTouchListener(this); @@ -73,6 +74,14 @@ public void setOnMenuItemClickListener(final IOnMenuItemClickListener pOnMenuIte this.mOnMenuItemClickListener = pOnMenuItemClickListener; } + public ArrayList getMenuItems() { + return this.mMenuItems; + } + + public IMenuItem getMenuItem(final int pIndex) { + return this.mMenuItems.get(pIndex); + } + public int getMenuItemCount() { return this.mMenuItems.size(); } @@ -93,7 +102,7 @@ public void setChildScene(final Scene pChildScene, final boolean pModalDraw, fin if(pChildScene instanceof MenuScene) { super.setChildScene(pChildScene, pModalDraw, pModalUpdate, pModalTouch); } else { - throw new IllegalArgumentException("MenuScene accepts only MenuScenes as a ChildScene."); + throw new IllegalArgumentException("A " + MenuScene.class.getSimpleName() + " accepts only " + MenuScene.class.getSimpleName() + " as a ChildScene."); } } @@ -105,8 +114,12 @@ public void clearChildScene() { } } - public void setMenuAnimator(final IMenuAnimator pMenuAnimator) { - this.mMenuAnimator = pMenuAnimator; + public IMenuSceneAnimator getMenuSceneAnimator() { + return this.mMenuSceneAnimator; + } + + public void setMenuSceneAnimator(final IMenuSceneAnimator pMenuSceneAnimator) { + this.mMenuSceneAnimator = pMenuSceneAnimator; } // =========================================================== @@ -120,7 +133,7 @@ public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea switch(pSceneTouchEvent.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: - if(this.mSelectedMenuItem != null && this.mSelectedMenuItem != menuItem) { + if((this.mSelectedMenuItem != null) && (this.mSelectedMenuItem != menuItem)) { this.mSelectedMenuItem.onUnselected(); } this.mSelectedMenuItem = menuItem; @@ -153,21 +166,25 @@ public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouc @Override public void back() { - super.back(); + this.back(true, true); + } - this.reset(); + public void back(final boolean pResetAnimations) { + this.back(pResetAnimations, true); } - @Override - public void reset() { - super.reset(); + public void back(final boolean pResetAnimations, final boolean pResetParentMenuSceneAnimations) { + super.back(); - final ArrayList menuItems = this.mMenuItems; - for(int i = menuItems.size() - 1; i >= 0; i--) { - menuItems.get(i).reset(); + if(pResetAnimations) { + this.resetAnimations(); } - this.prepareAnimations(); + if(pResetParentMenuSceneAnimations) { + if((this.mParentScene != null) && (this.mParentScene instanceof MenuScene)) { + ((MenuScene)this.mParentScene).resetAnimations(); + } + } } // =========================================================== @@ -179,19 +196,11 @@ public void closeMenuScene() { } public void buildAnimations() { - this.prepareAnimations(); - - final float cameraSceneWidth = this.mCamera.getCameraSceneWidth(); - final float cameraSceneHeight = this.mCamera.getCameraSceneHeight(); - - this.mMenuAnimator.buildAnimations(this.mMenuItems, cameraSceneWidth, cameraSceneHeight); + this.mMenuSceneAnimator.buildMenuSceneAnimations(this); } - public void prepareAnimations() { - final float cameraSceneWidth = this.mCamera.getCameraSceneWidth(); - final float cameraSceneHeight = this.mCamera.getCameraSceneHeight(); - - this.mMenuAnimator.prepareAnimations(this.mMenuItems, cameraSceneWidth, cameraSceneHeight); + public void resetAnimations() { + this.mMenuSceneAnimator.resetMenuSceneAnimations(this); } // =========================================================== diff --git a/src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java deleted file mode 100644 index 22109bd78..000000000 --- a/src/org/andengine/entity/scene/menu/animator/AlphaMenuAnimator.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.andengine.entity.scene.menu.animator; - -import java.util.ArrayList; - -import org.andengine.entity.modifier.AlphaModifier; -import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.align.HorizontalAlign; -import org.andengine.util.modifier.ease.IEaseFunction; - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 11:04:35 - 02.04.2010 - */ -public class AlphaMenuAnimator extends BaseMenuAnimator { - // =========================================================== - // Constants - // =========================================================== - - private static final float ALPHA_FROM = 0.0f; - private static final float ALPHA_TO = 1.0f; - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - public AlphaMenuAnimator(){ - super(); - } - - public AlphaMenuAnimator(final IEaseFunction pEaseFunction) { - super(pEaseFunction); - } - - public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign) { - super(pHorizontalAlign); - } - - public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign, final IEaseFunction pEaseFunction) { - super(pHorizontalAlign, pEaseFunction); - } - - public AlphaMenuAnimator(final float pMenuItemSpacing) { - super(pMenuItemSpacing); - } - - public AlphaMenuAnimator(final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { - super(pMenuItemSpacing, pEaseFunction); - } - - public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { - super(pHorizontalAlign, pMenuItemSpacing); - } - - public AlphaMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { - super(pHorizontalAlign, pMenuItemSpacing, pEaseFunction); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - @Override - public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { - final IEaseFunction easeFunction = this.mEaseFunction; - final int menuItemCount = pMenuItems.size(); - for(int i = menuItemCount - 1; i >= 0; i--) { - final AlphaModifier alphaModifier = new AlphaModifier(DURATION, ALPHA_FROM, ALPHA_TO, easeFunction); - alphaModifier.setAutoUnregisterWhenFinished(false); - pMenuItems.get(i).registerEntityModifier(alphaModifier); - } - } - - @Override - public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { - final float maximumWidth = this.getMaximumWidth(pMenuItems); - final float overallHeight = this.getOverallHeight(pMenuItems); - - final float baseX = (pCameraWidth - maximumWidth) * 0.5f; - final float baseY = (pCameraHeight - overallHeight) * 0.5f; - - final float menuItemSpacing = this.mMenuItemSpacing; - - float offsetY = 0; - final int menuItemCount = pMenuItems.size(); - for(int i = 0; i < menuItemCount; i++) { - final IMenuItem menuItem = pMenuItems.get(i); - - final float offsetX; - switch(this.mHorizontalAlign) { - case LEFT: - offsetX = 0; - break; - case RIGHT: - offsetX = maximumWidth - menuItem.getWidthScaled(); - break; - case CENTER: - default: - offsetX = (maximumWidth - menuItem.getWidthScaled()) * 0.5f; - break; - } - menuItem.setPosition(baseX + offsetX , baseY + offsetY); - - menuItem.setAlpha(ALPHA_FROM); - - offsetY += menuItem.getHeight() + menuItemSpacing; - } - } - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java new file mode 100644 index 000000000..c1e38d6d6 --- /dev/null +++ b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java @@ -0,0 +1,99 @@ +package org.andengine.entity.scene.menu.animator; + +import org.andengine.entity.modifier.AlphaModifier; +import org.andengine.entity.scene.menu.MenuScene; +import org.andengine.entity.scene.menu.item.IMenuItem; +import org.andengine.util.adt.align.HorizontalAlign; +import org.andengine.util.adt.align.VerticalAlign; +import org.andengine.util.modifier.ease.EaseLinear; +import org.andengine.util.modifier.ease.IEaseFunction; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 11:04:35 - 02.04.2010 + */ +public class AlphaMenuSceneAnimator extends MenuSceneAnimator { + // =========================================================== + // Constants + // =========================================================== + + private static final float DURATION = 1.0f; + private static final float ALPHA_FROM = 0.0f; + private static final float ALPHA_TO = 1.0f; + + private static final IEaseFunction EASEFUNCTION_DEFAULT = EaseLinear.getInstance(); + + // =========================================================== + // Fields + // =========================================================== + + private IEaseFunction mEaseFunction; + + // =========================================================== + // Constructors + // =========================================================== + + public AlphaMenuSceneAnimator(){ + this(AlphaMenuSceneAnimator.EASEFUNCTION_DEFAULT); + } + + public AlphaMenuSceneAnimator(final IEaseFunction pEaseFunction) { + super(); + + this.mEaseFunction = pEaseFunction; + } + + public AlphaMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign) { + this(pHorizontalAlign, pVerticalAlign, AlphaMenuSceneAnimator.EASEFUNCTION_DEFAULT); + } + + public AlphaMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign, final IEaseFunction pEaseFunction) { + super(pHorizontalAlign, pVerticalAlign); + + this.mEaseFunction = pEaseFunction; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public IEaseFunction getEaseFunction() { + return this.mEaseFunction; + } + + public void setEaseFunction(final IEaseFunction pEaseFunction) { + this.mEaseFunction = pEaseFunction; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + super.onMenuItemPositionBuilt(pMenuScene, pIndex, pMenuItem, pX, pY); + + final AlphaModifier alphaModifier = new AlphaModifier(AlphaMenuSceneAnimator.DURATION, AlphaMenuSceneAnimator.ALPHA_FROM, AlphaMenuSceneAnimator.ALPHA_TO, this.mEaseFunction); + alphaModifier.setAutoUnregisterWhenFinished(false); + pMenuItem.registerEntityModifier(alphaModifier); + } + + @Override + protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + super.onMenuItemPositionReset(pMenuScene, pIndex, pMenuItem, pX, pY); + + pMenuItem.resetEntityModifiers(); + pMenuItem.setAlpha(AlphaMenuSceneAnimator.ALPHA_FROM); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java deleted file mode 100644 index 6fe91137b..000000000 --- a/src/org/andengine/entity/scene/menu/animator/BaseMenuAnimator.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.andengine.entity.scene.menu.animator; - -import java.util.ArrayList; - -import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.align.HorizontalAlign; -import org.andengine.util.modifier.ease.EaseLinear; -import org.andengine.util.modifier.ease.IEaseFunction; - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 11:17:32 - 02.04.2010 - */ -public abstract class BaseMenuAnimator implements IMenuAnimator { - // =========================================================== - // Constants - // =========================================================== - - protected static final float DURATION = 1.0f; - - private static final float MENUITEMSPACING_DEFAULT = 1.0f; - - private static final HorizontalAlign HORIZONTALALIGN_DEFAULT = HorizontalAlign.CENTER; - - // =========================================================== - // Fields - // =========================================================== - - protected final float mMenuItemSpacing; - protected final HorizontalAlign mHorizontalAlign; - protected final IEaseFunction mEaseFunction; - - // =========================================================== - // Constructors - // =========================================================== - - public BaseMenuAnimator() { - this(MENUITEMSPACING_DEFAULT); - } - - public BaseMenuAnimator(final IEaseFunction pEaseFunction) { - this(MENUITEMSPACING_DEFAULT, pEaseFunction); - } - - public BaseMenuAnimator(final float pMenuItemSpacing) { - this(HORIZONTALALIGN_DEFAULT, pMenuItemSpacing); - } - - public BaseMenuAnimator(final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { - this(HORIZONTALALIGN_DEFAULT, pMenuItemSpacing, pEaseFunction); - } - - public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign) { - this(pHorizontalAlign, MENUITEMSPACING_DEFAULT); - } - - public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign, final IEaseFunction pEaseFunction) { - this(pHorizontalAlign, MENUITEMSPACING_DEFAULT, pEaseFunction); - } - - public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { - this(pHorizontalAlign, pMenuItemSpacing, EaseLinear.getInstance()); - } - - public BaseMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { - this.mHorizontalAlign = pHorizontalAlign; - this.mMenuItemSpacing = pMenuItemSpacing; - this.mEaseFunction = pEaseFunction; - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - protected float getMaximumWidth(final ArrayList pMenuItems) { - float maximumWidth = Float.MIN_VALUE; - for(int i = pMenuItems.size() - 1; i >= 0; i--) { - final IMenuItem menuItem = pMenuItems.get(i); - maximumWidth = Math.max(maximumWidth, menuItem.getWidthScaled()); - } - return maximumWidth; - } - - protected float getOverallHeight(final ArrayList pMenuItems) { - float overallHeight = 0; - for(int i = pMenuItems.size() - 1; i >= 0; i--) { - final IMenuItem menuItem = pMenuItems.get(i); - overallHeight += menuItem.getHeight(); - } - - overallHeight += (pMenuItems.size() - 1) * this.mMenuItemSpacing; - return overallHeight; - } - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java deleted file mode 100644 index bc54dcc9e..000000000 --- a/src/org/andengine/entity/scene/menu/animator/DirectMenuAnimator.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.andengine.entity.scene.menu.animator; - -import java.util.ArrayList; - -import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.align.HorizontalAlign; - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 10:46:34 - 14.05.2010 - */ -public class DirectMenuAnimator extends BaseMenuAnimator { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - public DirectMenuAnimator(){ - super(); - } - - public DirectMenuAnimator(final HorizontalAlign pHorizontalAlign) { - super(pHorizontalAlign); - } - - public DirectMenuAnimator(final float pMenuItemSpacing) { - super(pMenuItemSpacing); - } - - public DirectMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { - super(pHorizontalAlign, pMenuItemSpacing); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - @Override - public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { - - } - - @Override - public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { - final float maximumWidth = this.getMaximumWidth(pMenuItems); - final float overallHeight = this.getOverallHeight(pMenuItems); - - final float baseX = (pCameraWidth - maximumWidth) * 0.5f; - final float baseY = (pCameraHeight - overallHeight) * 0.5f; - - final float menuItemSpacing = this.mMenuItemSpacing; - - float offsetY = 0; - final int menuItemCount = pMenuItems.size(); - for(int i = 0; i < menuItemCount; i++) { - final IMenuItem menuItem = pMenuItems.get(i); - - final float offsetX; - switch(this.mHorizontalAlign) { - case LEFT: - offsetX = 0; - break; - case RIGHT: - offsetX = maximumWidth - menuItem.getWidthScaled(); - break; - case CENTER: - default: - offsetX = (maximumWidth - menuItem.getWidthScaled()) * 0.5f; - break; - } - menuItem.setPosition(baseX + offsetX , baseY + offsetY); - - offsetY += menuItem.getHeight() + menuItemSpacing; - } - } - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/entity/scene/menu/animator/IMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/IMenuAnimator.java deleted file mode 100644 index f9cb8df6e..000000000 --- a/src/org/andengine/entity/scene/menu/animator/IMenuAnimator.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.andengine.entity.scene.menu.animator; - -import java.util.ArrayList; - -import org.andengine.entity.scene.menu.item.IMenuItem; - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 10:50:36 - 02.04.2010 - */ -public interface IMenuAnimator { - // =========================================================== - // Constants - // =========================================================== - - public static final IMenuAnimator DEFAULT = new AlphaMenuAnimator(); - - // =========================================================== - // Methods - // =========================================================== - - public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight); - public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight); -} diff --git a/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java new file mode 100644 index 000000000..d8b5609e8 --- /dev/null +++ b/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java @@ -0,0 +1,38 @@ +package org.andengine.entity.scene.menu.animator; + +import org.andengine.entity.scene.menu.MenuScene; +import org.andengine.util.adt.align.HorizontalAlign; +import org.andengine.util.adt.align.VerticalAlign; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 10:50:36 - 02.04.2010 + */ +public interface IMenuSceneAnimator { + // =========================================================== + // Constants + // =========================================================== + + public static final IMenuSceneAnimator DEFAULT = new AlphaMenuSceneAnimator(); + + // =========================================================== + // Methods + // =========================================================== + + public float getOffsetX(); + public void setOffsetX(final float pOffsetX); + public float getOffsetY(); + public void setOffsetY(final float pOffsetY); + public float getMenuItemSpacing(); + public void setMenuItemSpacing(final float pMenuItemSpacing); + public HorizontalAlign getHorizontalAlign(); + public void setHorizontalAlign(final HorizontalAlign pHorizontalAlign); + public VerticalAlign getVerticalAlign(); + public void setVerticalAlign(final VerticalAlign pVerticalAlign); + + public void buildMenuSceneAnimations(final MenuScene pMenuScene); + public void resetMenuSceneAnimations(final MenuScene pMenuScene); +} diff --git a/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java new file mode 100644 index 000000000..bd546a533 --- /dev/null +++ b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java @@ -0,0 +1,219 @@ +package org.andengine.entity.scene.menu.animator; + +import org.andengine.entity.scene.menu.MenuScene; +import org.andengine.entity.scene.menu.item.IMenuItem; +import org.andengine.util.adt.align.HorizontalAlign; +import org.andengine.util.adt.align.VerticalAlign; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 11:17:32 - 02.04.2010 + */ +public class MenuSceneAnimator implements IMenuSceneAnimator { + // =========================================================== + // Constants + // =========================================================== + + private static final HorizontalAlign HORIZONTALALIGN_DEFAULT = HorizontalAlign.CENTER; + private static final VerticalAlign VERTICALALIGN_DEFAULT = VerticalAlign.CENTER; + private static final float SPACING_DEFAULT = 1.0f; + private static final float OFFSET_X_DEFAULT = 0.0f; + private static final float OFFSET_Y_DEFAULT = 0.0f; + + // =========================================================== + // Fields + // =========================================================== + + protected HorizontalAlign mHorizontalAlign; + protected VerticalAlign mVerticalAlign; + + protected float mOffsetX = MenuSceneAnimator.OFFSET_X_DEFAULT; + protected float mOffsetY = MenuSceneAnimator.OFFSET_Y_DEFAULT; + + protected float mMenuItemSpacing = MenuSceneAnimator.SPACING_DEFAULT; + protected float mOverallHeight; + + // =========================================================== + // Constructors + // =========================================================== + + public MenuSceneAnimator() { + this(MenuSceneAnimator.HORIZONTALALIGN_DEFAULT, MenuSceneAnimator.VERTICALALIGN_DEFAULT); + } + + public MenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign) { + this.mHorizontalAlign = pHorizontalAlign; + this.mVerticalAlign = pVerticalAlign; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + @Override + public float getOffsetX() { + return this.mOffsetX; + } + + @Override + public void setOffsetX(final float pOffsetX) { + this.mOffsetX = pOffsetX; + } + + @Override + public float getOffsetY() { + return this.mOffsetY; + } + + @Override + public void setOffsetY(final float pOffsetY) { + this.mOffsetY = pOffsetY; + } + + @Override + public float getMenuItemSpacing() { + return this.mMenuItemSpacing; + } + + @Override + public void setMenuItemSpacing(final float pMenuItemSpacing) { + this.mMenuItemSpacing = pMenuItemSpacing; + } + + @Override + public HorizontalAlign getHorizontalAlign() { + return this.mHorizontalAlign; + } + + @Override + public void setHorizontalAlign(final HorizontalAlign pHorizontalAlign) { + this.mHorizontalAlign = pHorizontalAlign; + } + + @Override + public VerticalAlign getVerticalAlign() { + return this.mVerticalAlign; + } + + @Override + public void setVerticalAlign(final VerticalAlign pVerticalAlign) { + this.mVerticalAlign = pVerticalAlign; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void buildMenuSceneAnimations(final MenuScene pMenuScene) { + this.updateOverallHeight(pMenuScene); + + final int menuItemCount = pMenuScene.getMenuItemCount(); + + for(int i = 0; i < menuItemCount; i++) { + final IMenuItem menuItem = pMenuScene.getMenuItem(i); + + final float x = this.getMenuItemX(pMenuScene, i); + final float y = this.getMenuItemY(pMenuScene, i); + this.onMenuItemPositionBuilt(pMenuScene, i, menuItem, x, y); + } + } + + protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + pMenuItem.setPosition(pX, pY); + } + + @Override + public void resetMenuSceneAnimations(final MenuScene pMenuScene) { + final int menuItemCount = pMenuScene.getMenuItemCount(); + + for(int i = 0; i < menuItemCount; i++) { + final IMenuItem menuItem = pMenuScene.getMenuItem(i); + + final float x = this.getMenuItemX(pMenuScene, i); + final float y = this.getMenuItemY(pMenuScene, i); + this.onMenuItemPositionReset(pMenuScene, i, menuItem, x, y); + } + } + + protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + pMenuItem.setPosition(pX, pY); + } + + // =========================================================== + // Methods + // =========================================================== + + protected float getMenuItemX(final MenuScene pMenuScene, final int pIndex) { + final float menuSceneWidth = pMenuScene.getWidth(); + + final IMenuItem menuItem = pMenuScene.getMenuItem(pIndex); + final float menuItemWidth = menuItem.getWidth(); + + /* Determine horizontal position. */ + final float x; + switch(this.mHorizontalAlign) { + case LEFT: + x = menuItemWidth * 0.5f; + break; + case CENTER: + x = menuSceneWidth * 0.5f; + break; + case RIGHT: + x = menuSceneWidth - (menuItemWidth * 0.5f); + break; + default: + throw new IllegalArgumentException("Unexpected " + HorizontalAlign.class.getSimpleName() + " with value: '" + this.mHorizontalAlign + "'."); + } + + return x + this.mOffsetX; + } + + protected float getMenuItemY(final MenuScene pMenuScene, final int pIndex) { + final float menuSceneHeight = pMenuScene.getHeight(); + + final IMenuItem menuItem = pMenuScene.getMenuItem(pIndex); + + /* Prepare vertical position. */ + float baseY; + switch(this.mVerticalAlign) { + case TOP: + baseY = menuSceneHeight; + break; + case CENTER: + baseY = (0.5f * menuSceneHeight) + (this.mOverallHeight * 0.5f); + break; + case BOTTOM: + baseY = this.mOverallHeight; + break; + default: + throw new IllegalArgumentException("Unexpected " + VerticalAlign.class.getSimpleName() + " with value: '" + this.mVerticalAlign + "'."); + } + + final float menuItemHeight = menuItem.getHeight(); + + /* Determine vertical position. */ + final float y = baseY - (menuItemHeight * 0.5f) - (pIndex * (menuItemHeight + this.mMenuItemSpacing)); + + return y + this.mOffsetY; + } + + private void updateOverallHeight(final MenuScene pMenuScene) { + final int menuItemCount = pMenuScene.getMenuItemCount(); + + float overallHeight = 0; + for(int i = menuItemCount - 1; i >= 0; i--) { + final IMenuItem menuItem = pMenuScene.getMenuItem(i); + overallHeight += menuItem.getHeight(); + } + + this.mOverallHeight = overallHeight + ((menuItemCount - 1) * this.mMenuItemSpacing); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java b/src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java deleted file mode 100644 index cab8ad32b..000000000 --- a/src/org/andengine/entity/scene/menu/animator/SlideMenuAnimator.java +++ /dev/null @@ -1,133 +0,0 @@ -package org.andengine.entity.scene.menu.animator; - -import java.util.ArrayList; - -import org.andengine.entity.modifier.MoveModifier; -import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.align.HorizontalAlign; -import org.andengine.util.modifier.ease.IEaseFunction; - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 11:04:35 - 02.04.2010 - */ -public class SlideMenuAnimator extends BaseMenuAnimator { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - public SlideMenuAnimator(){ - super(); - } - - public SlideMenuAnimator(final IEaseFunction pEaseFunction) { - super(pEaseFunction); - } - - public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign) { - super(pHorizontalAlign); - } - - public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign, final IEaseFunction pEaseFunction) { - super(pHorizontalAlign, pEaseFunction); - } - - public SlideMenuAnimator(final float pMenuItemSpacing) { - super(pMenuItemSpacing); - } - - public SlideMenuAnimator(final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { - super(pMenuItemSpacing, pEaseFunction); - } - - public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing) { - super(pHorizontalAlign, pMenuItemSpacing); - } - - public SlideMenuAnimator(final HorizontalAlign pHorizontalAlign, final float pMenuItemSpacing, final IEaseFunction pEaseFunction) { - super(pHorizontalAlign, pMenuItemSpacing, pEaseFunction); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - @Override - public void buildAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { - final IEaseFunction easeFunction = this.mEaseFunction; - final float maximumWidth = this.getMaximumWidth(pMenuItems); - final float overallHeight = this.getOverallHeight(pMenuItems); - - final float baseX = (pCameraWidth - maximumWidth) * 0.5f; - final float baseY = (pCameraHeight - overallHeight) * 0.5f; - - float offsetY = 0; - final int menuItemCount = pMenuItems.size(); - for(int i = 0; i < menuItemCount; i++) { - final IMenuItem menuItem = pMenuItems.get(i); - - final float offsetX; - switch(this.mHorizontalAlign) { - case LEFT: - offsetX = 0; - break; - case RIGHT: - offsetX = maximumWidth - menuItem.getWidthScaled(); - break; - case CENTER: - default: - offsetX = (maximumWidth - menuItem.getWidthScaled()) * 0.5f; - break; - } - - final MoveModifier moveModifier = new MoveModifier(DURATION, -maximumWidth, baseX + offsetX, baseY + offsetY, baseY + offsetY, easeFunction); - moveModifier.setAutoUnregisterWhenFinished(false); - menuItem.registerEntityModifier(moveModifier); - - offsetY += menuItem.getHeight() + this.mMenuItemSpacing; - } - } - - @Override - public void prepareAnimations(final ArrayList pMenuItems, final float pCameraWidth, final float pCameraHeight) { - final float maximumWidth = this.getMaximumWidth(pMenuItems); - final float overallHeight = this.getOverallHeight(pMenuItems); - - final float baseY = (pCameraHeight - overallHeight) * 0.5f; - - final float menuItemSpacing = this.mMenuItemSpacing; - - float offsetY = 0; - final int menuItemCount = pMenuItems.size(); - for(int i = 0; i < menuItemCount; i++) { - final IMenuItem menuItem = pMenuItems.get(i); - - menuItem.setPosition(-maximumWidth, baseY + offsetY); - - offsetY += menuItem.getHeight() + menuItemSpacing; - } - } - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java new file mode 100644 index 000000000..168d1b7d3 --- /dev/null +++ b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java @@ -0,0 +1,168 @@ +package org.andengine.entity.scene.menu.animator; + +import org.andengine.entity.modifier.MoveModifier; +import org.andengine.entity.scene.menu.MenuScene; +import org.andengine.entity.scene.menu.item.IMenuItem; +import org.andengine.util.adt.align.HorizontalAlign; +import org.andengine.util.adt.align.VerticalAlign; +import org.andengine.util.adt.spatial.Direction; +import org.andengine.util.modifier.ease.EaseLinear; +import org.andengine.util.modifier.ease.IEaseFunction; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 11:04:35 - 02.04.2010 + */ +public class SlideMenuSceneAnimator extends MenuSceneAnimator { + // =========================================================== + // Constants + // =========================================================== + + private static final float DURATION = 1.0f; + + private static final IEaseFunction EASEFUNCTION_DEFAULT = EaseLinear.getInstance(); + + private static final Direction DIRECTION_DEFAULT = Direction.RIGHT; + + // =========================================================== + // Fields + // =========================================================== + + private IEaseFunction mEaseFunction; + private Direction mDirection; + + // =========================================================== + // Constructors + // =========================================================== + + public SlideMenuSceneAnimator() { + this(SlideMenuSceneAnimator.DIRECTION_DEFAULT, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); + } + + public SlideMenuSceneAnimator(final IEaseFunction pEaseFunction) { + this(SlideMenuSceneAnimator.DIRECTION_DEFAULT, pEaseFunction); + } + + public SlideMenuSceneAnimator(final Direction pDirection) { + this(pDirection, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); + } + + public SlideMenuSceneAnimator(final Direction pDirection, final IEaseFunction pEaseFunction) { + super(); + + this.mDirection = pDirection; + this.mEaseFunction = pEaseFunction; + } + + public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign) { + this(pHorizontalAlign, pVerticalAlign, SlideMenuSceneAnimator.DIRECTION_DEFAULT, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); + } + + public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign, final IEaseFunction pEaseFunction) { + this(pHorizontalAlign, pVerticalAlign, SlideMenuSceneAnimator.DIRECTION_DEFAULT, pEaseFunction); + } + + public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign, final Direction pDirection) { + this(pHorizontalAlign, pVerticalAlign, pDirection, SlideMenuSceneAnimator.EASEFUNCTION_DEFAULT); + } + + public SlideMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign, final Direction pDirection, final IEaseFunction pEaseFunction) { + super(pHorizontalAlign, pVerticalAlign); + + this.mDirection = pDirection; + this.mEaseFunction = pEaseFunction; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public IEaseFunction getEaseFunction() { + return this.mEaseFunction; + } + + public void setEaseFunction(final IEaseFunction pEaseFunction) { + this.mEaseFunction = pEaseFunction; + } + + public Direction getDirection() { + return this.mDirection; + } + + public void setDirection(final Direction pDirection) { + this.mDirection = pDirection; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + final float fromX = getFromX(pMenuScene, pMenuItem, pX); + final float fromY = getFromY(pMenuScene, pMenuItem, pY); + + super.onMenuItemPositionBuilt(pMenuScene, pIndex, pMenuItem, fromX, fromY); + + final MoveModifier moveModifier = new MoveModifier(SlideMenuSceneAnimator.DURATION, fromX, fromY, pX, pY, this.mEaseFunction); + moveModifier.setAutoUnregisterWhenFinished(false); + pMenuItem.registerEntityModifier(moveModifier); + } + + @Override + protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + final float fromX = getFromX(pMenuScene, pMenuItem, pX); + final float fromY = getFromY(pMenuScene, pMenuItem, pY); + + super.onMenuItemPositionReset(pMenuScene, pIndex, pMenuItem, fromX, fromY); + + pMenuItem.resetEntityModifiers(); + } + + // =========================================================== + // Methods + // =========================================================== + + protected float getFromX(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pX) { + switch(this.mDirection) { + case UP: + case DOWN: + return pX; + case DOWN_LEFT: + case UP_LEFT: + case LEFT: + return pMenuScene.getWidth() + (pMenuItem.getWidth() * 0.5f); + case DOWN_RIGHT: + case UP_RIGHT: + case RIGHT: + return -(pMenuItem.getWidth() * 0.5f); + default: + throw new IllegalArgumentException(); + } + } + + protected float getFromY(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pY) { + switch(this.mDirection) { + case DOWN_LEFT: + case DOWN: + case DOWN_RIGHT: + return pMenuScene.getHeight() + (pMenuItem.getHeight() * 0.5f); + case LEFT: + case RIGHT: + return pY; + case UP_LEFT: + case UP: + case UP_RIGHT: + return -(pMenuItem.getHeight() * 0.5f); + default: + throw new IllegalArgumentException(); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index d88541908..2bce65e5f 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -17,8 +17,8 @@ import org.andengine.opengl.util.GLState; import org.andengine.opengl.vbo.IVertexBufferObject; import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.util.adt.color.Color; import org.andengine.util.adt.transformation.Transformation; -import org.andengine.util.color.Color; /** * I HATE THIS CLASS! @@ -459,6 +459,11 @@ public void clearEntityModifiers() { this.mMenuItem.clearEntityModifiers(); } + @Override + public void resetEntityModifiers() { + this.mMenuItem.resetEntityModifiers(); + } + @Override public boolean isBlendingEnabled() { return this.mMenuItem.isBlendingEnabled(); diff --git a/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java index 05b0f7fe1..1187d8c67 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java @@ -1,7 +1,7 @@ package org.andengine.entity.scene.menu.item.decorator; import org.andengine.entity.scene.menu.item.IMenuItem; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/entity/sprite/batch/SpriteBatch.java b/src/org/andengine/entity/sprite/batch/SpriteBatch.java index 86bfa793a..220816887 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/SpriteBatch.java @@ -16,8 +16,8 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; +import org.andengine.util.adt.color.ColorUtils; import org.andengine.util.adt.transformation.Transformation; -import org.andengine.util.color.ColorUtils; import android.opengl.GLES20; diff --git a/src/org/andengine/entity/text/Text.java b/src/org/andengine/entity/text/Text.java index 85731b76a..9ad0db184 100644 --- a/src/org/andengine/entity/text/Text.java +++ b/src/org/andengine/entity/text/Text.java @@ -18,9 +18,9 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; import org.andengine.util.adt.DataConstants; +import org.andengine.util.adt.align.HorizontalAlign; import org.andengine.util.adt.list.FloatArrayList; import org.andengine.util.adt.list.IFloatList; -import org.andengine.util.align.HorizontalAlign; import android.opengl.GLES20; diff --git a/src/org/andengine/entity/text/TextOptions.java b/src/org/andengine/entity/text/TextOptions.java index 9c73ee2b0..c57b8ddad 100644 --- a/src/org/andengine/entity/text/TextOptions.java +++ b/src/org/andengine/entity/text/TextOptions.java @@ -1,6 +1,6 @@ package org.andengine.entity.text; -import org.andengine.util.align.HorizontalAlign; +import org.andengine.util.adt.align.HorizontalAlign; /** * (c) Zynga 2012 diff --git a/src/org/andengine/entity/text/TickerText.java b/src/org/andengine/entity/text/TickerText.java index b6511f0ff..8c21394ec 100644 --- a/src/org/andengine/entity/text/TickerText.java +++ b/src/org/andengine/entity/text/TickerText.java @@ -5,7 +5,7 @@ import org.andengine.opengl.font.IFont; import org.andengine.opengl.util.GLState; import org.andengine.opengl.vbo.VertexBufferObjectManager; -import org.andengine.util.align.HorizontalAlign; +import org.andengine.util.adt.align.HorizontalAlign; import android.opengl.GLES20; diff --git a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java index 719c59af3..9d732736d 100644 --- a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java @@ -9,8 +9,8 @@ import org.andengine.opengl.vbo.HighPerformanceVertexBufferObject; import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; +import org.andengine.util.adt.align.HorizontalAlign; import org.andengine.util.adt.list.IFloatList; -import org.andengine.util.align.HorizontalAlign; /** * (c) Zynga 2012 diff --git a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java index 5b1ebe73d..3dc1d2416 100644 --- a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java @@ -10,8 +10,8 @@ import org.andengine.opengl.vbo.LowMemoryVertexBufferObject; import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; +import org.andengine.util.adt.align.HorizontalAlign; import org.andengine.util.adt.list.IFloatList; -import org.andengine.util.align.HorizontalAlign; /** * (c) Zynga 2012 diff --git a/src/org/andengine/input/sensor/acceleration/AccelerationData.java b/src/org/andengine/input/sensor/acceleration/AccelerationData.java index 61392a73b..042024ba8 100644 --- a/src/org/andengine/input/sensor/acceleration/AccelerationData.java +++ b/src/org/andengine/input/sensor/acceleration/AccelerationData.java @@ -26,7 +26,7 @@ public class AccelerationData extends BaseSensorData { @Override public void swapAxis(final float[] pValues) { final float x = -pValues[SensorManager.DATA_X]; - final float y = pValues[SensorManager.DATA_Y]; + final float y = -pValues[SensorManager.DATA_Y]; pValues[SensorManager.DATA_X] = x; pValues[SensorManager.DATA_Y] = y; } @@ -36,7 +36,7 @@ public void swapAxis(final float[] pValues) { @Override public void swapAxis(final float[] pValues) { final float x = pValues[SensorManager.DATA_Y]; - final float y = pValues[SensorManager.DATA_X]; + final float y = -pValues[SensorManager.DATA_X]; pValues[SensorManager.DATA_X] = x; pValues[SensorManager.DATA_Y] = y; } @@ -46,7 +46,7 @@ public void swapAxis(final float[] pValues) { @Override public void swapAxis(final float[] pValues) { final float x = pValues[SensorManager.DATA_X]; - final float y = -pValues[SensorManager.DATA_Y]; + final float y = pValues[SensorManager.DATA_Y]; pValues[SensorManager.DATA_X] = x; pValues[SensorManager.DATA_Y] = y; } @@ -56,7 +56,7 @@ public void swapAxis(final float[] pValues) { @Override public void swapAxis(final float[] pValues) { final float x = -pValues[SensorManager.DATA_Y]; - final float y = -pValues[SensorManager.DATA_X]; + final float y = pValues[SensorManager.DATA_X]; pValues[SensorManager.DATA_X] = x; pValues[SensorManager.DATA_Y] = y; } diff --git a/src/org/andengine/opengl/font/Font.java b/src/org/andengine/opengl/font/Font.java index d5c4c4759..59a2e5de0 100644 --- a/src/org/andengine/opengl/font/Font.java +++ b/src/org/andengine/opengl/font/Font.java @@ -6,8 +6,8 @@ import org.andengine.opengl.texture.ITexture; import org.andengine.opengl.texture.PixelFormat; import org.andengine.opengl.util.GLState; +import org.andengine.util.adt.color.Color; import org.andengine.util.adt.map.SparseArrayUtils; -import org.andengine.util.color.Color; import org.andengine.util.math.MathUtils; import android.graphics.Bitmap; diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java index 0095326a2..6043eb6e6 100644 --- a/src/org/andengine/opengl/font/FontFactory.java +++ b/src/org/andengine/opengl/font/FontFactory.java @@ -5,7 +5,7 @@ import org.andengine.opengl.texture.PixelFormat; import org.andengine.opengl.texture.TextureManager; import org.andengine.opengl.texture.TextureOptions; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import android.content.res.AssetManager; import android.graphics.Typeface; diff --git a/src/org/andengine/opengl/font/StrokeFont.java b/src/org/andengine/opengl/font/StrokeFont.java index 16ef50aa1..e30ab1864 100644 --- a/src/org/andengine/opengl/font/StrokeFont.java +++ b/src/org/andengine/opengl/font/StrokeFont.java @@ -1,7 +1,7 @@ package org.andengine.opengl.font; import org.andengine.opengl.texture.ITexture; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import android.graphics.Paint; import android.graphics.Paint.Style; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java index 60e5a1cb8..b96f8bfdd 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java @@ -2,7 +2,7 @@ import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.decorator.shape.IBitmapTextureAtlasSourceDecoratorShape; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java index b36982502..4236d897a 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java @@ -2,7 +2,7 @@ import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.decorator.shape.IBitmapTextureAtlasSourceDecoratorShape; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import android.graphics.AvoidXfermode; import android.graphics.AvoidXfermode.Mode; diff --git a/src/org/andengine/opengl/texture/render/RenderTexture.java b/src/org/andengine/opengl/texture/render/RenderTexture.java index e02ff85cf..29719cd68 100644 --- a/src/org/andengine/opengl/texture/render/RenderTexture.java +++ b/src/org/andengine/opengl/texture/render/RenderTexture.java @@ -13,7 +13,7 @@ import org.andengine.opengl.texture.TextureOptions; import org.andengine.opengl.util.GLHelper; import org.andengine.opengl.util.GLState; -import org.andengine.util.color.Color; +import org.andengine.util.adt.color.Color; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; diff --git a/src/org/andengine/ui/activity/BaseActivity.java b/src/org/andengine/ui/activity/BaseActivity.java index 1697202df..962a405b6 100644 --- a/src/org/andengine/ui/activity/BaseActivity.java +++ b/src/org/andengine/ui/activity/BaseActivity.java @@ -8,7 +8,7 @@ import android.app.Activity; import android.app.ProgressDialog; -import android.os.Looper; +import android.os.Bundle; import android.widget.Toast; /** @@ -43,12 +43,12 @@ public abstract class BaseActivity extends Activity { // Methods // =========================================================== - public void toastOnUIThread(final CharSequence pText) { - this.toastOnUIThread(pText, Toast.LENGTH_LONG); + public void toastOnUiThread(final CharSequence pText) { + this.toastOnUiThread(pText, Toast.LENGTH_SHORT); } - public void toastOnUIThread(final CharSequence pText, final int pDuration) { - if(Looper.getMainLooper().getThread() == Thread.currentThread()) { + public void toastOnUiThread(final CharSequence pText, final int pDuration) { + if(ActivityUtils.isOnUiThread()) { Toast.makeText(BaseActivity.this, pText, pDuration).show(); } else { this.runOnUiThread(new Runnable() { @@ -60,6 +60,25 @@ public void run() { } } + @Deprecated + public void showDialogOnUiThread(final int pDialogID) { + this.showDialogOnUiThread(pDialogID, null); + } + + @Deprecated + public void showDialogOnUiThread(final int pDialogID, final Bundle pBundle) { + if(ActivityUtils.isOnUiThread()) { + this.showDialog(pDialogID, pBundle); + } else { + this.runOnUiThread(new Runnable() { + @Override + public void run() { + BaseActivity.this.showDialog(pDialogID, pBundle); + } + }); + } + } + /** * Performs a task in the background, showing a {@link ProgressDialog}, * while the {@link Callable} is being processed. diff --git a/src/org/andengine/util/ActivityUtils.java b/src/org/andengine/util/ActivityUtils.java index 72d233029..e46f952dd 100644 --- a/src/org/andengine/util/ActivityUtils.java +++ b/src/org/andengine/util/ActivityUtils.java @@ -14,6 +14,7 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; import android.os.AsyncTask; +import android.os.Looper; import android.view.Window; import android.view.WindowManager; @@ -24,7 +25,7 @@ * @author Nicolas Gramlich * @since 18:11:54 - 07.03.2011 */ -public class ActivityUtils { +public final class ActivityUtils { // =========================================================== // Constants // =========================================================== @@ -49,7 +50,11 @@ public class ActivityUtils { // Methods // =========================================================== - public static void requestFullscreen(final Activity pActivity) { + public static final boolean isOnUiThread() { + return Looper.getMainLooper().getThread() == Thread.currentThread(); + } + + public static final void requestFullscreen(final Activity pActivity) { final Window window = pActivity.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); @@ -60,46 +65,46 @@ public static void requestFullscreen(final Activity pActivity) { * @param pActivity * @param pScreenBrightness [0..1] */ - public static void setScreenBrightness(final Activity pActivity, final float pScreenBrightness) { + public static final void setScreenBrightness(final Activity pActivity, final float pScreenBrightness) { final Window window = pActivity.getWindow(); final WindowManager.LayoutParams windowLayoutParams = window.getAttributes(); windowLayoutParams.screenBrightness = pScreenBrightness; window.setAttributes(windowLayoutParams); } - public static void keepScreenOn(final Activity pActivity) { + public static final void keepScreenOn(final Activity pActivity) { pActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } - public static void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback) { + public static final void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback) { ActivityUtils.doAsync(pContext, pTitleResourceID, pMessageResourceID, pCallable, pCallback, null, false); } - public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback) { + public static final void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback) { ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, null, false); } - public static void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback, final boolean pCancelable) { + public static final void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback, final boolean pCancelable) { ActivityUtils.doAsync(pContext, pTitleResourceID, pMessageResourceID, pCallable, pCallback, null, pCancelable); } - public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final boolean pCancelable) { + public static final void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final boolean pCancelable) { ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, null, pCancelable); } - public static void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + public static final void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback) { ActivityUtils.doAsync(pContext, pTitleResourceID, pMessageResourceID, pCallable, pCallback, pExceptionCallback, false); } - public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + public static final void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback) { ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, pExceptionCallback, false); } - public static void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { + public static final void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { ActivityUtils.doAsync(pContext, pContext.getString(pTitleResourceID), pContext.getString(pMessageResourceID), pCallable, pCallback, pExceptionCallback, pCancelable); } - public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { + public static final void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { new AsyncTask() { private ProgressDialog mPD; private Exception mException = null; @@ -156,19 +161,19 @@ public void onPostExecute(final T result) { }.execute((Void[]) null); } - public static void doProgressAsync(final Context pContext, final int pTitleResourceID, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback) { + public static final void doProgressAsync(final Context pContext, final int pTitleResourceID, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback) { ActivityUtils.doProgressAsync(pContext, pTitleResourceID, pIconResourceID, pCallable, pCallback, null); } - public static void doProgressAsync(final Context pContext, final CharSequence pTitle, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback) { + public static final void doProgressAsync(final Context pContext, final CharSequence pTitle, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback) { ActivityUtils.doProgressAsync(pContext, pTitle, pIconResourceID, pCallable, pCallback, null); } - public static void doProgressAsync(final Context pContext, final int pTitleResourceID, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + public static final void doProgressAsync(final Context pContext, final int pTitleResourceID, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { ActivityUtils.doProgressAsync(pContext, pContext.getString(pTitleResourceID), pIconResourceID, pCallable, pCallback, pExceptionCallback); } - public static void doProgressAsync(final Context pContext, final CharSequence pTitle, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { + public static final void doProgressAsync(final Context pContext, final CharSequence pTitle, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { new AsyncTask() { private ProgressDialog mPD; private Exception mException = null; @@ -232,11 +237,11 @@ public void onPostExecute(final T result) { }.execute((Void[]) null); } - public static void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final AsyncCallable pAsyncCallable, final Callback pCallback, final Callback pExceptionCallback) { + public static final void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final AsyncCallable pAsyncCallable, final Callback pCallback, final Callback pExceptionCallback) { ActivityUtils.doAsync(pContext, pContext.getString(pTitleResourceID), pContext.getString(pMessageResourceID), pAsyncCallable, pCallback, pExceptionCallback); } - public static void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final AsyncCallable pAsyncCallable, final Callback pCallback, final Callback pExceptionCallback) { + public static final void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final AsyncCallable pAsyncCallable, final Callback pCallback, final Callback pExceptionCallback) { final ProgressDialog pd = ProgressDialog.show(pContext, pTitle, pMessage); pAsyncCallable.call(new Callback() { @Override diff --git a/src/org/andengine/util/align/HorizontalAlign.java b/src/org/andengine/util/adt/align/HorizontalAlign.java similarity index 97% rename from src/org/andengine/util/align/HorizontalAlign.java rename to src/org/andengine/util/adt/align/HorizontalAlign.java index 4155d93ef..015ec2be8 100644 --- a/src/org/andengine/util/align/HorizontalAlign.java +++ b/src/org/andengine/util/adt/align/HorizontalAlign.java @@ -1,4 +1,4 @@ -package org.andengine.util.align; +package org.andengine.util.adt.align; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/util/align/VerticalAlign.java b/src/org/andengine/util/adt/align/VerticalAlign.java similarity index 97% rename from src/org/andengine/util/align/VerticalAlign.java rename to src/org/andengine/util/adt/align/VerticalAlign.java index edf491f10..97bd1377b 100644 --- a/src/org/andengine/util/align/VerticalAlign.java +++ b/src/org/andengine/util/adt/align/VerticalAlign.java @@ -1,4 +1,4 @@ -package org.andengine.util.align; +package org.andengine.util.adt.align; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/util/color/Color.java b/src/org/andengine/util/adt/color/Color.java similarity index 99% rename from src/org/andengine/util/color/Color.java rename to src/org/andengine/util/adt/color/Color.java index 217dfb2b7..53f232313 100644 --- a/src/org/andengine/util/color/Color.java +++ b/src/org/andengine/util/adt/color/Color.java @@ -1,4 +1,4 @@ -package org.andengine.util.color; +package org.andengine.util.adt.color; /** * (c) Zynga 2011 diff --git a/src/org/andengine/util/color/ColorPool.java b/src/org/andengine/util/adt/color/ColorPool.java similarity index 97% rename from src/org/andengine/util/color/ColorPool.java rename to src/org/andengine/util/adt/color/ColorPool.java index a6167c7f0..bf17deb02 100644 --- a/src/org/andengine/util/color/ColorPool.java +++ b/src/org/andengine/util/adt/color/ColorPool.java @@ -1,4 +1,4 @@ -package org.andengine.util.color; +package org.andengine.util.adt.color; import org.andengine.util.adt.pool.GenericPool; diff --git a/src/org/andengine/util/color/ColorUtils.java b/src/org/andengine/util/adt/color/ColorUtils.java similarity index 99% rename from src/org/andengine/util/color/ColorUtils.java rename to src/org/andengine/util/adt/color/ColorUtils.java index c4903bb3f..8ea036f84 100644 --- a/src/org/andengine/util/color/ColorUtils.java +++ b/src/org/andengine/util/adt/color/ColorUtils.java @@ -1,4 +1,4 @@ -package org.andengine.util.color; +package org.andengine.util.adt.color; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/util/color/constants/ColorConstants.java b/src/org/andengine/util/adt/color/constants/ColorConstants.java similarity index 91% rename from src/org/andengine/util/color/constants/ColorConstants.java rename to src/org/andengine/util/adt/color/constants/ColorConstants.java index 89005b7e6..09581d907 100644 --- a/src/org/andengine/util/color/constants/ColorConstants.java +++ b/src/org/andengine/util/adt/color/constants/ColorConstants.java @@ -1,4 +1,4 @@ -package org.andengine.util.color.constants; +package org.andengine.util.adt.color.constants; /** * (c) 2010 Nicolas Gramlich diff --git a/src/org/andengine/util/algorithm/path/Direction.java b/src/org/andengine/util/adt/spatial/Direction.java similarity index 96% rename from src/org/andengine/util/algorithm/path/Direction.java rename to src/org/andengine/util/adt/spatial/Direction.java index 488fb153f..de6423bd2 100644 --- a/src/org/andengine/util/algorithm/path/Direction.java +++ b/src/org/andengine/util/adt/spatial/Direction.java @@ -1,4 +1,4 @@ -package org.andengine.util.algorithm.path; +package org.andengine.util.adt.spatial; /** * (c) 2010 Nicolas Gramlich @@ -12,14 +12,14 @@ public enum Direction { // Elements // =========================================================== - UP(0, -1), - DOWN(0, 1), + UP(0, 1), + DOWN(0, -1), LEFT(-1, 0), RIGHT(1, 0), - UP_LEFT(-1, -1), - UP_RIGHT(1, -1), - DOWN_LEFT(-1, 1), - DOWN_RIGHT(1, 1); + UP_LEFT(-1, 1), + UP_RIGHT(1, 1), + DOWN_LEFT(-1, -1), + DOWN_RIGHT(1, -1); // =========================================================== // Constants @@ -45,29 +45,29 @@ public static Direction fromDelta(final int pDeltaX, final int pDeltaY) { switch(pDeltaX) { case -1: switch(pDeltaY) { - case -1: + case 1: return UP_LEFT; case 0: return LEFT; - case 1: + case -1: return DOWN_LEFT; } break; case 0: switch(pDeltaY) { - case -1: - return UP; case 1: + return UP; + case -1: return DOWN; } break; case 1: switch(pDeltaY) { - case -1: + case 1: return UP_RIGHT; case 0: return RIGHT; - case 1: + case -1: return DOWN_RIGHT; } break; diff --git a/src/org/andengine/util/algorithm/Spiral.java b/src/org/andengine/util/algorithm/Spiral.java index 33550e7da..4e43d7aca 100644 --- a/src/org/andengine/util/algorithm/Spiral.java +++ b/src/org/andengine/util/algorithm/Spiral.java @@ -1,6 +1,6 @@ package org.andengine.util.algorithm; -import org.andengine.util.algorithm.path.Direction; +import org.andengine.util.adt.spatial.Direction; /** * (c) Zynga 2011 diff --git a/src/org/andengine/util/algorithm/path/Path.java b/src/org/andengine/util/algorithm/path/Path.java index e4da8eb7e..5b6300d07 100644 --- a/src/org/andengine/util/algorithm/path/Path.java +++ b/src/org/andengine/util/algorithm/path/Path.java @@ -1,5 +1,7 @@ package org.andengine.util.algorithm.path; +import org.andengine.util.adt.spatial.Direction; + /** * (c) 2010 Nicolas Gramlich From b6633d451ae7ebf9391cf977db48ce6b816f4fdb Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 9 May 2012 11:05:51 -0700 Subject: [PATCH 041/252] Minor changes. --- .../andengine/entity/scene/menu/MenuScene.java | 17 +++++++++-------- .../scene/menu/animator/IMenuSceneAnimator.java | 2 -- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/org/andengine/entity/scene/menu/MenuScene.java b/src/org/andengine/entity/scene/menu/MenuScene.java index 64087a999..232a8aaf6 100644 --- a/src/org/andengine/entity/scene/menu/MenuScene.java +++ b/src/org/andengine/entity/scene/menu/MenuScene.java @@ -34,7 +34,7 @@ public class MenuScene extends CameraScene implements IOnAreaTouchListener, IOnS private IOnMenuItemClickListener mOnMenuItemClickListener; - private IMenuSceneAnimator mMenuSceneAnimator = IMenuSceneAnimator.DEFAULT; + private IMenuSceneAnimator mMenuSceneAnimator; private IMenuItem mSelectedMenuItem; @@ -42,21 +42,22 @@ public class MenuScene extends CameraScene implements IOnAreaTouchListener, IOnS // Constructors // =========================================================== - public MenuScene() { - this(null, null); + public MenuScene(final Camera pCamera) { + this(pCamera, null, null); } - public MenuScene(final IOnMenuItemClickListener pOnMenuItemClickListener) { - this(null, pOnMenuItemClickListener); + public MenuScene(final Camera pCamera, final IMenuSceneAnimator pMenuSceneAnimator) { + this(pCamera, pMenuSceneAnimator, null); } - public MenuScene(final Camera pCamera) { - this(pCamera, null); + public MenuScene(final Camera pCamera, final IOnMenuItemClickListener pOnMenuItemClickListener) { + this(pCamera, null, pOnMenuItemClickListener); } - public MenuScene(final Camera pCamera, final IOnMenuItemClickListener pOnMenuItemClickListener) { + public MenuScene(final Camera pCamera, final IMenuSceneAnimator pMenuSceneAnimator, final IOnMenuItemClickListener pOnMenuItemClickListener) { super(pCamera); + this.mMenuSceneAnimator = pMenuSceneAnimator; this.mOnMenuItemClickListener = pOnMenuItemClickListener; this.setOnSceneTouchListener(this); this.setOnAreaTouchListener(this); diff --git a/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java index d8b5609e8..c19eb23ce 100644 --- a/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java @@ -16,8 +16,6 @@ public interface IMenuSceneAnimator { // Constants // =========================================================== - public static final IMenuSceneAnimator DEFAULT = new AlphaMenuSceneAnimator(); - // =========================================================== // Methods // =========================================================== From f12ad95a19379bb85141a3de727422e4a7ed4489 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 9 May 2012 16:44:04 -0700 Subject: [PATCH 042/252] GLState now resetting the 'lineWidth'. --- src/org/andengine/entity/primitive/Line.java | 2 +- src/org/andengine/opengl/util/GLState.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java index d4095b045..945599e9e 100644 --- a/src/org/andengine/entity/primitive/Line.java +++ b/src/org/andengine/entity/primitive/Line.java @@ -30,7 +30,7 @@ public class Line extends Shape { // Constants // =========================================================== - public static final float LINE_WIDTH_DEFAULT = 1.0f; + public static final float LINE_WIDTH_DEFAULT = GLState.LINE_WIDTH_DEFAULT; public static final int VERTEX_INDEX_X = 0; public static final int VERTEX_INDEX_Y = Line.VERTEX_INDEX_X + 1; diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index 0fcb86bbc..a1b179f0d 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -35,6 +35,8 @@ public class GLState { public static final int GL_UNPACK_ALIGNMENT_DEFAULT = 4; + public static final float LINE_WIDTH_DEFAULT = 1.0f; + // =========================================================== // Fields // =========================================================== @@ -159,6 +161,8 @@ public void reset(final RenderOptions pRenderOptions, final ConfigChooser pConfi this.disableBlend(); this.disableCulling(); + this.lineWidth(GLState.LINE_WIDTH_DEFAULT); + GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_POSITION_LOCATION); GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_COLOR_LOCATION); GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_TEXTURECOORDINATES_LOCATION); From 4122591a2ea1187ac5aa834da0824377734e3b1d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 9 May 2012 16:44:40 -0700 Subject: [PATCH 043/252] Fixed a bug in NineSliceSprite for non-square TextureRegions. --- src/org/andengine/entity/sprite/NineSliceSprite.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/entity/sprite/NineSliceSprite.java b/src/org/andengine/entity/sprite/NineSliceSprite.java index cdb85eeaf..875905c19 100644 --- a/src/org/andengine/entity/sprite/NineSliceSprite.java +++ b/src/org/andengine/entity/sprite/NineSliceSprite.java @@ -193,7 +193,7 @@ private void updateTextureRegions() { final float baseHeight = this.mTextureRegion.getHeight(); final float centerWidth = baseWidth - this.mInsetLeft - this.mInsetRight; - final float centerHeight = baseWidth - this.mInsetTop- this.mInsetBottom; + final float centerHeight = baseHeight - this.mInsetTop - this.mInsetBottom; /* Cache some variables. */ final float leftX = baseX; @@ -225,7 +225,7 @@ private void updateVertices() { final float color = this.mColor.getABGRPackedFloat(); final float centerWidth = this.mWidth - this.mInsetLeft - this.mInsetRight; - final float centerHeight = this.mHeight - this.mInsetTop- this.mInsetBottom; + final float centerHeight = this.mHeight - this.mInsetTop - this.mInsetBottom; /* Cache some variables. */ final float leftX = 0; From 3cfca20bdaf2e64b48720aafa18ca94c7fc04619 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 9 May 2012 16:45:35 -0700 Subject: [PATCH 044/252] Minor changes around MenuScene. --- .../entity/scene/menu/MenuScene.java | 5 +- .../menu/animator/AlphaMenuSceneAnimator.java | 4 +- .../animator/InstantMenuSceneAnimator.java | 61 +++++++++++++++++++ .../menu/animator/MenuSceneAnimator.java | 13 ++-- .../menu/animator/SlideMenuSceneAnimator.java | 4 +- 5 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java diff --git a/src/org/andengine/entity/scene/menu/MenuScene.java b/src/org/andengine/entity/scene/menu/MenuScene.java index 232a8aaf6..c65841ebb 100644 --- a/src/org/andengine/entity/scene/menu/MenuScene.java +++ b/src/org/andengine/entity/scene/menu/MenuScene.java @@ -9,6 +9,7 @@ import org.andengine.entity.scene.ITouchArea; import org.andengine.entity.scene.Scene; import org.andengine.entity.scene.menu.animator.IMenuSceneAnimator; +import org.andengine.entity.scene.menu.animator.InstantMenuSceneAnimator; import org.andengine.entity.scene.menu.item.IMenuItem; import org.andengine.input.touch.TouchEvent; @@ -43,7 +44,7 @@ public class MenuScene extends CameraScene implements IOnAreaTouchListener, IOnS // =========================================================== public MenuScene(final Camera pCamera) { - this(pCamera, null, null); + this(pCamera, new InstantMenuSceneAnimator()); } public MenuScene(final Camera pCamera, final IMenuSceneAnimator pMenuSceneAnimator) { @@ -51,7 +52,7 @@ public MenuScene(final Camera pCamera, final IMenuSceneAnimator pMenuSceneAnimat } public MenuScene(final Camera pCamera, final IOnMenuItemClickListener pOnMenuItemClickListener) { - this(pCamera, null, pOnMenuItemClickListener); + this(pCamera, new InstantMenuSceneAnimator(), pOnMenuItemClickListener); } public MenuScene(final Camera pCamera, final IMenuSceneAnimator pMenuSceneAnimator, final IOnMenuItemClickListener pOnMenuItemClickListener) { diff --git a/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java index c1e38d6d6..9d4cff8a9 100644 --- a/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java @@ -74,7 +74,7 @@ public void setEaseFunction(final IEaseFunction pEaseFunction) { @Override protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { - super.onMenuItemPositionBuilt(pMenuScene, pIndex, pMenuItem, pX, pY); + pMenuItem.setPosition(pX, pY); final AlphaModifier alphaModifier = new AlphaModifier(AlphaMenuSceneAnimator.DURATION, AlphaMenuSceneAnimator.ALPHA_FROM, AlphaMenuSceneAnimator.ALPHA_TO, this.mEaseFunction); alphaModifier.setAutoUnregisterWhenFinished(false); @@ -83,7 +83,7 @@ protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIn @Override protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { - super.onMenuItemPositionReset(pMenuScene, pIndex, pMenuItem, pX, pY); + pMenuItem.setPosition(pX, pY); pMenuItem.resetEntityModifiers(); pMenuItem.setAlpha(AlphaMenuSceneAnimator.ALPHA_FROM); diff --git a/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java new file mode 100644 index 000000000..b6793cc73 --- /dev/null +++ b/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java @@ -0,0 +1,61 @@ +package org.andengine.entity.scene.menu.animator; + +import org.andengine.entity.scene.menu.MenuScene; +import org.andengine.entity.scene.menu.item.IMenuItem; +import org.andengine.util.adt.align.HorizontalAlign; +import org.andengine.util.adt.align.VerticalAlign; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 11:04:35 - 02.04.2010 + */ +public class InstantMenuSceneAnimator extends MenuSceneAnimator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public InstantMenuSceneAnimator(){ + super(); + } + + public InstantMenuSceneAnimator(final HorizontalAlign pHorizontalAlign, final VerticalAlign pVerticalAlign) { + super(pHorizontalAlign, pVerticalAlign); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + pMenuItem.setPosition(pX, pY); + } + + @Override + protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { + pMenuItem.setPosition(pX, pY); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java index bd546a533..a814153b5 100644 --- a/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java @@ -12,7 +12,7 @@ * @author Nicolas Gramlich * @since 11:17:32 - 02.04.2010 */ -public class MenuSceneAnimator implements IMenuSceneAnimator { +public abstract class MenuSceneAnimator implements IMenuSceneAnimator { // =========================================================== // Constants // =========================================================== @@ -107,6 +107,9 @@ public void setVerticalAlign(final VerticalAlign pVerticalAlign) { // Methods for/from SuperClass/Interfaces // =========================================================== + protected abstract void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY); + protected abstract void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY); + @Override public void buildMenuSceneAnimations(final MenuScene pMenuScene) { this.updateOverallHeight(pMenuScene); @@ -122,10 +125,6 @@ public void buildMenuSceneAnimations(final MenuScene pMenuScene) { } } - protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { - pMenuItem.setPosition(pX, pY); - } - @Override public void resetMenuSceneAnimations(final MenuScene pMenuScene) { final int menuItemCount = pMenuScene.getMenuItemCount(); @@ -139,10 +138,6 @@ public void resetMenuSceneAnimations(final MenuScene pMenuScene) { } } - protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIndex, final IMenuItem pMenuItem, final float pX, final float pY) { - pMenuItem.setPosition(pX, pY); - } - // =========================================================== // Methods // =========================================================== diff --git a/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java index 168d1b7d3..e208845e2 100644 --- a/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java @@ -105,7 +105,7 @@ protected void onMenuItemPositionBuilt(final MenuScene pMenuScene, final int pIn final float fromX = getFromX(pMenuScene, pMenuItem, pX); final float fromY = getFromY(pMenuScene, pMenuItem, pY); - super.onMenuItemPositionBuilt(pMenuScene, pIndex, pMenuItem, fromX, fromY); + pMenuItem.setPosition(fromX, fromY); final MoveModifier moveModifier = new MoveModifier(SlideMenuSceneAnimator.DURATION, fromX, fromY, pX, pY, this.mEaseFunction); moveModifier.setAutoUnregisterWhenFinished(false); @@ -117,7 +117,7 @@ protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIn final float fromX = getFromX(pMenuScene, pMenuItem, pX); final float fromY = getFromY(pMenuScene, pMenuItem, pY); - super.onMenuItemPositionReset(pMenuScene, pIndex, pMenuItem, fromX, fromY); + pMenuItem.setPosition(fromX, fromY); pMenuItem.resetEntityModifiers(); } From b6a76e0e5119ba97ddf3073c449efc468439a51e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 9 May 2012 16:48:42 -0700 Subject: [PATCH 045/252] Chaned ClickDetector to consume TouchEvents with ACTION_MOVE as long as it could still result in a click event to be fired. --- .../input/touch/detector/ClickDetector.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/input/touch/detector/ClickDetector.java b/src/org/andengine/input/touch/detector/ClickDetector.java index 1059a8dc4..53eb95836 100644 --- a/src/org/andengine/input/touch/detector/ClickDetector.java +++ b/src/org/andengine/input/touch/detector/ClickDetector.java @@ -69,19 +69,30 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { case TouchEvent.ACTION_DOWN: this.prepareClick(pSceneTouchEvent); return true; + case TouchEvent.ACTION_MOVE: + if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + final long moveTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getEventTime(); + if(moveTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) { + return true; + } + } + return false; case TouchEvent.ACTION_UP: case TouchEvent.ACTION_CANCEL: if(this.mPointerID == pSceneTouchEvent.getPointerID()) { - boolean handled = false; final long upTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getEventTime(); + boolean handled; if(upTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) { this.mDownTimeMilliseconds = Long.MIN_VALUE; - this.mClickDetectorListener.onClick(this, pSceneTouchEvent.getPointerID(), pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); + this.mClickDetectorListener.onClick(this, this.mPointerID, pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); handled = true; + } else { + handled = false; } this.mPointerID = TouchEvent.INVALID_POINTER_ID; + return handled; } else { return false; From 84c23364f75f51f3332b6177809b813587d4d484 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 May 2012 11:51:50 -0700 Subject: [PATCH 046/252] Added methods to SpriteBatch to draw from an ITextureRegion and use an IEntity for the position/rotation/transformation/... . --- .../entity/sprite/batch/SpriteBatch.java | 112 +++++++++++------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/src/org/andengine/entity/sprite/batch/SpriteBatch.java b/src/org/andengine/entity/sprite/batch/SpriteBatch.java index 220816887..3f8ca0dc1 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/SpriteBatch.java @@ -250,6 +250,12 @@ public void draw(final ITextureRegion pTextureRegion, final float pX, final floa this.mIndex++; } + public void drawWithoutChecks(final ITextureRegion pTextureRegion, final float pX, final float pY, final float pWidth, final float pHeight, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + this.add(pTextureRegion, pX, pY, pWidth, pHeight, pRed, pGreen, pBlue, pAlpha); + + this.mIndex++; + } + /** * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float)}. */ @@ -262,21 +268,12 @@ public void draw(final ITextureRegion pTextureRegion, final float pX, final floa this.mIndex++; } - /** - * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float)}. - */ public void drawWithoutChecks(final ITextureRegion pTextureRegion, final float pX, final float pY, final float pWidth, final float pHeight, final float pColorABGRPackedInt) { this.add(pTextureRegion, pX, pY, pWidth, pHeight, pColorABGRPackedInt); this.mIndex++; } - public void drawWithoutChecks(final ITextureRegion pTextureRegion, final float pX, final float pY, final float pWidth, final float pHeight, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - this.add(pTextureRegion, pX, pY, pWidth, pHeight, pRed, pGreen, pBlue, pAlpha); - - this.mIndex++; - } - /** * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float, float, float, float)}. */ @@ -353,75 +350,102 @@ public void drawWithoutChecks(final ITextureRegion pTextureRegion, final float p * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float)}. */ public void draw(final Sprite pSprite) { - this.draw(pSprite, pSprite.getColor().getABGRPackedFloat()); + this.draw(pSprite.getTextureRegion(), pSprite, pSprite.getColor().getABGRPackedFloat()); + } + + public void drawWithoutChecks(final Sprite pSprite) { + this.drawWithoutChecks(pSprite.getTextureRegion(), pSprite, pSprite.getColor().getABGRPackedFloat()); } /** * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float, float, float, float)}. */ public void draw(final Sprite pSprite, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - if(pSprite.isVisible()) { - this.assertCapacity(); - - final ITextureRegion textureRegion = pSprite.getTextureRegion(); - this.assertTexture(textureRegion); - - if(pSprite.isRotatedOrScaledOrSkewed()) { - this.add(textureRegion, pSprite.getWidth(), pSprite.getHeight(), pSprite.getLocalToParentTransformation(), pRed, pGreen, pBlue, pAlpha); - } else { - this.add(textureRegion, pSprite.getX(), pSprite.getY(), pSprite.getWidth(), pSprite.getHeight(), pRed, pGreen, pBlue, pAlpha); - } + this.draw(pSprite.getTextureRegion(), pSprite, pRed, pGreen, pBlue, pAlpha); + } - this.mIndex++; - } + public void drawWithoutChecks(final Sprite pSprite, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + this.drawWithoutChecks(pSprite.getTextureRegion(), pSprite, pRed, pGreen, pBlue, pAlpha); } /** * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float, float, float, float)}. */ public void draw(final Sprite pSprite, final float pColorABGRPackedInt) { - if(pSprite.isVisible()) { + this.draw(pSprite.getTextureRegion(), pSprite, pColorABGRPackedInt); + } + + public void drawWithoutChecks(final Sprite pSprite, final float pColorABGRPackedInt) { + this.drawWithoutChecks(pSprite.getTextureRegion(), pSprite, pColorABGRPackedInt); + } + + /** + * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float)}. + */ + public void draw(final ITextureRegion pTextureRegion, final IEntity pEntity) { + this.draw(pTextureRegion, pEntity, pEntity.getColor().getABGRPackedFloat()); + } + + public void drawWithoutChecks(final ITextureRegion pTextureRegion, final IEntity pEntity) { + this.drawWithoutChecks(pTextureRegion, pEntity, pEntity.getColor().getABGRPackedFloat()); + } + + /** + * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float, float, float, float)}. + */ + public void draw(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + if(pEntity.isVisible()) { this.assertCapacity(); - final ITextureRegion textureRegion = pSprite.getTextureRegion(); - this.assertTexture(textureRegion); + this.assertTexture(pTextureRegion); - if(pSprite.isRotatedOrScaledOrSkewed()) { - this.addWithPackedColor(textureRegion, pSprite.getWidth(), pSprite.getHeight(), pSprite.getLocalToParentTransformation(), pColorABGRPackedInt); + if(pEntity.isRotatedOrScaledOrSkewed()) { + this.add(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pRed, pGreen, pBlue, pAlpha); } else { - this.addWithPackedColor(textureRegion, pSprite.getX(), pSprite.getY(), pSprite.getWidth(), pSprite.getHeight(), pColorABGRPackedInt); + this.add(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pRed, pGreen, pBlue, pAlpha); } this.mIndex++; } } - public void drawWithoutChecks(final Sprite pSprite) { - this.drawWithoutChecks(pSprite, pSprite.getColor().getABGRPackedFloat()); + public void drawWithoutChecks(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { + if(pEntity.isVisible()) { + if(pEntity.isRotatedOrScaledOrSkewed()) { + this.add(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pRed, pGreen, pBlue, pAlpha); + } else { + this.add(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pRed, pGreen, pBlue, pAlpha); + } + + this.mIndex++; + } } - public void drawWithoutChecks(final Sprite pSprite, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - if(pSprite.isVisible()) { - final ITextureRegion textureRegion = pSprite.getTextureRegion(); + /** + * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float, float, float, float)}. + */ + public void draw(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pColorABGRPackedInt) { + if(pEntity.isVisible()) { + this.assertCapacity(); - if(pSprite.isRotatedOrScaledOrSkewed()) { - this.add(textureRegion, pSprite.getWidth(), pSprite.getHeight(), pSprite.getLocalToParentTransformation(), pRed, pGreen, pBlue, pAlpha); + this.assertTexture(pTextureRegion); + + if(pEntity.isRotatedOrScaledOrSkewed()) { + this.addWithPackedColor(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pColorABGRPackedInt); } else { - this.add(textureRegion, pSprite.getX(), pSprite.getY(), pSprite.getWidth(), pSprite.getHeight(), pRed, pGreen, pBlue, pAlpha); + this.addWithPackedColor(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pColorABGRPackedInt); } this.mIndex++; } } - public void drawWithoutChecks(final Sprite pSprite, final float pColorABGRPackedInt) { - if(pSprite.isVisible()) { - final ITextureRegion textureRegion = pSprite.getTextureRegion(); - - if(pSprite.isRotatedOrScaledOrSkewed()) { - this.addWithPackedColor(textureRegion, pSprite.getWidth(), pSprite.getHeight(), pSprite.getLocalToParentTransformation(), pColorABGRPackedInt); + public void drawWithoutChecks(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pColorABGRPackedInt) { + if(pEntity.isVisible()) { + if(pEntity.isRotatedOrScaledOrSkewed()) { + this.addWithPackedColor(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pColorABGRPackedInt); } else { - this.addWithPackedColor(textureRegion, pSprite.getX(), pSprite.getY(), pSprite.getWidth(), pSprite.getHeight(), pColorABGRPackedInt); + this.addWithPackedColor(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pColorABGRPackedInt); } this.mIndex++; From 23e7ddda494f777fc6652aeb11e4d51209a4f7df Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 May 2012 11:53:25 -0700 Subject: [PATCH 047/252] Updated ParticleSystem to be more flexible. Added BatchedSpriteParticleSystem and BatchedPseudoSpriteParticleSystem that draw 50% more efficient than SpriteParticleSystem, but look a little different, since all particles are drawn in one draw call. --- src/org/andengine/entity/IEntityFactory.java | 2 +- .../BatchedPseudoSpriteParticleSystem.java | 127 ++++++++++++++++++ .../particle/BatchedSpriteParticleSystem.java | 86 ++++++++++++ .../particle/BlendFunctionParticleSystem.java | 100 ++++++++++++++ .../entity/particle/ParticleSystem.java | 86 ++++++------ .../entity/particle/SpriteParticleSystem.java | 4 + 6 files changed, 359 insertions(+), 46 deletions(-) create mode 100644 src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java create mode 100644 src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java create mode 100644 src/org/andengine/entity/particle/BlendFunctionParticleSystem.java diff --git a/src/org/andengine/entity/IEntityFactory.java b/src/org/andengine/entity/IEntityFactory.java index 02072e318..b930cf7a0 100644 --- a/src/org/andengine/entity/IEntityFactory.java +++ b/src/org/andengine/entity/IEntityFactory.java @@ -7,7 +7,7 @@ * @author Nicolas Gramlich * @since 20:04:41 - 19.11.2011 */ -public interface IEntityFactory { +public interface IEntityFactory { // =========================================================== // Constants // =========================================================== diff --git a/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java new file mode 100644 index 000000000..9c401e4a9 --- /dev/null +++ b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java @@ -0,0 +1,127 @@ +package org.andengine.entity.particle; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.Entity; +import org.andengine.entity.IEntityFactory; +import org.andengine.entity.particle.BatchedPseudoSpriteParticleSystem.PseudoSprite; +import org.andengine.entity.particle.emitter.IParticleEmitter; +import org.andengine.entity.sprite.batch.SpriteBatch; +import org.andengine.opengl.texture.region.ITextureRegion; +import org.andengine.opengl.util.GLState; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.util.adt.color.ColorUtils; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 11:39:46 - 10.05.2012 + */ +public class BatchedPseudoSpriteParticleSystem extends BlendFunctionParticleSystem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final SpriteBatch mSpriteBatch; + + // =========================================================== + // Constructors + // =========================================================== + + public BatchedPseudoSpriteParticleSystem(final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(0, 0, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum, pTextureRegion, pVertexBufferObjectManager); + } + + public BatchedPseudoSpriteParticleSystem(final float pX, final float pY, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) { + super(pX, pY, new IEntityFactory() { + @Override + public PseudoSprite create(final float pX, final float pY) { + return new PseudoSprite(pX, pY, pTextureRegion); + } + }, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum); + + this.mSpriteBatch = new SpriteBatch(pTextureRegion.getTexture(), pParticlesMaximum, pVertexBufferObjectManager); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { + this.mSpriteBatch.setIndex(0); + + final Particle[] particles = this.mParticles; + for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + final PseudoSprite pseudoSprite = particles[i].getEntity(); + + /* In order to support alpha changes of the sprites inside the spritebatch, + * we have to 'premultiply' the RGB channels of the sprite with its alpha channel. */ + final float alpha = pseudoSprite.getAlpha(); + final float colorABGRPackedInt = ColorUtils.convertRGBAToABGRPackedFloat(pseudoSprite.getRed() * alpha, pseudoSprite.getGreen() * alpha, pseudoSprite.getBlue() * alpha, alpha); + + this.mSpriteBatch.drawWithoutChecks(pseudoSprite.getTextureRegion(), pseudoSprite, colorABGRPackedInt); + } + this.mSpriteBatch.submit(); + + this.mSpriteBatch.onDraw(pGLState, pCamera); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class PseudoSprite extends Entity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ITextureRegion mTextureRegion; + + // =========================================================== + // Constructors + // =========================================================== + + public PseudoSprite(float pX, float pY, final ITextureRegion pTextureRegion) { + super(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight()); + + this.mTextureRegion = pTextureRegion; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public ITextureRegion getTextureRegion() { + return this.mTextureRegion; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java new file mode 100644 index 000000000..ce1bf9f9e --- /dev/null +++ b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java @@ -0,0 +1,86 @@ +package org.andengine.entity.particle; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.IEntityFactory; +import org.andengine.entity.particle.emitter.IParticleEmitter; +import org.andengine.entity.sprite.Sprite; +import org.andengine.entity.sprite.UncoloredSprite; +import org.andengine.entity.sprite.batch.SpriteBatch; +import org.andengine.opengl.texture.region.ITextureRegion; +import org.andengine.opengl.util.GLState; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.util.adt.color.ColorUtils; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 18:32:29 - 09.05.2012 + */ +public class BatchedSpriteParticleSystem extends BlendFunctionParticleSystem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final SpriteBatch mSpriteBatch; + + // =========================================================== + // Constructors + // =========================================================== + + public BatchedSpriteParticleSystem(final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(0, 0, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum, pTextureRegion, pVertexBufferObjectManager); + } + + public BatchedSpriteParticleSystem(final float pX, final float pY, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) { + super(pX, pY, new IEntityFactory() { + @Override + public UncoloredSprite create(final float pX, final float pY) { + /* We can create an uncolored sprite, since */ + return new UncoloredSprite(pX, pY, pTextureRegion, pVertexBufferObjectManager); + } + }, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum); + + this.mSpriteBatch = new SpriteBatch(pTextureRegion.getTexture(), pParticlesMaximum, pVertexBufferObjectManager); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { + this.mSpriteBatch.setIndex(0); + + final Particle[] particles = this.mParticles; + for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + final Sprite sprite = particles[i].getEntity(); + + /* In order to support alpha changes of the sprites inside the spritebatch, + * we have to 'premultiply' the RGB channels of the sprite with its alpha channel. */ + final float alpha = sprite.getAlpha(); + final float colorABGRPackedInt = ColorUtils.convertRGBAToABGRPackedFloat(sprite.getRed() * alpha, sprite.getGreen() * alpha, sprite.getBlue() * alpha, alpha); + + this.mSpriteBatch.drawWithoutChecks(sprite, colorABGRPackedInt); + } + this.mSpriteBatch.submit(); + + this.mSpriteBatch.onDraw(pGLState, pCamera); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java new file mode 100644 index 000000000..498d06aa6 --- /dev/null +++ b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java @@ -0,0 +1,100 @@ +package org.andengine.entity.particle; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.IEntity; +import org.andengine.entity.IEntityFactory; +import org.andengine.entity.particle.emitter.IParticleEmitter; +import org.andengine.entity.shape.IShape; +import org.andengine.opengl.util.GLState; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 11:34:32 - 10.05.2012 + */ +public class BlendFunctionParticleSystem extends ParticleSystem { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected boolean mBlendingEnabled = true; + protected int mBlendFunctionSource = IShape.BLENDFUNCTION_SOURCE_DEFAULT; + protected int mBlendFunctionDestination = IShape.BLENDFUNCTION_DESTINATION_DEFAULT; + + // =========================================================== + // Constructors + // =========================================================== + + public BlendFunctionParticleSystem(IEntityFactory pEntityFactory, IParticleEmitter pParticleEmitter, float pRateMinimum, float pRateMaximum, int pParticlesMaximum) { + super(pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum); + } + + public BlendFunctionParticleSystem(float pX, float pY, IEntityFactory pEntityFactory, IParticleEmitter pParticleEmitter, float pRateMinimum, float pRateMaximum, int pParticlesMaximum) { + super(pX, pY, pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isBlendingEnabled() { + return this.mBlendingEnabled; + } + + public void setBlendingEnabled(final boolean pBlendingEnabled) { + this.mBlendingEnabled = pBlendingEnabled; + } + + public int getBlendFunctionSource() { + return this.mBlendFunctionSource; + } + + public void setBlendFunctionSource(final int pBlendFunctionSource) { + this.mBlendFunctionSource = pBlendFunctionSource; + } + + public int getBlendFunctionDestination() { + return this.mBlendFunctionDestination; + } + + public void setBlendFunctionDestination(final int pBlendFunctionDestination) { + this.mBlendFunctionDestination = pBlendFunctionDestination; + } + + public void setBlendFunction(final int pBlendFunctionSource, final int pBlendFunctionDestination) { + this.mBlendFunctionSource = pBlendFunctionSource; + this.mBlendFunctionDestination = pBlendFunctionDestination; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void preDraw(final GLState pGLState, final Camera pCamera) { + if(this.mBlendingEnabled) { + pGLState.enableBlend(); + pGLState.blendFunction(this.mBlendFunctionSource, this.mBlendFunctionDestination); + } + } + + @Override + protected void postDraw(final GLState pGLState, final Camera pCamera) { + if(this.mBlendingEnabled) { + pGLState.disableBlend(); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/particle/ParticleSystem.java b/src/org/andengine/entity/particle/ParticleSystem.java index a3576c24d..799f1fa7b 100644 --- a/src/org/andengine/entity/particle/ParticleSystem.java +++ b/src/org/andengine/entity/particle/ParticleSystem.java @@ -4,6 +4,7 @@ import org.andengine.engine.camera.Camera; import org.andengine.entity.Entity; +import org.andengine.entity.IEntity; import org.andengine.entity.IEntityFactory; import org.andengine.entity.particle.emitter.IParticleEmitter; import org.andengine.entity.particle.initializer.IParticleInitializer; @@ -15,45 +16,40 @@ import android.util.FloatMath; /** - * TODO Check if SpriteBatch can be used here to improve performance. - * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 19:42:27 - 14.03.2010 */ -public class ParticleSystem extends Entity { +public class ParticleSystem extends Entity { // =========================================================== // Constants // =========================================================== - private final float[] POSITION_OFFSET = new float[2]; + private static final float[] POSITION_OFFSET_CONTAINER = new float[2]; // =========================================================== // Fields // =========================================================== - private final IEntityFactory mEntityFactory; - private final IParticleEmitter mParticleEmitter; + protected final IEntityFactory mEntityFactory; + protected final IParticleEmitter mParticleEmitter; - private final Particle[] mParticles; + protected final Particle[] mParticles; - private final ArrayList> mParticleInitializers = new ArrayList>(); - private final ArrayList> mParticleModifiers = new ArrayList>(); + protected final ArrayList> mParticleInitializers = new ArrayList>(); + protected final ArrayList> mParticleModifiers = new ArrayList>(); private final float mRateMinimum; private final float mRateMaximum; private boolean mParticlesSpawnEnabled = true; - private final int mParticlesMaximum; - private int mParticlesAlive; + protected final int mParticlesMaximum; + protected int mParticlesAlive; private float mParticlesDueToSpawn; - private int mParticleModifierCount; - private int mParticleInitializerCount; - // =========================================================== // Constructors // =========================================================== @@ -110,9 +106,8 @@ public void reset() { @Override protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { - final Particle[] particles = this.mParticles; for(int i = this.mParticlesAlive - 1; i >= 0; i--) { - particles[i].onDraw(pGLState, pCamera); + this.mParticles[i].onDraw(pGLState, pCamera); } } @@ -124,50 +119,56 @@ protected void onManagedUpdate(final float pSecondsElapsed) { this.spawnParticles(pSecondsElapsed); } - final Particle[] particles = this.mParticles; - - final ArrayList> particleModifiers = this.mParticleModifiers; - final int particleModifierCountMinusOne = this.mParticleModifierCount - 1; - + final int particleModifierCountMinusOne = this.mParticleModifiers.size() - 1; for(int i = this.mParticlesAlive - 1; i >= 0; i--) { - final Particle particle = particles[i]; + final Particle particle = this.mParticles[i]; /* Apply all particleModifiers */ for(int j = particleModifierCountMinusOne; j >= 0; j--) { - particleModifiers.get(j).onUpdateParticle(particle); + this.mParticleModifiers.get(j).onUpdateParticle(particle); } particle.onUpdate(pSecondsElapsed); if(particle.mExpired){ this.mParticlesAlive--; - final int particlesAlive = this.mParticlesAlive; - particles[i] = particles[particlesAlive]; - particles[particlesAlive] = particle; + + this.moveParticleToEnd(i); } } } + protected void moveParticleToEnd(final int pIndex) { + final Particle particle = this.mParticles[pIndex]; + + final int particlesToCopy = this.mParticlesAlive - pIndex; + if(particlesToCopy > 0) { + System.arraycopy(this.mParticles, pIndex + 1, this.mParticles, pIndex, particlesToCopy); + } + this.mParticles[this.mParticlesAlive] = particle; + + /* This mode of swapping particles is faster than copying tons of array elements, + * but it doesn't respect the 'lifetime' of the particles. */ +// particles[i] = particles[this.mParticlesAlive]; +// particles[this.mParticlesAlive] = particle; + } + // =========================================================== // Methods // =========================================================== public void addParticleModifier(final IParticleModifier pParticleModifier) { this.mParticleModifiers.add(pParticleModifier); - this.mParticleModifierCount++; } public void removeParticleModifier(final IParticleModifier pParticleModifier) { - this.mParticleModifierCount--; this.mParticleModifiers.remove(pParticleModifier); } public void addParticleInitializer(final IParticleInitializer pParticleInitializer) { this.mParticleInitializers.add(pParticleInitializer); - this.mParticleInitializerCount++; } public void removeParticleInitializer(final IParticleInitializer pParticleInitializer) { - this.mParticleInitializerCount--; this.mParticleInitializers.remove(pParticleInitializer); } @@ -186,21 +187,18 @@ private void spawnParticles(final float pSecondsElapsed) { } private void spawnParticle() { - final Particle[] particles = this.mParticles; - - final int particlesAlive = this.mParticlesAlive; - if(particlesAlive < this.mParticlesMaximum){ - Particle particle = particles[particlesAlive]; + if(this.mParticlesAlive < this.mParticlesMaximum){ + Particle particle = this.mParticles[this.mParticlesAlive]; /* New particle needs to be created. */ - this.mParticleEmitter.getPositionOffset(this.POSITION_OFFSET); + this.mParticleEmitter.getPositionOffset(ParticleSystem.POSITION_OFFSET_CONTAINER); - final float x = this.POSITION_OFFSET[Constants.VERTEX_INDEX_X]; - final float y = this.POSITION_OFFSET[Constants.VERTEX_INDEX_Y]; + final float x = ParticleSystem.POSITION_OFFSET_CONTAINER[Constants.VERTEX_INDEX_X]; + final float y = ParticleSystem.POSITION_OFFSET_CONTAINER[Constants.VERTEX_INDEX_Y]; if(particle == null) { particle = new Particle(); - particles[particlesAlive] = particle; + this.mParticles[this.mParticlesAlive] = particle; particle.setEntity(this.mEntityFactory.create(x, y)); } else { particle.reset(); @@ -209,14 +207,12 @@ private void spawnParticle() { /* Apply particle initializers. */ { - final ArrayList> particleInitializers = this.mParticleInitializers; - for(int i = this.mParticleInitializerCount - 1; i >= 0; i--) { - particleInitializers.get(i).onInitializeParticle(particle); + for(int i = this.mParticleInitializers.size() - 1; i >= 0; i--) { + this.mParticleInitializers.get(i).onInitializeParticle(particle); } - final ArrayList> particleModifiers = this.mParticleModifiers; - for(int i = this.mParticleModifierCount - 1; i >= 0; i--) { - particleModifiers.get(i).onInitializeParticle(particle); + for(int i = this.mParticleModifiers.size() - 1; i >= 0; i--) { + this.mParticleModifiers.get(i).onInitializeParticle(particle); } } diff --git a/src/org/andengine/entity/particle/SpriteParticleSystem.java b/src/org/andengine/entity/particle/SpriteParticleSystem.java index b7bd64453..24a853204 100644 --- a/src/org/andengine/entity/particle/SpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/SpriteParticleSystem.java @@ -38,6 +38,10 @@ public Sprite create(final float pX, final float pY) { }, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum); } + protected SpriteParticleSystem(final float pX, final float pY, final IEntityFactory pEntityFactory, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum) { + super(pX, pY, pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum); + } + // =========================================================== // Getter & Setter // =========================================================== From 7b6bc1acc04d35a6f398abc0845ec10d1fcff145 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 May 2012 12:03:47 -0700 Subject: [PATCH 048/252] Minor memory optimization to BatchedPseudoSpriteParticleSystem. --- .../BatchedPseudoSpriteParticleSystem.java | 64 ++++--------------- 1 file changed, 12 insertions(+), 52 deletions(-) diff --git a/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java index 9c401e4a9..4388e4da3 100644 --- a/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java @@ -3,7 +3,6 @@ import org.andengine.engine.camera.Camera; import org.andengine.entity.Entity; import org.andengine.entity.IEntityFactory; -import org.andengine.entity.particle.BatchedPseudoSpriteParticleSystem.PseudoSprite; import org.andengine.entity.particle.emitter.IParticleEmitter; import org.andengine.entity.sprite.batch.SpriteBatch; import org.andengine.opengl.texture.region.ITextureRegion; @@ -17,7 +16,7 @@ * @author Nicolas Gramlich * @since 11:39:46 - 10.05.2012 */ -public class BatchedPseudoSpriteParticleSystem extends BlendFunctionParticleSystem { +public class BatchedPseudoSpriteParticleSystem extends BlendFunctionParticleSystem { // =========================================================== // Constants // =========================================================== @@ -27,6 +26,7 @@ public class BatchedPseudoSpriteParticleSystem extends BlendFunctionParticleSyst // =========================================================== protected final SpriteBatch mSpriteBatch; + private final ITextureRegion mTextureRegion; // =========================================================== // Constructors @@ -37,13 +37,15 @@ public BatchedPseudoSpriteParticleSystem(final IParticleEmitter pParticleEmitter } public BatchedPseudoSpriteParticleSystem(final float pX, final float pY, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) { - super(pX, pY, new IEntityFactory() { + super(pX, pY, new IEntityFactory() { @Override - public PseudoSprite create(final float pX, final float pY) { - return new PseudoSprite(pX, pY, pTextureRegion); + public Entity create(final float pX, final float pY) { + return new Entity(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight()); } }, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum); + this.mTextureRegion = pTextureRegion; + this.mSpriteBatch = new SpriteBatch(pTextureRegion.getTexture(), pParticlesMaximum, pVertexBufferObjectManager); } @@ -59,16 +61,16 @@ public PseudoSprite create(final float pX, final float pY) { protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { this.mSpriteBatch.setIndex(0); - final Particle[] particles = this.mParticles; + final Particle[] particles = this.mParticles; for(int i = this.mParticlesAlive - 1; i >= 0; i--) { - final PseudoSprite pseudoSprite = particles[i].getEntity(); + final Entity entity = particles[i].getEntity(); /* In order to support alpha changes of the sprites inside the spritebatch, * we have to 'premultiply' the RGB channels of the sprite with its alpha channel. */ - final float alpha = pseudoSprite.getAlpha(); - final float colorABGRPackedInt = ColorUtils.convertRGBAToABGRPackedFloat(pseudoSprite.getRed() * alpha, pseudoSprite.getGreen() * alpha, pseudoSprite.getBlue() * alpha, alpha); + final float alpha = entity.getAlpha(); + final float colorABGRPackedInt = ColorUtils.convertRGBAToABGRPackedFloat(entity.getRed() * alpha, entity.getGreen() * alpha, entity.getBlue() * alpha, alpha); - this.mSpriteBatch.drawWithoutChecks(pseudoSprite.getTextureRegion(), pseudoSprite, colorABGRPackedInt); + this.mSpriteBatch.drawWithoutChecks(this.mTextureRegion, entity, colorABGRPackedInt); } this.mSpriteBatch.submit(); @@ -82,46 +84,4 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { // =========================================================== // Inner and Anonymous Classes // =========================================================== - - public static class PseudoSprite extends Entity { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - private final ITextureRegion mTextureRegion; - - // =========================================================== - // Constructors - // =========================================================== - - public PseudoSprite(float pX, float pY, final ITextureRegion pTextureRegion) { - super(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight()); - - this.mTextureRegion = pTextureRegion; - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - public ITextureRegion getTextureRegion() { - return this.mTextureRegion; - } - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== - } } From 4b034202abe866b3c1767d5d7d98c151a73f23f5 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 May 2012 17:23:15 -0700 Subject: [PATCH 049/252] Added MathUtils.min/max for 3 to 5 elements for int/long/float/double. --- src/org/andengine/util/math/MathUtils.java | 142 +++++++++++++++++---- 1 file changed, 119 insertions(+), 23 deletions(-) diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index f98afe166..0cac6bd87 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -5,7 +5,7 @@ import android.util.FloatMath; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich @@ -38,6 +38,102 @@ public final class MathUtils { // Methods // =========================================================== + public static int min(final int pA, final int pB, final int pC) { + return Math.min(Math.min(pA, pB), pC); + } + + public static int min(final int pA, final int pB, final int pC, final int pD) { + return Math.min(Math.min(Math.min(pA, pB), pC), pD); + } + + public static int min(final int pA, final int pB, final int pC, final int pD, final int pE) { + return Math.min(Math.min(Math.min(Math.min(pA, pB), pC), pD), pE); + } + + public static long min(final long pA, final long pB, final long pC) { + return Math.min(Math.min(pA, pB), pC); + } + + public static long min(final long pA, final long pB, final long pC, final long pD) { + return Math.min(Math.min(Math.min(pA, pB), pC), pD); + } + + public static long min(final long pA, final long pB, final long pC, final long pD, final long pE) { + return Math.min(Math.min(Math.min(Math.min(pA, pB), pC), pD), pE); + } + + public static float min(final float pA, final float pB, final float pC) { + return Math.min(Math.min(pA, pB), pC); + } + + public static float min(final float pA, final float pB, final float pC, final float pD) { + return Math.min(Math.min(Math.min(pA, pB), pC), pD); + } + + public static float min(final float pA, final float pB, final float pC, final float pD, final float pE) { + return Math.min(Math.min(Math.min(Math.min(pA, pB), pC), pD), pE); + } + + public static double min(final double pA, final double pB, final double pC) { + return Math.min(Math.min(pA, pB), pC); + } + + public static double min(final double pA, final double pB, final double pC, final double pD) { + return Math.min(Math.min(Math.min(pA, pB), pC), pD); + } + + public static double min(final double pA, final double pB, final double pC, final double pD, final double pE) { + return Math.min(Math.min(Math.min(Math.min(pA, pB), pC), pD), pE); + } + + public static int max(final int pA, final int pB, final int pC) { + return Math.max(Math.max(pA, pB), pC); + } + + public static int max(final int pA, final int pB, final int pC, final int pD) { + return Math.max(Math.max(Math.max(pA, pB), pC), pD); + } + + public static int max(final int pA, final int pB, final int pC, final int pD, final int pE) { + return Math.max(Math.max(Math.max(Math.max(pA, pB), pC), pD), pE); + } + + public static long max(final long pA, final long pB, final long pC) { + return Math.max(Math.max(pA, pB), pC); + } + + public static long max(final long pA, final long pB, final long pC, final long pD) { + return Math.max(Math.max(Math.max(pA, pB), pC), pD); + } + + public static long max(final long pA, final long pB, final long pC, final long pD, final long pE) { + return Math.max(Math.max(Math.max(Math.max(pA, pB), pC), pD), pE); + } + + public static float max(final float pA, final float pB, final float pC) { + return Math.max(Math.max(pA, pB), pC); + } + + public static float max(final float pA, final float pB, final float pC, final float pD) { + return Math.max(Math.max(Math.max(pA, pB), pC), pD); + } + + public static float max(final float pA, final float pB, final float pC, final float pD, final float pE) { + return Math.max(Math.max(Math.max(Math.max(pA, pB), pC), pD), pE); + } + + public static double max(final double pA, final double pB, final double pC) { + return Math.max(Math.max(pA, pB), pC); + } + + public static double max(final double pA, final double pB, final double pC, final double pD) { + return Math.max(Math.max(Math.max(pA, pB), pC), pD); + } + + public static double max(final double pA, final double pB, final double pC, final double pD, final double pE) { + return Math.max(Math.max(Math.max(Math.max(pA, pB), pC), pD), pE); + } + public static final float atan2(final float dY, final float dX) { return (float)Math.atan2(dY, dX); } @@ -61,7 +157,7 @@ public static final int signum(final int n) { } public static final int randomSign() { - if(RANDOM.nextBoolean()) { + if(MathUtils.RANDOM.nextBoolean()) { return 1; } else { return -1; @@ -69,7 +165,7 @@ public static final int randomSign() { } public static final float random(final float pMin, final float pMax) { - return pMin + RANDOM.nextFloat() * (pMax - pMin); + return pMin + (MathUtils.RANDOM.nextFloat() * (pMax - pMin)); } /** @@ -78,11 +174,11 @@ public static final float random(final float pMin, final float pMax) { * @return */ public static final int random(final int pMin, final int pMax) { - return pMin + RANDOM.nextInt(pMax - pMin + 1); + return pMin + MathUtils.RANDOM.nextInt((pMax - pMin) + 1); } public static final boolean isPowerOfTwo(final int n) { - return ((n != 0) && (n & (n - 1)) == 0); + return ((n != 0) && ((n & (n - 1)) == 0)); } public static final int nextPowerOfTwo(final float f) { @@ -99,7 +195,7 @@ public static final int nextPowerOfTwo(final int n) { k--; for (int i = 1; i < 32; i <<= 1) { - k = k | k >> i; + k = k | (k >> i); } return k + 1; @@ -132,7 +228,7 @@ public static final void arraySumInternal(final long[] pValues, final long pFact pValues[0] = pValues[0] * pFactor; final int valueCount = pValues.length; for(int i = 1; i < valueCount; i++) { - pValues[i] = pValues[i-1] + pValues[i] * pFactor; + pValues[i] = pValues[i-1] + (pValues[i] * pFactor); } } @@ -140,7 +236,7 @@ public static final void arraySumInto(final long[] pValues, final long[] pTarget pTargetValues[0] = pValues[0] * pFactor; final int valueCount = pValues.length; for(int i = 1; i < valueCount; i++) { - pTargetValues[i] = pTargetValues[i-1] + pValues[i] * pFactor; + pTargetValues[i] = pTargetValues[i-1] + (pValues[i] * pFactor); } } @@ -166,18 +262,18 @@ public static float[] rotateAroundCenter(final float[] pVertices, final float pR for(int i = pVertices.length - 2; i >= 0; i -= 2) { final float pX = pVertices[i]; final float pY = pVertices[i + 1]; - pVertices[i] = pRotationCenterX + (cosRotationInRad * (pX - pRotationCenterX) - sinRotationRad * (pY - pRotationCenterY)); - pVertices[i + 1] = pRotationCenterY + (sinRotationRad * (pX - pRotationCenterX) + cosRotationInRad * (pY - pRotationCenterY)); + pVertices[i] = pRotationCenterX + ((cosRotationInRad * (pX - pRotationCenterX)) - (sinRotationRad * (pY - pRotationCenterY))); + pVertices[i + 1] = pRotationCenterY + ((sinRotationRad * (pX - pRotationCenterX)) + (cosRotationInRad * (pY - pRotationCenterY))); } } return pVertices; } public static float[] scaleAroundCenter(final float[] pVertices, final float pScaleX, final float pScaleY, final float pScaleCenterX, final float pScaleCenterY) { - if(pScaleX != 1 || pScaleY != 1) { + if((pScaleX != 1) || (pScaleY != 1)) { for(int i = pVertices.length - 2; i >= 0; i -= 2) { - pVertices[i] = pScaleCenterX + (pVertices[i] - pScaleCenterX) * pScaleX; - pVertices[i + 1] = pScaleCenterY + (pVertices[i + 1] - pScaleCenterY) * pScaleY; + pVertices[i] = pScaleCenterX + ((pVertices[i] - pScaleCenterX) * pScaleX); + pVertices[i + 1] = pScaleCenterY + ((pVertices[i + 1] - pScaleCenterY) * pScaleY); } } @@ -203,11 +299,11 @@ public static float[] revertRotateAndScaleAroundCenter(final float[] pVertices, } public static final boolean isInBounds(final int pMinValue, final int pMaxValue, final int pValue) { - return pValue >= pMinValue && pValue <= pMaxValue; + return (pValue >= pMinValue) && (pValue <= pMaxValue); } public static final boolean isInBounds(final float pMinValue, final float pMaxValue, final float pValue) { - return pValue >= pMinValue && pValue <= pMaxValue; + return (pValue >= pMinValue) && (pValue <= pMaxValue); } /** @@ -253,7 +349,7 @@ public static final float length(final float pX, final float pY){ * @return pX * (1 - pMix) + pY * pMix */ public static final float mix(final float pX, final float pY, final float pMix) { - return pX * (1 - pMix) + pY * pMix; + return (pX * (1 - pMix)) + (pY * pMix); } /** @@ -263,23 +359,23 @@ public static final float mix(final float pX, final float pY, final float pMix) * @return (int)Math.round(pX * (1 - pMix) + pY * pMix) */ public static final int mix(final int pX, final int pY, final float pMix) { - return (int)Math.round(pX * (1 - pMix) + pY * pMix); + return Math.round((pX * (1 - pMix)) + (pY * pMix)); } public static final boolean isEven(final int n) { - return n % 2 == 0; + return (n % 2) == 0; } public static final boolean isOdd(final int n) { - return n % 2 == 1; + return (n % 2) == 1; } - public static float dot(final float pXA, final float pYA, final float pXB, final float pYB) { - return pXA * pXB + pYA * pYB; + public static float dot(final float pXA, final float pYA, final float pXB, final float pYB) { + return (pXA * pXB) + (pYA * pYB); } - public static float cross(final float pXA, final float pYA, final float pXB, final float pYB) { - return pXA * pYB - pXB * pYA; + public static float cross(final float pXA, final float pYA, final float pXB, final float pYB) { + return (pXA * pYB) - (pXB * pYA); } // =========================================================== From 765ea6e20177a3d911b4c058c53a01e7131a795d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 May 2012 17:32:31 -0700 Subject: [PATCH 050/252] Added MathUtils.min/max for 3 to 5 elements for byte/short. --- src/org/andengine/util/math/MathUtils.java | 48 ++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index 0cac6bd87..f9a328a0a 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -38,6 +38,30 @@ public final class MathUtils { // Methods // =========================================================== + public static byte min(final byte pA, final byte pB, final byte pC) { + return (byte) Math.min(Math.min(pA, pB), pC); + } + + public static byte min(final byte pA, final byte pB, final byte pC, final byte pD) { + return (byte) Math.min(Math.min(Math.min(pA, pB), pC), pD); + } + + public static byte min(final byte pA, final byte pB, final byte pC, final byte pD, final byte pE) { + return (byte) Math.min(Math.min(Math.min(Math.min(pA, pB), pC), pD), pE); + } + + public static short min(final short pA, final short pB, final short pC) { + return (short) Math.min(Math.min(pA, pB), pC); + } + + public static short min(final short pA, final short pB, final short pC, final short pD) { + return (short) Math.min(Math.min(Math.min(pA, pB), pC), pD); + } + + public static short min(final short pA, final short pB, final short pC, final short pD, final short pE) { + return (short) Math.min(Math.min(Math.min(Math.min(pA, pB), pC), pD), pE); + } + public static int min(final int pA, final int pB, final int pC) { return Math.min(Math.min(pA, pB), pC); } @@ -86,6 +110,30 @@ public static double min(final double pA, final double pB, final double pC, fina return Math.min(Math.min(Math.min(Math.min(pA, pB), pC), pD), pE); } + public static byte max(final byte pA, final byte pB, final byte pC) { + return (byte) Math.max(Math.max(pA, pB), pC); + } + + public static byte max(final byte pA, final byte pB, final byte pC, final byte pD) { + return (byte) Math.max(Math.max(Math.max(pA, pB), pC), pD); + } + + public static byte max(final byte pA, final byte pB, final byte pC, final byte pD, final byte pE) { + return (byte) Math.max(Math.max(Math.max(Math.max(pA, pB), pC), pD), pE); + } + + public static short max(final short pA, final short pB, final short pC) { + return (short) Math.max(Math.max(pA, pB), pC); + } + + public static short max(final short pA, final short pB, final short pC, final short pD) { + return (short) Math.max(Math.max(Math.max(pA, pB), pC), pD); + } + + public static short max(final short pA, final short pB, final short pC, final short pD, final short pE) { + return (short) Math.max(Math.max(Math.max(Math.max(pA, pB), pC), pD), pE); + } + public static int max(final int pA, final int pB, final int pC) { return Math.max(Math.max(pA, pB), pC); } From 59298ba66430be34643c161f8b68f205bc9f6930 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 May 2012 17:35:38 -0700 Subject: [PATCH 051/252] Added ClipEntity. Added convenience methods in Camera class to convert scene coordinates to surface coordinates. --- src/org/andengine/engine/Engine.java | 15 +-- src/org/andengine/engine/camera/Camera.java | 123 ++++++++++++++++-- .../DoubleSceneSplitScreenEngine.java | 6 +- .../SingleSceneSplitScreenEngine.java | 6 +- src/org/andengine/entity/Entity.java | 28 ++-- src/org/andengine/entity/IEntity.java | 16 +-- src/org/andengine/entity/clip/ClipEntity.java | 119 +++++++++++++++++ .../andengine/entity/scene/CameraScene.java | 8 +- .../andengine/entity/scene/ITouchArea.java | 4 +- src/org/andengine/entity/scene/Scene.java | 2 +- .../item/decorator/BaseMenuItemDecorator.java | 32 ++--- 11 files changed, 290 insertions(+), 69 deletions(-) create mode 100644 src/org/andengine/entity/clip/ClipEntity.java diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index 4c7423f7a..ecaabebef 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -422,14 +422,11 @@ public boolean onTouch(final View pView, final MotionEvent pSurfaceMotionEvent) @Override public boolean onTouchEvent(final TouchEvent pSurfaceTouchEvent) { - /* - * Let the engine determine which scene and camera this event should be - * handled by. - */ + /* Let the engine determine which scene and camera this event should be handled by. */ final Scene scene = this.getSceneFromSurfaceTouchEvent(pSurfaceTouchEvent); final Camera camera = this.getCameraFromSurfaceTouchEvent(pSurfaceTouchEvent); - this.convertSurfaceToSceneTouchEvent(camera, pSurfaceTouchEvent); + this.convertSurfaceTouchEventToSceneTouchEvent(camera, pSurfaceTouchEvent); if(this.onTouchHUD(camera, pSurfaceTouchEvent)) { return true; @@ -529,12 +526,12 @@ protected Scene getSceneFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { return this.mScene; } - protected void convertSurfaceToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { - pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, this.mSurfaceWidth, this.mSurfaceHeight); + protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { + pCamera.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, this.mSurfaceWidth, this.mSurfaceHeight); } - protected void convertSceneToSurfaceTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { - pCamera.convertSceneToSurfaceTouchEvent(pSurfaceTouchEvent, this.mSurfaceWidth, this.mSurfaceHeight); + protected void convertSceneTouchEventToSurfaceTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { + pCamera.convertSceneTouchEventToSurfaceTouchEvent(pSurfaceTouchEvent, this.mSurfaceWidth, this.mSurfaceHeight); } void onTickUpdate() throws InterruptedException { diff --git a/src/org/andengine/engine/camera/Camera.java b/src/org/andengine/engine/camera/Camera.java index 53e794c18..bff186b12 100644 --- a/src/org/andengine/engine/camera/Camera.java +++ b/src/org/andengine/engine/camera/Camera.java @@ -325,7 +325,7 @@ private void applyRotation(final GLState pGLState, final float pRotationCenterX, pGLState.translateProjectionGLMatrixf(-pRotationCenterX, -pRotationCenterY, 0); } - public void convertSceneToCameraSceneTouchEvent(final TouchEvent pSceneTouchEvent) { + public void convertSceneTouchEventToCameraSceneTouchEvent(final TouchEvent pSceneTouchEvent) { this.unapplySceneRotation(pSceneTouchEvent); this.applySceneToCameraSceneOffset(pSceneTouchEvent); @@ -350,7 +350,7 @@ public float[] getCameraSceneCoordinatesFromSceneCoordinates(final float[] pScen return pSceneCoordinates; } - public void convertCameraSceneToSceneTouchEvent(final TouchEvent pCameraSceneTouchEvent) { + public void convertCameraSceneTouchEventToSceneTouchEvent(final TouchEvent pCameraSceneTouchEvent) { this.unapplyCameraSceneRotation(pCameraSceneTouchEvent); this.unapplySceneToCameraSceneOffset(pCameraSceneTouchEvent); @@ -476,8 +476,12 @@ private void unapplyCameraSceneRotation(final TouchEvent pCameraSceneTouchEvent) } } - // TODO Camera already knows about its surfaceWidth, is there a need to pass it in here again? - public void convertSurfaceToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, final int pSurfaceWidth, final int pSurfaceHeight) { + + public void convertSurfaceTouchEventToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent) { + this.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, this.mSurfaceWidth, this.mSurfaceHeight); + } + + public void convertSurfaceTouchEventToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, final int pSurfaceWidth, final int pSurfaceHeight) { final float relativeX; final float relativeY; @@ -501,10 +505,44 @@ public void convertSurfaceToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, relativeY = 1 - (Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] / pSurfaceHeight); } - this.convertAxisAlignedSurfaceToSceneTouchEvent(pSurfaceTouchEvent, relativeX, relativeY); + this.convertAxisAlignedSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, relativeX, relativeY); } - private void convertAxisAlignedSurfaceToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, final float pRelativeX, final float pRelativeY) { + public float[] getSceneCoordinatesFromSurfaceCoordinates(final float pSurfaceX, final float pSurfaceY) { + Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSurfaceX; + Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSurfaceY; + + return this.getSceneCoordinatesFromSurfaceCoordinates(Camera.VERTICES_TMP); + } + + public float[] getSceneCoordinatesFromSurfaceCoordinates(final float[] pSurfaceCoordinates) { + return this.getSceneCoordinatesFromSurfaceCoordinates(pSurfaceCoordinates, this.mSurfaceWidth, this.mSurfaceHeight); + } + + public float[] getSceneCoordinatesFromSurfaceCoordinates(final float[] pSurfaceCoordinates, final int pSurfaceWidth, final int pSurfaceHeight) { + final float relativeX; + final float relativeY; + + final float rotation = this.mRotation; + if(rotation == 0) { + relativeX = pSurfaceCoordinates[Constants.VERTEX_INDEX_X] / pSurfaceWidth; + relativeY = 1 - (pSurfaceCoordinates[Constants.VERTEX_INDEX_Y] / pSurfaceHeight); + } else if(rotation == 180) { + relativeX = 1 - (pSurfaceCoordinates[Constants.VERTEX_INDEX_X] / pSurfaceWidth); + relativeY = pSurfaceCoordinates[Constants.VERTEX_INDEX_Y] / pSurfaceHeight; + } else { + MathUtils.rotateAroundCenter(pSurfaceCoordinates, rotation, pSurfaceWidth >> 1, pSurfaceHeight >> 1); // TODO Use a Transformation object instead!?! + + relativeX = pSurfaceCoordinates[Constants.VERTEX_INDEX_X] / pSurfaceWidth; + relativeY = 1 - (pSurfaceCoordinates[Constants.VERTEX_INDEX_Y] / pSurfaceHeight); + } + + this.convertAxisAlignedSurfaceCoordinatesToSceneCoordinates(pSurfaceCoordinates, relativeX, relativeY); + + return pSurfaceCoordinates; + } + + private void convertAxisAlignedSurfaceTouchEventToSceneTouchEvent(final TouchEvent pSurfaceTouchEvent, final float pRelativeX, final float pRelativeY) { final float xMin = this.getXMin(); final float xMax = this.getXMax(); final float yMin = this.getYMin(); @@ -516,13 +554,32 @@ private void convertAxisAlignedSurfaceToSceneTouchEvent(final TouchEvent pSurfac pSurfaceTouchEvent.set(x, y); } - public void convertSceneToSurfaceTouchEvent(final TouchEvent pSceneTouchEvent, final int pSurfaceWidth, final int pSurfaceHeight) { + private void convertAxisAlignedSurfaceCoordinatesToSceneCoordinates(final float[] pSurfaceCoordinates, final float pRelativeX, final float pRelativeY) { + final float xMin = this.getXMin(); + final float xMax = this.getXMax(); + final float yMin = this.getYMin(); + final float yMax = this.getYMax(); + + final float x = xMin + pRelativeX * (xMax - xMin); + final float y = yMin + pRelativeY * (yMax - yMin); + + pSurfaceCoordinates[Constants.VERTEX_INDEX_X] = x; + pSurfaceCoordinates[Constants.VERTEX_INDEX_Y] = y; + } + + + public void convertSceneTouchEventToSurfaceTouchEvent(final TouchEvent pSceneTouchEvent) { + this.convertSceneTouchEventToSurfaceTouchEvent(pSceneTouchEvent, this.mSurfaceWidth, this.mSurfaceHeight); + } + + public void convertSceneTouchEventToSurfaceTouchEvent(final TouchEvent pSceneTouchEvent, final int pSurfaceWidth, final int pSurfaceHeight) { this.convertAxisAlignedSceneToSurfaceTouchEvent(pSceneTouchEvent, pSurfaceWidth, pSurfaceHeight); final float rotation = this.mRotation; if(rotation == 0) { - pSceneTouchEvent.setY(pSurfaceHeight - pSceneTouchEvent.getY()); + /* Nothing. */ } else if(rotation == 180) { + pSceneTouchEvent.setY(pSurfaceHeight - pSceneTouchEvent.getY()); pSceneTouchEvent.setX(pSurfaceWidth - pSceneTouchEvent.getX()); } else { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneTouchEvent.getX(); @@ -534,6 +591,37 @@ public void convertSceneToSurfaceTouchEvent(final TouchEvent pSceneTouchEvent, f } } + public float[] getSurfaceCoordinatesFromSceneCoordinates(final float pSceneX, final float pSceneY) { + return this.getSurfaceCoordinatesFromSceneCoordinates(pSceneX, pSceneY, mSurfaceWidth, mSurfaceHeight); + } + + public float[] getSurfaceCoordinatesFromSceneCoordinates(final float pSceneX, final float pSceneY, final int pSurfaceWidth, final int pSurfaceHeight) { + Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneX; + Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSceneY; + + return this.getSurfaceCoordinatesFromSceneCoordinates(Camera.VERTICES_TMP, pSurfaceWidth, pSurfaceHeight); + } + + public float[] getSurfaceCoordinatesFromSceneCoordinates(final float[] pSceneCoordinates) { + return this.getSurfaceCoordinatesFromSceneCoordinates(pSceneCoordinates, this.mSurfaceWidth, this.mSurfaceHeight); + } + + public float[] getSurfaceCoordinatesFromSceneCoordinates(final float[] pSceneCoordinates, final int pSurfaceWidth, final int pSurfaceHeight) { + this.convertAxisAlignedSceneCoordinatesToSurfaceCoordinates(pSceneCoordinates, pSurfaceWidth, pSurfaceHeight); + + final float rotation = this.mRotation; + if(rotation == 0) { + /* Nothing. */ + } else if(rotation == 180) { + pSceneCoordinates[Constants.VERTEX_INDEX_Y] = pSurfaceHeight - pSceneCoordinates[Constants.VERTEX_INDEX_Y]; + pSceneCoordinates[Constants.VERTEX_INDEX_X] = pSurfaceWidth - pSceneCoordinates[Constants.VERTEX_INDEX_X]; + } else { + MathUtils.revertRotateAroundCenter(pSceneCoordinates, -rotation, pSurfaceWidth >> 1, pSurfaceHeight >> 1); // TODO Use a Transformation object instead!?! + } + + return pSceneCoordinates; + } + private void convertAxisAlignedSceneToSurfaceTouchEvent(final TouchEvent pSceneTouchEvent, final int pSurfaceWidth, final int pSurfaceHeight) { final float xMin = this.getXMin(); final float xMax = this.getXMax(); @@ -543,9 +631,26 @@ private void convertAxisAlignedSceneToSurfaceTouchEvent(final TouchEvent pSceneT final float relativeX = (pSceneTouchEvent.getX() - xMin) / (xMax - xMin); final float relativeY = 1 - (pSceneTouchEvent.getY() - yMin) / (yMax - yMin); - pSceneTouchEvent.set(relativeX * pSurfaceWidth, relativeY * pSurfaceHeight); + final float x = relativeX * pSurfaceWidth; + final float y = relativeY * pSurfaceHeight; + + pSceneTouchEvent.set(x, y); + } + + private void convertAxisAlignedSceneCoordinatesToSurfaceCoordinates(final float[] pSceneCoordinates, final int pSurfaceWidth, final int pSurfaceHeight) { + final float xMin = this.getXMin(); + final float xMax = this.getXMax(); + final float yMin = this.getYMin(); + final float yMax = this.getYMax(); + + final float relativeX = (pSceneCoordinates[Constants.VERTEX_INDEX_X] - xMin) / (xMax - xMin); + final float relativeY = 1 - (pSceneCoordinates[Constants.VERTEX_INDEX_Y] - yMin) / (yMax - yMin); + + pSceneCoordinates[Constants.VERTEX_INDEX_X] = relativeX * pSurfaceWidth; + pSceneCoordinates[Constants.VERTEX_INDEX_Y] = relativeY * pSurfaceHeight; } + public void registerUpdateHandler(final IUpdateHandler pUpdateHandler) { if(this.mUpdateHandlers == null) { this.allocateUpdateHandlers(); diff --git a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java index c52fefc79..3748bc704 100644 --- a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java @@ -146,14 +146,14 @@ protected void onUpdateScene(final float pSecondsElapsed) { } @Override - protected void convertSurfaceToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { + protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { final int surfaceWidthHalf = this.mSurfaceWidth >> 1; if(pCamera == this.getFirstCamera()) { - pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + pCamera.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); } else { pSurfaceTouchEvent.offset(-surfaceWidthHalf, 0); - pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + pCamera.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); } } diff --git a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java index c8df8605a..e08a47bb5 100644 --- a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java @@ -101,14 +101,14 @@ protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { } @Override - protected void convertSurfaceToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { + protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { final int surfaceWidthHalf = this.mSurfaceWidth >> 1; if(pCamera == this.getFirstCamera()) { - pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + pCamera.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); } else { pSurfaceTouchEvent.offset(-surfaceWidthHalf, 0); - pCamera.convertSurfaceToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); + pCamera.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); } } diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index d5ba331e8..50bcbb32e 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1059,12 +1059,12 @@ public void clearEntityModifiers() { @Override public float[] getSceneCenterCoordinates() { - return this.convertLocalToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f); + return this.convertLocalCoordinatesToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f); } @Override public float[] getSceneCenterCoordinates(final float[] pReuse) { - return this.convertLocalToSceneCoordinates(0, 0, pReuse); + return this.convertLocalCoordinatesToSceneCoordinates(0, 0, pReuse); } @Override @@ -1222,15 +1222,15 @@ public Transformation getSceneToLocalTransformation() { * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float, float) */ @Override - public float[] convertLocalToSceneCoordinates(final float pX, final float pY) { - return this.convertLocalToSceneCoordinates(pX, pY, Entity.VERTICES_LOCAL_TO_SCENE_TMP); + public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY) { + return this.convertLocalCoordinatesToSceneCoordinates(pX, pY, Entity.VERTICES_LOCAL_TO_SCENE_TMP); } /* (non-Javadoc) * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float, float, float[]) */ @Override - public float[] convertLocalToSceneCoordinates(final float pX, final float pY, final float[] pReuse) { + public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY, final float[] pReuse) { final Transformation localToSceneTransformation = this.getLocalToSceneTransformation(); pReuse[Constants.VERTEX_INDEX_X] = pX; @@ -1245,15 +1245,15 @@ public float[] convertLocalToSceneCoordinates(final float pX, final float pY, fi * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float[]) */ @Override - public float[] convertLocalToSceneCoordinates(final float[] pCoordinates) { - return this.convertSceneToLocalCoordinates(pCoordinates, Entity.VERTICES_LOCAL_TO_SCENE_TMP); + public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates) { + return this.convertSceneCoordinatesToLocalCoordinates(pCoordinates, Entity.VERTICES_LOCAL_TO_SCENE_TMP); } /* (non-Javadoc) * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float[], float[]) */ @Override - public float[] convertLocalToSceneCoordinates(final float[] pCoordinates, final float[] pReuse) { + public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates, final float[] pReuse) { final Transformation localToSceneTransformation = this.getLocalToSceneTransformation(); pReuse[Constants.VERTEX_INDEX_X] = pCoordinates[Constants.VERTEX_INDEX_X]; @@ -1268,15 +1268,15 @@ public float[] convertLocalToSceneCoordinates(final float[] pCoordinates, final * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float, float) */ @Override - public float[] convertSceneToLocalCoordinates(final float pX, final float pY) { - return this.convertSceneToLocalCoordinates(pX, pY, Entity.VERTICES_SCENE_TO_LOCAL_TMP); + public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY) { + return this.convertSceneCoordinatesToLocalCoordinates(pX, pY, Entity.VERTICES_SCENE_TO_LOCAL_TMP); } /* (non-Javadoc) * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float, float, float[]) */ @Override - public float[] convertSceneToLocalCoordinates(final float pX, final float pY, final float[] pReuse) { + public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY, final float[] pReuse) { pReuse[Constants.VERTEX_INDEX_X] = pX; pReuse[Constants.VERTEX_INDEX_Y] = pY; @@ -1289,15 +1289,15 @@ public float[] convertSceneToLocalCoordinates(final float pX, final float pY, fi * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float[]) */ @Override - public float[] convertSceneToLocalCoordinates(final float[] pCoordinates) { - return this.convertSceneToLocalCoordinates(pCoordinates, Entity.VERTICES_SCENE_TO_LOCAL_TMP); + public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates) { + return this.convertSceneCoordinatesToLocalCoordinates(pCoordinates, Entity.VERTICES_SCENE_TO_LOCAL_TMP); } /* (non-Javadoc) * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float[], float[]) */ @Override - public float[] convertSceneToLocalCoordinates(final float[] pCoordinates, final float[] pReuse) { + public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates, final float[] pReuse) { pReuse[Constants.VERTEX_INDEX_X] = pCoordinates[Constants.VERTEX_INDEX_X]; pReuse[Constants.VERTEX_INDEX_Y] = pCoordinates[Constants.VERTEX_INDEX_Y]; diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index ba257987f..279566a19 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -186,50 +186,50 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou * @param pY * @return a shared(!) float[] of length 2. */ - public float[] convertLocalToSceneCoordinates(final float pX, final float pY); + public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY); /** * @param pX * @param pY * @param pReuse must be of length 2. * @return pReuse as a convenience. */ - public float[] convertLocalToSceneCoordinates(final float pX, final float pY, final float[] pReuse); + public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY, final float[] pReuse); /** * @param pCoordinates must be of length 2. * @return a shared(!) float[] of length 2. */ - public float[] convertLocalToSceneCoordinates(final float[] pCoordinates); + public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates); /** * @param pCoordinates must be of length 2. * @param pReuse must be of length 2. * @return pReuse as a convenience. */ - public float[] convertLocalToSceneCoordinates(final float[] pCoordinates, final float[] pReuse); + public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates, final float[] pReuse); /** * @param pX * @param pY * @return a shared(!) float[] of length 2. */ - public float[] convertSceneToLocalCoordinates(final float pX, final float pY); + public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY); /** * @param pX * @param pY * @param pReuse must be of length 2. * @return pReuse as a convenience. */ - public float[] convertSceneToLocalCoordinates(final float pX, final float pY, final float[] pReuse); + public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY, final float[] pReuse); /** * @param pCoordinates must be of length 2. * @return a shared(!) float[] of length 2. */ - public float[] convertSceneToLocalCoordinates(final float[] pCoordinates); + public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates); /** * @param pCoordinates must be of length 2. * @param pReuse must be of length 2. * @return pReuse as a convenience. */ - public float[] convertSceneToLocalCoordinates(final float[] pCoordinates, final float[] pReuse); + public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates, final float[] pReuse); public Transformation getLocalToSceneTransformation(); public Transformation getSceneToLocalTransformation(); diff --git a/src/org/andengine/entity/clip/ClipEntity.java b/src/org/andengine/entity/clip/ClipEntity.java new file mode 100644 index 000000000..87366f21f --- /dev/null +++ b/src/org/andengine/entity/clip/ClipEntity.java @@ -0,0 +1,119 @@ +package org.andengine.entity.clip; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.Entity; +import org.andengine.opengl.util.GLState; +import org.andengine.util.Constants; +import org.andengine.util.math.MathUtils; + +import android.opengl.GLES20; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 13:53:29 - 10.05.2012 + */ +public class ClipEntity extends Entity { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private boolean mClippingEnabled = true; + + // =========================================================== + // Constructors + // =========================================================== + + public ClipEntity() { + super(); + } + + public ClipEntity(final float pX, final float pY) { + super(pX, pY); + } + + public ClipEntity(final float pX, final float pY, final float pWidth, final float pHeight) { + super(pX, pY, pWidth, pHeight); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isClippingEnabled() { + return this.mClippingEnabled; + } + + public void setClippingEnabled(final boolean pClippingEnabled) { + this.mClippingEnabled = pClippingEnabled; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { + if(this.mClippingEnabled) { + /* Enable scissor test, while remembering previous state. */ + final boolean wasScissorTestEnabled = pGLState.enableScissorTest(); + + final int surfaceHeight = pCamera.getSurfaceHeight(); + + /* In order to apply clipping, we need to determine the the axis aligned bounds in OpenGL coordinates. */ + + /* Determine clipping coordinates of each corner in surface coordinates. */ + final float[] lowerLeftSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(0, 0)); + final int lowerLeftX = (int)Math.round(lowerLeftSurfaceCoordinates[Constants.VERTEX_INDEX_X]); + final int lowerLeftY = surfaceHeight - (int)Math.round(lowerLeftSurfaceCoordinates[Constants.VERTEX_INDEX_Y]); + + final float[] upperLeftSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(0, this.mHeight)); + final int upperLeftX = (int)Math.round(upperLeftSurfaceCoordinates[Constants.VERTEX_INDEX_X]); + final int upperLeftY = surfaceHeight - (int)Math.round(upperLeftSurfaceCoordinates[Constants.VERTEX_INDEX_Y]); + + final float[] upperRightSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(this.mWidth, this.mHeight)); + final int upperRightX = (int)Math.round(upperRightSurfaceCoordinates[Constants.VERTEX_INDEX_X]); + final int upperRightY = surfaceHeight - (int)Math.round(upperRightSurfaceCoordinates[Constants.VERTEX_INDEX_Y]); + + final float[] lowerRightSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(this.mWidth, 0)); + final int lowerRightX = (int)Math.round(lowerRightSurfaceCoordinates[Constants.VERTEX_INDEX_X]); + final int lowerRightY = surfaceHeight - (int)Math.round(lowerRightSurfaceCoordinates[Constants.VERTEX_INDEX_Y]); + + /* Determine minimum and maximum x clipping coordinates. */ + final int minClippingX = MathUtils.min(lowerLeftX, upperLeftX, upperRightX, lowerRightX); + final int maxClippingX = MathUtils.max(lowerLeftX, upperLeftX, upperRightX, lowerRightX); + + /* Determine minimum and maximum y clipping coordinates. */ + final int minClippingY = MathUtils.min(lowerLeftY, upperLeftY, upperRightY, lowerRightY); + final int maxClippingY = MathUtils.max(lowerLeftY, upperLeftY, upperRightY, lowerRightY); + + /* Determine clipping width and height. */ + final int clippingWidth = maxClippingX - minClippingX; + final int clippingHeight = maxClippingY - minClippingY; + + /* Finally apply the clipping. */ + GLES20.glScissor(minClippingX, minClippingY, clippingWidth, clippingHeight); + + /* Draw children, etc... */ + super.onManagedDraw(pGLState, pCamera); + + /* Revert scissor test to previous state. */ + pGLState.setScissorTestEnabled(wasScissorTestEnabled); + } else { + super.onManagedDraw(pGLState, pCamera); + } + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/scene/CameraScene.java b/src/org/andengine/entity/scene/CameraScene.java index 810b1b0c9..e10eeaf23 100644 --- a/src/org/andengine/entity/scene/CameraScene.java +++ b/src/org/andengine/entity/scene/CameraScene.java @@ -85,14 +85,14 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { if(this.mCamera == null) { return false; } else { - this.mCamera.convertSceneToCameraSceneTouchEvent(pSceneTouchEvent); + this.mCamera.convertSceneTouchEventToCameraSceneTouchEvent(pSceneTouchEvent); final boolean handled = super.onSceneTouchEvent(pSceneTouchEvent); if(handled) { return true; } else { - this.mCamera.convertCameraSceneToSceneTouchEvent(pSceneTouchEvent); + this.mCamera.convertCameraSceneTouchEventToSceneTouchEvent(pSceneTouchEvent); return false; } } @@ -102,9 +102,9 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { protected boolean onChildSceneTouchEvent(final TouchEvent pSceneTouchEvent) { final boolean childIsCameraScene = this.mChildScene instanceof CameraScene; if(childIsCameraScene) { - this.mCamera.convertCameraSceneToSceneTouchEvent(pSceneTouchEvent); + this.mCamera.convertCameraSceneTouchEventToSceneTouchEvent(pSceneTouchEvent); final boolean result = super.onChildSceneTouchEvent(pSceneTouchEvent); - this.mCamera.convertSceneToCameraSceneTouchEvent(pSceneTouchEvent); + this.mCamera.convertSceneTouchEventToCameraSceneTouchEvent(pSceneTouchEvent); return result; } else { return super.onChildSceneTouchEvent(pSceneTouchEvent); diff --git a/src/org/andengine/entity/scene/ITouchArea.java b/src/org/andengine/entity/scene/ITouchArea.java index cc577f63b..67342f4ac 100644 --- a/src/org/andengine/entity/scene/ITouchArea.java +++ b/src/org/andengine/entity/scene/ITouchArea.java @@ -20,8 +20,8 @@ public interface ITouchArea { public boolean contains(final float pX, final float pY); - public float[] convertSceneToLocalCoordinates(final float pX, final float pY); - public float[] convertLocalToSceneCoordinates(final float pX, final float pY); + public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY); + public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY); /** * This method only fires if this {@link ITouchArea} is registered to the {@link Scene} via {@link Scene#registerTouchArea(ITouchArea)}. diff --git a/src/org/andengine/entity/scene/Scene.java b/src/org/andengine/entity/scene/Scene.java index 651be5288..c53bb55f5 100644 --- a/src/org/andengine/entity/scene/Scene.java +++ b/src/org/andengine/entity/scene/Scene.java @@ -401,7 +401,7 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { } private Boolean onAreaTouchEvent(final TouchEvent pSceneTouchEvent, final float sceneTouchEventX, final float sceneTouchEventY, final ITouchArea touchArea) { - final float[] touchAreaLocalCoordinates = touchArea.convertSceneToLocalCoordinates(sceneTouchEventX, sceneTouchEventY); + final float[] touchAreaLocalCoordinates = touchArea.convertSceneCoordinatesToLocalCoordinates(sceneTouchEventX, sceneTouchEventY); final float touchAreaLocalX = touchAreaLocalCoordinates[Constants.VERTEX_INDEX_X]; final float touchAreaLocalY = touchAreaLocalCoordinates[Constants.VERTEX_INDEX_Y]; diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index 2bce65e5f..bb60ffd68 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -566,43 +566,43 @@ public boolean contains(final float pX, final float pY) { } @Override - public float[] convertLocalToSceneCoordinates(final float pX, final float pY) { - return this.mMenuItem.convertLocalToSceneCoordinates(pX, pY); + public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY) { + return this.mMenuItem.convertLocalCoordinatesToSceneCoordinates(pX, pY); } @Override - public float[] convertLocalToSceneCoordinates(final float pX, final float pY, final float[] pReuse) { - return this.mMenuItem.convertLocalToSceneCoordinates(pX, pY, pReuse); + public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY, final float[] pReuse) { + return this.mMenuItem.convertLocalCoordinatesToSceneCoordinates(pX, pY, pReuse); } @Override - public float[] convertLocalToSceneCoordinates(final float[] pCoordinates) { - return this.mMenuItem.convertLocalToSceneCoordinates(pCoordinates); + public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates) { + return this.mMenuItem.convertLocalCoordinatesToSceneCoordinates(pCoordinates); } @Override - public float[] convertLocalToSceneCoordinates(final float[] pCoordinates, final float[] pReuse) { - return this.mMenuItem.convertLocalToSceneCoordinates(pCoordinates, pReuse); + public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates, final float[] pReuse) { + return this.mMenuItem.convertLocalCoordinatesToSceneCoordinates(pCoordinates, pReuse); } @Override - public float[] convertSceneToLocalCoordinates(final float pX, final float pY) { - return this.mMenuItem.convertSceneToLocalCoordinates(pX, pY); + public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY) { + return this.mMenuItem.convertSceneCoordinatesToLocalCoordinates(pX, pY); } @Override - public float[] convertSceneToLocalCoordinates(final float pX, final float pY, final float[] pReuse) { - return this.mMenuItem.convertSceneToLocalCoordinates(pX, pY, pReuse); + public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY, final float[] pReuse) { + return this.mMenuItem.convertSceneCoordinatesToLocalCoordinates(pX, pY, pReuse); } @Override - public float[] convertSceneToLocalCoordinates(final float[] pCoordinates) { - return this.mMenuItem.convertSceneToLocalCoordinates(pCoordinates); + public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates) { + return this.mMenuItem.convertSceneCoordinatesToLocalCoordinates(pCoordinates); } @Override - public float[] convertSceneToLocalCoordinates(final float[] pCoordinates, final float[] pReuse) { - return this.mMenuItem.convertSceneToLocalCoordinates(pCoordinates, pReuse); + public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates, final float[] pReuse) { + return this.mMenuItem.convertSceneCoordinatesToLocalCoordinates(pCoordinates, pReuse); } @Override From f376f8debc52934f565790535fb0894b97467338 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 May 2012 17:45:34 -0700 Subject: [PATCH 052/252] Added javadoc to ClipEntity. --- src/org/andengine/entity/clip/ClipEntity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/org/andengine/entity/clip/ClipEntity.java b/src/org/andengine/entity/clip/ClipEntity.java index 87366f21f..f191503a0 100644 --- a/src/org/andengine/entity/clip/ClipEntity.java +++ b/src/org/andengine/entity/clip/ClipEntity.java @@ -9,6 +9,9 @@ import android.opengl.GLES20; /** + * A {@link ClipEntity} clips drawing of all its children in a rectangle, which is defined as the axis aligned bounding box around itself. + * It can be attached anywhere in the scene graph, which means that it inherits transformations from its parents, which have a direct effect on the clipping area. + * * (c) Zynga 2012 * * @author Nicolas Gramlich From 330becb0c9d9dbd2fb76afcd39a4df1caa3b952a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 16:11:04 -0700 Subject: [PATCH 053/252] Fixed/Simplified ScreenGrabber. --- .../andengine/entity/util/ScreenGrabber.java | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/org/andengine/entity/util/ScreenGrabber.java b/src/org/andengine/entity/util/ScreenGrabber.java index dfc70557b..7ab96a9b9 100644 --- a/src/org/andengine/entity/util/ScreenGrabber.java +++ b/src/org/andengine/entity/util/ScreenGrabber.java @@ -4,6 +4,7 @@ import org.andengine.engine.camera.Camera; import org.andengine.entity.Entity; +import org.andengine.opengl.util.GLHelper; import org.andengine.opengl.util.GLState; import android.graphics.Bitmap; @@ -90,31 +91,16 @@ public void grab(final int pGrabX, final int pGrabY, final int pGrabWidth, final } private static Bitmap grab(final int pGrabX, final int pGrabY, final int pGrabWidth, final int pGrabHeight) { - final int[] source = new int[pGrabWidth * (pGrabY + pGrabHeight)]; - final IntBuffer sourceBuffer = IntBuffer.wrap(source); - sourceBuffer.position(0); + final int[] pixelsRGBA_8888 = new int[pGrabWidth * pGrabHeight]; + final IntBuffer pixelsRGBA_8888_Buffer = IntBuffer.wrap(pixelsRGBA_8888); // TODO Check availability of OpenGL and GLES20.GL_RGBA combinations that require less conversion operations. - // Note: There is (said to be) a bug with glReadPixels when 'y != 0', so we simply read starting from 'y == 0'. - // TODO Does that bug still exist? - GLES20.glReadPixels(pGrabX, 0, pGrabWidth, pGrabY + pGrabHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, sourceBuffer); - - final int[] pixels = new int[pGrabWidth * pGrabHeight]; - - // Convert from RGBA_8888 (Which is actually ABGR as the whole buffer seems to be inverted) --> ARGB_8888 - for (int y = 0; y < pGrabHeight; y++) { - for (int x = 0; x < pGrabWidth; x++) { - final int pixel = source[x + ((pGrabY + y) * pGrabWidth)]; - - final int blue = (pixel & 0x00FF0000) >> 16; - final int red = (pixel & 0x000000FF) << 16; - final int greenAlpha = pixel & 0xFF00FF00; - - pixels[x + ((pGrabHeight - y - 1) * pGrabWidth)] = greenAlpha | red | blue; - } - } + GLES20.glReadPixels(pGrabX, pGrabY, pGrabWidth, pGrabHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, pixelsRGBA_8888_Buffer); + + /* Convert from RGBA_8888 (Which is actually ABGR as the whole buffer seems to be inverted) --> ARGB_8888. */ + final int[] pixelsARGB_8888 = GLHelper.convertRGBA_8888toARGB_8888(pixelsRGBA_8888); - return Bitmap.createBitmap(pixels, pGrabWidth, pGrabHeight, Config.ARGB_8888); + return Bitmap.createBitmap(pixelsARGB_8888, pGrabWidth, pGrabHeight, Config.ARGB_8888); } // =========================================================== From 3f3af3e4c90d7de711215acacf1763c9d21382dd Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 16:11:42 -0700 Subject: [PATCH 054/252] Changed what Exceptions SimpleBaseGameActivity is allowed to throw. --- .../andengine/ui/activity/SimpleBaseGameActivity.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java index 6401941e6..5bb968c35 100644 --- a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java @@ -1,5 +1,7 @@ package org.andengine.ui.activity; +import java.io.IOException; + import org.andengine.entity.scene.Scene; import org.andengine.ui.IGameInterface; @@ -33,25 +35,25 @@ public abstract class SimpleBaseGameActivity extends BaseGameActivity { // Methods for/from SuperClass/Interfaces // =========================================================== - protected abstract void onCreateResources(); + protected abstract void onCreateResources() throws IOException; protected abstract Scene onCreateScene(); @Override - public final void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws Exception { + public final void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws IOException { this.onCreateResources(); pOnCreateResourcesCallback.onCreateResourcesFinished(); } @Override - public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws Exception { + public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws IOException { final Scene scene = this.onCreateScene(); pOnCreateSceneCallback.onCreateSceneFinished(scene); } @Override - public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception { + public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) { pOnPopulateSceneCallback.onPopulateSceneFinished(); } From af643924bce3f98ddf513a40c708f155c4e039f9 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 16:40:50 -0700 Subject: [PATCH 055/252] Updated RepearingSpriteBackground to only take a ITextureRegion instead of internally creating the Texture. --- .../background/RepeatingSpriteBackground.java | 51 ++++--------------- 1 file changed, 9 insertions(+), 42 deletions(-) diff --git a/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java b/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java index 7aef2106f..67f7e7d2a 100644 --- a/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java +++ b/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java @@ -1,17 +1,11 @@ package org.andengine.entity.scene.background; import org.andengine.entity.sprite.Sprite; -import org.andengine.opengl.texture.TextureManager; -import org.andengine.opengl.texture.TextureOptions; -import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas; -import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory; -import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; -import org.andengine.opengl.texture.bitmap.BitmapTextureFormat; import org.andengine.opengl.texture.region.ITextureRegion; import org.andengine.opengl.vbo.VertexBufferObjectManager; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich @@ -26,38 +20,18 @@ public class RepeatingSpriteBackground extends SpriteBackground { // Fields // =========================================================== - private BitmapTextureAtlas mBitmapTextureAtlas; - private final float mScale; - // =========================================================== // Constructors // =========================================================== - /** - * @param pCameraWidth - * @param pCameraHeight - * @param pTextureManager - * @param pBitmapTextureAtlasSource needs to be a power of two as otherwise the repeating feature doesn't work. - */ - public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHeight, final TextureManager pTextureManager, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { - this(pCameraWidth, pCameraHeight, pTextureManager, pBitmapTextureAtlasSource, 1, pVertexBufferObjectManager); - } - - public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHeight, final TextureManager pTextureManager, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final float pScale, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { - super(null); - - this.mScale = pScale; - this.mEntity = this.loadSprite(pCameraWidth, pCameraHeight, pTextureManager, pBitmapTextureAtlasSource, pVertexBufferObjectManager); + public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHeight, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { + super(RepeatingSpriteBackground.createSprite(pCameraWidth, pCameraHeight, pTextureRegion, pVertexBufferObjectManager)); } // =========================================================== // Getter & Setter // =========================================================== - public BitmapTextureAtlas getBitmapTextureAtlas() { - return this.mBitmapTextureAtlas; - } - // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @@ -66,22 +40,15 @@ public BitmapTextureAtlas getBitmapTextureAtlas() { // Methods // =========================================================== - private Sprite loadSprite(final float pCameraWidth, final float pCameraHeight, final TextureManager pTextureManager, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { - this.mBitmapTextureAtlas = new BitmapTextureAtlas(pTextureManager, pBitmapTextureAtlasSource.getTextureWidth(), pBitmapTextureAtlasSource.getTextureHeight(), BitmapTextureFormat.RGBA_8888, TextureOptions.REPEATING_NEAREST); - final ITextureRegion textureRegion = BitmapTextureAtlasTextureRegionFactory.createFromSource(this.mBitmapTextureAtlas, pBitmapTextureAtlasSource, 0, 0); - - final int width = Math.round(pCameraWidth / this.mScale); - final int height = Math.round(pCameraHeight / this.mScale); + private static Sprite createSprite(final float pCameraWidth, final float pCameraHeight, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { + final float scale = pTextureRegion.getScale(); - textureRegion.setTextureWidth(width); - textureRegion.setTextureHeight(height); + final int width = Math.round(pCameraWidth / scale); + final int height = Math.round(pCameraHeight / scale); - this.mBitmapTextureAtlas.load(); + pTextureRegion.setTextureSize(width, height); - final Sprite sprite = new Sprite(0, 0, width, height, textureRegion, pVertexBufferObjectManager); - sprite.setScaleCenter(0, 0); - sprite.setScale(this.mScale); - return sprite; + return new Sprite(pCameraWidth * 0.5f, pCameraHeight * 0.5f, width * scale, height * scale, pTextureRegion, pVertexBufferObjectManager); } // =========================================================== From ec584b655ec0d433a37b5ba74c4aaaf483119117 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 16:41:51 -0700 Subject: [PATCH 056/252] Fixed RenderTexture being flipped vertically after coordinate system change. --- src/org/andengine/opengl/texture/render/RenderTexture.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/andengine/opengl/texture/render/RenderTexture.java b/src/org/andengine/opengl/texture/render/RenderTexture.java index 29719cd68..e83a21f73 100644 --- a/src/org/andengine/opengl/texture/render/RenderTexture.java +++ b/src/org/andengine/opengl/texture/render/RenderTexture.java @@ -243,11 +243,11 @@ public void begin(final GLState pGLState, final boolean pFlipX, final boolean pF right = this.mWidth; } if(pFlipY) { - top = this.mHeight; - bottom = 0; - } else { top = 0; bottom = this.mHeight; + } else { + top = this.mHeight; + bottom = 0; } pGLState.orthoProjectionGLMatrixf(left, right, bottom, top, -1, 1); From 32055edb914638ac4595bc8d9de923eb17fec33a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 16:42:30 -0700 Subject: [PATCH 057/252] TextureRegionFactory now returns actual TextureRegions instead of ITextureRegion interface. --- .../opengl/texture/region/TextureRegionFactory.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java index 1a222f94d..a1aba0832 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java @@ -38,19 +38,19 @@ public class TextureRegionFactory { // Methods // =========================================================== - public static ITextureRegion extractFromTexture(final ITexture pTexture) { + public static TextureRegion extractFromTexture(final ITexture pTexture) { return TextureRegionFactory.extractFromTexture(pTexture, false); } - public static ITextureRegion extractFromTexture(final ITexture pTexture, final int pTextureX, final int pTextureY, final int pWidth, final int pHeight) { + public static TextureRegion extractFromTexture(final ITexture pTexture, final int pTextureX, final int pTextureY, final int pWidth, final int pHeight) { return TextureRegionFactory.extractFromTexture(pTexture, pTextureX, pTextureY, pWidth, pHeight, false); } - public static ITextureRegion extractFromTexture(final ITexture pTexture, final boolean pRotated) { + public static TextureRegion extractFromTexture(final ITexture pTexture, final boolean pRotated) { return new TextureRegion(pTexture, 0, 0, pTexture.getWidth(), pTexture.getHeight(), pRotated); } - public static ITextureRegion extractFromTexture(final ITexture pTexture, final int pTextureX, final int pTextureY, final int pWidth, final int pHeight, final boolean pRotated) { + public static TextureRegion extractFromTexture(final ITexture pTexture, final int pTextureX, final int pTextureY, final int pWidth, final int pHeight, final boolean pRotated) { return new TextureRegion(pTexture, pTextureX, pTextureY, pWidth, pHeight, pRotated); } @@ -58,7 +58,7 @@ public static ITextureRegion createFromSource(fi return TextureRegionFactory.createFromSource(pTextureAtlas, pTextureAtlasSource, pTextureX, pTextureY, false); } - public static ITextureRegion createFromSource(final ITextureAtlas pTextureAtlas, final T pTextureAtlasSource, final int pTextureX, final int pTextureY, final boolean pRotated) { + public static TextureRegion createFromSource(final ITextureAtlas pTextureAtlas, final T pTextureAtlasSource, final int pTextureX, final int pTextureY, final boolean pRotated) { final TextureRegion textureRegion = new TextureRegion(pTextureAtlas, pTextureX, pTextureY, pTextureAtlasSource.getTextureWidth(), pTextureAtlasSource.getTextureHeight(), pRotated); pTextureAtlas.addTextureAtlasSource(pTextureAtlasSource, pTextureX, pTextureY); return textureRegion; From e66577912edd41a6d173b495797cc8c076b68bbd Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 16:51:58 -0700 Subject: [PATCH 058/252] Minor changes. --- src/org/andengine/opengl/texture/region/TextureRegion.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/opengl/texture/region/TextureRegion.java b/src/org/andengine/opengl/texture/region/TextureRegion.java index 90e59fe3d..3df2033a7 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegion.java +++ b/src/org/andengine/opengl/texture/region/TextureRegion.java @@ -55,14 +55,11 @@ public TextureRegion(final ITexture pTexture, final float pTextureX, final float this.mTextureX = pTextureX; this.mTextureY = pTextureY; - if(pRotated) { - this.mRotated = true; - + this.mRotated = pRotated; + if(this.mRotated) { this.mTextureWidth = pTextureHeight; this.mTextureHeight = pTextureWidth; } else { - this.mRotated = false; - this.mTextureWidth = pTextureWidth; this.mTextureHeight = pTextureHeight; } From 298b7bec6918947042d4e62189ec867a815c11f7 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 16:59:54 -0700 Subject: [PATCH 059/252] Pimped RepeatingSpriteBackground to optionally take a scale parameter. --- .../background/RepeatingSpriteBackground.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java b/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java index 67f7e7d2a..080039e9a 100644 --- a/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java +++ b/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java @@ -16,6 +16,8 @@ public class RepeatingSpriteBackground extends SpriteBackground { // Constants // =========================================================== + private static final float SCALE_DEFAULT = 1; + // =========================================================== // Fields // =========================================================== @@ -25,7 +27,11 @@ public class RepeatingSpriteBackground extends SpriteBackground { // =========================================================== public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHeight, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { - super(RepeatingSpriteBackground.createSprite(pCameraWidth, pCameraHeight, pTextureRegion, pVertexBufferObjectManager)); + this(pCameraWidth, pCameraHeight, pTextureRegion, SCALE_DEFAULT, pVertexBufferObjectManager); + } + + public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHeight, final ITextureRegion pTextureRegion, final float pScale, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { + super(RepeatingSpriteBackground.createSprite(pCameraWidth, pCameraHeight, pTextureRegion, pScale, pVertexBufferObjectManager)); } // =========================================================== @@ -40,15 +46,13 @@ public RepeatingSpriteBackground(final float pCameraWidth, final float pCameraHe // Methods // =========================================================== - private static Sprite createSprite(final float pCameraWidth, final float pCameraHeight, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { - final float scale = pTextureRegion.getScale(); - - final int width = Math.round(pCameraWidth / scale); - final int height = Math.round(pCameraHeight / scale); + private static Sprite createSprite(final float pCameraWidth, final float pCameraHeight, final ITextureRegion pTextureRegion, final float pScale, final VertexBufferObjectManager pVertexBufferObjectManager) throws IllegalArgumentException { + final int width = Math.round(pCameraWidth / pScale); + final int height = Math.round(pCameraHeight / pScale); pTextureRegion.setTextureSize(width, height); - return new Sprite(pCameraWidth * 0.5f, pCameraHeight * 0.5f, width * scale, height * scale, pTextureRegion, pVertexBufferObjectManager); + return new Sprite(pCameraWidth * 0.5f, pCameraHeight * 0.5f, width * pScale, height * pScale, pTextureRegion, pVertexBufferObjectManager); } // =========================================================== From 57ab9a431c369b393d1d3ca1f895fd3d5a21ce7d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 17:23:23 -0700 Subject: [PATCH 060/252] Added some constructors to EmptyTexture. --- .../opengl/texture/EmptyTexture.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/opengl/texture/EmptyTexture.java b/src/org/andengine/opengl/texture/EmptyTexture.java index bc5ba3778..bc69fcc29 100644 --- a/src/org/andengine/opengl/texture/EmptyTexture.java +++ b/src/org/andengine/opengl/texture/EmptyTexture.java @@ -28,11 +28,35 @@ public class EmptyTexture extends Texture{ // Constructors // ========================================================== + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight) { + this(pTextureManager, pWidth, pHeight, (ITextureStateListener)null); + } + + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final ITextureStateListener pTextureStateListener) { + this(pTextureManager, pWidth, pHeight, PixelFormat.RGBA_8888, pTextureStateListener); + } + + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat) { + this(pTextureManager, pWidth, pHeight, pPixelFormat, (ITextureStateListener)null); + } + + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final ITextureStateListener pTextureStateListener) { + this(pTextureManager, pWidth, pHeight, pPixelFormat, TextureOptions.DEFAULT, pTextureStateListener); + } + + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final TextureOptions pTextureOptions) { + this(pTextureManager, pWidth, pHeight, pTextureOptions, (ITextureStateListener)null); + } + + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) { + this(pTextureManager, pWidth, pHeight, PixelFormat.RGBA_8888, pTextureOptions, pTextureStateListener); + } + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions) { - this(pTextureManager, pWidth, pHeight, pPixelFormat, pTextureOptions, null); + this(pTextureManager, pWidth, pHeight, pPixelFormat, pTextureOptions, (ITextureStateListener)null); } - public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) throws IllegalArgumentException { + public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) { super(pTextureManager, pPixelFormat, pTextureOptions, pTextureStateListener); this.mWidth = pWidth; From acfc0c16e68e78cd3825ad7957cb6dc7b892b901 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 17:23:42 -0700 Subject: [PATCH 061/252] Added some convenience methods to TextureRegionFactory. --- .../opengl/texture/region/TextureRegionFactory.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java index a1aba0832..1641c4f45 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java @@ -54,6 +54,14 @@ public static TextureRegion extractFromTexture(final ITexture pTexture, final in return new TextureRegion(pTexture, pTextureX, pTextureY, pWidth, pHeight, pRotated); } + public static TiledTextureRegion extractTiledFromTexture(final ITexture pTexture, final int pTileColumns, final int pTileRows) { + return TiledTextureRegion.create(pTexture, 0, 0, pTexture.getWidth(), pTexture.getHeight(), pTileColumns, pTileRows); + } + + public static TiledTextureRegion extractTiledFromTexture(final ITexture pTexture, final int pTextureX, final int pTextureY, final int pWidth, final int pHeight, final int pTileColumns, final int pTileRows) { + return TiledTextureRegion.create(pTexture, pTextureX, pTextureY, pWidth, pHeight, pTileColumns, pTileRows); + } + public static ITextureRegion createFromSource(final ITextureAtlas pTextureAtlas, final T pTextureAtlasSource, final int pTextureX, final int pTextureY) { return TextureRegionFactory.createFromSource(pTextureAtlas, pTextureAtlasSource, pTextureX, pTextureY, false); } From 8ce414b3828f7fa600160e0eaf68051e42067b25 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 18:02:25 -0700 Subject: [PATCH 062/252] Changed what Exceptions BaseGameActivities are allowed to throw. --- src/org/andengine/ui/IGameInterface.java | 12 +++++++----- src/org/andengine/ui/activity/BaseGameActivity.java | 4 +++- .../ui/activity/LegacyBaseGameActivity.java | 10 ++++++---- .../ui/activity/SimpleBaseGameActivity.java | 2 +- .../ui/activity/SimpleLayoutGameActivity.java | 8 +++++--- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/org/andengine/ui/IGameInterface.java b/src/org/andengine/ui/IGameInterface.java index 0830162f4..bbba788b8 100644 --- a/src/org/andengine/ui/IGameInterface.java +++ b/src/org/andengine/ui/IGameInterface.java @@ -1,5 +1,7 @@ package org.andengine.ui; +import java.io.IOException; + import org.andengine.engine.Engine; import org.andengine.engine.options.EngineOptions; import org.andengine.entity.scene.Scene; @@ -23,12 +25,12 @@ public interface IGameInterface { public EngineOptions onCreateEngineOptions(); public Engine onCreateEngine(final EngineOptions pEngineOptions); - public void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws Exception; - public void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws Exception; - public void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception; + public void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws IOException; + public void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws IOException; + public void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws IOException; - public void onReloadResources() throws Exception; - public void onDestroyResources() throws Exception; + public void onReloadResources() throws IOException; + public void onDestroyResources() throws IOException; public void onGameCreated(); public void onResumeGame(); diff --git a/src/org/andengine/ui/activity/BaseGameActivity.java b/src/org/andengine/ui/activity/BaseGameActivity.java index 1dea5af89..4a906905b 100644 --- a/src/org/andengine/ui/activity/BaseGameActivity.java +++ b/src/org/andengine/ui/activity/BaseGameActivity.java @@ -1,5 +1,7 @@ package org.andengine.ui.activity; +import java.io.IOException; + import org.andengine.BuildConfig; import org.andengine.audio.music.MusicManager; import org.andengine.audio.sound.SoundManager; @@ -291,7 +293,7 @@ protected void onDestroy() { } @Override - public void onDestroyResources() throws Exception { + public void onDestroyResources() throws IOException { if(BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onDestroyResources" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } diff --git a/src/org/andengine/ui/activity/LegacyBaseGameActivity.java b/src/org/andengine/ui/activity/LegacyBaseGameActivity.java index a6df6b7dc..773966c04 100644 --- a/src/org/andengine/ui/activity/LegacyBaseGameActivity.java +++ b/src/org/andengine/ui/activity/LegacyBaseGameActivity.java @@ -1,5 +1,7 @@ package org.andengine.ui.activity; +import java.io.IOException; + import org.andengine.engine.Engine; import org.andengine.engine.options.EngineOptions; import org.andengine.entity.scene.Scene; @@ -54,26 +56,26 @@ public final Engine onCreateEngine(final EngineOptions pEngineOptions) { } @Override - public final void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws Exception { + public final void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws IOException { this.onLoadResources(); pOnCreateResourcesCallback.onCreateResourcesFinished(); } @Override - public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws Exception { + public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws IOException { final Scene scene = this.onLoadScene(); pOnCreateSceneCallback.onCreateSceneFinished(scene); } @Override - public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception { + public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws IOException { pOnPopulateSceneCallback.onPopulateSceneFinished(); } @Override - public final void onDestroyResources() throws Exception { + public final void onDestroyResources() throws IOException { super.onDestroyResources(); this.onUnloadResources(); diff --git a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java index 5bb968c35..2750cf0e2 100644 --- a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java @@ -53,7 +53,7 @@ public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallba } @Override - public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) { + public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws IOException { pOnPopulateSceneCallback.onPopulateSceneFinished(); } diff --git a/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java b/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java index 35538c592..edab67b7c 100644 --- a/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java @@ -1,5 +1,7 @@ package org.andengine.ui.activity; +import java.io.IOException; + import org.andengine.entity.scene.Scene; import org.andengine.ui.IGameInterface; @@ -37,21 +39,21 @@ public abstract class SimpleLayoutGameActivity extends LayoutGameActivity { protected abstract Scene onCreateScene(); @Override - public final void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws Exception { + public final void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws IOException { this.onCreateResources(); pOnCreateResourcesCallback.onCreateResourcesFinished(); } @Override - public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws Exception { + public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallback) throws IOException { final Scene scene = this.onCreateScene(); pOnCreateSceneCallback.onCreateSceneFinished(scene); } @Override - public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception { + public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) { pOnPopulateSceneCallback.onPopulateSceneFinished(); } From 0e97372cce589cfebe549850856146c304c27cf4 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 18:53:24 -0700 Subject: [PATCH 063/252] Minor changes. --- src/org/andengine/ui/activity/SimpleLayoutGameActivity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java b/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java index edab67b7c..6dbc7259b 100644 --- a/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java @@ -35,8 +35,8 @@ public abstract class SimpleLayoutGameActivity extends LayoutGameActivity { // Methods for/from SuperClass/Interfaces // =========================================================== - protected abstract void onCreateResources(); - protected abstract Scene onCreateScene(); + protected abstract void onCreateResources() throws IOException; + protected abstract Scene onCreateScene() throws IOException; @Override public final void onCreateResources(final OnCreateResourcesCallback pOnCreateResourcesCallback) throws IOException { @@ -53,7 +53,7 @@ public final void onCreateScene(final OnCreateSceneCallback pOnCreateSceneCallba } @Override - public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) { + public final void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) throws IOException { pOnPopulateSceneCallback.onPopulateSceneFinished(); } From 7f5f6bbba0dde14c55fb2c07aa08f5f2072306a4 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 18:55:03 -0700 Subject: [PATCH 064/252] Changed to explicit return type in BuildableTextureAtlasTextureRegionFactory.createFromSource(..). --- .../buildable/BuildableTextureAtlasTextureRegionFactory.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java index 36eb8da3c..91252f73e 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java @@ -3,7 +3,6 @@ import org.andengine.opengl.texture.atlas.ITextureAtlas; import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource; -import org.andengine.opengl.texture.region.ITextureRegion; import org.andengine.opengl.texture.region.TextureRegion; import org.andengine.opengl.texture.region.TiledTextureRegion; import org.andengine.util.call.Callback; @@ -49,7 +48,7 @@ public class BuildableTextureAtlasTextureRegionFactory { // Methods // =========================================================== - public static > ITextureRegion createFromSource(final BuildableTextureAtlas pBuildableTextureAtlas, final T pTextureAtlasSource, final boolean pRotated) { + public static > TextureRegion createFromSource(final BuildableTextureAtlas pBuildableTextureAtlas, final T pTextureAtlasSource, final boolean pRotated) { final TextureRegion textureRegion = new TextureRegion(pBuildableTextureAtlas, 0, 0, pTextureAtlasSource.getTextureWidth(), pTextureAtlasSource.getTextureHeight(), pRotated); pBuildableTextureAtlas.addTextureAtlasSource(pTextureAtlasSource, new Callback() { @Override From 70ca4283f7052d32f66f4ca2c3f988276299a82a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 May 2012 19:00:14 -0700 Subject: [PATCH 065/252] Minor change. --- src/org/andengine/opengl/texture/region/ITextureRegion.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/opengl/texture/region/ITextureRegion.java b/src/org/andengine/opengl/texture/region/ITextureRegion.java index ceb38c2f0..fd236d259 100644 --- a/src/org/andengine/opengl/texture/region/ITextureRegion.java +++ b/src/org/andengine/opengl/texture/region/ITextureRegion.java @@ -1,6 +1,7 @@ package org.andengine.opengl.texture.region; import org.andengine.opengl.texture.ITexture; +import org.andengine.util.modifier.IModifier.DeepCopyNotSupportedException; /** * (c) Zynga 2011 @@ -50,5 +51,5 @@ public interface ITextureRegion { public ITexture getTexture(); - public ITextureRegion deepCopy(); + public ITextureRegion deepCopy() throws DeepCopyNotSupportedException; } \ No newline at end of file From 0092793b2f2b3cb540a8c81398c8af8c3dbb9957 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 12 May 2012 16:24:34 -0700 Subject: [PATCH 066/252] Added ConfigChooserOptions to EngineOptions->RenderOptions. --- src/org/andengine/AndEngine.java | 3 +- .../engine/options/ConfigChooserOptions.java | 109 +++++++ .../engine/options/RenderOptions.java | 15 +- src/org/andengine/opengl/util/GLState.java | 2 +- .../andengine/opengl/view/ConfigChooser.java | 294 ++++++++---------- .../opengl/view/ConfigChooserMatcher.java | 82 +++++ .../andengine/opengl/view/EngineRenderer.java | 4 +- .../opengl/view/RenderSurfaceView.java | 5 +- 8 files changed, 337 insertions(+), 177 deletions(-) create mode 100644 src/org/andengine/engine/options/ConfigChooserOptions.java create mode 100644 src/org/andengine/opengl/view/ConfigChooserMatcher.java diff --git a/src/org/andengine/AndEngine.java b/src/org/andengine/AndEngine.java index ca986a39f..89ae31ed7 100644 --- a/src/org/andengine/AndEngine.java +++ b/src/org/andengine/AndEngine.java @@ -4,6 +4,7 @@ import javax.microedition.khronos.egl.EGLContext; import javax.microedition.khronos.egl.EGLDisplay; +import org.andengine.engine.options.ConfigChooserOptions; import org.andengine.opengl.view.ConfigChooser; import org.andengine.util.exception.DeviceNotSupportedException; import org.andengine.util.exception.DeviceNotSupportedException.DeviceNotSupportedCause; @@ -82,7 +83,7 @@ private static void checkEGLConfigChooserSupport() throws DeviceNotSupportedExce final int[] version = new int[2]; egl.eglInitialize(eglDisplay, version); - final ConfigChooser configChooser = new ConfigChooser(false); // TODO Doesn't correlate to possible multisampling request in EngineOptions... + final ConfigChooser configChooser = new ConfigChooser(new ConfigChooserOptions()); try { configChooser.chooseConfig(egl, eglDisplay); diff --git a/src/org/andengine/engine/options/ConfigChooserOptions.java b/src/org/andengine/engine/options/ConfigChooserOptions.java new file mode 100644 index 000000000..4b1cb1c51 --- /dev/null +++ b/src/org/andengine/engine/options/ConfigChooserOptions.java @@ -0,0 +1,109 @@ +package org.andengine.engine.options; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 16:01:53 - 12.05.2012 + */ +public class ConfigChooserOptions { + // =========================================================== + // Constants + // =========================================================== + + private static final int RED_SIZE_DEFAULT = 5; + private static final int GREEN_SIZE_DEFAULT = 6; + private static final int BLUE_SIZE_DEFAULT = 5; + private static final int DEPTH_SIZE_DEFAULT = 0; + private static final int ALPHA_SIZE_DEFAULT = 0; + private static final int STENCIL_SIZE_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private boolean mRequestedMultiSampling = false; + + private int mRequestedRedSize = ConfigChooserOptions.RED_SIZE_DEFAULT; + private int mRequestedGreenSize = ConfigChooserOptions.GREEN_SIZE_DEFAULT; + private int mRequestedBlueSize = ConfigChooserOptions.BLUE_SIZE_DEFAULT; + private int mRequestedAlphaSize = ConfigChooserOptions.ALPHA_SIZE_DEFAULT; + private int mRequestedDepthSize = ConfigChooserOptions.DEPTH_SIZE_DEFAULT; + private int mRequestedStencilSize = ConfigChooserOptions.STENCIL_SIZE_DEFAULT; + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public boolean isRequestedMultiSampling() { + return this.mRequestedMultiSampling; + } + + public void setRequestedMultiSampling(final boolean pRequestedMultiSampling) { + this.mRequestedMultiSampling = pRequestedMultiSampling; + } + + public int getRequestedRedSize() { + return this.mRequestedRedSize; + } + + public void setRequestedRedSize(final int pRequestedRedSize) { + this.mRequestedRedSize = pRequestedRedSize; + } + + public int getRequestedGreenSize() { + return this.mRequestedGreenSize; + } + + public void setRequestedGreenSize(final int pRequestedGreenSize) { + this.mRequestedGreenSize = pRequestedGreenSize; + } + + public int getRequestedBlueSize() { + return this.mRequestedBlueSize; + } + + public void setRequestedBlueSize(final int pRequestedBlueSize) { + this.mRequestedBlueSize = pRequestedBlueSize; + } + + public int getRequestedAlphaSize() { + return this.mRequestedAlphaSize; + } + + public void setRequestedAlphaSize(final int pRequestedAlphaSize) { + this.mRequestedAlphaSize = pRequestedAlphaSize; + } + + public int getRequestedDepthSize() { + return this.mRequestedDepthSize; + } + + public void setRequestedDepthSize(final int pRequestedDepthSize) { + this.mRequestedDepthSize = pRequestedDepthSize; + } + + public int getRequestedStencilSize() { + return this.mRequestedStencilSize; + } + + public void setRequestedStencilSize(final int pRequestedStencilSize) { + this.mRequestedStencilSize = pRequestedStencilSize; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/engine/options/RenderOptions.java b/src/org/andengine/engine/options/RenderOptions.java index c8738f4f2..448c6a93a 100644 --- a/src/org/andengine/engine/options/RenderOptions.java +++ b/src/org/andengine/engine/options/RenderOptions.java @@ -16,9 +16,10 @@ public class RenderOptions { // Fields // =========================================================== - private boolean mMultiSampling = false; private boolean mDithering = false; + private ConfigChooserOptions mConfigChooserOptions = new ConfigChooserOptions(); + // =========================================================== // Constructors // =========================================================== @@ -27,14 +28,6 @@ public class RenderOptions { // Getter & Setter // =========================================================== - public boolean isMultiSampling() { - return this.mMultiSampling; - } - - public void setMultiSampling(final boolean pMultiSampling) { - this.mMultiSampling = pMultiSampling; - } - public boolean isDithering() { return this.mDithering; } @@ -43,6 +36,10 @@ public void setDithering(final boolean pDithering) { this.mDithering = pDithering; } + public ConfigChooserOptions getConfigChooserOptions() { + return this.mConfigChooserOptions; + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index a1b179f0d..f0e7afde2 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -133,7 +133,7 @@ public void reset(final RenderOptions pRenderOptions, final ConfigChooser pConfi if(BuildConfig.DEBUG) { Debug.d("VERSION: " + this.mVersion); Debug.d("RENDERER: " + this.mRenderer); - Debug.d("EGLCONFIG: " + EGLConfig.class.getSimpleName() + "(Red=" + pConfigChooser.getRedSize() + ", Green=" + pConfigChooser.getGreenSize() + ", Blue=" + pConfigChooser.getBlueSize() + ", Alpha=" + pConfigChooser.getAlphaSize() + ", Depth=" + pConfigChooser.getDepthSize() + ", Stencil=" + pConfigChooser.getStencilSize() + ")"); + Debug.d("EGLCONFIG: " + EGLConfig.class.getSimpleName() + "(Red=" + pConfigChooser.getActualRedSize() + ", Green=" + pConfigChooser.getActualGreenSize() + ", Blue=" + pConfigChooser.getActualBlueSize() + ", Alpha=" + pConfigChooser.getActualAlphaSize() + ", Depth=" + pConfigChooser.getActualDepthSize() + ", Stencil=" + pConfigChooser.getActualStencilSize() + ")"); Debug.d("EXTENSIONS: " + this.mExtensions); Debug.d("MAX_VERTEX_ATTRIBS: " + this.mMaximumVertexAttributeCount); Debug.d("MAX_VERTEX_UNIFORM_VECTORS: " + this.mMaximumVertexShaderUniformVectorCount); diff --git a/src/org/andengine/opengl/view/ConfigChooser.java b/src/org/andengine/opengl/view/ConfigChooser.java index a1ccfe157..3ff752678 100644 --- a/src/org/andengine/opengl/view/ConfigChooser.java +++ b/src/org/andengine/opengl/view/ConfigChooser.java @@ -4,6 +4,8 @@ import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.egl.EGLDisplay; +import org.andengine.engine.options.ConfigChooserOptions; + import android.opengl.GLSurfaceView; /** @@ -19,115 +21,159 @@ public class ConfigChooser implements GLSurfaceView.EGLConfigChooser { private static final int[] BUFFER = new int[1]; - private static final int RED_SIZE = 5; - private static final int GREEN_SIZE = 6; - private static final int BLUE_SIZE = 5; - private static final int DEPTH_SIZE = 0; - private static final int ALPHA_SIZE = 0; - private static final int STENCIL_SIZE = 0; - private static final int MULTISAMPLE_COUNT = 2; // TODO Could be made variable? private static final int EGL_GLES2_BIT = 4; - private static final int[] EGLCONFIG_ATTRIBUTES_MULTISAMPLE = { - EGL10.EGL_RED_SIZE, ConfigChooser.RED_SIZE, - EGL10.EGL_GREEN_SIZE, ConfigChooser.GREEN_SIZE, - EGL10.EGL_BLUE_SIZE, ConfigChooser.BLUE_SIZE, - EGL10.EGL_ALPHA_SIZE, ConfigChooser.ALPHA_SIZE, - EGL10.EGL_DEPTH_SIZE, ConfigChooser.DEPTH_SIZE, - EGL10.EGL_STENCIL_SIZE, ConfigChooser.STENCIL_SIZE, - EGL10.EGL_RENDERABLE_TYPE, ConfigChooser.EGL_GLES2_BIT, - EGL10.EGL_SAMPLE_BUFFERS, 1, - EGL10.EGL_SAMPLES, ConfigChooser.MULTISAMPLE_COUNT, - EGL10.EGL_NONE - }; - private static final int EGL_COVERAGE_BUFFERS_NV = 0x30E0; private static final int EGL_COVERAGE_SAMPLES_NV = 0x30E1; - private static final int[] EGLCONFIG_ATTRIBUTES_COVERAGEMULTISAMPLE_NVIDIA = new int[]{ - EGL10.EGL_RED_SIZE, ConfigChooser.RED_SIZE, - EGL10.EGL_GREEN_SIZE, ConfigChooser.GREEN_SIZE, - EGL10.EGL_BLUE_SIZE, ConfigChooser.BLUE_SIZE, - EGL10.EGL_ALPHA_SIZE, ConfigChooser.ALPHA_SIZE, - EGL10.EGL_DEPTH_SIZE, ConfigChooser.DEPTH_SIZE, - EGL10.EGL_STENCIL_SIZE, ConfigChooser.STENCIL_SIZE, - EGL10.EGL_RENDERABLE_TYPE, ConfigChooser.EGL_GLES2_BIT, - ConfigChooser.EGL_COVERAGE_BUFFERS_NV, 1, - ConfigChooser.EGL_COVERAGE_SAMPLES_NV, ConfigChooser.MULTISAMPLE_COUNT, // always 5 in practice on tegra 2 - EGL10.EGL_NONE - }; - - private static final int[] EGLCONFIG_ATTRIBUTES_FALLBACK = new int[] { - EGL10.EGL_RED_SIZE, ConfigChooser.RED_SIZE, - EGL10.EGL_GREEN_SIZE, ConfigChooser.GREEN_SIZE, - EGL10.EGL_BLUE_SIZE, ConfigChooser.BLUE_SIZE, - EGL10.EGL_ALPHA_SIZE, ConfigChooser.ALPHA_SIZE, - EGL10.EGL_DEPTH_SIZE, ConfigChooser.DEPTH_SIZE, - EGL10.EGL_STENCIL_SIZE, ConfigChooser.STENCIL_SIZE, - EGL10.EGL_RENDERABLE_TYPE, ConfigChooser.EGL_GLES2_BIT, - EGL10.EGL_NONE - }; + private final int[] mMultiSampleEGLConfig; + + private final int[] mNvidiaCoverageMultiSampleEGLConfig; + + private final int[] mDefaultEGLConfig; // =========================================================== // Fields // =========================================================== - private final boolean mMultiSamplingRequested; + private final boolean mRequestedMultiSampling; + + private boolean mActualMultiSampling; + private boolean mActualCoverageMultiSampling; - private boolean mMultiSampling; - private boolean mCoverageMultiSampling; + private final int mRequestedRedSize; + private final int mRequestedGreenSize; + private final int mRequestedBlueSize; + private final int mRequestedAlphaSize; + private final int mRequestedDepthSize; + private final int mRequestedStencilSize; - private int mRedSize = -1; - private int mGreenSize = -1; - private int mBlueSize = -1; - private int mAlphaSize = -1; - private int mDepthSize = -1; - private int mStencilSize = -1; + private int mActualRedSize = -1; + private int mActualGreenSize = -1; + private int mActualBlueSize = -1; + private int mActualAlphaSize = -1; + private int mActualDepthSize = -1; + private int mActualStencilSize = -1; // =========================================================== // Constructors // =========================================================== - public ConfigChooser(final boolean pMultiSamplingRequested) { - this.mMultiSamplingRequested = pMultiSamplingRequested; + public ConfigChooser(final ConfigChooserOptions pConfigChooserOptions) { + this(pConfigChooserOptions.getRequestedRedSize(), pConfigChooserOptions.getRequestedGreenSize(), pConfigChooserOptions.getRequestedBlueSize(), pConfigChooserOptions.getRequestedAlphaSize(), pConfigChooserOptions.getRequestedDepthSize(), pConfigChooserOptions.getRequestedStencilSize(), pConfigChooserOptions.isRequestedMultiSampling()); + } + + public ConfigChooser(final int pRequestedRedSize, final int pRequestedGreenSize, final int pRequestedBlueSize, final int pRequestedAlphaSize, final int pRequestedDepthSize, final int pRequestedStencilSize, final boolean pRequestedMultiSampling) { + this.mRequestedRedSize = pRequestedRedSize; + this.mRequestedGreenSize = pRequestedGreenSize; + this.mRequestedBlueSize = pRequestedBlueSize; + this.mRequestedAlphaSize = pRequestedAlphaSize; + this.mRequestedDepthSize = pRequestedDepthSize; + this.mRequestedStencilSize = pRequestedStencilSize; + this.mRequestedMultiSampling = pRequestedMultiSampling; + + this.mMultiSampleEGLConfig = new int[] { + EGL10.EGL_RED_SIZE, pRequestedRedSize, + EGL10.EGL_GREEN_SIZE, pRequestedGreenSize, + EGL10.EGL_BLUE_SIZE, pRequestedBlueSize, + EGL10.EGL_ALPHA_SIZE, pRequestedAlphaSize, + EGL10.EGL_DEPTH_SIZE, pRequestedDepthSize, + EGL10.EGL_STENCIL_SIZE, pRequestedStencilSize, + EGL10.EGL_RENDERABLE_TYPE, ConfigChooser.EGL_GLES2_BIT, + EGL10.EGL_SAMPLE_BUFFERS, 1, + EGL10.EGL_SAMPLES, ConfigChooser.MULTISAMPLE_COUNT, + EGL10.EGL_NONE + }; + + this.mNvidiaCoverageMultiSampleEGLConfig = new int[] { + EGL10.EGL_RED_SIZE, pRequestedRedSize, + EGL10.EGL_GREEN_SIZE, pRequestedGreenSize, + EGL10.EGL_BLUE_SIZE, pRequestedBlueSize, + EGL10.EGL_ALPHA_SIZE, pRequestedAlphaSize, + EGL10.EGL_DEPTH_SIZE, pRequestedDepthSize, + EGL10.EGL_STENCIL_SIZE, pRequestedStencilSize, + EGL10.EGL_RENDERABLE_TYPE, ConfigChooser.EGL_GLES2_BIT, + ConfigChooser.EGL_COVERAGE_BUFFERS_NV, 1, + ConfigChooser.EGL_COVERAGE_SAMPLES_NV, ConfigChooser.MULTISAMPLE_COUNT, + EGL10.EGL_NONE + }; + + this.mDefaultEGLConfig = new int[] { + EGL10.EGL_RED_SIZE, pRequestedRedSize, + EGL10.EGL_GREEN_SIZE, pRequestedGreenSize, + EGL10.EGL_BLUE_SIZE, pRequestedBlueSize, + EGL10.EGL_ALPHA_SIZE, pRequestedAlphaSize, + EGL10.EGL_DEPTH_SIZE, pRequestedDepthSize, + EGL10.EGL_STENCIL_SIZE, pRequestedStencilSize, + EGL10.EGL_RENDERABLE_TYPE, ConfigChooser.EGL_GLES2_BIT, + EGL10.EGL_NONE + }; } // =========================================================== // Getter & Setter // =========================================================== - public boolean isMultiSampling() { - return this.mMultiSampling; + public boolean isRequestedMultiSampling() { + return this.mRequestedMultiSampling; + } + + public boolean isActualMultiSampling() { + return this.mActualMultiSampling; + } + + public boolean isActualCoverageMultiSampling() { + return this.mActualCoverageMultiSampling; + } + + public int getRequestedRedSize() { + return this.mRequestedRedSize; + } + + public int getActualRedSize() { + return this.mActualRedSize; + } + + public int getRequestedGreenSize() { + return this.mRequestedGreenSize; } - public boolean isCoverageMultiSampling() { - return this.mCoverageMultiSampling; + public int getActualGreenSize() { + return this.mActualGreenSize; } - public int getRedSize() { - return this.mRedSize; + public int getRequestedSize() { + return this.mRequestedBlueSize; } - public int getGreenSize() { - return this.mGreenSize; + public int getActualBlueSize() { + return this.mActualBlueSize; } - public int getBlueSize() { - return this.mBlueSize; + public int getRequestedAlphaSize() { + return this.mRequestedAlphaSize; } - public int getAlphaSize() { - return this.mAlphaSize; + public int getActualAlphaSize() { + return this.mActualAlphaSize; } - public int getDepthSize() { - return this.mDepthSize; + public int getRequestedDepthSize() { + return this.mRequestedDepthSize; } - public int getStencilSize() { - return this.mStencilSize; + public int getActualDepthSize() { + return this.mActualDepthSize; + } + + public int getRequestedStencilSize() { + return this.mRequestedStencilSize; + } + + public int getActualStencilSize() { + return this.mActualStencilSize; } // =========================================================== @@ -162,23 +208,23 @@ private EGLConfig chooseConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, f int eglConfigCount; - if(this.mMultiSamplingRequested) { - eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, ConfigChooser.EGLCONFIG_ATTRIBUTES_MULTISAMPLE); + if(this.mRequestedMultiSampling) { + eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, this.mMultiSampleEGLConfig); if(eglConfigCount > 0) { - this.mMultiSampling = true; - return this.findEGLConfig(pEGL, pEGLDisplay, ConfigChooser.EGLCONFIG_ATTRIBUTES_MULTISAMPLE, eglConfigCount, pConfigChooserMatcher); + this.mActualMultiSampling = true; + return this.findEGLConfig(pEGL, pEGLDisplay, this.mMultiSampleEGLConfig, eglConfigCount, pConfigChooserMatcher); } - eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, ConfigChooser.EGLCONFIG_ATTRIBUTES_COVERAGEMULTISAMPLE_NVIDIA); + eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, this.mNvidiaCoverageMultiSampleEGLConfig); if(eglConfigCount > 0) { - this.mCoverageMultiSampling = true; - return this.findEGLConfig(pEGL, pEGLDisplay, ConfigChooser.EGLCONFIG_ATTRIBUTES_COVERAGEMULTISAMPLE_NVIDIA, eglConfigCount, pConfigChooserMatcher); + this.mActualCoverageMultiSampling = true; + return this.findEGLConfig(pEGL, pEGLDisplay, this.mNvidiaCoverageMultiSampleEGLConfig, eglConfigCount, pConfigChooserMatcher); } } - eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, ConfigChooser.EGLCONFIG_ATTRIBUTES_FALLBACK); + eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, this.mDefaultEGLConfig); if(eglConfigCount > 0) { - return this.findEGLConfig(pEGL, pEGLDisplay, ConfigChooser.EGLCONFIG_ATTRIBUTES_FALLBACK, eglConfigCount, pConfigChooserMatcher); + return this.findEGLConfig(pEGL, pEGLDisplay, this.mDefaultEGLConfig, eglConfigCount, pConfigChooserMatcher); } else { throw new IllegalArgumentException("No " + EGLConfig.class.getSimpleName() + " found!"); } @@ -215,13 +261,13 @@ private EGLConfig findEGLConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final int depthSize = this.getConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_DEPTH_SIZE, 0); final int stencilSize = this.getConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_STENCIL_SIZE, 0); - if(pConfigChooserMatcher.matches(redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize)) { - this.mRedSize = redSize; - this.mGreenSize = greenSize; - this.mBlueSize = blueSize; - this.mAlphaSize = alphaSize; - this.mDepthSize = depthSize; - this.mStencilSize = stencilSize; + if(pConfigChooserMatcher.matches(this.mRequestedRedSize, redSize, this.mRequestedGreenSize, greenSize, this.mRequestedBlueSize, blueSize, this.mRequestedAlphaSize, alphaSize, this.mRequestedDepthSize, depthSize, this.mRequestedStencilSize, stencilSize)) { + this.mActualRedSize = redSize; + this.mActualGreenSize = greenSize; + this.mActualBlueSize = blueSize; + this.mActualAlphaSize = alphaSize; + this.mActualDepthSize = depthSize; + this.mActualStencilSize = stencilSize; return config; } } @@ -240,80 +286,4 @@ private int getConfigAttrib(final EGL10 pEGL, final EGLDisplay pEGLDisplay, fina // =========================================================== // Inner and Anonymous Classes // =========================================================== - - public enum ConfigChooserMatcher { - // =========================================================== - // Elements - // =========================================================== - - STRICT() { - @Override - public boolean matches(final int pRedSize, final int pGreenSize, final int pBlueSize, final int pAlphaSize, final int pDepthSize, final int pStencilSize) { - if(pDepthSize == ConfigChooser.DEPTH_SIZE && pStencilSize == ConfigChooser.STENCIL_SIZE) { - if(pRedSize == ConfigChooser.RED_SIZE && pGreenSize == ConfigChooser.GREEN_SIZE && pBlueSize == ConfigChooser.BLUE_SIZE && pAlphaSize == ConfigChooser.ALPHA_SIZE) { - return true; - } - } - return false; - } - }, - LOOSE_STENCIL() { - @Override - public boolean matches(final int pRedSize, final int pGreenSize, final int pBlueSize, final int pAlphaSize, final int pDepthSize, final int pStencilSize) { - if(pDepthSize == ConfigChooser.DEPTH_SIZE && pStencilSize >= ConfigChooser.STENCIL_SIZE) { - if(pRedSize == ConfigChooser.RED_SIZE && pGreenSize == ConfigChooser.GREEN_SIZE && pBlueSize == ConfigChooser.BLUE_SIZE && pAlphaSize == ConfigChooser.ALPHA_SIZE) { - return true; - } - } - return false; - } - }, - LOOSE_DEPTH_AND_STENCIL() { - @Override - public boolean matches(final int pRedSize, final int pGreenSize, final int pBlueSize, final int pAlphaSize, final int pDepthSize, final int pStencilSize) { - if(pDepthSize >= ConfigChooser.DEPTH_SIZE && pStencilSize >= ConfigChooser.STENCIL_SIZE) { - if(pRedSize == ConfigChooser.RED_SIZE && pGreenSize == ConfigChooser.GREEN_SIZE && pBlueSize == ConfigChooser.BLUE_SIZE && pAlphaSize == ConfigChooser.ALPHA_SIZE) { - return true; - } - } - return false; - } - }, - ANY() { - @Override - public boolean matches(final int pRedSize, final int pGreenSize, final int pBlueSize, final int pAlphaSize, final int pDepthSize, final int pStencilSize) { - return true; - } - }; - - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - public abstract boolean matches(final int pRedSize, final int pGreenSize, final int pBlueSize, final int pAlphaSize, final int pDepthSize, final int pStencilSize); - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== - } } \ No newline at end of file diff --git a/src/org/andengine/opengl/view/ConfigChooserMatcher.java b/src/org/andengine/opengl/view/ConfigChooserMatcher.java new file mode 100644 index 000000000..c9b26f50f --- /dev/null +++ b/src/org/andengine/opengl/view/ConfigChooserMatcher.java @@ -0,0 +1,82 @@ +package org.andengine.opengl.view; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:34:13 - 12.05.2012 + */ +public abstract class ConfigChooserMatcher { + // =========================================================== + // Constants + // =========================================================== + + public static final ConfigChooserMatcher STRICT = new ConfigChooserMatcher() { + @Override + public boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize) { + if(pDepthSize == pRequestedDepthSize && pStencilSize == pRequestedStencilSize) { + if(pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { + return true; + } + } + return false; + } + }; + + public static final ConfigChooserMatcher LOOSE_STENCIL = new ConfigChooserMatcher() { + @Override + public boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize) { + if(pDepthSize == pRequestedDepthSize && pStencilSize >= pRequestedStencilSize) { + if(pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { + return true; + } + } + return false; + } + }; + + public static final ConfigChooserMatcher LOOSE_DEPTH_AND_STENCIL = new ConfigChooserMatcher() { + @Override + public boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize) { + if(pDepthSize >= pRequestedDepthSize && pStencilSize >= pRequestedStencilSize) { + if(pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { + return true; + } + } + return false; + } + }; + + public static final ConfigChooserMatcher ANY = new ConfigChooserMatcher() { + @Override + public boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize) { + return true; + } + }; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + public abstract boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize); + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/opengl/view/EngineRenderer.java b/src/org/andengine/opengl/view/EngineRenderer.java index d84e1fd86..41fe65da0 100644 --- a/src/org/andengine/opengl/view/EngineRenderer.java +++ b/src/org/andengine/opengl/view/EngineRenderer.java @@ -42,7 +42,7 @@ public EngineRenderer(final Engine pEngine, final ConfigChooser pConfigChooser, this.mConfigChooser = pConfigChooser; this.mRendererListener = pRendererListener; this.mGLState = new GLState(); - this.mMultiSampling = this.mEngine.getEngineOptions().getRenderOptions().isMultiSampling(); + this.mMultiSampling = this.mEngine.getEngineOptions().getRenderOptions().getConfigChooserOptions().isRequestedMultiSampling(); } // =========================================================== @@ -96,7 +96,7 @@ public void onSurfaceChanged(final GL10 pGL, final int pWidth, final int pHeight @Override public void onDrawFrame(final GL10 pGL) { synchronized(GLState.class) { - if (this.mMultiSampling && this.mConfigChooser.isCoverageMultiSampling()) { + if (this.mMultiSampling && this.mConfigChooser.isActualCoverageMultiSampling()) { final int GL_COVERAGE_BUFFER_BIT_NV = 0x8000; GLES20.glClear(GL_COVERAGE_BUFFER_BIT_NV); } diff --git a/src/org/andengine/opengl/view/RenderSurfaceView.java b/src/org/andengine/opengl/view/RenderSurfaceView.java index bae24a18a..f793fbdb7 100644 --- a/src/org/andengine/opengl/view/RenderSurfaceView.java +++ b/src/org/andengine/opengl/view/RenderSurfaceView.java @@ -1,6 +1,7 @@ package org.andengine.opengl.view; import org.andengine.engine.Engine; +import org.andengine.engine.options.ConfigChooserOptions; import android.content.Context; import android.opengl.GLSurfaceView; @@ -74,8 +75,8 @@ public void setMeasuredDimensionProxy(final int pMeasuredWidth, final int pMeasu public void setRenderer(final Engine pEngine, final IRendererListener pRendererListener) { if(this.mConfigChooser == null) { - final boolean multiSampling = pEngine.getEngineOptions().getRenderOptions().isMultiSampling(); - this.mConfigChooser = new ConfigChooser(multiSampling); + final ConfigChooserOptions configChooserOptions = pEngine.getEngineOptions().getRenderOptions().getConfigChooserOptions(); + this.mConfigChooser = new ConfigChooser(configChooserOptions); } this.setEGLConfigChooser(this.mConfigChooser); From 2f1616e3765a19248ea57cdf00f9ae46a313d387 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 12 May 2012 16:57:28 -0700 Subject: [PATCH 067/252] Made IResulutionPolicy more flexible, so that it can work on any type of View. --- .../FillResolutionPolicy.java | 6 ++---- .../FixedResolutionPolicy.java | 5 ++--- .../resolutionpolicy/IResolutionPolicy.java | 19 +++++++++++++++++-- .../RatioResolutionPolicy.java | 6 ++---- .../RelativeResolutionPolicy.java | 6 ++---- .../opengl/view/RenderSurfaceView.java | 12 +++++++----- 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java index b9b062306..c9d33ffc9 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java @@ -1,7 +1,5 @@ package org.andengine.engine.options.resolutionpolicy; -import org.andengine.opengl.view.RenderSurfaceView; - import android.view.View.MeasureSpec; /** @@ -33,13 +31,13 @@ public class FillResolutionPolicy extends BaseResolutionPolicy { // =========================================================== @Override - public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { BaseResolutionPolicy.throwOnNotMeasureSpecEXACTLY(pWidthMeasureSpec, pHeightMeasureSpec); final int measuredWidth = MeasureSpec.getSize(pWidthMeasureSpec); final int measuredHeight = MeasureSpec.getSize(pHeightMeasureSpec); - pRenderSurfaceView.setMeasuredDimensionProxy(measuredWidth, measuredHeight); + pResolutionPolicyCallback.onResolutionChanged(measuredWidth, measuredHeight); } // =========================================================== diff --git a/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java index 4d823ffd2..e295b0144 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java @@ -1,6 +1,5 @@ package org.andengine.engine.options.resolutionpolicy; -import org.andengine.opengl.view.RenderSurfaceView; /** * (c) 2010 Nicolas Gramlich @@ -39,8 +38,8 @@ public FixedResolutionPolicy(final int pWidth, final int pHeight) { // =========================================================== @Override - public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { - pRenderSurfaceView.setMeasuredDimensionProxy(this.mWidth, this.mHeight); + public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + pResolutionPolicyCallback.onResolutionChanged(this.mWidth, this.mHeight); } // =========================================================== diff --git a/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java index 4e8884f70..c972eca4f 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java @@ -1,6 +1,5 @@ package org.andengine.engine.options.resolutionpolicy; -import org.andengine.opengl.view.RenderSurfaceView; /** * (c) 2010 Nicolas Gramlich @@ -18,5 +17,21 @@ public interface IResolutionPolicy { // Methods // =========================================================== - public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec); + public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback, final int pWidthMeasureSpec, final int pHeightMeasureSpec); + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static interface Callback { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onResolutionChanged(final int pWidth, final int pHeight); + } } diff --git a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java index 46ffa5b95..4e339fd08 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java @@ -1,7 +1,5 @@ package org.andengine.engine.options.resolutionpolicy; -import org.andengine.opengl.view.RenderSurfaceView; - import android.view.View.MeasureSpec; /** @@ -43,7 +41,7 @@ public RatioResolutionPolicy(final float pWidthRatio, final float pHeightRatio) // =========================================================== @Override - public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { BaseResolutionPolicy.throwOnNotMeasureSpecEXACTLY(pWidthMeasureSpec, pHeightMeasureSpec); final int specWidth = MeasureSpec.getSize(pWidthMeasureSpec); @@ -62,7 +60,7 @@ public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWid measuredWidth = Math.round(measuredHeight * desiredRatio); } - pRenderSurfaceView.setMeasuredDimensionProxy(measuredWidth, measuredHeight); + pResolutionPolicyCallback.onResolutionChanged(measuredWidth, measuredHeight); } // =========================================================== diff --git a/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java index 6ed0ec232..ee10795ef 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java @@ -1,7 +1,5 @@ package org.andengine.engine.options.resolutionpolicy; -import org.andengine.opengl.view.RenderSurfaceView; - import android.view.View.MeasureSpec; /** @@ -45,13 +43,13 @@ public RelativeResolutionPolicy(final float pWidthScale, final float pHeightScal // =========================================================== @Override - public void onMeasure(final RenderSurfaceView pRenderSurfaceView, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { + public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback, final int pWidthMeasureSpec, final int pHeightMeasureSpec) { BaseResolutionPolicy.throwOnNotMeasureSpecEXACTLY(pWidthMeasureSpec, pHeightMeasureSpec); final int measuredWidth = (int)(MeasureSpec.getSize(pWidthMeasureSpec) * this.mWidthScale); final int measuredHeight = (int)(MeasureSpec.getSize(pHeightMeasureSpec) * this.mHeightScale); - pRenderSurfaceView.setMeasuredDimensionProxy(measuredWidth, measuredHeight); + pResolutionPolicyCallback.onResolutionChanged(measuredWidth, measuredHeight); } // =========================================================== diff --git a/src/org/andengine/opengl/view/RenderSurfaceView.java b/src/org/andengine/opengl/view/RenderSurfaceView.java index f793fbdb7..e10947d3c 100644 --- a/src/org/andengine/opengl/view/RenderSurfaceView.java +++ b/src/org/andengine/opengl/view/RenderSurfaceView.java @@ -2,6 +2,7 @@ import org.andengine.engine.Engine; import org.andengine.engine.options.ConfigChooserOptions; +import org.andengine.engine.options.resolutionpolicy.IResolutionPolicy; import android.content.Context; import android.opengl.GLSurfaceView; @@ -14,7 +15,7 @@ * @author Nicolas Gramlich * @since 11:57:29 - 08.03.2010 */ -public class RenderSurfaceView extends GLSurfaceView { +public class RenderSurfaceView extends GLSurfaceView implements IResolutionPolicy.Callback { // =========================================================== // Constants // =========================================================== @@ -65,14 +66,15 @@ protected void onMeasure(final int pWidthMeasureSpec, final int pHeightMeasureSp this.mEngineRenderer.mEngine.getEngineOptions().getResolutionPolicy().onMeasure(this, pWidthMeasureSpec, pHeightMeasureSpec); } + @Override + public void onResolutionChanged(final int pWidth, final int pHeight) { + this.setMeasuredDimension(pWidth, pHeight); + } + // =========================================================== // Methods // =========================================================== - public void setMeasuredDimensionProxy(final int pMeasuredWidth, final int pMeasuredHeight) { - this.setMeasuredDimension(pMeasuredWidth, pMeasuredHeight); - } - public void setRenderer(final Engine pEngine, final IRendererListener pRendererListener) { if(this.mConfigChooser == null) { final ConfigChooserOptions configChooserOptions = pEngine.getEngineOptions().getRenderOptions().getConfigChooserOptions(); From 5cdc6b7e5db339c452f70d5d95811d756fb82e5f Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 13 May 2012 16:43:20 -0700 Subject: [PATCH 068/252] Fixed AccelerationData/OrientationData not reacting to changes in orientation, which are possible due to the Sensor based ScreenOrientation modes. --- src/org/andengine/engine/Engine.java | 39 +++++++++++++++---- .../input/sensor/BaseSensorData.java | 16 +++++--- .../sensor/acceleration/AccelerationData.java | 4 +- .../sensor/orientation/OrientationData.java | 6 ++- 4 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index ecaabebef..6012981d2 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -107,6 +107,8 @@ public class Engine implements SensorEventListener, OnTouchListener, ITouchEvent private Vibrator mVibrator; + private Display mDefaultDisplay; + private ILocationListener mLocationListener; private Location mLocation; @@ -350,14 +352,17 @@ public void onSensorChanged(final SensorEvent pEvent) { switch(pEvent.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: if(this.mAccelerationData != null) { + this.mOrientationData.setDisplayRotation(this.getDisplayOrientation()); this.mAccelerationData.setValues(pEvent.values); this.mAccelerationListener.onAccelerationChanged(this.mAccelerationData); } else if(this.mOrientationData != null) { + this.mOrientationData.setDisplayRotation(this.getDisplayOrientation()); this.mOrientationData.setAccelerationValues(pEvent.values); this.mOrientationListener.onOrientationChanged(this.mOrientationData); } break; case Sensor.TYPE_MAGNETIC_FIELD: + this.mOrientationData.setDisplayRotation(this.getDisplayOrientation()); this.mOrientationData.setMagneticFieldValues(pEvent.values); this.mOrientationListener.onOrientationChanged(this.mOrientationData); break; @@ -505,6 +510,8 @@ public void onDestroy() { this.mUpdateThread.interrupt(); } + this.releaseDefaultDisplay(); + this.mVertexBufferObjectManager.onDestroy(); this.mTextureManager.onDestroy(); this.mFontManager.onDestroy(); @@ -685,10 +692,10 @@ public boolean enableAccelerationSensor(final Context pContext, final IAccelerat if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER)) { this.mAccelerationListener = pAccelerationListener; + this.initDefaultDisplay(pContext); + if(this.mAccelerationData == null) { - final Display display = ((WindowManager) pContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); - final int displayRotation = display.getOrientation(); - this.mAccelerationData = new AccelerationData(displayRotation); + this.mAccelerationData = new AccelerationData(); } this.registerSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER, pAccelerationSensorOptions.getSensorDelay()); @@ -699,7 +706,6 @@ public boolean enableAccelerationSensor(final Context pContext, final IAccelerat } } - /** * @return true when the sensor was successfully disabled, false otherwise. */ @@ -728,10 +734,10 @@ public boolean enableOrientationSensor(final Context pContext, final IOrientatio if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER) && this.isSensorSupported(sensorManager, Sensor.TYPE_MAGNETIC_FIELD)) { this.mOrientationListener = pOrientationListener; + this.initDefaultDisplay(pContext); + if(this.mOrientationData == null) { - final Display display = ((WindowManager) pContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); - final int displayRotation = display.getOrientation(); - this.mOrientationData = new OrientationData(displayRotation); + this.mOrientationData = new OrientationData(); } this.registerSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER, pOrientationSensorOptions.getSensorDelay()); @@ -772,6 +778,25 @@ private void unregisterSelfAsSensorListener(final SensorManager pSensorManager, pSensorManager.unregisterListener(this, sensor); } + private void initDefaultDisplay(final Context pContext) { + if(this.mDefaultDisplay == null) { + final WindowManager windowManager = (WindowManager) pContext.getSystemService(Context.WINDOW_SERVICE); + this.mDefaultDisplay = windowManager.getDefaultDisplay(); + } + } + + private void releaseDefaultDisplay() { + this.mDefaultDisplay = null; + } + + private int getDisplayOrientation() { + if(this.mDefaultDisplay == null) { + throw new IllegalStateException(); + } else { + return this.mDefaultDisplay.getOrientation(); + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/input/sensor/BaseSensorData.java b/src/org/andengine/input/sensor/BaseSensorData.java index 5af5c2489..1ffbfc15d 100644 --- a/src/org/andengine/input/sensor/BaseSensorData.java +++ b/src/org/andengine/input/sensor/BaseSensorData.java @@ -26,10 +26,8 @@ public class BaseSensorData { // Constructors // =========================================================== - public BaseSensorData(final int pValueCount, int pDisplayRotation) { + public BaseSensorData(final int pValueCount) { this.mValues = new float[pValueCount]; - - this.mDisplayRotation = pDisplayRotation; } // =========================================================== @@ -44,12 +42,20 @@ public void setValues(final float[] pValues) { System.arraycopy(pValues, 0, this.mValues, 0, pValues.length); } + public int getAccuracy() { + return this.mAccuracy; + } + public void setAccuracy(final int pAccuracy) { this.mAccuracy = pAccuracy; } - public int getAccuracy() { - return this.mAccuracy; + public int getDisplayRotation() { + return this.mDisplayRotation; + } + + public void setDisplayRotation(final int pDisplayRotation) { + this.mDisplayRotation = pDisplayRotation; } // =========================================================== diff --git a/src/org/andengine/input/sensor/acceleration/AccelerationData.java b/src/org/andengine/input/sensor/acceleration/AccelerationData.java index 042024ba8..1007dd500 100644 --- a/src/org/andengine/input/sensor/acceleration/AccelerationData.java +++ b/src/org/andengine/input/sensor/acceleration/AccelerationData.java @@ -71,8 +71,8 @@ public void swapAxis(final float[] pValues) { // Constructors // =========================================================== - public AccelerationData(final int pDisplayOrientation) { - super(3, pDisplayOrientation); + public AccelerationData() { + super(3); } // =========================================================== diff --git a/src/org/andengine/input/sensor/orientation/OrientationData.java b/src/org/andengine/input/sensor/orientation/OrientationData.java index 3f503cc7b..e85037ace 100644 --- a/src/org/andengine/input/sensor/orientation/OrientationData.java +++ b/src/org/andengine/input/sensor/orientation/OrientationData.java @@ -34,8 +34,8 @@ public class OrientationData extends BaseSensorData { // Constructors // =========================================================== - public OrientationData(final int pDisplayRotation) { - super(3, pDisplayRotation); + public OrientationData() { + super(3); } // =========================================================== @@ -68,11 +68,13 @@ public void setAccuracy(final int pAccuracy) { public void setAccelerationValues(final float[] pValues) { System.arraycopy(pValues, 0, this.mAccelerationValues, 0, pValues.length); + this.updateOrientation(); } public void setMagneticFieldValues(final float[] pValues) { System.arraycopy(pValues, 0, this.mMagneticFieldValues, 0, pValues.length); + this.updateOrientation(); } From bb9e7ae4663e325171b67edd28047e1525959184 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 13 May 2012 23:26:00 -0700 Subject: [PATCH 069/252] Performed 'android update project'. --- git-rank-contributors.rb | 60 ++++++++++++++++++++++++++++++++++++++++ proguard-project.txt | 20 ++++++++++++++ proguard.cfg | 40 --------------------------- 3 files changed, 80 insertions(+), 40 deletions(-) create mode 100755 git-rank-contributors.rb create mode 100644 proguard-project.txt delete mode 100644 proguard.cfg diff --git a/git-rank-contributors.rb b/git-rank-contributors.rb new file mode 100755 index 000000000..de1b612e6 --- /dev/null +++ b/git-rank-contributors.rb @@ -0,0 +1,60 @@ +#!/usr/bin/env ruby + +## git-rank-contributors: a simple script to trace through the logs and +## rank contributors by the total size of the diffs they're responsible for. +## A change counts twice as much as a plain addition or deletion. +## +## Output may or may not be suitable for inclusion in a CREDITS file. +## Probably not without some editing, because people often commit from more +## than one address. +## +## git-rank-contributors Copyright 2008 William Morgan . +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or (at +## your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You can find the GNU General Public License at: +## http://www.gnu.org/licenses/ + +class String + def obfuscate; gsub(/@/, " at the ").gsub(/\.(\w+)(>|$)/, ' dot \1s\2') end + def htmlize; gsub("&", "&").gsub("<", "<").gsub(">", ">") end +end + +lines = {} +verbose = ARGV.delete("-v") +obfuscate = ARGV.delete("-o") +htmlize = ARGV.delete("-h") + +author = nil +state = :pre_author +`git log -M -C -C -p --no-color`.each do |l| + case + when (state == :pre_author || state == :post_author) && l =~ /Author: (.*)$/ + author = $1 + state = :post_author + lines[author] ||= 0 + when state == :post_author && l =~ /^\+\+\+/ + state = :in_diff + when state == :in_diff && l =~ /^[\+\-]/ + lines[author] += 1 + when state == :in_diff && l =~ /^commit / + state = :pre_author + end +end + +lines.sort_by { |a, c| -c }.each do |a, c| + a = a.obfuscate if obfuscate + a = a.htmlize if htmlize + if verbose + puts "#{a}: #{c} lines of diff" + else + puts a + end +end \ No newline at end of file diff --git a/proguard-project.txt b/proguard-project.txt new file mode 100644 index 000000000..f2fe1559a --- /dev/null +++ b/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/proguard.cfg b/proguard.cfg deleted file mode 100644 index b1cdf17b5..000000000 --- a/proguard.cfg +++ /dev/null @@ -1,40 +0,0 @@ --optimizationpasses 5 --dontusemixedcaseclassnames --dontskipnonpubliclibraryclasses --dontpreverify --verbose --optimizations !code/simplification/arithmetic,!field/*,!class/merging/* - --keep public class * extends android.app.Activity --keep public class * extends android.app.Application --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference --keep public class com.android.vending.licensing.ILicensingService - --keepclasseswithmembernames class * { - native ; -} - --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet); -} - --keepclasseswithmembers class * { - public (android.content.Context, android.util.AttributeSet, int); -} - --keepclassmembers class * extends android.app.Activity { - public void *(android.view.View); -} - --keepclassmembers enum * { - public static **[] values(); - public static ** valueOf(java.lang.String); -} - --keep class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} From 42dc4f1f378f4836f78ab60bbbf6defb5e82aa8b Mon Sep 17 00:00:00 2001 From: Joosun Date: Tue, 15 May 2012 01:28:12 +0800 Subject: [PATCH 070/252] Minor fixed. --- src/org/andengine/engine/Engine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index 6012981d2..e98a36a89 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -352,7 +352,7 @@ public void onSensorChanged(final SensorEvent pEvent) { switch(pEvent.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: if(this.mAccelerationData != null) { - this.mOrientationData.setDisplayRotation(this.getDisplayOrientation()); + this.mAccelerationData.setDisplayRotation(this.getDisplayOrientation()); this.mAccelerationData.setValues(pEvent.values); this.mAccelerationListener.onAccelerationChanged(this.mAccelerationData); } else if(this.mOrientationData != null) { From 3e52d76b52cec3ca409df32c05159fc6a944cfc0 Mon Sep 17 00:00:00 2001 From: oleonov Date: Mon, 14 May 2012 15:41:59 +0400 Subject: [PATCH 071/252] Fixed Entity.convertLocalCoordinatesToSceneCoordinates(float[]) to no more do the reverse conversion. --- src/org/andengine/entity/Entity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 50bcbb32e..f156b0011 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1246,7 +1246,7 @@ public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final f */ @Override public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates) { - return this.convertSceneCoordinatesToLocalCoordinates(pCoordinates, Entity.VERTICES_LOCAL_TO_SCENE_TMP); + return this.convertLocalCoordinatesToSceneCoordinates(pCoordinates, Entity.VERTICES_LOCAL_TO_SCENE_TMP); } /* (non-Javadoc) From b58c88e2274fb058686cb950f5611faa89737b68 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 14 May 2012 11:10:16 -0700 Subject: [PATCH 072/252] Cherry-picked b631d500800cdff79411996f149dac87072f9833 from GLES2. --- src/org/andengine/entity/scene/menu/MenuScene.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/entity/scene/menu/MenuScene.java b/src/org/andengine/entity/scene/menu/MenuScene.java index c65841ebb..0cf02520b 100644 --- a/src/org/andengine/entity/scene/menu/MenuScene.java +++ b/src/org/andengine/entity/scene/menu/MenuScene.java @@ -31,7 +31,7 @@ public class MenuScene extends CameraScene implements IOnAreaTouchListener, IOnS // Fields // =========================================================== - private final ArrayList mMenuItems = new ArrayList(); + protected final ArrayList mMenuItems = new ArrayList(); private IOnMenuItemClickListener mOnMenuItemClickListener; @@ -94,6 +94,14 @@ public void addMenuItem(final IMenuItem pMenuItem) { this.registerTouchArea(pMenuItem); } + public void clearMenuItems() { + for (int i = this.mMenuItems.size() - 1; i >= 0; i--) { + final IMenuItem menuItem = this.mMenuItems.remove(i); + this.detachChild(menuItem); + this.unregisterTouchArea(menuItem); + } + } + @Override public MenuScene getChildScene() { return (MenuScene)super.getChildScene(); From 4156be09c490a64470097e77dafb8af79871c4ec Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 14 May 2012 11:32:55 -0700 Subject: [PATCH 073/252] Cherry-picked e799e9e33bb5049a9adf644c4ba3c215ec4a77f1 from GLES2. --- .../andengine/audio/music/MusicFactory.java | 4 ++ .../andengine/audio/sound/SoundFactory.java | 4 ++ .../andengine/opengl/font/FontFactory.java | 4 ++ ...itmapTextureAtlasTextureRegionFactory.java | 66 ++++++++++++++----- .../texture/region/TextureRegionFactory.java | 2 +- 5 files changed, 62 insertions(+), 18 deletions(-) diff --git a/src/org/andengine/audio/music/MusicFactory.java b/src/org/andengine/audio/music/MusicFactory.java index e8feb3f15..557c3895c 100644 --- a/src/org/andengine/audio/music/MusicFactory.java +++ b/src/org/andengine/audio/music/MusicFactory.java @@ -45,6 +45,10 @@ public static void setAssetBasePath(final String pAssetBasePath) { } } + public static String getAssetBasePath() { + return MusicFactory.sAssetBasePath; + } + public static void onCreate() { MusicFactory.setAssetBasePath(""); } diff --git a/src/org/andengine/audio/sound/SoundFactory.java b/src/org/andengine/audio/sound/SoundFactory.java index 0c61df51d..4a017ad01 100644 --- a/src/org/andengine/audio/sound/SoundFactory.java +++ b/src/org/andengine/audio/sound/SoundFactory.java @@ -44,6 +44,10 @@ public static void setAssetBasePath(final String pAssetBasePath) { } } + public static String getAssetBasePath() { + return SoundFactory.sAssetBasePath; + } + public static void onCreate() { SoundFactory.setAssetBasePath(""); } diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java index 6043eb6e6..5111e875f 100644 --- a/src/org/andengine/opengl/font/FontFactory.java +++ b/src/org/andengine/opengl/font/FontFactory.java @@ -50,6 +50,10 @@ public static void setAssetBasePath(final String pAssetBasePath) { } } + public static String getAssetBasePath() { + return FontFactory.sAssetBasePath; + } + public static void onCreate() { FontFactory.setAssetBasePath(""); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java index 7c4990923..821542ebd 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java @@ -1,13 +1,16 @@ package org.andengine.opengl.texture.atlas.bitmap; +import java.io.IOException; + import org.andengine.opengl.texture.atlas.bitmap.source.AssetBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.ResourceBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.buildable.BuildableTextureAtlasTextureRegionFactory; -import org.andengine.opengl.texture.region.ITextureRegion; +import org.andengine.opengl.texture.region.TextureRegion; import org.andengine.opengl.texture.region.TextureRegionFactory; import org.andengine.opengl.texture.region.TiledTextureRegion; +import org.andengine.util.exception.AndEngineRuntimeException; import android.content.Context; import android.content.res.AssetManager; @@ -51,6 +54,10 @@ public static void setAssetBasePath(final String pAssetBasePath) { } } + public static String getAssetBasePath() { + return BitmapTextureAtlasTextureRegionFactory.sAssetBasePath; + } + public static void reset() { BitmapTextureAtlasTextureRegionFactory.setAssetBasePath(""); } @@ -67,11 +74,11 @@ public static void reset() { // Methods using BitmapTexture // =========================================================== - public static ITextureRegion createFromAsset(final BitmapTextureAtlas pBitmapTextureAtlas, final Context pContext, final String pAssetPath, final int pTextureX, final int pTextureY) { + public static TextureRegion createFromAsset(final BitmapTextureAtlas pBitmapTextureAtlas, final Context pContext, final String pAssetPath, final int pTextureX, final int pTextureY) { return BitmapTextureAtlasTextureRegionFactory.createFromAsset(pBitmapTextureAtlas, pContext.getAssets(), pAssetPath, pTextureX, pTextureY); } - public static ITextureRegion createFromAsset(final BitmapTextureAtlas pBitmapTextureAtlas, final AssetManager pAssetManager, final String pAssetPath, final int pTextureX, final int pTextureY) { + public static TextureRegion createFromAsset(final BitmapTextureAtlas pBitmapTextureAtlas, final AssetManager pAssetManager, final String pAssetPath, final int pTextureX, final int pTextureY) { final IBitmapTextureAtlasSource bitmapTextureAtlasSource = AssetBitmapTextureAtlasSource.create(pAssetManager, BitmapTextureAtlasTextureRegionFactory.sAssetBasePath + pAssetPath); return BitmapTextureAtlasTextureRegionFactory.createFromSource(pBitmapTextureAtlas, bitmapTextureAtlasSource, pTextureX, pTextureY); } @@ -86,11 +93,11 @@ public static TiledTextureRegion createTiledFromAsset(final BitmapTextureAtlas p } - public static ITextureRegion createFromResource(final BitmapTextureAtlas pBitmapTextureAtlas, final Context pContext, final int pDrawableResourceID, final int pTextureX, final int pTextureY) { + public static TextureRegion createFromResource(final BitmapTextureAtlas pBitmapTextureAtlas, final Context pContext, final int pDrawableResourceID, final int pTextureX, final int pTextureY) { return BitmapTextureAtlasTextureRegionFactory.createFromResource(pBitmapTextureAtlas, pContext.getResources(), pDrawableResourceID, pTextureX, pTextureY); } - public static ITextureRegion createFromResource(final BitmapTextureAtlas pBitmapTextureAtlas, final Resources pResources, final int pDrawableResourceID, final int pTextureX, final int pTextureY) { + public static TextureRegion createFromResource(final BitmapTextureAtlas pBitmapTextureAtlas, final Resources pResources, final int pDrawableResourceID, final int pTextureX, final int pTextureY) { final IBitmapTextureAtlasSource bitmapTextureAtlasSource = ResourceBitmapTextureAtlasSource.create(pResources, pDrawableResourceID); return BitmapTextureAtlasTextureRegionFactory.createFromSource(pBitmapTextureAtlas, bitmapTextureAtlasSource, pTextureX, pTextureY); } @@ -105,7 +112,7 @@ public static TiledTextureRegion createTiledFromResource(final BitmapTextureAtla } - public static ITextureRegion createFromSource(final BitmapTextureAtlas pBitmapTextureAtlas, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final int pTextureX, final int pTextureY) { + public static TextureRegion createFromSource(final BitmapTextureAtlas pBitmapTextureAtlas, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final int pTextureX, final int pTextureY) { return TextureRegionFactory.createFromSource(pBitmapTextureAtlas, pBitmapTextureAtlasSource, pTextureX, pTextureY); } @@ -117,19 +124,19 @@ public static TiledTextureRegion createTiledFromSource(final BitmapTextureAtlas // Methods using BuildableTexture // =========================================================== - public static ITextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final String pAssetPath) { + public static TextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final String pAssetPath) { return BitmapTextureAtlasTextureRegionFactory.createFromAsset(pBuildableBitmapTextureAtlas, pContext.getAssets(), pAssetPath); } - public static ITextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final AssetManager pAssetManager, final String pAssetPath) { + public static TextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final AssetManager pAssetManager, final String pAssetPath) { return BitmapTextureAtlasTextureRegionFactory.createFromAsset(pBuildableBitmapTextureAtlas, pAssetManager, pAssetPath, false); } - public static ITextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final String pAssetPath, final boolean pRotated) { + public static TextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final String pAssetPath, final boolean pRotated) { return BitmapTextureAtlasTextureRegionFactory.createFromAsset(pBuildableBitmapTextureAtlas, pContext.getAssets(), pAssetPath, pRotated); } - public static ITextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final AssetManager pAssetManager, final String pAssetPath, final boolean pRotated) { + public static TextureRegion createFromAsset(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final AssetManager pAssetManager, final String pAssetPath, final boolean pRotated) { final IBitmapTextureAtlasSource bitmapTextureAtlasSource = AssetBitmapTextureAtlasSource.create(pAssetManager, BitmapTextureAtlasTextureRegionFactory.sAssetBasePath + pAssetPath); return BitmapTextureAtlasTextureRegionFactory.createFromSource(pBuildableBitmapTextureAtlas, bitmapTextureAtlasSource, pRotated); } @@ -143,20 +150,19 @@ public static TiledTextureRegion createTiledFromAsset(final BuildableBitmapTextu return BitmapTextureAtlasTextureRegionFactory.createTiledFromSource(pBuildableBitmapTextureAtlas, bitmapTextureAtlasSource, pTileColumns, pTileRows); } - - public static ITextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final int pDrawableResourceID) { + public static TextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final int pDrawableResourceID) { return BitmapTextureAtlasTextureRegionFactory.createFromResource(pBuildableBitmapTextureAtlas, pContext.getResources(), pDrawableResourceID); } - public static ITextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Resources pResources, final int pDrawableResourceID) { + public static TextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Resources pResources, final int pDrawableResourceID) { return BitmapTextureAtlasTextureRegionFactory.createFromResource(pBuildableBitmapTextureAtlas, pResources, pDrawableResourceID, false); } - public static ITextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final int pDrawableResourceID, final boolean pRotated) { + public static TextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Context pContext, final int pDrawableResourceID, final boolean pRotated) { return BitmapTextureAtlasTextureRegionFactory.createFromResource(pBuildableBitmapTextureAtlas, pContext.getResources(), pDrawableResourceID, pRotated); } - public static ITextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Resources pResources, final int pDrawableResourceID, final boolean pRotated) { + public static TextureRegion createFromResource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final Resources pResources, final int pDrawableResourceID, final boolean pRotated) { final IBitmapTextureAtlasSource bitmapTextureAtlasSource = ResourceBitmapTextureAtlasSource.create(pResources, pDrawableResourceID); return BitmapTextureAtlasTextureRegionFactory.createFromSource(pBuildableBitmapTextureAtlas, bitmapTextureAtlasSource, pRotated); } @@ -171,11 +177,11 @@ public static TiledTextureRegion createTiledFromResource(final BuildableBitmapTe } - public static ITextureRegion createFromSource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource) { + public static TextureRegion createFromSource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource) { return BitmapTextureAtlasTextureRegionFactory.createFromSource(pBuildableBitmapTextureAtlas, pBitmapTextureAtlasSource, false); } - public static ITextureRegion createFromSource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final boolean pRotated) { + public static TextureRegion createFromSource(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final boolean pRotated) { return BuildableTextureAtlasTextureRegionFactory.createFromSource(pBuildableBitmapTextureAtlas, pBitmapTextureAtlasSource, pRotated); } @@ -183,6 +189,32 @@ public static TiledTextureRegion createTiledFromSource(final BuildableBitmapText return BuildableTextureAtlasTextureRegionFactory.createTiledFromSource(pBuildableBitmapTextureAtlas, pBitmapTextureAtlasSource, pTileColumns, pTileRows); } + /** + * Loads all files from a given assets directory (in alphabetical order) as consecutive tiles of an {@link TiledTextureRegion}. + * + * @param pBuildableBitmapTextureAtlas + * @param pAssetManager + * @param pAssetSubdirectory to load all files from "gfx/flowers" put "flowers" here (assuming, that you've used {@link BitmapTextureAtlasTextureRegionFactory#setAssetBasePath(String)} with "gfx/" before.) + * @return + */ + public static TiledTextureRegion createTiledFromAssetDirectory(final BuildableBitmapTextureAtlas pBuildableBitmapTextureAtlas, final AssetManager pAssetManager, final String pAssetSubdirectory) { + final String[] files; + try { + files = pAssetManager.list(BitmapTextureAtlasTextureRegionFactory.sAssetBasePath + pAssetSubdirectory); + } catch (final IOException e) { + throw new AndEngineRuntimeException("Listing assets subdirectory: '" + BitmapTextureAtlasTextureRegionFactory.sAssetBasePath + pAssetSubdirectory + "' failed. Does it exist?", e); + } + final int fileCount = files.length; + final TextureRegion[] textures = new TextureRegion[fileCount]; + + for (int i = 0; i < fileCount; i++) { + final String assetPath = pAssetSubdirectory + "/" + files[i]; + textures[i] = BitmapTextureAtlasTextureRegionFactory.createFromAsset(pBuildableBitmapTextureAtlas, pAssetManager, assetPath); + } + + return new TiledTextureRegion(pBuildableBitmapTextureAtlas, textures); + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java index 1641c4f45..fd4d05097 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java @@ -62,7 +62,7 @@ public static TiledTextureRegion extractTiledFromTexture(final ITexture pTexture return TiledTextureRegion.create(pTexture, pTextureX, pTextureY, pWidth, pHeight, pTileColumns, pTileRows); } - public static ITextureRegion createFromSource(final ITextureAtlas pTextureAtlas, final T pTextureAtlasSource, final int pTextureX, final int pTextureY) { + public static TextureRegion createFromSource(final ITextureAtlas pTextureAtlas, final T pTextureAtlasSource, final int pTextureX, final int pTextureY) { return TextureRegionFactory.createFromSource(pTextureAtlas, pTextureAtlasSource, pTextureX, pTextureY, false); } From e460153523fb698ded6e11f0648378c62ef9de65 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 14 May 2012 15:36:08 -0700 Subject: [PATCH 074/252] Setting SurfaceHolder PixelFormat depending on RGBA size selected in ConfigChooserOptions. --- .../andengine/engine/options/ConfigChooserOptions.java | 8 ++++++++ src/org/andengine/opengl/view/RenderSurfaceView.java | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/src/org/andengine/engine/options/ConfigChooserOptions.java b/src/org/andengine/engine/options/ConfigChooserOptions.java index 4b1cb1c51..6840de889 100644 --- a/src/org/andengine/engine/options/ConfigChooserOptions.java +++ b/src/org/andengine/engine/options/ConfigChooserOptions.java @@ -95,6 +95,14 @@ public void setRequestedStencilSize(final int pRequestedStencilSize) { this.mRequestedStencilSize = pRequestedStencilSize; } + public boolean isRequestedRGBA8888() { + return (this.mRequestedRedSize == 8) && (this.mRequestedGreenSize == 8) && (this.mRequestedBlueSize == 8) && (this.mRequestedAlphaSize == 8); + } + + public boolean isRequestedRGB565() { + return (this.mRequestedRedSize == 5) && (this.mRequestedGreenSize == 6) && (this.mRequestedBlueSize == 5) && (this.mRequestedAlphaSize == 0); + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== diff --git a/src/org/andengine/opengl/view/RenderSurfaceView.java b/src/org/andengine/opengl/view/RenderSurfaceView.java index e10947d3c..e237e71e9 100644 --- a/src/org/andengine/opengl/view/RenderSurfaceView.java +++ b/src/org/andengine/opengl/view/RenderSurfaceView.java @@ -79,6 +79,13 @@ public void setRenderer(final Engine pEngine, final IRendererListener pRendererL if(this.mConfigChooser == null) { final ConfigChooserOptions configChooserOptions = pEngine.getEngineOptions().getRenderOptions().getConfigChooserOptions(); this.mConfigChooser = new ConfigChooser(configChooserOptions); + + // TODO We don't know yet if the requested color size will actually be accepted! + if(configChooserOptions.isRequestedRGBA8888()) { + this.getHolder().setFormat(android.graphics.PixelFormat.RGBA_8888); + } else if(configChooserOptions.isRequestedRGB565()) { + this.getHolder().setFormat(android.graphics.PixelFormat.RGB_565); + } } this.setEGLConfigChooser(this.mConfigChooser); From 3f977220e5964d5a955e764dbf6e25823bd9d74b Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 15 May 2012 12:06:50 -0700 Subject: [PATCH 075/252] Added MemoryLogger (similar to FPSLogger). --- src/org/andengine/entity/util/FPSLogger.java | 17 +- .../andengine/entity/util/MemoryLogger.java | 242 ++++++++++++++++++ src/org/andengine/util/TextUtils.java | 16 ++ .../andengine/util/system/SystemUtils.java | 126 +++++++-- 4 files changed, 376 insertions(+), 25 deletions(-) create mode 100644 src/org/andengine/entity/util/MemoryLogger.java diff --git a/src/org/andengine/entity/util/FPSLogger.java b/src/org/andengine/entity/util/FPSLogger.java index 71315307f..e4d749b23 100644 --- a/src/org/andengine/entity/util/FPSLogger.java +++ b/src/org/andengine/entity/util/FPSLogger.java @@ -2,6 +2,7 @@ import org.andengine.BuildConfig; import org.andengine.util.debug.Debug; +import org.andengine.util.debug.Debug.DebugLevel; import org.andengine.util.time.TimeConstants; /** @@ -20,6 +21,8 @@ public class FPSLogger extends AverageFPSCounter { // Fields // =========================================================== + private final DebugLevel mDebugLevel; + protected float mShortestFrame = Float.MAX_VALUE; protected float mLongestFrame = Float.MIN_VALUE; @@ -28,11 +31,23 @@ public class FPSLogger extends AverageFPSCounter { // =========================================================== public FPSLogger() { + this(DebugLevel.DEBUG); + } + + public FPSLogger(final DebugLevel pDebugLevel) { super(); + + this.mDebugLevel = pDebugLevel; } public FPSLogger(final float pAverageDuration) { + this(pAverageDuration, DebugLevel.DEBUG); + } + + public FPSLogger(final float pAverageDuration, final DebugLevel pDebugLevel) { super(pAverageDuration); + + this.mDebugLevel = pDebugLevel; } // =========================================================== @@ -73,7 +88,7 @@ public void reset() { protected void onLogFPS() { if(BuildConfig.DEBUG) { - Debug.d(String.format("FPS: %.2f (MIN: %.0f ms | MAX: %.0f ms)", + Debug.log(this.mDebugLevel, String.format("FPS: %.2f (MIN: %.0f ms | MAX: %.0f ms)", this.mFrames / this.mSecondsElapsed, this.mShortestFrame * TimeConstants.MILLISECONDS_PER_SECOND, this.mLongestFrame * TimeConstants.MILLISECONDS_PER_SECOND)); diff --git a/src/org/andengine/entity/util/MemoryLogger.java b/src/org/andengine/entity/util/MemoryLogger.java new file mode 100644 index 000000000..0ff55bf06 --- /dev/null +++ b/src/org/andengine/entity/util/MemoryLogger.java @@ -0,0 +1,242 @@ +package org.andengine.entity.util; + +import org.andengine.BuildConfig; +import org.andengine.engine.handler.IUpdateHandler; +import org.andengine.util.TextUtils; +import org.andengine.util.debug.Debug; +import org.andengine.util.debug.Debug.DebugLevel; +import org.andengine.util.system.SystemUtils; +import org.andengine.util.system.SystemUtils.SystemUtilsException; + + + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 14:50:15 - 14.05.2012 + */ +public class MemoryLogger implements IUpdateHandler { + // =========================================================== + // Constants + // =========================================================== + + private static final float AVERAGE_DURATION_DEFAULT = 5; + + // =========================================================== + // Fields + // =========================================================== + + private final float mAverageDuration; + private final DebugLevel mDebugLevel; + + private float mSecondsElapsed; + + private boolean mLogSystemMemory; + private long mPreviousSystemMemorySize; + private long mPreviousSystemMemoryFreeSize; + + private boolean mLogDalvikHeap; + private long mPreviousDalvikHeapSize; + private long mPreviousDalvikHeapFreeSize; + private long mPreviousDalvikHeapAllocatedSize; + + private boolean mLogDalvikMemoryInfo; + private long mPreviousDalvikProportionalSetSize; + private long mPreviousDalvikPrivateDirtyPages; + private long mPreviousDalvikSharedDirtyPages; + + private boolean mLogNativeHeap; + private long mPreviousNativeHeapSize; + private long mPreviousNativeHeapFreeSize; + private long mPreviousNativeHeapAllocatedSize; + + private boolean mLogNativeMemoryInfo; + private long mPreviousNativeProportionalSetSize; + private long mPreviousNativePrivateDirtyPages; + private long mPreviousNativeSharedDirtyPages; + + // =========================================================== + // Constructors + // =========================================================== + + public MemoryLogger() { + this(DebugLevel.DEBUG); + } + + public MemoryLogger(final DebugLevel pDebugLevel) { + this(MemoryLogger.AVERAGE_DURATION_DEFAULT, pDebugLevel); + } + + public MemoryLogger(final float pAverageDuration) { + this(pAverageDuration, DebugLevel.DEBUG); + } + + public MemoryLogger(final float pAverageDuration, final DebugLevel pDebugLevel) { + this(pAverageDuration, pDebugLevel, true, true, false, true, false); + } + + public MemoryLogger(final float pAverageDuration, final DebugLevel pDebugLevel, final boolean pLogSystemMemory, final boolean pLogDalvikHeap, final boolean pLogDalvikMemoryInfo, final boolean pLogNativeHeap, final boolean pLogNativeMemoryInfo) { + this.mAverageDuration = pAverageDuration; + this.mDebugLevel = pDebugLevel; + + this.mLogSystemMemory = pLogSystemMemory; + this.mLogDalvikHeap = pLogDalvikHeap; + this.mLogDalvikMemoryInfo = pLogDalvikMemoryInfo; + this.mLogNativeHeap = pLogNativeHeap; + this.mLogNativeMemoryInfo = pLogNativeMemoryInfo; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdate(final float pSecondsElapsed) { + this.mSecondsElapsed += pSecondsElapsed; + + if(this.mSecondsElapsed > this.mAverageDuration){ + this.onHandleLogDurationElapsed(); + + this.mSecondsElapsed -= this.mAverageDuration; + } + } + + @Override + public void reset() { + this.mSecondsElapsed = 0; + } + + // =========================================================== + // Methods + // =========================================================== + + protected void onHandleLogDurationElapsed() { + if(BuildConfig.DEBUG) { + /* Execute GC. */ + System.gc(); + try { + final StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("+------------------------------+---------------+-----------------+\n"); + stringBuilder.append("| Memory Stat | Current | Change |\n"); + stringBuilder.append("+------------------------------+---------------+-----------------+\n"); + + if(this.mLogSystemMemory) { + final long systemMemorySize = SystemUtils.getSystemMemorySize(); + final long systemMemoryFreeSize = SystemUtils.getSystemMemoryFreeSize(); + + final long systemMemorySizeDiff = systemMemorySize - this.mPreviousSystemMemorySize; + final long systemMemoryFreeSizeDiff = systemMemoryFreeSize - this.mPreviousSystemMemoryFreeSize; + + this.mPreviousSystemMemorySize = systemMemorySize; + this.mPreviousSystemMemoryFreeSize = systemMemoryFreeSize; + + stringBuilder.append("| System memory size | " + MemoryLogger.formatRight(systemMemorySize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(systemMemorySizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("| System memory free size | " + MemoryLogger.formatRight(systemMemoryFreeSize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(systemMemoryFreeSizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("+------------------------------+---------------+-----------------+\n"); + } + + if(this.mLogDalvikHeap) { + final long dalvikHeapSize = SystemUtils.getDalvikHeapSize(); + final long dalvikHeapFreeSize = SystemUtils.getDalvikHeapFreeSize(); + final long dalvikHeapAllocatedSize = SystemUtils.getDalvikHeapAllocatedSize(); + + final long dalvikHeapSizeDiff = dalvikHeapSize - this.mPreviousDalvikHeapSize; + final long dalvikHeapFreeSizeDiff = dalvikHeapFreeSize - this.mPreviousDalvikHeapFreeSize; + final long dalvikHeapAllocatedSizeDiff = dalvikHeapAllocatedSize - this.mPreviousDalvikHeapAllocatedSize; + + stringBuilder.append("| Dalvik memory size | " + MemoryLogger.formatRight(dalvikHeapSize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(dalvikHeapSizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("| Dalvik memory free size | " + MemoryLogger.formatRight(dalvikHeapFreeSize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(dalvikHeapFreeSizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("| Dalvik memory allocated size | " + MemoryLogger.formatRight(dalvikHeapAllocatedSize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(dalvikHeapAllocatedSizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("+------------------------------+---------------+-----------------+\n"); + + this.mPreviousDalvikHeapSize = dalvikHeapSize; + this.mPreviousDalvikHeapFreeSize = dalvikHeapFreeSize; + this.mPreviousDalvikHeapAllocatedSize = dalvikHeapAllocatedSize; + } + + if(this.mLogDalvikMemoryInfo) { + final long dalvikProportionalSetSize = SystemUtils.getDalvikProportionalSetSize(); + final long dalvikPrivateDirtyPages = SystemUtils.getDalvikPrivateDirtyPages(); + final long dalvikSharedDirtyPages = SystemUtils.getDalvikSharedDirtyPages(); + + final long dalvikProportionalSetSizeDiff = dalvikProportionalSetSize - this.mPreviousDalvikProportionalSetSize; + final long dalvikPrivateDirtyPagesDiff = dalvikPrivateDirtyPages - this.mPreviousDalvikPrivateDirtyPages; + final long dalvikSharedDirtyPagesDiff = dalvikSharedDirtyPages - this.mPreviousDalvikSharedDirtyPages; + + stringBuilder.append("| Dalvik proportional set size | " + MemoryLogger.formatRight(dalvikProportionalSetSize, ' ', 10) + " | (" + MemoryLogger.formatRight(dalvikProportionalSetSizeDiff, ' ', 10, true) + " ) |\n"); + stringBuilder.append("| Dalvik private dirty pages | " + MemoryLogger.formatRight(dalvikPrivateDirtyPages, ' ', 10) + " | (" + MemoryLogger.formatRight(dalvikPrivateDirtyPagesDiff, ' ', 10, true) + " ) |\n"); + stringBuilder.append("| Dalvik shared dirty pages | " + MemoryLogger.formatRight(dalvikSharedDirtyPages, ' ', 10) + " | (" + MemoryLogger.formatRight(dalvikSharedDirtyPagesDiff, ' ', 10, true) + " ) |\n"); + stringBuilder.append("+------------------------------+---------------+-----------------+\n"); + + this.mPreviousDalvikProportionalSetSize = dalvikProportionalSetSize; + this.mPreviousDalvikPrivateDirtyPages = dalvikPrivateDirtyPages; + this.mPreviousDalvikSharedDirtyPages = dalvikSharedDirtyPages; + } + + if(this.mLogNativeHeap) { + final long nativeHeapSize = SystemUtils.getNativeHeapSize(); + final long nativeHeapFreeSize = SystemUtils.getNativeHeapFreeSize(); + final long nativeHeapAllocatedSize = SystemUtils.getNativeHeapAllocatedSize(); + + final long nativeHeapSizeDiff = nativeHeapSize - this.mPreviousNativeHeapSize; + final long nativeHeapFreeSizeDiff = nativeHeapFreeSize - this.mPreviousNativeHeapFreeSize; + final long nativeHeapAllocatedSizeDiff = nativeHeapAllocatedSize - this.mPreviousNativeHeapAllocatedSize; + + stringBuilder.append("| Native memory size | " + MemoryLogger.formatRight(nativeHeapSize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(nativeHeapSizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("| Native memory free size | " + MemoryLogger.formatRight(nativeHeapFreeSize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(nativeHeapFreeSizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("| Native memory allocated size | " + MemoryLogger.formatRight(nativeHeapAllocatedSize, ' ', 10) + " kB | (" + MemoryLogger.formatRight(nativeHeapAllocatedSizeDiff, ' ', 10, true) + " kB) |\n"); + stringBuilder.append("+------------------------------+---------------+-----------------+\n"); + + this.mPreviousNativeHeapSize = nativeHeapSize; + this.mPreviousNativeHeapFreeSize = nativeHeapFreeSize; + this.mPreviousNativeHeapAllocatedSize = nativeHeapAllocatedSize; + } + + if(this.mLogNativeMemoryInfo) { + final long nativeProportionalSetSize = SystemUtils.getNativeProportionalSetSize(); + final long nativePrivateDirtyPages = SystemUtils.getNativePrivateDirtyPages(); + final long nativeSharedDirtyPages = SystemUtils.getNativeSharedDirtyPages(); + + final long nativeProportionalSetSizeDiff = nativeProportionalSetSize - this.mPreviousNativeProportionalSetSize; + final long nativePrivateDirtyPagesDiff = nativePrivateDirtyPages - this.mPreviousNativePrivateDirtyPages; + final long nativeSharedDirtyPagesDiff = nativeSharedDirtyPages - this.mPreviousNativeSharedDirtyPages; + + stringBuilder.append("| Native proportional set size | " + MemoryLogger.formatRight(nativeProportionalSetSize, ' ', 10) + " | (" + MemoryLogger.formatRight(nativeProportionalSetSizeDiff, ' ', 10, true) + " ) |\n"); + stringBuilder.append("| Native private dirty pages | " + MemoryLogger.formatRight(nativePrivateDirtyPages, ' ', 10) + " | (" + MemoryLogger.formatRight(nativePrivateDirtyPagesDiff, ' ', 10, true) + " ) |\n"); + stringBuilder.append("| Native shared dirty pages | " + MemoryLogger.formatRight(nativeSharedDirtyPages, ' ', 10) + " | (" + MemoryLogger.formatRight(nativeSharedDirtyPagesDiff, ' ', 10, true) + " ) |\n"); + stringBuilder.append("+------------------------------+---------------+-----------------+\n"); + + this.mPreviousNativeProportionalSetSize = nativeProportionalSetSize; + this.mPreviousNativePrivateDirtyPages = nativePrivateDirtyPages; + this.mPreviousNativeSharedDirtyPages = nativeSharedDirtyPages; + } + + Debug.log(this.mDebugLevel, stringBuilder.toString()); + } catch (final SystemUtilsException e) { + Debug.e(e); + } + System.gc(); + } + } + + public static final CharSequence formatRight(final long pLong, final char pPadChar, final int pLength) { + return MemoryLogger.formatRight(pLong, pPadChar, pLength, false); + } + + public static final CharSequence formatRight(final long pLong, final char pPadChar, final int pLength, final boolean pAddPositiveSign) { + if((pLong > 0) && pAddPositiveSign) { + return TextUtils.padFront("+" + String.valueOf(pLong), pPadChar, pLength); + } else { + return TextUtils.padFront(String.valueOf(pLong), pPadChar, pLength); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java index 07a270e8f..b1c2c5524 100644 --- a/src/org/andengine/util/TextUtils.java +++ b/src/org/andengine/util/TextUtils.java @@ -40,6 +40,22 @@ public final class TextUtils { // Methods // =========================================================== + public static final CharSequence pad(final CharSequence pText, final char pPadChar, final int pLength) { + final int padCount = pLength - pText.length(); + if(padCount <= 0) { + return pText; + } else { + final StringBuilder sb = new StringBuilder(); + + sb.append(pText); + for(int i = padCount - 1; i >= 0; i--) { + sb.append(pPadChar); + } + + return sb.toString(); + } + } + public static final CharSequence padFront(final CharSequence pText, final char pPadChar, final int pLength) { final int padCount = pLength - pText.length(); if(padCount <= 0) { diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index d50d38ff0..aab7ab99f 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -7,13 +7,15 @@ import java.util.regex.MatchResult; import org.andengine.util.StreamUtils; -import org.andengine.util.debug.Debug; +import org.andengine.util.adt.DataConstants; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Build; +import android.os.Debug; +import android.os.Debug.MemoryInfo; /** * (c) 2010 Nicolas Gramlich @@ -41,6 +43,8 @@ public class SystemUtils { // Fields // =========================================================== + private static MemoryInfo sMemoryInfo; + // =========================================================== // Constructors // =========================================================== @@ -49,6 +53,17 @@ public class SystemUtils { // Getter & Setter // =========================================================== + public static MemoryInfo getMemoryInfo() { + /* Lazy allocation. */ + if(SystemUtils.sMemoryInfo == null) { + SystemUtils.sMemoryInfo = new MemoryInfo(); + } + + Debug.getMemoryInfo(SystemUtils.sMemoryInfo); + + return SystemUtils.sMemoryInfo; + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @@ -61,11 +76,11 @@ public static boolean isGoogleTV(final Context pContext) { return SystemUtils.hasSystemFeature(pContext, "com.google.android.tv"); } - public static int getPackageVersionCode(final Context pContext) { + public static int getPackageVersionCode(final Context pContext) throws SystemUtilsException { return SystemUtils.getPackageInfo(pContext).versionCode; } - public static String getPackageVersionName(final Context pContext) { + public static String getPackageVersionName(final Context pContext) throws SystemUtilsException { return SystemUtils.getPackageInfo(pContext).versionName; } @@ -73,17 +88,20 @@ public static String getPackageName(final Context pContext) { return pContext.getPackageName(); } - public static String getApkFilePath(final Context pContext) throws NameNotFoundException { + public static String getApkFilePath(final Context pContext) throws SystemUtilsException { final PackageManager packMgmr = pContext.getPackageManager(); - return packMgmr.getApplicationInfo(SystemUtils.getPackageName(pContext), 0).sourceDir; + try { + return packMgmr.getApplicationInfo(SystemUtils.getPackageName(pContext), 0).sourceDir; + } catch (final NameNotFoundException e) { + throw new SystemUtilsException(e); + } } - private static PackageInfo getPackageInfo(final Context pContext) { + private static PackageInfo getPackageInfo(final Context pContext) throws SystemUtilsException { try { return pContext.getPackageManager().getPackageInfo(pContext.getPackageName(), 0); } catch (final NameNotFoundException e) { - Debug.e(e); - return null; + throw new SystemUtilsException(e); } } @@ -136,12 +154,12 @@ public static float getCPUBogoMips() throws SystemUtilsException { * @return in kiloBytes. * @throws SystemUtilsException */ - public static int getMemoryTotal() throws SystemUtilsException { + public static long getSystemMemorySize() throws SystemUtilsException { final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/meminfo", SystemUtils.MEMTOTAL_PATTERN, 1000); try { if(matchResult.groupCount() > 0) { - return Integer.parseInt(matchResult.group(1)); + return Long.parseLong(matchResult.group(1)); } else { throw new SystemUtilsException(); } @@ -154,12 +172,12 @@ public static int getMemoryTotal() throws SystemUtilsException { * @return in kiloBytes. * @throws SystemUtilsException */ - public static int getMemoryFree() throws SystemUtilsException { + public static long getSystemMemoryFreeSize() throws SystemUtilsException { final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/meminfo", SystemUtils.MEMFREE_PATTERN, 1000); try { if(matchResult.groupCount() > 0) { - return Integer.parseInt(matchResult.group(1)); + return Long.parseLong(matchResult.group(1)); } else { throw new SystemUtilsException(); } @@ -172,40 +190,40 @@ public static int getMemoryFree() throws SystemUtilsException { * @return in kiloHertz. * @throws SystemUtilsException */ - public static int getCPUFrequencyCurrent() throws SystemUtilsException { - return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"); + public static long getCPUFrequencyCurrent() throws SystemUtilsException { + return SystemUtils.readSystemFileAsLong("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq"); } /** * @return in kiloHertz. * @throws SystemUtilsException */ - public static int getCPUFrequencyMin() throws SystemUtilsException { - return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"); + public static long getCPUFrequencyMin() throws SystemUtilsException { + return SystemUtils.readSystemFileAsLong("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq"); } /** * @return in kiloHertz. * @throws SystemUtilsException */ - public static int getCPUFrequencyMax() throws SystemUtilsException { - return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"); + public static long getCPUFrequencyMax() throws SystemUtilsException { + return SystemUtils.readSystemFileAsLong("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq"); } /** * @return in kiloHertz. * @throws SystemUtilsException */ - public static int getCPUFrequencyMinScaling() throws SystemUtilsException { - return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq"); + public static long getCPUFrequencyMinScaling() throws SystemUtilsException { + return SystemUtils.readSystemFileAsLong("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq"); } /** * @return in kiloHertz. * @throws SystemUtilsException */ - public static int getCPUFrequencyMaxScaling() throws SystemUtilsException { - return SystemUtils.readSystemFileAsInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"); + public static long getCPUFrequencyMaxScaling() throws SystemUtilsException { + return SystemUtils.readSystemFileAsLong("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq"); } private static MatchResult matchSystemFile(final String pSystemFile, final String pPattern, final int pHorizon) throws SystemUtilsException { @@ -229,14 +247,14 @@ private static MatchResult matchSystemFile(final String pSystemFile, final Strin } } - private static int readSystemFileAsInt(final String pSystemFile) throws SystemUtilsException { + private static long readSystemFileAsLong(final String pSystemFile) throws SystemUtilsException { InputStream in = null; try { final Process process = new ProcessBuilder(new String[] { "/system/bin/cat", pSystemFile }).start(); in = process.getInputStream(); final String content = StreamUtils.readFully(in); - return Integer.parseInt(content); + return Long.parseLong(content); } catch (final IOException e) { throw new SystemUtilsException(e); } catch (final NumberFormatException e) { @@ -246,6 +264,66 @@ private static int readSystemFileAsInt(final String pSystemFile) throws SystemUt } } + public static long getNativeHeapSize() { + return Debug.getNativeHeapSize() / DataConstants.BYTES_PER_KILOBYTE; + } + + public static long getNativeHeapFreeSize() { + return Debug.getNativeHeapFreeSize() / DataConstants.BYTES_PER_KILOBYTE; + } + + public static long getNativeHeapAllocatedSize() { + return Debug.getNativeHeapAllocatedSize() / DataConstants.BYTES_PER_KILOBYTE; + } + + public static long getDalvikHeapSize() { + return Runtime.getRuntime().totalMemory() / DataConstants.BYTES_PER_KILOBYTE; + } + + public static long getDalvikHeapFreeSize() { + return Runtime.getRuntime().freeMemory() / DataConstants.BYTES_PER_KILOBYTE; + } + + public static long getDalvikHeapAllocatedSize() { + return SystemUtils.getDalvikHeapSize() - SystemUtils.getDalvikHeapFreeSize(); + } + + public static long getNativeProportionalSetSize() { + return SystemUtils.getMemoryInfo().nativePss; + } + + public static long getNativePrivateDirtyPages() { + return SystemUtils.getMemoryInfo().nativePrivateDirty; + } + + public static long getNativeSharedDirtyPages() { + return SystemUtils.getMemoryInfo().nativeSharedDirty; + } + + public static long getDalvikProportionalSetSize() { + return SystemUtils.getMemoryInfo().dalvikPss; + } + + public static long getDalvikPrivateDirtyPages() { + return SystemUtils.getMemoryInfo().dalvikPrivateDirty; + } + + public static long getDalvikSharedDirtyPages() { + return SystemUtils.getMemoryInfo().dalvikSharedDirty; + } + + public static long getOtherProportionalSetSize() { + return SystemUtils.getMemoryInfo().otherPss; + } + + public static long getOtherPrivateDirtyPages() { + return SystemUtils.getMemoryInfo().otherPrivateDirty; + } + + public static long getOtherSharedDirtyPages() { + return SystemUtils.getMemoryInfo().otherSharedDirty; + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From 8fd9409b06b067cdd5433e65dd674dd514600df8 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 15 May 2012 15:24:54 -0700 Subject: [PATCH 076/252] Added warm-up functionality to TextureManager, to ensure texture data is actually moved to the GPU (and doesn't keep sitting in the native heap), when the texture is loaded. --- .../opengl/texture/TextureManager.java | 11 ++- .../TextureWarmUpVertexBufferObject.java | 82 +++++++++++++++++++ .../opengl/vbo/VertexBufferObject.java | 10 ++- 3 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java diff --git a/src/org/andengine/opengl/texture/TextureManager.java b/src/org/andengine/opengl/texture/TextureManager.java index 48ab3556a..ff5035b50 100644 --- a/src/org/andengine/opengl/texture/TextureManager.java +++ b/src/org/andengine/opengl/texture/TextureManager.java @@ -37,6 +37,7 @@ public class TextureManager { private final ArrayList mTexturesToBeLoaded = new ArrayList(); private final ArrayList mTexturesToBeUnloaded = new ArrayList(); + private TextureWarmUpVertexBufferObject mTextureWarmUpVertexBufferObject; // =========================================================== // Constructors @@ -55,7 +56,7 @@ public class TextureManager { // =========================================================== public synchronized void onCreate() { - + this.mTextureWarmUpVertexBufferObject = new TextureWarmUpVertexBufferObject(); } public synchronized void onReload() { @@ -75,6 +76,8 @@ public synchronized void onReload() { this.mTexturesManaged.removeAll(this.mTexturesToBeUnloaded); // TODO Check if removeAll uses iterator internally! this.mTexturesToBeUnloaded.clear(); } + + this.mTextureWarmUpVertexBufferObject.setNotLoadedToHardware(); } public synchronized void onDestroy() { @@ -87,6 +90,9 @@ public synchronized void onDestroy() { this.mTexturesLoaded.clear(); this.mTexturesManaged.clear(); this.mTexturesMapped.clear(); + + this.mTextureWarmUpVertexBufferObject.dispose(); + this.mTextureWarmUpVertexBufferObject = null; } public synchronized boolean hasMappedTexture(final String pID) { @@ -245,6 +251,9 @@ public synchronized void updateTextures(final GLState pGLState) { if(!textureToBeLoaded.isLoadedToHardware()) { try { textureToBeLoaded.loadToHardware(pGLState); + + /* Execute the warm-up to ensure the texture data is actually moved to the GPU. */ + this.mTextureWarmUpVertexBufferObject.warmup(pGLState, textureToBeLoaded); } catch (final IOException e) { Debug.e(e); } diff --git a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java new file mode 100644 index 000000000..90ecaaf30 --- /dev/null +++ b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java @@ -0,0 +1,82 @@ +package org.andengine.opengl.texture; + +import org.andengine.opengl.shader.PositionTextureCoordinatesShaderProgram; +import org.andengine.opengl.shader.constants.ShaderProgramConstants; +import org.andengine.opengl.util.GLState; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.VertexBufferObject; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; + +import android.opengl.GLES20; + +/** + * (c) Zynga 2012 + * + * @author Nicolas Gramlich + * @since 15:11:05 - 15.05.2012 + */ +public class TextureWarmUpVertexBufferObject extends VertexBufferObject { + // =========================================================== + // Constants + // =========================================================== + + public static final int VERTEX_SIZE = 2 + 2; + public static final int VERTICES_PER_VERTEXBUFFEROBJECT_SIZE = 3; + public static final int VERTEXBUFFEROBJECT_SIZE = TextureWarmUpVertexBufferObject.VERTEX_SIZE * TextureWarmUpVertexBufferObject.VERTICES_PER_VERTEXBUFFEROBJECT_SIZE; + + public static final VertexBufferObjectAttributes VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT = new VertexBufferObjectAttributesBuilder(2) + .add(ShaderProgramConstants.ATTRIBUTE_POSITION_LOCATION, ShaderProgramConstants.ATTRIBUTE_POSITION, 2, GLES20.GL_FLOAT, false) + .add(ShaderProgramConstants.ATTRIBUTE_TEXTURECOORDINATES_LOCATION, ShaderProgramConstants.ATTRIBUTE_TEXTURECOORDINATES, 2, GLES20.GL_FLOAT, false) + .build(); + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public TextureWarmUpVertexBufferObject() { + super(null, VERTEXBUFFEROBJECT_SIZE, DrawType.STATIC, true, TextureWarmUpVertexBufferObject.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getHeapMemoryByteSize() { + return 0; + } + + @Override + public int getNativeHeapMemoryByteSize() { + return this.getByteCapacity(); + } + + @Override + protected void onBufferData() { + /* Nothing. */ + } + + public void warmup(final GLState pGLState, final ITexture pTexture) { + pTexture.bind(pGLState); + this.bind(pGLState, PositionTextureCoordinatesShaderProgram.getInstance()); + this.draw(GLES20.GL_TRIANGLES, VERTICES_PER_VERTEXBUFFEROBJECT_SIZE); + this.unbind(pGLState, PositionTextureCoordinatesShaderProgram.getInstance()); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/opengl/vbo/VertexBufferObject.java b/src/org/andengine/opengl/vbo/VertexBufferObject.java index b91b944a6..9f4bb217c 100644 --- a/src/org/andengine/opengl/vbo/VertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/VertexBufferObject.java @@ -48,7 +48,7 @@ public abstract class VertexBufferObject implements IVertexBufferObject { // =========================================================== /** - * @param pVertexBufferObjectManager + * @param pVertexBufferObjectManager (optional, if you manage reloading on your own.) * @param pCapacity * @param pDrawType * @param pAutoDispose when passing true this {@link VertexBufferObject} loads itself to the active {@link VertexBufferObjectManager}. WARNING: When passing false one needs to take care of that by oneself! @@ -141,7 +141,9 @@ public void bind(final GLState pGLState) { if(this.mHardwareBufferID == IVertexBufferObject.HARDWARE_BUFFER_ID_INVALID) { this.loadToHardware(pGLState); - this.mVertexBufferObjectManager.onVertexBufferObjectLoaded(this); + if(this.mVertexBufferObjectManager != null) { + this.mVertexBufferObjectManager.onVertexBufferObjectLoaded(this); + } } pGLState.bindArrayBuffer(this.mHardwareBufferID); @@ -190,7 +192,9 @@ public void dispose() { if(!this.mDisposed) { this.mDisposed = true; - this.mVertexBufferObjectManager.onUnloadVertexBufferObject(this); + if(this.mVertexBufferObjectManager != null) { + this.mVertexBufferObjectManager.onUnloadVertexBufferObject(this); + } BufferUtils.freeDirectByteBuffer(this.mByteBuffer); } else { From ce1d715e23d9c06d27b96fd4333fbb50aab4fcb8 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 15 May 2012 15:27:08 -0700 Subject: [PATCH 077/252] Minor change. --- src/org/andengine/opengl/vbo/VertexBufferObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/opengl/vbo/VertexBufferObject.java b/src/org/andengine/opengl/vbo/VertexBufferObject.java index 9f4bb217c..b14c46ac6 100644 --- a/src/org/andengine/opengl/vbo/VertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/VertexBufferObject.java @@ -48,7 +48,7 @@ public abstract class VertexBufferObject implements IVertexBufferObject { // =========================================================== /** - * @param pVertexBufferObjectManager (optional, if you manage reloading on your own.) + * @param pVertexBufferObjectManager (Optional, if you manage reloading on your own.) * @param pCapacity * @param pDrawType * @param pAutoDispose when passing true this {@link VertexBufferObject} loads itself to the active {@link VertexBufferObjectManager}. WARNING: When passing false one needs to take care of that by oneself! From 9d1aa60e9840db78cd7959c52f3944737b86c409 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 15 May 2012 15:32:13 -0700 Subject: [PATCH 078/252] Minor change. --- src/org/andengine/opengl/texture/TextureManager.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/andengine/opengl/texture/TextureManager.java b/src/org/andengine/opengl/texture/TextureManager.java index ff5035b50..bc02d1733 100644 --- a/src/org/andengine/opengl/texture/TextureManager.java +++ b/src/org/andengine/opengl/texture/TextureManager.java @@ -37,6 +37,7 @@ public class TextureManager { private final ArrayList mTexturesToBeLoaded = new ArrayList(); private final ArrayList mTexturesToBeUnloaded = new ArrayList(); + private TextureWarmUpVertexBufferObject mTextureWarmUpVertexBufferObject; // =========================================================== From b7a1f1fda2d696d128b06049495d0507eead6dca Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 15 May 2012 18:06:16 -0700 Subject: [PATCH 079/252] Made sure texture warmup also works on Adreno GPUs (at least on the Adreno 205 in the XPeria Play on Android 2.3.6). --- .../TextureWarmUpVertexBufferObject.java | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java index 90ecaaf30..1adbcaac6 100644 --- a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java +++ b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java @@ -1,5 +1,8 @@ package org.andengine.opengl.texture; +import java.nio.FloatBuffer; + +import org.andengine.entity.sprite.UncoloredSprite; import org.andengine.opengl.shader.PositionTextureCoordinatesShaderProgram; import org.andengine.opengl.shader.constants.ShaderProgramConstants; import org.andengine.opengl.util.GLState; @@ -21,6 +24,11 @@ public class TextureWarmUpVertexBufferObject extends VertexBufferObject { // Constants // =========================================================== + public static final int VERTEX_INDEX_X = 0; + public static final int VERTEX_INDEX_Y = UncoloredSprite.VERTEX_INDEX_X + 1; + public static final int TEXTURECOORDINATES_INDEX_U = UncoloredSprite.VERTEX_INDEX_Y + 1; + public static final int TEXTURECOORDINATES_INDEX_V = UncoloredSprite.TEXTURECOORDINATES_INDEX_U + 1; + public static final int VERTEX_SIZE = 2 + 2; public static final int VERTICES_PER_VERTEXBUFFEROBJECT_SIZE = 3; public static final int VERTEXBUFFEROBJECT_SIZE = TextureWarmUpVertexBufferObject.VERTEX_SIZE * TextureWarmUpVertexBufferObject.VERTICES_PER_VERTEXBUFFEROBJECT_SIZE; @@ -34,12 +42,31 @@ public class TextureWarmUpVertexBufferObject extends VertexBufferObject { // Fields // =========================================================== + protected final FloatBuffer mFloatBuffer; + // =========================================================== // Constructors // =========================================================== public TextureWarmUpVertexBufferObject() { super(null, VERTEXBUFFEROBJECT_SIZE, DrawType.STATIC, true, TextureWarmUpVertexBufferObject.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT); + + this.mFloatBuffer = this.mByteBuffer.asFloatBuffer(); + + this.mFloatBuffer.put(0 * VERTEX_SIZE + VERTEX_INDEX_X, 0); + this.mFloatBuffer.put(0 * VERTEX_SIZE + VERTEX_INDEX_Y, 0); + this.mFloatBuffer.put(0 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 0); + this.mFloatBuffer.put(0 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 0); + + this.mFloatBuffer.put(1 * VERTEX_SIZE + VERTEX_INDEX_X, 1); + this.mFloatBuffer.put(1 * VERTEX_SIZE + VERTEX_INDEX_Y, 0); + this.mFloatBuffer.put(1 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 1); + this.mFloatBuffer.put(1 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 0); + + this.mFloatBuffer.put(2 * VERTEX_SIZE + VERTEX_INDEX_X, 0); + this.mFloatBuffer.put(2 * VERTEX_SIZE + VERTEX_INDEX_Y, 1); + this.mFloatBuffer.put(2 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 0); + this.mFloatBuffer.put(2 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 1); } // =========================================================== @@ -62,13 +89,24 @@ public int getNativeHeapMemoryByteSize() { @Override protected void onBufferData() { - /* Nothing. */ + GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.mByteBuffer.limit(), this.mByteBuffer, this.mUsage); } public void warmup(final GLState pGLState, final ITexture pTexture) { pTexture.bind(pGLState); this.bind(pGLState, PositionTextureCoordinatesShaderProgram.getInstance()); - this.draw(GLES20.GL_TRIANGLES, VERTICES_PER_VERTEXBUFFEROBJECT_SIZE); + + pGLState.pushModelViewGLMatrix(); + { + /* Far far away and really small. */ + pGLState.resetModelViewGLMatrixStack(); + pGLState.translateModelViewGLMatrixf(1000000, 1000000, 0); + pGLState.scaleModelViewGLMatrixf(0.0001f, 0.0001f, 0); + + this.draw(GLES20.GL_TRIANGLES, VERTICES_PER_VERTEXBUFFEROBJECT_SIZE); + } + pGLState.popModelViewGLMatrix(); + this.unbind(pGLState, PositionTextureCoordinatesShaderProgram.getInstance()); } From 546ff319b80f4079e2cafe58d187046a27439c8e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 16 May 2012 11:51:50 -0700 Subject: [PATCH 080/252] Minor changes. --- .../TextureWarmUpVertexBufferObject.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java index 1adbcaac6..45a619de5 100644 --- a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java +++ b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java @@ -49,24 +49,24 @@ public class TextureWarmUpVertexBufferObject extends VertexBufferObject { // =========================================================== public TextureWarmUpVertexBufferObject() { - super(null, VERTEXBUFFEROBJECT_SIZE, DrawType.STATIC, true, TextureWarmUpVertexBufferObject.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT); + super(null, TextureWarmUpVertexBufferObject.VERTEXBUFFEROBJECT_SIZE, DrawType.STATIC, true, TextureWarmUpVertexBufferObject.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT); this.mFloatBuffer = this.mByteBuffer.asFloatBuffer(); - this.mFloatBuffer.put(0 * VERTEX_SIZE + VERTEX_INDEX_X, 0); - this.mFloatBuffer.put(0 * VERTEX_SIZE + VERTEX_INDEX_Y, 0); - this.mFloatBuffer.put(0 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 0); - this.mFloatBuffer.put(0 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 0); + this.mFloatBuffer.put((0 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.VERTEX_INDEX_X, 0); + this.mFloatBuffer.put((0 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.VERTEX_INDEX_Y, 0); + this.mFloatBuffer.put((0 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.TEXTURECOORDINATES_INDEX_U, 0); + this.mFloatBuffer.put((0 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.TEXTURECOORDINATES_INDEX_V, 0); - this.mFloatBuffer.put(1 * VERTEX_SIZE + VERTEX_INDEX_X, 1); - this.mFloatBuffer.put(1 * VERTEX_SIZE + VERTEX_INDEX_Y, 0); - this.mFloatBuffer.put(1 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 1); - this.mFloatBuffer.put(1 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 0); + this.mFloatBuffer.put((1 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.VERTEX_INDEX_X, 1); + this.mFloatBuffer.put((1 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.VERTEX_INDEX_Y, 0); + this.mFloatBuffer.put((1 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.TEXTURECOORDINATES_INDEX_U, 1); + this.mFloatBuffer.put((1 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.TEXTURECOORDINATES_INDEX_V, 0); - this.mFloatBuffer.put(2 * VERTEX_SIZE + VERTEX_INDEX_X, 0); - this.mFloatBuffer.put(2 * VERTEX_SIZE + VERTEX_INDEX_Y, 1); - this.mFloatBuffer.put(2 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_U, 0); - this.mFloatBuffer.put(2 * VERTEX_SIZE + TEXTURECOORDINATES_INDEX_V, 1); + this.mFloatBuffer.put((2 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.VERTEX_INDEX_X, 0); + this.mFloatBuffer.put((2 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.VERTEX_INDEX_Y, 1); + this.mFloatBuffer.put((2 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.TEXTURECOORDINATES_INDEX_U, 0); + this.mFloatBuffer.put((2 * TextureWarmUpVertexBufferObject.VERTEX_SIZE) + TextureWarmUpVertexBufferObject.TEXTURECOORDINATES_INDEX_V, 1); } // =========================================================== @@ -102,8 +102,8 @@ public void warmup(final GLState pGLState, final ITexture pTexture) { pGLState.resetModelViewGLMatrixStack(); pGLState.translateModelViewGLMatrixf(1000000, 1000000, 0); pGLState.scaleModelViewGLMatrixf(0.0001f, 0.0001f, 0); - - this.draw(GLES20.GL_TRIANGLES, VERTICES_PER_VERTEXBUFFEROBJECT_SIZE); + + this.draw(GLES20.GL_TRIANGLES, TextureWarmUpVertexBufferObject.VERTICES_PER_VERTEXBUFFEROBJECT_SIZE); } pGLState.popModelViewGLMatrix(); From 9e42ba89625107bb9387d5d63c446e08db612a86 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 16 May 2012 14:52:11 -0700 Subject: [PATCH 081/252] Fix calling wrong method in TextureWarmUpVertexBufferObject =). --- .../opengl/texture/TextureWarmUpVertexBufferObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java index 45a619de5..8a0856903 100644 --- a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java +++ b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java @@ -99,7 +99,7 @@ public void warmup(final GLState pGLState, final ITexture pTexture) { pGLState.pushModelViewGLMatrix(); { /* Far far away and really small. */ - pGLState.resetModelViewGLMatrixStack(); + pGLState.loadModelViewGLMatrixIdentity(); pGLState.translateModelViewGLMatrixf(1000000, 1000000, 0); pGLState.scaleModelViewGLMatrixf(0.0001f, 0.0001f, 0); From c3e81ab7a7b6622d1aa7be286acee8115b7073a9 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 16 May 2012 17:46:09 -0700 Subject: [PATCH 082/252] Now updating Camera(s) after updating the Scene(s), so that the the chase entity of the Camera doesn't stutter. --- src/org/andengine/engine/Engine.java | 2 +- .../DoubleSceneSplitScreenEngine.java | 25 ++++++++----------- .../SingleSceneSplitScreenEngine.java | 13 +++++----- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index e98a36a89..5c8f2f88e 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -594,12 +594,12 @@ protected void onUpdateScene(final float pSecondsElapsed) { if(this.mScene != null) { this.mScene.onUpdate(pSecondsElapsed); } + this.getCamera().onUpdate(pSecondsElapsed); } protected void onUpdateUpdateHandlers(final float pSecondsElapsed) { this.mUpdateThreadRunnableHandler.onUpdate(pSecondsElapsed); this.mUpdateHandlers.onUpdate(pSecondsElapsed); - this.getCamera().onUpdate(pSecondsElapsed); } protected void onUpdateDrawHandlers(final GLState pGLState, final Camera pCamera) { diff --git a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java index 3748bc704..07544d50d 100644 --- a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java @@ -87,6 +87,17 @@ public void setSecondScene(final Scene pScene) { // Methods for/from SuperClass/Interfaces // =========================================================== + @Override + protected void onUpdateScene(final float pSecondsElapsed) { + super.onUpdateScene(pSecondsElapsed); + + if(this.mSecondScene != null) { + this.mSecondScene.onUpdate(pSecondsElapsed); + } + + this.getSecondCamera().onUpdate(pSecondsElapsed); + } + @Override protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { final Camera secondCamera = this.getSecondCamera(); @@ -137,14 +148,6 @@ protected Scene getSceneFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { } } - @Override - protected void onUpdateScene(final float pSecondsElapsed) { - super.onUpdateScene(pSecondsElapsed); - if(this.mSecondScene != null) { - this.mSecondScene.onUpdate(pSecondsElapsed); - } - } - @Override protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { final int surfaceWidthHalf = this.mSurfaceWidth >> 1; @@ -157,12 +160,6 @@ protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, f } } - @Override - protected void onUpdateUpdateHandlers(final float pSecondsElapsed) { - super.onUpdateUpdateHandlers(pSecondsElapsed); - this.getSecondCamera().onUpdate(pSecondsElapsed); - } - @Override protected void onUpdateCameraSurface() { final int surfaceWidth = this.mSurfaceWidth; diff --git a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java index e08a47bb5..a52239193 100644 --- a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java @@ -57,6 +57,13 @@ public Camera getSecondCamera() { // Methods for/from SuperClass/Interfaces // =========================================================== + @Override + protected void onUpdateScene(final float pSecondsElapsed) { + super.onUpdateScene(pSecondsElapsed); + + this.getSecondCamera().onUpdate(pSecondsElapsed); + } + @Override protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { if(super.mScene != null) { @@ -112,12 +119,6 @@ protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, f } } - @Override - protected void onUpdateUpdateHandlers(final float pSecondsElapsed) { - super.onUpdateUpdateHandlers(pSecondsElapsed); - this.getSecondCamera().onUpdate(pSecondsElapsed); - } - @Override protected void onUpdateCameraSurface() { final int surfaceWidth = this.mSurfaceWidth; From cfbea38bb09483947b1233bee8523792aecfd729 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 16 May 2012 18:20:46 -0700 Subject: [PATCH 083/252] Added convenience method in PathModifier.Path. --- src/org/andengine/entity/modifier/PathModifier.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/org/andengine/entity/modifier/PathModifier.java b/src/org/andengine/entity/modifier/PathModifier.java index 9dd4b24ec..e075e83eb 100644 --- a/src/org/andengine/entity/modifier/PathModifier.java +++ b/src/org/andengine/entity/modifier/PathModifier.java @@ -276,6 +276,18 @@ public Path to(final float pX, final float pY) { return this; } + public Path to(final int pIndex) { + return this.to(this.getX(pIndex), this.getY(pIndex)); + } + + private float getX(final int pIndex) { + return this.mXs[pIndex]; + } + + private float getY(final int pIndex) { + return this.mYs[pIndex]; + } + public float[] getCoordinatesX() { return this.mXs; } From a0a50fc6560fa34b528eb33d5b7c7dab940ba8f3 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 16 May 2012 18:19:24 -0700 Subject: [PATCH 084/252] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 128c9ef57..bc2f874d5 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ public final class BuildConfig { * [`AndEngineScriptingExtension`][URI_AndEngineScriptingExtension] * [`AndEngineScriptingExtensionGenerator`][URI_AndEngineScriptingExtensionGenerator] * [`AndEngineSVGTextureRegionExtension`][URI_AndEngineSVGTextureRegionExtension] - * [`AndEngineTexturePackerExtension`][URI_AndEngineTexturePackerExtension] + * [`AndEngineTexturePackerExtension`][URI_AndEngineTexturePackerExtension] (Merged into the 'GLES2-AnchorCenter' branch.) * [`AndEngineTMXTiledMapExtension`][URI_AndEngineTMXTiledMapExtension] (Merged into the 'GLES1' branch.) From 5e085c6c59ce0282ae7b9cdf560b84238758f9ca Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 18 May 2012 17:44:50 -0700 Subject: [PATCH 085/252] Moved a few methods from MathUtils to ArrayUtils, where they actually belong. Added AnimationData.setLoopCount(int) and AnimationData.scale(float). --- .../entity/sprite/AnimationData.java | 19 ++++++- .../andengine/util/adt/array/ArrayUtils.java | 55 +++++++++++++++++++ src/org/andengine/util/math/MathUtils.java | 43 --------------- 3 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/org/andengine/entity/sprite/AnimationData.java b/src/org/andengine/entity/sprite/AnimationData.java index 32d5a7f70..3be1a8701 100644 --- a/src/org/andengine/entity/sprite/AnimationData.java +++ b/src/org/andengine/entity/sprite/AnimationData.java @@ -2,7 +2,7 @@ import java.util.Arrays; -import org.andengine.util.math.MathUtils; +import org.andengine.util.adt.array.ArrayUtils; import org.andengine.util.modifier.IModifier.DeepCopyNotSupportedException; import org.andengine.util.time.TimeConstants; @@ -102,6 +102,10 @@ public IAnimationData deepCopy() throws DeepCopyNotSupportedException { // Getter & Setter // =========================================================== + public void setLoopCount(final int pLoopCount) { + this.mLoopCount = pLoopCount; + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @@ -264,7 +268,7 @@ private void set(final long[] pFrameDurations, final int pFrameCount, final int[ } final long[] frameEndsInNanoseconds = this.mFrameEndsInNanoseconds; - MathUtils.arraySumInto(this.mFrameDurations, frameEndsInNanoseconds, TimeConstants.NANOSECONDS_PER_MILLISECOND); + ArrayUtils.sum(this.mFrameDurations, frameEndsInNanoseconds, TimeConstants.NANOSECONDS_PER_MILLISECOND); final long lastFrameEnd = frameEndsInNanoseconds[this.mFrameCount - 1]; this.mAnimationDuration = lastFrameEnd; @@ -274,6 +278,17 @@ private void set(final long[] pFrameDurations, final int pFrameCount, final int[ // Methods // =========================================================== + /** + * Scales the duration of this {@link AnimationData} by a given pFactor. + * + * @param pScale + */ + public void scale(final float pScale) { + ArrayUtils.multiply(this.mFrameDurations, pScale); + ArrayUtils.multiply(this.mFrameEndsInNanoseconds, pScale); + this.mAnimationDuration *= pScale; + } + private static long[] fillFrameDurations(final long pFrameDurationEach, final int pFrameCount) { final long[] frameDurations = new long[pFrameCount]; Arrays.fill(frameDurations, pFrameDurationEach); diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java index de0143bdd..c99755cf6 100644 --- a/src/org/andengine/util/adt/array/ArrayUtils.java +++ b/src/org/andengine/util/adt/array/ArrayUtils.java @@ -401,6 +401,61 @@ public static int idealObjectArraySize(final int pSize) { return ArrayUtils.idealByteArraySize(pSize << 2) >> 2; } + public static final void arraySumInternal(final int[] pValues) { + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pValues[i] = pValues[i-1] + pValues[i]; + } + } + + public static final void arraySumInternal(final long[] pValues) { + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pValues[i] = pValues[i-1] + pValues[i]; + } + } + + public static final void arraySumInternal(final long[] pValues, final long pFactor) { + pValues[0] = pValues[0] * pFactor; + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pValues[i] = pValues[i-1] + (pValues[i] * pFactor); + } + } + + public static final void sum(final long[] pValues, final long[] pTargetValues, final long pFactor) { + pTargetValues[0] = pValues[0] * pFactor; + final int valueCount = pValues.length; + for(int i = 1; i < valueCount; i++) { + pTargetValues[i] = pTargetValues[i-1] + (pValues[i] * pFactor); + } + } + + public static final float arraySum(final float[] pValues) { + float sum = 0; + final int valueCount = pValues.length; + for(int i = 0; i < valueCount; i++) { + sum += pValues[i]; + } + return sum; + } + + public static final float arrayAverage(final float[] pValues) { + return ArrayUtils.arraySum(pValues) / pValues.length; + } + + public static void multiply(final int[] pArray, final float pFactor) { + for(int i = 0; i < pArray.length; i++) { + pArray[i] = Math.round(pArray[i] * pFactor); + } + } + + public static void multiply(final long[] pArray, final double pFactor) { + for(int i = 0; i < pArray.length; i++) { + pArray[i] = Math.round(pArray[i] * pFactor); + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index f9a328a0a..efe934d4d 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -258,49 +258,6 @@ public static final int sum(final int[] pValues) { return sum; } - public static final void arraySumInternal(final int[] pValues) { - final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { - pValues[i] = pValues[i-1] + pValues[i]; - } - } - - public static final void arraySumInternal(final long[] pValues) { - final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { - pValues[i] = pValues[i-1] + pValues[i]; - } - } - - public static final void arraySumInternal(final long[] pValues, final long pFactor) { - pValues[0] = pValues[0] * pFactor; - final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { - pValues[i] = pValues[i-1] + (pValues[i] * pFactor); - } - } - - public static final void arraySumInto(final long[] pValues, final long[] pTargetValues, final long pFactor) { - pTargetValues[0] = pValues[0] * pFactor; - final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { - pTargetValues[i] = pTargetValues[i-1] + (pValues[i] * pFactor); - } - } - - public static final float arraySum(final float[] pValues) { - float sum = 0; - final int valueCount = pValues.length; - for(int i = 0; i < valueCount; i++) { - sum += pValues[i]; - } - return sum; - } - - public static final float arrayAverage(final float[] pValues) { - return MathUtils.arraySum(pValues) / pValues.length; - } - public static float[] rotateAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY) { if(pRotation != 0) { final float rotationRad = MathUtils.degToRad(pRotation); From b85da6d58d477af71ee523da33d9be7c865b1110 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 18 May 2012 17:46:52 -0700 Subject: [PATCH 086/252] Renamed a few methods in ArrayUtils. --- src/org/andengine/entity/sprite/AnimationData.java | 2 +- src/org/andengine/util/adt/array/ArrayUtils.java | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/org/andengine/entity/sprite/AnimationData.java b/src/org/andengine/entity/sprite/AnimationData.java index 3be1a8701..85b662eba 100644 --- a/src/org/andengine/entity/sprite/AnimationData.java +++ b/src/org/andengine/entity/sprite/AnimationData.java @@ -268,7 +268,7 @@ private void set(final long[] pFrameDurations, final int pFrameCount, final int[ } final long[] frameEndsInNanoseconds = this.mFrameEndsInNanoseconds; - ArrayUtils.sum(this.mFrameDurations, frameEndsInNanoseconds, TimeConstants.NANOSECONDS_PER_MILLISECOND); + ArrayUtils.sumCummulative(this.mFrameDurations, TimeConstants.NANOSECONDS_PER_MILLISECOND, frameEndsInNanoseconds); final long lastFrameEnd = frameEndsInNanoseconds[this.mFrameCount - 1]; this.mAnimationDuration = lastFrameEnd; diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java index c99755cf6..861160f22 100644 --- a/src/org/andengine/util/adt/array/ArrayUtils.java +++ b/src/org/andengine/util/adt/array/ArrayUtils.java @@ -401,21 +401,21 @@ public static int idealObjectArraySize(final int pSize) { return ArrayUtils.idealByteArraySize(pSize << 2) >> 2; } - public static final void arraySumInternal(final int[] pValues) { + public static final void sumCummulative(final int[] pValues) { final int valueCount = pValues.length; for(int i = 1; i < valueCount; i++) { pValues[i] = pValues[i-1] + pValues[i]; } } - public static final void arraySumInternal(final long[] pValues) { + public static final void sumCummulative(final long[] pValues) { final int valueCount = pValues.length; for(int i = 1; i < valueCount; i++) { pValues[i] = pValues[i-1] + pValues[i]; } } - public static final void arraySumInternal(final long[] pValues, final long pFactor) { + public static final void sumCummulative(final long[] pValues, final long pFactor) { pValues[0] = pValues[0] * pFactor; final int valueCount = pValues.length; for(int i = 1; i < valueCount; i++) { @@ -423,7 +423,7 @@ public static final void arraySumInternal(final long[] pValues, final long pFact } } - public static final void sum(final long[] pValues, final long[] pTargetValues, final long pFactor) { + public static final void sumCummulative(final long[] pValues, final long pFactor, final long[] pTargetValues) { pTargetValues[0] = pValues[0] * pFactor; final int valueCount = pValues.length; for(int i = 1; i < valueCount; i++) { @@ -431,7 +431,7 @@ public static final void sum(final long[] pValues, final long[] pTargetValues, f } } - public static final float arraySum(final float[] pValues) { + public static final float sum(final float[] pValues) { float sum = 0; final int valueCount = pValues.length; for(int i = 0; i < valueCount; i++) { @@ -440,8 +440,8 @@ public static final float arraySum(final float[] pValues) { return sum; } - public static final float arrayAverage(final float[] pValues) { - return ArrayUtils.arraySum(pValues) / pValues.length; + public static final float average(final float[] pValues) { + return ArrayUtils.sum(pValues) / pValues.length; } public static void multiply(final int[] pArray, final float pFactor) { From 4323aabdad20fd2c5621ba9bb1a1aa0bb45dce7d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 21 May 2012 14:20:20 -0700 Subject: [PATCH 087/252] Now building for MIPS. No more compiling with 'APP_STL := gnustl_shared'. --- jni/Application.mk | 6 +++--- jni/build.sh | 8 ++++---- libs/armeabi-v7a/libandengine.so | Bin 11388 -> 11388 bytes libs/armeabi/libandengine.so | Bin 11412 -> 11412 bytes libs/mips/libandengine.so | Bin 0 -> 5944 bytes 5 files changed, 7 insertions(+), 7 deletions(-) create mode 100755 libs/mips/libandengine.so diff --git a/jni/Application.mk b/jni/Application.mk index f47b6ee8a..3622268cf 100644 --- a/jni/Application.mk +++ b/jni/Application.mk @@ -1,3 +1,3 @@ -# Build both ARMv5TE and ARMv7-A and x86 machine code. -APP_ABI := armeabi armeabi-v7a x86 -APP_STL := gnustl_shared \ No newline at end of file +# Build both ARMv5TE, ARMv7-A, x86 and MIPS machine code. +APP_ABI := armeabi armeabi-v7a x86 mips +# APP_STL := gnustl_shared \ No newline at end of file diff --git a/jni/build.sh b/jni/build.sh index 91790b1ba..858f77fff 100755 --- a/jni/build.sh +++ b/jni/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -NDK_DIRECTORY="/Users/ngramlich/SDKs/Android/ndk/r7b/" +NDK_DIRECTORY="/Users/ngramlich/SDKs/Android/ndk/r8/" PROJECT_DIRECTORY="/Users/ngramlich/Workspace/gdk/graphic_engines/AndEngine/AndEngine/" # Run build: @@ -8,8 +8,8 @@ pushd ${PROJECT_DIRECTORY} ${NDK_DIRECTORY}ndk-build # Clean temporary files: -# rm -rf ${PROJECT_DIRECTORY}obj -# find . -name gdbserver -print0 | xargs -0 rm -rf -# find . -name gdb.setup -print0 | xargs -0 rm -rf +rm -rf ${PROJECT_DIRECTORY}obj +find . -name gdbserver -print0 | xargs -0 rm -rf +find . -name gdb.setup -print0 | xargs -0 rm -rf popd \ No newline at end of file diff --git a/libs/armeabi-v7a/libandengine.so b/libs/armeabi-v7a/libandengine.so index 558d8aa2971a0f0fba2e331986365e6139421828..d3f775a313c0b4c2c13136e58ea09ac443eb5881 100755 GIT binary patch delta 733 zcmZ8fJ4nM&6uoH@Q~Z>s6v0|ZTIvT8Y&VPeTbzpjp(r9nhhkm)fs>^QPJ-Zb7jY2O zLFg!g;wq@%;8fbpQ9-3jLC;H`8ok52@7#0l=iQ`|tRzo|Wj(DD^@WHcMC2olqAVpF zp+kkJVjv`su8v?8+r-R)-X}KP$k%%Z1m?4opor>Tvi$DFmZao7g5`fJMVao zUO`U4IDTa@#gI1G2+k$8pbSax>{2nZ+tAgTmdw&+ftQ0s^Rk^+1HV;IbpKV-0bcx| z6Cv5Eyu(Ur?`RRxacpZ<%$tE%xCF-g-~8KC2J^W2`vkuSz2D?&TOU!`VpUJp3)yV| zD-_`b@MGg|^ElGJ4c*C$VV&!LgZ{#_6?_cFd3-*;MvgCmpMX0Bp23(wJT75l)}iU4 z0(zX72*7ww89CQY_^||@V=2v$k}Rhgu>$&~O%O1y4I_8g@!8fSq7^SuQt(IlJ1y;E hrMk9!y!u$qdpr{jfjEYMjs}Du6MoW_UvK$Pz5sbYS@r+` delta 733 zcmZ8fJ4gdT5S`0iauP*z8U$nDE=M#Lq6QlU(WDdvKNyUlNKheyO+-NpzqO65AeI(Z zS_lzswN})Cg=GQ~tVF>g#DKoNZ1i-B-F-7}-kaUKQoIyD8< zvL0Ahh)OzAA{zwDZ)1hnk*sT%$hMh8?Sf^pjI2i|ke#z}_Z*gtwHR2Rp`C@c7iaFs zfc?CH;P{4x6lv~t>u0Xy?+(Z{|LPxQrwq-D^ZVwhW>)_Q)e?yO*&*L=RkN0N*}h@Y52>eHB9oP z5uw>qPO_YHVC(|fag%6O%p1k7a0-I^AERCg1BWQ)sp9v;nb%jq_woXQYDQ zq#t~ELXkGn_R{=oUWa-m;7)ne?azM;d}WjwTy_DM$>Q_zXXN+*_zk#6;9iXB$K{5~ zn02aJ;2a*O1`-I~bBCVW7W`NOM_5ADr4F{O>fv+vB@Gl1oLhk2zU{MZNJJ|hqPVDU lr88>Mk)Cy*$gIyDN>|rTH~Dff0FPe9{wa3ZmEH*zm2YUhS`h#M diff --git a/libs/armeabi/libandengine.so b/libs/armeabi/libandengine.so index 983f5497055591da9345d94080933b5ae31b2e92..0b64e893c7c65925a16176c7ef103bf27e756e6f 100755 GIT binary patch delta 733 zcmZ9KO(+Cm7{{O4nKAOQ&1{>Hn%QZ6BxU!un|zg=CZ88Vl8dZ^kCF>(BUkb|lN^YP z+M^ug;wE>=-W(h#L@EBy%*gN@-glno|9igP-JRi`;nP0Zm{N&GV?=QxijYPLF(I3= zLxrf)LI}pu9#E+O)i3sC(8&9%?b zE5!ng{a2AxOleK@<6IDPO0V=GE)+An39i9%F_+82->M;+k-fZ9+(#8e#XxM-$^M&T z47yY2P~jDq7L7m789B&4T+p)ChyR1-GTsP)<*7W;AdNrh?aHyDSiDof1^!>M4`Mf epDsC(^WpGfRdpIefTM2z9`x^#P=2@mP5A~&{Z{S( delta 733 zcmZ8fO-mb56g}fiGGawDDq=;LmmwM#q6Rl9h#GKH5c~jQI(CT()z%3o$qA(J)kXAdHULPb7N#TBHEoY-^M=_&s%!G zyFeY^;;o6Zl3)nF)EUb)@_Lx(SG`~j8dv(Kr5BC z|0=P8k=p5%s$$or`%M$gSl3)mawe(`V zXZ?=!LnA~Wz;Fr?-uYwnwYz7Y56N!vBr^``A+PT6luF~Jb+3;j+aKiirCtS0!U q4D%a>YkQ`wFjaAE>h6kk;ZxPh=f)x%P>09xehY6iUig;&ZT$s0dshhn diff --git a/libs/mips/libandengine.so b/libs/mips/libandengine.so new file mode 100755 index 0000000000000000000000000000000000000000..bebf60b02c4445bb126e92b96329368b6bafa913 GIT binary patch literal 5944 zcmeHLT}&L;6+R1XOj=Br#C0|?j(1ZOZ)LRF5~6Hc9(IAnCZc$QNtH&e#>4IagZ57| z1BS?IP}QWagtYWWiW6Cti+}3&1zM$2l^@ko`@lmUc*sMf_5rEtn;#shmC~Pd`hBx= z@$6=Cu<}$XN1Q$P{GWU7onh{MDLXzI3WY>LyL5=hb%+c=xb>jOfw1HTBr5kwTn@{Z zX6C{U8s6hB3b*plF*s z0*rv~0mU@DnhwGK^BBL20$Ar?z<&XB8}y5yjMWaz!4H3O3C(x_lzqh#cyUozm9-&G z6>f}E1!0^j^TMxs3>1FVM?v9NrT@JG^D_?T!5Wxf0q66O&m0BioH*|<0h#L%@Gy{b zQ~kkk7g)D~z1E9!A+XPc`+@A`K_F{mzqt!JNA`}uy~F-}BKX1E;qfYpNi!fIj2S!& z%6&k1P(E;fPQA~E!5>ERe~)5v&_4$M$3eNygl??#CTJ)0+?)?UZ^Qn1G$IY2_J0Py zgn}>n`X@nqcl{5_U%^-5f6BLCW3&8v!|-R{xz7mQnE3?abs)Z~=U1@jvqoUO!=Qb; z_FZxe`Y;x-2s!IpZ?Z=?Z~uWH{s-<`(DS(^Fy12Q8tTFGQ}>6%MdaV{`QJ6gdmj8Y zH;ktjF+pzz_}9U22KWfCw?M*(q%* zGc=ynMAOD5#-_B)`js&^cs#Y-VDtz)wx;A5$^`iNr z;j_A9ESZixqc7@O#hTUha=|Finq@<)R52)`n(UeWZ#}@5{iKnz@CdRVm#r`Kx8cxnKOQvHk8X3#dmxnEk^LjCxdrF(v zDap+>xI8^+6b;=rKGAK_4ElZT=?UZ9h-n#lXK2|mh8AXK3@e*kTnZZX_oE))$TP?k z3YKBp*<4DSuT0Ow`7SeFaLl4s5Bwa4wl-fja|@1?j8eY3e2i2e$C@C@?Z#&^}e-f_xtA2cLAgXte#Iv(43t$oLR=Xj6&VIwSW zZ$wtUUt8-QT01CdzS1QP{(z*tS9%Y|A|tEmmDg(be;D;jf=`V;A!+Yj>mI(0IJKy} zbG$=#8cJrq?F;pM1MrW<@oryvrPd+!IMi?Y`fb$Hhk7EYCn;Aq2ISgCO0I7V$}cxY zWF7I>ucYK^EiG3#{^__}tDTbTwJ>ZB!FCXQEO}O9skEd}TWl*Ws$RsbA$BbpsFAq` z{M^A_M3K7}@#2Wvhum@GOd{t1YUm5(IMtMcJ!$TPiW`iH+R@LU)ur~KRmf||RYR_Z zdiN8DwW(O=n_@xtsp9?YQ^r$uT@1ttu1E9yxE42Fsqd5bu@8FveTm*<4X$B7T*rP; zYjLd>ZQ1*E*sPlSf>U(|vx9&OXi6DQnMb73P@Vye| zJ78(2ozLZ?66p={N1ON~P5dKG{KHLr1Uz#DA#|ku8=ZI~;WJAv|J!wYG4A<~>kfjh zfKGvKffhj{AGz)iK<7X&f!+Xp1N6dwUH4tksO!47KtF@eI`IG60q-9=iVwXwDWUVn zLPt7}dS^JE<(v;)m*4u5>q?Gv9}DqA0IyJaA99{?Adf0J&n&(FbX`&zxg$Rdb_()b zlY9yMY76-qL^S?73nxV^i(4chuybO+)- zJmc*x>bX$$&ue=EntN*>UjR+nU3d1p4E6B;u(nN9(C5?nZ`TE z)bsH*GMPex9B21>BH7IKMFZ2x!m;{Z9@Le?1yMIq}?AqXUV7#1oR?t;KA4 zK|sUGScc_dNvKal3JC zD5D+kxQJUAQ%@izeg(+fwBy|u@iv}OD_6ZqwJq>6WC zM82~ahd|2u27&b9Ts#4UE6NBW<|GUOl^vf&V%5{sf0WCFZ^yj1VMCm1VfP*1&ig!I z5@1*rUuQk98T@tuX~(-ABI{P5@>&pZx6+PxPDG^M1!ea=NSKCpyjvo+iuZEBj(0@F zR(7iaJHF3|s%KE`j(>8;E}Vl6k-b+yAJ+IPka<|&8f Date: Mon, 21 May 2012 14:20:55 -0700 Subject: [PATCH 088/252] Now also checking for OpenGL ES 2.0 support in AndEngine.isDeviceSupported(..). --- src/org/andengine/AndEngine.java | 24 +++++++++++++++---- .../DeviceNotSupportedException.java | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/AndEngine.java b/src/org/andengine/AndEngine.java index 89ae31ed7..68b12f9d5 100644 --- a/src/org/andengine/AndEngine.java +++ b/src/org/andengine/AndEngine.java @@ -10,6 +10,9 @@ import org.andengine.util.exception.DeviceNotSupportedException.DeviceNotSupportedCause; import org.andengine.util.system.SystemUtils; +import android.app.ActivityManager; +import android.content.Context; +import android.content.pm.ConfigurationInfo; import android.os.Build; /** @@ -43,19 +46,19 @@ public class AndEngine { // Methods // =========================================================== - public static boolean isDeviceSupported() { + public static boolean isDeviceSupported(final Context pContext) { try { - AndEngine.checkDeviceSupported(); + AndEngine.checkDeviceSupported(pContext); return true; } catch (final DeviceNotSupportedException e) { return false; } } - public static void checkDeviceSupported() throws DeviceNotSupportedException { + public static void checkDeviceSupported(final Context pContext) throws DeviceNotSupportedException { AndEngine.checkCodePathSupport(); - AndEngine.checkOpenGLSupport(); + AndEngine.checkOpenGLSupport(pContext); } private static void checkCodePathSupport() throws DeviceNotSupportedException { @@ -68,10 +71,21 @@ private static void checkCodePathSupport() throws DeviceNotSupportedException { } } - private static void checkOpenGLSupport() throws DeviceNotSupportedException { + private static void checkOpenGLSupport(final Context pContext) throws DeviceNotSupportedException { + AndEngine.checkGLES20Support(pContext); AndEngine.checkEGLConfigChooserSupport(); } + private static void checkGLES20Support(final Context pContext) throws DeviceNotSupportedException { + final ActivityManager activityManager = (ActivityManager) pContext.getSystemService(Context.ACTIVITY_SERVICE); + + final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); + + if (configurationInfo.reqGlEsVersion < 0x20000) { + throw new DeviceNotSupportedException(DeviceNotSupportedCause.GLES2_UNSUPPORTED); + } + } + private static void checkEGLConfigChooserSupport() throws DeviceNotSupportedException { /* Get an EGL instance. */ final EGL10 egl = (EGL10) EGLContext.getEGL(); diff --git a/src/org/andengine/util/exception/DeviceNotSupportedException.java b/src/org/andengine/util/exception/DeviceNotSupportedException.java index 1eb60725d..f352a88b0 100644 --- a/src/org/andengine/util/exception/DeviceNotSupportedException.java +++ b/src/org/andengine/util/exception/DeviceNotSupportedException.java @@ -60,6 +60,7 @@ public static enum DeviceNotSupportedCause { // Elements // =========================================================== + GLES2_UNSUPPORTED, CODEPATH_INCOMPLETE, EGLCONFIG_NOT_FOUND; From cd81f7ea4256c7279b58f9221725d6e219f7adaf Mon Sep 17 00:00:00 2001 From: player_03 Date: Sat, 19 May 2012 20:31:09 -0400 Subject: [PATCH 089/252] Merged b18c7fa4c94e13c63b0ed586f04666aa576216b0 from GLES2. --- src/org/andengine/entity/Entity.java | 16 ++++++++++++++++ src/org/andengine/entity/IEntity.java | 2 ++ .../item/decorator/BaseMenuItemDecorator.java | 10 ++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index f156b0011..f23ca46d5 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1009,6 +1009,14 @@ public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandl } return this.mUpdateHandlers.removeAll(pUpdateHandlerMatcher); } + + @Override + public int getUpdateHandlerCount() { + if(this.mUpdateHandlers == null) { + return 0; + } + return this.mUpdateHandlers.size(); + } @Override public void clearUpdateHandlers() { @@ -1041,6 +1049,14 @@ public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityMod } return this.mEntityModifiers.removeAll(pEntityModifierMatcher); } + + @Override + public int getEntityModifierCount() { + if(this.mEntityModifiers == null) { + return 0; + } + return this.mEntityModifiers.size(); + } @Override public void resetEntityModifiers() { diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index 279566a19..4ef8f47b5 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -346,11 +346,13 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou public void registerUpdateHandler(final IUpdateHandler pUpdateHandler); public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler); public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandlerMatcher); + public int getUpdateHandlerCount(); public void clearUpdateHandlers(); public void registerEntityModifier(final IEntityModifier pEntityModifier); public boolean unregisterEntityModifier(final IEntityModifier pEntityModifier); public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityModifierMatcher); + public int getEntityModifierCount(); public void resetEntityModifiers(); public void clearEntityModifiers(); diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index bb60ffd68..d1cbcff3d 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -454,6 +454,11 @@ public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityMod return this.mMenuItem.unregisterEntityModifiers(pEntityModifierMatcher); } + @Override + public int getEntityModifierCount() { + return this.mMenuItem.getEntityModifierCount(); + } + @Override public void clearEntityModifiers() { this.mMenuItem.clearEntityModifiers(); @@ -844,6 +849,11 @@ public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler) { return this.mMenuItem.unregisterUpdateHandler(pUpdateHandler); } + @Override + public int getUpdateHandlerCount() { + return this.mMenuItem.getUpdateHandlerCount(); + } + @Override public void clearUpdateHandlers() { this.mMenuItem.clearUpdateHandlers(); From e86d840b404b777a737fbf8e9ce6e162f89ee430 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 19 Jun 2012 16:11:16 -0700 Subject: [PATCH 090/252] Added badge_xlarge.png --- ext/img/badge_xlarge.png | Bin 0 -> 468146 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ext/img/badge_xlarge.png diff --git a/ext/img/badge_xlarge.png b/ext/img/badge_xlarge.png new file mode 100644 index 0000000000000000000000000000000000000000..733dd573a44f9c9a5f3287d4a2d3ad51386d9e4f GIT binary patch literal 468146 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�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%0AlmjOM=Hs#kU;G8n4-5rO!SrZu39(KP)cD?^qtod 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�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.Vu2A)tL0L%LBj_sTwE(9}a%?s2Cea!~^56lS#1 zSs*y9s{wKlR>aRt&`Iea=zF zB~dQzHT5~}PUfGkNh@>-cp0H&b+I>Wd7fe4fc;F0BV^%teFR5dLm+ZIA;UyATD;9O+yY3Sx2XXT{VOKu-!q zu6olAkk`|Gq`-PA5bfOk9{7)Y{kEN_<3isTimv3SZ85;V1_^FIr~?Cc72(YCA_>@? z@to${B%-QY!gM`^X;Fe6C<>fQBb|ai=z>1SZ+m3ygh|~_T=s?|UROwBDk%u3W)b}i zlXO|o;h+Oha^Q&um$L8Z^PW>pHJ5+^|J0Q5FwkK`Hs1#7Q5QG{@!U!e*2h8uZ>5Ga z-}{%@jty?FQu6*0$7R_&PfPwHO*@v-!&{^6*oas?korV<71zM#v3WgSg`p_#-?0cA zm!@EziBYi(7q&Kz8mqMqk!}I>tuvtK*+PNWeizG;S2qabCV?)Hv<(sgTuIvNWLTWk z6Etu+DPwgp%jKYuekrVQK3o+AGX6imIp#QE3Tp67PTC!C<3na61#Iv%DXb%TTVeqW zUkR)lVr?K6g${isGX1_1h=z)bU&A!pS>=)yX5{nV(Tlnw%!UemJNQI6ON5;pQudul z`!32k8W8yg_bKY@KkiT%P^2Z2`!l0f7e8^9SbvuqQLViVSmz-Zpx(!IcD9^e6dwFA zjG7STWo3{=mkCQD4hu;0?d8?!N+vr4B#f2s?LsE)Ifhi+O!L>TrCL2V{}oCEkX1 zk5z%piX%SXWN|x(r>*j6OXGkNP{0&Nc`+P)HU z^i4J+;Dz4kD6%DxUMBd`i(U2Qu2sbT+oUj0mq}t&0oQ5)B*c;dV;&bIf&_Z67NJc# zhSy#1G>tyb+dGma#et<3tY~%c{uZI*$K$~64c<5quboza{z@7{L3`PUDAnh{lv$+c znSnifyoc5qrRbAu?7Zam@8Up=W>|FoeQL*U7a2^#R&4t}Or`G#^C5~@qcHA5hU}Z= z9w1&00{|BAt^J{B~e>uBs#$!eXmsprhl6Y)J%t?wUHPe3xq`Y^4%ymg(6(p zSlJ*pcN%a3+m3p33|c3dtIMcfEbg$M38yG;GOIl-aW4}QJ_M{|rGy{eb?7!3Zo35w zd!w~7!`f5Seu27;I_W$W!KVP8RtKgICepsF8Nznzu4lyP@-|=Sx3N=@X6Q$r!b9kY z9`iU~Z{thNYyhW^f@|`~5eBL2;->+ozPVi&qxdh>7Q+kb>UOA2aFzA9=_iHR*RWQ> zjmfeNSa`GddG0gNO)$;*UDw=07&sPCo7kwzZkTPaMqgzP{)Y|LaDnM7fuL%KM7oEEgs-1&;DI9$k* zojJu9-9(m@`^4ve<#@3ss!e%nDYh?LhSrR%>iD;L51M13wht_q$DJuO8O-Q!^vk?lhH5#r6&;O=yCBksSO|) zi$(0infrvs3ZNM{DNI nrwUrDU)WWTwM#(My-TjU>O4*zn1 zvq2a9Knr7Hc+c+g|FYzY2Vj%D^$n zm|Bd(FCoN}VPSRx(5oaE{;i7gJ$X!BxwC8=&Q7|nIj=4yWI3LK0$V*|Kpx4wifi?i zfaQ+qoc9#5rnjfSh1@mFVQPNIvP=8q(!&~)5Z8?=xZys#hkVV#DZwnw`dh^=udHUR z9>)7q8~Azk;{myDU!k^!6%jW6!FO~Q?&OGF(HKxIbj3HU=F~-Dv{n+0=cry^Q5MyO z1d`v4Rus;M6v?jPFw3uj-lDl39YOgFUZg$0h)SME*KhOMBg-jrox|>8A}VCS*3Q&x zxWVBrcFdUT?OE*4N@)NkV)zbr$-rG}9DVe$-AAP`O*N`Pfyq-=s$(%D9$F)gwQ_vr zl5cN2X(y1H3_BRG3c^vXlCD!1?;~v3Do<6imbUL#KT2kSI9#;tuNKo2fEIKFvwLpT zLo$jbdYIQ=+@CdCXWH+IVit_|mCWabuDXSmfD-11_mGa3iXKTH1_mL|tDjX1~`%@=TP zPK&_l(|h%s7q5Ng9oTq=s{wGT)_x9Io3bQ~C+qR_=@vSPyV)@#W7^g9c6D3aDbRth z&2LEVms-ymo1eVd`**7*tdPkR}{U2yabU;oexG zt8ce9L*PJ4zyOTo3^RIxUu7A9>Z}ynOh32PgR*GG{JYEna3hxh6#G=MD_gL#;enzLsmGH`7QR7F;Ft;0HLx_dwD zWY?1^l~=m5M+nF98@y`!M4=U@O&<&pNuY3yr_}>TtQBc1rtTF{tc?MKq#477VVtq3 zxv_7+DH?MnV4+6iIrE*a0JNG6ulKquhp1;}-!urq{|qn?nP|DO*&Q^KT}Jg4R#~hh zVe=+N5B_m5*S#!uCETZ$?Vj(_A>8z}Cg)KC8Tmby?e4iC!)#!h?_0`C`*s`G-_dKa zF#ivDJ^v<5QxdEyv97;T3p3=ThFb^BoF}Qr#mrYrb!=j}=XwjH~aK;N9n z+2v)u(&}zQexDCCyQ6D4^T&E4@pwbh4}B;Hoc^)x6XPBNA9C{IPwoGub!G=}iUN}Ct09}2mvO*_&`P>z?-aP6^alPU=G75 zxZ`O%+&9WihBvjx&m4S)|5+-v;@bo-)N5V%O6i@9y{JF?<;3%lFJ@$Pvu^xqjJ?3f+W^H1Zsm^<#N^f=t0S{5fbK*s_h%^i)NJ7=WR4Cn9SjeabDl)t%5a{s12 zAxS+?&D-4f^02euynpz!=3fNIoje@}0jmXYg=36czkn}RDin~@Ll`>CK+(R!hT)V- z&2%v95_<3`Ih5r5IoFR4G+b)`c_h|ul-B>TD$?c?Zrg81__+rIz_swxS4=L?V0YW; zSBP_u2uCoZ$#;XFof))m1S3&*t|@;?JW%K%;QGrME;|&ZO+DKb^6$##CEI-*`m6u_ z{+xzO?=zV(%%!?0nH{?Q)btz!#sVd{n#-;VXU_we8Co44MT=v2s;}%5#4+A3Uf}6h z?C2;p>dNEv7N_3l8;3bTR>0CU&ic%2P)Y=(!|ErV%cAh@EKYC2Uxww!`g5z&-2Mea z23Fo`?O?nTTH{zA-!C8Zg^Wht^_+BjCi^t};c@(BJ*N^lG-M}mAUpo!)l!&v66_JE z6GpFKJtk*L5#l4U3hSdI+D5nQXv~z{t;&U(ViRe`jdKCPvmTj&3<^9n19^}}eWFa4cNLz|eblV12 z?!6jH5}6qI&5T>L65xKT=^PN-rhv_%np@3326JIH>#H0(T)vV_pg!S zUtH_nC(jFKZsGiLm_zSmQY@;~t@U$b*>O1KpPxw0ENQ($3n06_NG@A8{?_+@IpKc< zrO-}o*vZaUVRfW`k^ddR`5lL-HN{C2iP=Myz|5JFBM%wM!GYryTAqaWq#ij+UVTR* zsH9UD*gbgX&wCT|fRC*-1enM{|KSH9#Xhn34;T_K+AB5#rdAIc5EZn)H@REh+$cBX zFh4JjGx~OqIzL4Gjm+xZs4e)$29(dcY-wL?p8dCW98uw`a_&KyP zsh+oDKH6bX?M$(91%l&vR{!7etm#s%-mu~s;&7?+II>%e>lu6kC<0cBUvP%wZJ=1v zO;P~W@3i=dbWGyf6T^3YpaN!bv-DB#%C;*rOV+!u?~Cgt^765Jz0f;m{df6rLSu52 z0<3SrrsG3yJ5>~_E#D3qCc~D12^`V$3N&H2sIB5qy4MnE&nsWyw$V?aE%zXq%Df1E z&t2r$cW!wZ00_EYo*n(=+LZ}~;^5lY4G(Oe;e`AFz`(tN8~n^6XEXAEb<~*9lTwkSwdys6LYg7;4gC zKN@2kn1Nf-B~%mOlxFX>X4s875*LIm1$i|A7|U5|$alY=Bv_kKW#t6&`d!>1;GD5D z0u)4S@h~dsat~Gd#E@$VcH<=1JyoTy0+*3xHb|m`BYxFM@XBZqyYQM%-lS` zt58@nM=Hz=dJOc%D7oHdh^(TYBcE>SNd3U1{*m<8Z0dEEPrsCK53=zi(c4%VWSZaH z>=>{@F*7T|ZDbk^8t2E}T;=6Q=nH0>0JKfh*gpn2Clu-a8OvShzQ3gJam(ETtuoMn zakI5+yDW)71q|dC-ofLZj=LTHu!&)75t+K~0Kps|K~1WtF6M1pdd87R4g=AcNp7Y9 zI+6k+g0<>xAX)^4S=}Q7;iFKN9bC>?esi05ZCmoQpiC)F0#D_>_CI1;<9#m8;k-Kc zJiB!T((==vkogyYa^jZK%O!?#?^pXzX^S{^hW zh9=MUBOtj7HS!N}f6d1Y6`JJjSpTEsKb5efL6 zK9*;4qiFXl$feiC^-A?Z~Nra2T)Pq(ScK=y|q_xfQNjU2(p9}nc)GwP_EgE zsc!rx>Cbf-DHZsnCkv)1H~>1N^v-uqnw3XXs$pFd&4R5>BMT)Bmlh3#vh9~Y^Gt+b zWR0@kSa!+nG9YhRQ@$Abcd3(4`b(6FEJuR$a8#?&S5W_+u+6@9&=;%(8#lBlZePrc z(o|>Ps`yg?Y<;D^)vNPPINnkfhZ}tLA@DL_E2z&2XJ@gkyAO_1(^~d23GB2cFe>U{ zJdKTOv|VY{GZ5yt*}3ZQv-zx$mN)#7k?4`NM>kEsiw}N=T8vCW%jIF2_HJfFCrDp&I#Z z0B`PG5zT%%+C1Gq3|5aYXpE2cHO}WtiL!O`ekiGr`!I~px*!q&N6{wzB%!Ys@XP^E zj?$h9kSFgLBbo#f@p)GPA@LYD@$bVIa%Ks!47sv_jZgVb9KLcliZPW$^3}Hj!f&Ys zu*Cf?oTYYXwMJfaVFXLDZoPHGg3?NS;|R7tX{oFrOuRWT*ao#ZcKL@gPWVQ zdC3VNMnHrS({xtGv;j@NMzDH;NU0fO6+oCwa4IH3Y$3@{Thpgsy;pJLb5rD5 zqZ_ui8e0rH^J02wGZ!8DjWy!xCP59!Roha^GIVr@+;A_TLBEaGM)N|qj{1tJ3|yHX zIMJPWfuwa&?Yq2PQIt5rTf`}>*JnE@oiPW$!qJ1f=ksn>c5?6z6I8w4aUfXLzRFggX+u~7Zh9avLIV%wq-{}$0-|F9Se?jaMwrnRd4Uci@m@$n@TOuh`Aud+1y>GU z^SoSH&t!Y`1{C5}<7fCfnF(7kiWG=?;i)yB7u0RBkQbAAWj7Y$4ctC$|KqtT)K=Ib}hjBh4kY%aB zNkw>1ke3B)DcI=&taBJt6fdlJcF#jtf1Ut-7I>Y4zAFHBv+pO)@f$SgpPF*t;M zgFDc229Op~eA40?d*wD-*>DtT7|YEB+Hj^UXBqqfDBvfCNa{?_ieYr{Yt>B7(S@L9 zi=r7Ez>EHCUtPZTZj7X<$AejYe&(zVr795)E5JtP$AO{3exDuxbfl+UxhQ14E8&Nw zouJ$0Ly%;hD4nG5wiA6{)vfB~GoAE`0vF@Hb0Nsa`K21QTsuC{-1{=*%9*Xt z%>cC<6S7SRhQV&OF86qN^0$V6EHbrrS#R^ni{2+^W%}OxZ<+y(_yTeczRq$#oHH?j zqumUeT@5OmOa2`8on$097qe<|2)L@Lv~2)lq9#2`<999Q5$HJcT}!A+ArbCdbxv=$ z_7~Uc>&f#mWG~zc1v|d85?7x=x?E6RxQc8BsT6Fe_?gmkS(1|rTgMO)Yff>Ia%g|` z7B^a|TqwWyZVgO!&Fup2;8S2x#gqhWHyC|6AaF7T2C=3gkqXW9htk>t+1-4s)XEXP zRiyiH$v6DmXke(#KtD0Jm(`^-3vNb8{H0*mEuCH{w8uu^3X_22|Ljcn>i+kiiTcvf zEc(%Afy8@xS8*@t7ZpBKXOMSJ4Kh4?*E$^#VrCv?adrQ z)D*2*$WV5uvwSL=`^)~@IZ|$7VmB@sseF47N%ky2D}U&r9_Jh1km5iC2e?U&uMUq_xh4IeCkwC;jrG#$MH$4Ds-pezyk<-*G*8ZF5hlNmIhMopTmV> z&{J^3S2QeO(|@WT!v5+_yH^@FX5^mlobJ!9s&;*DP}+DY*im|vlVRU?esn$)R0+Yj zZ-n=tzZ!^nCGcpxMD~xb1tN>lFCoCxb*g^}p`N(J6yR}TLgC+To$8=UZJ)_o-inh- z_MrF>LKtILdVL5fncSjlU9G*$(NGWrLVXtl)oQFU(OWnp%)ZMlN(R2-Y5B8a+!=4q zty9N%TrXU3KKOs>tx$Es8E>xz%vFvwzq_12>mxh3=43P#`roO?Z1zRSg{J}O?s*2M z?*SC_-Kt!My!*x$572*$`0F5`Z}*^ZFaqK$VkrCZnLGfKs$@nFMDCZ?KIeJUf|RdA zem~YGUl7<+gE^zo*xCHCs@#@WT;cpYuM$4mpW!rczHYvR=A;9pUAS7krRPUIamX+8 zmZpgiT=AWS(C?Ml1^qG+a02Qg$Ql!(0b5d>c&UM^32WuwT33RCqVC3KtU*^zarmRg^kYw4N z#d(`J7DcK}2pdaQ%orH)Z^$B)Onb6d3e9 zF&ovhRY2PX?-K{N18lk|d6cb#8I1u( zsMi!V;<6}(1vtvY+d62R2eYdcyuRrt2gHl>>Uc!R-fHK}oE#9p<)!^gx^( zAJ5G3c5_;sKsp!4i zJsZ?7>gKG)pG;Sm!uaTt=bRr*0PFiU(RN!zu^#Qy3)!RX!<llv1`MR&!Nupaa~OHubD zP3*qF@tPUe`Gtcif@?FnDv1(n?bY`eWN+Bh@n0g6#Cqv=b}_gaYc5P^mIM|D=?Xjm z>ZF4_;<)>X5+UGUrHD?1r7pFT3`Rp*1tGIDFXJzj zgFw7s284p9)As!XSl-9%EmzL$Ys_$Zp1sA4wUDvgI<}3k_C2h!V>Z;=en1uKRH>#P zu>s_XFAzEF{TvM#C4M(jKx|<7AVH>d|NfdSn2$KiP^0)&8?jY=ouFP(Z3p9LpuxEPx@zBI`U=G;3L)&B<=@_~*@!HO8BYUOr=ITY?V z81MzR>V^&1`HSmlt>ZLO$&3d#E53#^0pqMq#}^ax6LT#^f0=x$Pc=sXGwbQD4E`e> z(USkOYufz~bP>~zsY-nasJ)o3B-VMT_hx`Dq+PX@TrUop2Rh@`a2nge?7mW|0A!kp z7k#a3n9o_(7kbd?GkF0kAs27QXebrVPUh~0IaAwpyI(;*lM+jE+LBYMaUV6}bJfnA zzjDSFoH5$?6^Bo)%dO{p9Ax(92{AG-4qNvACryspaRm4<;!KUzM4`K3U0nN5^bXxA zDkBh|c}*c5mMny6cjLXsu&S;twQfY;2wIwxNLEmL<7Z6~{OJo;wHPo8uhA-G=6X>f zl@+Y~Khq$@6@R8Hq*gphF)!g!D90n9abuP+B5FB*<)yvkx;w3%yYQ2Aeu(;f&+4n!fH+o{5~YfYT^Tk-n|k5t?XSJn=qR@b!?g zV9o6+G0ovfSw$6UR)S@>9cf8w*~0U2(uiH~66fs(4jJD~m1XuGzSE6d6vXxZi?XHe zU0G%k>cd2U8>ROG&h~J#7kI&Akyo->X3R~^Ai4X92Eo8IXL3->>5JRfo^OeE(pfiH zTz*7>C(WNtfg%F6z%w;RAF7tX&Cj&vj15QvKcPsu8styim~ImLK?Ngo&~HPV0vzvT z0aLT=l7ngugtIS13Bfw80M2H#n#~Pid-?^K)<>w6lgiEA%NI~l)$qh@fr2-UWM+x&;4m;q|&9`q{QhUZdd zr8z65i$kVSann$c>DLJD-RTKDlzHW};O;XhZG!8bnUs0=IJP@u*IhslmUSb)7c2-1 z2=Ep{zTHNr6Xr{0*qsYkfn&Yl$^H8d3q9*HOk(S^nY#7rAGrq{>NKu>ja}yFKUAa9<%0xq!zV)h)DK0X5iu!Hq)Jl$J~VcbG<9T zuEgGrP`9%znB{{%q8Et6ayzf-^uL6ZZ>wVN*7a{mzts8=<}0x&2-3bRX}$G&1yc=lB#Bmf{~wCnKYm1 z`dENi_m}-%UyvC6VDm*qayP47gh{z1aPkEq<6bSx{@-tXOrYY}y!QYv-=-F}Mx|K5VB zk=B3!)GYALMFQVk$)m(JYW=G^Zkrz0y}GJvHBV}6`wHTZ#cE}3dF^RRlP_SS4Zsk? zn^g)JQZSZ9Bi2?VML$@lAWa`!j@m~~osS3{R~{Mv(BqoBu^AFt0y!xN)I$7zfh5pG zfQ}N_!`-?ip_4uvAfdXRH>x*1ZSV)*b04R5?4T zlgsgcbdUMhJii~Mddq}yfv402X&U`1K|nJUARgU=20NtFb%9NBi6WG}d`e#s;;0Lp z(>dafN!jPU5s)PC+)Nj;zPuoGs2Jbu(6S#<$FLt}znApdzoxqHftQl9krQ_#$ydC| z8y<$q0*lVO=%~){t9Q|oxR1Qq4)52bFkC)Gh6M{>TXThM^7={D-{bjm^dOULv9mhpq`c-tybV*+Me;^bSmwg6iZ+1(?%hUGBf9e?M;} zk5@p-cU962%Y{IlfDC;$Snson4+D0~JYQI@8(s%`ykGc}@$oulkp$e=BIgC~croO* zUtGy5n3*>l%zkt4cKKhmZe*9C6tS6i|Kp}L_%Ja65^C~>DBBSGL9Dk>Jli)SwhejH zoPk`@i{)Utuk%(}8UJb$_N}n;8N!7wiy;L@S>PdGFr2sCCr2=w*JY;OTEES;>%F;( z%dxU8Zd06H#ARgj!^q4ejt$|P{!0(&OOFXf5D;|Ex?rdWa8DMngGZsk%3WafonX3Z zTe_A@FECPL-0`9>bcC~m1mp#vX0)gN_Nw^re%^A1KZ^Dv#RIq@*bO#ETExYMOu#qD z&RGR&2u6}yQqwmr!M-il(1tW;Q43#>MJa<_Ncpu~cHNHqxK_@iC9ZK*wO ze(PIE^6D1A&Zjgj>qyFZhbf9@)}2T<=(;XBTUq9#z!zdtFVb9h%#=nR7Kp+e8?oE) zGLHqL=R_&TbrXN~SS{yeo;c%b(2v~v1$S~v__6>G{}~L?-6mO0cVv((#Irc z*xdi`l5Fr0qQK3c7?{oI0p+^0sK87YL%sp^PQvj3-YQ3&CSPm%0Lnq?{nhc?fja?7 zT&f4n>Ig$MLa<=XViCXGfcz_-aubV7`w{N|YyZuE@HSDIew(fb6H>t?d``z5PH^eQ zhI=<7P2jkcJu35vYtd2ZdzJ`d986g^UB4fsR`#u{fFb{X-M#rglyCGne2=jVNh5?( z#!{BD6GP2NNC{e>LP=`$wQs- zTwTRFVZ-^KgMY>=`@NxRJ_GuYs}vLMAvIFss(xLwdD9x%yvJkyOAYg#G#(?rfV>q! zhqyadkXg5xrbqgzm=E|%bcK9=lijQ3t>G0zj_KTYnL7WBife46Lh5%jDoWEgysWgn zFf2y6VE80F8^FMRMUltI=kRI8sFVcmbhw?U%Vx6M}jHK zNS1oR&UOni{J`dz@8iz&we>njh}SiI=|(cvD7KK z2_*LoN0AxyG6J;bLJ6-TC?GdWN1;fvFmZ}U9`sP67%Y^8#gD%Rvb5$kRe34_)QZKu z7-p6EhD3?61ISS?4b?ebbaA7fBt93!__%k+m0stH$}!R)>u+&93`J#uj%mHypipt7 zwT2V{I`52ze#db>yl7`TQ=UJ5iaPyW8hG;0UkxzybFa8_tID<-?{YTc^`4VVwCEnV zHW!bPnL{E#`9F~|c1rD57+v4{gJkN6WbP0w<@d+taySjqSW$jW;}dWTBZFF(jjhSv z+>Y>KRUbJG-+LcjZ*dZks;N?9CrE6to4ds336}Suw(<2b@U8$K)bs#xY{tVJSHAWZ zf`U%*zLeSg>$(8+8U*RuWuawpE`bZr?jdZxx1l_r?2Pia9Uqt{ zl&-RE;MvDXcRm?ixMewFt?DI81?=A0fVnajBr>kuR#54r`(S(%2-HmQEaa{StA1dX z$}y~FeCrd-N2V=RVy}?GwhJ@p{;RFeS>|0--3B2aRTD#4=KY~0#*s#ip=@0k%8|2S zv>SS4x9d?-`t;RLVVIq6rl1Ou5BeC1$SU%4CWjL>d0u{gjx}o;VN4ht=kRa1gsAFL z^+frq3M7?00scs0WGl@vWNB;&(?c2T;#>K0>CWu+bcWPk!yXS+=}tG!pvb|vtQEv% z+ojyMK?YP^>mVn*r}8qXJD?|pp?mH_-)`;pr&J4f1wlqv7JYY<*OiYXlk0rH91~ej zrl6!0HV#l1=B-4w_z66M`&U2@5kmGaOF5!aofu^qq%`-f)~%X2?10`SazOKc5#$K9 zs(=UNa1C)JS)V}G{Vn!~8?mFP$4RNOCFFhbg?==8PyT%|-h71XFUBh}uFs+w?~)i2 zs4p{x0 zEl8Mi5G8#3h}UN&$w-ZE>^J(54B7X3!#Xy6nNT5(F{X7A?dLDKp`eezehvZxq*d&E ziCVvy-b~LoiBzuxn>ofXXVdz;a(;f?=lOD^*p@WIZ!GlT=uFHG4!idGM-d9UIPzoS zs7LmWA-8q&E&Rsy@18+|{8`WUOhddX&~4uV+Ftg?bCIUspT2Y(hzph?Yn|M@-O7Ed zY7LvXQDK}c?-421ORdEsGCGVdg~gR(%~raH2KKFXS7!<{oI6ryD3!Y)R_p^6zl&YR z^<;C3F=jPWg5>ni!o(MDKR(mG@%JZ)Dmr`yotH!MSu`7ee%}Q?$fX1*f1iO1 zSi-YG{ARuu3JTtXsB#h35iZu?hnj$IcNg&O8k%wQ&TJiaFWfd$emY`>{2-P3Wm$Z( zCJ+*Ut# zzMvs??DpkSvZj~8>#2G~kGkzxfb-;f{{9v{A9u?8)_dgCl%nGZG6g7_-P@taL?l^< zJ9yU4_jy%OO0nk@{;uRD*>|{}kTsn7J%k?6_47m)Z7P7F5+%Bf&<2f_C__B!A&kJ} z_;7k9R%(TiJXi7{Vs`Cu;%Q1*llAYlrxgnD(;8ACoa}^rga7Usll#{@t=4+@JbU3w zjJste#&LUfl~rQ|p)0i@F>M}*!HU!A42_EysI_+d)C7-)9q*xC%OH8*F5veRnhPeV zfwK4o8}|y9>Q2~<50>;4T0yK`3DUP6;rUNw?eJW{{P2N6j~%`WaOABA&H}_b3hA@O zW;Oe*4;YD@wK(RJtd)XZ{;2dyi~Q=Gzc0>#;y){Wq_D>`$)@UYg-FEM0Y3t$C1E8S zWDzGkH8xB9XBZM7W%c2jr|9^Ry;mZU3@3(EJ7%oAtu*2%fsF7_2Fh>1^>nIrvOKckp%h2%#3gbBCZ2Kg+XX)B5F~m8bjw9Z`UWmI`v~>{ZeF|8fClMd)M-OG=RG zV?h|xG`yzvYx8=-Fa~7h9xUSof&F&7yG#i)6@L)X4IQ8Mo*ur+ z8TzAd52@)KBJ<_2Rm*NUxx@M|RdE?onAgv0vG*bon@_wy6Qtum^`F*xTJswYIM=Be z?7H|Q@b7N|=5BDb#F2S@3gN=f-V>f@lKA@5jFIOAnX+FDnpu8!N)Hb#C-%%t`$vML zmu^jFN8=ZJHB1mMFIQL$>yYin_?($llV(Q^|9o4Rn#M6UsLU>8O?Tm+q3uc4S@V> zEC29GMAG7;Q!@ATC3BV8jww5K|8l8;tM3eC^cxtKu2ExxU2>Pey-jL>ipFT)(CD*r z_m)$-V>s`O@N;A;fjkA4(MPuWL>?;;?FQLhfd-MB9ih3NeMjU5ki(grJ6O(rvO_1& zLd%-Ib+BZu^I*`c1S@edO9v@5p&nR!ZtRdN7f3rH-e3!E1N9A?$!@3UCC*wYyv>Gt zJ1f)FT)7)z=bSO8(k6_4?$bcv0C%r-ZPtv#{#pYEx#B{qY2N{;(_(y@S4-G#`<@S# zv}RkxIYDZ~gVZf?M)ZSab%B3zIq#@)zKI#(;r9MS{S=>g^3kGrcMb-XNL2-%8uZz2kkU7{?1g({|I{`Cq1@8$-$? zZuD!?rV=FuT(`ekcVS*n~Nt#ysU7<;)ahaX~G$CtPB z23+at+d(noJ{-^+(1RdX42pf1EQh0V2v;tVOrNGWgT{wh<`Xyjdg9J)b&BWp+D121 zv#c2MwqZBX4~g2yQZ)$W3O0sX%Av|gg)3`xYCt>tHT8q^-|>Afu@ykjw@aVMe8E$sKRybH9_I4RvyZ=HZxmBjlSWh z{JT4o-g0jkFr^%9T^luv0S^?5M&F5|eAT47B)e%Nm)kAcK564?T#ubpxf^#dE00qx zzU55aV{BmQnCMv%A~4+3|QQW{Q|stA~~vWrH~ zFZCxFlC1V+(YfXnR$139WWyC7iq_9xe@)re^9;@8po+pV`MR|qL{OW6l&7RlDYp34&^{=2tWw#*4ZX%J-e&9$yM?XH={ z#vz>AiFKxLc4A(iGI{WnqDJh^uAWyg^54#F601N(#pje*_njWLP(!G+(MpW-tr%}_ z5lYqd|8u>54w?Dt5L=$P7;jMAR^ClAkgD=A`#a#m>RP@Ta^ViO?=GqIn0neWiv?K) zZo`QfT+ zX6@(%Ht&bUNq=)E(&fI++f>tCuqketz~dCofJ?>U(1DcDMgYx3n&SbK>6^9^`%a`P zj4#_iW$ zQ*Ce?{7Z8KDo@0K($Voaf4BG_Aqpsi{JWj0kiR+VrPg5P?Igbjn-I!)smg=Wps>f~ zC`!%|0Vk?OUhAIwrRFPZtl zTa@)jr45bwW|dC;*&H4@FcV+s6^=YJ@NB~f434qht_ zTYo~7y=pnLL`#eq@erc?AtFFVmEAlmvBB%^KZL1?iy>sk?k~ofDs|sXKn%bJ?&X6@_@1O{WFn#h5K^SD5+(pfAoIhV|1G1N@ z`15(9#?*{C!dBQB#j|r7m36_$0xWNh@s$UR`}T+#A%o@{h9ki!?c) zjuH_JQK`f4yO#5&Uj#MI<@Q>@avtN2=ugwNxqO}oDNs$=Y!{Tt*t@+@H$JgIE3jQ` zVf>R6*bV1>ZNsm>(4iuNDzbWPGTL|a9+ds_$(teEU3`qE#V6>-g&Y-QujIEDKY;LY z9OI9bUhW1yYfa#@j?MQ~`-nGU<#|Tk+PI*#cU7au5!d`dab^C+9rz6Ksw`5@YGrAx z6JJzL?6Lloa>R$2q$Y!&y3tJ!OHnh~s{>v(AFL_6L1nMnn1vGXA<@hhN+v&Pu`fO+ z#P)7UiGJa7*b+qmDy6A5GGt+P>@%e3wYu1ri#65jvr3TxfNJw=Exm;{;MUIAI)YHq7fTF%(TjhAM` zkH@01$$BMPYejAr?w3sh8FrcL_HJbZCl-9CYp$?xg?3`+o1vsmg+>Wh4OJK>E7YvP zR8MqnHOHJG*)IM69(luv+K*gL`K0Zu2rj%wonJQRL}%cTVm0k=Pi&JNwIMWc%9^Tz z<)usgRkoS&4XbbgSvf)1TNwX)dhLzVqoKM2p2DyUasAAEx2D}YI1I)HF7ZX>N1GP7 zZS5`?EOuy#6(GbFQqntihtY9FFCms5MjO{0rKS#)q4aHyP|(0TfNW!dOek#Knn)0=C18(G>}W)#fmJSJ z<>C5^Z9x-dKzamT9Z(;fJ_ph_Le6fmw@}`V?S%?y0L|z7USn7dBwR*CjqkM?XL?LK zJd^qI7z2G@Wa9nIyRM9%%#AqDv68x08U+yzIkS5&cny+HqO*U;r;IHg7gE`#h_iZQ zF+qu=&%U80;s^0m((?P$g>Y)RY=UT-~r7nEo~kF=DK z);A-l2IA+5jQX;cyJR_yoEVPuOV&SJ4Iun4aosr2E8nEZ_)^-_LefR!H&rC!Bjq%v z9947`38_AW=eQ8Q4UxVS(KSENqc@%slCYBxVKHRQc)_Ss^&4|YPGXe5(^>vmM>YLY zp-BIF`<1J%$a3GA@_CQWK}YT+Mj5$Z5+Xkr1~YZ0UlzxVD>1H8=JB&ca?G1vKEz|! zPA%=d`n1kdXUHh=SlKh88ZmbmSp+TyZK;k?f)IDyf`+$p8{W#fUU?3?SoNwFExDi9 z3hYp)?S&4yx}tYt_4HI}KbfX61axlw#UqPY>7~AveLFufVzgqAOug|C#uisz1_J6l z3WL}ANhKdz%R(IELy7jck>@geg+Ew+Ox0mff->UW9bEvTOA(j08f0eEMBK+R3}a{L0}e3^`$NW^BwypUD$?+JcpCG|dt_wYA{~`_j-+MN`!ckyR@TDF#IKNW==us+7|B4=d-EGAkQ4Jy!6a_Io&b zfmEGh-#5qfZhZJL*kT$u`GT>a zl@pWeF}Nap+r#s8ky+kL2~}A=vFtIS!_t+g$*x=BMy?&hkhJ-Z2Ym5#`@+=?&AUv`b+qRUvJ<00psA=>o(*(ssq}Ir+VqGqVZ^tF-Al2*MOaTuH z;3@7nJWa<5?$Zt(dFUAzbMKdS*<$E}xqlcPHh=h&PW_sbS>qSE{dYuMaQ?sgEgKgH zRGUV^M=!8`!C&Y+_1d7Sg)V(*0u@Ayx;Yq;^YIq9VP2{dl`Um@(!4J^o!p43gr%;KC`6x%9^iJuly_4cih{yomjTe zd8_>@h1sW8?$$~Dud@Ce!`Joa8P=CZFn!JNB-TT|K_!I6y3}%l6voN6q>65+irXDP znUk($Y-(Nv`fb{UralFzhR{!1s`(m;?9egI~tFUg=j@DqyY} ze_oGHD+o5gt=W5$YReyfApR`os+kpan=DZ9{<2TQz@q5}+ z?mjI?PFh_g$NW7hHTA+$e;`TG--d5|Z}Qz?MSE{=-adF% zh0LkQW5LYtyWlN%!txIi*fB!{UjyzM8uv!;bpE;uU%Is(EvqcWza&3au&v2{QfN(X z$TfDmA`fFPm0E7zzXgJ76u_tY>7qe9&krs=)=2-ay2W!U(#&|(;>od41HVm`z8ulA(H z)cg?GX@Z<<&*C${_yCSl`CuH$=gf20mBB|_aB`W?ksU{WgM32VG zA(`dlFvptVfXS~p$w0rhYy_)^9Ij`k^k*v$FPje*R~#KQjZ}2aU5KX(6&F*_VrF@6wXJh>U+(DAq z=inlGO^sswEXC8FE0Tm_QOq_aZ(3(T7gb58Vycdf-x7FRPzUi1;5qSDdBSL{-d_2j z?#hN|#53Om`@)%(7!7c9WZ?7fg3k{E0`Jg;WqZ7g+q+tdi;?pabgDI$$KR%Op%!;! zfgy5-(eTFN5^5a*kx#$?t~#=78%KU_-zg61rsiz1LbsuuW3DTS=B|^eEk;He#Zx+_ zZGb1P`gklk##Tu}&@zji7Rsi<%lMfOT2@URROIQ6p&3iYs2uf4o~+iOs!fpIm%xKh zvj`>RGJF$aDk|%7JMSz%bRDAUI(Sdu=Ci3sFEvXRF-G^X;A##7s8c!>?P-4u@r|H3 zsioyjS+y%St4JEz`rdWo?^q$Tj1!PX)h^b~1;cMxTr$%(ktNw ze7qbCkFzIWcvy0ZaOAt01FrY^;hE&c{6c(%i({nA6otNx{t!qCgC;3>usRFS7iCGi z`$xNaHTG`XmXgDk;-pivUO%nVNrp!H& zL{fxE&drQxu0ek?K4rV+FW;gI%^#-8!82#Fh{7T5Jk0ioc8N0mIl?T1JRZLJY4OL=l1cw#vBQZ$*-?K3 zgcf_}_&){#o=jmaxv%Rq|GWHUNJsBP6HEK`w2k@tXo6rkO`W{O32)5}=5G*(yE2zu zM+#JKDeo}44?pVFG*xDI)>?P?Vez#<+y#IUeF+#QWTb#FGT+Tn-X1%VAMjSl=OD9N zWs@SFnP2Qqx^xJPs|tcC2MQAq0pmy~ekz4d`#7|FmoIb%{*)nYfrsetVojAU@C=zh zZim6C-J~oZkKf~9o#dD4OwyBrhnTTuX_Qdr4!~Aqok$iicg&HXRtqiwC@rMJE2x@S zV*5>fE>kM-6&D?&UQDWh=r(W1L#N(_rm>f7TzOE}yN_*8u~dTdXzVug;U17bW3e;GdhUJIwl( zn|1x*U&)C79SpIShW{$255t1>^Z%EjyX5U?5QMmM)bNls*x3Iu`~JUfugg5oj`(~W SiLqyq{81xw!+eADxBnmZKd*=Y literal 0 HcmV?d00001 From 1eafcd892a278324864eaa0edc24198b8ec68af1 Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Thu, 12 Jul 2012 00:56:55 +0200 Subject: [PATCH 091/252] Fix broken getSceneCenterCoordinates(final float pReuse) Returned left-bottom instead of a center point of an Entity. --- src/org/andengine/entity/Entity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index f23ca46d5..5c2eb39f3 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1080,7 +1080,7 @@ public float[] getSceneCenterCoordinates() { @Override public float[] getSceneCenterCoordinates(final float[] pReuse) { - return this.convertLocalCoordinatesToSceneCoordinates(0, 0, pReuse); + return this.convertLocalCoordinatesToSceneCoordinates(this.mWidth * 0.5f, this.mHeight * 0.5f, pReuse); } @Override From 61c269c865294ad8c4ae0b1aa81ac04c8bae110e Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Fri, 13 Jul 2012 22:18:26 +0200 Subject: [PATCH 092/252] Added warning log in case NPOT ETC1 texture is used This can save some debugging effort to folks happily assuming "if it works for me, it will work for others". --- .../opengl/texture/compressed/etc1/ETC1Texture.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java index 99b1b0b39..7c8112c6f 100644 --- a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java +++ b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java @@ -5,6 +5,7 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; +import org.andengine.BuildConfig; import org.andengine.opengl.texture.ITextureStateListener; import org.andengine.opengl.texture.PixelFormat; import org.andengine.opengl.texture.Texture; @@ -12,10 +13,12 @@ import org.andengine.opengl.texture.TextureOptions; import org.andengine.opengl.util.GLState; import org.andengine.util.StreamUtils; +import org.andengine.util.math.MathUtils; import android.opengl.ETC1; import android.opengl.ETC1Util; import android.opengl.GLES20; +import android.util.Log; /** * TODO if(!SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.FROYO)) --> Meaningful Exception! @@ -61,6 +64,11 @@ public ETC1Texture(final TextureManager pTextureManager, final TextureOptions pT inputStream = this.getInputStream(); this.mETC1TextureHeader = new ETC1TextureHeader(StreamUtils.streamToBytes(inputStream, ETC1.ETC_PKM_HEADER_SIZE)); + + if (BuildConfig.DEBUG && + (!MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mHeight) || !MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mWidth))) { + Log.w(getClass().getSimpleName(), "ETC1 texturese with NPOT sizes can lead to crash on PowerVR GPUs- you have been warned!"); + } } finally { StreamUtils.close(inputStream); } From 7e66096dc8668ccd3e4bef0340013c3449a40feb Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 13 Jul 2012 15:09:57 -0700 Subject: [PATCH 093/252] Minor changes. --- .../opengl/texture/compressed/etc1/ETC1Texture.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java index 7c8112c6f..ad1434520 100644 --- a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java +++ b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java @@ -65,9 +65,10 @@ public ETC1Texture(final TextureManager pTextureManager, final TextureOptions pT this.mETC1TextureHeader = new ETC1TextureHeader(StreamUtils.streamToBytes(inputStream, ETC1.ETC_PKM_HEADER_SIZE)); - if (BuildConfig.DEBUG && - (!MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mHeight) || !MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mWidth))) { - Log.w(getClass().getSimpleName(), "ETC1 texturese with NPOT sizes can lead to crash on PowerVR GPUs- you have been warned!"); + if(BuildConfig.DEBUG) { + if(!(MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mWidth) && MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mHeight))) { + Log.w(this.getClass().getSimpleName(), "ETC1 textures with NPOT sizes can lead to crash on PowerVR GPUs - you have been warned!"); + } } } finally { StreamUtils.close(inputStream); From 92afc764cb1c6c375cfd89c9570489b4f6510e97 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 13 Jul 2012 15:11:57 -0700 Subject: [PATCH 094/252] Using Debug instead of Log. --- .../andengine/opengl/texture/compressed/etc1/ETC1Texture.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java index ad1434520..7ca52f4ac 100644 --- a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java +++ b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java @@ -12,13 +12,13 @@ import org.andengine.opengl.texture.TextureManager; import org.andengine.opengl.texture.TextureOptions; import org.andengine.opengl.util.GLState; +import org.andengine.util.debug.Debug; import org.andengine.util.StreamUtils; import org.andengine.util.math.MathUtils; import android.opengl.ETC1; import android.opengl.ETC1Util; import android.opengl.GLES20; -import android.util.Log; /** * TODO if(!SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.FROYO)) --> Meaningful Exception! @@ -67,7 +67,7 @@ public ETC1Texture(final TextureManager pTextureManager, final TextureOptions pT if(BuildConfig.DEBUG) { if(!(MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mWidth) && MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mHeight))) { - Log.w(this.getClass().getSimpleName(), "ETC1 textures with NPOT sizes can lead to crash on PowerVR GPUs - you have been warned!"); + Debug.w("ETC1 textures with NPOT sizes can cause a crash on PowerVR GPUs!"); } } } finally { From c13b76d032125f2a5b3275cac9ed8c624dc6d24f Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Tue, 23 Oct 2012 22:38:18 +0200 Subject: [PATCH 095/252] Add support for ETC1 textures This is implemented in TP but does not work for AE yet- I am trying to sort it out. --- .../util/texturepack/TexturePackParser.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/org/andengine/util/texturepack/TexturePackParser.java b/src/org/andengine/util/texturepack/TexturePackParser.java index bfb105264..3f42ca6de 100644 --- a/src/org/andengine/util/texturepack/TexturePackParser.java +++ b/src/org/andengine/util/texturepack/TexturePackParser.java @@ -11,6 +11,7 @@ import org.andengine.opengl.texture.TextureOptions; import org.andengine.opengl.texture.bitmap.BitmapTexture; import org.andengine.opengl.texture.bitmap.BitmapTextureFormat; +import org.andengine.opengl.texture.compressed.etc1.ETC1Texture; import org.andengine.opengl.texture.compressed.pvr.PVRCCZTexture; import org.andengine.opengl.texture.compressed.pvr.PVRGZTexture; import org.andengine.opengl.texture.compressed.pvr.PVRTexture; @@ -63,6 +64,7 @@ public class TexturePackParser extends DefaultHandler { private static final String TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVRGZ = "pvrgz"; private static final String TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVR = "pvr"; private static final String TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_BITMAP = "bitmap"; + private static final String TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_ETC1 = "etc1"; private static final String TAG_TEXTURE_ATTRIBUTE_PIXELFORMAT = "pixelformat"; private static final String TAG_TEXTUREREGION = "textureregion"; @@ -210,6 +212,17 @@ protected InputStream onGetInputStream() throws IOException { } catch (final IOException e) { throw new TexturePackParseException(e); } + } else if (type .equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_ETC1)) { + try { + return new ETC1Texture(this.mTextureManager, textureOptions) { + @Override + protected InputStream getInputStream() throws IOException { + return TexturePackParser.this.onGetInputStream(file); + } + }; + } catch (final IOException e) { + throw new TexturePackParseException(e); + } } else { throw new TexturePackParseException(new IllegalArgumentException("Unsupported pTextureFormat: '" + type + "'.")); } From 7622a678a8f13cc705432f8095834eb8b4a8cf9f Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 11 Dec 2012 22:04:39 -0800 Subject: [PATCH 096/252] Updated classpath. --- .classpath | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.classpath b/.classpath index 6aed2ebfb..d3bb07b44 100644 --- a/.classpath +++ b/.classpath @@ -1,8 +1,8 @@ - - + + From 7fb51e57561df37938cfef02998d88692c0f3b5c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 11 Dec 2012 22:05:01 -0800 Subject: [PATCH 097/252] Added clear method to Library. --- src/org/andengine/util/adt/map/Library.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/util/adt/map/Library.java b/src/org/andengine/util/adt/map/Library.java index 970b7f9cb..b1062345c 100644 --- a/src/org/andengine/util/adt/map/Library.java +++ b/src/org/andengine/util/adt/map/Library.java @@ -37,12 +37,16 @@ public Library(final int pInitialCapacity) { // Getter & Setter // =========================================================== + public T get(final int pID) { + return this.mItems.get(pID); + } + public void put(final int pID, final T pItem) { - final T existingItem = this.mItems.get(pID); - if(existingItem == null) { + final T item = this.mItems.get(pID); + if(item == null) { this.mItems.put(pID, pItem); } else { - throw new IllegalArgumentException("ID: '" + pID + "' is already associated with item: '" + existingItem.toString() + "'."); + throw new IllegalArgumentException("ID: '" + pID + "' is already associated with item: '" + item.toString() + "'."); } } @@ -50,8 +54,8 @@ public void remove(final int pID) { this.mItems.remove(pID); } - public T get(final int pID) { - return this.mItems.get(pID); + public void clear() { + this.mItems.clear(); } // =========================================================== From 16fb6990a57afdb91f7aeec157f9ee0a67851db0 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 7 Jan 2013 14:58:01 -0800 Subject: [PATCH 098/252] Minor optimization where using the StringBuilder class. --- src/org/andengine/entity/Entity.java | 2 +- src/org/andengine/util/adt/color/Color.java | 2 +- .../util/adt/map/SparseArrayUtils.java | 24 +++++++++---------- .../adt/spatial/quadtree/FloatQuadTree.java | 2 +- .../adt/spatial/quadtree/IntQuadTree.java | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 5c2eb39f3..1d83390bc 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1430,7 +1430,7 @@ public void toString(final StringBuilder pStringBuilder) { pStringBuilder.append(", "); } } - pStringBuilder.append("]"); + pStringBuilder.append(']'); } } diff --git a/src/org/andengine/util/adt/color/Color.java b/src/org/andengine/util/adt/color/Color.java index 53f232313..ed01054f6 100644 --- a/src/org/andengine/util/adt/color/Color.java +++ b/src/org/andengine/util/adt/color/Color.java @@ -301,7 +301,7 @@ public String toString() { .append(this.mBlue) .append(", Alpha: ") .append(this.mAlpha) - .append("]") + .append(']') .toString(); } diff --git a/src/org/andengine/util/adt/map/SparseArrayUtils.java b/src/org/andengine/util/adt/map/SparseArrayUtils.java index e6d80e20f..91a2d95aa 100644 --- a/src/org/andengine/util/adt/map/SparseArrayUtils.java +++ b/src/org/andengine/util/adt/map/SparseArrayUtils.java @@ -39,14 +39,14 @@ public static final String toString(final SparseArray pSparseArray) { final StringBuilder stringBuilder = new StringBuilder(); final int size = pSparseArray.size(); - stringBuilder.append("{"); + stringBuilder.append('{'); for(int i = 0; i < size; i++) { - stringBuilder.append(pSparseArray.keyAt(i)).append("=").append(pSparseArray.valueAt(i)); + stringBuilder.append(pSparseArray.keyAt(i)).append('=').append(pSparseArray.valueAt(i)); if(i < (size - 1)) { stringBuilder.append(", "); } } - stringBuilder.append("}"); + stringBuilder.append('}'); return stringBuilder.toString(); } @@ -55,14 +55,14 @@ public static final String toString(final SparseIntArray pSparseIntArray) { final StringBuilder stringBuilder = new StringBuilder(); final int size = pSparseIntArray.size(); - stringBuilder.append("{"); + stringBuilder.append('{'); for(int i = 0; i < size; i++) { - stringBuilder.append(pSparseIntArray.keyAt(i)).append("=").append(pSparseIntArray.valueAt(i)); + stringBuilder.append(pSparseIntArray.keyAt(i)).append('=').append(pSparseIntArray.valueAt(i)); if(i < (size - 1)) { stringBuilder.append(", "); } } - stringBuilder.append("}"); + stringBuilder.append('}'); return stringBuilder.toString(); } @@ -71,14 +71,14 @@ public static final String toString(final SparseBooleanArray pSparseBooleanArray final StringBuilder stringBuilder = new StringBuilder(); final int size = pSparseBooleanArray.size(); - stringBuilder.append("{"); + stringBuilder.append('{'); for(int i = 0; i < size; i++) { - stringBuilder.append(pSparseBooleanArray.keyAt(i)).append("=").append(pSparseBooleanArray.valueAt(i)); + stringBuilder.append(pSparseBooleanArray.keyAt(i)).append('=').append(pSparseBooleanArray.valueAt(i)); if(i < (size - 1)) { stringBuilder.append(", "); } } - stringBuilder.append("}"); + stringBuilder.append('}'); return stringBuilder.toString(); } @@ -87,14 +87,14 @@ public static final String toString(final LongSparseArray pLongSparseArray) { final StringBuilder stringBuilder = new StringBuilder(); final int size = pLongSparseArray.size(); - stringBuilder.append("{"); + stringBuilder.append('{'); for(int i = 0; i < size; i++) { - stringBuilder.append(pLongSparseArray.keyAt(i)).append("=").append(pLongSparseArray.valueAt(i)); + stringBuilder.append(pLongSparseArray.keyAt(i)).append('=').append(pLongSparseArray.valueAt(i)); if(i < (size - 1)) { stringBuilder.append(", "); } } - stringBuilder.append("}"); + stringBuilder.append('}'); return stringBuilder.toString(); } diff --git a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java index bc8c6fef5..bb9b63a4f 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java @@ -285,7 +285,7 @@ protected void appendBoundsToString(final StringBuilder pStringBuilder) { .append(this.mXMax) .append(", YMax: ") .append(this.mYMax) - .append("]"); + .append(']'); } // =========================================================== diff --git a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java index 5504c8e62..c80f66930 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java @@ -293,7 +293,7 @@ protected void appendBoundsToString(final StringBuilder pStringBuilder) { .append(this.mXMax) .append(", YMax: ") .append(this.mYMax) - .append("]"); + .append(']'); } // =========================================================== From a28fec46b0439c858b2c37a04daa33d6b6a30736 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 10 Jan 2013 23:02:30 -0800 Subject: [PATCH 099/252] Added a few more TimeConstants. --- .../andengine/util/time/TimeConstants.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/util/time/TimeConstants.java b/src/org/andengine/util/time/TimeConstants.java index fd54f7705..00931b91f 100644 --- a/src/org/andengine/util/time/TimeConstants.java +++ b/src/org/andengine/util/time/TimeConstants.java @@ -22,8 +22,8 @@ public interface TimeConstants { public static final int MINUTES_PER_HOUR = 60; - public static final int MILLISECONDS_PER_SECOND = 1000; - public static final int MICROSECONDS_PER_SECOND = 1000 * 1000; + public static final long MILLISECONDS_PER_SECOND = 1000; + public static final long MICROSECONDS_PER_SECOND = 1000 * 1000; public static final long NANOSECONDS_PER_SECOND = 1000 * 1000 * 1000; public static final long MICROSECONDS_PER_MILLISECOND = MICROSECONDS_PER_SECOND / MILLISECONDS_PER_SECOND; @@ -47,6 +47,27 @@ public interface TimeConstants { public static final int SECONDS_PER_MONTH = SECONDS_PER_DAY * DAYS_PER_MONTH; public static final int SECONDS_PER_YEAR = SECONDS_PER_MONTH * MONTHS_PER_YEAR; + public static final long MILLISECONDS_PER_MINUTE = MILLISECONDS_PER_SECOND * SECONDS_PER_MINUTE; + public static final long MILLISECONDS_PER_HOUR = MILLISECONDS_PER_SECOND * SECONDS_PER_HOUR; + public static final long MILLISECONDS_PER_DAY = MILLISECONDS_PER_SECOND * SECONDS_PER_DAY; + public static final long MILLISECONDS_PER_WEEK = MILLISECONDS_PER_SECOND * SECONDS_PER_WEEK; + public static final long MILLISECONDS_PER_MONTH = MILLISECONDS_PER_SECOND * SECONDS_PER_MONTH; + public static final long MILLISECONDS_PER_YEAR = MILLISECONDS_PER_SECOND * SECONDS_PER_YEAR; + + public static final long MICROSECONDS_PER_MINUTE = MICROSECONDS_PER_SECOND * SECONDS_PER_MINUTE; + public static final long MICROSECONDS_PER_HOUR = MICROSECONDS_PER_SECOND * SECONDS_PER_HOUR; + public static final long MICROSECONDS_PER_DAY = MICROSECONDS_PER_SECOND * SECONDS_PER_DAY; + public static final long MICROSECONDS_PER_WEEK = MICROSECONDS_PER_SECOND * SECONDS_PER_WEEK; + public static final long MICROSECONDS_PER_MONTH = MICROSECONDS_PER_SECOND * SECONDS_PER_MONTH; + public static final long MICROSECONDS_PER_YEAR = MICROSECONDS_PER_SECOND * SECONDS_PER_YEAR; + + public static final long NANOSECONDS_PER_MINUTE = NANOSECONDS_PER_SECOND * SECONDS_PER_MINUTE; + public static final long NANOSECONDS_PER_HOUR = NANOSECONDS_PER_SECOND * SECONDS_PER_HOUR; + public static final long NANOSECONDS_PER_DAY = NANOSECONDS_PER_SECOND * SECONDS_PER_DAY; + public static final long NANOSECONDS_PER_WEEK = NANOSECONDS_PER_SECOND * SECONDS_PER_WEEK; + public static final long NANOSECONDS_PER_MONTH = NANOSECONDS_PER_SECOND * SECONDS_PER_MONTH; + public static final long NANOSECONDS_PER_YEAR = NANOSECONDS_PER_SECOND * SECONDS_PER_YEAR; + // =========================================================== // Methods // =========================================================== From e4724023085f437f30fb0c8e03300eff1cf7f8c0 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 Jan 2013 11:19:55 -0800 Subject: [PATCH 100/252] Made CatmullRomMoveModifierConfig static. --- .../andengine/entity/modifier/CatmullRomSplineMoveModifier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java b/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java index afc63f38b..f9234c955 100644 --- a/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java +++ b/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java @@ -53,7 +53,7 @@ public CatmullRomSplineMoveModifier(final float pDuration, final CatmullRomMoveM // Inner and Anonymous Classes // =========================================================== - public class CatmullRomMoveModifierConfig extends CardinalSplineMoveModifierConfig { + public static class CatmullRomMoveModifierConfig extends CardinalSplineMoveModifierConfig { // =========================================================== // Constants // =========================================================== From 114100976e6a5bf77845850f1682328cc4152525 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 11 Jan 2013 14:08:01 -0800 Subject: [PATCH 101/252] Minor changes. --- src/org/andengine/util/IDisposable.java | 10 +++++----- src/org/andengine/util/IMatcher.java | 1 - src/org/andengine/util/StreamUtils.java | 2 +- .../andengine/util/adt/io/in/IInputStreamOpener.java | 1 - 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/org/andengine/util/IDisposable.java b/src/org/andengine/util/IDisposable.java index 5bb6410b7..cc16d46d1 100644 --- a/src/org/andengine/util/IDisposable.java +++ b/src/org/andengine/util/IDisposable.java @@ -40,18 +40,18 @@ public class AlreadyDisposedException extends AndEngineRuntimeException { // =========================================================== public AlreadyDisposedException() { - + } - public AlreadyDisposedException(String pMessage) { + public AlreadyDisposedException(final String pMessage) { super(pMessage); } - public AlreadyDisposedException(Throwable pThrowable) { + public AlreadyDisposedException(final Throwable pThrowable) { super(pThrowable); } - - public AlreadyDisposedException(String pMessage, Throwable pThrowable) { + + public AlreadyDisposedException(final String pMessage, final Throwable pThrowable) { super(pMessage, pThrowable); } diff --git a/src/org/andengine/util/IMatcher.java b/src/org/andengine/util/IMatcher.java index d4317f56a..102162f7f 100644 --- a/src/org/andengine/util/IMatcher.java +++ b/src/org/andengine/util/IMatcher.java @@ -18,4 +18,3 @@ public interface IMatcher { public boolean matches(final T pObject); } - diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java index d96b9792e..f5c14a86b 100644 --- a/src/org/andengine/util/StreamUtils.java +++ b/src/org/andengine/util/StreamUtils.java @@ -231,4 +231,4 @@ public static final void flushCloseWriter(final Writer pWriter) { // =========================================================== // Inner and Anonymous Classes // =========================================================== -} \ No newline at end of file +} diff --git a/src/org/andengine/util/adt/io/in/IInputStreamOpener.java b/src/org/andengine/util/adt/io/in/IInputStreamOpener.java index ade6215ac..40827855a 100644 --- a/src/org/andengine/util/adt/io/in/IInputStreamOpener.java +++ b/src/org/andengine/util/adt/io/in/IInputStreamOpener.java @@ -20,4 +20,3 @@ public interface IInputStreamOpener { public InputStream open() throws IOException; } - From 089f9c09cf5250f8b624e10acdf470505c6cd84a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 14 Jan 2013 14:24:02 -0800 Subject: [PATCH 102/252] Minor changes. --- .../andengine/entity/util/ScreenCapture.java | 2 +- src/org/andengine/util/FileUtils.java | 16 ++++++-------- src/org/andengine/util/StreamUtils.java | 14 +++++++----- src/org/andengine/util/TextUtils.java | 22 +++++++++---------- src/org/andengine/util/TimeUtils.java | 6 ++--- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/org/andengine/entity/util/ScreenCapture.java b/src/org/andengine/entity/util/ScreenCapture.java index 4e69edd37..3abb5b64c 100644 --- a/src/org/andengine/entity/util/ScreenCapture.java +++ b/src/org/andengine/entity/util/ScreenCapture.java @@ -97,7 +97,7 @@ private static void saveCapture(final Bitmap pBitmap, final String pFilePath) th out = new FileOutputStream(pFilePath); pBitmap.compress(CompressFormat.PNG, 100, out); } catch (final FileNotFoundException e) { - StreamUtils.flushCloseStream(out); + StreamUtils.flushAndCloseStream(out); Debug.e("Error saving file to: " + pFilePath, e); throw e; } diff --git a/src/org/andengine/util/FileUtils.java b/src/org/andengine/util/FileUtils.java index 02766efce..4e780b225 100644 --- a/src/org/andengine/util/FileUtils.java +++ b/src/org/andengine/util/FileUtils.java @@ -180,26 +180,24 @@ public static void copyFile(final File pSourceFile, final File pDestinationFile) } /** - * Deletes all files and sub-directories under dir. Returns - * true if all deletions were successful. If a deletion fails, the method - * stops attempting to delete and returns false. + * Recursively deletes all files and sub-directories under pFileOrDirectory. * * @param pFileOrDirectory - * @return + * @return true, if all deletions were successful. false, if a deletion fails (the recursion is stopped then). */ - public static boolean deleteDirectory(final File pFileOrDirectory) { + public static boolean delete(final File pFileOrDirectory) { if(pFileOrDirectory.isDirectory()) { final String[] children = pFileOrDirectory.list(); - final int childrenCount = children.length; - for(int i = 0; i < childrenCount; i++) { - final boolean success = FileUtils.deleteDirectory(new File(pFileOrDirectory, children[i])); + final int childCount = children.length; + for(int i = 0; i < childCount; i++) { + final boolean success = FileUtils.delete(new File(pFileOrDirectory, children[i])); if(!success) { return false; } } } - // The directory is now empty so delete it + /* The directory is now empty so delete it. */ return pFileOrDirectory.delete(); } diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java index f5c14a86b..abc593527 100644 --- a/src/org/andengine/util/StreamUtils.java +++ b/src/org/andengine/util/StreamUtils.java @@ -12,6 +12,8 @@ import java.io.Writer; import java.nio.ByteBuffer; +import org.andengine.util.debug.Debug; + /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -189,7 +191,7 @@ public static final void close(final Closeable pCloseable) { try { pCloseable.close(); } catch (final IOException e) { - e.printStackTrace(); + Debug.e("Error closing Closable", e); } } } @@ -197,14 +199,14 @@ public static final void close(final Closeable pCloseable) { /** * Flushes and closes the specified stream. * - * @param pOutputStream The stream to close. + * @param pOutputStream The stream to flush and close. */ - public static final void flushCloseStream(final OutputStream pOutputStream) { + public static final void flushAndCloseStream(final OutputStream pOutputStream) { if(pOutputStream != null) { try { pOutputStream.flush(); } catch (final IOException e) { - e.printStackTrace(); + Debug.e("Error flusing OutputStream", e); } finally { StreamUtils.close(pOutputStream); } @@ -216,12 +218,12 @@ public static final void flushCloseStream(final OutputStream pOutputStream) { * * @param pWriter The Writer to close. */ - public static final void flushCloseWriter(final Writer pWriter) { + public static final void flushAndCloseWriter(final Writer pWriter) { if(pWriter != null) { try { pWriter.flush(); } catch (final IOException e) { - e.printStackTrace(); + Debug.e("Error flusing Writer", e); } finally { StreamUtils.close(pWriter); } diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java index b1c2c5524..c44523141 100644 --- a/src/org/andengine/util/TextUtils.java +++ b/src/org/andengine/util/TextUtils.java @@ -46,12 +46,12 @@ public static final CharSequence pad(final CharSequence pText, final char pPadCh return pText; } else { final StringBuilder sb = new StringBuilder(); - + sb.append(pText); for(int i = padCount - 1; i >= 0; i--) { sb.append(pPadChar); } - + return sb.toString(); } } @@ -120,15 +120,15 @@ public static final > L split(final CharSequence pT public static final String formatStackTrace(final StackTraceElement pStackTraceElement) { return new StringBuilder() - .append(pStackTraceElement.getClassName()) - .append('.') - .append(pStackTraceElement.getMethodName()) - .append('(') - .append(pStackTraceElement.getFileName()) - .append(':') - .append(pStackTraceElement.getLineNumber()) - .append(')') - .toString(); + .append(pStackTraceElement.getClassName()) + .append('.') + .append(pStackTraceElement.getMethodName()) + .append('(') + .append(pStackTraceElement.getFileName()) + .append(':') + .append(pStackTraceElement.getLineNumber()) + .append(')') + .toString(); } public static final String formatStackTrace(final StackTraceElement[] pStackTraceElements) { diff --git a/src/org/andengine/util/TimeUtils.java b/src/org/andengine/util/TimeUtils.java index 1067e2689..0a851b2c9 100644 --- a/src/org/andengine/util/TimeUtils.java +++ b/src/org/andengine/util/TimeUtils.java @@ -37,14 +37,14 @@ public final class TimeUtils implements TimeConstants { public static final String formatSeconds(final int pSecondsTotal) { return formatSeconds(pSecondsTotal, new StringBuilder()); } - + public static final String formatSeconds(final int pSecondsTotal, final StringBuilder pStringBuilder) { final int minutes = pSecondsTotal / SECONDS_PER_MINUTE; final int seconds = pSecondsTotal % SECONDS_PER_MINUTE; - + pStringBuilder.append(minutes); pStringBuilder.append(':'); - + if(seconds < 10) { pStringBuilder.append('0'); } From 8682c2beffefda29d53d81292bbfb9c39a5554f1 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 19 Jan 2013 15:17:18 -0800 Subject: [PATCH 103/252] Added SparseLongArray, SparseFloatArray, SparseDoubleArray, SparseByteArray, DoubleArrayLiist, CharArrayList, ByteArrayList, BooleanArrayList. Fixed LongArrayList, IntArrayList. Added SparseArrayUtils.valuesToList and a few more SparseArrayUtils.toString. --- .../andengine/audio/sound/SoundManager.java | 4 +- .../util/adt/list/BooleanArrayList.java | 122 +++++++++ .../util/adt/list/ByteArrayList.java | 122 +++++++++ .../util/adt/list/CharArrayList.java | 122 +++++++++ .../util/adt/list/DoubleArrayList.java | 122 +++++++++ .../util/adt/list/FloatArrayList.java | 2 +- .../andengine/util/adt/list/IBooleanList.java | 26 ++ .../andengine/util/adt/list/IByteList.java | 26 ++ .../andengine/util/adt/list/ICharList.java | 26 ++ .../andengine/util/adt/list/IDoubleList.java | 26 ++ src/org/andengine/util/adt/list/IIntList.java | 4 +- .../andengine/util/adt/list/ILongList.java | 4 +- .../andengine/util/adt/list/IntArrayList.java | 8 +- .../util/adt/list/LongArrayList.java | 8 +- .../util/adt/map/SparseArrayUtils.java | 201 +++++++++++++- .../util/adt/map/SparseByteArray.java | 246 ++++++++++++++++++ .../util/adt/map/SparseCharArray.java | 246 ++++++++++++++++++ .../util/adt/map/SparseDoubleArray.java | 246 ++++++++++++++++++ .../util/adt/map/SparseFloatArray.java | 246 ++++++++++++++++++ .../util/adt/map/SparseLongArray.java | 246 ++++++++++++++++++ 20 files changed, 2032 insertions(+), 21 deletions(-) create mode 100644 src/org/andengine/util/adt/list/BooleanArrayList.java create mode 100644 src/org/andengine/util/adt/list/ByteArrayList.java create mode 100644 src/org/andengine/util/adt/list/CharArrayList.java create mode 100644 src/org/andengine/util/adt/list/DoubleArrayList.java create mode 100644 src/org/andengine/util/adt/list/IBooleanList.java create mode 100644 src/org/andengine/util/adt/list/IByteList.java create mode 100644 src/org/andengine/util/adt/list/ICharList.java create mode 100644 src/org/andengine/util/adt/list/IDoubleList.java create mode 100644 src/org/andengine/util/adt/map/SparseByteArray.java create mode 100644 src/org/andengine/util/adt/map/SparseCharArray.java create mode 100644 src/org/andengine/util/adt/map/SparseDoubleArray.java create mode 100644 src/org/andengine/util/adt/map/SparseFloatArray.java create mode 100644 src/org/andengine/util/adt/map/SparseLongArray.java diff --git a/src/org/andengine/audio/sound/SoundManager.java b/src/org/andengine/audio/sound/SoundManager.java index 98028f710..6f4824947 100644 --- a/src/org/andengine/audio/sound/SoundManager.java +++ b/src/org/andengine/audio/sound/SoundManager.java @@ -72,14 +72,14 @@ public boolean remove(final Sound pSound) { return removed; } - + @Override public void releaseAll() { super.releaseAll(); this.mSoundPool.release(); } - + @Override public synchronized void onLoadComplete(final SoundPool pSoundPool, final int pSoundID, final int pStatus) { if(pStatus == SoundManager.SOUND_STATUS_OK) { diff --git a/src/org/andengine/util/adt/list/BooleanArrayList.java b/src/org/andengine/util/adt/list/BooleanArrayList.java new file mode 100644 index 000000000..0c3a91d48 --- /dev/null +++ b/src/org/andengine/util/adt/list/BooleanArrayList.java @@ -0,0 +1,122 @@ +package org.andengine.util.adt.list; + +/** + * TODO This class could take some kind of AllocationStrategy object. + * + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:10:25 - 19.01.2013 + */ +public class BooleanArrayList implements IBooleanList { + // =========================================================== + // Constants + // =========================================================== + + private static final int CAPACITY_INITIAL_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private boolean[] mItems; + private int mSize; + + // =========================================================== + // Constructors + // =========================================================== + + public BooleanArrayList() { + this(BooleanArrayList.CAPACITY_INITIAL_DEFAULT); + } + + public BooleanArrayList(final int pInitialCapacity) { + this.mItems = new boolean[pInitialCapacity]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isEmpty() { + return this.mSize == 0; + } + + @Override + public boolean get(final int pIndex) throws ArrayIndexOutOfBoundsException { + return this.mItems[pIndex]; + } + + @Override + public void add(final boolean pItem) { + this.ensureCapacity(this.mSize + 1); + + this.mItems[this.mSize] = pItem; + this.mSize++; + } + + @Override + public void add(final int pIndex, final boolean pItem) throws ArrayIndexOutOfBoundsException { + this.ensureCapacity(this.mSize + 1); + + System.arraycopy(this.mItems, pIndex, this.mItems, pIndex + 1, this.mSize - pIndex); + + this.mItems[pIndex] = pItem; + this.mSize++; + } + + @Override + public boolean remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final boolean oldValue = this.mItems[pIndex]; + + final int numMoved = this.mSize - pIndex - 1; + if(numMoved > 0) { + System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); + } + + this.mSize--; + + return oldValue; + } + + @Override + public int size() { + return this.mSize; + } + + @Override + public void clear() { + this.mSize = 0; + } + + @Override + public int[] toArray() { + final int[] array = new int[this.mSize]; + System.arraycopy(this.mItems, 0, array, 0, this.mSize); + return array ; + } + + // =========================================================== + // Methods + // =========================================================== + + private void ensureCapacity(final int pCapacity) { + final int currentCapacity = this.mItems.length; + if(currentCapacity < pCapacity) { + /* Increase array size. */ + final int newCapacity = ((currentCapacity * 3) >> 1) + 1; + final boolean[] newItems = new boolean[newCapacity]; + System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); + this.mItems = newItems; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/adt/list/ByteArrayList.java b/src/org/andengine/util/adt/list/ByteArrayList.java new file mode 100644 index 000000000..8a73e3861 --- /dev/null +++ b/src/org/andengine/util/adt/list/ByteArrayList.java @@ -0,0 +1,122 @@ +package org.andengine.util.adt.list; + +/** + * TODO This class could take some kind of AllocationStrategy object. + * + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:17:43 - 19.01.2013 + */ +public class ByteArrayList implements IByteList { + // =========================================================== + // Constants + // =========================================================== + + private static final int CAPACITY_INITIAL_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private byte[] mItems; + private int mSize; + + // =========================================================== + // Constructors + // =========================================================== + + public ByteArrayList() { + this(ByteArrayList.CAPACITY_INITIAL_DEFAULT); + } + + public ByteArrayList(final int pInitialCapacity) { + this.mItems = new byte[pInitialCapacity]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isEmpty() { + return this.mSize == 0; + } + + @Override + public byte get(final int pIndex) throws ArrayIndexOutOfBoundsException { + return this.mItems[pIndex]; + } + + @Override + public void add(final byte pItem) { + this.ensureCapacity(this.mSize + 1); + + this.mItems[this.mSize] = pItem; + this.mSize++; + } + + @Override + public void add(final int pIndex, final byte pItem) throws ArrayIndexOutOfBoundsException { + this.ensureCapacity(this.mSize + 1); + + System.arraycopy(this.mItems, pIndex, this.mItems, pIndex + 1, this.mSize - pIndex); + + this.mItems[pIndex] = pItem; + this.mSize++; + } + + @Override + public byte remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final byte oldValue = this.mItems[pIndex]; + + final int numMoved = this.mSize - pIndex - 1; + if(numMoved > 0) { + System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); + } + + this.mSize--; + + return oldValue; + } + + @Override + public int size() { + return this.mSize; + } + + @Override + public void clear() { + this.mSize = 0; + } + + @Override + public byte[] toArray() { + final byte[] array = new byte[this.mSize]; + System.arraycopy(this.mItems, 0, array, 0, this.mSize); + return array ; + } + + // =========================================================== + // Methods + // =========================================================== + + private void ensureCapacity(final int pCapacity) { + final int currentCapacity = this.mItems.length; + if(currentCapacity < pCapacity) { + /* Increase array size. */ + final int newCapacity = ((currentCapacity * 3) >> 1) + 1; + final byte[] newItems = new byte[newCapacity]; + System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); + this.mItems = newItems; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/adt/list/CharArrayList.java b/src/org/andengine/util/adt/list/CharArrayList.java new file mode 100644 index 000000000..ac3b55415 --- /dev/null +++ b/src/org/andengine/util/adt/list/CharArrayList.java @@ -0,0 +1,122 @@ +package org.andengine.util.adt.list; + +/** + * TODO This class could take some kind of AllocationStrategy object. + * + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:13:55 - 19.01.2013 + */ +public class CharArrayList implements ICharList { + // =========================================================== + // Constants + // =========================================================== + + private static final int CAPACITY_INITIAL_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private char[] mItems; + private int mSize; + + // =========================================================== + // Constructors + // =========================================================== + + public CharArrayList() { + this(CharArrayList.CAPACITY_INITIAL_DEFAULT); + } + + public CharArrayList(final int pInitialCapacity) { + this.mItems = new char[pInitialCapacity]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isEmpty() { + return this.mSize == 0; + } + + @Override + public char get(final int pIndex) throws ArrayIndexOutOfBoundsException { + return this.mItems[pIndex]; + } + + @Override + public void add(final char pItem) { + this.ensureCapacity(this.mSize + 1); + + this.mItems[this.mSize] = pItem; + this.mSize++; + } + + @Override + public void add(final int pIndex, final char pItem) throws ArrayIndexOutOfBoundsException { + this.ensureCapacity(this.mSize + 1); + + System.arraycopy(this.mItems, pIndex, this.mItems, pIndex + 1, this.mSize - pIndex); + + this.mItems[pIndex] = pItem; + this.mSize++; + } + + @Override + public char remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final char oldValue = this.mItems[pIndex]; + + final int numMoved = this.mSize - pIndex - 1; + if(numMoved > 0) { + System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); + } + + this.mSize--; + + return oldValue; + } + + @Override + public int size() { + return this.mSize; + } + + @Override + public void clear() { + this.mSize = 0; + } + + @Override + public char[] toArray() { + final char[] array = new char[this.mSize]; + System.arraycopy(this.mItems, 0, array, 0, this.mSize); + return array ; + } + + // =========================================================== + // Methods + // =========================================================== + + private void ensureCapacity(final int pCapacity) { + final int currentCapacity = this.mItems.length; + if(currentCapacity < pCapacity) { + /* Increase array size. */ + final int newCapacity = ((currentCapacity * 3) >> 1) + 1; + final char[] newItems = new char[newCapacity]; + System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); + this.mItems = newItems; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/adt/list/DoubleArrayList.java b/src/org/andengine/util/adt/list/DoubleArrayList.java new file mode 100644 index 000000000..f447f4f9f --- /dev/null +++ b/src/org/andengine/util/adt/list/DoubleArrayList.java @@ -0,0 +1,122 @@ +package org.andengine.util.adt.list; + +/** + * TODO This class could take some kind of AllocationStrategy object. + * + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:18:43 - 19.01.2013 + */ +public class DoubleArrayList implements IDoubleList { + // =========================================================== + // Constants + // =========================================================== + + private static final int CAPACITY_INITIAL_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + private double[] mItems; + private int mSize; + + // =========================================================== + // Constructors + // =========================================================== + + public DoubleArrayList() { + this(DoubleArrayList.CAPACITY_INITIAL_DEFAULT); + } + + public DoubleArrayList(final int pInitialCapacity) { + this.mItems = new double[pInitialCapacity]; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public boolean isEmpty() { + return this.mSize == 0; + } + + @Override + public double get(final int pIndex) throws ArrayIndexOutOfBoundsException { + return this.mItems[pIndex]; + } + + @Override + public void add(final double pItem) { + this.ensureCapacity(this.mSize + 1); + + this.mItems[this.mSize] = pItem; + this.mSize++; + } + + @Override + public void add(final int pIndex, final double pItem) throws ArrayIndexOutOfBoundsException { + this.ensureCapacity(this.mSize + 1); + + System.arraycopy(this.mItems, pIndex, this.mItems, pIndex + 1, this.mSize - pIndex); + + this.mItems[pIndex] = pItem; + this.mSize++; + } + + @Override + public double remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final double oldValue = this.mItems[pIndex]; + + final int numMoved = this.mSize - pIndex - 1; + if(numMoved > 0) { + System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); + } + + this.mSize--; + + return oldValue; + } + + @Override + public int size() { + return this.mSize; + } + + @Override + public void clear() { + this.mSize = 0; + } + + @Override + public double[] toArray() { + final double[] array = new double[this.mSize]; + System.arraycopy(this.mItems, 0, array, 0, this.mSize); + return array ; + } + + // =========================================================== + // Methods + // =========================================================== + + private void ensureCapacity(final int pCapacity) { + final int currentCapacity = this.mItems.length; + if(currentCapacity < pCapacity) { + /* Increase array size. */ + final int newCapacity = ((currentCapacity * 3) >> 1) + 1; + final double[] newItems = new double[newCapacity]; + System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); + this.mItems = newItems; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/adt/list/FloatArrayList.java b/src/org/andengine/util/adt/list/FloatArrayList.java index 694eabf42..288d3de08 100644 --- a/src/org/andengine/util/adt/list/FloatArrayList.java +++ b/src/org/andengine/util/adt/list/FloatArrayList.java @@ -110,7 +110,7 @@ private void ensureCapacity(final int pCapacity) { if(currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; - final float newItems[] = new float[newCapacity]; + final float[] newItems = new float[newCapacity]; System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); this.mItems = newItems; } diff --git a/src/org/andengine/util/adt/list/IBooleanList.java b/src/org/andengine/util/adt/list/IBooleanList.java new file mode 100644 index 000000000..d8f084b6b --- /dev/null +++ b/src/org/andengine/util/adt/list/IBooleanList.java @@ -0,0 +1,26 @@ +package org.andengine.util.adt.list; + +/** + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:05:14 - 19.01.2013 + */ +public interface IBooleanList { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isEmpty(); + public boolean get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public void add(final boolean pItem); + public void add(final int pIndex, final boolean pItem) throws ArrayIndexOutOfBoundsException; + public boolean remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int size(); + public void clear(); + public int[] toArray(); +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/list/IByteList.java b/src/org/andengine/util/adt/list/IByteList.java new file mode 100644 index 000000000..fc9ba7ad2 --- /dev/null +++ b/src/org/andengine/util/adt/list/IByteList.java @@ -0,0 +1,26 @@ +package org.andengine.util.adt.list; + +/** + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:18:45 - 19.01.2013 + */ +public interface IByteList { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isEmpty(); + public byte get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public void add(final byte pItem); + public void add(final int pIndex, final byte pItem) throws ArrayIndexOutOfBoundsException; + public byte remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int size(); + public void clear(); + public byte[] toArray(); +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/list/ICharList.java b/src/org/andengine/util/adt/list/ICharList.java new file mode 100644 index 000000000..00d50fdd8 --- /dev/null +++ b/src/org/andengine/util/adt/list/ICharList.java @@ -0,0 +1,26 @@ +package org.andengine.util.adt.list; + +/** + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:13:13 - 10.01.2013 + */ +public interface ICharList { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isEmpty(); + public char get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public void add(final char pItem); + public void add(final int pIndex, final char pItem) throws ArrayIndexOutOfBoundsException; + public char remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int size(); + public void clear(); + public char[] toArray(); +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/list/IDoubleList.java b/src/org/andengine/util/adt/list/IDoubleList.java new file mode 100644 index 000000000..4676dfd24 --- /dev/null +++ b/src/org/andengine/util/adt/list/IDoubleList.java @@ -0,0 +1,26 @@ +package org.andengine.util.adt.list; + +/** + * (c) Zynga 2013 + * + * @author Nicolas Gramlich + * @since 13:18:46 - 19.01.2013 + */ +public interface IDoubleList { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public boolean isEmpty(); + public double get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public void add(final double pItem); + public void add(final int pIndex, final double pItem) throws ArrayIndexOutOfBoundsException; + public double remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int size(); + public void clear(); + public double[] toArray(); +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/list/IIntList.java b/src/org/andengine/util/adt/list/IIntList.java index 264fb9938..59fbbbc60 100644 --- a/src/org/andengine/util/adt/list/IIntList.java +++ b/src/org/andengine/util/adt/list/IIntList.java @@ -16,10 +16,10 @@ public interface IIntList { // =========================================================== public boolean isEmpty(); - public float get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int get(final int pIndex) throws ArrayIndexOutOfBoundsException; public void add(final int pItem); public void add(final int pIndex, final int pItem) throws ArrayIndexOutOfBoundsException; - public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public int remove(final int pIndex) throws ArrayIndexOutOfBoundsException; public int size(); public void clear(); public int[] toArray(); diff --git a/src/org/andengine/util/adt/list/ILongList.java b/src/org/andengine/util/adt/list/ILongList.java index 8bff7abf1..2c9732fe9 100644 --- a/src/org/andengine/util/adt/list/ILongList.java +++ b/src/org/andengine/util/adt/list/ILongList.java @@ -16,10 +16,10 @@ public interface ILongList { // =========================================================== public boolean isEmpty(); - public float get(final int pIndex) throws ArrayIndexOutOfBoundsException; + public long get(final int pIndex) throws ArrayIndexOutOfBoundsException; public void add(final long pItem); public void add(final int pIndex, final long pItem) throws ArrayIndexOutOfBoundsException; - public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException; + public long remove(final int pIndex) throws ArrayIndexOutOfBoundsException; public int size(); public void clear(); public long[] toArray(); diff --git a/src/org/andengine/util/adt/list/IntArrayList.java b/src/org/andengine/util/adt/list/IntArrayList.java index 4e85f1a7d..a48750de8 100644 --- a/src/org/andengine/util/adt/list/IntArrayList.java +++ b/src/org/andengine/util/adt/list/IntArrayList.java @@ -48,7 +48,7 @@ public boolean isEmpty() { } @Override - public float get(final int pIndex) throws ArrayIndexOutOfBoundsException { + public int get(final int pIndex) throws ArrayIndexOutOfBoundsException { return this.mItems[pIndex]; } @@ -71,8 +71,8 @@ public void add(final int pIndex, final int pItem) throws ArrayIndexOutOfBoundsE } @Override - public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException { - final float oldValue = this.mItems[pIndex]; + public int remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final int oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; if(numMoved > 0) { @@ -110,7 +110,7 @@ private void ensureCapacity(final int pCapacity) { if(currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; - final int newItems[] = new int[newCapacity]; + final int[] newItems = new int[newCapacity]; System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); this.mItems = newItems; } diff --git a/src/org/andengine/util/adt/list/LongArrayList.java b/src/org/andengine/util/adt/list/LongArrayList.java index 0871e5405..34ff118e6 100644 --- a/src/org/andengine/util/adt/list/LongArrayList.java +++ b/src/org/andengine/util/adt/list/LongArrayList.java @@ -48,7 +48,7 @@ public boolean isEmpty() { } @Override - public float get(final int pIndex) throws ArrayIndexOutOfBoundsException { + public long get(final int pIndex) throws ArrayIndexOutOfBoundsException { return this.mItems[pIndex]; } @@ -71,8 +71,8 @@ public void add(final int pIndex, final long pItem) throws ArrayIndexOutOfBounds } @Override - public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException { - final float oldValue = this.mItems[pIndex]; + public long remove(final int pIndex) throws ArrayIndexOutOfBoundsException { + final long oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; if(numMoved > 0) { @@ -110,7 +110,7 @@ private void ensureCapacity(final int pCapacity) { if(currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; - final long newItems[] = new long[newCapacity]; + final long[] newItems = new long[newCapacity]; System.arraycopy(this.mItems, 0, newItems, 0, currentCapacity); this.mItems = newItems; } diff --git a/src/org/andengine/util/adt/map/SparseArrayUtils.java b/src/org/andengine/util/adt/map/SparseArrayUtils.java index 91a2d95aa..f17674a0c 100644 --- a/src/org/andengine/util/adt/map/SparseArrayUtils.java +++ b/src/org/andengine/util/adt/map/SparseArrayUtils.java @@ -1,5 +1,15 @@ package org.andengine.util.adt.map; +import java.util.ArrayList; + +import org.andengine.util.adt.list.BooleanArrayList; +import org.andengine.util.adt.list.ByteArrayList; +import org.andengine.util.adt.list.CharArrayList; +import org.andengine.util.adt.list.DoubleArrayList; +import org.andengine.util.adt.list.FloatArrayList; +import org.andengine.util.adt.list.IntArrayList; +import org.andengine.util.adt.list.LongArrayList; + import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; @@ -35,13 +45,45 @@ public final class SparseArrayUtils { // Methods // =========================================================== - public static final String toString(final SparseArray pSparseArray) { + public static final String toString(final SparseBooleanArray pSparseBooleanArray) { final StringBuilder stringBuilder = new StringBuilder(); - final int size = pSparseArray.size(); + final int size = pSparseBooleanArray.size(); stringBuilder.append('{'); for(int i = 0; i < size; i++) { - stringBuilder.append(pSparseArray.keyAt(i)).append('=').append(pSparseArray.valueAt(i)); + stringBuilder.append(pSparseBooleanArray.keyAt(i)).append('=').append(pSparseBooleanArray.valueAt(i)); + if(i < (size - 1)) { + stringBuilder.append(", "); + } + } + stringBuilder.append('}'); + + return stringBuilder.toString(); + } + + public static final String toString(final SparseByteArray pSparseByteArray) { + final StringBuilder stringBuilder = new StringBuilder(); + + final int size = pSparseByteArray.size(); + stringBuilder.append('{'); + for(int i = 0; i < size; i++) { + stringBuilder.append(pSparseByteArray.keyAt(i)).append('=').append(pSparseByteArray.valueAt(i)); + if(i < (size - 1)) { + stringBuilder.append(", "); + } + } + stringBuilder.append('}'); + + return stringBuilder.toString(); + } + + public static final String toString(final SparseCharArray pSparseCharArray) { + final StringBuilder stringBuilder = new StringBuilder(); + + final int size = pSparseCharArray.size(); + stringBuilder.append('{'); + for(int i = 0; i < size; i++) { + stringBuilder.append(pSparseCharArray.keyAt(i)).append('=').append(pSparseCharArray.valueAt(i)); if(i < (size - 1)) { stringBuilder.append(", "); } @@ -67,13 +109,61 @@ public static final String toString(final SparseIntArray pSparseIntArray) { return stringBuilder.toString(); } - public static final String toString(final SparseBooleanArray pSparseBooleanArray) { + public static final String toString(final SparseLongArray pSparseLongArray) { final StringBuilder stringBuilder = new StringBuilder(); - final int size = pSparseBooleanArray.size(); + final int size = pSparseLongArray.size(); stringBuilder.append('{'); for(int i = 0; i < size; i++) { - stringBuilder.append(pSparseBooleanArray.keyAt(i)).append('=').append(pSparseBooleanArray.valueAt(i)); + stringBuilder.append(pSparseLongArray.keyAt(i)).append('=').append(pSparseLongArray.valueAt(i)); + if(i < (size - 1)) { + stringBuilder.append(", "); + } + } + stringBuilder.append('}'); + + return stringBuilder.toString(); + } + + public static final String toString(final SparseFloatArray pSparseFloatArray) { + final StringBuilder stringBuilder = new StringBuilder(); + + final int size = pSparseFloatArray.size(); + stringBuilder.append('{'); + for(int i = 0; i < size; i++) { + stringBuilder.append(pSparseFloatArray.keyAt(i)).append('=').append(pSparseFloatArray.valueAt(i)); + if(i < (size - 1)) { + stringBuilder.append(", "); + } + } + stringBuilder.append('}'); + + return stringBuilder.toString(); + } + + public static final String toString(final SparseDoubleArray pSparseDoubleArray) { + final StringBuilder stringBuilder = new StringBuilder(); + + final int size = pSparseDoubleArray.size(); + stringBuilder.append('{'); + for(int i = 0; i < size; i++) { + stringBuilder.append(pSparseDoubleArray.keyAt(i)).append('=').append(pSparseDoubleArray.valueAt(i)); + if(i < (size - 1)) { + stringBuilder.append(", "); + } + } + stringBuilder.append('}'); + + return stringBuilder.toString(); + } + + public static final String toString(final SparseArray pSparseArray) { + final StringBuilder stringBuilder = new StringBuilder(); + + final int size = pSparseArray.size(); + stringBuilder.append('{'); + for(int i = 0; i < size; i++) { + stringBuilder.append(pSparseArray.keyAt(i)).append('=').append(pSparseArray.valueAt(i)); if(i < (size - 1)) { stringBuilder.append(", "); } @@ -99,6 +189,105 @@ public static final String toString(final LongSparseArray pLongSparseArray) { return stringBuilder.toString(); } + public static final BooleanArrayList valuesToList(final SparseBooleanArray pSparseBooleanArray) { + final int size = pSparseBooleanArray.size(); + final BooleanArrayList result = new BooleanArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseBooleanArray.valueAt(i)); + } + + return result; + } + + public static final ByteArrayList valuesToList(final SparseByteArray pSparseByteArray) { + final int size = pSparseByteArray.size(); + final ByteArrayList result = new ByteArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseByteArray.valueAt(i)); + } + + return result; + } + + public static final CharArrayList valuesToList(final SparseCharArray pSparseCharArray) { + final int size = pSparseCharArray.size(); + final CharArrayList result = new CharArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseCharArray.valueAt(i)); + } + + return result; + } + + public static final IntArrayList valuesToList(final SparseIntArray pSparseIntArray) { + final int size = pSparseIntArray.size(); + final IntArrayList result = new IntArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseIntArray.valueAt(i)); + } + + return result; + } + + public static final LongArrayList valuesToList(final SparseLongArray pSparseLongArray) { + final int size = pSparseLongArray.size(); + final LongArrayList result = new LongArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseLongArray.valueAt(i)); + } + + return result; + } + + public static final FloatArrayList valuesToList(final SparseFloatArray pSparseFloatArray) { + final int size = pSparseFloatArray.size(); + final FloatArrayList result = new FloatArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseFloatArray.valueAt(i)); + } + + return result; + } + + public static final DoubleArrayList valuesToList(final SparseDoubleArray pSparseDoubleArray) { + final int size = pSparseDoubleArray.size(); + final DoubleArrayList result = new DoubleArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseDoubleArray.valueAt(i)); + } + + return result; + } + + public static final ArrayList valuesToList(final SparseArray pSparseArray) { + final int size = pSparseArray.size(); + final ArrayList result = new ArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseArray.valueAt(i)); + } + + return result; + } + + public static final ArrayList valuesToList(final LongSparseArray pSparseLongArray) { + final int size = pSparseLongArray.size(); + final ArrayList result = new ArrayList(size); + + for (int i = 0; i < size; i++) { + result.add(pSparseLongArray.valueAt(i)); + } + + return result; + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/util/adt/map/SparseByteArray.java b/src/org/andengine/util/adt/map/SparseByteArray.java new file mode 100644 index 000000000..6cf3213c4 --- /dev/null +++ b/src/org/andengine/util/adt/map/SparseByteArray.java @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * 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 org.andengine.util.adt.map; + +import org.andengine.util.adt.array.ArrayUtils; + +/** + * SparseBooleanArrays map integers to bytes. + * Unlike a normal array of bytes + * there can be gaps in the indices. It is intended to be more efficient + * than using a HashMap to map Integers to Booleans. + */ +public class SparseByteArray implements Cloneable { + /** + * Creates a new SparseByteArray containing no mappings. + */ + public SparseByteArray() { + this(10); + } + + /** + * Creates a new SparseByteArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. + */ + public SparseByteArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + + mKeys = new int[initialCapacity]; + mValues = new byte[initialCapacity]; + mSize = 0; + } + + @Override + public SparseByteArray clone() { + SparseByteArray clone = null; + try { + clone = (SparseByteArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + } catch (CloneNotSupportedException cnse) { + /* ignore */ + } + return clone; + } + + /** + * Gets the byte mapped from the specified key, or 0 + * if no such mapping has been made. + */ + public byte get(int key) { + return get(key, (byte)0); + } + + /** + * Gets the byte mapped from the specified key, or the specified value + * if no such mapping has been made. + */ + public byte get(int key, byte valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i < 0) { + return valueIfKeyNotFound; + } else { + return mValues[i]; + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + System.arraycopy(mKeys, i + 1, mKeys, i, mSize - (i + 1)); + System.arraycopy(mValues, i + 1, mValues, i, mSize - (i + 1)); + mSize--; + } + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, byte value) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + + int[] nkeys = new int[n]; + byte[] nvalues = new byte[n]; + + // Log.e("SparseByteArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + if (mSize - i != 0) { + // Log.e("SparseByteArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + /** + * Returns the number of key-value mappings that this SparseByteArray + * currently stores. + */ + public int size() { + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseByteArray stores. + */ + public int keyAt(int index) { + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseByteArray stores. + */ + public byte valueAt(int index) { + return mValues[index]; + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + return binarySearch(mKeys, 0, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(byte value) { + for (int i = 0; i < mSize; i++) + if (mValues[i] == value) + return i; + + return -1; + } + + /** + * Removes all key-value mappings from this SparseByteArray. + */ + public void clear() { + mSize = 0; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, byte value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + + int[] nkeys = new int[n]; + byte[] nvalues = new byte[n]; + + // Log.e("SparseByteArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + + while (high - low > 1) { + guess = (high + low) / 2; + + if (a[guess] < key) + low = guess; + else + high = guess; + } + + if (high == start + len) + return ~(start + len); + else if (a[high] == key) + return high; + else + return ~high; + } + + private int[] mKeys; + private byte[] mValues; + private int mSize; +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/map/SparseCharArray.java b/src/org/andengine/util/adt/map/SparseCharArray.java new file mode 100644 index 000000000..81220dd89 --- /dev/null +++ b/src/org/andengine/util/adt/map/SparseCharArray.java @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * 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 org.andengine.util.adt.map; + +import org.andengine.util.adt.array.ArrayUtils; + +/** + * SparseBooleanArrays map integers to chars. + * Unlike a normal array of chars + * there can be gaps in the indices. It is intended to be more efficient + * than using a HashMap to map Integers to Booleans. + */ +public class SparseCharArray implements Cloneable { + /** + * Creates a new SparseCharArray containing no mappings. + */ + public SparseCharArray() { + this(10); + } + + /** + * Creates a new SparseCharArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. + */ + public SparseCharArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + + mKeys = new int[initialCapacity]; + mValues = new char[initialCapacity]; + mSize = 0; + } + + @Override + public SparseCharArray clone() { + SparseCharArray clone = null; + try { + clone = (SparseCharArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + } catch (CloneNotSupportedException cnse) { + /* ignore */ + } + return clone; + } + + /** + * Gets the char mapped from the specified key, or '\0' + * if no such mapping has been made. + */ + public char get(int key) { + return get(key, '\0'); + } + + /** + * Gets the char mapped from the specified key, or the specified value + * if no such mapping has been made. + */ + public char get(int key, char valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i < 0) { + return valueIfKeyNotFound; + } else { + return mValues[i]; + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + System.arraycopy(mKeys, i + 1, mKeys, i, mSize - (i + 1)); + System.arraycopy(mValues, i + 1, mValues, i, mSize - (i + 1)); + mSize--; + } + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, char value) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + + int[] nkeys = new int[n]; + char[] nvalues = new char[n]; + + // Log.e("SparseCharArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + if (mSize - i != 0) { + // Log.e("SparseCharArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + /** + * Returns the number of key-value mappings that this SparseCharArray + * currently stores. + */ + public int size() { + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseCharArray stores. + */ + public int keyAt(int index) { + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseCharArray stores. + */ + public char valueAt(int index) { + return mValues[index]; + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + return binarySearch(mKeys, 0, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(char value) { + for (int i = 0; i < mSize; i++) + if (mValues[i] == value) + return i; + + return -1; + } + + /** + * Removes all key-value mappings from this SparseCharArray. + */ + public void clear() { + mSize = 0; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, char value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + + int[] nkeys = new int[n]; + char[] nvalues = new char[n]; + + // Log.e("SparseCharArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + + while (high - low > 1) { + guess = (high + low) / 2; + + if (a[guess] < key) + low = guess; + else + high = guess; + } + + if (high == start + len) + return ~(start + len); + else if (a[high] == key) + return high; + else + return ~high; + } + + private int[] mKeys; + private char[] mValues; + private int mSize; +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/map/SparseDoubleArray.java b/src/org/andengine/util/adt/map/SparseDoubleArray.java new file mode 100644 index 000000000..d3d19f52f --- /dev/null +++ b/src/org/andengine/util/adt/map/SparseDoubleArray.java @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * 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 org.andengine.util.adt.map; + +import org.andengine.util.adt.array.ArrayUtils; + +/** + * SparseBooleanArrays map integers to doubles. + * Unlike a normal array of doubles + * there can be gaps in the indices. It is intended to be more efficient + * than using a HashMap to map Integers to Booleans. + */ +public class SparseDoubleArray implements Cloneable { + /** + * Creates a new SparseDoubleArray containing no mappings. + */ + public SparseDoubleArray() { + this(10); + } + + /** + * Creates a new SparseDoubleArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. + */ + public SparseDoubleArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + + mKeys = new int[initialCapacity]; + mValues = new double[initialCapacity]; + mSize = 0; + } + + @Override + public SparseDoubleArray clone() { + SparseDoubleArray clone = null; + try { + clone = (SparseDoubleArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + } catch (CloneNotSupportedException cnse) { + /* ignore */ + } + return clone; + } + + /** + * Gets the double mapped from the specified key, or 0 + * if no such mapping has been made. + */ + public double get(int key) { + return get(key, 0); + } + + /** + * Gets the double mapped from the specified key, or the specified value + * if no such mapping has been made. + */ + public double get(int key, double valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i < 0) { + return valueIfKeyNotFound; + } else { + return mValues[i]; + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + System.arraycopy(mKeys, i + 1, mKeys, i, mSize - (i + 1)); + System.arraycopy(mValues, i + 1, mValues, i, mSize - (i + 1)); + mSize--; + } + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, double value) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + + int[] nkeys = new int[n]; + double[] nvalues = new double[n]; + + // Log.e("SparseDoubleArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + if (mSize - i != 0) { + // Log.e("SparseDoubleArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + /** + * Returns the number of key-value mappings that this SparseDoubleArray + * currently stores. + */ + public int size() { + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseDoubleArray stores. + */ + public int keyAt(int index) { + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseDoubleArray stores. + */ + public double valueAt(int index) { + return mValues[index]; + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + return binarySearch(mKeys, 0, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(double value) { + for (int i = 0; i < mSize; i++) + if (mValues[i] == value) + return i; + + return -1; + } + + /** + * Removes all key-value mappings from this SparseDoubleArray. + */ + public void clear() { + mSize = 0; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, double value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + + int[] nkeys = new int[n]; + double[] nvalues = new double[n]; + + // Log.e("SparseDoubleArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + + while (high - low > 1) { + guess = (high + low) / 2; + + if (a[guess] < key) + low = guess; + else + high = guess; + } + + if (high == start + len) + return ~(start + len); + else if (a[high] == key) + return high; + else + return ~high; + } + + private int[] mKeys; + private double[] mValues; + private int mSize; +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/map/SparseFloatArray.java b/src/org/andengine/util/adt/map/SparseFloatArray.java new file mode 100644 index 000000000..301487fa8 --- /dev/null +++ b/src/org/andengine/util/adt/map/SparseFloatArray.java @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * 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 org.andengine.util.adt.map; + +import org.andengine.util.adt.array.ArrayUtils; + +/** + * SparseBooleanArrays map integers to floats. + * Unlike a normal array of floats + * there can be gaps in the indices. It is intended to be more efficient + * than using a HashMap to map Integers to Booleans. + */ +public class SparseFloatArray implements Cloneable { + /** + * Creates a new SparseFloatArray containing no mappings. + */ + public SparseFloatArray() { + this(10); + } + + /** + * Creates a new SparseFloatArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. + */ + public SparseFloatArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + + mKeys = new int[initialCapacity]; + mValues = new float[initialCapacity]; + mSize = 0; + } + + @Override + public SparseFloatArray clone() { + SparseFloatArray clone = null; + try { + clone = (SparseFloatArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + } catch (CloneNotSupportedException cnse) { + /* ignore */ + } + return clone; + } + + /** + * Gets the float mapped from the specified key, or 0 + * if no such mapping has been made. + */ + public float get(int key) { + return get(key, 0); + } + + /** + * Gets the float mapped from the specified key, or the specified value + * if no such mapping has been made. + */ + public float get(int key, float valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i < 0) { + return valueIfKeyNotFound; + } else { + return mValues[i]; + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + System.arraycopy(mKeys, i + 1, mKeys, i, mSize - (i + 1)); + System.arraycopy(mValues, i + 1, mValues, i, mSize - (i + 1)); + mSize--; + } + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, float value) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + + int[] nkeys = new int[n]; + float[] nvalues = new float[n]; + + // Log.e("SparseFloatArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + if (mSize - i != 0) { + // Log.e("SparseFloatArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + /** + * Returns the number of key-value mappings that this SparseFloatArray + * currently stores. + */ + public int size() { + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseFloatArray stores. + */ + public int keyAt(int index) { + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseFloatArray stores. + */ + public float valueAt(int index) { + return mValues[index]; + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + return binarySearch(mKeys, 0, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(float value) { + for (int i = 0; i < mSize; i++) + if (mValues[i] == value) + return i; + + return -1; + } + + /** + * Removes all key-value mappings from this SparseFloatArray. + */ + public void clear() { + mSize = 0; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, float value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + + int[] nkeys = new int[n]; + float[] nvalues = new float[n]; + + // Log.e("SparseFloatArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + + while (high - low > 1) { + guess = (high + low) / 2; + + if (a[guess] < key) + low = guess; + else + high = guess; + } + + if (high == start + len) + return ~(start + len); + else if (a[high] == key) + return high; + else + return ~high; + } + + private int[] mKeys; + private float[] mValues; + private int mSize; +} \ No newline at end of file diff --git a/src/org/andengine/util/adt/map/SparseLongArray.java b/src/org/andengine/util/adt/map/SparseLongArray.java new file mode 100644 index 000000000..0fc5cd615 --- /dev/null +++ b/src/org/andengine/util/adt/map/SparseLongArray.java @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * 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 org.andengine.util.adt.map; + +import org.andengine.util.adt.array.ArrayUtils; + +/** + * SparseBooleanArrays map integers to longs. + * Unlike a normal array of longs + * there can be gaps in the indices. It is intended to be more efficient + * than using a HashMap to map Integers to Booleans. + */ +public class SparseLongArray implements Cloneable { + /** + * Creates a new SparseLongArray containing no mappings. + */ + public SparseLongArray() { + this(10); + } + + /** + * Creates a new SparseLongArray containing no mappings that will not + * require any additional memory allocation to store the specified + * number of mappings. + */ + public SparseLongArray(int initialCapacity) { + initialCapacity = ArrayUtils.idealIntArraySize(initialCapacity); + + mKeys = new int[initialCapacity]; + mValues = new long[initialCapacity]; + mSize = 0; + } + + @Override + public SparseLongArray clone() { + SparseLongArray clone = null; + try { + clone = (SparseLongArray) super.clone(); + clone.mKeys = mKeys.clone(); + clone.mValues = mValues.clone(); + } catch (CloneNotSupportedException cnse) { + /* ignore */ + } + return clone; + } + + /** + * Gets the long mapped from the specified key, or 0 + * if no such mapping has been made. + */ + public long get(int key) { + return get(key, 0); + } + + /** + * Gets the long mapped from the specified key, or the specified value + * if no such mapping has been made. + */ + public long get(int key, long valueIfKeyNotFound) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i < 0) { + return valueIfKeyNotFound; + } else { + return mValues[i]; + } + } + + /** + * Removes the mapping from the specified key, if there was any. + */ + public void delete(int key) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + System.arraycopy(mKeys, i + 1, mKeys, i, mSize - (i + 1)); + System.arraycopy(mValues, i + 1, mValues, i, mSize - (i + 1)); + mSize--; + } + } + + /** + * Adds a mapping from the specified key to the specified value, + * replacing the previous mapping from the specified key if there + * was one. + */ + public void put(int key, long value) { + int i = binarySearch(mKeys, 0, mSize, key); + + if (i >= 0) { + mValues[i] = value; + } else { + i = ~i; + + if (mSize >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(mSize + 1); + + int[] nkeys = new int[n]; + long[] nvalues = new long[n]; + + // Log.e("SparseLongArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + if (mSize - i != 0) { + // Log.e("SparseLongArray", "move " + (mSize - i)); + System.arraycopy(mKeys, i, mKeys, i + 1, mSize - i); + System.arraycopy(mValues, i, mValues, i + 1, mSize - i); + } + + mKeys[i] = key; + mValues[i] = value; + mSize++; + } + } + + /** + * Returns the number of key-value mappings that this SparseLongArray + * currently stores. + */ + public int size() { + return mSize; + } + + /** + * Given an index in the range 0...size()-1, returns + * the key from the indexth key-value mapping that this + * SparseLongArray stores. + */ + public int keyAt(int index) { + return mKeys[index]; + } + + /** + * Given an index in the range 0...size()-1, returns + * the value from the indexth key-value mapping that this + * SparseLongArray stores. + */ + public long valueAt(int index) { + return mValues[index]; + } + + /** + * Returns the index for which {@link #keyAt} would return the + * specified key, or a negative number if the specified + * key is not mapped. + */ + public int indexOfKey(int key) { + return binarySearch(mKeys, 0, mSize, key); + } + + /** + * Returns an index for which {@link #valueAt} would return the + * specified key, or a negative number if no keys map to the + * specified value. + * Beware that this is a linear search, unlike lookups by key, + * and that multiple keys can map to the same value and this will + * find only one of them. + */ + public int indexOfValue(long value) { + for (int i = 0; i < mSize; i++) + if (mValues[i] == value) + return i; + + return -1; + } + + /** + * Removes all key-value mappings from this SparseLongArray. + */ + public void clear() { + mSize = 0; + } + + /** + * Puts a key/value pair into the array, optimizing for the case where + * the key is greater than all existing keys in the array. + */ + public void append(int key, long value) { + if (mSize != 0 && key <= mKeys[mSize - 1]) { + put(key, value); + return; + } + + int pos = mSize; + if (pos >= mKeys.length) { + int n = ArrayUtils.idealIntArraySize(pos + 1); + + int[] nkeys = new int[n]; + long[] nvalues = new long[n]; + + // Log.e("SparseLongArray", "grow " + mKeys.length + " to " + n); + System.arraycopy(mKeys, 0, nkeys, 0, mKeys.length); + System.arraycopy(mValues, 0, nvalues, 0, mValues.length); + + mKeys = nkeys; + mValues = nvalues; + } + + mKeys[pos] = key; + mValues[pos] = value; + mSize = pos + 1; + } + + private static int binarySearch(int[] a, int start, int len, int key) { + int high = start + len, low = start - 1, guess; + + while (high - low > 1) { + guess = (high + low) / 2; + + if (a[guess] < key) + low = guess; + else + high = guess; + } + + if (high == start + len) + return ~(start + len); + else if (a[high] == key) + return high; + else + return ~high; + } + + private int[] mKeys; + private long[] mValues; + private int mSize; +} \ No newline at end of file From f9041647d0c7f74db867d39a1195e92ee77eae82 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 19 Jan 2013 18:31:19 -0800 Subject: [PATCH 104/252] Added text/plain MIME type. --- src/org/andengine/util/mime/MIMEType.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/util/mime/MIMEType.java b/src/org/andengine/util/mime/MIMEType.java index 3e0d065f7..7544f0bf7 100644 --- a/src/org/andengine/util/mime/MIMEType.java +++ b/src/org/andengine/util/mime/MIMEType.java @@ -14,7 +14,8 @@ public enum MIMEType { JPEG("image/jpeg"), GIF("image/gif"), - PNG("image/png"); + PNG("image/png"), + TEXT("text/plain"); // =========================================================== // Constants From dd5dc5a4375fedb454626427a2974e76982eb8d6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 23 Jan 2013 15:37:47 -0800 Subject: [PATCH 105/252] Removed a bunch of useless comments. --- src/org/andengine/util/StreamUtils.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java index abc593527..ea3b897f3 100644 --- a/src/org/andengine/util/StreamUtils.java +++ b/src/org/andengine/util/StreamUtils.java @@ -181,11 +181,6 @@ public static final boolean copyAndClose(final InputStream pInputStream, final O } } - /** - * Closes the specified stream. - * - * @param pCloseable The stream to close. - */ public static final void close(final Closeable pCloseable) { if(pCloseable != null) { try { @@ -196,11 +191,6 @@ public static final void close(final Closeable pCloseable) { } } - /** - * Flushes and closes the specified stream. - * - * @param pOutputStream The stream to flush and close. - */ public static final void flushAndCloseStream(final OutputStream pOutputStream) { if(pOutputStream != null) { try { @@ -213,11 +203,6 @@ public static final void flushAndCloseStream(final OutputStream pOutputStream) { } } - /** - * Flushes and closes the specified stream. - * - * @param pWriter The Writer to close. - */ public static final void flushAndCloseWriter(final Writer pWriter) { if(pWriter != null) { try { From 8fb1b76db7687e8648c7e2c759b9f746f5b217b8 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 23 Jan 2013 15:38:09 -0800 Subject: [PATCH 106/252] Added DatabaseUtils. --- src/org/andengine/util/DatabaseUtils.java | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/org/andengine/util/DatabaseUtils.java diff --git a/src/org/andengine/util/DatabaseUtils.java b/src/org/andengine/util/DatabaseUtils.java new file mode 100644 index 000000000..2279b3ba6 --- /dev/null +++ b/src/org/andengine/util/DatabaseUtils.java @@ -0,0 +1,45 @@ +package org.andengine.util; + +import android.database.Cursor; + +/** + * (c) 2013 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 15:30:15 - 23.01.2013 + */ +public class DatabaseUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static final void close(final Cursor pCursor) { + if(pCursor != null) { + pCursor.close(); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From c7d29be59bffc70ade0937ef9220d1df3c551233 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 27 Jan 2013 14:41:42 -0800 Subject: [PATCH 107/252] Minor change. --- .../andengine/input/touch/detector/PinchZoomDetector.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/andengine/input/touch/detector/PinchZoomDetector.java b/src/org/andengine/input/touch/detector/PinchZoomDetector.java index cf0275183..8d7c272c4 100644 --- a/src/org/andengine/input/touch/detector/PinchZoomDetector.java +++ b/src/org/andengine/input/touch/detector/PinchZoomDetector.java @@ -72,7 +72,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { switch(action) { case MotionEvent.ACTION_POINTER_DOWN: - if(!this.mPinchZooming && this.hasTwoOrMorePointers(motionEvent)) { + if(!this.mPinchZooming && PinchZoomDetector.hasTwoOrMorePointers(motionEvent)) { this.mInitialDistance = PinchZoomDetector.calculatePointerDistance(motionEvent); this.mCurrentDistance = this.mInitialDistance; if(this.mInitialDistance > PinchZoomDetector.TRIGGER_PINCHZOOM_MINIMUM_DISTANCE_DEFAULT) { @@ -91,7 +91,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { break; case MotionEvent.ACTION_MOVE: if(this.mPinchZooming) { - if (this.hasTwoOrMorePointers(motionEvent)) { + if (PinchZoomDetector.hasTwoOrMorePointers(motionEvent)) { this.mCurrentDistance = PinchZoomDetector.calculatePointerDistance(motionEvent); if(this.mCurrentDistance > PinchZoomDetector.TRIGGER_PINCHZOOM_MINIMUM_DISTANCE_DEFAULT) { this.mPinchZoomDetectorListener.onPinchZoom(this, pSceneTouchEvent, this.getZoomFactor()); @@ -121,7 +121,7 @@ private static float calculatePointerDistance(final MotionEvent pMotionEvent) { return MathUtils.distance(pMotionEvent.getX(0), pMotionEvent.getY(0), pMotionEvent.getX(1), pMotionEvent.getY(1)); } - private boolean hasTwoOrMorePointers(final MotionEvent pMotionEvent) { + private static boolean hasTwoOrMorePointers(final MotionEvent pMotionEvent) { return pMotionEvent.getPointerCount() >= 2; } From 115b84a881219814a21d009130f78d48a74584bc Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 5 Feb 2013 17:32:14 -0800 Subject: [PATCH 108/252] Fixed typos. --- src/org/andengine/util/adt/map/SparseByteArray.java | 2 +- src/org/andengine/util/adt/map/SparseCharArray.java | 2 +- src/org/andengine/util/adt/map/SparseDoubleArray.java | 2 +- src/org/andengine/util/adt/map/SparseFloatArray.java | 2 +- src/org/andengine/util/adt/map/SparseLongArray.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/util/adt/map/SparseByteArray.java b/src/org/andengine/util/adt/map/SparseByteArray.java index 6cf3213c4..a3c485ab8 100644 --- a/src/org/andengine/util/adt/map/SparseByteArray.java +++ b/src/org/andengine/util/adt/map/SparseByteArray.java @@ -19,7 +19,7 @@ import org.andengine.util.adt.array.ArrayUtils; /** - * SparseBooleanArrays map integers to bytes. + * SparseByteArrays map integers to bytes. * Unlike a normal array of bytes * there can be gaps in the indices. It is intended to be more efficient * than using a HashMap to map Integers to Booleans. diff --git a/src/org/andengine/util/adt/map/SparseCharArray.java b/src/org/andengine/util/adt/map/SparseCharArray.java index 81220dd89..eabbd481a 100644 --- a/src/org/andengine/util/adt/map/SparseCharArray.java +++ b/src/org/andengine/util/adt/map/SparseCharArray.java @@ -19,7 +19,7 @@ import org.andengine.util.adt.array.ArrayUtils; /** - * SparseBooleanArrays map integers to chars. + * SparseCharArrays map integers to chars. * Unlike a normal array of chars * there can be gaps in the indices. It is intended to be more efficient * than using a HashMap to map Integers to Booleans. diff --git a/src/org/andengine/util/adt/map/SparseDoubleArray.java b/src/org/andengine/util/adt/map/SparseDoubleArray.java index d3d19f52f..53f40606a 100644 --- a/src/org/andengine/util/adt/map/SparseDoubleArray.java +++ b/src/org/andengine/util/adt/map/SparseDoubleArray.java @@ -19,7 +19,7 @@ import org.andengine.util.adt.array.ArrayUtils; /** - * SparseBooleanArrays map integers to doubles. + * SparseDoubleArrays map integers to doubles. * Unlike a normal array of doubles * there can be gaps in the indices. It is intended to be more efficient * than using a HashMap to map Integers to Booleans. diff --git a/src/org/andengine/util/adt/map/SparseFloatArray.java b/src/org/andengine/util/adt/map/SparseFloatArray.java index 301487fa8..b29c17d8c 100644 --- a/src/org/andengine/util/adt/map/SparseFloatArray.java +++ b/src/org/andengine/util/adt/map/SparseFloatArray.java @@ -19,7 +19,7 @@ import org.andengine.util.adt.array.ArrayUtils; /** - * SparseBooleanArrays map integers to floats. + * SparseFloatArrays map integers to floats. * Unlike a normal array of floats * there can be gaps in the indices. It is intended to be more efficient * than using a HashMap to map Integers to Booleans. diff --git a/src/org/andengine/util/adt/map/SparseLongArray.java b/src/org/andengine/util/adt/map/SparseLongArray.java index 0fc5cd615..ba2c0676d 100644 --- a/src/org/andengine/util/adt/map/SparseLongArray.java +++ b/src/org/andengine/util/adt/map/SparseLongArray.java @@ -19,7 +19,7 @@ import org.andengine.util.adt.array.ArrayUtils; /** - * SparseBooleanArrays map integers to longs. + * SparseLongArrays map integers to longs. * Unlike a normal array of longs * there can be gaps in the indices. It is intended to be more efficient * than using a HashMap to map Integers to Booleans. From c4b3a233aa0b31097140d1c5197be6bc2fe86bda Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 10 Feb 2013 14:14:05 -0800 Subject: [PATCH 109/252] Removed whitespaces. --- build.xml | 10 +++++----- src/org/andengine/engine/camera/BoundCamera.java | 4 ++-- .../andengine/engine/handler/IUpdateHandler.java | 4 ++-- .../engine/handler/timer/TimerHandler.java | 2 +- .../SingleSceneSplitScreenEngine.java | 16 ++++++++-------- src/org/andengine/entity/Entity.java | 10 +++++----- .../modifier/CubicBezierCurveMoveModifier.java | 2 +- .../entity/modifier/IEntityModifier.java | 4 ++-- .../initializer/ColorParticleInitializer.java | 4 ++-- .../scene/background/ParallaxBackground.java | 2 +- .../scene/background/SpriteBackground.java | 4 ++-- .../modifier/SequenceBackgroundModifier.java | 2 +- .../andengine/entity/sprite/IAnimationData.java | 2 +- src/org/andengine/entity/sprite/Sprite.java | 4 ++-- .../entity/sprite/UniformColorSprite.java | 6 +++--- .../input/touch/detector/ClickDetector.java | 2 +- .../input/touch/detector/ScrollDetector.java | 14 +++++++------- .../detector/SurfaceGestureDetectorAdapter.java | 2 +- src/org/andengine/opengl/font/BitmapFont.java | 2 +- src/org/andengine/opengl/font/FontUtils.java | 10 +++++----- src/org/andengine/opengl/font/StrokeFont.java | 4 ++-- .../shader/PositionColorShaderProgram.java | 2 +- ...nInterpolationTextureSelectShaderProgram.java | 2 +- .../PositionTextureCoordinatesShaderProgram.java | 2 +- ...ureCoordinatesTextureSelectShaderProgram.java | 2 +- ...tureCoordinatesUniformColorShaderProgram.java | 4 ++-- .../exception/ShaderProgramCompileException.java | 2 +- .../exception/ShaderProgramLinkException.java | 2 +- .../shader/source/CriteriaShaderSource.java | 2 +- .../opengl/shader/source/StringShaderSource.java | 4 ++-- .../texture/DebugTextureStateListener.java | 2 +- .../opengl/texture/TextureStateAdapter.java | 4 ++-- .../opengl/texture/atlas/TextureAtlas.java | 2 +- .../texture/atlas/bitmap/BitmapTextureAtlas.java | 2 +- .../source/EmptyBitmapTextureAtlasSource.java | 2 +- .../source/FileBitmapTextureAtlasSource.java | 2 +- .../source/PictureBitmapTextureAtlasSource.java | 2 +- ...olorKeyBitmapTextureAtlasSourceDecorator.java | 6 +++--- ...entFillBitmapTextureAtlasSourceDecorator.java | 2 +- ...leBitmapTextureAtlasSourceDecoratorShape.java | 2 +- ...seBitmapTextureAtlasSourceDecoratorShape.java | 2 +- ...leBitmapTextureAtlasSourceDecoratorShape.java | 2 +- .../atlas/buildable/BuildableTextureAtlas.java | 2 +- ...uildableTextureAtlasTextureRegionFactory.java | 4 ++-- .../texture/compressed/etc1/ETC1Texture.java | 2 +- .../opengl/texture/region/BaseTextureRegion.java | 2 +- .../texture/region/TextureRegionFactory.java | 2 +- src/org/andengine/opengl/util/GLState.java | 6 +++--- .../vbo/HighPerformanceVertexBufferObject.java | 2 +- .../vbo/SharedMemoryVertexBufferObject.java | 2 +- .../opengl/vbo/ZeroMemoryVertexBufferObject.java | 2 +- .../ui/activity/SimpleAsyncGameActivity.java | 8 ++++---- src/org/andengine/util/ActivityUtils.java | 2 +- .../andengine/util/adt/bounds/FloatBounds.java | 4 ++-- src/org/andengine/util/adt/bounds/IntBounds.java | 4 ++-- src/org/andengine/util/adt/color/Color.java | 2 +- .../andengine/util/adt/list/CircularList.java | 2 +- src/org/andengine/util/adt/list/ShiftList.java | 2 +- .../andengine/util/adt/map/SparseArrayUtils.java | 12 ++++++------ .../spatial/bounds/util/FloatBoundsUtils.java | 4 ++-- .../adt/spatial/bounds/util/IntBoundsUtils.java | 8 ++++---- .../util/adt/spatial/quadtree/FloatQuadTree.java | 4 ++-- .../util/adt/spatial/quadtree/IntQuadTree.java | 6 +++--- .../adt/transformation/TransformationPool.java | 6 +++--- .../collision/EntityCollisionChecker.java | 4 ++-- .../andengine/util/algorithm/hull/HullUtils.java | 4 ++-- .../util/algorithm/hull/JarvisMarch.java | 2 +- .../util/algorithm/path/IPathFinder.java | 6 +++--- src/org/andengine/util/debug/DebugTimer.java | 2 +- src/org/andengine/util/level/LevelLoader.java | 4 ++-- .../simple/SimpleLevelLoaderContentHandler.java | 4 ++-- src/org/andengine/util/mime/MIMEType.java | 2 +- .../modifier/BaseDoubleValueSpanModifier.java | 2 +- .../modifier/BaseSingleValueSpanModifier.java | 4 ++-- .../util/texturepack/TexturePackParser.java | 4 ++-- 75 files changed, 144 insertions(+), 144 deletions(-) diff --git a/build.xml b/build.xml index e30400456..c9a28a730 100644 --- a/build.xml +++ b/build.xml @@ -4,7 +4,7 @@ - + - + - + + /> - + diff --git a/src/org/andengine/engine/camera/BoundCamera.java b/src/org/andengine/engine/camera/BoundCamera.java index d7842369d..e0b369594 100644 --- a/src/org/andengine/engine/camera/BoundCamera.java +++ b/src/org/andengine/engine/camera/BoundCamera.java @@ -95,11 +95,11 @@ public float getBoundsHeight() { // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== - + @Override public void setCenter(final float pCenterX, final float pCenterY) { super.setCenter(pCenterX, pCenterY); - + if(this.mBoundsEnabled) { this.ensureInBounds(); } diff --git a/src/org/andengine/engine/handler/IUpdateHandler.java b/src/org/andengine/engine/handler/IUpdateHandler.java index a5378b11d..b776be770 100644 --- a/src/org/andengine/engine/handler/IUpdateHandler.java +++ b/src/org/andengine/engine/handler/IUpdateHandler.java @@ -20,13 +20,13 @@ public interface IUpdateHandler { public void onUpdate(final float pSecondsElapsed); public void reset(); - + // TODO Maybe add onRegister and onUnregister. (Maybe add SimpleUpdateHandler that implements all methods, but onUpdate) // =========================================================== // Inner and Anonymous Classes // =========================================================== - + public interface IUpdateHandlerMatcher extends IMatcher { // =========================================================== // Constants diff --git a/src/org/andengine/engine/handler/timer/TimerHandler.java b/src/org/andengine/engine/handler/timer/TimerHandler.java index bb7b16990..cdfd36b01 100644 --- a/src/org/andengine/engine/handler/timer/TimerHandler.java +++ b/src/org/andengine/engine/handler/timer/TimerHandler.java @@ -65,7 +65,7 @@ public float getTimerSeconds() { public float getTimerSecondsElapsed() { return this.mTimerSecondsElapsed; } - + public boolean isTimerCallbackTriggered() { return this.mTimerCallbackTriggered; } diff --git a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java index a52239193..370deaf36 100644 --- a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java @@ -68,32 +68,32 @@ protected void onUpdateScene(final float pSecondsElapsed) { protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { if(super.mScene != null) { final Camera secondCamera = this.getSecondCamera(); - + final int surfaceWidth = this.mSurfaceWidth; final int surfaceWidthHalf = surfaceWidth >> 1; - + final int surfaceHeight = this.mSurfaceHeight; - + pGLState.enableScissorTest(); - + /* First Screen. With first camera, on the left half of the screens width. */ { GLES20.glScissor(0, 0, surfaceWidthHalf, surfaceHeight); GLES20.glViewport(0, 0, surfaceWidthHalf, surfaceHeight); - + super.mScene.onDraw(pGLState, pFirstCamera); pFirstCamera.onDrawHUD(pGLState); } - + /* Second Screen. With second camera, on the right half of the screens width. */ { GLES20.glScissor(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); GLES20.glViewport(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); - + super.mScene.onDraw(pGLState, secondCamera); secondCamera.onDrawHUD(pGLState); } - + pGLState.disableScissorTest(); } } diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 1d83390bc..06f8454e8 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -1009,7 +1009,7 @@ public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandl } return this.mUpdateHandlers.removeAll(pUpdateHandlerMatcher); } - + @Override public int getUpdateHandlerCount() { if(this.mUpdateHandlers == null) { @@ -1049,7 +1049,7 @@ public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityMod } return this.mEntityModifiers.removeAll(pEntityModifierMatcher); } - + @Override public int getEntityModifierCount() { if(this.mEntityModifiers == null) { @@ -1626,16 +1626,16 @@ protected void updateLocalCentersYs() { this.updateLocalScaleCenterY(); this.updateLocalSkewCenterY(); } - + protected void updateLocalOffsetCenter() { this.updateLocalOffsetCenterX(); this.updateLocalOffsetCenterY(); } - + protected void updateLocalOffsetCenterX() { this.mLocalOffsetCenterX = this.mOffsetCenterX * this.mWidth; } - + protected void updateLocalOffsetCenterY() { this.mLocalOffsetCenterY = this.mOffsetCenterY * this.mHeight; } diff --git a/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java b/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java index 343b74458..a8e7e826c 100644 --- a/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java +++ b/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java @@ -126,7 +126,7 @@ public CubicBezierCurveMoveModifier deepCopy() { @Override protected void onManagedInitialize(final IEntity pEntity) { - + } @Override diff --git a/src/org/andengine/entity/modifier/IEntityModifier.java b/src/org/andengine/entity/modifier/IEntityModifier.java index d7167d180..206f2c54a 100644 --- a/src/org/andengine/entity/modifier/IEntityModifier.java +++ b/src/org/andengine/entity/modifier/IEntityModifier.java @@ -19,7 +19,7 @@ public interface IEntityModifier extends IModifier { // =========================================================== // Methods // =========================================================== - + @Override public IEntityModifier deepCopy() throws DeepCopyNotSupportedException; @@ -36,7 +36,7 @@ public static interface IEntityModifierListener extends IModifierListener> { // =========================================================== // Constants diff --git a/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java b/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java index f552c7624..aea9e524d 100644 --- a/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java @@ -28,7 +28,7 @@ public class ColorParticleInitializer extends BaseTripleValue public ColorParticleInitializer(final Color pColor) { super(pColor.getRed(), pColor.getRed(), pColor.getGreen(), pColor.getGreen(), pColor.getBlue(), pColor.getBlue()); } - + public ColorParticleInitializer(final float pRed, final float pGreen, final float pBlue) { super(pRed, pRed, pGreen, pGreen, pBlue, pBlue); } @@ -36,7 +36,7 @@ public ColorParticleInitializer(final float pRed, final float pGreen, final floa public ColorParticleInitializer(final Color pMinColor, final Color pMaxColor) { super(pMinColor.getRed(), pMaxColor.getRed(), pMinColor.getGreen(), pMaxColor.getGreen(), pMinColor.getBlue(), pMaxColor.getBlue()); } - + public ColorParticleInitializer(final float pMinRed, final float pMaxRed, final float pMinGreen, final float pMaxGreen, final float pMinBlue, final float pMaxBlue) { super(pMinRed, pMaxRed, pMinGreen, pMaxGreen, pMinBlue, pMaxBlue); } diff --git a/src/org/andengine/entity/scene/background/ParallaxBackground.java b/src/org/andengine/entity/scene/background/ParallaxBackground.java index 78d894336..0dc2ca8b1 100644 --- a/src/org/andengine/entity/scene/background/ParallaxBackground.java +++ b/src/org/andengine/entity/scene/background/ParallaxBackground.java @@ -137,7 +137,7 @@ public void onDraw(final GLState pGLState, final Camera pCamera, final float pPa pGLState.translateModelViewGLMatrixf(baseOffset, 0, 0); float currentMaxX = baseOffset; - + do { this.mEntity.onDraw(pGLState, pCamera); pGLState.translateModelViewGLMatrixf(entityWidthScaled, 0, 0); diff --git a/src/org/andengine/entity/scene/background/SpriteBackground.java b/src/org/andengine/entity/scene/background/SpriteBackground.java index 0661aaa39..c16b13f23 100644 --- a/src/org/andengine/entity/scene/background/SpriteBackground.java +++ b/src/org/andengine/entity/scene/background/SpriteBackground.java @@ -33,11 +33,11 @@ public SpriteBackground(final float pRed, final float pGreen, final float pBlue, // =========================================================== // Getter & Setter // =========================================================== - + public Sprite getSprite() { return (Sprite)this.mEntity; } - + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== diff --git a/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java index 16b6107ac..009786794 100644 --- a/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java @@ -26,7 +26,7 @@ public class SequenceBackgroundModifier extends SequenceModifier im public SequenceBackgroundModifier(final IBackgroundModifier... pBackgroundModifiers) throws IllegalArgumentException { super(pBackgroundModifiers); } - + public SequenceBackgroundModifier(final ISubSequenceBackgroundModifierListener pSubSequenceBackgroundModifierListener, final IBackgroundModifier... pBackgroundModifiers) throws IllegalArgumentException { super(pSubSequenceBackgroundModifierListener, pBackgroundModifiers); } diff --git a/src/org/andengine/entity/sprite/IAnimationData.java b/src/org/andengine/entity/sprite/IAnimationData.java index e2c77a6f1..61b612d8b 100644 --- a/src/org/andengine/entity/sprite/IAnimationData.java +++ b/src/org/andengine/entity/sprite/IAnimationData.java @@ -18,7 +18,7 @@ public interface IAnimationData { // =========================================================== // Methods // =========================================================== - + public int[] getFrames(); public long[] getFrameDurations(); public int getLoopCount(); diff --git a/src/org/andengine/entity/sprite/Sprite.java b/src/org/andengine/entity/sprite/Sprite.java index dc49d3e9b..8e63f3710 100644 --- a/src/org/andengine/entity/sprite/Sprite.java +++ b/src/org/andengine/entity/sprite/Sprite.java @@ -104,13 +104,13 @@ public Sprite(final float pX, final float pY, final float pWidth, final float pH public Sprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final ISpriteVertexBufferObject pSpriteVertexBufferObject, final ShaderProgram pShaderProgram) { super(pX, pY, pShaderProgram); - + this.mTextureRegion = pTextureRegion; this.mSpriteVertexBufferObject = pSpriteVertexBufferObject; this.setBlendingEnabled(true); this.initBlendFunction(pTextureRegion); - + this.setSize(pWidth, pHeight); this.onUpdateColor(); diff --git a/src/org/andengine/entity/sprite/UniformColorSprite.java b/src/org/andengine/entity/sprite/UniformColorSprite.java index caa7eb99f..267ebabde 100644 --- a/src/org/andengine/entity/sprite/UniformColorSprite.java +++ b/src/org/andengine/entity/sprite/UniformColorSprite.java @@ -60,7 +60,7 @@ public UniformColorSprite(final float pX, final float pY, final ITextureRegion p public UniformColorSprite(final float pX, final float pY, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { this(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight(), pTextureRegion, pVertexBufferObjectManager, pDrawType); } - + public UniformColorSprite(final float pX, final float pY, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType, final ShaderProgram pShaderProgram) { this(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight(), pTextureRegion, pVertexBufferObjectManager, pDrawType, pShaderProgram); } @@ -68,7 +68,7 @@ public UniformColorSprite(final float pX, final float pY, final ITextureRegion p public UniformColorSprite(final float pX, final float pY, final ITextureRegion pTextureRegion, final IUniformColorSpriteVertexBufferObject pVertexBufferObject) { this(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight(), pTextureRegion, pVertexBufferObject); } - + public UniformColorSprite(final float pX, final float pY, final ITextureRegion pTextureRegion, final IUniformColorSpriteVertexBufferObject pVertexBufferObject, final ShaderProgram pShaderProgram) { this(pX, pY, pTextureRegion.getWidth(), pTextureRegion.getHeight(), pTextureRegion, pVertexBufferObject, pShaderProgram); } @@ -76,7 +76,7 @@ public UniformColorSprite(final float pX, final float pY, final ITextureRegion p public UniformColorSprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager) { this(pX, pY, pWidth, pHeight, pTextureRegion, pVertexBufferObjectManager, DrawType.STATIC); } - + public UniformColorSprite(final float pX, final float pY, final float pWidth, final float pHeight, final ITextureRegion pTextureRegion, final VertexBufferObjectManager pVertexBufferObjectManager, final ShaderProgram pShaderProgram) { this(pX, pY, pWidth, pHeight, pTextureRegion, pVertexBufferObjectManager, DrawType.STATIC, pShaderProgram); } diff --git a/src/org/andengine/input/touch/detector/ClickDetector.java b/src/org/andengine/input/touch/detector/ClickDetector.java index 53eb95836..3d61ed6bd 100644 --- a/src/org/andengine/input/touch/detector/ClickDetector.java +++ b/src/org/andengine/input/touch/detector/ClickDetector.java @@ -105,7 +105,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { // =========================================================== // Methods // =========================================================== - + private void prepareClick(final TouchEvent pSceneTouchEvent) { this.mDownTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getDownTime(); this.mPointerID = pSceneTouchEvent.getPointerID(); diff --git a/src/org/andengine/input/touch/detector/ScrollDetector.java b/src/org/andengine/input/touch/detector/ScrollDetector.java index dca6f9fb2..673a7c021 100644 --- a/src/org/andengine/input/touch/detector/ScrollDetector.java +++ b/src/org/andengine/input/touch/detector/ScrollDetector.java @@ -22,7 +22,7 @@ public class ScrollDetector extends BaseDetector { private float mTriggerScrollMinimumDistance; private final IScrollDetectorListener mScrollDetectorListener; - + private int mPointerID = TouchEvent.INVALID_POINTER_ID; private boolean mTriggering; @@ -95,7 +95,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { } else { this.triggerOnScroll(distanceX, distanceY); } - + this.mLastX = touchX; this.mLastY = touchY; this.mTriggering = true; @@ -125,29 +125,29 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { // =========================================================== // Methods // =========================================================== - + private void prepareScroll(final int pPointerID, final float pTouchX, final float pTouchY) { this.mLastX = pTouchX; this.mLastY = pTouchY; this.mTriggering = false; this.mPointerID = pPointerID; } - + private void triggerOnScrollStarted(final float pDistanceX, final float pDistanceY) { if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mScrollDetectorListener.onScrollStarted(this, this.mPointerID, pDistanceX, pDistanceY); } } - + private void triggerOnScroll(final float pDistanceX, final float pDistanceY) { if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mScrollDetectorListener.onScroll(this, this.mPointerID, pDistanceX, pDistanceY); } } - + private void triggerOnScrollFinished(final float pDistanceX, final float pDistanceY) { this.mTriggering = false; - + if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mScrollDetectorListener.onScrollFinished(this, this.mPointerID, pDistanceX, pDistanceY); } diff --git a/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java b/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java index 3c5cc03d1..c2ed96b79 100644 --- a/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java +++ b/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java @@ -23,7 +23,7 @@ public class SurfaceGestureDetectorAdapter extends SurfaceGestureDetector { public SurfaceGestureDetectorAdapter(final Context pContext) { super(pContext); - } + } public SurfaceGestureDetectorAdapter(final Context pContext, final float pSwipeMinDistance) { super(pContext, pSwipeMinDistance); diff --git a/src/org/andengine/opengl/font/BitmapFont.java b/src/org/andengine/opengl/font/BitmapFont.java index b67e83a67..a4494987c 100644 --- a/src/org/andengine/opengl/font/BitmapFont.java +++ b/src/org/andengine/opengl/font/BitmapFont.java @@ -449,7 +449,7 @@ private static boolean getBooleanAttribute(final String[] pData, final int pPosi return Integer.parseInt(data.substring(attributeLength + 1)) != 0; } - + private static char getCharAttribute(final String[] pData, final int pPosition, final String pAttribute) { return (char) BitmapFont.getIntAttribute(pData, pPosition, pAttribute); } diff --git a/src/org/andengine/opengl/font/FontUtils.java b/src/org/andengine/opengl/font/FontUtils.java index d84153c3a..cffdb9259 100644 --- a/src/org/andengine/opengl/font/FontUtils.java +++ b/src/org/andengine/opengl/font/FontUtils.java @@ -334,7 +334,7 @@ private static > L splitLinesByWords(final IFont pF } return pResult; } - + private static > L splitLinesByCJK(final IFont pFont, final CharSequence pText, final L pResult, final float pAutoWrapWidth) { final int textLength = pText.length(); @@ -346,7 +346,7 @@ private static > L splitLinesByCJK(final IFont pFon lineStart++; lineEnd++; } - + int i = lineEnd; while(i < textLength) { lineStart = lineEnd; @@ -354,7 +354,7 @@ private static > L splitLinesByCJK(final IFont pFon { /* Look for a sub string */ boolean charsAvailable = true; while(i < textLength) { - + { /* Skip whitespaces at the end of the string */ int j = lineEnd; while ( j < textLength ) { @@ -373,7 +373,7 @@ private static > L splitLinesByCJK(final IFont pFon break; } } - + lineEnd++; final float lineWidth = FontUtils.measureText(pFont, pText, lineStart, lineEnd); @@ -382,7 +382,7 @@ private static > L splitLinesByCJK(final IFont pFon if ( lineStart < lineEnd - 1 ) { lineEnd--; } - + pResult.add(pText.subSequence(lineStart, lineEnd)); charsAvailable = false; i = lineEnd; diff --git a/src/org/andengine/opengl/font/StrokeFont.java b/src/org/andengine/opengl/font/StrokeFont.java index e30ab1864..bfc657fdd 100644 --- a/src/org/andengine/opengl/font/StrokeFont.java +++ b/src/org/andengine/opengl/font/StrokeFont.java @@ -33,7 +33,7 @@ public class StrokeFont extends Font { // =========================================================== // Constructors // =========================================================== - + public StrokeFont(final FontManager pFontManager, final ITexture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final Color pColor, final float pStrokeWidth, final Color pStrokeColor) { this(pFontManager, pTexture, pTypeface, pSize, pAntiAlias, pColor.getARGBPackedInt(), pStrokeWidth, pStrokeColor.getARGBPackedInt()); } @@ -48,7 +48,7 @@ public StrokeFont(final FontManager pFontManager, final ITexture pTexture, final public StrokeFont(final FontManager pFontManager, final ITexture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColorARGBPackedInt, final float pStrokeWidth, final int pStrokeColorARGBPackedInt, final boolean pStrokeOnly) { super(pFontManager, pTexture, pTypeface, pSize, pAntiAlias, pColorARGBPackedInt); - + this.mStrokeWidth = pStrokeWidth; this.mStrokePaint = new Paint(); diff --git a/src/org/andengine/opengl/shader/PositionColorShaderProgram.java b/src/org/andengine/opengl/shader/PositionColorShaderProgram.java index 73d450644..02b1844b0 100644 --- a/src/org/andengine/opengl/shader/PositionColorShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionColorShaderProgram.java @@ -88,7 +88,7 @@ public void bind(final GLState pGLState, final VertexBufferObjectAttributes pVer @Override public void unbind(final GLState pGLState) { GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_TEXTURECOORDINATES_LOCATION); - + super.unbind(pGLState); } diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java index 50584d7bc..5d60c210a 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java @@ -104,7 +104,7 @@ public void unbind(final GLState pGLState) { GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_POSITION_LOCATION); GLES20.glDisableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_POSITION_0_LOCATION); GLES20.glDisableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_POSITION_1_LOCATION); - + super.unbind(pGLState); } diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java index 7280a0b27..0033d41d1 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java @@ -92,7 +92,7 @@ public void bind(final GLState pGLState, final VertexBufferObjectAttributes pVer @Override public void unbind(final GLState pGLState) { GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_COLOR_LOCATION); - + super.unbind(pGLState); } diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java index ff0c61fbb..05914ad9b 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java @@ -95,7 +95,7 @@ public void bind(final GLState pGLState, final VertexBufferObjectAttributes pVer @Override public void unbind(final GLState pGLState) { GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_COLOR_LOCATION); - + super.unbind(pGLState); } diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java index 29157dace..2fa560734 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java @@ -33,7 +33,7 @@ public class PositionTextureCoordinatesUniformColorShaderProgram extends ShaderP public static final String FRAGMENTSHADER = "precision lowp float;\n" + "uniform sampler2D " + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ";\n" + - "uniform vec4 " + ShaderProgramConstants.UNIFORM_COLOR + ";\n" + + "uniform vec4 " + ShaderProgramConstants.UNIFORM_COLOR + ";\n" + "varying mediump vec2 " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ";\n" + "void main() {\n" + " gl_FragColor = " + ShaderProgramConstants.UNIFORM_COLOR + " * texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ", " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ");\n" + @@ -95,7 +95,7 @@ public void bind(final GLState pGLState, final VertexBufferObjectAttributes pVer @Override public void unbind(final GLState pGLState) { GLES20.glEnableVertexAttribArray(ShaderProgramConstants.ATTRIBUTE_COLOR_LOCATION); - + super.unbind(pGLState); } diff --git a/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java b/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java index 4c52629b2..8651b7013 100644 --- a/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java +++ b/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java @@ -11,7 +11,7 @@ public class ShaderProgramCompileException extends ShaderProgramException { // =========================================================== private static final long serialVersionUID = 8284346688949370359L; - + // =========================================================== // Fields // =========================================================== diff --git a/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java b/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java index cb2134679..d7fe66094 100644 --- a/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java +++ b/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java @@ -11,7 +11,7 @@ public class ShaderProgramLinkException extends ShaderProgramException { // =========================================================== private static final long serialVersionUID = 5418521931032742504L; - + // =========================================================== // Fields // =========================================================== diff --git a/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java b/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java index 4178cdd8a..30edfcea8 100644 --- a/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java +++ b/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java @@ -71,7 +71,7 @@ public static class CriteriaShaderSourceEntry { // =========================================================== // Constructors // =========================================================== - + public CriteriaShaderSourceEntry(final String pShaderSource) { this(pShaderSource, (IGLCriteria[]) null); } diff --git a/src/org/andengine/opengl/shader/source/StringShaderSource.java b/src/org/andengine/opengl/shader/source/StringShaderSource.java index e7b0fc6aa..73aec8752 100644 --- a/src/org/andengine/opengl/shader/source/StringShaderSource.java +++ b/src/org/andengine/opengl/shader/source/StringShaderSource.java @@ -22,7 +22,7 @@ public class StringShaderSource implements IShaderSource { // =========================================================== // Constructors // =========================================================== - + public StringShaderSource(final String pShaderSource) { this.mShaderSource = pShaderSource; } @@ -34,7 +34,7 @@ public StringShaderSource(final String pShaderSource) { // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== - + @Override public String getShaderSource(final GLState pGLState) { return this.mShaderSource; diff --git a/src/org/andengine/opengl/texture/DebugTextureStateListener.java b/src/org/andengine/opengl/texture/DebugTextureStateListener.java index f0f796379..f3c94a56e 100644 --- a/src/org/andengine/opengl/texture/DebugTextureStateListener.java +++ b/src/org/andengine/opengl/texture/DebugTextureStateListener.java @@ -48,7 +48,7 @@ public void onUnloadedFromHardware(final ITexture pTexture) { // =========================================================== // Methods // =========================================================== - + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/opengl/texture/TextureStateAdapter.java b/src/org/andengine/opengl/texture/TextureStateAdapter.java index c7cdcd486..2aabbc993 100644 --- a/src/org/andengine/opengl/texture/TextureStateAdapter.java +++ b/src/org/andengine/opengl/texture/TextureStateAdapter.java @@ -37,11 +37,11 @@ public void onLoadedToHardware(final ITexture pTexture) { public void onUnloadedFromHardware(final ITexture pTexture) { } - + // =========================================================== // Methods // =========================================================== - + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/opengl/texture/atlas/TextureAtlas.java b/src/org/andengine/opengl/texture/atlas/TextureAtlas.java index 4ca51bb19..8ac0faa6f 100644 --- a/src/org/andengine/opengl/texture/atlas/TextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/TextureAtlas.java @@ -74,7 +74,7 @@ public boolean hasTextureAtlasStateListener() { public ITextureAtlasStateListener getTextureStateListener() { return this.getTextureAtlasStateListener(); } - + @SuppressWarnings("unchecked") @Override public ITextureAtlasStateListener getTextureAtlasStateListener() { diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java index be24a14a6..313cdd307 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java @@ -121,7 +121,7 @@ public BitmapTextureFormat getBitmapTextureFormat() { // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== - + @Override public void addEmptyTextureAtlasSource(final int pTextureX, final int pTextureY, final int pWidth, final int pHeight) { this.addTextureAtlasSource(new EmptyBitmapTextureAtlasSource(pWidth, pHeight), pTextureX, pTextureY); diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java index a8cd7a337..29d9bafb7 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java @@ -25,7 +25,7 @@ public class EmptyBitmapTextureAtlasSource extends BaseTextureAtlasSource implem // =========================================================== // Constructors // =========================================================== - + public EmptyBitmapTextureAtlasSource(final int pTextureWidth, final int pTextureHeight) { this(0, 0, pTextureWidth, pTextureHeight); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java index a2ab5948f..4dae09740 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java @@ -37,7 +37,7 @@ public class FileBitmapTextureAtlasSource extends BaseTextureAtlasSource impleme // =========================================================== // Constructors // =========================================================== - + public static FileBitmapTextureAtlasSource create(final File pFile) { return FileBitmapTextureAtlasSource.create(pFile, 0, 0); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java index 2082a323e..5a63ce903 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java @@ -33,7 +33,7 @@ public abstract class PictureBitmapTextureAtlasSource extends BaseTextureAtlasSo public PictureBitmapTextureAtlasSource(final Picture pPicture) { this(pPicture, 0, 0); } - + public PictureBitmapTextureAtlasSource(final Picture pPicture, final int pTextureX, final int pTextureY) { this(pPicture, pTextureX, pTextureY, pPicture.getWidth(), pPicture.getHeight()); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java index b96f8bfdd..8f7d25747 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java @@ -35,7 +35,7 @@ public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final Color pColorKeyColor, final TextureAtlasSourceDecoratorOptions pTextureAtlasSourceDecoratorOptions) { super(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, pColorKeyColor, Color.TRANSPARENT, pTextureAtlasSourceDecoratorOptions); } - + public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final int pColorKeyColorARGBPackedInt, final TextureAtlasSourceDecoratorOptions pTextureAtlasSourceDecoratorOptions) { super(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, pColorKeyColorARGBPackedInt, Color.TRANSPARENT_ARGB_PACKED_INT, pTextureAtlasSourceDecoratorOptions); } @@ -43,7 +43,7 @@ public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final Color pColorKeyColor, final int pTolerance) { super(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, pColorKeyColor, pTolerance, Color.TRANSPARENT); } - + public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final int pColorKeyColorARGBPackedInt, final int pTolerance) { super(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, pColorKeyColorARGBPackedInt, pTolerance, Color.TRANSPARENT_ARGB_PACKED_INT); } @@ -51,7 +51,7 @@ public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final Color pColorKeyColor, final int pTolerance, final TextureAtlasSourceDecoratorOptions pTextureAtlasSourceDecoratorOptions) { super(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, pColorKeyColor, pTolerance, Color.TRANSPARENT, pTextureAtlasSourceDecoratorOptions); } - + public ColorKeyBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final int pColorKeyColorARGBPackedInt, final int pTolerance, final TextureAtlasSourceDecoratorOptions pTextureAtlasSourceDecoratorOptions) { super(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, pColorKeyColorARGBPackedInt, pTolerance, Color.TRANSPARENT_ARGB_PACKED_INT, pTextureAtlasSourceDecoratorOptions); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java index be6402bd8..04369da2a 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java @@ -19,7 +19,7 @@ public class RadialGradientFillBitmapTextureAtlasSourceDecorator extends BaseSha // =========================================================== // Constants // =========================================================== - + private static final float[] POSITIONS_DEFAULT = new float[] { 0.0f, 1.0f }; // =========================================================== diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java index 0c061f9ce..5d4170fc8 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java @@ -45,7 +45,7 @@ public static CircleBitmapTextureAtlasSourceDecoratorShape getDefaultInstance() // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== - + @Override public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final TextureAtlasSourceDecoratorOptions pDecoratorOptions) { final float width = pCanvas.getWidth() - pDecoratorOptions.getInsetLeft() - pDecoratorOptions.getInsetRight(); diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java index e2a68fa8b..a8fdca1b7 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java @@ -57,7 +57,7 @@ public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final Tex final float bottom = pCanvas.getHeight() - pDecoratorOptions.getInsetBottom(); this.mRectF.set(left, top, right, bottom); - + pCanvas.drawOval(this.mRectF, pPaint); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java index 33b993b34..0a2b58507 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java @@ -45,7 +45,7 @@ public void onDecorateBitmap(final Canvas pCanvas, final Paint pPaint, final Tex final float top = pDecoratorOptions.getInsetTop(); final float right = pCanvas.getWidth() - pDecoratorOptions.getInsetRight(); final float bottom = pCanvas.getHeight() - pDecoratorOptions.getInsetBottom(); - + pCanvas.drawRect(left, top, right, bottom, pPaint); } diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java index 86ad5ba98..44b70c771 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java @@ -184,7 +184,7 @@ public boolean hasTextureAtlasStateListener() { public ITextureAtlasStateListener getTextureStateListener() { return this.mTextureAtlas.getTextureStateListener(); } - + @Override public ITextureAtlasStateListener getTextureAtlasStateListener() { return this.mTextureAtlas.getTextureAtlasStateListener(); diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java index 91252f73e..83207935f 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java @@ -66,14 +66,14 @@ public static > TiledT public void onCallback(final T pCallbackValue) { final int tileWidth = pTextureAtlasSource.getTextureWidth() / pTileColumns; final int tileHeight = pTextureAtlasSource.getTextureHeight() / pTileRows; - + for(int tileColumn = 0; tileColumn < pTileColumns; tileColumn++) { for(int tileRow = 0; tileRow < pTileRows; tileRow++) { final int tileIndex = tileRow * pTileColumns + tileColumn; final int x = pCallbackValue.getTextureX() + tileColumn * tileWidth; final int y = pCallbackValue.getTextureY() + tileRow * tileHeight; - + tiledTextureRegion.setTexturePosition(tileIndex, x, y); } } diff --git a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java index 7ca52f4ac..b4beb5c03 100644 --- a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java +++ b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java @@ -65,7 +65,7 @@ public ETC1Texture(final TextureManager pTextureManager, final TextureOptions pT this.mETC1TextureHeader = new ETC1TextureHeader(StreamUtils.streamToBytes(inputStream, ETC1.ETC_PKM_HEADER_SIZE)); - if(BuildConfig.DEBUG) { + if(BuildConfig.DEBUG) { if(!(MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mWidth) && MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mHeight))) { Debug.w("ETC1 textures with NPOT sizes can cause a crash on PowerVR GPUs!"); } diff --git a/src/org/andengine/opengl/texture/region/BaseTextureRegion.java b/src/org/andengine/opengl/texture/region/BaseTextureRegion.java index 56357362a..9273b84ae 100644 --- a/src/org/andengine/opengl/texture/region/BaseTextureRegion.java +++ b/src/org/andengine/opengl/texture/region/BaseTextureRegion.java @@ -27,7 +27,7 @@ public abstract class BaseTextureRegion implements ITextureRegion { public BaseTextureRegion(final ITexture pTexture) { this.mTexture = pTexture; } - + @Override public abstract ITextureRegion deepCopy(); diff --git a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java index fd4d05097..328e3cadb 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java @@ -37,7 +37,7 @@ public class TextureRegionFactory { // =========================================================== // Methods // =========================================================== - + public static TextureRegion extractFromTexture(final ITexture pTexture) { return TextureRegionFactory.extractFromTexture(pTexture, false); } diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index f0e7afde2..972a70a7e 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -180,7 +180,7 @@ public boolean enableScissorTest() { if(this.mScissorTestEnabled) { return true; } - + this.mScissorTestEnabled = true; GLES20.glEnable(GLES20.GL_SCISSOR_TEST); return false; @@ -394,11 +394,11 @@ public void deleteArrayBuffer(final int pHardwareBufferID) { public int generateIndexBuffer(final int pSize, final int pUsage) { GLES20.glGenBuffers(1, this.mHardwareIDContainer, 0); final int hardwareBufferID = this.mHardwareIDContainer[0]; - + this.bindIndexBuffer(hardwareBufferID); GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, pSize, null, pUsage); this.bindIndexBuffer(0); - + return hardwareBufferID; } diff --git a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java index df7b8acd8..15348865c 100644 --- a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java @@ -49,7 +49,7 @@ public HighPerformanceVertexBufferObject(final VertexBufferObjectManager pVertex public HighPerformanceVertexBufferObject(final VertexBufferObjectManager pVertexBufferObjectManager, final float[] pBufferData, final DrawType pDrawType, final boolean pAutoDispose, final VertexBufferObjectAttributes pVertexBufferObjectAttributes) { super(pVertexBufferObjectManager, pBufferData.length, pDrawType, pAutoDispose, pVertexBufferObjectAttributes); this.mBufferData = pBufferData; - + if(SystemUtils.SDK_VERSION_HONEYCOMB_OR_LATER) { this.mFloatBuffer = this.mByteBuffer.asFloatBuffer(); } else { diff --git a/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java index 2de8b26e2..b6c6e71e8 100644 --- a/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java @@ -74,7 +74,7 @@ public void dispose() { try { SharedMemoryVertexBufferObject.sSharedByteBufferLock.lock(); - + if(SharedMemoryVertexBufferObject.sSharedByteBuffer != null) { BufferUtils.freeDirectByteBuffer(SharedMemoryVertexBufferObject.sSharedByteBuffer); diff --git a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java index 3617267c7..4da8df9b4 100644 --- a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java @@ -156,7 +156,7 @@ public void bind(final GLState pGLState) { byteBuffer = this.aquireByteBuffer(); this.onPopulateBufferData(byteBuffer); - + GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, byteBuffer.limit(), byteBuffer, this.mUsage); } finally { if(byteBuffer != null) { diff --git a/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java b/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java index 201a8b01d..3c66090de 100644 --- a/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java @@ -88,7 +88,7 @@ public void onCallback(final Void pCallbackValue) { } }); } - + @Override public void onPopulateScene(final Scene pScene, final OnPopulateSceneCallback pOnPopulateSceneCallback) { this.runOnUiThread(new Runnable() { @@ -98,11 +98,11 @@ public void run() { @Override public Void call(final IProgressListener pProgressListener) throws Exception { SimpleAsyncGameActivity.this.onPopulateSceneAsync(pScene, pProgressListener); - + pProgressListener.onProgressChanged(100); - + pOnPopulateSceneCallback.onPopulateSceneFinished(); - + return null; } }, new Callback() { diff --git a/src/org/andengine/util/ActivityUtils.java b/src/org/andengine/util/ActivityUtils.java index e46f952dd..bc5e4008a 100644 --- a/src/org/andengine/util/ActivityUtils.java +++ b/src/org/andengine/util/ActivityUtils.java @@ -160,7 +160,7 @@ public void onPostExecute(final T result) { } }.execute((Void[]) null); } - + public static final void doProgressAsync(final Context pContext, final int pTitleResourceID, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback) { ActivityUtils.doProgressAsync(pContext, pTitleResourceID, pIconResourceID, pCallable, pCallback, null); } diff --git a/src/org/andengine/util/adt/bounds/FloatBounds.java b/src/org/andengine/util/adt/bounds/FloatBounds.java index a4ceb5e25..a65292fec 100644 --- a/src/org/andengine/util/adt/bounds/FloatBounds.java +++ b/src/org/andengine/util/adt/bounds/FloatBounds.java @@ -25,7 +25,7 @@ public class FloatBounds implements IFloatBounds { // =========================================================== // Constructors // =========================================================== - + public FloatBounds(final float pX, final float pY) { this.set(pX, pY); } @@ -42,7 +42,7 @@ public FloatBounds(final float pXMin, final float pYMin, final float pXMax, fina public float getXMin() { return this.mXMin; } - + @Override public float getYMin() { return this.mYMin; diff --git a/src/org/andengine/util/adt/bounds/IntBounds.java b/src/org/andengine/util/adt/bounds/IntBounds.java index 81b16bbfe..72edb2859 100644 --- a/src/org/andengine/util/adt/bounds/IntBounds.java +++ b/src/org/andengine/util/adt/bounds/IntBounds.java @@ -25,7 +25,7 @@ public class IntBounds implements IIntBounds { // =========================================================== // Constructors // =========================================================== - + public IntBounds(final int pX, final int pY) { this.set(pX, pY); } @@ -42,7 +42,7 @@ public IntBounds(final int pXMin, final int pYMin, final int pXMax, final int pY public int getXMin() { return this.mXMin; } - + @Override public int getYMin() { return this.mYMin; diff --git a/src/org/andengine/util/adt/color/Color.java b/src/org/andengine/util/adt/color/Color.java index ed01054f6..d26581eb3 100644 --- a/src/org/andengine/util/adt/color/Color.java +++ b/src/org/andengine/util/adt/color/Color.java @@ -60,7 +60,7 @@ public class Color { public static final float BLUE_ABGR_PACKED_FLOAT = Color.BLUE.getABGRPackedFloat(); public static final float PINK_ABGR_PACKED_FLOAT = Color.PINK.getABGRPackedFloat(); public static final float TRANSPARENT_ABGR_PACKED_FLOAT = Color.TRANSPARENT.getABGRPackedFloat(); - + public static final int WHITE_ARGB_PACKED_INT = Color.WHITE.getARGBPackedInt(); public static final int BLACK_ARGB_PACKED_INT = Color.BLACK.getARGBPackedInt(); public static final int RED_ARGB_PACKED_INT = Color.RED.getARGBPackedInt(); diff --git a/src/org/andengine/util/adt/list/CircularList.java b/src/org/andengine/util/adt/list/CircularList.java index 0cfeb6392..adbd351bf 100644 --- a/src/org/andengine/util/adt/list/CircularList.java +++ b/src/org/andengine/util/adt/list/CircularList.java @@ -144,7 +144,7 @@ public void add(final int pIndex, final T pItem) { public T removeFirst() { return this.remove(0); } - + @Override public T removeLast() { return this.remove(this.size() - 1); diff --git a/src/org/andengine/util/adt/list/ShiftList.java b/src/org/andengine/util/adt/list/ShiftList.java index 0420f185a..dead363b9 100644 --- a/src/org/andengine/util/adt/list/ShiftList.java +++ b/src/org/andengine/util/adt/list/ShiftList.java @@ -185,7 +185,7 @@ public void add(final int pIndex, final T pItem) throws ArrayIndexOutOfBoundsExc public T removeFirst() { return this.remove(0); } - + @Override public T removeLast() { return this.remove(this.size() - 1); diff --git a/src/org/andengine/util/adt/map/SparseArrayUtils.java b/src/org/andengine/util/adt/map/SparseArrayUtils.java index f17674a0c..7999636e3 100644 --- a/src/org/andengine/util/adt/map/SparseArrayUtils.java +++ b/src/org/andengine/util/adt/map/SparseArrayUtils.java @@ -192,33 +192,33 @@ public static final String toString(final LongSparseArray pLongSparseArray) { public static final BooleanArrayList valuesToList(final SparseBooleanArray pSparseBooleanArray) { final int size = pSparseBooleanArray.size(); final BooleanArrayList result = new BooleanArrayList(size); - + for (int i = 0; i < size; i++) { result.add(pSparseBooleanArray.valueAt(i)); } - + return result; } public static final ByteArrayList valuesToList(final SparseByteArray pSparseByteArray) { final int size = pSparseByteArray.size(); final ByteArrayList result = new ByteArrayList(size); - + for (int i = 0; i < size; i++) { result.add(pSparseByteArray.valueAt(i)); } - + return result; } public static final CharArrayList valuesToList(final SparseCharArray pSparseCharArray) { final int size = pSparseCharArray.size(); final CharArrayList result = new CharArrayList(size); - + for (int i = 0; i < size; i++) { result.add(pSparseCharArray.valueAt(i)); } - + return result; } diff --git a/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java b/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java index 377008824..8c87b8e07 100644 --- a/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java +++ b/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java @@ -33,7 +33,7 @@ public final class FloatBoundsUtils { // =========================================================== // Methods // =========================================================== - + public static final boolean intersects(final IFloatBounds pFloatBoundsA, final IFloatBounds pFloatBoundsB) { return FloatBoundsUtils.intersects(pFloatBoundsA.getXMin(), pFloatBoundsA.getYMin(), pFloatBoundsA.getXMax(), pFloatBoundsA.getYMax(), pFloatBoundsB.getXMin(), pFloatBoundsB.getYMin(), pFloatBoundsB.getXMax(), pFloatBoundsB.getYMax()); } @@ -47,7 +47,7 @@ public static final boolean intersects(final float pXMinA, final float pYMinA, f public static final boolean contains(final IFloatBounds pFloatBounds, final float pX, final float pY) { return FloatBoundsUtils.contains(pFloatBounds.getXMin(), pFloatBounds.getYMin(), pFloatBounds.getXMax(), pFloatBounds.getYMax(), pX, pY); } - + public static final boolean contains(final IFloatBounds pFloatBoundsA, final IFloatBounds pFloatBoundsB) { return FloatBoundsUtils.contains(pFloatBoundsA.getXMin(), pFloatBoundsA.getYMin(), pFloatBoundsA.getXMax(), pFloatBoundsA.getYMax(), pFloatBoundsB.getXMin(), pFloatBoundsB.getYMin(), pFloatBoundsB.getXMax(), pFloatBoundsB.getYMax()); } diff --git a/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java b/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java index 4845d14e8..6035db38f 100644 --- a/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java +++ b/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java @@ -33,7 +33,7 @@ public final class IntBoundsUtils { // =========================================================== // Methods // =========================================================== - + public static final boolean intersects(final IIntBounds pIntBoundsA, final IIntBounds pIntBoundsB) { return IntBoundsUtils.intersects(pIntBoundsA.getXMin(), pIntBoundsA.getYMin(), pIntBoundsA.getXMax(), pIntBoundsA.getYMax(), pIntBoundsB.getXMin(), pIntBoundsB.getYMin(), pIntBoundsB.getXMax(), pIntBoundsB.getYMax()); } @@ -43,15 +43,15 @@ public static final boolean intersects(final int pXMinA, final int pYMinA, final || IntBoundsUtils.contains(pXMinA, pYMinA, pXMaxA, pYMaxA, pXMinB, pYMinB, pXMaxB, pYMaxB) || IntBoundsUtils.contains(pXMinB, pYMinB, pXMaxB, pYMaxB, pXMinA, pYMinA, pXMaxA, pYMaxA); } - + public static final boolean contains(final IIntBounds pIntBoundsA, final IIntBounds pIntBoundsB) { return IntBoundsUtils.contains(pIntBoundsA.getXMin(), pIntBoundsA.getYMin(), pIntBoundsA.getXMax(), pIntBoundsA.getYMax(), pIntBoundsB.getXMin(), pIntBoundsB.getYMin(), pIntBoundsB.getXMax(), pIntBoundsB.getYMax()); } - + public static final boolean contains(final IIntBounds pIntBounds, final int pX, final int pY) { return IntBoundsUtils.contains(pIntBounds.getXMin(), pIntBounds.getYMin(), pIntBounds.getXMax(), pIntBounds.getYMax(), pX, pY); } - + public static final boolean contains(final IIntBounds pIntBounds, final int pXMin, final int pYMin, final int pXMax, final int pYMax) { return IntBoundsUtils.contains(pIntBounds.getXMin(), pIntBounds.getYMin(), pIntBounds.getXMax(), pIntBounds.getYMax(), pXMin, pYMin, pXMax, pYMax); } diff --git a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java index bb9b63a4f..bd7dd5449 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java @@ -325,10 +325,10 @@ private float getYMin(final BoundsSplit pBoundsSplit) { throw new IllegalArgumentException("Unexpected " + BoundsSplit.class.getSimpleName() + ": '" + pBoundsSplit + "'."); } } - + private float getXMax(final BoundsSplit pBoundsSplit) { final float halfWidth = this.getWidth() / 2; - + switch(pBoundsSplit) { case TOP_LEFT: return this.mXMin + halfWidth; diff --git a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java index c80f66930..94e3932f4 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java @@ -212,7 +212,7 @@ public IntQuadTreeNode(final int pLevel, final int pXMin, final int pYMin, final public int getXMin() { return this.mXMin; } - + @Override public int getYMin() { return this.mYMin; @@ -330,11 +330,11 @@ private int getXMin(final BoundsSplit pBoundsSplit) { } } } - + private int getYMin(final BoundsSplit pBoundsSplit) { final int height = this.getHeight(); final int halfHeight = height / 2; - + if(height <= 2) { switch(pBoundsSplit) { case TOP_LEFT: diff --git a/src/org/andengine/util/adt/transformation/TransformationPool.java b/src/org/andengine/util/adt/transformation/TransformationPool.java index b7a0ba982..5201324e7 100644 --- a/src/org/andengine/util/adt/transformation/TransformationPool.java +++ b/src/org/andengine/util/adt/transformation/TransformationPool.java @@ -17,7 +17,7 @@ public class TransformationPool { // =========================================================== // Fields // =========================================================== - + private static final GenericPool POOL = new GenericPool() { @Override protected Transformation onAllocatePoolItem() { @@ -36,11 +36,11 @@ protected Transformation onAllocatePoolItem() { // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== - + public static Transformation obtain() { return POOL.obtainPoolItem(); } - + public static void recycle(final Transformation pTransformation) { pTransformation.setToIdentity(); POOL.recyclePoolItem(pTransformation); diff --git a/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java index 89f44a8f3..d41e373e9 100644 --- a/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java +++ b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java @@ -44,7 +44,7 @@ public class EntityCollisionChecker { // =========================================================== // Methods // =========================================================== - + public static boolean checkContains(final float pLocalX, final float pLocalY, final float pLocalWidth, final float pLocalHeight, final Transformation pLocalToSceneTransformation, final float pX, final float pY) { EntityCollisionChecker.fillVertices(pLocalX, pLocalY, pLocalWidth, pLocalHeight, pLocalToSceneTransformation, EntityCollisionChecker.VERTICES_CONTAINS_TMP); return BaseCollisionChecker.checkContains(EntityCollisionChecker.VERTICES_CONTAINS_TMP, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, pX, pY); @@ -70,7 +70,7 @@ public static boolean isVisible(final Camera pCamera, final IEntity pEntity) { public static boolean isVisible(final Camera pCamera, final float pX, final float pY, final float pWidth, final float pHeight, final Transformation pLocalToSceneTransformation) { EntityCollisionChecker.fillVertices(pCamera, EntityCollisionChecker.VERTICES_COLLISION_TMP_A); EntityCollisionChecker.fillVertices(pX, pY, pWidth, pHeight, pLocalToSceneTransformation, EntityCollisionChecker.VERTICES_COLLISION_TMP_B); - + return BaseCollisionChecker.checkCollision(EntityCollisionChecker.VERTICES_COLLISION_TMP_A, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT, EntityCollisionChecker.VERTICES_COLLISION_TMP_B, EntityCollisionChecker.RECTANGULARSHAPE_VERTEX_COUNT); } diff --git a/src/org/andengine/util/algorithm/hull/HullUtils.java b/src/org/andengine/util/algorithm/hull/HullUtils.java index 7b1fc44f1..036022aa7 100644 --- a/src/org/andengine/util/algorithm/hull/HullUtils.java +++ b/src/org/andengine/util/algorithm/hull/HullUtils.java @@ -38,11 +38,11 @@ public static int indexOfLowestVertex(final float[] pVertices, final int pVertex float lowestVertexY = pVertices[pVertexOffsetY]; final int lastVertexOffset = pVertexCount * pVertexStride; - + /* Starting at one since, since we chose 0 as a the first candidate. */ int currentVertexIndex = 1; int currentVertexOffsetY = pVertexStride + pVertexOffsetY; - + /* Loop to the end. */ while(currentVertexOffsetY < lastVertexOffset) { final float currentVertexY = pVertices[currentVertexOffsetY]; diff --git a/src/org/andengine/util/algorithm/hull/JarvisMarch.java b/src/org/andengine/util/algorithm/hull/JarvisMarch.java index 3800a4b5f..6c5514238 100644 --- a/src/org/andengine/util/algorithm/hull/JarvisMarch.java +++ b/src/org/andengine/util/algorithm/hull/JarvisMarch.java @@ -79,7 +79,7 @@ private int jarvisMarch(final float[] pVertices, final int pVertexCount, final i if(currentHullPointVertexX != possibleNextHullVertexX || currentHullPointVertexY != possibleNextHullVertexY) { final float dX = possibleNextHullVertexX - currentHullPointVertexX; final float dY = possibleNextHullVertexY - currentHullPointVertexY; - + float possibleNextHullVertexAngle = MathUtils.atan2(dY, dX); if(possibleNextHullVertexAngle < 0) { possibleNextHullVertexAngle += MathConstants.PI_TWICE; /* 360 degrees. */ diff --git a/src/org/andengine/util/algorithm/path/IPathFinder.java b/src/org/andengine/util/algorithm/path/IPathFinder.java index 5e1e9321d..c7c3fb925 100644 --- a/src/org/andengine/util/algorithm/path/IPathFinder.java +++ b/src/org/andengine/util/algorithm/path/IPathFinder.java @@ -25,16 +25,16 @@ public interface IPathFinder { // =========================================================== // Inner and Anonymous Classes // =========================================================== - + public interface IPathFinderListener { // =========================================================== // Constants // =========================================================== - + // =========================================================== // Fields // =========================================================== - + public void onVisited(final T pEntity, final int pX, final int pY); } } diff --git a/src/org/andengine/util/debug/DebugTimer.java b/src/org/andengine/util/debug/DebugTimer.java index c68a1caef..ad529152b 100644 --- a/src/org/andengine/util/debug/DebugTimer.java +++ b/src/org/andengine/util/debug/DebugTimer.java @@ -193,7 +193,7 @@ public void dump(final int pIndent, final String pPostfix) { } else { final ArrayList children = this.mChildren; final int childCount = children.size(); - + Debug.log(DebugTimer.this.mDebugLevel, new String(indent) + "'" + this.mLabel + "' {"); for(int i = 0; i < childCount - 1; i++) { children.get(i).dump(pIndent + 1, ","); diff --git a/src/org/andengine/util/level/LevelLoader.java b/src/org/andengine/util/level/LevelLoader.java index c77c19272..cb5bf070c 100644 --- a/src/org/andengine/util/level/LevelLoader.java +++ b/src/org/andengine/util/level/LevelLoader.java @@ -42,7 +42,7 @@ public abstract class LevelLoader pDefaultEntityLoader) { this.mDefaultEntityLoader = pDefaultEntityLoader; } @@ -106,7 +106,7 @@ public R loadLevelFromStream(final InputStream pInputStream) throws LevelLoaderE public R loadLevelFromStream(final InputStream pInputStream, final L pEntityLoaderListener) throws LevelLoaderException { final T entityLoaderData = this.onCreateEntityLoaderData(); - + return this.loadLevelFromStream(pInputStream, entityLoaderData, pEntityLoaderListener); } diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java index 2bec04df3..05d9a62ef 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java @@ -25,11 +25,11 @@ public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler pDefaultEntityLoader, final HashMap> pEntityLoaders, SimpleLevelEntityLoaderData pEntityLoaderData) { super(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderData); } - + // =========================================================== // Getter & Setter // =========================================================== diff --git a/src/org/andengine/util/mime/MIMEType.java b/src/org/andengine/util/mime/MIMEType.java index 7544f0bf7..6308b50f2 100644 --- a/src/org/andengine/util/mime/MIMEType.java +++ b/src/org/andengine/util/mime/MIMEType.java @@ -24,7 +24,7 @@ public enum MIMEType { // =========================================================== // Fields // =========================================================== - + private final String mTypeString; // =========================================================== diff --git a/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java b/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java index c7a008994..e365bbf9b 100644 --- a/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java +++ b/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java @@ -109,7 +109,7 @@ public void reset(final float pDuration, final float pFromValue, final float pTo // =========================================================== // Methods // =========================================================== - + public void reset(final float pDuration, final float pFromValueA, final float pToValueA, final float pFromValueB, final float pToValueB) { super.reset(pDuration, pFromValueA, pToValueA); diff --git a/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java b/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java index 8ef1eecf5..4bdddcb6f 100644 --- a/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java +++ b/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java @@ -90,10 +90,10 @@ protected void onManagedUpdate(final float pSecondsElapsed, final T pItem) { // =========================================================== // Methods // =========================================================== - + public void reset(final float pDuration, final float pFromValue, final float pToValue) { super.reset(); - + this.mDuration = pDuration; this.mFromValue = pFromValue; this.mValueSpan = pToValue - pFromValue; diff --git a/src/org/andengine/util/texturepack/TexturePackParser.java b/src/org/andengine/util/texturepack/TexturePackParser.java index 3f42ca6de..bd8034546 100644 --- a/src/org/andengine/util/texturepack/TexturePackParser.java +++ b/src/org/andengine/util/texturepack/TexturePackParser.java @@ -130,7 +130,7 @@ public void startElement(final String pUri, final String pLocalName, final Strin final int y = SAXUtils.getIntAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTUREREGION_ATTRIBUTE_Y); final int width = SAXUtils.getIntAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTUREREGION_ATTRIBUTE_WIDTH); final int height = SAXUtils.getIntAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTUREREGION_ATTRIBUTE_HEIGHT); - + final String source = SAXUtils.getAttributeOrThrow(pAttributes, TAG_TEXTUREREGION_ATTRIBUTE_SOURCE); // TODO Not sure how trimming could be transparently supported... @@ -150,7 +150,7 @@ public void startElement(final String pUri, final String pLocalName, final Strin // =========================================================== // Methods // =========================================================== - + protected InputStream onGetInputStream(final String pFilename) throws IOException { return this.mAssetManager.open(this.mAssetBasePath + pFilename); } From cbc0c5091f163d23e53921740523995cbfcfe781 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 10 Feb 2013 14:24:47 -0800 Subject: [PATCH 110/252] Formatting. --- src/org/andengine/AndEngine.java | 2 +- src/org/andengine/audio/BaseAudioEntity.java | 2 +- src/org/andengine/audio/BaseAudioManager.java | 4 +- .../andengine/audio/music/MusicFactory.java | 2 +- src/org/andengine/audio/sound/Sound.java | 12 +- .../andengine/audio/sound/SoundFactory.java | 2 +- .../andengine/audio/sound/SoundManager.java | 6 +- src/org/andengine/engine/Engine.java | 80 +++--- .../andengine/engine/LimitedFPSEngine.java | 2 +- .../andengine/engine/camera/BoundCamera.java | 18 +- src/org/andengine/engine/camera/Camera.java | 62 ++--- .../andengine/engine/camera/SmoothCamera.java | 18 +- .../andengine/engine/camera/ZoomCamera.java | 18 +- .../hud/controls/AnalogOnScreenControl.java | 2 +- .../hud/controls/BaseOnScreenControl.java | 12 +- .../hud/controls/DigitalOnScreenControl.java | 34 +-- .../engine/handler/DrawHandlerList.java | 2 +- .../engine/handler/UpdateHandlerList.java | 4 +- .../handler/collision/CollisionHandler.java | 6 +- .../handler/physics/PhysicsHandler.java | 8 +- .../handler/runnable/RunnableHandler.java | 2 +- .../engine/handler/timer/TimerHandler.java | 8 +- .../RatioResolutionPolicy.java | 2 +- .../DoubleSceneSplitScreenEngine.java | 12 +- .../SingleSceneSplitScreenEngine.java | 6 +- src/org/andengine/entity/Entity.java | 166 ++++++------ src/org/andengine/entity/ZIndexSorter.java | 2 +- src/org/andengine/entity/clip/ClipEntity.java | 2 +- .../entity/modifier/AlphaModifier.java | 2 +- .../modifier/CardinalSplineMoveModifier.java | 4 +- .../entity/modifier/ColorModifier.java | 2 +- .../entity/modifier/DelayModifier.java | 2 +- .../entity/modifier/MoveByModifier.java | 2 +- .../entity/modifier/MoveModifier.java | 2 +- .../entity/modifier/MoveXModifier.java | 2 +- .../entity/modifier/MoveYModifier.java | 2 +- .../entity/modifier/PathModifier.java | 14 +- .../entity/modifier/RotationAtModifier.java | 2 +- .../entity/modifier/RotationByModifier.java | 2 +- .../entity/modifier/RotationModifier.java | 2 +- .../entity/modifier/ScaleAtModifier.java | 2 +- .../entity/modifier/ScaleModifier.java | 2 +- .../entity/modifier/SkewModifier.java | 2 +- .../entity/modifier/SkewXModifier.java | 2 +- .../entity/modifier/SkewYModifier.java | 2 +- .../BatchedPseudoSpriteParticleSystem.java | 2 +- .../particle/BatchedSpriteParticleSystem.java | 2 +- .../particle/BlendFunctionParticleSystem.java | 4 +- .../andengine/entity/particle/Particle.java | 6 +- .../entity/particle/ParticleSystem.java | 24 +- .../BaseDoubleValueParticleInitializer.java | 2 +- .../BaseSingleValueParticleInitializer.java | 2 +- .../BaseTripleValueParticleInitializer.java | 2 +- .../BaseSingleValueSpanParticleModifier.java | 2 +- .../OffCameraExpireParticleModifier.java | 2 +- .../andengine/entity/primitive/Gradient.java | 18 +- src/org/andengine/entity/primitive/Line.java | 2 +- src/org/andengine/entity/primitive/Mesh.java | 4 +- ...PerformanceGradientVertexBufferObject.java | 2 +- ...HighPerformanceMeshVertexBufferObject.java | 2 +- .../LowMemoryGradientVertexBufferObject.java | 2 +- .../andengine/entity/scene/CameraScene.java | 6 +- src/org/andengine/entity/scene/Scene.java | 74 +++--- .../entity/scene/background/Background.java | 10 +- .../scene/background/ParallaxBackground.java | 8 +- .../modifier/ColorBackgroundModifier.java | 2 +- .../entity/scene/menu/MenuScene.java | 18 +- .../menu/animator/AlphaMenuSceneAnimator.java | 2 +- .../animator/InstantMenuSceneAnimator.java | 2 +- .../menu/animator/MenuSceneAnimator.java | 10 +- .../menu/animator/SlideMenuSceneAnimator.java | 4 +- src/org/andengine/entity/shape/Shape.java | 8 +- .../entity/sprite/AnimatedSprite.java | 26 +- .../entity/sprite/AnimationData.java | 10 +- .../andengine/entity/sprite/ButtonSprite.java | 22 +- src/org/andengine/entity/sprite/Sprite.java | 6 +- .../sprite/batch/DynamicSpriteBatch.java | 2 +- .../entity/sprite/batch/SpriteBatch.java | 28 +- .../entity/sprite/batch/SpriteGroup.java | 10 +- ...formanceSpriteBatchVertexBufferObject.java | 4 +- ...owMemorySpriteBatchVertexBufferObject.java | 4 +- ...rmanceDiamondSpriteVertexBufferObject.java | 8 +- ...ghPerformanceSpriteVertexBufferObject.java | 8 +- ...formanceTiledSpriteVertexBufferObject.java | 14 +- ...anceUncoloredSpriteVertexBufferObject.java | 8 +- ...eUniformColorSpriteVertexBufferObject.java | 8 +- ...MemoryDiamondSpriteVertexBufferObject.java | 8 +- .../LowMemorySpriteVertexBufferObject.java | 8 +- ...owMemoryTiledSpriteVertexBufferObject.java | 14 +- ...moryUncoloredSpriteVertexBufferObject.java | 8 +- ...yUniformColorSpriteVertexBufferObject.java | 8 +- src/org/andengine/entity/text/Text.java | 6 +- src/org/andengine/entity/text/TickerText.java | 8 +- ...HighPerformanceTextVertexBufferObject.java | 10 +- .../vbo/LowMemoryTextVertexBufferObject.java | 10 +- .../entity/util/AverageFPSCounter.java | 2 +- src/org/andengine/entity/util/FPSLogger.java | 2 +- .../entity/util/FrameCountCrasher.java | 6 +- .../andengine/entity/util/MemoryLogger.java | 16 +- .../andengine/entity/util/ScreenGrabber.java | 2 +- .../sensor/orientation/OrientationData.java | 4 +- .../input/touch/controller/MultiTouch.java | 4 +- .../controller/MultiTouchController.java | 4 +- .../input/touch/detector/BaseDetector.java | 2 +- .../input/touch/detector/ClickDetector.java | 10 +- .../detector/ContinuousHoldDetector.java | 18 +- .../input/touch/detector/HoldDetector.java | 36 +-- .../touch/detector/PinchZoomDetector.java | 14 +- .../input/touch/detector/ScrollDetector.java | 22 +- .../detector/SurfaceGestureDetector.java | 10 +- src/org/andengine/opengl/GLES20Fix.java | 8 +- .../opengl/exception/GLException.java | 2 +- src/org/andengine/opengl/font/BitmapFont.java | 62 ++--- src/org/andengine/opengl/font/Font.java | 26 +- .../andengine/opengl/font/FontFactory.java | 2 +- .../andengine/opengl/font/FontLibrary.java | 4 +- .../andengine/opengl/font/FontManager.java | 36 +-- src/org/andengine/opengl/font/FontUtils.java | 56 ++-- src/org/andengine/opengl/font/Letter.java | 12 +- src/org/andengine/opengl/font/StrokeFont.java | 2 +- .../shader/PositionColorShaderProgram.java | 2 +- ...nColorTextureCoordinatesShaderProgram.java | 2 +- ...terpolationTextureSelectShaderProgram.java | 2 +- ...sitionTextureCoordinatesShaderProgram.java | 2 +- ...CoordinatesTextureSelectShaderProgram.java | 4 +- ...eCoordinatesUniformColorShaderProgram.java | 2 +- .../opengl/shader/ShaderProgram.java | 46 ++-- .../opengl/shader/ShaderProgramManager.java | 12 +- .../shader/source/CriteriaShaderSource.java | 10 +- .../texture/DebugTextureStateListener.java | 4 +- src/org/andengine/opengl/texture/Texture.java | 4 +- .../opengl/texture/TextureManager.java | 72 ++--- .../opengl/texture/atlas/ITextureAtlas.java | 4 +- .../opengl/texture/atlas/TextureAtlas.java | 20 +- .../atlas/bitmap/BitmapTextureAtlas.java | 14 +- ...itmapTextureAtlasTextureRegionFactory.java | 2 +- .../PictureBitmapTextureAtlasSource.java | 2 +- ...BaseBitmapTextureAtlasSourceDecorator.java | 2 +- ...hapeBitmapTextureAtlasSourceDecorator.java | 2 +- ...FillBitmapTextureAtlasSourceDecorator.java | 2 +- ...itmapTextureAtlasSourceDecoratorShape.java | 2 +- ...itmapTextureAtlasSourceDecoratorShape.java | 2 +- ...itmapTextureAtlasSourceDecoratorShape.java | 2 +- ...itmapTextureAtlasSourceDecoratorShape.java | 2 +- ...itmapTextureAtlasSourceDecoratorShape.java | 2 +- .../buildable/BuildableTextureAtlas.java | 4 +- ...dableTextureAtlasTextureRegionFactory.java | 4 +- .../builder/BlackPawnTextureAtlasBuilder.java | 40 +-- .../opengl/texture/bitmap/BitmapTexture.java | 8 +- .../texture/bitmap/BitmapTextureFormat.java | 2 +- .../texture/compressed/etc1/ETC1Texture.java | 8 +- .../texture/compressed/pvr/PVRCCZTexture.java | 8 +- .../texture/compressed/pvr/PVRTexture.java | 18 +- .../SmartPVRTexturePixelBufferStrategy.java | 8 +- .../opengl/texture/region/TextureRegion.java | 8 +- .../texture/region/TiledTextureRegion.java | 14 +- .../opengl/texture/render/RenderTexture.java | 10 +- .../andengine/opengl/util/BufferUtils.java | 16 +- src/org/andengine/opengl/util/GLHelper.java | 38 +-- src/org/andengine/opengl/util/GLState.java | 60 ++--- .../util/criteria/LogicalAndGLCriteria.java | 4 +- .../util/criteria/LogicalOrGLCriteria.java | 4 +- .../HighPerformanceVertexBufferObject.java | 6 +- .../vbo/SharedMemoryVertexBufferObject.java | 8 +- .../opengl/vbo/VertexBufferObject.java | 14 +- .../opengl/vbo/VertexBufferObjectManager.java | 16 +- .../vbo/ZeroMemoryVertexBufferObject.java | 12 +- .../VertexBufferObjectAttributes.java | 2 +- .../VertexBufferObjectAttributesBuilder.java | 6 +- .../andengine/opengl/view/ConfigChooser.java | 20 +- .../opengl/view/ConfigChooserMatcher.java | 12 +- .../andengine/opengl/view/EngineRenderer.java | 4 +- .../opengl/view/RenderSurfaceView.java | 8 +- .../andengine/ui/activity/BaseActivity.java | 4 +- .../ui/activity/BaseGameActivity.java | 62 ++--- .../ui/dialog/GenericInputDialogBuilder.java | 10 +- src/org/andengine/util/ActivityUtils.java | 14 +- src/org/andengine/util/BetaUtils.java | 8 +- src/org/andengine/util/DatabaseUtils.java | 2 +- src/org/andengine/util/FileUtils.java | 6 +- .../andengine/util/ProbabilityGenerator.java | 10 +- src/org/andengine/util/SAXUtils.java | 4 +- src/org/andengine/util/SocketUtils.java | 6 +- src/org/andengine/util/StreamUtils.java | 16 +- src/org/andengine/util/TextUtils.java | 24 +- src/org/andengine/util/TimeUtils.java | 2 +- src/org/andengine/util/ViewUtils.java | 4 +- .../andengine/util/adt/array/ArrayUtils.java | 98 +++---- src/org/andengine/util/adt/bit/BitVector.java | 40 +-- .../util/adt/bounds/FloatBounds.java | 4 +- .../andengine/util/adt/bounds/IntBounds.java | 4 +- .../andengine/util/adt/cache/IntLRUCache.java | 18 +- .../andengine/util/adt/cache/LRUCache.java | 14 +- src/org/andengine/util/adt/color/Color.java | 20 +- .../adt/io/out/ByteBufferOutputStream.java | 8 +- .../util/adt/list/BooleanArrayList.java | 4 +- .../util/adt/list/ByteArrayList.java | 4 +- .../util/adt/list/CharArrayList.java | 4 +- .../andengine/util/adt/list/CircularList.java | 56 ++-- .../util/adt/list/DoubleArrayList.java | 4 +- .../util/adt/list/FloatArrayList.java | 4 +- .../andengine/util/adt/list/IntArrayList.java | 4 +- .../andengine/util/adt/list/ListUtils.java | 2 +- .../util/adt/list/LongArrayList.java | 4 +- .../andengine/util/adt/list/ShiftList.java | 44 +-- .../andengine/util/adt/list/SmartList.java | 46 ++-- .../andengine/util/adt/list/SortedList.java | 22 +- .../andengine/util/adt/list/UniqueList.java | 4 +- .../andengine/util/adt/map/IntLookupMap.java | 2 +- src/org/andengine/util/adt/map/Library.java | 2 +- src/org/andengine/util/adt/map/MultiKey.java | 8 +- .../util/adt/map/MultiKeyHashMap.java | 6 +- .../util/adt/map/SparseArrayUtils.java | 36 +-- .../pool/EntityDetachRunnablePoolItem.java | 2 +- .../andengine/util/adt/pool/GenericPool.java | 22 +- .../andengine/util/adt/pool/MultiPool.java | 4 +- src/org/andengine/util/adt/pool/Pool.java | 6 +- src/org/andengine/util/adt/pool/PoolItem.java | 2 +- .../util/adt/pool/PoolUpdateHandler.java | 4 +- .../util/adt/queue/CircularQueue.java | 4 +- .../andengine/util/adt/queue/ShiftQueue.java | 4 +- .../andengine/util/adt/queue/SortedQueue.java | 4 +- .../andengine/util/adt/queue/UniqueQueue.java | 4 +- .../andengine/util/adt/spatial/Direction.java | 14 +- .../adt/spatial/quadtree/FloatQuadTree.java | 12 +- .../adt/spatial/quadtree/IntQuadTree.java | 30 +-- .../util/adt/spatial/quadtree/QuadTree.java | 250 +++++++++--------- src/org/andengine/util/adt/trie/Trie.java | 16 +- .../collision/BaseCollisionChecker.java | 20 +- .../util/algorithm/hull/HullUtils.java | 4 +- .../util/algorithm/hull/JarvisMarch.java | 14 +- .../andengine/util/algorithm/path/Path.java | 8 +- .../algorithm/path/astar/AStarPathFinder.java | 38 +-- .../util/algorithm/sort/InsertionSorter.java | 12 +- .../andengine/util/algorithm/sort/Sorter.java | 6 +- .../animationpack/AnimationPackParser.java | 26 +- .../AnimationPackTiledTextureRegion.java | 2 +- src/org/andengine/util/debug/Debug.java | 76 +++--- src/org/andengine/util/debug/DebugTimer.java | 16 +- src/org/andengine/util/escape/Unescaper.java | 12 +- .../util/escape/UnescaperEntityMap.java | 4 +- src/org/andengine/util/level/LevelLoader.java | 2 +- .../util/level/LevelLoaderContentHandler.java | 10 +- .../levelstats/LevelStatsDBConnector.java | 14 +- src/org/andengine/util/math/MathUtils.java | 20 +- src/org/andengine/util/mime/MIMEType.java | 2 +- .../util/modifier/BaseDurationModifier.java | 8 +- .../andengine/util/modifier/BaseModifier.java | 14 +- .../andengine/util/modifier/LoopModifier.java | 12 +- .../andengine/util/modifier/ModifierList.java | 12 +- .../util/modifier/ParallelModifier.java | 10 +- .../util/modifier/SequenceModifier.java | 18 +- .../util/modifier/ease/EaseBackIn.java | 2 +- .../util/modifier/ease/EaseBackInOut.java | 4 +- .../util/modifier/ease/EaseBackOut.java | 2 +- .../util/modifier/ease/EaseBounceIn.java | 2 +- .../util/modifier/ease/EaseBounceInOut.java | 4 +- .../util/modifier/ease/EaseBounceOut.java | 8 +- .../util/modifier/ease/EaseCircularIn.java | 2 +- .../util/modifier/ease/EaseCircularInOut.java | 4 +- .../util/modifier/ease/EaseCircularOut.java | 2 +- .../util/modifier/ease/EaseCubicIn.java | 2 +- .../util/modifier/ease/EaseCubicInOut.java | 4 +- .../util/modifier/ease/EaseCubicOut.java | 2 +- .../util/modifier/ease/EaseElasticIn.java | 6 +- .../util/modifier/ease/EaseElasticInOut.java | 4 +- .../util/modifier/ease/EaseElasticOut.java | 6 +- .../util/modifier/ease/EaseExponentialIn.java | 2 +- .../modifier/ease/EaseExponentialInOut.java | 4 +- .../modifier/ease/EaseExponentialOut.java | 2 +- .../util/modifier/ease/EaseLinear.java | 2 +- .../util/modifier/ease/EaseQuadIn.java | 2 +- .../util/modifier/ease/EaseQuadInOut.java | 4 +- .../util/modifier/ease/EaseQuadOut.java | 2 +- .../util/modifier/ease/EaseQuartIn.java | 2 +- .../util/modifier/ease/EaseQuartInOut.java | 4 +- .../util/modifier/ease/EaseQuartOut.java | 2 +- .../util/modifier/ease/EaseQuintIn.java | 2 +- .../util/modifier/ease/EaseQuintInOut.java | 4 +- .../util/modifier/ease/EaseQuintOut.java | 2 +- .../util/modifier/ease/EaseSineIn.java | 2 +- .../util/modifier/ease/EaseSineInOut.java | 2 +- .../util/modifier/ease/EaseSineOut.java | 2 +- .../util/modifier/ease/EaseStrongIn.java | 2 +- .../util/modifier/ease/EaseStrongInOut.java | 4 +- .../util/modifier/ease/EaseStrongOut.java | 2 +- .../util/modifier/util/ModifierUtils.java | 4 +- .../util/preferences/SimplePreferences.java | 4 +- .../util/progress/ProgressMonitor.java | 2 +- .../andengine/util/system/SystemUtils.java | 10 +- .../util/texturepack/TexturePackParser.java | 36 +-- .../TexturePackTextureRegionLibrary.java | 8 +- 292 files changed, 1743 insertions(+), 1743 deletions(-) diff --git a/src/org/andengine/AndEngine.java b/src/org/andengine/AndEngine.java index 68b12f9d5..7afe02b80 100644 --- a/src/org/andengine/AndEngine.java +++ b/src/org/andengine/AndEngine.java @@ -62,7 +62,7 @@ public static void checkDeviceSupported(final Context pContext) throws DeviceNot } private static void checkCodePathSupport() throws DeviceNotSupportedException { - if(SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO)) { + if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO)) { try { System.loadLibrary("andengine"); } catch (final UnsatisfiedLinkError e) { diff --git a/src/org/andengine/audio/BaseAudioEntity.java b/src/org/andengine/audio/BaseAudioEntity.java index 7fad4f864..c342018c5 100644 --- a/src/org/andengine/audio/BaseAudioEntity.java +++ b/src/org/andengine/audio/BaseAudioEntity.java @@ -149,7 +149,7 @@ public void release() throws AudioException { // =========================================================== protected void assertNotReleased() throws AudioException { - if(this.mReleased) { + if (this.mReleased) { this.throwOnReleased(); } } diff --git a/src/org/andengine/audio/BaseAudioManager.java b/src/org/andengine/audio/BaseAudioManager.java index 40d3d52bf..3b554549f 100644 --- a/src/org/andengine/audio/BaseAudioManager.java +++ b/src/org/andengine/audio/BaseAudioManager.java @@ -44,7 +44,7 @@ public void setMasterVolume(final float pMasterVolume) { this.mMasterVolume = pMasterVolume; final ArrayList audioEntities = this.mAudioEntities; - for(int i = audioEntities.size() - 1; i >= 0; i--) { + for (int i = audioEntities.size() - 1; i >= 0; i--) { final T audioEntity = audioEntities.get(i); audioEntity.onMasterVolumeChanged(pMasterVolume); @@ -64,7 +64,7 @@ public boolean remove(final T pAudioEntity) { @Override public void releaseAll() { final ArrayList audioEntities = this.mAudioEntities; - for(int i = audioEntities.size() - 1; i >= 0; i--) { + for (int i = audioEntities.size() - 1; i >= 0; i--) { final T audioEntity = audioEntities.get(i); audioEntity.stop(); diff --git a/src/org/andengine/audio/music/MusicFactory.java b/src/org/andengine/audio/music/MusicFactory.java index 557c3895c..973d45810 100644 --- a/src/org/andengine/audio/music/MusicFactory.java +++ b/src/org/andengine/audio/music/MusicFactory.java @@ -38,7 +38,7 @@ public class MusicFactory { * @param pAssetBasePath must end with '/' or have .length() == 0. */ public static void setAssetBasePath(final String pAssetBasePath) { - if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { MusicFactory.sAssetBasePath = pAssetBasePath; } else { throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); diff --git a/src/org/andengine/audio/sound/Sound.java b/src/org/andengine/audio/sound/Sound.java index a38cce903..72a743aa9 100644 --- a/src/org/andengine/audio/sound/Sound.java +++ b/src/org/andengine/audio/sound/Sound.java @@ -63,7 +63,7 @@ public void setLoopCount(final int pLoopCount) throws SoundReleasedException { this.assertNotReleased(); this.mLoopCount = pLoopCount; - if(this.mStreamID != 0) { + if (this.mStreamID != 0) { this.getSoundPool().setLoop(this.mStreamID, pLoopCount); } } @@ -76,7 +76,7 @@ public void setRate(final float pRate) throws SoundReleasedException { this.assertNotReleased(); this.mRate = pRate; - if(this.mStreamID != 0) { + if (this.mStreamID != 0) { this.getSoundPool().setRate(this.mStreamID, pRate); } } @@ -114,7 +114,7 @@ public void play() throws SoundReleasedException { public void stop() throws SoundReleasedException { super.stop(); - if(this.mStreamID != 0) { + if (this.mStreamID != 0) { this.getSoundPool().stop(this.mStreamID); } } @@ -123,7 +123,7 @@ public void stop() throws SoundReleasedException { public void resume() throws SoundReleasedException { super.resume(); - if(this.mStreamID != 0) { + if (this.mStreamID != 0) { this.getSoundPool().resume(this.mStreamID); } } @@ -132,7 +132,7 @@ public void resume() throws SoundReleasedException { public void pause() throws SoundReleasedException { super.pause(); - if(this.mStreamID != 0) { + if (this.mStreamID != 0) { this.getSoundPool().pause(this.mStreamID); } } @@ -161,7 +161,7 @@ public void setLooping(final boolean pLooping) throws SoundReleasedException { public void setVolume(final float pLeftVolume, final float pRightVolume) throws SoundReleasedException { super.setVolume(pLeftVolume, pRightVolume); - if(this.mStreamID != 0){ + if (this.mStreamID != 0) { final float masterVolume = this.getMasterVolume(); final float leftVolume = this.mLeftVolume * masterVolume; final float rightVolume = this.mRightVolume * masterVolume; diff --git a/src/org/andengine/audio/sound/SoundFactory.java b/src/org/andengine/audio/sound/SoundFactory.java index 4a017ad01..ca7b4845d 100644 --- a/src/org/andengine/audio/sound/SoundFactory.java +++ b/src/org/andengine/audio/sound/SoundFactory.java @@ -37,7 +37,7 @@ public class SoundFactory { * @param pAssetBasePath must end with '/' or have .length() == 0. */ public static void setAssetBasePath(final String pAssetBasePath) { - if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { SoundFactory.sAssetBasePath = pAssetBasePath; } else { throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); diff --git a/src/org/andengine/audio/sound/SoundManager.java b/src/org/andengine/audio/sound/SoundManager.java index 6f4824947..a2d2ebbc3 100644 --- a/src/org/andengine/audio/sound/SoundManager.java +++ b/src/org/andengine/audio/sound/SoundManager.java @@ -66,7 +66,7 @@ public void add(final Sound pSound) { @Override public boolean remove(final Sound pSound) { final boolean removed = super.remove(pSound); - if(removed) { + if (removed) { this.mSoundMap.remove(pSound.getSoundID()); } return removed; @@ -82,9 +82,9 @@ public void releaseAll() { @Override public synchronized void onLoadComplete(final SoundPool pSoundPool, final int pSoundID, final int pStatus) { - if(pStatus == SoundManager.SOUND_STATUS_OK) { + if (pStatus == SoundManager.SOUND_STATUS_OK) { final Sound sound = this.mSoundMap.get(pSoundID); - if(sound == null) { + if (sound == null) { throw new SoundException("Unexpected soundID: '" + pSoundID + "'."); } else { sound.setLoaded(true); diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index 5c8f2f88e..016a64a71 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -141,7 +141,7 @@ public Engine(final EngineOptions pEngineOptions) { /* Apply EngineOptions. */ this.mEngineOptions = pEngineOptions; - if(this.mEngineOptions.hasEngineLock()) { + if (this.mEngineOptions.hasEngineLock()) { this.mEngineLock = pEngineOptions.getEngineLock(); } else { this.mEngineLock = new EngineLock(false); @@ -149,26 +149,26 @@ public Engine(final EngineOptions pEngineOptions) { this.mCamera = pEngineOptions.getCamera(); /* Touch. */ - if(this.mEngineOptions.getTouchOptions().needsMultiTouch()) { + if (this.mEngineOptions.getTouchOptions().needsMultiTouch()) { this.setTouchController(new MultiTouchController()); } else { this.setTouchController(new SingleTouchController()); } /* Audio. */ - if(this.mEngineOptions.getAudioOptions().needsSound()) { + if (this.mEngineOptions.getAudioOptions().needsSound()) { this.mSoundManager = new SoundManager(this.mEngineOptions.getAudioOptions().getSoundOptions().getMaxSimultaneousStreams()); } else { this.mSoundManager = null; } - if(this.mEngineOptions.getAudioOptions().needsMusic()) { + if (this.mEngineOptions.getAudioOptions().needsMusic()) { this.mMusicManager = new MusicManager(); } else { this.mMusicManager = null; } /* Start the UpdateThread. */ - if(this.mEngineOptions.hasUpdateThread()) { + if (this.mEngineOptions.hasUpdateThread()) { this.mUpdateThread = this.mEngineOptions.getUpdateThread(); } else { this.mUpdateThread = new UpdateThread(); @@ -189,14 +189,14 @@ public synchronized boolean isRunning() { } public synchronized void start() { - if(!this.mRunning) { + if (!this.mRunning) { this.mLastTick = System.nanoTime(); this.mRunning = true; } } public synchronized void stop() { - if(this.mRunning) { + if (this.mRunning) { this.mRunning = false; } } @@ -282,7 +282,7 @@ public ShaderProgramManager getShaderProgramManager() { } public SoundManager getSoundManager() throws IllegalStateException { - if(this.mSoundManager != null) { + if (this.mSoundManager != null) { return this.mSoundManager; } else { throw new IllegalStateException("To enable the SoundManager, check the EngineOptions!"); @@ -290,7 +290,7 @@ public SoundManager getSoundManager() throws IllegalStateException { } public MusicManager getMusicManager() throws IllegalStateException { - if(this.mMusicManager != null) { + if (this.mMusicManager != null) { return this.mMusicManager; } else { throw new IllegalStateException("To enable the MusicManager, check the EngineOptions!"); @@ -327,13 +327,13 @@ public void clearDrawHandlers() { @Override public void onAccuracyChanged(final Sensor pSensor, final int pAccuracy) { - if(this.mRunning) { - switch(pSensor.getType()) { + if (this.mRunning) { + switch (pSensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if(this.mAccelerationData != null) { + if (this.mAccelerationData != null) { this.mAccelerationData.setAccuracy(pAccuracy); this.mAccelerationListener.onAccelerationAccuracyChanged(this.mAccelerationData); - } else if(this.mOrientationData != null) { + } else if (this.mOrientationData != null) { this.mOrientationData.setAccelerationAccuracy(pAccuracy); this.mOrientationListener.onOrientationAccuracyChanged(this.mOrientationData); } @@ -348,14 +348,14 @@ public void onAccuracyChanged(final Sensor pSensor, final int pAccuracy) { @Override public void onSensorChanged(final SensorEvent pEvent) { - if(this.mRunning) { - switch(pEvent.sensor.getType()) { + if (this.mRunning) { + switch (pEvent.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: - if(this.mAccelerationData != null) { + if (this.mAccelerationData != null) { this.mAccelerationData.setDisplayRotation(this.getDisplayOrientation()); this.mAccelerationData.setValues(pEvent.values); this.mAccelerationListener.onAccelerationChanged(this.mAccelerationData); - } else if(this.mOrientationData != null) { + } else if (this.mOrientationData != null) { this.mOrientationData.setDisplayRotation(this.getDisplayOrientation()); this.mOrientationData.setAccelerationValues(pEvent.values); this.mOrientationListener.onOrientationChanged(this.mOrientationData); @@ -372,10 +372,10 @@ public void onSensorChanged(final SensorEvent pEvent) { @Override public void onLocationChanged(final Location pLocation) { - if(this.mLocation == null) { + if (this.mLocation == null) { this.mLocation = pLocation; } else { - if(pLocation == null) { + if (pLocation == null) { this.mLocationListener.onLocationLost(); } else { this.mLocation = pLocation; @@ -396,7 +396,7 @@ public void onProviderEnabled(final String pProvider) { @Override public void onStatusChanged(final String pProvider, final int pStatus, final Bundle pExtras) { - switch(pStatus) { + switch (pStatus) { case LocationProvider.AVAILABLE: this.mLocationListener.onLocationProviderStatusChanged(LocationProviderStatus.AVAILABLE, pExtras); break; @@ -411,7 +411,7 @@ public void onStatusChanged(final String pProvider, final int pStatus, final Bun @Override public boolean onTouch(final View pView, final MotionEvent pSurfaceMotionEvent) { - if(this.mRunning) { + if (this.mRunning) { this.mTouchController.onHandleMotionEvent(pSurfaceMotionEvent); try { /* Because a human cannot interact 1000x per second, we pause the UI-Thread for a little. */ @@ -433,7 +433,7 @@ public boolean onTouchEvent(final TouchEvent pSurfaceTouchEvent) { this.convertSurfaceTouchEventToSceneTouchEvent(camera, pSurfaceTouchEvent); - if(this.onTouchHUD(camera, pSurfaceTouchEvent)) { + if (this.onTouchHUD(camera, pSurfaceTouchEvent)) { return true; } else { /* If HUD didn't handle it, Scene may handle it. */ @@ -442,7 +442,7 @@ public boolean onTouchEvent(final TouchEvent pSurfaceTouchEvent) { } protected boolean onTouchHUD(final Camera pCamera, final TouchEvent pSceneTouchEvent) { - if(pCamera.hasHUD()) { + if (pCamera.hasHUD()) { return pCamera.getHUD().onSceneTouchEvent(pSceneTouchEvent); } else { return false; @@ -450,7 +450,7 @@ protected boolean onTouchHUD(final Camera pCamera, final TouchEvent pSceneTouchE } protected boolean onTouchScene(final Scene pScene, final TouchEvent pSceneTouchEvent) { - if(pScene != null) { + if (pScene != null) { return pScene.onSceneTouchEvent(pSceneTouchEvent); } else { return false; @@ -473,7 +473,7 @@ public void runOnUpdateThread(final Runnable pRunnable) { * if false, the execution of the {@link Runnable} will happen as soon as possible on the {@link UpdateThread}, no matter what {@link Engine#isRunning()} is. */ public void runOnUpdateThread(final Runnable pRunnable, final boolean pOnlyWhenEngineRunning) { - if(pOnlyWhenEngineRunning) { + if (pOnlyWhenEngineRunning) { this.mUpdateThreadRunnableHandler.postRunnable(pRunnable); } else { this.mUpdateThread.postRunnable(pRunnable); @@ -542,7 +542,7 @@ protected void convertSceneTouchEventToSurfaceTouchEvent(final Camera pCamera, f } void onTickUpdate() throws InterruptedException { - if(this.mRunning) { + if (this.mRunning) { final long secondsElapsed = this.getNanosecondsElapsed(); this.mEngineLock.lock(); @@ -574,7 +574,7 @@ void onTickUpdate() throws InterruptedException { } private void throwOnDestroyed() throws EngineDestroyedException { - if(this.mDestroyed) { + if (this.mDestroyed) { throw new EngineDestroyedException(); } } @@ -591,7 +591,7 @@ public void onUpdate(final long pNanosecondsElapsed) throws InterruptedException } protected void onUpdateScene(final float pSecondsElapsed) { - if(this.mScene != null) { + if (this.mScene != null) { this.mScene.onUpdate(pSecondsElapsed); } this.getCamera().onUpdate(pSecondsElapsed); @@ -627,7 +627,7 @@ public void onDrawFrame(final GLState pGLState) throws InterruptedException { } protected void onDrawScene(final GLState pGLState, final Camera pCamera) { - if(this.mScene != null) { + if (this.mScene != null) { this.mScene.onDraw(pGLState, pCamera); } @@ -646,7 +646,7 @@ public boolean enableVibrator(final Context pContext) { } public void vibrate(final long pMilliseconds) throws IllegalStateException { - if(this.mVibrator != null) { + if (this.mVibrator != null) { this.mVibrator.vibrate(pMilliseconds); } else { throw new IllegalStateException("You need to enable the Vibrator before you can use it!"); @@ -654,7 +654,7 @@ public void vibrate(final long pMilliseconds) throws IllegalStateException { } public void vibrate(final long[] pPattern, final int pRepeat) throws IllegalStateException { - if(this.mVibrator != null) { + if (this.mVibrator != null) { this.mVibrator.vibrate(pPattern, pRepeat); } else { throw new IllegalStateException("You need to enable the Vibrator before you can use it!"); @@ -689,12 +689,12 @@ public boolean enableAccelerationSensor(final Context pContext, final IAccelerat */ public boolean enableAccelerationSensor(final Context pContext, final IAccelerationListener pAccelerationListener, final AccelerationSensorOptions pAccelerationSensorOptions) { final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); - if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER)) { + if (this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER)) { this.mAccelerationListener = pAccelerationListener; this.initDefaultDisplay(pContext); - if(this.mAccelerationData == null) { + if (this.mAccelerationData == null) { this.mAccelerationData = new AccelerationData(); } @@ -711,7 +711,7 @@ public boolean enableAccelerationSensor(final Context pContext, final IAccelerat */ public boolean disableAccelerationSensor(final Context pContext) { final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); - if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER)) { + if (this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER)) { this.unregisterSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER); return true; } else { @@ -731,12 +731,12 @@ public boolean enableOrientationSensor(final Context pContext, final IOrientatio */ public boolean enableOrientationSensor(final Context pContext, final IOrientationListener pOrientationListener, final OrientationSensorOptions pOrientationSensorOptions) { final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); - if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER) && this.isSensorSupported(sensorManager, Sensor.TYPE_MAGNETIC_FIELD)) { + if (this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER) && this.isSensorSupported(sensorManager, Sensor.TYPE_MAGNETIC_FIELD)) { this.mOrientationListener = pOrientationListener; this.initDefaultDisplay(pContext); - if(this.mOrientationData == null) { + if (this.mOrientationData == null) { this.mOrientationData = new OrientationData(); } @@ -755,7 +755,7 @@ public boolean enableOrientationSensor(final Context pContext, final IOrientatio */ public boolean disableOrientationSensor(final Context pContext) { final SensorManager sensorManager = (SensorManager) pContext.getSystemService(Context.SENSOR_SERVICE); - if(this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER) && this.isSensorSupported(sensorManager, Sensor.TYPE_MAGNETIC_FIELD)) { + if (this.isSensorSupported(sensorManager, Sensor.TYPE_ACCELEROMETER) && this.isSensorSupported(sensorManager, Sensor.TYPE_MAGNETIC_FIELD)) { this.unregisterSelfAsSensorListener(sensorManager, Sensor.TYPE_ACCELEROMETER); this.unregisterSelfAsSensorListener(sensorManager, Sensor.TYPE_MAGNETIC_FIELD); return true; @@ -779,7 +779,7 @@ private void unregisterSelfAsSensorListener(final SensorManager pSensorManager, } private void initDefaultDisplay(final Context pContext) { - if(this.mDefaultDisplay == null) { + if (this.mDefaultDisplay == null) { final WindowManager windowManager = (WindowManager) pContext.getSystemService(Context.WINDOW_SERVICE); this.mDefaultDisplay = windowManager.getDefaultDisplay(); } @@ -790,7 +790,7 @@ private void releaseDefaultDisplay() { } private int getDisplayOrientation() { - if(this.mDefaultDisplay == null) { + if (this.mDefaultDisplay == null) { throw new IllegalStateException(); } else { return this.mDefaultDisplay.getOrientation(); @@ -842,7 +842,7 @@ public void run() { this.mEngine.onTickUpdate(); } } catch (final InterruptedException e) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + " interrupted. Don't worry - this " + e.getClass().getSimpleName() + " is most likely expected!", e); } this.interrupt(); diff --git a/src/org/andengine/engine/LimitedFPSEngine.java b/src/org/andengine/engine/LimitedFPSEngine.java index 6b9b302d7..7f73ba8d6 100644 --- a/src/org/andengine/engine/LimitedFPSEngine.java +++ b/src/org/andengine/engine/LimitedFPSEngine.java @@ -47,7 +47,7 @@ public void onUpdate(final long pNanosecondsElapsed) throws InterruptedException final long preferredFrameLengthNanoseconds = this.mPreferredFrameLengthNanoseconds; final long deltaFrameLengthNanoseconds = preferredFrameLengthNanoseconds - pNanosecondsElapsed; - if(deltaFrameLengthNanoseconds <= 0) { + if (deltaFrameLengthNanoseconds <= 0) { super.onUpdate(pNanosecondsElapsed); } else { final int sleepTimeMilliseconds = (int) (deltaFrameLengthNanoseconds / TimeConstants.NANOSECONDS_PER_MILLISECOND); diff --git a/src/org/andengine/engine/camera/BoundCamera.java b/src/org/andengine/engine/camera/BoundCamera.java index e0b369594..9b5a7d537 100644 --- a/src/org/andengine/engine/camera/BoundCamera.java +++ b/src/org/andengine/engine/camera/BoundCamera.java @@ -100,7 +100,7 @@ public float getBoundsHeight() { public void setCenter(final float pCenterX, final float pCenterY) { super.setCenter(pCenterX, pCenterY); - if(this.mBoundsEnabled) { + if (this.mBoundsEnabled) { this.ensureInBounds(); } } @@ -111,13 +111,13 @@ public void setCenter(final float pCenterX, final float pCenterY) { protected void ensureInBounds() { final float centerX; - if(this.mBoundsWidth < this.getWidth()) { + if (this.mBoundsWidth < this.getWidth()) { centerX = this.mBoundsCenterX; } else { centerX = getBoundedX(this.getCenterX()); } final float centerY; - if(this.mBoundsHeight < this.getHeight()) { + if (this.mBoundsHeight < this.getHeight()) { centerY = this.mBoundsCenterY; } else { centerY = getBoundedY(this.getCenterY()); @@ -132,8 +132,8 @@ protected float getBoundedX(final float pX) { final float maxXBoundExceededAmount = this.getXMax() - this.mBoundsXMax; final boolean maxXBoundExceeded = maxXBoundExceededAmount > 0; - if(minXBoundExceeded) { - if(maxXBoundExceeded) { + if (minXBoundExceeded) { + if (maxXBoundExceeded) { /* Min and max X exceeded. */ return pX - maxXBoundExceededAmount + minXBoundExceededAmount; } else { @@ -141,7 +141,7 @@ protected float getBoundedX(final float pX) { return pX + minXBoundExceededAmount; } } else { - if(maxXBoundExceeded) { + if (maxXBoundExceeded) { /* Only max X exceeded. */ return pX - maxXBoundExceededAmount; } else { @@ -158,8 +158,8 @@ protected float getBoundedY(final float pY) { final float maxYBoundExceededAmount = this.getYMax() - this.mBoundsYMax; final boolean maxYBoundExceeded = maxYBoundExceededAmount > 0; - if(minYBoundExceeded) { - if(maxYBoundExceeded) { + if (minYBoundExceeded) { + if (maxYBoundExceeded) { /* Min and max Y exceeded. */ return pY - maxYBoundExceededAmount + minYBoundExceededAmount; } else { @@ -167,7 +167,7 @@ protected float getBoundedY(final float pY) { return pY + minYBoundExceededAmount; } } else { - if(maxYBoundExceeded) { + if (maxYBoundExceeded) { /* Only max Y exceeded. */ return pY - maxYBoundExceededAmount; } else { diff --git a/src/org/andengine/engine/camera/Camera.java b/src/org/andengine/engine/camera/Camera.java index bff186b12..2589406b5 100644 --- a/src/org/andengine/engine/camera/Camera.java +++ b/src/org/andengine/engine/camera/Camera.java @@ -171,7 +171,7 @@ public HUD getHUD() { public void setHUD(final HUD pHUD) { this.mHUD = pHUD; - if(pHUD != null) { + if (pHUD != null) { pHUD.setCamera(this); } } @@ -221,9 +221,9 @@ public int getSurfaceHeight() { } public void setSurfaceSize(final int pSurfaceX, final int pSurfaceY, final int pSurfaceWidth, final int pSurfaceHeight) { - if(this.mSurfaceHeight == 0 && this.mSurfaceWidth == 0) { + if (this.mSurfaceHeight == 0 && this.mSurfaceWidth == 0) { this.onSurfaceSizeInitialized(pSurfaceX, pSurfaceY, pSurfaceWidth, pSurfaceHeight); - } else if(this.mSurfaceWidth != pSurfaceWidth || this.mSurfaceHeight != pSurfaceHeight) { + } else if (this.mSurfaceWidth != pSurfaceWidth || this.mSurfaceHeight != pSurfaceHeight) { this.onSurfaceSizeChanged(this.mSurfaceX, this.mSurfaceY, this.mSurfaceWidth, this.mSurfaceHeight, pSurfaceX, pSurfaceY, pSurfaceWidth, pSurfaceHeight); } } @@ -242,11 +242,11 @@ public void setResizeOnSurfaceSizeChanged(final boolean pResizeOnSurfaceSizeChan @Override public void onUpdate(final float pSecondsElapsed) { - if(this.mUpdateHandlers != null) { + if (this.mUpdateHandlers != null) { this.mUpdateHandlers.onUpdate(pSecondsElapsed); } - if(this.mHUD != null) { + if (this.mHUD != null) { this.mHUD.onUpdate(pSecondsElapsed); } @@ -263,13 +263,13 @@ public void reset() { // =========================================================== public void onDrawHUD(final GLState pGLState) { - if(this.mHUD != null) { + if (this.mHUD != null) { this.mHUD.onDraw(pGLState, this); } } public void updateChaseEntity() { - if(this.mChaseEntity != null) { + if (this.mChaseEntity != null) { final float[] centerCoordinates = this.mChaseEntity.getSceneCenterCoordinates(); this.setCenter(centerCoordinates[Constants.VERTEX_INDEX_X], centerCoordinates[Constants.VERTEX_INDEX_Y]); } @@ -291,7 +291,7 @@ public void onApplySceneMatrix(final GLState pGLState) { pGLState.orthoProjectionGLMatrixf(this.getXMin(), this.getXMax(), this.getYMin(), this.getYMax(), this.mZNear, this.mZFar); final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { this.applyRotation(pGLState, this.getCenterX(), this.getCenterY(), rotation); } } @@ -303,7 +303,7 @@ public void onApplySceneBackgroundMatrix(final GLState pGLState) { pGLState.orthoProjectionGLMatrixf(0, cameraSceneWidth, 0, cameraSceneHeight, this.mZNear, this.mZFar); final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { this.applyRotation(pGLState, cameraSceneWidth * 0.5f, cameraSceneHeight * 0.5f, rotation); } } @@ -314,7 +314,7 @@ public void onApplyCameraSceneMatrix(final GLState pGLState) { pGLState.orthoProjectionGLMatrixf(0, cameraSceneWidth, 0, cameraSceneHeight, this.mZNear, this.mZFar); final float cameraSceneRotation = this.mCameraSceneRotation; - if(cameraSceneRotation != 0) { + if (cameraSceneRotation != 0) { this.applyRotation(pGLState, cameraSceneWidth * 0.5f, cameraSceneHeight * 0.5f, cameraSceneRotation); } } @@ -395,7 +395,7 @@ protected void unapplySceneToCameraSceneOffset(final float[] pCameraSceneCoordin private void applySceneRotation(final float[] pCameraSceneCoordinates) { final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { MathUtils.rotateAroundCenter(pCameraSceneCoordinates, rotation, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! } } @@ -403,7 +403,7 @@ private void applySceneRotation(final float[] pCameraSceneCoordinates) { private void applySceneRotation(final TouchEvent pCameraSceneTouchEvent) { final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); @@ -416,7 +416,7 @@ private void applySceneRotation(final TouchEvent pCameraSceneTouchEvent) { private void unapplySceneRotation(final float[] pSceneCoordinates) { final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { MathUtils.revertRotateAroundCenter(pSceneCoordinates, rotation, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! } } @@ -424,7 +424,7 @@ private void unapplySceneRotation(final float[] pSceneCoordinates) { private void unapplySceneRotation(final TouchEvent pSceneTouchEvent) { final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); @@ -437,7 +437,7 @@ private void unapplySceneRotation(final TouchEvent pSceneTouchEvent) { private void applyCameraSceneRotation(final float[] pSceneCoordinates) { final float cameraSceneRotation = this.mCameraSceneRotation; - if(cameraSceneRotation != 0) { + if (cameraSceneRotation != 0) { MathUtils.rotateAroundCenter(pSceneCoordinates, cameraSceneRotation, this.getCameraSceneWidth() * 0.5f, this.getCameraSceneHeight() * 0.5f); // TODO Use a Transformation object instead!?! } } @@ -445,7 +445,7 @@ private void applyCameraSceneRotation(final float[] pSceneCoordinates) { private void applyCameraSceneRotation(final TouchEvent pSceneTouchEvent) { final float cameraSceneRotation = this.mCameraSceneRotation; - if(cameraSceneRotation != 0) { + if (cameraSceneRotation != 0) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); @@ -458,7 +458,7 @@ private void applyCameraSceneRotation(final TouchEvent pSceneTouchEvent) { private void unapplyCameraSceneRotation(final float[] pCameraSceneCoordinates) { final float cameraSceneRotation = this.mCameraSceneRotation; - if(cameraSceneRotation != 0) { + if (cameraSceneRotation != 0) { MathUtils.revertRotateAroundCenter(pCameraSceneCoordinates, cameraSceneRotation, this.getCameraSceneWidth() * 0.5f, this.getCameraSceneHeight() * 0.5f); // TODO Use a Transformation object instead!?! } } @@ -466,7 +466,7 @@ private void unapplyCameraSceneRotation(final float[] pCameraSceneCoordinates) { private void unapplyCameraSceneRotation(final TouchEvent pCameraSceneTouchEvent) { final float cameraSceneRotation = this.mCameraSceneRotation; - if(cameraSceneRotation != 0) { + if (cameraSceneRotation != 0) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); @@ -489,10 +489,10 @@ public void convertSurfaceTouchEventToSceneTouchEvent(final TouchEvent pSurfaceT final float surfaceTouchEventY = pSurfaceTouchEvent.getY(); final float rotation = this.mRotation; - if(rotation == 0) { + if (rotation == 0) { relativeX = surfaceTouchEventX / pSurfaceWidth; relativeY = 1 - (surfaceTouchEventY / pSurfaceHeight); - } else if(rotation == 180) { + } else if (rotation == 180) { relativeX = 1 - (surfaceTouchEventX / pSurfaceWidth); relativeY = surfaceTouchEventY / pSurfaceHeight; } else { @@ -524,10 +524,10 @@ public float[] getSceneCoordinatesFromSurfaceCoordinates(final float[] pSurfaceC final float relativeY; final float rotation = this.mRotation; - if(rotation == 0) { + if (rotation == 0) { relativeX = pSurfaceCoordinates[Constants.VERTEX_INDEX_X] / pSurfaceWidth; relativeY = 1 - (pSurfaceCoordinates[Constants.VERTEX_INDEX_Y] / pSurfaceHeight); - } else if(rotation == 180) { + } else if (rotation == 180) { relativeX = 1 - (pSurfaceCoordinates[Constants.VERTEX_INDEX_X] / pSurfaceWidth); relativeY = pSurfaceCoordinates[Constants.VERTEX_INDEX_Y] / pSurfaceHeight; } else { @@ -576,9 +576,9 @@ public void convertSceneTouchEventToSurfaceTouchEvent(final TouchEvent pSceneTou this.convertAxisAlignedSceneToSurfaceTouchEvent(pSceneTouchEvent, pSurfaceWidth, pSurfaceHeight); final float rotation = this.mRotation; - if(rotation == 0) { + if (rotation == 0) { /* Nothing. */ - } else if(rotation == 180) { + } else if (rotation == 180) { pSceneTouchEvent.setY(pSurfaceHeight - pSceneTouchEvent.getY()); pSceneTouchEvent.setX(pSurfaceWidth - pSceneTouchEvent.getX()); } else { @@ -610,9 +610,9 @@ public float[] getSurfaceCoordinatesFromSceneCoordinates(final float[] pSceneCoo this.convertAxisAlignedSceneCoordinatesToSurfaceCoordinates(pSceneCoordinates, pSurfaceWidth, pSurfaceHeight); final float rotation = this.mRotation; - if(rotation == 0) { + if (rotation == 0) { /* Nothing. */ - } else if(rotation == 180) { + } else if (rotation == 180) { pSceneCoordinates[Constants.VERTEX_INDEX_Y] = pSurfaceHeight - pSceneCoordinates[Constants.VERTEX_INDEX_Y]; pSceneCoordinates[Constants.VERTEX_INDEX_X] = pSurfaceWidth - pSceneCoordinates[Constants.VERTEX_INDEX_X]; } else { @@ -652,28 +652,28 @@ private void convertAxisAlignedSceneCoordinatesToSurfaceCoordinates(final float[ public void registerUpdateHandler(final IUpdateHandler pUpdateHandler) { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { this.allocateUpdateHandlers(); } this.mUpdateHandlers.add(pUpdateHandler); } public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler) { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { return false; } return this.mUpdateHandlers.remove(pUpdateHandler); } public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandlerMatcher) { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { return false; } return this.mUpdateHandlers.removeAll(pUpdateHandlerMatcher); } public void clearUpdateHandlers() { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { return; } this.mUpdateHandlers.clear(); @@ -691,7 +691,7 @@ protected void onSurfaceSizeInitialized(final int pSurfaceX, final int pSurfaceY } protected void onSurfaceSizeChanged(final int pOldSurfaceX, final int pOldSurfaceY, final int pOldSurfaceWidth, final int pOldSurfaceHeight, final int pNewSurfaceX, final int pNewSurfaceY, final int pNewSurfaceWidth, final int pNewSurfaceHeight) { - if(this.mResizeOnSurfaceSizeChanged) { + if (this.mResizeOnSurfaceSizeChanged) { final float surfaceWidthRatio = (float)pNewSurfaceWidth / pOldSurfaceWidth; final float surfaceHeightRatio = (float)pNewSurfaceHeight / pOldSurfaceHeight; diff --git a/src/org/andengine/engine/camera/SmoothCamera.java b/src/org/andengine/engine/camera/SmoothCamera.java index 46ebb688c..a2ba695d7 100644 --- a/src/org/andengine/engine/camera/SmoothCamera.java +++ b/src/org/andengine/engine/camera/SmoothCamera.java @@ -72,8 +72,8 @@ public void setCenterDirect(final float pCenterX, final float pCenterY) { @Override public void setZoomFactor(final float pZoomFactor) { - if(this.mTargetZoomFactor != pZoomFactor) { - if(this.mTargetZoomFactor == this.mZoomFactor) { + if (this.mTargetZoomFactor != pZoomFactor) { + if (this.mTargetZoomFactor == this.mZoomFactor) { this.mTargetZoomFactor = pZoomFactor; this.onSmoothZoomStarted(); @@ -84,7 +84,7 @@ public void setZoomFactor(final float pZoomFactor) { } public void setZoomFactorDirect(final float pZoomFactor) { - if(this.mTargetZoomFactor != this.mZoomFactor) { + if (this.mTargetZoomFactor != this.mZoomFactor) { this.mTargetZoomFactor = pZoomFactor; super.setZoomFactor(pZoomFactor); @@ -146,7 +146,7 @@ public void onUpdate(final float pSecondsElapsed) { final float targetCenterX = this.mTargetCenterX; final float targetCenterY = this.mTargetCenterY; - if(currentCenterX != targetCenterX || currentCenterY != targetCenterY) { + if (currentCenterX != targetCenterX || currentCenterY != targetCenterY) { final float diffX = targetCenterX - currentCenterX; final float dX = this.limitToMaxVelocityX(diffX, pSecondsElapsed); @@ -161,19 +161,19 @@ public void onUpdate(final float pSecondsElapsed) { final float targetZoomFactor = this.mTargetZoomFactor; - if(currentZoom != targetZoomFactor) { + if (currentZoom != targetZoomFactor) { final float absoluteZoomDifference = targetZoomFactor - currentZoom; final float zoomChange = this.limitToMaxZoomFactorChange(absoluteZoomDifference, pSecondsElapsed); super.setZoomFactor(currentZoom + zoomChange); - if(this.mZoomFactor == this.mTargetZoomFactor) { + if (this.mZoomFactor == this.mTargetZoomFactor) { this.onSmoothZoomFinished(); } } } private float limitToMaxVelocityX(final float pValue, final float pSecondsElapsed) { - if(pValue > 0) { + if (pValue > 0) { return Math.min(pValue, this.mMaxVelocityX * pSecondsElapsed); } else { return Math.max(pValue, -this.mMaxVelocityX * pSecondsElapsed); @@ -181,7 +181,7 @@ private float limitToMaxVelocityX(final float pValue, final float pSecondsElapse } private float limitToMaxVelocityY(final float pValue, final float pSecondsElapsed) { - if(pValue > 0) { + if (pValue > 0) { return Math.min(pValue, this.mMaxVelocityY * pSecondsElapsed); } else { return Math.max(pValue, -this.mMaxVelocityY * pSecondsElapsed); @@ -189,7 +189,7 @@ private float limitToMaxVelocityY(final float pValue, final float pSecondsElapse } private float limitToMaxZoomFactorChange(final float pValue, final float pSecondsElapsed) { - if(pValue > 0) { + if (pValue > 0) { return Math.min(pValue, this.mMaxZoomFactorChange * pSecondsElapsed); } else { return Math.max(pValue, -this.mMaxZoomFactorChange * pSecondsElapsed); diff --git a/src/org/andengine/engine/camera/ZoomCamera.java b/src/org/andengine/engine/camera/ZoomCamera.java index f94186aff..6a9e5acd4 100644 --- a/src/org/andengine/engine/camera/ZoomCamera.java +++ b/src/org/andengine/engine/camera/ZoomCamera.java @@ -44,7 +44,7 @@ public float getZoomFactor() { public void setZoomFactor(final float pZoomFactor) { this.mZoomFactor = pZoomFactor; - if(this.mBoundsEnabled) { + if (this.mBoundsEnabled) { this.ensureInBounds(); } } @@ -55,7 +55,7 @@ public void setZoomFactor(final float pZoomFactor) { @Override public float getXMin() { - if(this.mZoomFactor == 1.0f) { + if (this.mZoomFactor == 1.0f) { return super.getXMin(); } else { final float centerX = this.getCenterX(); @@ -65,7 +65,7 @@ public float getXMin() { @Override public float getXMax() { - if(this.mZoomFactor == 1.0f) { + if (this.mZoomFactor == 1.0f) { return super.getXMax(); } else { final float centerX = this.getCenterX(); @@ -75,7 +75,7 @@ public float getXMax() { @Override public float getYMin() { - if(this.mZoomFactor == 1.0f) { + if (this.mZoomFactor == 1.0f) { return super.getYMin(); } else { final float centerY = this.getCenterY(); @@ -85,7 +85,7 @@ public float getYMin() { @Override public float getYMax() { - if(this.mZoomFactor == 1.0f) { + if (this.mZoomFactor == 1.0f) { return super.getYMax(); } else { final float centerY = this.getCenterY(); @@ -106,7 +106,7 @@ public float getHeight() { @Override protected void applySceneToCameraSceneOffset(final TouchEvent pSceneTouchEvent) { final float zoomFactor = this.mZoomFactor; - if(zoomFactor != 1) { + if (zoomFactor != 1) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pSceneTouchEvent.getY(); @@ -121,7 +121,7 @@ protected void applySceneToCameraSceneOffset(final TouchEvent pSceneTouchEvent) @Override protected void applySceneToCameraSceneOffset(final float[] pSceneCoordinates) { final float zoomFactor = this.mZoomFactor; - if(zoomFactor != 1) { + if (zoomFactor != 1) { MathUtils.scaleAroundCenter(pSceneCoordinates, zoomFactor, zoomFactor, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! } @@ -133,7 +133,7 @@ protected void unapplySceneToCameraSceneOffset(final TouchEvent pCameraSceneTouc super.unapplySceneToCameraSceneOffset(pCameraSceneTouchEvent); final float zoomFactor = this.mZoomFactor; - if(zoomFactor != 1) { + if (zoomFactor != 1) { Camera.VERTICES_TMP[Constants.VERTEX_INDEX_X] = pCameraSceneTouchEvent.getX(); Camera.VERTICES_TMP[Constants.VERTEX_INDEX_Y] = pCameraSceneTouchEvent.getY(); @@ -148,7 +148,7 @@ protected void unapplySceneToCameraSceneOffset(final float[] pCameraSceneCoordin super.unapplySceneToCameraSceneOffset(pCameraSceneCoordinates); final float zoomFactor = this.mZoomFactor; - if(zoomFactor != 1) { + if (zoomFactor != 1) { MathUtils.revertScaleAroundCenter(pCameraSceneCoordinates, zoomFactor, zoomFactor, this.getCenterX(), this.getCenterY()); // TODO Use a Transformation object instead!?! } } diff --git a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java index 27bfb836b..2529c95c5 100644 --- a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java @@ -78,7 +78,7 @@ protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, @Override protected void onUpdateControlKnob(final float pRelativeX, final float pRelativeY) { - if(pRelativeX * pRelativeX + pRelativeY * pRelativeY <= 0.25f) { + if (pRelativeX * pRelativeX + pRelativeY * pRelativeY <= 0.25f) { super.onUpdateControlKnob(pRelativeX, pRelativeY); } else { final float angleRad = MathUtils.atan2(pRelativeY, pRelativeX); diff --git a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java index ab37205d7..22c45e0b8 100644 --- a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java @@ -101,10 +101,10 @@ public IOnScreenControlListener getOnScreenControlListener() { @Override public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { final int pointerID = pSceneTouchEvent.getPointerID(); - if(pointerID == this.mActivePointerID) { + if (pointerID == this.mActivePointerID) { this.onHandleControlBaseLeft(); - switch(pSceneTouchEvent.getAction()) { + switch (pSceneTouchEvent.getAction()) { case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: this.mActivePointerID = BaseOnScreenControl.INVALID_POINTER_ID; @@ -138,9 +138,9 @@ protected void onHandleControlKnobReleased() { protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { final int pointerID = pSceneTouchEvent.getPointerID(); - switch(pSceneTouchEvent.getAction()) { + switch (pSceneTouchEvent.getAction()) { case MotionEvent.ACTION_DOWN: - if(this.mActivePointerID == BaseOnScreenControl.INVALID_POINTER_ID) { + if (this.mActivePointerID == BaseOnScreenControl.INVALID_POINTER_ID) { this.mActivePointerID = pointerID; this.updateControlKnob(pTouchAreaLocalX, pTouchAreaLocalY); return true; @@ -148,14 +148,14 @@ protected boolean onHandleControlBaseTouched(final TouchEvent pSceneTouchEvent, break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: - if(this.mActivePointerID == pointerID) { + if (this.mActivePointerID == pointerID) { this.mActivePointerID = BaseOnScreenControl.INVALID_POINTER_ID; this.onHandleControlKnobReleased(); return true; } break; default: - if(this.mActivePointerID == pointerID) { + if (this.mActivePointerID == pointerID) { this.updateControlKnob(pTouchAreaLocalX, pTouchAreaLocalY); return true; } diff --git a/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java index a4bf87c5d..09fa90205 100644 --- a/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java @@ -61,47 +61,47 @@ public void setAllowDiagonal(final boolean pAllowDiagonal) { @Override protected void onUpdateControlKnob(final float pRelativeX, final float pRelativeY) { - if(pRelativeX == 0 && pRelativeY == 0) { + if (pRelativeX == 0 && pRelativeY == 0) { super.onUpdateControlKnob(0, 0); return; } - if(this.mAllowDiagonal) { + if (this.mAllowDiagonal) { final float angle = MathUtils.radToDeg(MathUtils.atan2(pRelativeY, pRelativeX)) + 180; - if(this.testDiagonalAngle(0, angle) || this.testDiagonalAngle(360, angle)) { + if (this.testDiagonalAngle(0, angle) || this.testDiagonalAngle(360, angle)) { super.onUpdateControlKnob(-EXTENT_SIDE, 0); - } else if(this.testDiagonalAngle(45, angle)) { + } else if (this.testDiagonalAngle(45, angle)) { super.onUpdateControlKnob(-EXTENT_DIAGONAL, -EXTENT_DIAGONAL); - } else if(this.testDiagonalAngle(90, angle)) { + } else if (this.testDiagonalAngle(90, angle)) { super.onUpdateControlKnob(0, -EXTENT_SIDE); - } else if(this.testDiagonalAngle(135, angle)) { + } else if (this.testDiagonalAngle(135, angle)) { super.onUpdateControlKnob(EXTENT_DIAGONAL, -EXTENT_DIAGONAL); - } else if(this.testDiagonalAngle(180, angle)) { + } else if (this.testDiagonalAngle(180, angle)) { super.onUpdateControlKnob(EXTENT_SIDE, 0); - } else if(this.testDiagonalAngle(225, angle)) { + } else if (this.testDiagonalAngle(225, angle)) { super.onUpdateControlKnob(EXTENT_DIAGONAL, EXTENT_DIAGONAL); - } else if(this.testDiagonalAngle(270, angle)) { + } else if (this.testDiagonalAngle(270, angle)) { super.onUpdateControlKnob(0, EXTENT_SIDE); - } else if(this.testDiagonalAngle(315, angle)) { + } else if (this.testDiagonalAngle(315, angle)) { super.onUpdateControlKnob(-EXTENT_DIAGONAL, EXTENT_DIAGONAL); } else { super.onUpdateControlKnob(0, 0); } } else { - if(Math.abs(pRelativeX) > Math.abs(pRelativeY)) { - if(pRelativeX > 0) { + if (Math.abs(pRelativeX) > Math.abs(pRelativeY)) { + if (pRelativeX > 0) { super.onUpdateControlKnob(EXTENT_SIDE, 0); - } else if(pRelativeX < 0) { + } else if (pRelativeX < 0) { super.onUpdateControlKnob(-EXTENT_SIDE, 0); - } else if(pRelativeX == 0) { + } else if (pRelativeX == 0) { super.onUpdateControlKnob(0, 0); } } else { - if(pRelativeY > 0) { + if (pRelativeY > 0) { super.onUpdateControlKnob(0, EXTENT_SIDE); - } else if(pRelativeY < 0) { + } else if (pRelativeY < 0) { super.onUpdateControlKnob(0, -EXTENT_SIDE); - } else if(pRelativeY == 0) { + } else if (pRelativeY == 0) { super.onUpdateControlKnob(0, 0); } } diff --git a/src/org/andengine/engine/handler/DrawHandlerList.java b/src/org/andengine/engine/handler/DrawHandlerList.java index 8d844a67e..3808ce193 100644 --- a/src/org/andengine/engine/handler/DrawHandlerList.java +++ b/src/org/andengine/engine/handler/DrawHandlerList.java @@ -44,7 +44,7 @@ public DrawHandlerList(final int pCapacity) { @Override public void onDraw(final GLState pGLState, final Camera pCamera) { final int handlerCount = this.size(); - for(int i = handlerCount - 1; i >= 0; i--) { + for (int i = handlerCount - 1; i >= 0; i--) { this.get(i).onDraw(pGLState, pCamera); } } diff --git a/src/org/andengine/engine/handler/UpdateHandlerList.java b/src/org/andengine/engine/handler/UpdateHandlerList.java index e7676e36b..edf1458d2 100644 --- a/src/org/andengine/engine/handler/UpdateHandlerList.java +++ b/src/org/andengine/engine/handler/UpdateHandlerList.java @@ -43,7 +43,7 @@ public UpdateHandlerList(final int pCapacity) { @Override public void onUpdate(final float pSecondsElapsed) { final int handlerCount = this.size(); - for(int i = handlerCount - 1; i >= 0; i--) { + for (int i = handlerCount - 1; i >= 0; i--) { this.get(i).onUpdate(pSecondsElapsed); } } @@ -51,7 +51,7 @@ public void onUpdate(final float pSecondsElapsed) { @Override public void reset() { final int handlerCount = this.size(); - for(int i = handlerCount - 1; i >= 0; i--) { + for (int i = handlerCount - 1; i >= 0; i--) { this.get(i).reset(); } } diff --git a/src/org/andengine/engine/handler/collision/CollisionHandler.java b/src/org/andengine/engine/handler/collision/CollisionHandler.java index dc8f5d84b..797a08960 100644 --- a/src/org/andengine/engine/handler/collision/CollisionHandler.java +++ b/src/org/andengine/engine/handler/collision/CollisionHandler.java @@ -64,10 +64,10 @@ public void onUpdate(final float pSecondsElapsed) { final ArrayList staticEntities = this.mTargetStaticEntities; final int staticEntityCount = staticEntities.size(); - for(int i = 0; i < staticEntityCount; i++){ - if(checkShape.collidesWith(staticEntities.get(i))){ + for (int i = 0; i < staticEntityCount; i++) { + if (checkShape.collidesWith(staticEntities.get(i))) { final boolean proceed = this.mCollisionCallback.onCollision(checkShape, staticEntities.get(i)); - if(!proceed) { + if (!proceed) { return; } } diff --git a/src/org/andengine/engine/handler/physics/PhysicsHandler.java b/src/org/andengine/engine/handler/physics/PhysicsHandler.java index f1629060f..811f6ecb0 100644 --- a/src/org/andengine/engine/handler/physics/PhysicsHandler.java +++ b/src/org/andengine/engine/handler/physics/PhysicsHandler.java @@ -120,25 +120,25 @@ public void setAngularVelocity(final float pAngularVelocity) { @Override protected void onUpdate(final float pSecondsElapsed, final IEntity pEntity) { - if(this.mEnabled) { + if (this.mEnabled) { /* Apply linear acceleration. */ final float accelerationX = this.mAccelerationX; final float accelerationY = this.mAccelerationY; - if(accelerationX != 0 || accelerationY != 0) { + if (accelerationX != 0 || accelerationY != 0) { this.mVelocityX += accelerationX * pSecondsElapsed; this.mVelocityY += accelerationY * pSecondsElapsed; } /* Apply angular velocity. */ final float angularVelocity = this.mAngularVelocity; - if(angularVelocity != 0) { + if (angularVelocity != 0) { pEntity.setRotation(pEntity.getRotation() + angularVelocity * pSecondsElapsed); } /* Apply linear velocity. */ final float velocityX = this.mVelocityX; final float velocityY = this.mVelocityY; - if(velocityX != 0 || velocityY != 0) { + if (velocityX != 0 || velocityY != 0) { pEntity.setPosition(pEntity.getX() + velocityX * pSecondsElapsed, pEntity.getY() + velocityY * pSecondsElapsed); } } diff --git a/src/org/andengine/engine/handler/runnable/RunnableHandler.java b/src/org/andengine/engine/handler/runnable/RunnableHandler.java index e82e4e05b..8b29cdbaf 100644 --- a/src/org/andengine/engine/handler/runnable/RunnableHandler.java +++ b/src/org/andengine/engine/handler/runnable/RunnableHandler.java @@ -38,7 +38,7 @@ public class RunnableHandler implements IUpdateHandler { public synchronized void onUpdate(final float pSecondsElapsed) { final ArrayList runnables = this.mRunnables; final int runnableCount = runnables.size(); - for(int i = runnableCount - 1; i >= 0; i--) { + for (int i = runnableCount - 1; i >= 0; i--) { runnables.get(i).run(); } runnables.clear(); diff --git a/src/org/andengine/engine/handler/timer/TimerHandler.java b/src/org/andengine/engine/handler/timer/TimerHandler.java index cdfd36b01..8b8744961 100644 --- a/src/org/andengine/engine/handler/timer/TimerHandler.java +++ b/src/org/andengine/engine/handler/timer/TimerHandler.java @@ -33,7 +33,7 @@ public TimerHandler(final float pTimerSeconds, final ITimerCallback pTimerCallba } public TimerHandler(final float pTimerSeconds, final boolean pAutoReset, final ITimerCallback pTimerCallback) { - if(pTimerSeconds <= 0){ + if (pTimerSeconds <= 0) { throw new IllegalStateException("pTimerSeconds must be >= 0!"); } @@ -80,16 +80,16 @@ public void setTimerCallbackTriggered(boolean pTimerCallbackTriggered) { @Override public void onUpdate(final float pSecondsElapsed) { - if(this.mAutoReset) { + if (this.mAutoReset) { this.mTimerSecondsElapsed += pSecondsElapsed; while(this.mTimerSecondsElapsed >= this.mTimerSeconds) { this.mTimerSecondsElapsed -= this.mTimerSeconds; this.mTimerCallback.onTimePassed(this); } } else { - if(!this.mTimerCallbackTriggered) { + if (!this.mTimerCallbackTriggered) { this.mTimerSecondsElapsed += pSecondsElapsed; - if(this.mTimerSecondsElapsed >= this.mTimerSeconds) { + if (this.mTimerSecondsElapsed >= this.mTimerSeconds) { this.mTimerCallbackTriggered = true; this.mTimerCallback.onTimePassed(this); } diff --git a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java index 4e339fd08..8df06c00d 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java @@ -52,7 +52,7 @@ public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback int measuredWidth; int measuredHeight; - if(realRatio < desiredRatio) { + if (realRatio < desiredRatio) { measuredWidth = specWidth; measuredHeight = Math.round(measuredWidth / desiredRatio); } else { diff --git a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java index 07544d50d..911d9ceb0 100644 --- a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java @@ -91,7 +91,7 @@ public void setSecondScene(final Scene pScene) { protected void onUpdateScene(final float pSecondsElapsed) { super.onUpdateScene(pSecondsElapsed); - if(this.mSecondScene != null) { + if (this.mSecondScene != null) { this.mSecondScene.onUpdate(pSecondsElapsed); } @@ -110,7 +110,7 @@ protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { pGLState.enableScissorTest(); /* First Screen. With first camera, on the left half of the screens width. */ - if(super.mScene != null) { + if (super.mScene != null) { GLES20.glScissor(0, 0, surfaceWidthHalf, surfaceHeight); GLES20.glViewport(0, 0, surfaceWidthHalf, surfaceHeight); @@ -119,7 +119,7 @@ protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { } /* Second Screen. With second camera, on the right half of the screens width. */ - if(this.mSecondScene != null) { + if (this.mSecondScene != null) { GLES20.glScissor(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); GLES20.glViewport(surfaceWidthHalf, 0, surfaceWidthHalf, surfaceHeight); @@ -132,7 +132,7 @@ protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { @Override protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { - if(pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { + if (pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { return this.getFirstCamera(); } else { return this.getSecondCamera(); @@ -141,7 +141,7 @@ protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { @Override protected Scene getSceneFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { - if(pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { + if (pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { return this.getFirstScene(); } else { return this.getSecondScene(); @@ -152,7 +152,7 @@ protected Scene getSceneFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { final int surfaceWidthHalf = this.mSurfaceWidth >> 1; - if(pCamera == this.getFirstCamera()) { + if (pCamera == this.getFirstCamera()) { pCamera.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); } else { pSurfaceTouchEvent.offset(-surfaceWidthHalf, 0); diff --git a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java index 370deaf36..2914aa812 100644 --- a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java @@ -66,7 +66,7 @@ protected void onUpdateScene(final float pSecondsElapsed) { @Override protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { - if(super.mScene != null) { + if (super.mScene != null) { final Camera secondCamera = this.getSecondCamera(); final int surfaceWidth = this.mSurfaceWidth; @@ -100,7 +100,7 @@ protected void onDrawScene(final GLState pGLState, final Camera pFirstCamera) { @Override protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { - if(pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { + if (pTouchEvent.getX() <= this.mSurfaceWidth >> 1) { return this.getFirstCamera(); } else { return this.getSecondCamera(); @@ -111,7 +111,7 @@ protected Camera getCameraFromSurfaceTouchEvent(final TouchEvent pTouchEvent) { protected void convertSurfaceTouchEventToSceneTouchEvent(final Camera pCamera, final TouchEvent pSurfaceTouchEvent) { final int surfaceWidthHalf = this.mSurfaceWidth >> 1; - if(pCamera == this.getFirstCamera()) { + if (pCamera == this.getFirstCamera()) { pCamera.convertSurfaceTouchEventToSceneTouchEvent(pSurfaceTouchEvent, surfaceWidthHalf, this.mSurfaceHeight); } else { pSurfaceTouchEvent.offset(-surfaceWidthHalf, 0); diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 06f8454e8..f68e52400 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -182,7 +182,7 @@ public boolean isCulled(final Camera pCamera) { @Override public boolean collidesWith(final IEntity pOtherEntity) { - if(pOtherEntity instanceof Line) { + if (pOtherEntity instanceof Line) { return EntityCollisionChecker.checkCollision(this, (Line) pOtherEntity); } else { return EntityCollisionChecker.checkCollision(this, pOtherEntity); @@ -697,7 +697,7 @@ public void setColor(final Color pColor) { */ @Override public void setRed(final float pRed) { - if(this.mColor.setRedChecking(pRed)) { // TODO Is this check worth it? + if (this.mColor.setRedChecking(pRed)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -707,7 +707,7 @@ public void setRed(final float pRed) { */ @Override public void setGreen(final float pGreen) { - if(this.mColor.setGreenChecking(pGreen)) { // TODO Is this check worth it? + if (this.mColor.setGreenChecking(pGreen)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -717,7 +717,7 @@ public void setGreen(final float pGreen) { */ @Override public void setBlue(final float pBlue) { - if(this.mColor.setBlueChecking(pBlue)) { // TODO Is this check worth it? + if (this.mColor.setBlueChecking(pBlue)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -727,7 +727,7 @@ public void setBlue(final float pBlue) { */ @Override public void setAlpha(final float pAlpha) { - if(this.mColor.setAlphaChecking(pAlpha)) { // TODO Is this check worth it? + if (this.mColor.setAlphaChecking(pAlpha)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -739,7 +739,7 @@ public void setAlpha(final float pAlpha) { */ @Override public void setColor(final float pRed, final float pGreen, final float pBlue) { - if(this.mColor.setChecking(pRed, pGreen, pBlue)) { // TODO Is this check worth it? + if (this.mColor.setChecking(pRed, pGreen, pBlue)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -752,14 +752,14 @@ public void setColor(final float pRed, final float pGreen, final float pBlue) { */ @Override public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - if(this.mColor.setChecking(pRed, pGreen, pBlue, pAlpha)) { // TODO Is this check worth it? + if (this.mColor.setChecking(pRed, pGreen, pBlue, pAlpha)) { // TODO Is this check worth it? this.onUpdateColor(); } } @Override public int getChildCount() { - if(this.mChildren == null) { + if (this.mChildren == null) { return 0; } return this.mChildren.size(); @@ -767,12 +767,12 @@ public int getChildCount() { @Override public IEntity getChildByTag(final int pTag) { - if(this.mChildren == null) { + if (this.mChildren == null) { return null; } - for(int i = this.mChildren.size() - 1; i >= 0; i--) { + for (int i = this.mChildren.size() - 1; i >= 0; i--) { final IEntity child = this.mChildren.get(i); - if(child.getTag() == pTag) { + if (child.getTag() == pTag) { return child; } } @@ -781,7 +781,7 @@ public IEntity getChildByTag(final int pTag) { @Override public IEntity getChildByIndex(final int pIndex) { - if(this.mChildren == null) { + if (this.mChildren == null) { return null; } return this.mChildren.get(pIndex); @@ -789,7 +789,7 @@ public IEntity getChildByIndex(final int pIndex) { @Override public IEntity getChildByMatcher(final IEntityMatcher pEntityMatcher) { - if(this.mChildren == null) { + if (this.mChildren == null) { return null; } return this.mChildren.get(pEntityMatcher); @@ -797,7 +797,7 @@ public IEntity getChildByMatcher(final IEntityMatcher pEntityMatcher) { @Override public IEntity getFirstChild() { - if(this.mChildren == null) { + if (this.mChildren == null) { return null; } return this.mChildren.get(0); @@ -805,7 +805,7 @@ public IEntity getFirstChild() { @Override public IEntity getLastChild() { - if(this.mChildren == null) { + if (this.mChildren == null) { return null; } return this.mChildren.get(this.mChildren.size() - 1); @@ -825,14 +825,14 @@ public IEntity queryFirst(final IEntityMatcher pEntityMatcher) { @Override public S queryFirstForSubclass(final IEntityMatcher pEntityMatcher) { final int childCount = this.getChildCount(); - for(int i = 0; i < childCount; i++) { + for (int i = 0; i < childCount; i++) { final IEntity child = this.mChildren.get(i); - if(pEntityMatcher.matches(child)) { + if (pEntityMatcher.matches(child)) { return (S)child; } final S childQueryFirst = child.queryFirstForSubclass(pEntityMatcher); - if(childQueryFirst != null) { + if (childQueryFirst != null) { return childQueryFirst; } } @@ -843,9 +843,9 @@ public S queryFirstForSubclass(final IEntityMatcher pEntityM @Override public > L query(final IEntityMatcher pEntityMatcher, final L pResult) { final int childCount = this.getChildCount(); - for(int i = 0; i < childCount; i++) { + for (int i = 0; i < childCount; i++) { final IEntity child = this.mChildren.get(i); - if(pEntityMatcher.matches(child)) { + if (pEntityMatcher.matches(child)) { pResult.add(child); } @@ -864,9 +864,9 @@ public ArrayList queryForSubclass(final IEntityMatcher pE @Override public , S extends IEntity> L queryForSubclass(final IEntityMatcher pEntityMatcher, final L pResult) throws ClassCastException { final int childCount = this.getChildCount(); - for(int i = 0; i < childCount; i++) { + for (int i = 0; i < childCount; i++) { final IEntity child = this.mChildren.get(i); - if(pEntityMatcher.matches(child)) { + if (pEntityMatcher.matches(child)) { pResult.add((S)child); } @@ -879,7 +879,7 @@ public , S extends IEntity> L queryForSubclass(final IEntityMa @Override public boolean detachSelf() { final IEntity parent = this.mParent; - if(parent != null) { + if (parent != null) { return parent.detachChild(this); } else { return false; @@ -888,7 +888,7 @@ public boolean detachSelf() { @Override public void detachChildren() { - if(this.mChildren == null) { + if (this.mChildren == null) { return; } this.mChildren.clear(Entity.PARAMETERCALLABLE_DETACHCHILD); @@ -898,7 +898,7 @@ public void detachChildren() { public void attachChild(final IEntity pEntity) throws IllegalStateException { this.assertEntityHasNoParent(pEntity); - if(this.mChildren == null) { + if (this.mChildren == null) { this.allocateChildren(); } this.mChildren.add(pEntity); @@ -913,10 +913,10 @@ public void sortChildren() { @Override public void sortChildren(final boolean pImmediate) { - if(this.mChildren == null) { + if (this.mChildren == null) { return; } - if(pImmediate) { + if (pImmediate) { ZIndexSorter.getInstance().sort(this.mChildren); } else { this.mChildrenSortPending = true; @@ -925,7 +925,7 @@ public void sortChildren(final boolean pImmediate) { @Override public void sortChildren(final IEntityComparator pEntityComparator) { - if(this.mChildren == null) { + if (this.mChildren == null) { return; } ZIndexSorter.getInstance().sort(this.mChildren, pEntityComparator); @@ -933,7 +933,7 @@ public void sortChildren(final IEntityComparator pEntityComparator) { @Override public boolean detachChild(final IEntity pEntity) { - if(this.mChildren == null) { + if (this.mChildren == null) { return false; } return this.mChildren.remove(pEntity, Entity.PARAMETERCALLABLE_DETACHCHILD); @@ -941,11 +941,11 @@ public boolean detachChild(final IEntity pEntity) { @Override public IEntity detachChild(final int pTag) { - if(this.mChildren == null) { + if (this.mChildren == null) { return null; } - for(int i = this.mChildren.size() - 1; i >= 0; i--) { - if(this.mChildren.get(i).getTag() == pTag) { + for (int i = this.mChildren.size() - 1; i >= 0; i--) { + if (this.mChildren.get(i).getTag() == pTag) { final IEntity removed = this.mChildren.remove(i); Entity.PARAMETERCALLABLE_DETACHCHILD.call(removed); return removed; @@ -956,7 +956,7 @@ public IEntity detachChild(final int pTag) { @Override public IEntity detachChild(final IEntityMatcher pEntityMatcher) { - if(this.mChildren == null) { + if (this.mChildren == null) { return null; } return this.mChildren.remove(pEntityMatcher, Entity.PARAMETERCALLABLE_DETACHCHILD); @@ -964,7 +964,7 @@ public IEntity detachChild(final IEntityMatcher pEntityMatcher) { @Override public boolean detachChildren(final IEntityMatcher pEntityMatcher) { - if(this.mChildren == null) { + if (this.mChildren == null) { return false; } return this.mChildren.removeAll(pEntityMatcher, Entity.PARAMETERCALLABLE_DETACHCHILD); @@ -972,7 +972,7 @@ public boolean detachChildren(final IEntityMatcher pEntityMatcher) { @Override public void callOnChildren(final IEntityParameterCallable pEntityParameterCallable) { - if(this.mChildren == null) { + if (this.mChildren == null) { return; } this.mChildren.call(pEntityParameterCallable); @@ -980,7 +980,7 @@ public void callOnChildren(final IEntityParameterCallable pEntityParameterCallab @Override public void callOnChildren(final IEntityParameterCallable pEntityParameterCallable, final IEntityMatcher pEntityMatcher) { - if(this.mChildren == null) { + if (this.mChildren == null) { return; } this.mChildren.call(pEntityMatcher, pEntityParameterCallable); @@ -988,7 +988,7 @@ public void callOnChildren(final IEntityParameterCallable pEntityParameterCallab @Override public void registerUpdateHandler(final IUpdateHandler pUpdateHandler) { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { this.allocateUpdateHandlers(); } this.mUpdateHandlers.add(pUpdateHandler); @@ -996,7 +996,7 @@ public void registerUpdateHandler(final IUpdateHandler pUpdateHandler) { @Override public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler) { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { return false; } return this.mUpdateHandlers.remove(pUpdateHandler); @@ -1004,7 +1004,7 @@ public boolean unregisterUpdateHandler(final IUpdateHandler pUpdateHandler) { @Override public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandlerMatcher) { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { return false; } return this.mUpdateHandlers.removeAll(pUpdateHandlerMatcher); @@ -1012,7 +1012,7 @@ public boolean unregisterUpdateHandlers(final IUpdateHandlerMatcher pUpdateHandl @Override public int getUpdateHandlerCount() { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { return 0; } return this.mUpdateHandlers.size(); @@ -1020,7 +1020,7 @@ public int getUpdateHandlerCount() { @Override public void clearUpdateHandlers() { - if(this.mUpdateHandlers == null) { + if (this.mUpdateHandlers == null) { return; } this.mUpdateHandlers.clear(); @@ -1028,7 +1028,7 @@ public void clearUpdateHandlers() { @Override public void registerEntityModifier(final IEntityModifier pEntityModifier) { - if(this.mEntityModifiers == null) { + if (this.mEntityModifiers == null) { this.allocateEntityModifiers(); } this.mEntityModifiers.add(pEntityModifier); @@ -1036,7 +1036,7 @@ public void registerEntityModifier(final IEntityModifier pEntityModifier) { @Override public boolean unregisterEntityModifier(final IEntityModifier pEntityModifier) { - if(this.mEntityModifiers == null) { + if (this.mEntityModifiers == null) { return false; } return this.mEntityModifiers.remove(pEntityModifier); @@ -1044,7 +1044,7 @@ public boolean unregisterEntityModifier(final IEntityModifier pEntityModifier) { @Override public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityModifierMatcher) { - if(this.mEntityModifiers == null) { + if (this.mEntityModifiers == null) { return false; } return this.mEntityModifiers.removeAll(pEntityModifierMatcher); @@ -1052,7 +1052,7 @@ public boolean unregisterEntityModifiers(final IEntityModifierMatcher pEntityMod @Override public int getEntityModifierCount() { - if(this.mEntityModifiers == null) { + if (this.mEntityModifiers == null) { return 0; } return this.mEntityModifiers.size(); @@ -1060,14 +1060,14 @@ public int getEntityModifierCount() { @Override public void resetEntityModifiers() { - if(this.mEntityModifiers != null) { + if (this.mEntityModifiers != null) { this.mEntityModifiers.reset(); } } @Override public void clearEntityModifiers() { - if(this.mEntityModifiers == null) { + if (this.mEntityModifiers == null) { return; } this.mEntityModifiers.clear(); @@ -1085,18 +1085,18 @@ public float[] getSceneCenterCoordinates(final float[] pReuse) { @Override public Transformation getLocalToParentTransformation() { - if(this.mLocalToParentTransformation == null) { + if (this.mLocalToParentTransformation == null) { this.mLocalToParentTransformation = new Transformation(); } final Transformation localToParentTransformation = this.mLocalToParentTransformation; - if(this.mLocalToParentTransformationDirty) { + if (this.mLocalToParentTransformationDirty) { localToParentTransformation.setToIdentity(); /* Scale. */ final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; - if((scaleX != 1) || (scaleY != 1)) { + if ((scaleX != 1) || (scaleY != 1)) { final float scaleCenterX = this.mLocalScaleCenterX; final float scaleCenterY = this.mLocalScaleCenterY; @@ -1111,7 +1111,7 @@ public Transformation getLocalToParentTransformation() { /* Skew. */ final float skewX = this.mSkewX; final float skewY = this.mSkewY; - if((skewX != 0) || (skewY != 0)) { + if ((skewX != 0) || (skewY != 0)) { final float skewCenterX = this.mLocalSkewCenterX; final float skewCenterY = this.mLocalSkewCenterY; @@ -1122,7 +1122,7 @@ public Transformation getLocalToParentTransformation() { /* Rotation. */ final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { final float rotationCenterX = this.mLocalRotationCenterX; final float rotationCenterY = this.mLocalRotationCenterY; @@ -1144,12 +1144,12 @@ public Transformation getLocalToParentTransformation() { @Override public Transformation getParentToLocalTransformation() { - if(this.mParentToLocalTransformation == null) { + if (this.mParentToLocalTransformation == null) { this.mParentToLocalTransformation = new Transformation(); } final Transformation parentToLocalTransformation = this.mParentToLocalTransformation; - if(this.mParentToLocalTransformationDirty) { + if (this.mParentToLocalTransformationDirty) { parentToLocalTransformation.setToIdentity(); /* Offset. */ @@ -1160,7 +1160,7 @@ public Transformation getParentToLocalTransformation() { /* Rotation. */ final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { final float localRotationCenterX = this.mLocalRotationCenterX; final float localRotationCenterY = this.mLocalRotationCenterY; @@ -1172,7 +1172,7 @@ public Transformation getParentToLocalTransformation() { /* Skew. */ final float skewX = this.mSkewX; final float skewY = this.mSkewY; - if((skewX != 0) || (skewY != 0)) { + if ((skewX != 0) || (skewY != 0)) { final float localSkewCenterX = this.mLocalSkewCenterX; final float localSkewCenterY = this.mLocalSkewCenterY; @@ -1184,7 +1184,7 @@ public Transformation getParentToLocalTransformation() { /* Scale. */ final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; - if((scaleX != 1) || (scaleY != 1)) { + if ((scaleX != 1) || (scaleY != 1)) { final float localScaleCenterX = this.mLocalScaleCenterX; final float localScaleCenterY = this.mLocalScaleCenterY; @@ -1200,7 +1200,7 @@ public Transformation getParentToLocalTransformation() { @Override public Transformation getLocalToSceneTransformation() { - if(this.mLocalToSceneTransformation == null) { + if (this.mLocalToSceneTransformation == null) { this.mLocalToSceneTransformation = new Transformation(); } @@ -1209,7 +1209,7 @@ public Transformation getLocalToSceneTransformation() { localToSceneTransformation.setTo(this.getLocalToParentTransformation()); final IEntity parent = this.mParent; - if(parent != null) { + if (parent != null) { localToSceneTransformation.postConcat(parent.getLocalToSceneTransformation()); } @@ -1218,7 +1218,7 @@ public Transformation getLocalToSceneTransformation() { @Override public Transformation getSceneToLocalTransformation() { - if(this.mSceneToLocalTransformation == null) { + if (this.mSceneToLocalTransformation == null) { this.mSceneToLocalTransformation = new Transformation(); } @@ -1227,7 +1227,7 @@ public Transformation getSceneToLocalTransformation() { sceneToLocalTransformation.setTo(this.getParentToLocalTransformation()); final IEntity parent = this.mParent; - if(parent != null) { + if (parent != null) { sceneToLocalTransformation.preConcat(parent.getSceneToLocalTransformation()); } @@ -1344,14 +1344,14 @@ public void setUserData(final Object pUserData) { @Override public final void onDraw(final GLState pGLState, final Camera pCamera) { - if(this.mVisible && !(this.mCullingEnabled && this.isCulled(pCamera))) { + if (this.mVisible && !(this.mCullingEnabled && this.isCulled(pCamera))) { this.onManagedDraw(pGLState, pCamera); } } @Override public final void onUpdate(final float pSecondsElapsed) { - if(!this.mIgnoreUpdate) { + if (!this.mIgnoreUpdate) { this.onManagedUpdate(pSecondsElapsed); } } @@ -1378,9 +1378,9 @@ public void reset() { this.resetEntityModifiers(); - if(this.mChildren != null) { + if (this.mChildren != null) { final SmartList children = this.mChildren; - for(int i = children.size() - 1; i >= 0; i--) { + for (int i = children.size() - 1; i >= 0; i--) { final IEntity child = children.get(i); child.reset(); } @@ -1389,7 +1389,7 @@ public void reset() { @Override public void dispose() { - if(!this.mDisposed) { + if (!this.mDisposed) { this.mDisposed = true; } else { throw new AlreadyDisposedException(); @@ -1400,7 +1400,7 @@ public void dispose() { protected void finalize() throws Throwable { super.finalize(); - if(!this.mDisposed) { + if (!this.mDisposed) { this.dispose(); } } @@ -1416,17 +1416,17 @@ public String toString() { public void toString(final StringBuilder pStringBuilder) { pStringBuilder.append(this.getClass().getSimpleName()); - if((this.mChildren != null) && (this.mChildren.size() > 0)) { + if ((this.mChildren != null) && (this.mChildren.size() > 0)) { final SmartList children = this.mChildren; pStringBuilder.append(" ["); final int childCount = children.size(); - for(int i = 0; i < childCount; i++) { + for (int i = 0; i < childCount; i++) { final IEntity child = children.get(i); child.toString(pStringBuilder); - if(i < (childCount - 1)) { + if (i < (childCount - 1)) { pStringBuilder.append(", "); } } @@ -1502,7 +1502,7 @@ protected void applyTranslation(final GLState pGLState) { protected void applyRotation(final GLState pGLState) { final float rotation = this.mRotation; - if(rotation != 0) { + if (rotation != 0) { final float localRotationCenterX = this.mLocalRotationCenterX; final float localRotationCenterY = this.mLocalRotationCenterY; @@ -1520,7 +1520,7 @@ protected void applySkew(final GLState pGLState) { final float skewX = this.mSkewX; final float skewY = this.mSkewY; - if((skewX != 0) || (skewY != 0)) { + if ((skewX != 0) || (skewY != 0)) { final float localSkewCenterX = this.mLocalSkewCenterX; final float localSkewCenterY = this.mLocalSkewCenterY; @@ -1534,7 +1534,7 @@ protected void applyScale(final GLState pGLState) { final float scaleX = this.mScaleX; final float scaleY = this.mScaleY; - if((scaleX != 1) || (scaleY != 1)) { + if ((scaleX != 1) || (scaleY != 1)) { final float localScaleCenterX = this.mLocalScaleCenterX; final float localScaleCenterY = this.mLocalScaleCenterY; @@ -1550,13 +1550,13 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { this.onApplyTransformations(pGLState); final SmartList children = this.mChildren; - if((children == null) || !this.mChildrenVisible) { + if ((children == null) || !this.mChildrenVisible) { /* Draw only self. */ this.preDraw(pGLState, pCamera); this.draw(pGLState, pCamera); this.postDraw(pGLState, pCamera); } else { - if(this.mChildrenSortPending) { + if (this.mChildrenSortPending) { ZIndexSorter.getInstance().sort(this.mChildren); this.mChildrenSortPending = false; } @@ -1565,9 +1565,9 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { int i = 0; { /* Draw children behind this Entity. */ - for(; i < childCount; i++) { + for (; i < childCount; i++) { final IEntity child = children.get(i); - if(child.getZIndex() < 0) { + if (child.getZIndex() < 0) { child.onDraw(pGLState, pCamera); } else { break; @@ -1581,7 +1581,7 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { this.postDraw(pGLState, pCamera); { /* Draw children in front of this Entity. */ - for(; i < childCount; i++) { + for (; i < childCount; i++) { children.get(i).onDraw(pGLState, pCamera); } } @@ -1591,17 +1591,17 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { } protected void onManagedUpdate(final float pSecondsElapsed) { - if(this.mEntityModifiers != null) { + if (this.mEntityModifiers != null) { this.mEntityModifiers.onUpdate(pSecondsElapsed); } - if(this.mUpdateHandlers != null) { + if (this.mUpdateHandlers != null) { this.mUpdateHandlers.onUpdate(pSecondsElapsed); } - if((this.mChildren != null) && !this.mChildrenIgnoreUpdate) { + if ((this.mChildren != null) && !this.mChildrenIgnoreUpdate) { final SmartList children = this.mChildren; final int entityCount = children.size(); - for(int i = 0; i < entityCount; i++) { + for (int i = 0; i < entityCount; i++) { final IEntity child = children.get(i); child.onUpdate(pSecondsElapsed); } @@ -1692,7 +1692,7 @@ public void resetSkewCenter() { } private void assertEntityHasNoParent(final IEntity pEntity) throws IllegalStateException { - if(pEntity.hasParent()) { + if (pEntity.hasParent()) { final String entityClassName = pEntity.getClass().getSimpleName(); final String currentParentClassName = pEntity.getParent().getClass().getSimpleName(); final String newParentClassName = this.getClass().getSimpleName(); diff --git a/src/org/andengine/entity/ZIndexSorter.java b/src/org/andengine/entity/ZIndexSorter.java index 33d5e8972..4b45ab7a4 100644 --- a/src/org/andengine/entity/ZIndexSorter.java +++ b/src/org/andengine/entity/ZIndexSorter.java @@ -40,7 +40,7 @@ private ZIndexSorter() { } public static ZIndexSorter getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new ZIndexSorter(); } return INSTANCE; diff --git a/src/org/andengine/entity/clip/ClipEntity.java b/src/org/andengine/entity/clip/ClipEntity.java index f191503a0..1bdb3fc64 100644 --- a/src/org/andengine/entity/clip/ClipEntity.java +++ b/src/org/andengine/entity/clip/ClipEntity.java @@ -62,7 +62,7 @@ public void setClippingEnabled(final boolean pClippingEnabled) { @Override protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { - if(this.mClippingEnabled) { + if (this.mClippingEnabled) { /* Enable scissor test, while remembering previous state. */ final boolean wasScissorTestEnabled = pGLState.enableScissorTest(); diff --git a/src/org/andengine/entity/modifier/AlphaModifier.java b/src/org/andengine/entity/modifier/AlphaModifier.java index ce905b317..6442d947e 100644 --- a/src/org/andengine/entity/modifier/AlphaModifier.java +++ b/src/org/andengine/entity/modifier/AlphaModifier.java @@ -45,7 +45,7 @@ protected AlphaModifier(final AlphaModifier pAlphaModifier) { } @Override - public AlphaModifier deepCopy(){ + public AlphaModifier deepCopy() { return new AlphaModifier(this); } diff --git a/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java b/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java index c0c6e977d..4ea81a4a8 100644 --- a/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java +++ b/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java @@ -84,7 +84,7 @@ protected void onManagedUpdate(final float pSecondsElapsed, final IEntity pEntit /* Calculate active control point. */ final int p; - if(percentageDone == 1) { + if (percentageDone == 1) { p = this.mControlSegmentCount; } else { p = (int) (percentageDone / this.mControlSegmentCountInverse); @@ -192,7 +192,7 @@ public static class CardinalSplineMoveModifierConfig { * @param pTension [-1, 1] */ public CardinalSplineMoveModifierConfig(final int pControlPointCount, final float pTension) { - if(pControlPointCount < CardinalSplineMoveModifierConfig.CONTROLPOINT_COUNT_MINIMUM) { + if (pControlPointCount < CardinalSplineMoveModifierConfig.CONTROLPOINT_COUNT_MINIMUM) { throw new IllegalArgumentException("A " + CardinalSplineMoveModifierConfig.class.getSimpleName() + " needs at least " + CardinalSplineMoveModifierConfig.CONTROLPOINT_COUNT_MINIMUM + " control points."); } diff --git a/src/org/andengine/entity/modifier/ColorModifier.java b/src/org/andengine/entity/modifier/ColorModifier.java index e99a3d498..5093f3180 100644 --- a/src/org/andengine/entity/modifier/ColorModifier.java +++ b/src/org/andengine/entity/modifier/ColorModifier.java @@ -62,7 +62,7 @@ protected ColorModifier(final ColorModifier pColorModifier) { } @Override - public ColorModifier deepCopy(){ + public ColorModifier deepCopy() { return new ColorModifier(this); } diff --git a/src/org/andengine/entity/modifier/DelayModifier.java b/src/org/andengine/entity/modifier/DelayModifier.java index 8366fed65..6c168ef39 100644 --- a/src/org/andengine/entity/modifier/DelayModifier.java +++ b/src/org/andengine/entity/modifier/DelayModifier.java @@ -35,7 +35,7 @@ protected DelayModifier(final DelayModifier pDelayModifier) { } @Override - public DelayModifier deepCopy(){ + public DelayModifier deepCopy() { return new DelayModifier(this); } diff --git a/src/org/andengine/entity/modifier/MoveByModifier.java b/src/org/andengine/entity/modifier/MoveByModifier.java index 571d8a7b5..03b328e0c 100644 --- a/src/org/andengine/entity/modifier/MoveByModifier.java +++ b/src/org/andengine/entity/modifier/MoveByModifier.java @@ -34,7 +34,7 @@ protected MoveByModifier(final DoubleValueChangeEntityModifier pDoubleValueChang } @Override - public MoveByModifier deepCopy(){ + public MoveByModifier deepCopy() { return new MoveByModifier(this); } diff --git a/src/org/andengine/entity/modifier/MoveModifier.java b/src/org/andengine/entity/modifier/MoveModifier.java index cbf0212e2..ac2e58a38 100644 --- a/src/org/andengine/entity/modifier/MoveModifier.java +++ b/src/org/andengine/entity/modifier/MoveModifier.java @@ -45,7 +45,7 @@ protected MoveModifier(final MoveModifier pMoveModifier) { } @Override - public MoveModifier deepCopy(){ + public MoveModifier deepCopy() { return new MoveModifier(this); } diff --git a/src/org/andengine/entity/modifier/MoveXModifier.java b/src/org/andengine/entity/modifier/MoveXModifier.java index ac56db7cb..d093e0d9a 100644 --- a/src/org/andengine/entity/modifier/MoveXModifier.java +++ b/src/org/andengine/entity/modifier/MoveXModifier.java @@ -45,7 +45,7 @@ protected MoveXModifier(final MoveXModifier pMoveXModifier) { } @Override - public MoveXModifier deepCopy(){ + public MoveXModifier deepCopy() { return new MoveXModifier(this); } diff --git a/src/org/andengine/entity/modifier/MoveYModifier.java b/src/org/andengine/entity/modifier/MoveYModifier.java index 11ad53887..b5d178b7b 100644 --- a/src/org/andengine/entity/modifier/MoveYModifier.java +++ b/src/org/andengine/entity/modifier/MoveYModifier.java @@ -45,7 +45,7 @@ protected MoveYModifier(final MoveYModifier pMoveYModifier) { } @Override - public MoveYModifier deepCopy(){ + public MoveYModifier deepCopy() { return new MoveYModifier(this); } diff --git a/src/org/andengine/entity/modifier/PathModifier.java b/src/org/andengine/entity/modifier/PathModifier.java index e075e83eb..ca0d094be 100644 --- a/src/org/andengine/entity/modifier/PathModifier.java +++ b/src/org/andengine/entity/modifier/PathModifier.java @@ -82,7 +82,7 @@ public PathModifier(final float pDuration, final Path pPath, final IEntityModifi final float velocity = pPath.getLength() / pDuration; final int modifierCount = moveModifiers.length; - for(int i = 0; i < modifierCount; i++) { + for (int i = 0; i < modifierCount; i++) { final float duration = pPath.getSegmentLength(i) / velocity; moveModifiers[i] = new MoveModifier(duration, coordinatesX[i], coordinatesY[i], coordinatesX[i + 1], coordinatesY[i + 1], null, pEaseFunction); } @@ -93,14 +93,14 @@ public PathModifier(final float pDuration, final Path pPath, final IEntityModifi new ISubSequenceModifierListener() { @Override public void onSubSequenceStarted(final IModifier pModifier, final IEntity pEntity, final int pIndex) { - if(PathModifier.this.mPathModifierListener != null) { + if (PathModifier.this.mPathModifierListener != null) { PathModifier.this.mPathModifierListener.onPathWaypointStarted(PathModifier.this, pEntity, pIndex); } } @Override public void onSubSequenceFinished(final IModifier pEntityModifier, final IEntity pEntity, final int pIndex) { - if(PathModifier.this.mPathModifierListener != null) { + if (PathModifier.this.mPathModifierListener != null) { PathModifier.this.mPathModifierListener.onPathWaypointFinished(PathModifier.this, pEntity, pIndex); } } @@ -109,7 +109,7 @@ public void onSubSequenceFinished(final IModifier pEntityModifier, fina @Override public void onModifierStarted(final IModifier pModifier, final IEntity pEntity) { PathModifier.this.onModifierStarted(pEntity); - if(PathModifier.this.mPathModifierListener != null) { + if (PathModifier.this.mPathModifierListener != null) { PathModifier.this.mPathModifierListener.onPathStarted(PathModifier.this, pEntity); } } @@ -117,7 +117,7 @@ public void onModifierStarted(final IModifier pModifier, final IEntity @Override public void onModifierFinished(final IModifier pEntityModifier, final IEntity pEntity) { PathModifier.this.onModifierFinished(pEntity); - if(PathModifier.this.mPathModifierListener != null) { + if (PathModifier.this.mPathModifierListener != null) { PathModifier.this.mPathModifierListener.onPathFinished(PathModifier.this, pEntity); } } @@ -301,7 +301,7 @@ public int getSize() { } public float getLength() { - if(this.mLengthChanged) { + if (this.mLengthChanged) { this.updateLength(); } return this.mLength; @@ -330,7 +330,7 @@ public float getSegmentLength(final int pSegmentIndex) { private void updateLength() { float length = 0.0f; - for(int i = this.mIndex - 2; i >= 0; i--) { + for (int i = this.mIndex - 2; i >= 0; i--) { length += this.getSegmentLength(i); } this.mLength = length; diff --git a/src/org/andengine/entity/modifier/RotationAtModifier.java b/src/org/andengine/entity/modifier/RotationAtModifier.java index 6d3c960aa..dea948b23 100644 --- a/src/org/andengine/entity/modifier/RotationAtModifier.java +++ b/src/org/andengine/entity/modifier/RotationAtModifier.java @@ -55,7 +55,7 @@ protected RotationAtModifier(final RotationAtModifier pRotationAtModifier) { } @Override - public RotationAtModifier deepCopy(){ + public RotationAtModifier deepCopy() { return new RotationAtModifier(this); } diff --git a/src/org/andengine/entity/modifier/RotationByModifier.java b/src/org/andengine/entity/modifier/RotationByModifier.java index 663c3eaca..10ccd07db 100644 --- a/src/org/andengine/entity/modifier/RotationByModifier.java +++ b/src/org/andengine/entity/modifier/RotationByModifier.java @@ -35,7 +35,7 @@ protected RotationByModifier(final RotationByModifier pRotationByModifier) { } @Override - public RotationByModifier deepCopy(){ + public RotationByModifier deepCopy() { return new RotationByModifier(this); } diff --git a/src/org/andengine/entity/modifier/RotationModifier.java b/src/org/andengine/entity/modifier/RotationModifier.java index 27201a59d..bf9f6d304 100644 --- a/src/org/andengine/entity/modifier/RotationModifier.java +++ b/src/org/andengine/entity/modifier/RotationModifier.java @@ -45,7 +45,7 @@ protected RotationModifier(final RotationModifier pRotationModifier) { } @Override - public RotationModifier deepCopy(){ + public RotationModifier deepCopy() { return new RotationModifier(this); } diff --git a/src/org/andengine/entity/modifier/ScaleAtModifier.java b/src/org/andengine/entity/modifier/ScaleAtModifier.java index 1620a4e90..16fabecc5 100644 --- a/src/org/andengine/entity/modifier/ScaleAtModifier.java +++ b/src/org/andengine/entity/modifier/ScaleAtModifier.java @@ -71,7 +71,7 @@ protected ScaleAtModifier(final ScaleAtModifier pScaleAtModifier) { } @Override - public ScaleAtModifier deepCopy(){ + public ScaleAtModifier deepCopy() { return new ScaleAtModifier(this); } diff --git a/src/org/andengine/entity/modifier/ScaleModifier.java b/src/org/andengine/entity/modifier/ScaleModifier.java index acd2c3cf1..1f579a865 100644 --- a/src/org/andengine/entity/modifier/ScaleModifier.java +++ b/src/org/andengine/entity/modifier/ScaleModifier.java @@ -61,7 +61,7 @@ protected ScaleModifier(final ScaleModifier pScaleModifier) { } @Override - public ScaleModifier deepCopy(){ + public ScaleModifier deepCopy() { return new ScaleModifier(this); } diff --git a/src/org/andengine/entity/modifier/SkewModifier.java b/src/org/andengine/entity/modifier/SkewModifier.java index f724bcab1..ac103c75c 100644 --- a/src/org/andengine/entity/modifier/SkewModifier.java +++ b/src/org/andengine/entity/modifier/SkewModifier.java @@ -44,7 +44,7 @@ protected SkewModifier(final SkewModifier pSkewXModifier) { } @Override - public SkewModifier deepCopy(){ + public SkewModifier deepCopy() { return new SkewModifier(this); } diff --git a/src/org/andengine/entity/modifier/SkewXModifier.java b/src/org/andengine/entity/modifier/SkewXModifier.java index e4269c31e..41aa1a006 100644 --- a/src/org/andengine/entity/modifier/SkewXModifier.java +++ b/src/org/andengine/entity/modifier/SkewXModifier.java @@ -44,7 +44,7 @@ protected SkewXModifier(final SkewXModifier pSkewXModifier) { } @Override - public SkewXModifier deepCopy(){ + public SkewXModifier deepCopy() { return new SkewXModifier(this); } diff --git a/src/org/andengine/entity/modifier/SkewYModifier.java b/src/org/andengine/entity/modifier/SkewYModifier.java index 85a012964..0704028d8 100644 --- a/src/org/andengine/entity/modifier/SkewYModifier.java +++ b/src/org/andengine/entity/modifier/SkewYModifier.java @@ -44,7 +44,7 @@ protected SkewYModifier(final SkewYModifier pSkewYModifier) { } @Override - public SkewYModifier deepCopy(){ + public SkewYModifier deepCopy() { return new SkewYModifier(this); } diff --git a/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java index 4388e4da3..f45540f80 100644 --- a/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java @@ -62,7 +62,7 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { this.mSpriteBatch.setIndex(0); final Particle[] particles = this.mParticles; - for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + for (int i = this.mParticlesAlive - 1; i >= 0; i--) { final Entity entity = particles[i].getEntity(); /* In order to support alpha changes of the sprites inside the spritebatch, diff --git a/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java index ce1bf9f9e..a6bc0c2a1 100644 --- a/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java @@ -61,7 +61,7 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { this.mSpriteBatch.setIndex(0); final Particle[] particles = this.mParticles; - for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + for (int i = this.mParticlesAlive - 1; i >= 0; i--) { final Sprite sprite = particles[i].getEntity(); /* In order to support alpha changes of the sprites inside the spritebatch, diff --git a/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java index 498d06aa6..cdd6c7eec 100644 --- a/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java +++ b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java @@ -77,7 +77,7 @@ public void setBlendFunction(final int pBlendFunctionSource, final int pBlendFun @Override protected void preDraw(final GLState pGLState, final Camera pCamera) { - if(this.mBlendingEnabled) { + if (this.mBlendingEnabled) { pGLState.enableBlend(); pGLState.blendFunction(this.mBlendFunctionSource, this.mBlendFunctionDestination); } @@ -85,7 +85,7 @@ protected void preDraw(final GLState pGLState, final Camera pCamera) { @Override protected void postDraw(final GLState pGLState, final Camera pCamera) { - if(this.mBlendingEnabled) { + if (this.mBlendingEnabled) { pGLState.disableBlend(); } } diff --git a/src/org/andengine/entity/particle/Particle.java b/src/org/andengine/entity/particle/Particle.java index 66bda0532..abd93528c 100644 --- a/src/org/andengine/entity/particle/Particle.java +++ b/src/org/andengine/entity/particle/Particle.java @@ -77,8 +77,8 @@ public PhysicsHandler getPhysicsHandler() { // =========================================================== protected void onUpdate(final float pSecondsElapsed) { - if(!this.mExpired){ - if(this.mExpireTime == Particle.EXPIRETIME_NEVER || this.mLifeTime + pSecondsElapsed < this.mExpireTime) { + if (!this.mExpired) { + if (this.mExpireTime == Particle.EXPIRETIME_NEVER || this.mLifeTime + pSecondsElapsed < this.mExpireTime) { /* Particle doesn't expire or didn't expire yet. */ this.mLifeTime += pSecondsElapsed; this.mEntity.onUpdate(pSecondsElapsed); @@ -94,7 +94,7 @@ protected void onUpdate(final float pSecondsElapsed) { } public void onDraw(final GLState pGLState, final Camera pCamera) { - if(!this.mExpired) { + if (!this.mExpired) { this.mEntity.onDraw(pGLState, pCamera); } } diff --git a/src/org/andengine/entity/particle/ParticleSystem.java b/src/org/andengine/entity/particle/ParticleSystem.java index 799f1fa7b..3faa71ccf 100644 --- a/src/org/andengine/entity/particle/ParticleSystem.java +++ b/src/org/andengine/entity/particle/ParticleSystem.java @@ -106,7 +106,7 @@ public void reset() { @Override protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { - for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + for (int i = this.mParticlesAlive - 1; i >= 0; i--) { this.mParticles[i].onDraw(pGLState, pCamera); } } @@ -115,21 +115,21 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { protected void onManagedUpdate(final float pSecondsElapsed) { super.onManagedUpdate(pSecondsElapsed); - if(this.isParticlesSpawnEnabled()) { + if (this.isParticlesSpawnEnabled()) { this.spawnParticles(pSecondsElapsed); } final int particleModifierCountMinusOne = this.mParticleModifiers.size() - 1; - for(int i = this.mParticlesAlive - 1; i >= 0; i--) { + for (int i = this.mParticlesAlive - 1; i >= 0; i--) { final Particle particle = this.mParticles[i]; /* Apply all particleModifiers */ - for(int j = particleModifierCountMinusOne; j >= 0; j--) { + for (int j = particleModifierCountMinusOne; j >= 0; j--) { this.mParticleModifiers.get(j).onUpdateParticle(particle); } particle.onUpdate(pSecondsElapsed); - if(particle.mExpired){ + if (particle.mExpired) { this.mParticlesAlive--; this.moveParticleToEnd(i); @@ -141,7 +141,7 @@ protected void moveParticleToEnd(final int pIndex) { final Particle particle = this.mParticles[pIndex]; final int particlesToCopy = this.mParticlesAlive - pIndex; - if(particlesToCopy > 0) { + if (particlesToCopy > 0) { System.arraycopy(this.mParticles, pIndex + 1, this.mParticles, pIndex, particlesToCopy); } this.mParticles[this.mParticlesAlive] = particle; @@ -181,13 +181,13 @@ private void spawnParticles(final float pSecondsElapsed) { final int particlesToSpawnThisFrame = Math.min(this.mParticlesMaximum - this.mParticlesAlive, (int)FloatMath.floor(this.mParticlesDueToSpawn)); this.mParticlesDueToSpawn -= particlesToSpawnThisFrame; - for(int i = 0; i < particlesToSpawnThisFrame; i++){ + for (int i = 0; i < particlesToSpawnThisFrame; i++) { this.spawnParticle(); } } private void spawnParticle() { - if(this.mParticlesAlive < this.mParticlesMaximum){ + if (this.mParticlesAlive < this.mParticlesMaximum) { Particle particle = this.mParticles[this.mParticlesAlive]; /* New particle needs to be created. */ @@ -196,7 +196,7 @@ private void spawnParticle() { final float x = ParticleSystem.POSITION_OFFSET_CONTAINER[Constants.VERTEX_INDEX_X]; final float y = ParticleSystem.POSITION_OFFSET_CONTAINER[Constants.VERTEX_INDEX_Y]; - if(particle == null) { + if (particle == null) { particle = new Particle(); this.mParticles[this.mParticlesAlive] = particle; particle.setEntity(this.mEntityFactory.create(x, y)); @@ -207,11 +207,11 @@ private void spawnParticle() { /* Apply particle initializers. */ { - for(int i = this.mParticleInitializers.size() - 1; i >= 0; i--) { + for (int i = this.mParticleInitializers.size() - 1; i >= 0; i--) { this.mParticleInitializers.get(i).onInitializeParticle(particle); } - for(int i = this.mParticleModifiers.size() - 1; i >= 0; i--) { + for (int i = this.mParticleModifiers.size() - 1; i >= 0; i--) { this.mParticleModifiers.get(i).onInitializeParticle(particle); } } @@ -221,7 +221,7 @@ private void spawnParticle() { } protected float determineCurrentRate() { - if(this.mRateMinimum == this.mRateMaximum){ + if (this.mRateMinimum == this.mRateMaximum) { return this.mRateMinimum; } else { return MathUtils.random(this.mRateMinimum, this.mRateMaximum); diff --git a/src/org/andengine/entity/particle/initializer/BaseDoubleValueParticleInitializer.java b/src/org/andengine/entity/particle/initializer/BaseDoubleValueParticleInitializer.java index 1ceb167ff..9cd1182e8 100644 --- a/src/org/andengine/entity/particle/initializer/BaseDoubleValueParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/BaseDoubleValueParticleInitializer.java @@ -53,7 +53,7 @@ protected final void onInitializeParticle(final Particle pParticle, final flo // =========================================================== protected float getRandomValueB() { - if(this.mMinValueB == this.mMaxValueB) { + if (this.mMinValueB == this.mMaxValueB) { return this.mMaxValueB; } else { return MathUtils.random(this.mMinValueB, this.mMaxValueB); diff --git a/src/org/andengine/entity/particle/initializer/BaseSingleValueParticleInitializer.java b/src/org/andengine/entity/particle/initializer/BaseSingleValueParticleInitializer.java index 580d1a9fb..09b4ff1c0 100644 --- a/src/org/andengine/entity/particle/initializer/BaseSingleValueParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/BaseSingleValueParticleInitializer.java @@ -52,7 +52,7 @@ public final void onInitializeParticle(final Particle pParticle) { // =========================================================== protected float getRandomValue() { - if(this.mMinValue == this.mMaxValue) { + if (this.mMinValue == this.mMaxValue) { return this.mMaxValue; } else { return MathUtils.random(this.mMinValue, this.mMaxValue); diff --git a/src/org/andengine/entity/particle/initializer/BaseTripleValueParticleInitializer.java b/src/org/andengine/entity/particle/initializer/BaseTripleValueParticleInitializer.java index 37bce1e1a..3923025c3 100644 --- a/src/org/andengine/entity/particle/initializer/BaseTripleValueParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/BaseTripleValueParticleInitializer.java @@ -53,7 +53,7 @@ protected final void onInitializeParticle(final Particle pParticle, final flo // =========================================================== protected float getRandomValueC() { - if(this.mMinValueC == this.mMaxValueC) { + if (this.mMinValueC == this.mMaxValueC) { return this.mMaxValueC; } else { return MathUtils.random(this.mMinValueC, this.mMaxValueC); diff --git a/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java b/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java index caf014d51..c24b84ce2 100644 --- a/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java @@ -68,7 +68,7 @@ public void onInitializeParticle(final Particle pParticle) { @Override public void onUpdateParticle(final Particle pParticle) { final float lifeTime = pParticle.getLifeTime(); - if(lifeTime > this.mFromTime && lifeTime < this.mToTime) { + if (lifeTime > this.mFromTime && lifeTime < this.mToTime) { final float percentageDone = this.mEaseFunction.getPercentage((lifeTime - this.mFromTime), this.mDuration); this.onSetValue(pParticle, percentageDone, this.mFromValue + percentageDone * this.mValueSpan); } diff --git a/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java b/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java index 50ee85f97..5cf3eeda5 100644 --- a/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java @@ -50,7 +50,7 @@ public void onInitializeParticle(final Particle pParticle) { @Override public void onUpdateParticle(final Particle pParticle) { - if(!this.mCamera.isEntityVisible(pParticle.getEntity())) { + if (!this.mCamera.isEntityVisible(pParticle.getEntity())) { pParticle.setExpired(true); } } diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index a6cdf43e0..2efe89078 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -96,7 +96,7 @@ public boolean isGradientFitToBounds() { * If false the from and to color might exceed the bounds of the {@link Gradient} entity, depending on the angle/vector supplied. */ public void setGradientFitToBounds(final boolean pGradientFitToBounds) { - if(this.mGradientFitToBounds != pGradientFitToBounds) { + if (this.mGradientFitToBounds != pGradientFitToBounds) { this.mGradientFitToBounds = pGradientFitToBounds; this.onUpdateColor(); @@ -281,7 +281,7 @@ public Color getToColor() { * @param pRed from 0.0f to 1.0f */ public void setToRed(final float pRed) { - if(this.mToColor.setRedChecking(pRed)) { // TODO Is this check worth it? + if (this.mToColor.setRedChecking(pRed)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -290,7 +290,7 @@ public void setToRed(final float pRed) { * @param pGreen from 0.0f to 1.0f */ public void setToGreen(final float pGreen) { - if(this.mToColor.setGreenChecking(pGreen)) { // TODO Is this check worth it? + if (this.mToColor.setGreenChecking(pGreen)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -299,7 +299,7 @@ public void setToGreen(final float pGreen) { * @param pBlue from 0.0f to 1.0f */ public void setToBlue(final float pBlue) { - if(this.mToColor.setBlueChecking(pBlue)) { // TODO Is this check worth it? + if (this.mToColor.setBlueChecking(pBlue)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -308,7 +308,7 @@ public void setToBlue(final float pBlue) { * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) */ public void setToAlpha(final float pAlpha) { - if(this.mToColor.setAlphaChecking(pAlpha)) { // TODO Is this check worth it? + if (this.mToColor.setAlphaChecking(pAlpha)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -319,7 +319,7 @@ public void setToAlpha(final float pAlpha) { * @param pBlue from 0.0f to 1.0f */ public void setToColor(final float pRed, final float pGreen, final float pBlue) { - if(this.mToColor.setChecking(pRed, pGreen, pBlue)) { // TODO Is this check worth it? + if (this.mToColor.setChecking(pRed, pGreen, pBlue)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -331,13 +331,13 @@ public void setToColor(final float pRed, final float pGreen, final float pBlue) * @param pAlpha from 0.0f (transparent) to 1.0f (opaque) */ public void setToColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - if(this.mToColor.setChecking(pRed, pGreen, pBlue, pAlpha)) { // TODO Is this check worth it? + if (this.mToColor.setChecking(pRed, pGreen, pBlue, pAlpha)) { // TODO Is this check worth it? this.onUpdateColor(); } } public void setToColor(final Color pColor) { - if(this.mToColor.setChecking(pColor)) { // TODO Is this check worth it? + if (this.mToColor.setChecking(pColor)) { // TODO Is this check worth it? this.onUpdateColor(); } } @@ -447,7 +447,7 @@ protected void preDraw(final GLState pGLState, final Camera pCamera) { @Override protected void draw(final GLState pGLState, final Camera pCamera) { - if(this.mGradientDitherEnabled) { + if (this.mGradientDitherEnabled) { final boolean wasDitherEnabled = pGLState.enableDither(); this.mGradientVertexBufferObject.draw(GLES20.GL_TRIANGLE_STRIP, Gradient.VERTICES_PER_RECTANGLE); diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java index 945599e9e..e01a221bf 100644 --- a/src/org/andengine/entity/primitive/Line.java +++ b/src/org/andengine/entity/primitive/Line.java @@ -286,7 +286,7 @@ public boolean contains(final float pX, final float pY) { @Override public boolean collidesWith(final IEntity pOtherEntity) { - if(pOtherEntity instanceof Line) { + if (pOtherEntity instanceof Line) { final Line otherLine = (Line) pOtherEntity; return LineCollisionChecker.checkLineCollision(this.mX, this.mY, this.mX2, this.mY2, otherLine.mX, otherLine.mY, otherLine.mX2, otherLine.mY2); } else { diff --git a/src/org/andengine/entity/primitive/Mesh.java b/src/org/andengine/entity/primitive/Mesh.java index b7cbd2d89..4c7cc59d7 100644 --- a/src/org/andengine/entity/primitive/Mesh.java +++ b/src/org/andengine/entity/primitive/Mesh.java @@ -157,10 +157,10 @@ public boolean contains(final float pX, final float pY) { @Override public boolean collidesWith(final IEntity pOtherEntity) { - if(pOtherEntity instanceof Mesh) { + if (pOtherEntity instanceof Mesh) { // TODO return super.collidesWith(pOtherEntity); - } else if(pOtherEntity instanceof Line) { + } else if (pOtherEntity instanceof Line) { // TODO return super.collidesWith(pOtherEntity); } else { diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java index d45af09fb..207b324a8 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java @@ -58,7 +58,7 @@ public void onUpdateColor(final Gradient pGradient) { final float c = MathConstants.SQRT_2; final float c2 = 2 * c; - if(pGradient.isGradientFitToBounds()) { + if (pGradient.isGradientFitToBounds()) { final float tmp = 1 / (Math.abs(dX) + Math.abs(dY)); dX *= tmp * c; dY *= tmp * c; diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java index ae75f2761..8608b2d75 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java @@ -47,7 +47,7 @@ public void onUpdateColor(final Mesh pMesh) { final float packedColor = pMesh.getColor().getABGRPackedFloat(); - for(int i = 0; i < this.mVertexCount; i++) { + for (int i = 0; i < this.mVertexCount; i++) { bufferData[(i * Mesh.VERTEX_SIZE) + Mesh.COLOR_INDEX] = packedColor; } diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java index 90ec45fd9..8916cfeb4 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java @@ -60,7 +60,7 @@ public void onUpdateColor(final Gradient pGradient) { final float c = MathConstants.SQRT_2; final float c2 = 2 * c; - if(pGradient.isGradientFitToBounds()) { + if (pGradient.isGradientFitToBounds()) { final float tmp = 1 / (Math.abs(dX) + Math.abs(dY)); dX *= tmp * c; dY *= tmp * c; diff --git a/src/org/andengine/entity/scene/CameraScene.java b/src/org/andengine/entity/scene/CameraScene.java index e10eeaf23..31ab369c7 100644 --- a/src/org/andengine/entity/scene/CameraScene.java +++ b/src/org/andengine/entity/scene/CameraScene.java @@ -82,14 +82,14 @@ public void setSize(final float pWidth, final float pHeight) { @Override public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { - if(this.mCamera == null) { + if (this.mCamera == null) { return false; } else { this.mCamera.convertSceneTouchEventToCameraSceneTouchEvent(pSceneTouchEvent); final boolean handled = super.onSceneTouchEvent(pSceneTouchEvent); - if(handled) { + if (handled) { return true; } else { this.mCamera.convertCameraSceneTouchEventToSceneTouchEvent(pSceneTouchEvent); @@ -101,7 +101,7 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { @Override protected boolean onChildSceneTouchEvent(final TouchEvent pSceneTouchEvent) { final boolean childIsCameraScene = this.mChildScene instanceof CameraScene; - if(childIsCameraScene) { + if (childIsCameraScene) { this.mCamera.convertCameraSceneTouchEventToSceneTouchEvent(pSceneTouchEvent); final boolean result = super.onChildSceneTouchEvent(pSceneTouchEvent); this.mCamera.convertSceneTouchEventToCameraSceneTouchEvent(pSceneTouchEvent); diff --git a/src/org/andengine/entity/scene/Scene.java b/src/org/andengine/entity/scene/Scene.java index c53bb55f5..ee877552e 100644 --- a/src/org/andengine/entity/scene/Scene.java +++ b/src/org/andengine/entity/scene/Scene.java @@ -71,7 +71,7 @@ public Scene() { @Deprecated public Scene(final int pChildCount) { - for(int i = 0; i < pChildCount; i++) { + for (int i = 0; i < pChildCount; i++) { this.attachChild(new Entity()); } } @@ -184,7 +184,7 @@ public boolean isTouchAreaBindingOnActionMoveEnabled() { * @param pTouchAreaBindingOnActionDownEnabled */ public void setTouchAreaBindingOnActionDownEnabled(final boolean pTouchAreaBindingOnActionDownEnabled) { - if(this.mTouchAreaBindingOnActionDownEnabled && !pTouchAreaBindingOnActionDownEnabled) { + if (this.mTouchAreaBindingOnActionDownEnabled && !pTouchAreaBindingOnActionDownEnabled) { this.mTouchAreaBindings.clear(); } this.mTouchAreaBindingOnActionDownEnabled = pTouchAreaBindingOnActionDownEnabled; @@ -202,7 +202,7 @@ public void setTouchAreaBindingOnActionDownEnabled(final boolean pTouchAreaBindi * @param pTouchAreaBindingOnActionMoveEnabled */ public void setTouchAreaBindingOnActionMoveEnabled(final boolean pTouchAreaBindingOnActionMoveEnabled) { - if(this.mTouchAreaBindingOnActionMoveEnabled && !pTouchAreaBindingOnActionMoveEnabled) { + if (this.mTouchAreaBindingOnActionMoveEnabled && !pTouchAreaBindingOnActionMoveEnabled) { this.mTouchAreaBindings.clear(); } this.mTouchAreaBindingOnActionMoveEnabled = pTouchAreaBindingOnActionMoveEnabled; @@ -224,7 +224,7 @@ public boolean isOnSceneTouchListenerBindingOnActionDownEnabled() { * @param pOnSceneTouchListenerBindingOnActionDownEnabled */ public void setOnSceneTouchListenerBindingOnActionDownEnabled(final boolean pOnSceneTouchListenerBindingOnActionDownEnabled) { - if(this.mOnSceneTouchListenerBindingOnActionDownEnabled && !pOnSceneTouchListenerBindingOnActionDownEnabled) { + if (this.mOnSceneTouchListenerBindingOnActionDownEnabled && !pOnSceneTouchListenerBindingOnActionDownEnabled) { this.mOnSceneTouchListenerBindings.clear(); } this.mOnSceneTouchListenerBindingOnActionDownEnabled = pOnSceneTouchListenerBindingOnActionDownEnabled; @@ -238,8 +238,8 @@ public void setOnSceneTouchListenerBindingOnActionDownEnabled(final boolean pOnS protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { final Scene childScene = this.mChildScene; - if(childScene == null || !this.mChildSceneModalDraw) { - if(this.mBackgroundEnabled) { + if (childScene == null || !this.mChildSceneModalDraw) { + if (this.mBackgroundEnabled) { pGLState.pushProjectionGLMatrix(); pCamera.onApplySceneBackgroundMatrix(pGLState); @@ -262,7 +262,7 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { } } - if(childScene != null) { + if (childScene != null) { childScene.onDraw(pGLState, pCamera); } } @@ -278,12 +278,12 @@ protected void onManagedUpdate(final float pSecondsElapsed) { this.mRunnableHandler.onUpdate(pSecondsElapsed); final Scene childScene = this.mChildScene; - if(childScene == null || !this.mChildSceneModalUpdate) { + if (childScene == null || !this.mChildSceneModalUpdate) { this.mBackground.onUpdate(pSecondsElapsed); super.onManagedUpdate(pSecondsElapsed); } - if(childScene != null) { + if (childScene != null) { childScene.onUpdate(pSecondsElapsed); } } @@ -293,39 +293,39 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { final boolean isActionDown = pSceneTouchEvent.isActionDown(); final boolean isActionMove = pSceneTouchEvent.isActionMove(); - if(!isActionDown) { - if(this.mOnSceneTouchListenerBindingOnActionDownEnabled) { + if (!isActionDown) { + if (this.mOnSceneTouchListenerBindingOnActionDownEnabled) { final IOnSceneTouchListener boundOnSceneTouchListener = this.mOnSceneTouchListenerBindings.get(pSceneTouchEvent.getPointerID()); if (boundOnSceneTouchListener != null) { /* Check if boundTouchArea needs to be removed. */ - switch(action) { + switch (action) { case TouchEvent.ACTION_UP: case TouchEvent.ACTION_CANCEL: this.mOnSceneTouchListenerBindings.remove(pSceneTouchEvent.getPointerID()); } final Boolean handled = this.mOnSceneTouchListener.onSceneTouchEvent(this, pSceneTouchEvent); - if(handled != null && handled) { + if (handled != null && handled) { return true; } } } - if(this.mTouchAreaBindingOnActionDownEnabled) { + if (this.mTouchAreaBindingOnActionDownEnabled) { final SparseArray touchAreaBindings = this.mTouchAreaBindings; final ITouchArea boundTouchArea = touchAreaBindings.get(pSceneTouchEvent.getPointerID()); /* In the case a ITouchArea has been bound to this PointerID, * we'll pass this this TouchEvent to the same ITouchArea. */ - if(boundTouchArea != null) { + if (boundTouchArea != null) { final float sceneTouchEventX = pSceneTouchEvent.getX(); final float sceneTouchEventY = pSceneTouchEvent.getY(); /* Check if boundTouchArea needs to be removed. */ - switch(action) { + switch (action) { case TouchEvent.ACTION_UP: case TouchEvent.ACTION_CANCEL: touchAreaBindings.remove(pSceneTouchEvent.getPointerID()); } final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, boundTouchArea); - if(handled != null && handled) { + if (handled != null && handled) { return true; } } @@ -333,11 +333,11 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { } final Scene childScene = this.mChildScene; - if(childScene != null) { + if (childScene != null) { final boolean handledByChild = this.onChildSceneTouchEvent(pSceneTouchEvent); - if(handledByChild) { + if (handledByChild) { return true; - } else if(this.mChildSceneModalTouch) { + } else if (this.mChildSceneModalTouch) { return false; } } @@ -346,18 +346,18 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { final float sceneTouchEventY = pSceneTouchEvent.getY(); final SmartList touchAreas = this.mTouchAreas; - if(touchAreas != null) { + if (touchAreas != null) { final int touchAreaCount = touchAreas.size(); - if(touchAreaCount > 0) { - if(this.mOnAreaTouchTraversalBackToFront) { /* Back to Front. */ - for(int i = 0; i < touchAreaCount; i++) { + if (touchAreaCount > 0) { + if (this.mOnAreaTouchTraversalBackToFront) { /* Back to Front. */ + for (int i = 0; i < touchAreaCount; i++) { final ITouchArea touchArea = touchAreas.get(i); - if(touchArea.contains(sceneTouchEventX, sceneTouchEventY)) { + if (touchArea.contains(sceneTouchEventX, sceneTouchEventY)) { final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, touchArea); - if(handled != null && handled) { + if (handled != null && handled) { /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, * bind this ITouchArea to the PointerID. */ - if((this.mTouchAreaBindingOnActionDownEnabled && isActionDown) || (this.mTouchAreaBindingOnActionMoveEnabled && isActionMove)) { + if ((this.mTouchAreaBindingOnActionDownEnabled && isActionDown) || (this.mTouchAreaBindingOnActionMoveEnabled && isActionMove)) { this.mTouchAreaBindings.put(pSceneTouchEvent.getPointerID(), touchArea); } return true; @@ -365,14 +365,14 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { } } } else { /* Front to back. */ - for(int i = touchAreaCount - 1; i >= 0; i--) { + for (int i = touchAreaCount - 1; i >= 0; i--) { final ITouchArea touchArea = touchAreas.get(i); - if(touchArea.contains(sceneTouchEventX, sceneTouchEventY)) { + if (touchArea.contains(sceneTouchEventX, sceneTouchEventY)) { final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, touchArea); - if(handled != null && handled) { + if (handled != null && handled) { /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, * bind this ITouchArea to the PointerID. */ - if((this.mTouchAreaBindingOnActionDownEnabled && isActionDown) || (this.mTouchAreaBindingOnActionMoveEnabled && isActionMove)) { + if ((this.mTouchAreaBindingOnActionDownEnabled && isActionDown) || (this.mTouchAreaBindingOnActionMoveEnabled && isActionMove)) { this.mTouchAreaBindings.put(pSceneTouchEvent.getPointerID(), touchArea); } return true; @@ -383,12 +383,12 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { } } /* If no area was touched, the Scene itself was touched as a fallback. */ - if(this.mOnSceneTouchListener != null){ + if (this.mOnSceneTouchListener != null) { final Boolean handled = this.mOnSceneTouchListener.onSceneTouchEvent(this, pSceneTouchEvent); - if(handled != null && handled) { + if (handled != null && handled) { /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, * bind the active OnSceneTouchListener to the PointerID. */ - if(this.mOnSceneTouchListenerBindingOnActionDownEnabled && isActionDown) { + if (this.mOnSceneTouchListenerBindingOnActionDownEnabled && isActionDown) { this.mOnSceneTouchListenerBindings.put(pSceneTouchEvent.getPointerID(), this.mOnSceneTouchListener); } return true; @@ -406,9 +406,9 @@ private Boolean onAreaTouchEvent(final TouchEvent pSceneTouchEvent, final float final float touchAreaLocalY = touchAreaLocalCoordinates[Constants.VERTEX_INDEX_Y]; final boolean handledSelf = touchArea.onAreaTouched(pSceneTouchEvent, touchAreaLocalX, touchAreaLocalY); - if(handledSelf) { + if (handledSelf) { return Boolean.TRUE; - } else if(this.mOnAreaTouchListener != null) { + } else if (this.mOnAreaTouchListener != null) { return this.mOnAreaTouchListener.onAreaTouched(pSceneTouchEvent, touchArea, touchAreaLocalX, touchAreaLocalY); } else { return null; @@ -462,7 +462,7 @@ public SmartList getTouchAreas() { public void back() { this.clearChildScene(); - if(this.mParentScene != null) { + if (this.mParentScene != null) { this.mParentScene.clearChildScene(); this.mParentScene = null; } diff --git a/src/org/andengine/entity/scene/background/Background.java b/src/org/andengine/entity/scene/background/Background.java index 106bb3b66..981547202 100644 --- a/src/org/andengine/entity/scene/background/Background.java +++ b/src/org/andengine/entity/scene/background/Background.java @@ -100,7 +100,7 @@ public void setColorEnabled(final boolean pColorEnabled) { @Override public void registerBackgroundModifier(final IModifier pBackgroundModifier) { - if(this.mBackgroundModifiers == null) { + if (this.mBackgroundModifiers == null) { this.allocateBackgroundModifiers(); } this.mBackgroundModifiers.add(pBackgroundModifier); @@ -108,7 +108,7 @@ public void registerBackgroundModifier(final IModifier pBackgroundM @Override public boolean unregisterBackgroundModifier(final IModifier pBackgroundModifier) { - if(this.mBackgroundModifiers != null) { + if (this.mBackgroundModifiers != null) { return this.mBackgroundModifiers.remove(pBackgroundModifier); } else { return false; @@ -117,21 +117,21 @@ public boolean unregisterBackgroundModifier(final IModifier pBackgr @Override public void clearBackgroundModifiers() { - if(this.mBackgroundModifiers != null) { + if (this.mBackgroundModifiers != null) { this.mBackgroundModifiers.clear(); } } @Override public void onUpdate(final float pSecondsElapsed) { - if(this.mBackgroundModifiers != null) { + if (this.mBackgroundModifiers != null) { this.mBackgroundModifiers.onUpdate(pSecondsElapsed); } } @Override public void onDraw(final GLState pGLState, final Camera pCamera) { - if(this.mColorEnabled) { + if (this.mColorEnabled) { GLES20.glClearColor(this.mColor.getRed(), this.mColor.getGreen(), this.mColor.getBlue(), this.mColor.getAlpha()); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // TODO Does this cause problems when multisampling? } diff --git a/src/org/andengine/entity/scene/background/ParallaxBackground.java b/src/org/andengine/entity/scene/background/ParallaxBackground.java index 0dc2ca8b1..55cc0ea3d 100644 --- a/src/org/andengine/entity/scene/background/ParallaxBackground.java +++ b/src/org/andengine/entity/scene/background/ParallaxBackground.java @@ -55,7 +55,7 @@ public void onDraw(final GLState pGLState, final Camera pCamera) { final float parallaxValue = this.mParallaxValue; final ArrayList parallaxEntities = this.mParallaxEntities; - for(int i = 0; i < this.mParallaxEntityCount; i++) { + for (int i = 0; i < this.mParallaxEntityCount; i++) { parallaxEntities.get(i).onDraw(pGLState, pCamera, parallaxValue); } } @@ -72,7 +72,7 @@ public void attachParallaxEntity(final ParallaxEntity pParallaxEntity) { public boolean detachParallaxEntity(final ParallaxEntity pParallaxEntity) { this.mParallaxEntityCount--; final boolean success = this.mParallaxEntities.remove(pParallaxEntity); - if(!success) { + if (!success) { this.mParallaxEntityCount++; } return success; @@ -103,11 +103,11 @@ public ParallaxEntity(final float pParallaxFactor, final IEntity pEntity) { this.mEntity = pEntity; // TODO Adjust onDraw calculations, so that these assumptions aren't necessary. - if(this.mEntity.getX() != 0) { + if (this.mEntity.getX() != 0) { Debug.w("The X position of a " + this.getClass().getSimpleName() + " is expected to be 0."); } - if(this.mEntity.getOffsetCenterX() != 0) { + if (this.mEntity.getOffsetCenterX() != 0) { Debug.w("The OffsetCenterXposition of a " + this.getClass().getSimpleName() + " is expected to be 0."); } } diff --git a/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java index b6e7a13e6..26604891a 100644 --- a/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java @@ -63,7 +63,7 @@ protected ColorBackgroundModifier(final ColorBackgroundModifier pColorBackground } @Override - public ColorBackgroundModifier deepCopy(){ + public ColorBackgroundModifier deepCopy() { return new ColorBackgroundModifier(this); } diff --git a/src/org/andengine/entity/scene/menu/MenuScene.java b/src/org/andengine/entity/scene/menu/MenuScene.java index 0cf02520b..844b79a49 100644 --- a/src/org/andengine/entity/scene/menu/MenuScene.java +++ b/src/org/andengine/entity/scene/menu/MenuScene.java @@ -109,7 +109,7 @@ public MenuScene getChildScene() { @Override public void setChildScene(final Scene pChildScene, final boolean pModalDraw, final boolean pModalUpdate, final boolean pModalTouch) throws IllegalArgumentException { - if(pChildScene instanceof MenuScene) { + if (pChildScene instanceof MenuScene) { super.setChildScene(pChildScene, pModalDraw, pModalUpdate, pModalTouch); } else { throw new IllegalArgumentException("A " + MenuScene.class.getSimpleName() + " accepts only " + MenuScene.class.getSimpleName() + " as a ChildScene."); @@ -118,7 +118,7 @@ public void setChildScene(final Scene pChildScene, final boolean pModalDraw, fin @Override public void clearChildScene() { - if(this.getChildScene() != null) { + if (this.getChildScene() != null) { this.getChildScene().reset(); super.clearChildScene(); } @@ -140,17 +140,17 @@ public void setMenuSceneAnimator(final IMenuSceneAnimator pMenuSceneAnimator) { public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { final IMenuItem menuItem = ((IMenuItem)pTouchArea); - switch(pSceneTouchEvent.getAction()) { + switch (pSceneTouchEvent.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: - if((this.mSelectedMenuItem != null) && (this.mSelectedMenuItem != menuItem)) { + if ((this.mSelectedMenuItem != null) && (this.mSelectedMenuItem != menuItem)) { this.mSelectedMenuItem.onUnselected(); } this.mSelectedMenuItem = menuItem; this.mSelectedMenuItem.onSelected(); break; case MotionEvent.ACTION_UP: - if(this.mOnMenuItemClickListener != null) { + if (this.mOnMenuItemClickListener != null) { final boolean handled = this.mOnMenuItemClickListener.onMenuItemClicked(this, menuItem, pTouchAreaLocalX, pTouchAreaLocalY); menuItem.onUnselected(); this.mSelectedMenuItem = null; @@ -167,7 +167,7 @@ public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea @Override public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) { - if(this.mSelectedMenuItem != null) { + if (this.mSelectedMenuItem != null) { this.mSelectedMenuItem.onUnselected(); this.mSelectedMenuItem = null; } @@ -186,12 +186,12 @@ public void back(final boolean pResetAnimations) { public void back(final boolean pResetAnimations, final boolean pResetParentMenuSceneAnimations) { super.back(); - if(pResetAnimations) { + if (pResetAnimations) { this.resetAnimations(); } - if(pResetParentMenuSceneAnimations) { - if((this.mParentScene != null) && (this.mParentScene instanceof MenuScene)) { + if (pResetParentMenuSceneAnimations) { + if ((this.mParentScene != null) && (this.mParentScene instanceof MenuScene)) { ((MenuScene)this.mParentScene).resetAnimations(); } } diff --git a/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java index 9d4cff8a9..f0679a2a3 100644 --- a/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java @@ -36,7 +36,7 @@ public class AlphaMenuSceneAnimator extends MenuSceneAnimator { // Constructors // =========================================================== - public AlphaMenuSceneAnimator(){ + public AlphaMenuSceneAnimator() { this(AlphaMenuSceneAnimator.EASEFUNCTION_DEFAULT); } diff --git a/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java index b6793cc73..60651578d 100644 --- a/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java @@ -25,7 +25,7 @@ public class InstantMenuSceneAnimator extends MenuSceneAnimator { // Constructors // =========================================================== - public InstantMenuSceneAnimator(){ + public InstantMenuSceneAnimator() { super(); } diff --git a/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java index a814153b5..50328dd86 100644 --- a/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java @@ -116,7 +116,7 @@ public void buildMenuSceneAnimations(final MenuScene pMenuScene) { final int menuItemCount = pMenuScene.getMenuItemCount(); - for(int i = 0; i < menuItemCount; i++) { + for (int i = 0; i < menuItemCount; i++) { final IMenuItem menuItem = pMenuScene.getMenuItem(i); final float x = this.getMenuItemX(pMenuScene, i); @@ -129,7 +129,7 @@ public void buildMenuSceneAnimations(final MenuScene pMenuScene) { public void resetMenuSceneAnimations(final MenuScene pMenuScene) { final int menuItemCount = pMenuScene.getMenuItemCount(); - for(int i = 0; i < menuItemCount; i++) { + for (int i = 0; i < menuItemCount; i++) { final IMenuItem menuItem = pMenuScene.getMenuItem(i); final float x = this.getMenuItemX(pMenuScene, i); @@ -150,7 +150,7 @@ protected float getMenuItemX(final MenuScene pMenuScene, final int pIndex) { /* Determine horizontal position. */ final float x; - switch(this.mHorizontalAlign) { + switch (this.mHorizontalAlign) { case LEFT: x = menuItemWidth * 0.5f; break; @@ -174,7 +174,7 @@ protected float getMenuItemY(final MenuScene pMenuScene, final int pIndex) { /* Prepare vertical position. */ float baseY; - switch(this.mVerticalAlign) { + switch (this.mVerticalAlign) { case TOP: baseY = menuSceneHeight; break; @@ -200,7 +200,7 @@ private void updateOverallHeight(final MenuScene pMenuScene) { final int menuItemCount = pMenuScene.getMenuItemCount(); float overallHeight = 0; - for(int i = menuItemCount - 1; i >= 0; i--) { + for (int i = menuItemCount - 1; i >= 0; i--) { final IMenuItem menuItem = pMenuScene.getMenuItem(i); overallHeight += menuItem.getHeight(); } diff --git a/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java index e208845e2..001a5e9bd 100644 --- a/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java @@ -127,7 +127,7 @@ protected void onMenuItemPositionReset(final MenuScene pMenuScene, final int pIn // =========================================================== protected float getFromX(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pX) { - switch(this.mDirection) { + switch (this.mDirection) { case UP: case DOWN: return pX; @@ -145,7 +145,7 @@ protected float getFromX(final MenuScene pMenuScene, final IMenuItem pMenuItem, } protected float getFromY(final MenuScene pMenuScene, final IMenuItem pMenuItem, final float pY) { - switch(this.mDirection) { + switch (this.mDirection) { case DOWN_LEFT: case DOWN: case DOWN_RIGHT: diff --git a/src/org/andengine/entity/shape/Shape.java b/src/org/andengine/entity/shape/Shape.java index 2cbe8475d..5296f02a9 100644 --- a/src/org/andengine/entity/shape/Shape.java +++ b/src/org/andengine/entity/shape/Shape.java @@ -112,7 +112,7 @@ public VertexBufferObjectManager getVertexBufferObjectManager() { @Override protected void preDraw(final GLState pGLState, final Camera pCamera) { - if(this.mBlendingEnabled) { + if (this.mBlendingEnabled) { pGLState.enableBlend(); pGLState.blendFunction(this.mBlendFunctionSource, this.mBlendFunctionDestination); } @@ -120,7 +120,7 @@ protected void preDraw(final GLState pGLState, final Camera pCamera) { @Override protected void postDraw(final GLState pGLState, final Camera pCamera) { - if(this.mBlendingEnabled) { + if (this.mBlendingEnabled) { pGLState.disableBlend(); } } @@ -159,7 +159,7 @@ public void dispose() { super.dispose(); final IVertexBufferObject vertexBufferObject = this.getVertexBufferObject(); - if((vertexBufferObject != null) && vertexBufferObject.isAutoDispose() && !vertexBufferObject.isDisposed()) { + if ((vertexBufferObject != null) && vertexBufferObject.isAutoDispose() && !vertexBufferObject.isDisposed()) { vertexBufferObject.dispose(); } } @@ -177,7 +177,7 @@ protected void initBlendFunction(final ITexture pTexture) { } protected void initBlendFunction(final TextureOptions pTextureOptions) { - if(pTextureOptions.mPreMultiplyAlpha) { + if (pTextureOptions.mPreMultiplyAlpha) { this.setBlendFunction(IShape.BLENDFUNCTION_SOURCE_PREMULTIPLYALPHA_DEFAULT, IShape.BLENDFUNCTION_DESTINATION_PREMULTIPLYALPHA_DEFAULT); } } diff --git a/src/org/andengine/entity/sprite/AnimatedSprite.java b/src/org/andengine/entity/sprite/AnimatedSprite.java index a35c8f668..211d043a4 100644 --- a/src/org/andengine/entity/sprite/AnimatedSprite.java +++ b/src/org/andengine/entity/sprite/AnimatedSprite.java @@ -105,20 +105,20 @@ public boolean isAnimationRunning() { protected void onManagedUpdate(final float pSecondsElapsed) { super.onManagedUpdate(pSecondsElapsed); - if(this.mAnimationRunning) { + if (this.mAnimationRunning) { final int loopCount = this.mAnimationData.getLoopCount(); final int[] frames = this.mAnimationData.getFrames(); final long animationDuration = this.mAnimationData.getAnimationDuration(); - if(!this.mAnimationStartedFired && (this.mAnimationProgress == 0)) { + if (!this.mAnimationStartedFired && (this.mAnimationProgress == 0)) { this.mAnimationStartedFired = true; - if(frames == null) { + if (frames == null) { this.setCurrentTileIndex(this.mAnimationData.getFirstFrameIndex()); } else { this.setCurrentTileIndex(frames[0]); } this.mCurrentFrameIndex = 0; - if(this.mAnimationListener != null) { + if (this.mAnimationListener != null) { this.mAnimationListener.onAnimationStarted(this, loopCount); this.mAnimationListener.onAnimationFrameChanged(this, AnimatedSprite.FRAMEINDEX_INVALID, 0); } @@ -126,10 +126,10 @@ protected void onManagedUpdate(final float pSecondsElapsed) { final long nanoSecondsElapsed = (long) (pSecondsElapsed * TimeConstants.NANOSECONDS_PER_SECOND); this.mAnimationProgress += nanoSecondsElapsed; - if(loopCount == IAnimationData.LOOP_CONTINUOUS) { + if (loopCount == IAnimationData.LOOP_CONTINUOUS) { while(this.mAnimationProgress > animationDuration ) { this.mAnimationProgress -= animationDuration; - if(this.mAnimationListener != null) { + if (this.mAnimationListener != null) { this.mAnimationListener.onAnimationLoopFinished(this, this.mRemainingLoopCount, loopCount); } } @@ -137,31 +137,31 @@ protected void onManagedUpdate(final float pSecondsElapsed) { while(this.mAnimationProgress > animationDuration) { this.mAnimationProgress -= animationDuration; this.mRemainingLoopCount--; - if(this.mRemainingLoopCount < 0) { + if (this.mRemainingLoopCount < 0) { break; - } else if(this.mAnimationListener != null) { + } else if (this.mAnimationListener != null) { this.mAnimationListener.onAnimationLoopFinished(this, this.mRemainingLoopCount, loopCount); } } } - if((loopCount == IAnimationData.LOOP_CONTINUOUS) || (this.mRemainingLoopCount >= 0)) { + if ((loopCount == IAnimationData.LOOP_CONTINUOUS) || (this.mRemainingLoopCount >= 0)) { final int newFrameIndex = this.mAnimationData.calculateCurrentFrameIndex(this.mAnimationProgress); - if(this.mCurrentFrameIndex != newFrameIndex) { - if(frames == null) { + if (this.mCurrentFrameIndex != newFrameIndex) { + if (frames == null) { this.setCurrentTileIndex(this.mAnimationData.getFirstFrameIndex() + newFrameIndex); } else { this.setCurrentTileIndex(frames[newFrameIndex]); } - if(this.mAnimationListener != null) { + if (this.mAnimationListener != null) { this.mAnimationListener.onAnimationFrameChanged(this, this.mCurrentFrameIndex, newFrameIndex); } } this.mCurrentFrameIndex = newFrameIndex; } else { this.mAnimationRunning = false; - if(this.mAnimationListener != null) { + if (this.mAnimationListener != null) { this.mAnimationListener.onAnimationFinished(this); } } diff --git a/src/org/andengine/entity/sprite/AnimationData.java b/src/org/andengine/entity/sprite/AnimationData.java index 85b662eba..64eb83af6 100644 --- a/src/org/andengine/entity/sprite/AnimationData.java +++ b/src/org/andengine/entity/sprite/AnimationData.java @@ -148,8 +148,8 @@ public long getAnimationDuration() { public int calculateCurrentFrameIndex(final long pAnimationProgress) { final long[] frameEnds = this.mFrameEndsInNanoseconds; final int frameCount = this.mFrameCount; - for(int i = 0; i < frameCount; i++) { - if(frameEnds[i] > pAnimationProgress) { + for (int i = 0; i < frameCount; i++) { + if (frameEnds[i] > pAnimationProgress) { return i; } } @@ -207,7 +207,7 @@ public void set(final long[] pFrameDurations, final int pFirstFrameIndex, final public void set(final long[] pFrameDurations, final int pFirstFrameIndex, final int pLastFrameIndex, final int pLoopCount) { this.set(pFrameDurations, (pLastFrameIndex - pFirstFrameIndex) + 1, null, pFirstFrameIndex, pLoopCount); - if((pFirstFrameIndex + 1) > pLastFrameIndex) { + if ((pFirstFrameIndex + 1) > pLastFrameIndex) { throw new IllegalArgumentException("An animation needs at least two tiles to animate between."); } } @@ -253,7 +253,7 @@ public void set(final IAnimationData pAnimationData) { } private void set(final long[] pFrameDurations, final int pFrameCount, final int[] pFrames, final int pFirstFrameIndex, final int pLoopCount) { - if(pFrameDurations.length != pFrameCount) { + if (pFrameDurations.length != pFrameCount) { throw new IllegalArgumentException("pFrameDurations does not equal pFrameCount!"); } @@ -263,7 +263,7 @@ private void set(final long[] pFrameDurations, final int pFrameCount, final int[ this.mFirstFrameIndex = pFirstFrameIndex; this.mLoopCount = pLoopCount; - if((this.mFrameEndsInNanoseconds == null) || (this.mFrameCount > this.mFrameEndsInNanoseconds.length)) { + if ((this.mFrameEndsInNanoseconds == null) || (this.mFrameCount > this.mFrameEndsInNanoseconds.length)) { this.mFrameEndsInNanoseconds = new long[this.mFrameCount]; } diff --git a/src/org/andengine/entity/sprite/ButtonSprite.java b/src/org/andengine/entity/sprite/ButtonSprite.java index a97484d9b..00fe2fc20 100644 --- a/src/org/andengine/entity/sprite/ButtonSprite.java +++ b/src/org/andengine/entity/sprite/ButtonSprite.java @@ -72,7 +72,7 @@ public ButtonSprite(final float pX, final float pY, final ITiledTextureRegion pT this.mOnClickListener = pOnClickListener; this.mStateCount = pTiledTextureRegion.getTileCount(); - switch(this.mStateCount) { + switch (this.mStateCount) { case 1: Debug.w("No " + ITextureRegion.class.getSimpleName() + " supplied for " + State.class.getSimpleName() + "." + State.PRESSED + "."); case 2: @@ -98,9 +98,9 @@ public boolean isEnabled() { public void setEnabled(final boolean pEnabled) { this.mEnabled = pEnabled; - if(this.mEnabled && this.mState == State.DISABLED) { + if (this.mEnabled && this.mState == State.DISABLED) { this.changeState(State.NORMAL); - } else if(!this.mEnabled) { + } else if (!this.mEnabled) { this.changeState(State.DISABLED); } } @@ -123,16 +123,16 @@ public void setOnClickListener(final OnClickListener pOnClickListener) { @Override public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) { - if(!this.isEnabled()) { + if (!this.isEnabled()) { this.changeState(State.DISABLED); - } else if(pSceneTouchEvent.isActionDown()) { + } else if (pSceneTouchEvent.isActionDown()) { this.changeState(State.PRESSED); - } else if(pSceneTouchEvent.isActionCancel() || !this.contains(pSceneTouchEvent.getX(), pSceneTouchEvent.getY())) { + } else if (pSceneTouchEvent.isActionCancel() || !this.contains(pSceneTouchEvent.getX(), pSceneTouchEvent.getY())) { this.changeState(State.NORMAL); - } else if(pSceneTouchEvent.isActionUp() && this.mState == State.PRESSED) { + } else if (pSceneTouchEvent.isActionUp() && this.mState == State.PRESSED) { this.changeState(State.NORMAL); - if(this.mOnClickListener != null) { + if (this.mOnClickListener != null) { this.mOnClickListener.onClick(this, pTouchAreaLocalX, pTouchAreaLocalY); } } @@ -142,7 +142,7 @@ public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTou @Override public boolean contains(final float pX, final float pY) { - if(!this.isVisible()) { + if (!this.isVisible()) { return false; } else { return super.contains(pX, pY); @@ -154,14 +154,14 @@ public boolean contains(final float pX, final float pY) { // =========================================================== private void changeState(final State pState) { - if(pState == this.mState) { + if (pState == this.mState) { return; } this.mState = pState; final int stateTiledTextureRegionIndex = this.mState.getTiledTextureRegionIndex(); - if(stateTiledTextureRegionIndex >= this.mStateCount) { + if (stateTiledTextureRegionIndex >= this.mStateCount) { this.setCurrentTileIndex(0); Debug.w(this.getClass().getSimpleName() + " changed its " + State.class.getSimpleName() + " to " + pState.toString() + ", which doesn't have a " + ITextureRegion.class.getSimpleName() + " supplied. Applying default " + ITextureRegion.class.getSimpleName() + "."); } else { diff --git a/src/org/andengine/entity/sprite/Sprite.java b/src/org/andengine/entity/sprite/Sprite.java index 8e63f3710..9edb77ffe 100644 --- a/src/org/andengine/entity/sprite/Sprite.java +++ b/src/org/andengine/entity/sprite/Sprite.java @@ -130,7 +130,7 @@ public boolean isFlippedHorizontal() { } public void setFlippedHorizontal(final boolean pFlippedHorizontal) { - if(this.mFlippedHorizontal != pFlippedHorizontal) { + if (this.mFlippedHorizontal != pFlippedHorizontal) { this.mFlippedHorizontal = pFlippedHorizontal; this.onUpdateTextureCoordinates(); @@ -142,7 +142,7 @@ public boolean isFlippedVertical() { } public void setFlippedVertical(final boolean pFlippedVertical) { - if(this.mFlippedVertical != pFlippedVertical) { + if (this.mFlippedVertical != pFlippedVertical) { this.mFlippedVertical = pFlippedVertical; this.onUpdateTextureCoordinates(); @@ -150,7 +150,7 @@ public void setFlippedVertical(final boolean pFlippedVertical) { } public void setFlipped(final boolean pFlippedHorizontal, final boolean pFlippedVertical) { - if((this.mFlippedHorizontal != pFlippedHorizontal) || (this.mFlippedVertical != pFlippedVertical)) { + if ((this.mFlippedHorizontal != pFlippedHorizontal) || (this.mFlippedVertical != pFlippedVertical)) { this.mFlippedHorizontal = pFlippedHorizontal; this.mFlippedVertical = pFlippedVertical; diff --git a/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java b/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java index 75a8720eb..cc114c66b 100644 --- a/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java @@ -90,7 +90,7 @@ public DynamicSpriteBatch(final float pX, final float pY, final ITexture pTextur protected void begin() { super.begin(); - if(this.onUpdateSpriteBatch()) { + if (this.onUpdateSpriteBatch()) { this.submit(); } } diff --git a/src/org/andengine/entity/sprite/batch/SpriteBatch.java b/src/org/andengine/entity/sprite/batch/SpriteBatch.java index 3f8ca0dc1..c98af0258 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/SpriteBatch.java @@ -180,7 +180,7 @@ protected void onUpdateVertices() { protected void preDraw(final GLState pGLState, final Camera pCamera) { super.preDraw(pGLState, pCamera); - if(this.mBlendingEnabled) { + if (this.mBlendingEnabled) { pGLState.enableBlend(); pGLState.blendFunction(this.mBlendFunctionSource, this.mBlendFunctionDestination); } @@ -203,7 +203,7 @@ protected void draw(final GLState pGLState, final Camera pCamera) { protected void postDraw(final GLState pGLState, final Camera pCamera) { this.mSpriteBatchVertexBufferObject.unbind(pGLState, this.mShaderProgram); - if(this.mBlendingEnabled) { + if (this.mBlendingEnabled) { pGLState.disableBlend(); } @@ -221,7 +221,7 @@ public void reset() { public void dispose() { super.dispose(); - if(this.mSpriteBatchVertexBufferObject != null && this.mSpriteBatchVertexBufferObject.isAutoDispose() && !this.mSpriteBatchVertexBufferObject.isDisposed()) { + if (this.mSpriteBatchVertexBufferObject != null && this.mSpriteBatchVertexBufferObject.isAutoDispose() && !this.mSpriteBatchVertexBufferObject.isDisposed()) { this.mSpriteBatchVertexBufferObject.dispose(); } } @@ -394,12 +394,12 @@ public void drawWithoutChecks(final ITextureRegion pTextureRegion, final IEntity * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float, float, float, float)}. */ public void draw(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - if(pEntity.isVisible()) { + if (pEntity.isVisible()) { this.assertCapacity(); this.assertTexture(pTextureRegion); - if(pEntity.isRotatedOrScaledOrSkewed()) { + if (pEntity.isRotatedOrScaledOrSkewed()) { this.add(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pRed, pGreen, pBlue, pAlpha); } else { this.add(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pRed, pGreen, pBlue, pAlpha); @@ -410,8 +410,8 @@ public void draw(final ITextureRegion pTextureRegion, final IEntity pEntity, fin } public void drawWithoutChecks(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - if(pEntity.isVisible()) { - if(pEntity.isRotatedOrScaledOrSkewed()) { + if (pEntity.isVisible()) { + if (pEntity.isRotatedOrScaledOrSkewed()) { this.add(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pRed, pGreen, pBlue, pAlpha); } else { this.add(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pRed, pGreen, pBlue, pAlpha); @@ -425,12 +425,12 @@ public void drawWithoutChecks(final ITextureRegion pTextureRegion, final IEntity * @see {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, float, float, float)} {@link SpriteBatchVertexBufferObject#add(ITextureRegion, float, float, Transformation, float, float, float, float)}. */ public void draw(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pColorABGRPackedInt) { - if(pEntity.isVisible()) { + if (pEntity.isVisible()) { this.assertCapacity(); this.assertTexture(pTextureRegion); - if(pEntity.isRotatedOrScaledOrSkewed()) { + if (pEntity.isRotatedOrScaledOrSkewed()) { this.addWithPackedColor(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pColorABGRPackedInt); } else { this.addWithPackedColor(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pColorABGRPackedInt); @@ -441,8 +441,8 @@ public void draw(final ITextureRegion pTextureRegion, final IEntity pEntity, fin } public void drawWithoutChecks(final ITextureRegion pTextureRegion, final IEntity pEntity, final float pColorABGRPackedInt) { - if(pEntity.isVisible()) { - if(pEntity.isRotatedOrScaledOrSkewed()) { + if (pEntity.isVisible()) { + if (pEntity.isRotatedOrScaledOrSkewed()) { this.addWithPackedColor(pTextureRegion, pEntity.getWidth(), pEntity.getHeight(), pEntity.getLocalToParentTransformation(), pColorABGRPackedInt); } else { this.addWithPackedColor(pTextureRegion, pEntity.getX(), pEntity.getY(), pEntity.getWidth(), pEntity.getHeight(), pColorABGRPackedInt); @@ -466,19 +466,19 @@ protected void onSubmit() { } private void assertCapacity(final int pIndex) { - if(pIndex >= this.mCapacity) { + if (pIndex >= this.mCapacity) { throw new IllegalStateException("This supplied pIndex: '" + pIndex + "' is exceeding the capacity: '" + this.mCapacity + "' of this SpriteBatch!"); } } private void assertCapacity() { - if(this.mIndex == this.mCapacity) { + if (this.mIndex == this.mCapacity) { throw new IllegalStateException("This SpriteBatch has already reached its capacity (" + this.mCapacity + ") !"); } } protected void assertTexture(final ITextureRegion pTextureRegion) { - if(pTextureRegion.getTexture() != this.mTexture) { + if (pTextureRegion.getTexture() != this.mTexture) { throw new IllegalArgumentException("The supplied Texture does match the Texture of this SpriteBatch!"); } } diff --git a/src/org/andengine/entity/sprite/batch/SpriteGroup.java b/src/org/andengine/entity/sprite/batch/SpriteGroup.java index d645ad690..2f4306f18 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteGroup.java +++ b/src/org/andengine/entity/sprite/batch/SpriteGroup.java @@ -129,7 +129,7 @@ public SpriteGroup(final float pX, final float pY, final ITexture pTexture, fina @Override @Deprecated public void attachChild(final IEntity pEntity) throws IllegalArgumentException { - if(pEntity instanceof Sprite) { + if (pEntity instanceof Sprite) { this.attachChild((Sprite)pEntity); } else { throw new IllegalArgumentException("A " + SpriteGroup.class.getSimpleName() + " can only handle children of type Sprite or subclasses of Sprite, like TiledSprite or AnimatedSprite."); @@ -144,7 +144,7 @@ public void attachChild(final Sprite pSprite) { public void attachChildren(final ArrayList pSprites) { final int baseSpriteCount = pSprites.size(); - for(int i = 0; i < baseSpriteCount; i++) { + for (int i = 0; i < baseSpriteCount; i++) { this.attachChild(pSprites.get(i)); } } @@ -152,11 +152,11 @@ public void attachChildren(final ArrayList pSprites) { @Override protected boolean onUpdateSpriteBatch() { final SmartList children = this.mChildren; - if(children == null) { + if (children == null) { return false; } else { final int childCount = children.size(); - for(int i = 0; i < childCount; i++) { + for (int i = 0; i < childCount; i++) { this.drawWithoutChecks((Sprite)children.get(i)); } return true; @@ -168,7 +168,7 @@ protected boolean onUpdateSpriteBatch() { // =========================================================== private void assertCapacity() { - if(this.getChildCount() >= this.mCapacity) { + if (this.getChildCount() >= this.mCapacity) { throw new IllegalStateException("This " + SpriteGroup.class.getSimpleName() + " has already reached its capacity (" + this.mCapacity + ") !"); } } diff --git a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java index e6ba7522e..00b370fc2 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java @@ -73,7 +73,7 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float final float u2 = pTextureRegion.getU2(); final float v2 = pTextureRegion.getV2(); - if(pTextureRegion.isRotated()) { + if (pTextureRegion.isRotated()) { bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; @@ -170,7 +170,7 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float final float u2 = pTextureRegion.getU2(); final float v2 = pTextureRegion.getV2(); - if(pTextureRegion.isRotated()) { + if (pTextureRegion.isRotated()) { bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X] = x1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y] = y1; bufferData[bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX] = pColorABGRPackedInt; diff --git a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java index 3699b8c6a..8d4282be8 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java @@ -75,7 +75,7 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float final float u2 = pTextureRegion.getU2(); final float v2 = pTextureRegion.getV2(); - if(pTextureRegion.isRotated()) { + if (pTextureRegion.isRotated()) { bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); @@ -172,7 +172,7 @@ public void addWithPackedColor(final ITextureRegion pTextureRegion, final float final float u2 = pTextureRegion.getU2(); final float v2 = pTextureRegion.getV2(); - if(pTextureRegion.isRotated()) { + if (pTextureRegion.isRotated()) { bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_X, x1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.VERTEX_INDEX_Y, y1); bufferData.put(bufferDataOffset + 0 * SpriteBatch.VERTEX_SIZE + SpriteBatch.COLOR_INDEX, pColorABGRPackedInt); diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java index 6c19d3ebd..21546ff56 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java @@ -73,8 +73,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -86,7 +86,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -102,7 +102,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float uCenter = (u + u2) * 0.5f; final float vCenter = (v + v2) * 0.5f; - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u2; bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = vCenter; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java index 374ae2936..6b2ca5de4 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java @@ -85,8 +85,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -98,7 +98,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -111,7 +111,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java index a0a46c0d7..7bd375f54 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java @@ -47,7 +47,7 @@ public void onUpdateColor(final TiledSprite pTiledSprite) { final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; - for(int i = 0; i < tileCount; i++) { + for (int i = 0; i < tileCount; i++) { bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.COLOR_INDEX] = packedColor; bufferData[bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.COLOR_INDEX] = packedColor; bufferData[bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.COLOR_INDEX] = packedColor; @@ -70,7 +70,7 @@ public void onUpdateVertices(final TiledSprite pTiledSprite) { final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; - for(int i = 0; i < tileCount; i++) { + for (int i = 0; i < tileCount; i++) { bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X] = 0; bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y] = 0; @@ -103,7 +103,7 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; - for(int i = 0; i < tileCount; i++) { + for (int i = 0; i < tileCount; i++) { final ITextureRegion textureRegion = tiledTextureRegion.getTextureRegion(i); final float u; @@ -111,8 +111,8 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { final float u2; final float v2; - if(pTiledSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pTiledSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -124,7 +124,7 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { v2 = textureRegion.getV(); } } else { - if(pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -137,7 +137,7 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V] = v; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java index ffdc8bc85..3edf40172 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java @@ -76,8 +76,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -89,7 +89,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -102,7 +102,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V] = v; diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java index 38f382ca5..0764a3f54 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java @@ -77,8 +77,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -90,7 +90,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -103,7 +103,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U] = u; bufferData[0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V] = v; diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java index 8d21b869b..f25d91224 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java @@ -75,8 +75,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -88,7 +88,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -104,7 +104,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float uCenter = (u + u2) * 0.5f; final float vCenter = (v + v2) * 0.5f; - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u2); bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, vCenter); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java index 2ea394a5f..57f6f36c6 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java @@ -87,8 +87,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -100,7 +100,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -113,7 +113,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(0 * Sprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java index 07a04bd97..ede6c5297 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java @@ -49,7 +49,7 @@ public void onUpdateColor(final TiledSprite pTiledSprite) { final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; - for(int i = 0; i < tileCount; i++) { + for (int i = 0; i < tileCount; i++) { bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.COLOR_INDEX, packedColor); bufferData.put(bufferDataOffset + 1 * TiledSprite.VERTEX_SIZE + Sprite.COLOR_INDEX, packedColor); bufferData.put(bufferDataOffset + 2 * TiledSprite.VERTEX_SIZE + Sprite.COLOR_INDEX, packedColor); @@ -72,7 +72,7 @@ public void onUpdateVertices(final TiledSprite pTiledSprite) { final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; - for(int i = 0; i < tileCount; i++) { + for (int i = 0; i < tileCount; i++) { bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_X, 0); bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.VERTEX_INDEX_Y, 0); @@ -105,7 +105,7 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { final int tileCount = pTiledSprite.getTileCount(); int bufferDataOffset = 0; - for(int i = 0; i < tileCount; i++) { + for (int i = 0; i < tileCount; i++) { final ITextureRegion textureRegion = tiledTextureRegion.getTextureRegion(i); final float u; @@ -113,8 +113,8 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { final float u2; final float v2; - if(pTiledSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pTiledSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -126,7 +126,7 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { v2 = textureRegion.getV(); } } else { - if(pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pTiledSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -139,7 +139,7 @@ public void onUpdateTextureCoordinates(final TiledSprite pTiledSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(bufferDataOffset + 0 * TiledSprite.VERTEX_SIZE + Sprite.TEXTURECOORDINATES_INDEX_V, v); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java index 129e5b4c4..0341d4bb5 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java @@ -78,8 +78,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -91,7 +91,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -104,7 +104,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(0 * UncoloredSprite.VERTEX_SIZE + UncoloredSprite.TEXTURECOORDINATES_INDEX_V, v); diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java index 06a3da4d9..0fbf2e411 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java @@ -79,8 +79,8 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { final float u2; final float v2; - if(pSprite.isFlippedVertical()) { // TODO Optimize with field access? - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedVertical()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV2(); @@ -92,7 +92,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { v2 = textureRegion.getV(); } } else { - if(pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? + if (pSprite.isFlippedHorizontal()) { // TODO Optimize with field access? u = textureRegion.getU2(); u2 = textureRegion.getU(); v = textureRegion.getV(); @@ -105,7 +105,7 @@ public void onUpdateTextureCoordinates(final Sprite pSprite) { } } - if(textureRegion.isRotated()) { + if (textureRegion.isRotated()) { bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_U, u); bufferData.put(0 * UniformColorSprite.VERTEX_SIZE + UniformColorSprite.TEXTURECOORDINATES_INDEX_V, v); diff --git a/src/org/andengine/entity/text/Text.java b/src/org/andengine/entity/text/Text.java index 9ad0db184..f8e9a4a5e 100644 --- a/src/org/andengine/entity/text/Text.java +++ b/src/org/andengine/entity/text/Text.java @@ -193,7 +193,7 @@ public void setText(final CharSequence pText) throws OutOfCharactersException { this.mLines.clear(); this.mLineWidths.clear(); - if(this.mTextOptions.mAutoWrap == AutoWrap.NONE) { + if (this.mTextOptions.mAutoWrap == AutoWrap.NONE) { this.mLines = FontUtils.splitLines(this.mText, this.mLines); // TODO Add whitespace-trimming. } else { this.mLines = FontUtils.splitLines(this.mFont, this.mText, this.mLines, this.mTextOptions.mAutoWrap, this.mTextOptions.mAutoWrapWidth); @@ -209,7 +209,7 @@ public void setText(final CharSequence pText) throws OutOfCharactersException { } this.mLineWidthMaximum = maximumLineWidth; - if(this.mTextOptions.mAutoWrap == AutoWrap.NONE) { + if (this.mTextOptions.mAutoWrap == AutoWrap.NONE) { this.mLineAlignmentWidth = this.mLineWidthMaximum; } else { this.mLineAlignmentWidth = this.mTextOptions.mAutoWrapWidth; @@ -286,7 +286,7 @@ public void setTextOptions(final TextOptions pTextOptions) { } public void setCharactersToDraw(final int pCharactersToDraw) { - if(pCharactersToDraw > this.mCharactersMaximum) { + if (pCharactersToDraw > this.mCharactersMaximum) { throw new OutOfCharactersException("Characters: maximum: '" + this.mCharactersMaximum + "' required: '" + pCharactersToDraw + "'."); } this.mCharactersToDraw = pCharactersToDraw; diff --git a/src/org/andengine/entity/text/TickerText.java b/src/org/andengine/entity/text/TickerText.java index 8c21394ec..8297c210b 100644 --- a/src/org/andengine/entity/text/TickerText.java +++ b/src/org/andengine/entity/text/TickerText.java @@ -79,7 +79,7 @@ public int getCharactersVisible() { public void setText(CharSequence pText) throws OutOfCharactersException { super.setText(pText); - if(this.mTickerTextOptions != null) { + if (this.mTickerTextOptions != null) { this.mDuration = this.mCharactersToDraw * this.mTickerTextOptions.mCharactersPerSecond; } } @@ -92,13 +92,13 @@ public void setText(CharSequence pText) throws OutOfCharactersException { protected void onManagedUpdate(final float pSecondsElapsed) { super.onManagedUpdate(pSecondsElapsed); - if(this.mTickerTextOptions.mReverse) { - if(this.mCharactersVisible < this.mCharactersToDraw) { + if (this.mTickerTextOptions.mReverse) { + if (this.mCharactersVisible < this.mCharactersToDraw) { this.mSecondsElapsed = Math.max(0, this.mSecondsElapsed - pSecondsElapsed); this.mCharactersVisible = (int) (this.mSecondsElapsed * this.mTickerTextOptions.mCharactersPerSecond); } } else { - if(this.mCharactersVisible < this.mCharactersToDraw) { + if (this.mCharactersVisible < this.mCharactersToDraw) { this.mSecondsElapsed = Math.min(this.mDuration, this.mSecondsElapsed + pSecondsElapsed); this.mCharactersVisible = (int) (this.mSecondsElapsed * this.mTickerTextOptions.mCharactersPerSecond); } diff --git a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java index 9d732736d..88bb984dd 100644 --- a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java @@ -51,7 +51,7 @@ public void onUpdateColor(final Text pText) { int bufferDataOffset = 0; final int charactersMaximum = pText.getCharactersMaximum(); - for(int i = 0; i < charactersMaximum; i++) { + for (int i = 0; i < charactersMaximum; i++) { bufferData[bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.COLOR_INDEX] = packedColor; bufferData[bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.COLOR_INDEX] = packedColor; bufferData[bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.COLOR_INDEX] = packedColor; @@ -87,7 +87,7 @@ public void onUpdateVertices(final Text pText) { final CharSequence line = lines.get(row); float xBase; - switch(horizontalAlign) { + switch (horizontalAlign) { case RIGHT: xBase = lineAlignmentWidth - lineWidths.get(row); break; @@ -103,13 +103,13 @@ public void onUpdateVertices(final Text pText) { final int lineLength = line.length(); Letter previousLetter = null; - for(int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; i++) { final Letter letter = font.getLetter(line.charAt(i)); - if(previousLetter != null) { + if (previousLetter != null) { xBase += previousLetter.getKerning(letter.mCharacter); } - if(!letter.isWhitespace()) { + if (!letter.isWhitespace()) { final float x = xBase + letter.mOffsetX; final float y = yBase - letter.mOffsetY; diff --git a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java index 3dc1d2416..2deafc346 100644 --- a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java @@ -52,7 +52,7 @@ public void onUpdateColor(final Text pText) { int bufferDataOffset = 0; final int charactersMaximum = pText.getCharactersMaximum(); - for(int i = 0; i < charactersMaximum; i++) { + for (int i = 0; i < charactersMaximum; i++) { bufferData.put(bufferDataOffset + 0 * Text.VERTEX_SIZE + Text.COLOR_INDEX, packedColor); bufferData.put(bufferDataOffset + 1 * Text.VERTEX_SIZE + Text.COLOR_INDEX, packedColor); bufferData.put(bufferDataOffset + 2 * Text.VERTEX_SIZE + Text.COLOR_INDEX, packedColor); @@ -89,7 +89,7 @@ public void onUpdateVertices(final Text pText) { float xBase; - switch(horizontalAlign) { + switch (horizontalAlign) { case RIGHT: xBase = lineAlignmentWidth - lineWidths.get(row); break; @@ -105,13 +105,13 @@ public void onUpdateVertices(final Text pText) { final int lineLength = line.length(); Letter previousLetter = null; - for(int i = 0; i < lineLength; i++) { + for (int i = 0; i < lineLength; i++) { final Letter letter = font.getLetter(line.charAt(i)); - if(previousLetter != null) { + if (previousLetter != null) { xBase += previousLetter.getKerning(letter.mCharacter); } - if(!letter.isWhitespace()) { + if (!letter.isWhitespace()) { final float x = xBase + letter.mOffsetX; final float y = yBase - letter.mOffsetY; diff --git a/src/org/andengine/entity/util/AverageFPSCounter.java b/src/org/andengine/entity/util/AverageFPSCounter.java index 7dd65ee70..ac8617f00 100644 --- a/src/org/andengine/entity/util/AverageFPSCounter.java +++ b/src/org/andengine/entity/util/AverageFPSCounter.java @@ -48,7 +48,7 @@ public AverageFPSCounter(final float pAverageDuration) { public void onUpdate(final float pSecondsElapsed) { super.onUpdate(pSecondsElapsed); - if(this.mSecondsElapsed > this.mAverageDuration){ + if (this.mSecondsElapsed > this.mAverageDuration) { this.onHandleAverageDurationElapsed(this.getFPS()); this.mSecondsElapsed -= this.mAverageDuration; diff --git a/src/org/andengine/entity/util/FPSLogger.java b/src/org/andengine/entity/util/FPSLogger.java index e4d749b23..daaac54dc 100644 --- a/src/org/andengine/entity/util/FPSLogger.java +++ b/src/org/andengine/entity/util/FPSLogger.java @@ -87,7 +87,7 @@ public void reset() { // =========================================================== protected void onLogFPS() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.log(this.mDebugLevel, String.format("FPS: %.2f (MIN: %.0f ms | MAX: %.0f ms)", this.mFrames / this.mSecondsElapsed, this.mShortestFrame * TimeConstants.MILLISECONDS_PER_SECOND, diff --git a/src/org/andengine/entity/util/FrameCountCrasher.java b/src/org/andengine/entity/util/FrameCountCrasher.java index 5c6175c14..e35aeabf3 100644 --- a/src/org/andengine/entity/util/FrameCountCrasher.java +++ b/src/org/andengine/entity/util/FrameCountCrasher.java @@ -46,11 +46,11 @@ public void onUpdate(final float pSecondsElapsed) { this.mFramesLeft--; final float[] frameLengths = this.mFrameLengths; - if(this.mFramesLeft >= 0) { + if (this.mFramesLeft >= 0) { frameLengths[this.mFramesLeft] = pSecondsElapsed; } else { - if(BuildConfig.DEBUG) { - for(int i = frameLengths.length - 1; i >= 0; i--) { + if (BuildConfig.DEBUG) { + for (int i = frameLengths.length - 1; i >= 0; i--) { Debug.d("Elapsed: " + frameLengths[i]); } } diff --git a/src/org/andengine/entity/util/MemoryLogger.java b/src/org/andengine/entity/util/MemoryLogger.java index 0ff55bf06..c4e263a2f 100644 --- a/src/org/andengine/entity/util/MemoryLogger.java +++ b/src/org/andengine/entity/util/MemoryLogger.java @@ -99,7 +99,7 @@ public MemoryLogger(final float pAverageDuration, final DebugLevel pDebugLevel, public void onUpdate(final float pSecondsElapsed) { this.mSecondsElapsed += pSecondsElapsed; - if(this.mSecondsElapsed > this.mAverageDuration){ + if (this.mSecondsElapsed > this.mAverageDuration) { this.onHandleLogDurationElapsed(); this.mSecondsElapsed -= this.mAverageDuration; @@ -116,7 +116,7 @@ public void reset() { // =========================================================== protected void onHandleLogDurationElapsed() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { /* Execute GC. */ System.gc(); try { @@ -125,7 +125,7 @@ protected void onHandleLogDurationElapsed() { stringBuilder.append("| Memory Stat | Current | Change |\n"); stringBuilder.append("+------------------------------+---------------+-----------------+\n"); - if(this.mLogSystemMemory) { + if (this.mLogSystemMemory) { final long systemMemorySize = SystemUtils.getSystemMemorySize(); final long systemMemoryFreeSize = SystemUtils.getSystemMemoryFreeSize(); @@ -140,7 +140,7 @@ protected void onHandleLogDurationElapsed() { stringBuilder.append("+------------------------------+---------------+-----------------+\n"); } - if(this.mLogDalvikHeap) { + if (this.mLogDalvikHeap) { final long dalvikHeapSize = SystemUtils.getDalvikHeapSize(); final long dalvikHeapFreeSize = SystemUtils.getDalvikHeapFreeSize(); final long dalvikHeapAllocatedSize = SystemUtils.getDalvikHeapAllocatedSize(); @@ -159,7 +159,7 @@ protected void onHandleLogDurationElapsed() { this.mPreviousDalvikHeapAllocatedSize = dalvikHeapAllocatedSize; } - if(this.mLogDalvikMemoryInfo) { + if (this.mLogDalvikMemoryInfo) { final long dalvikProportionalSetSize = SystemUtils.getDalvikProportionalSetSize(); final long dalvikPrivateDirtyPages = SystemUtils.getDalvikPrivateDirtyPages(); final long dalvikSharedDirtyPages = SystemUtils.getDalvikSharedDirtyPages(); @@ -178,7 +178,7 @@ protected void onHandleLogDurationElapsed() { this.mPreviousDalvikSharedDirtyPages = dalvikSharedDirtyPages; } - if(this.mLogNativeHeap) { + if (this.mLogNativeHeap) { final long nativeHeapSize = SystemUtils.getNativeHeapSize(); final long nativeHeapFreeSize = SystemUtils.getNativeHeapFreeSize(); final long nativeHeapAllocatedSize = SystemUtils.getNativeHeapAllocatedSize(); @@ -197,7 +197,7 @@ protected void onHandleLogDurationElapsed() { this.mPreviousNativeHeapAllocatedSize = nativeHeapAllocatedSize; } - if(this.mLogNativeMemoryInfo) { + if (this.mLogNativeMemoryInfo) { final long nativeProportionalSetSize = SystemUtils.getNativeProportionalSetSize(); final long nativePrivateDirtyPages = SystemUtils.getNativePrivateDirtyPages(); final long nativeSharedDirtyPages = SystemUtils.getNativeSharedDirtyPages(); @@ -229,7 +229,7 @@ public static final CharSequence formatRight(final long pLong, final char pPadCh } public static final CharSequence formatRight(final long pLong, final char pPadChar, final int pLength, final boolean pAddPositiveSign) { - if((pLong > 0) && pAddPositiveSign) { + if ((pLong > 0) && pAddPositiveSign) { return TextUtils.padFront("+" + String.valueOf(pLong), pPadChar, pLength); } else { return TextUtils.padFront(String.valueOf(pLong), pPadChar, pLength); diff --git a/src/org/andengine/entity/util/ScreenGrabber.java b/src/org/andengine/entity/util/ScreenGrabber.java index 7ab96a9b9..567c67eba 100644 --- a/src/org/andengine/entity/util/ScreenGrabber.java +++ b/src/org/andengine/entity/util/ScreenGrabber.java @@ -49,7 +49,7 @@ public class ScreenGrabber extends Entity { @Override protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { - if(this.mScreenGrabPending) { + if (this.mScreenGrabPending) { try { final Bitmap screenGrab = ScreenGrabber.grab(this.mGrabX, this.mGrabY, this.mGrabWidth, this.mGrabHeight); diff --git a/src/org/andengine/input/sensor/orientation/OrientationData.java b/src/org/andengine/input/sensor/orientation/OrientationData.java index e85037ace..056062c2f 100644 --- a/src/org/andengine/input/sensor/orientation/OrientationData.java +++ b/src/org/andengine/input/sensor/orientation/OrientationData.java @@ -82,7 +82,7 @@ private void updateOrientation() { SensorManager.getRotationMatrix(this.mRotationMatrix, null, this.mAccelerationValues, this.mMagneticFieldValues); // TODO Use dont't use identical matrixes in remapCoordinateSystem, due to performance reasons. - switch(this.mDisplayRotation) { + switch (this.mDisplayRotation) { case Surface.ROTATION_0: /* Nothing. */ break; @@ -100,7 +100,7 @@ private void updateOrientation() { final float[] values = this.mValues; SensorManager.getOrientation(this.mRotationMatrix, values); - for(int i = values.length - 1; i >= 0; i--) { + for (int i = values.length - 1; i >= 0; i--) { values[i] = values[i] * MathConstants.RAD_TO_DEG; } } diff --git a/src/org/andengine/input/touch/controller/MultiTouch.java b/src/org/andengine/input/touch/controller/MultiTouch.java index 067118a5d..3a7bbddd5 100644 --- a/src/org/andengine/input/touch/controller/MultiTouch.java +++ b/src/org/andengine/input/touch/controller/MultiTouch.java @@ -41,7 +41,7 @@ public class MultiTouch { // =========================================================== public static boolean isSupported(final Context pContext) { - if(MultiTouch.SUPPORTED == null) { + if (MultiTouch.SUPPORTED == null) { MultiTouch.SUPPORTED = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH); } @@ -49,7 +49,7 @@ public static boolean isSupported(final Context pContext) { } public static boolean isSupportedDistinct(final Context pContext) { - if(MultiTouch.SUPPORTED_DISTINCT == null) { + if (MultiTouch.SUPPORTED_DISTINCT == null) { MultiTouch.SUPPORTED_DISTINCT = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT); } diff --git a/src/org/andengine/input/touch/controller/MultiTouchController.java b/src/org/andengine/input/touch/controller/MultiTouchController.java index 747e1ecab..a0c2ae3b0 100644 --- a/src/org/andengine/input/touch/controller/MultiTouchController.java +++ b/src/org/andengine/input/touch/controller/MultiTouchController.java @@ -33,7 +33,7 @@ public class MultiTouchController extends BaseTouchController { @Override public void onHandleMotionEvent(final MotionEvent pMotionEvent) { final int action = pMotionEvent.getAction() & MotionEvent.ACTION_MASK; - switch(action) { + switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: this.onHandleTouchAction(MotionEvent.ACTION_DOWN, pMotionEvent); @@ -59,7 +59,7 @@ public void onHandleMotionEvent(final MotionEvent pMotionEvent) { // =========================================================== private void onHandleTouchMove(final MotionEvent pMotionEvent) { - for(int i = pMotionEvent.getPointerCount() - 1; i >= 0; i--) { + for (int i = pMotionEvent.getPointerCount() - 1; i >= 0; i--) { final int pointerIndex = i; final int pointerID = pMotionEvent.getPointerId(pointerIndex); this.fireTouchEvent(pMotionEvent.getX(pointerIndex), pMotionEvent.getY(pointerIndex), MotionEvent.ACTION_MOVE, pointerID, pMotionEvent); diff --git a/src/org/andengine/input/touch/detector/BaseDetector.java b/src/org/andengine/input/touch/detector/BaseDetector.java index 8a66f27c7..827fa4ad6 100644 --- a/src/org/andengine/input/touch/detector/BaseDetector.java +++ b/src/org/andengine/input/touch/detector/BaseDetector.java @@ -52,7 +52,7 @@ public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouc } public final boolean onTouchEvent(final TouchEvent pSceneTouchEvent) { - if(this.mEnabled) { + if (this.mEnabled) { return this.onManagedTouchEvent(pSceneTouchEvent); } else { return false; diff --git a/src/org/andengine/input/touch/detector/ClickDetector.java b/src/org/andengine/input/touch/detector/ClickDetector.java index 3d61ed6bd..0bfa3d4c6 100644 --- a/src/org/andengine/input/touch/detector/ClickDetector.java +++ b/src/org/andengine/input/touch/detector/ClickDetector.java @@ -65,25 +65,25 @@ public void reset() { @Override public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { - switch(pSceneTouchEvent.getAction()) { + switch (pSceneTouchEvent.getAction()) { case TouchEvent.ACTION_DOWN: this.prepareClick(pSceneTouchEvent); return true; case TouchEvent.ACTION_MOVE: - if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + if (this.mPointerID == pSceneTouchEvent.getPointerID()) { final long moveTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getEventTime(); - if(moveTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) { + if (moveTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) { return true; } } return false; case TouchEvent.ACTION_UP: case TouchEvent.ACTION_CANCEL: - if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + if (this.mPointerID == pSceneTouchEvent.getPointerID()) { final long upTimeMilliseconds = pSceneTouchEvent.getMotionEvent().getEventTime(); boolean handled; - if(upTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) { + if (upTimeMilliseconds - this.mDownTimeMilliseconds <= this.mTriggerClickMaximumMilliseconds) { this.mDownTimeMilliseconds = Long.MIN_VALUE; this.mClickDetectorListener.onClick(this, this.mPointerID, pSceneTouchEvent.getX(), pSceneTouchEvent.getY()); handled = true; diff --git a/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java b/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java index cfd2b8523..6b9fb56b9 100644 --- a/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java +++ b/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java @@ -77,9 +77,9 @@ public void reset() { public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { final MotionEvent motionEvent = pSceneTouchEvent.getMotionEvent(); - switch(pSceneTouchEvent.getAction()) { + switch (pSceneTouchEvent.getAction()) { case TouchEvent.ACTION_DOWN: - if(this.mPointerID == TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID == TouchEvent.INVALID_POINTER_ID) { this.prepareHold(pSceneTouchEvent); return true; } else { @@ -87,7 +87,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { } case TouchEvent.ACTION_MOVE: { - if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + if (this.mPointerID == pSceneTouchEvent.getPointerID()) { this.mHoldX = pSceneTouchEvent.getX(); this.mHoldY = pSceneTouchEvent.getY(); @@ -100,11 +100,11 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { case TouchEvent.ACTION_UP: case TouchEvent.ACTION_CANCEL: { - if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + if (this.mPointerID == pSceneTouchEvent.getPointerID()) { this.mHoldX = pSceneTouchEvent.getX(); this.mHoldY = pSceneTouchEvent.getY(); - if(this.mTriggering) { + if (this.mTriggering) { this.triggerOnHoldFinished(motionEvent.getEventTime() - this.mDownTimeMilliseconds); } @@ -130,12 +130,12 @@ protected void prepareHold(final TouchEvent pSceneTouchEvent) { // =========================================================== void fireListener() { - if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID != TouchEvent.INVALID_POINTER_ID) { final long holdTimeMilliseconds = System.currentTimeMillis() - this.mDownTimeMilliseconds; - if(holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { - if(this.mTriggering) { + if (holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { + if (this.mTriggering) { this.triggerOnHold(holdTimeMilliseconds); - } else if(!this.mMaximumDistanceExceeded) { + } else if (!this.mMaximumDistanceExceeded) { this.triggerOnHoldStarted(); } } diff --git a/src/org/andengine/input/touch/detector/HoldDetector.java b/src/org/andengine/input/touch/detector/HoldDetector.java index 63a6eeded..38b394880 100644 --- a/src/org/andengine/input/touch/detector/HoldDetector.java +++ b/src/org/andengine/input/touch/detector/HoldDetector.java @@ -65,7 +65,7 @@ public long getTriggerHoldMinimumMilliseconds() { } public void setTriggerHoldMinimumMilliseconds(final long pTriggerHoldMinimumMilliseconds) { - if(pTriggerHoldMinimumMilliseconds < 0) { + if (pTriggerHoldMinimumMilliseconds < 0) { throw new IllegalArgumentException("pTriggerHoldMinimumMilliseconds must not be < 0."); } this.mTriggerHoldMinimumMilliseconds = pTriggerHoldMinimumMilliseconds; @@ -76,7 +76,7 @@ public float getTriggerHoldMaximumDistance() { } public void setTriggerHoldMaximumDistance(final float pTriggerHoldMaximumDistance) { - if(pTriggerHoldMaximumDistance < 0) { + if (pTriggerHoldMaximumDistance < 0) { throw new IllegalArgumentException("pTriggerHoldMaximumDistance must not be < 0."); } this.mTriggerHoldMaximumDistance = pTriggerHoldMaximumDistance; @@ -95,7 +95,7 @@ public boolean isHolding() { */ @Override public void reset() { - if(this.mTriggering) { + if (this.mTriggering) { this.triggerOnHoldFinished(System.currentTimeMillis() - this.mDownTimeMilliseconds); } @@ -109,9 +109,9 @@ public void reset() { public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { final MotionEvent motionEvent = pSceneTouchEvent.getMotionEvent(); - switch(pSceneTouchEvent.getAction()) { + switch (pSceneTouchEvent.getAction()) { case TouchEvent.ACTION_DOWN: - if(this.mPointerID == TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID == TouchEvent.INVALID_POINTER_ID) { this.prepareHold(pSceneTouchEvent); return true; } else { @@ -119,20 +119,20 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { } case TouchEvent.ACTION_MOVE: { - if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + if (this.mPointerID == pSceneTouchEvent.getPointerID()) { this.mHoldX = pSceneTouchEvent.getX(); this.mHoldY = pSceneTouchEvent.getY(); final long holdTimeMilliseconds = System.currentTimeMillis() - this.mDownTimeMilliseconds; - if(holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { - if(this.mTriggering) { + if (holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { + if (this.mTriggering) { this.triggerOnHold(holdTimeMilliseconds); } else { final float triggerHoldMaximumDistance = this.mTriggerHoldMaximumDistance; this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; - if(!this.mMaximumDistanceExceeded) { - if(!this.mTriggering) { + if (!this.mMaximumDistanceExceeded) { + if (!this.mTriggering) { this.triggerOnHoldStarted(); } else { this.triggerOnHold(holdTimeMilliseconds); @@ -148,19 +148,19 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { case TouchEvent.ACTION_UP: case TouchEvent.ACTION_CANCEL: { - if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + if (this.mPointerID == pSceneTouchEvent.getPointerID()) { this.mHoldX = pSceneTouchEvent.getX(); this.mHoldY = pSceneTouchEvent.getY(); final long holdTimeMilliseconds = System.currentTimeMillis() - this.mDownTimeMilliseconds; - if(holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { - if(this.mTriggering) { + if (holdTimeMilliseconds >= this.mTriggerHoldMinimumMilliseconds) { + if (this.mTriggering) { this.triggerOnHoldFinished(holdTimeMilliseconds); } else { final float triggerHoldMaximumDistance = this.mTriggerHoldMaximumDistance; this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; - if(!this.mMaximumDistanceExceeded) { + if (!this.mMaximumDistanceExceeded) { this.triggerOnHoldFinished(holdTimeMilliseconds); } } @@ -191,7 +191,7 @@ protected void prepareHold(final TouchEvent pSceneTouchEvent) { this.mHoldX = pSceneTouchEvent.getX(); this.mHoldY = pSceneTouchEvent.getY(); - if(this.mTriggerHoldMinimumMilliseconds == 0) { + if (this.mTriggerHoldMinimumMilliseconds == 0) { this.triggerOnHoldStarted(); } } @@ -199,13 +199,13 @@ protected void prepareHold(final TouchEvent pSceneTouchEvent) { protected void triggerOnHoldStarted() { this.mTriggering = true; - if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mHoldDetectorListener.onHoldStarted(this, this.mPointerID, this.mHoldX, this.mHoldY); } } protected void triggerOnHold(final long pHoldTimeMilliseconds) { - if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mHoldDetectorListener.onHold(this, pHoldTimeMilliseconds, this.mPointerID, this.mHoldX, this.mHoldY); } } @@ -213,7 +213,7 @@ protected void triggerOnHold(final long pHoldTimeMilliseconds) { protected void triggerOnHoldFinished(final long pHoldTimeMilliseconds) { this.mTriggering = false; - if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mHoldDetectorListener.onHoldFinished(this, pHoldTimeMilliseconds, this.mPointerID, this.mHoldX, this.mHoldY); } } diff --git a/src/org/andengine/input/touch/detector/PinchZoomDetector.java b/src/org/andengine/input/touch/detector/PinchZoomDetector.java index 8d7c272c4..1d0bac196 100644 --- a/src/org/andengine/input/touch/detector/PinchZoomDetector.java +++ b/src/org/andengine/input/touch/detector/PinchZoomDetector.java @@ -55,7 +55,7 @@ public boolean isZooming() { */ @Override public void reset() { - if(this.mPinchZooming) { + if (this.mPinchZooming) { this.mPinchZoomDetectorListener.onPinchZoomFinished(this, null, this.getZoomFactor()); } @@ -70,12 +70,12 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { final int action = motionEvent.getAction() & MotionEvent.ACTION_MASK; - switch(action) { + switch (action) { case MotionEvent.ACTION_POINTER_DOWN: - if(!this.mPinchZooming && PinchZoomDetector.hasTwoOrMorePointers(motionEvent)) { + if (!this.mPinchZooming && PinchZoomDetector.hasTwoOrMorePointers(motionEvent)) { this.mInitialDistance = PinchZoomDetector.calculatePointerDistance(motionEvent); this.mCurrentDistance = this.mInitialDistance; - if(this.mInitialDistance > PinchZoomDetector.TRIGGER_PINCHZOOM_MINIMUM_DISTANCE_DEFAULT) { + if (this.mInitialDistance > PinchZoomDetector.TRIGGER_PINCHZOOM_MINIMUM_DISTANCE_DEFAULT) { this.mPinchZooming = true; this.mPinchZoomDetectorListener.onPinchZoomStarted(this, pSceneTouchEvent); } @@ -84,16 +84,16 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: - if(this.mPinchZooming) { + if (this.mPinchZooming) { this.mPinchZooming = false; this.mPinchZoomDetectorListener.onPinchZoomFinished(this, pSceneTouchEvent, this.getZoomFactor()); } break; case MotionEvent.ACTION_MOVE: - if(this.mPinchZooming) { + if (this.mPinchZooming) { if (PinchZoomDetector.hasTwoOrMorePointers(motionEvent)) { this.mCurrentDistance = PinchZoomDetector.calculatePointerDistance(motionEvent); - if(this.mCurrentDistance > PinchZoomDetector.TRIGGER_PINCHZOOM_MINIMUM_DISTANCE_DEFAULT) { + if (this.mCurrentDistance > PinchZoomDetector.TRIGGER_PINCHZOOM_MINIMUM_DISTANCE_DEFAULT) { this.mPinchZoomDetectorListener.onPinchZoom(this, pSceneTouchEvent, this.getZoomFactor()); } } else { diff --git a/src/org/andengine/input/touch/detector/ScrollDetector.java b/src/org/andengine/input/touch/detector/ScrollDetector.java index 673a7c021..dc299e845 100644 --- a/src/org/andengine/input/touch/detector/ScrollDetector.java +++ b/src/org/andengine/input/touch/detector/ScrollDetector.java @@ -61,7 +61,7 @@ public void setTriggerScrollMinimumDistance(final float pTriggerScrollMinimumDis @Override public void reset() { - if(this.mTriggering) { + if (this.mTriggering) { this.mScrollDetectorListener.onScrollFinished(this, this.mPointerID, 0, 0); } @@ -76,21 +76,21 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { final float touchX = this.getX(pSceneTouchEvent); final float touchY = this.getY(pSceneTouchEvent); - switch(pSceneTouchEvent.getAction()) { + switch (pSceneTouchEvent.getAction()) { case TouchEvent.ACTION_DOWN: this.prepareScroll(pSceneTouchEvent.getPointerID(), touchX, touchY); return true; case TouchEvent.ACTION_MOVE: - if(this.mPointerID == TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID == TouchEvent.INVALID_POINTER_ID) { this.prepareScroll(pSceneTouchEvent.getPointerID(), touchX, touchY); return true; - } else if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + } else if (this.mPointerID == pSceneTouchEvent.getPointerID()) { final float distanceX = touchX - this.mLastX; final float distanceY = touchY - this.mLastY; final float triggerScrollMinimumDistance = this.mTriggerScrollMinimumDistance; - if(this.mTriggering || Math.abs(distanceX) > triggerScrollMinimumDistance || Math.abs(distanceY) > triggerScrollMinimumDistance) { - if(!this.mTriggering) { + if (this.mTriggering || Math.abs(distanceX) > triggerScrollMinimumDistance || Math.abs(distanceY) > triggerScrollMinimumDistance) { + if (!this.mTriggering) { this.triggerOnScrollStarted(distanceX, distanceY); } else { this.triggerOnScroll(distanceX, distanceY); @@ -106,11 +106,11 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { } case TouchEvent.ACTION_UP: case TouchEvent.ACTION_CANCEL: - if(this.mPointerID == pSceneTouchEvent.getPointerID()) { + if (this.mPointerID == pSceneTouchEvent.getPointerID()) { final float distanceX = touchX - this.mLastX; final float distanceY = touchY - this.mLastY; - if(this.mTriggering) { + if (this.mTriggering) { this.triggerOnScrollFinished(distanceX, distanceY); } @@ -134,13 +134,13 @@ private void prepareScroll(final int pPointerID, final float pTouchX, final floa } private void triggerOnScrollStarted(final float pDistanceX, final float pDistanceY) { - if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mScrollDetectorListener.onScrollStarted(this, this.mPointerID, pDistanceX, pDistanceY); } } private void triggerOnScroll(final float pDistanceX, final float pDistanceY) { - if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mScrollDetectorListener.onScroll(this, this.mPointerID, pDistanceX, pDistanceY); } } @@ -148,7 +148,7 @@ private void triggerOnScroll(final float pDistanceX, final float pDistanceY) { private void triggerOnScrollFinished(final float pDistanceX, final float pDistanceY) { this.mTriggering = false; - if(this.mPointerID != TouchEvent.INVALID_POINTER_ID) { + if (this.mPointerID != TouchEvent.INVALID_POINTER_ID) { this.mScrollDetectorListener.onScrollFinished(this, this.mPointerID, pDistanceX, pDistanceY); } } diff --git a/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java b/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java index cc556347b..b44a66671 100644 --- a/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java +++ b/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java @@ -116,16 +116,16 @@ public boolean onFling(final MotionEvent pMotionEventStart, final MotionEvent pM final boolean isHorizontalFling = Math.abs(pVelocityX) > Math.abs(pVelocityY); - if(isHorizontalFling) { - if(pMotionEventStart.getX() - pMotionEventEnd.getX() > swipeMinDistance) { + if (isHorizontalFling) { + if (pMotionEventStart.getX() - pMotionEventEnd.getX() > swipeMinDistance) { return SurfaceGestureDetector.this.onSwipeLeft(); - } else if(pMotionEventEnd.getX() - pMotionEventStart.getX() > swipeMinDistance) { + } else if (pMotionEventEnd.getX() - pMotionEventStart.getX() > swipeMinDistance) { return SurfaceGestureDetector.this.onSwipeRight(); } } else { - if(pMotionEventStart.getY() - pMotionEventEnd.getY() > swipeMinDistance) { + if (pMotionEventStart.getY() - pMotionEventEnd.getY() > swipeMinDistance) { return SurfaceGestureDetector.this.onSwipeUp(); - } else if(pMotionEventEnd.getY() - pMotionEventStart.getY() > swipeMinDistance) { + } else if (pMotionEventEnd.getY() - pMotionEventStart.getY() > swipeMinDistance) { return SurfaceGestureDetector.this.onSwipeDown(); } } diff --git a/src/org/andengine/opengl/GLES20Fix.java b/src/org/andengine/opengl/GLES20Fix.java index 349b9b7d9..1ad19aead 100644 --- a/src/org/andengine/opengl/GLES20Fix.java +++ b/src/org/andengine/opengl/GLES20Fix.java @@ -32,8 +32,8 @@ public class GLES20Fix { } NATIVE_LIB_LOADED = loadLibrarySuccess; - if(SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO)) { - if(loadLibrarySuccess) { + if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO)) { + if (loadLibrarySuccess) { WORKAROUND_MISSING_GLES20_METHODS = true; } else { throw new AndEngineRuntimeException("Inherently incompatible device detected."); @@ -71,7 +71,7 @@ private GLES20Fix() { public static native void glDrawElements(final int pMode, final int pCount, final int pType, final int pOffset); public static void glVertexAttribPointerFix(final int pIndex, final int pSize, final int pType, final boolean pNormalized, final int pStride, final int pOffset) { - if(GLES20Fix.WORKAROUND_MISSING_GLES20_METHODS) { + if (GLES20Fix.WORKAROUND_MISSING_GLES20_METHODS) { GLES20Fix.glVertexAttribPointerFix(pIndex, pSize, pType, pNormalized, pStride, pOffset); } else { GLES20.glVertexAttribPointer(pIndex, pSize, pType, pNormalized, pStride, pOffset); @@ -79,7 +79,7 @@ public static void glVertexAttribPointerFix(final int pIndex, final int pSize, f } public static void glDrawElementsFix(final int pMode, final int pCount, final int pType, final int pOffset) { - if(GLES20Fix.WORKAROUND_MISSING_GLES20_METHODS) { + if (GLES20Fix.WORKAROUND_MISSING_GLES20_METHODS) { GLES20Fix.glDrawElements(pMode, pCount, pType, pOffset); } else { GLES20.glDrawElements(pMode, pCount, pType, pOffset); diff --git a/src/org/andengine/opengl/exception/GLException.java b/src/org/andengine/opengl/exception/GLException.java index 7beaddd07..2f54ea6f0 100644 --- a/src/org/andengine/opengl/exception/GLException.java +++ b/src/org/andengine/opengl/exception/GLException.java @@ -53,7 +53,7 @@ public int getError() { private static String getErrorString(final int pError) { String errorString = GLU.gluErrorString(pError); - if(errorString == null) { + if (errorString == null) { errorString = "Unknown error '0x" + Integer.toHexString(pError) + "'."; } return errorString; diff --git a/src/org/andengine/opengl/font/BitmapFont.java b/src/org/andengine/opengl/font/BitmapFont.java index a4494987c..a67a647e7 100644 --- a/src/org/andengine/opengl/font/BitmapFont.java +++ b/src/org/andengine/opengl/font/BitmapFont.java @@ -200,7 +200,7 @@ public BitmapFont(final TextureManager pTextureManager, final AssetManager pAsse final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in), StreamUtils.IO_BUFFER_SIZE); final String assetBasePath; - if(pAssetPath.indexOf('/') == -1) { + if (pAssetPath.indexOf('/') == -1) { assetBasePath = ""; } else { assetBasePath = pAssetPath.substring(0, pAssetPath.lastIndexOf('/') + 1); @@ -214,12 +214,12 @@ public BitmapFont(final TextureManager pTextureManager, final AssetManager pAsse /* Common. */ { final String common = bufferedReader.readLine(); - if((common != null) && common.startsWith(BitmapFont.TAG_COMMON)) { + if ((common != null) && common.startsWith(BitmapFont.TAG_COMMON)) { final String[] commonAttributes = TextUtils.SPLITPATTERN_SPACE.split(common, BitmapFont.TAG_COMMON_ATTRIBUTECOUNT + 1); - if((commonAttributes.length - 1) != BitmapFont.TAG_COMMON_ATTRIBUTECOUNT) { + if ((commonAttributes.length - 1) != BitmapFont.TAG_COMMON_ATTRIBUTECOUNT) { throw new FontException("Expected: '" + BitmapFont.TAG_COMMON_ATTRIBUTECOUNT + "' " + BitmapFont.TAG_COMMON + " attributes, found: '" + (commonAttributes.length - 1) + "'."); } - if(!commonAttributes[0].equals(BitmapFont.TAG_COMMON)) { + if (!commonAttributes[0].equals(BitmapFont.TAG_COMMON)) { throw new FontException("Expected: '" + BitmapFont.TAG_COMMON + "' attributes."); } this.mLineHeight = BitmapFont.getIntAttribute(commonAttributes, BitmapFont.TAG_COMMON_ATTRIBUTE_LINEHEIGHT_INDEX, BitmapFont.TAG_COMMON_ATTRIBUTE_LINEHEIGHT); @@ -229,12 +229,12 @@ public BitmapFont(final TextureManager pTextureManager, final AssetManager pAsse this.mBitmapFontPageCount = BitmapFont.getIntAttribute(commonAttributes, BitmapFont.TAG_COMMON_ATTRIBUTE_PAGES_INDEX, BitmapFont.TAG_COMMON_ATTRIBUTE_PAGES); this.mPacked = BitmapFont.getBooleanAttribute(commonAttributes, BitmapFont.TAG_COMMON_ATTRIBUTE_PACKED_INDEX, BitmapFont.TAG_COMMON_ATTRIBUTE_PACKED); - if(this.mBitmapFontPageCount != 1) { + if (this.mBitmapFontPageCount != 1) { throw new FontException("Only a single page is supported."); } this.mBitmapFontPages = new BitmapFontPage[this.mBitmapFontPageCount]; - if(this.mPacked) { + if (this.mPacked) { throw new FontException("Packed is not supported."); } } else { @@ -243,19 +243,19 @@ public BitmapFont(final TextureManager pTextureManager, final AssetManager pAsse } /* Pages. */ - for(int i = 0; i < this.mBitmapFontPageCount; i++) { + for (int i = 0; i < this.mBitmapFontPageCount; i++) { this.mBitmapFontPages[i] = new BitmapFontPage(pAssetManager, assetBasePath, bufferedReader.readLine()); } /* Chars. */ { final String chars = bufferedReader.readLine(); - if((chars != null) && chars.startsWith(BitmapFont.TAG_CHARS)) { + if ((chars != null) && chars.startsWith(BitmapFont.TAG_CHARS)) { final String[] charsAttributes = TextUtils.SPLITPATTERN_SPACE.split(chars, BitmapFont.TAG_CHARS_ATTRIBUTECOUNT + 1); - if((charsAttributes.length - 1) != BitmapFont.TAG_CHARS_ATTRIBUTECOUNT) { + if ((charsAttributes.length - 1) != BitmapFont.TAG_CHARS_ATTRIBUTECOUNT) { throw new FontException("Expected: '" + BitmapFont.TAG_CHARS_ATTRIBUTECOUNT + "' " + BitmapFont.TAG_CHARS + " attributes, found: '" + (charsAttributes.length - 1) + "'."); } - if(!charsAttributes[0].equals(BitmapFont.TAG_CHARS)) { + if (!charsAttributes[0].equals(BitmapFont.TAG_CHARS)) { throw new FontException("Expected: '" + BitmapFont.TAG_CHARS + "' attributes."); } @@ -270,12 +270,12 @@ public BitmapFont(final TextureManager pTextureManager, final AssetManager pAsse /* Kernings. */ { final String kernings = bufferedReader.readLine(); - if((kernings != null) && kernings.startsWith(BitmapFont.TAG_KERNINGS)) { + if ((kernings != null) && kernings.startsWith(BitmapFont.TAG_KERNINGS)) { final String[] kerningsAttributes = TextUtils.SPLITPATTERN_SPACE.split(kernings, BitmapFont.TAG_KERNINGS_ATTRIBUTECOUNT + 1); - if((kerningsAttributes.length - 1) != BitmapFont.TAG_KERNINGS_ATTRIBUTECOUNT) { + if ((kerningsAttributes.length - 1) != BitmapFont.TAG_KERNINGS_ATTRIBUTECOUNT) { throw new FontException("Expected: '" + BitmapFont.TAG_KERNINGS_ATTRIBUTECOUNT + "' " + BitmapFont.TAG_KERNINGS + " attributes, found: '" + (kerningsAttributes.length - 1) + "'."); } - if(!kerningsAttributes[0].equals(BitmapFont.TAG_KERNINGS)) { + if (!kerningsAttributes[0].equals(BitmapFont.TAG_KERNINGS)) { throw new FontException("Expected: '" + BitmapFont.TAG_KERNINGS + "' attributes."); } @@ -359,7 +359,7 @@ public float getLineHeight() { @Override public Letter getLetter(final char pChar) throws LetterNotFoundException { final Letter letter = this.mCharacterToLetterMap.get(pChar); - if(letter == null) { + if (letter == null) { throw new LetterNotFoundException("Letter '" + pChar + "' not found."); } return letter; @@ -372,7 +372,7 @@ public Letter getLetter(final char pChar) throws LetterNotFoundException { public void loadTextures() { final BitmapFontPage[] bitmapFontPages = this.mBitmapFontPages; final int bitmapFontPageCount = bitmapFontPages.length; - for(int i = 0; i < bitmapFontPageCount; i++) { + for (int i = 0; i < bitmapFontPageCount; i++) { bitmapFontPages[i].getTexture().load(); } } @@ -380,19 +380,19 @@ public void loadTextures() { public void unloadTextures() { final BitmapFontPage[] bitmapFontPages = this.mBitmapFontPages; final int bitmapFontPageCount = bitmapFontPages.length; - for(int i = 0; i < bitmapFontPageCount; i++) { + for (int i = 0; i < bitmapFontPageCount; i++) { bitmapFontPages[i].getTexture().unload(); } } private void parseCharacters(final int pCharacterCount, final BufferedReader pBufferedReader) throws IOException { - for(int i = pCharacterCount - 1; i >= 0; i--) { + for (int i = pCharacterCount - 1; i >= 0; i--) { final String character = pBufferedReader.readLine(); final String[] charAttributes = TextUtils.SPLITPATTERN_SPACES.split(character, BitmapFont.TAG_CHAR_ATTRIBUTECOUNT + 1); - if((charAttributes.length - 1) != BitmapFont.TAG_CHAR_ATTRIBUTECOUNT) { + if ((charAttributes.length - 1) != BitmapFont.TAG_CHAR_ATTRIBUTECOUNT) { throw new FontException("Expected: '" + BitmapFont.TAG_CHAR_ATTRIBUTECOUNT + "' " + BitmapFont.TAG_CHAR + " attributes, found: '" + (charAttributes.length - 1) + "'."); } - if(!charAttributes[0].equals(BitmapFont.TAG_CHAR)) { + if (!charAttributes[0].equals(BitmapFont.TAG_CHAR)) { throw new FontException("Expected: '" + BitmapFont.TAG_CHAR + "' attributes."); } @@ -421,13 +421,13 @@ private void parseCharacters(final int pCharacterCount, final BufferedReader pBu } private void parseKernings(final int pKerningsCount, final BufferedReader pBufferedReader) throws IOException { - for(int i = pKerningsCount - 1; i >= 0; i--) { + for (int i = pKerningsCount - 1; i >= 0; i--) { final String kerning = pBufferedReader.readLine(); final String[] charAttributes = TextUtils.SPLITPATTERN_SPACES.split(kerning, BitmapFont.TAG_KERNING_ATTRIBUTECOUNT + 1); - if((charAttributes.length - 1) != BitmapFont.TAG_KERNING_ATTRIBUTECOUNT) { + if ((charAttributes.length - 1) != BitmapFont.TAG_KERNING_ATTRIBUTECOUNT) { throw new FontException("Expected: '" + BitmapFont.TAG_KERNING_ATTRIBUTECOUNT + "' " + BitmapFont.TAG_KERNING + " attributes, found: '" + (charAttributes.length - 1) + "'."); } - if(!charAttributes[0].equals(BitmapFont.TAG_KERNING)) { + if (!charAttributes[0].equals(BitmapFont.TAG_KERNING)) { throw new FontException("Expected: '" + BitmapFont.TAG_KERNING + "' attributes."); } @@ -443,7 +443,7 @@ private static boolean getBooleanAttribute(final String[] pData, final int pPosi final String data = pData[pPosition]; final int attributeLength = pAttribute.length(); - if(!data.startsWith(pAttribute) || (data.charAt(attributeLength) != '=')) { + if (!data.startsWith(pAttribute) || (data.charAt(attributeLength) != '=')) { throw new FontException("Expected '" + pAttribute + "' at position '" + pPosition + "', but found: '" + data + "'."); } @@ -458,7 +458,7 @@ private static int getIntAttribute(final String[] pData, final int pPosition, fi final String data = pData[pPosition]; final int attributeLength = pAttribute.length(); - if(!data.startsWith(pAttribute) || (data.charAt(attributeLength) != '=')) { + if (!data.startsWith(pAttribute) || (data.charAt(attributeLength) != '=')) { throw new FontException("Expected '" + pAttribute + "' at position '" + pPosition + "', but found: '" + data + "'."); } @@ -469,7 +469,7 @@ private static String getStringAttribute(final String[] pData, final int pPositi final String data = pData[pPosition]; final int attributeLength = pAttribute.length(); - if(!data.startsWith(pAttribute) || (data.charAt(attributeLength) != '=')) { + if (!data.startsWith(pAttribute) || (data.charAt(attributeLength) != '=')) { throw new FontException("Expected '" + pAttribute + "' at position '" + pPosition + "', but found: '" + data + "'."); } @@ -480,7 +480,7 @@ private static String getAttribute(final String[] pData, final int pPosition, fi final String data = pData[pPosition]; final int attributeLength = pAttribute.length(); - if(!data.startsWith(pAttribute)) { + if (!data.startsWith(pAttribute)) { throw new FontException("Expected '" + pAttribute + "' at position '" + pPosition + "', but found: '" + data + "'."); } @@ -579,16 +579,16 @@ public class BitmapFontInfo { // =========================================================== public BitmapFontInfo(final String pData) throws FontException { - if(pData == null) { + if (pData == null) { throw new FontException("pData must not be null."); } final String[] infoAttributes = TextUtils.SPLITPATTERN_SPACE.split(pData, BitmapFont.TAG_INFO_ATTRIBUTECOUNT + 1); - if((infoAttributes.length - 1) != BitmapFont.TAG_INFO_ATTRIBUTECOUNT) { + if ((infoAttributes.length - 1) != BitmapFont.TAG_INFO_ATTRIBUTECOUNT) { throw new FontException("Expected: '" + BitmapFont.TAG_INFO_ATTRIBUTECOUNT + "' " + BitmapFont.TAG_INFO + " attributes, found: '" + (infoAttributes.length - 1) + "'."); } - if(!infoAttributes[0].equals(BitmapFont.TAG_INFO)) { + if (!infoAttributes[0].equals(BitmapFont.TAG_INFO)) { throw new FontException("Expected: '" + BitmapFont.TAG_INFO + "' attributes."); } @@ -711,10 +711,10 @@ public class BitmapFontPage { public BitmapFontPage(final AssetManager pAssetManager, final String pAssetBasePath, final String pData) throws IOException { final String[] pageAttributes = TextUtils.SPLITPATTERN_SPACE.split(pData, BitmapFont.TAG_PAGE_ATTRIBUTECOUNT + 1); - if((pageAttributes.length - 1) != BitmapFont.TAG_PAGE_ATTRIBUTECOUNT) { + if ((pageAttributes.length - 1) != BitmapFont.TAG_PAGE_ATTRIBUTECOUNT) { throw new FontException("Expected: '" + BitmapFont.TAG_PAGE_ATTRIBUTECOUNT + "' " + BitmapFont.TAG_PAGE + " attributes, found: '" + (pageAttributes.length - 1) + "'."); } - if(!pageAttributes[0].equals(BitmapFont.TAG_PAGE)) { + if (!pageAttributes[0].equals(BitmapFont.TAG_PAGE)) { throw new FontException("Expected: '" + BitmapFont.TAG_PAGE + "' attributes."); } diff --git a/src/org/andengine/opengl/font/Font.java b/src/org/andengine/opengl/font/Font.java index 59a2e5de0..2331ddd28 100644 --- a/src/org/andengine/opengl/font/Font.java +++ b/src/org/andengine/opengl/font/Font.java @@ -142,7 +142,7 @@ public float getLineHeight() { @Override public synchronized Letter getLetter(final char pCharacter) throws FontException { Letter letter = this.mManagedCharacterToLetterMap.get(pCharacter); - if(letter == null) { + if (letter == null) { letter = this.createLetter(pCharacter); this.mLettersPendingToBeDrawnToTexture.add(letter); @@ -160,7 +160,7 @@ public synchronized void invalidateLetters() { final SparseArray managedCharacterToLetterMap = this.mManagedCharacterToLetterMap; /* Make all letters redraw to the texture. */ - for(int i = managedCharacterToLetterMap.size() - 1; i >= 0; i--) { + for (int i = managedCharacterToLetterMap.size() - 1; i >= 0; i--) { lettersPendingToBeDrawnToTexture.add(managedCharacterToLetterMap.valueAt(i)); } } @@ -197,7 +197,7 @@ protected void drawLetter(final String pCharacterAsString, final float pLeft, fi } public void prepareLetters(final char... pCharacters) throws FontException { - for(final char character : pCharacters) { + for (final char character : pCharacters) { this.getLetter(character); } } @@ -219,16 +219,16 @@ private Letter createLetter(final char pCharacter) throws FontException { final float advance = this.getLetterAdvance(characterAsString); final boolean whitespace = Character.isWhitespace(pCharacter) || (letterWidth == 0) || (letterHeight == 0); - if(whitespace) { + if (whitespace) { letter = new Letter(pCharacter, advance); } else { - if((this.mCurrentTextureX + Font.LETTER_TEXTURE_PADDING + letterWidth) >= textureWidth) { + if ((this.mCurrentTextureX + Font.LETTER_TEXTURE_PADDING + letterWidth) >= textureWidth) { this.mCurrentTextureX = 0; this.mCurrentTextureY += this.mCurrentTextureYHeightMax + (2 * Font.LETTER_TEXTURE_PADDING); this.mCurrentTextureYHeightMax = 0; } - if((this.mCurrentTextureY + letterHeight) >= textureHeight) { + if ((this.mCurrentTextureY + letterHeight) >= textureHeight) { throw new FontException("Not enough space for " + Letter.class.getSimpleName() + ": '" + pCharacter + "' on the " + this.mTexture.getClass().getSimpleName() + ". Existing Letters: " + SparseArrayUtils.toString(this.mManagedCharacterToLetterMap)); } @@ -253,31 +253,31 @@ protected void updateTextBounds(final String pCharacterAsString) { } public synchronized void update(final GLState pGLState) { - if(this.mTexture.isLoadedToHardware()) { + if (this.mTexture.isLoadedToHardware()) { final ArrayList lettersPendingToBeDrawnToTexture = this.mLettersPendingToBeDrawnToTexture; - if(lettersPendingToBeDrawnToTexture.size() > 0) { + if (lettersPendingToBeDrawnToTexture.size() > 0) { this.mTexture.bind(pGLState); final PixelFormat pixelFormat = this.mTexture.getPixelFormat(); final boolean preMultipyAlpha = this.mTexture.getTextureOptions().mPreMultiplyAlpha; - for(int i = lettersPendingToBeDrawnToTexture.size() - 1; i >= 0; i--) { + for (int i = lettersPendingToBeDrawnToTexture.size() - 1; i >= 0; i--) { final Letter letter = lettersPendingToBeDrawnToTexture.get(i); - if(!letter.isWhitespace()) { + if (!letter.isWhitespace()) { final Bitmap bitmap = this.getLetterBitmap(letter); final boolean useDefaultAlignment = MathUtils.isPowerOfTwo(bitmap.getWidth()) && MathUtils.isPowerOfTwo(bitmap.getHeight()) && (pixelFormat == PixelFormat.RGBA_8888); - if(!useDefaultAlignment) { + if (!useDefaultAlignment) { /* Adjust unpack alignment. */ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1); } - if(preMultipyAlpha) { + if (preMultipyAlpha) { GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, letter.mTextureX, letter.mTextureY, bitmap); } else { pGLState.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, letter.mTextureX, letter.mTextureY, bitmap, pixelFormat); } - if(!useDefaultAlignment) { + if (!useDefaultAlignment) { /* Restore default unpack alignment. */ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, GLState.GL_UNPACK_ALIGNMENT_DEFAULT); } diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java index 5111e875f..c4fb05d61 100644 --- a/src/org/andengine/opengl/font/FontFactory.java +++ b/src/org/andengine/opengl/font/FontFactory.java @@ -43,7 +43,7 @@ public class FontFactory { * @param pAssetBasePath must end with '/' or have .length() == 0. */ public static void setAssetBasePath(final String pAssetBasePath) { - if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { FontFactory.sAssetBasePath = pAssetBasePath; } else { throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); diff --git a/src/org/andengine/opengl/font/FontLibrary.java b/src/org/andengine/opengl/font/FontLibrary.java index df09435b4..a71d88969 100644 --- a/src/org/andengine/opengl/font/FontLibrary.java +++ b/src/org/andengine/opengl/font/FontLibrary.java @@ -46,9 +46,9 @@ public FontLibrary(final int pInitialCapacity) { public void loadFonts(final FontManager pFontManager) { final SparseArray items = this.mItems; - for(int i = items.size() - 1; i >= 0; i--) { + for (int i = items.size() - 1; i >= 0; i--) { final Font font = items.valueAt(i); - if(font != null) { + if (font != null) { pFontManager.loadFont(font); } } diff --git a/src/org/andengine/opengl/font/FontManager.java b/src/org/andengine/opengl/font/FontManager.java index 5d906511e..5b0aebd13 100644 --- a/src/org/andengine/opengl/font/FontManager.java +++ b/src/org/andengine/opengl/font/FontManager.java @@ -48,7 +48,7 @@ public void onCreate() { public synchronized void onDestroy() { final ArrayList managedFonts = this.mFontsManaged; - for(int i = managedFonts.size() - 1; i >= 0; i--) { + for (int i = managedFonts.size() - 1; i >= 0; i--) { managedFonts.get(i).invalidateLetters(); } @@ -58,85 +58,85 @@ public synchronized void onDestroy() { } public synchronized boolean hasMappedFont(final String pID) { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); } return this.mFontsMapped.containsKey(pID); } public synchronized IFont getMappedFont(final String pID) { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); } return this.mFontsMapped.get(pID); } public synchronized void addMappedFont(final String pID, final IFont pFont) throws IllegalArgumentException { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); - } else if(pFont == null) { + } else if (pFont == null) { throw new IllegalArgumentException("pFont must not be null!"); - } else if(this.mFontsMapped.containsKey(pID)) { + } else if (this.mFontsMapped.containsKey(pID)) { throw new IllegalArgumentException("Collision for pID: '" + pID + "'."); } this.mFontsMapped.put(pID, pFont); } public synchronized IFont removedMappedFont(final String pID) { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); } return this.mFontsMapped.remove(pID); } public synchronized void loadFont(final Font pFont) { - if(pFont == null) { + if (pFont == null) { throw new IllegalArgumentException("pFont must not be null!"); } this.mFontsManaged.add(pFont); } public synchronized void loadFont(final BitmapFont pBitmapFont) { - if(pBitmapFont == null) { + if (pBitmapFont == null) { throw new IllegalArgumentException("pBitmapFont must not be null!"); } this.mBitmapFontsManaged.add(pBitmapFont); } public synchronized void loadFonts(final Font ... pFonts) { - for(int i = 0; i < pFonts.length; i++) { + for (int i = 0; i < pFonts.length; i++) { this.loadFont(pFonts[i]); } } public synchronized void loadFonts(final BitmapFont ... pBitmapFonts) { - for(int i = 0; i < pBitmapFonts.length; i++) { + for (int i = 0; i < pBitmapFonts.length; i++) { this.loadFont(pBitmapFonts[i]); } } public synchronized void unloadFont(final Font pFont) { - if(pFont == null) { + if (pFont == null) { throw new IllegalArgumentException("pFont must not be null!"); } this.mFontsManaged.remove(pFont); } public synchronized void unloadFont(final BitmapFont pBitmapFont) { - if(pBitmapFont == null) { + if (pBitmapFont == null) { throw new IllegalArgumentException("pBitmapFont must not be null!"); } this.mBitmapFontsManaged.remove(pBitmapFont); } public synchronized void unloadFonts(final Font ... pFonts) { - for(int i = 0; i < pFonts.length; i++) { + for (int i = 0; i < pFonts.length; i++) { this.unloadFont(pFonts[i]); } } public synchronized void unloadFonts(final BitmapFont ... pBitmapFonts) { - for(int i = 0; i < pBitmapFonts.length; i++) { + for (int i = 0; i < pBitmapFonts.length; i++) { this.unloadFont(pBitmapFonts[i]); } } @@ -144,8 +144,8 @@ public synchronized void unloadFonts(final BitmapFont ... pBitmapFonts) { public synchronized void updateFonts(final GLState pGLState) { final ArrayList fonts = this.mFontsManaged; final int fontCount = fonts.size(); - if(fontCount > 0){ - for(int i = fontCount - 1; i >= 0; i--){ + if (fontCount > 0) { + for (int i = fontCount - 1; i >= 0; i--) { fonts.get(i).update(pGLState); } } @@ -153,7 +153,7 @@ public synchronized void updateFonts(final GLState pGLState) { public synchronized void onReload() { final ArrayList managedFonts = this.mFontsManaged; - for(int i = managedFonts.size() - 1; i >= 0; i--) { + for (int i = managedFonts.size() - 1; i >= 0; i--) { managedFonts.get(i).invalidateLetters(); } } diff --git a/src/org/andengine/opengl/font/FontUtils.java b/src/org/andengine/opengl/font/FontUtils.java index cffdb9259..3eb8d2e33 100644 --- a/src/org/andengine/opengl/font/FontUtils.java +++ b/src/org/andengine/opengl/font/FontUtils.java @@ -83,29 +83,29 @@ public static float measureText(final IFont pFont, final CharSequence pText, fin public static float measureText(final IFont pFont, final CharSequence pText, final int pStart, final int pEnd, final float[] pWidths) { final int textLength = pEnd - pStart; /* Early exits. */ - if(pStart == pEnd) { + if (pStart == pEnd) { return 0; - } else if(textLength == 1) { + } else if (textLength == 1) { return pFont.getLetter(pText.charAt(pStart)).mWidth; } Letter previousLetter = null; float width = 0; - for(int pos = pStart, i = 0; pos < pEnd; pos++, i++) { + for (int pos = pStart, i = 0; pos < pEnd; pos++, i++) { final Letter letter = pFont.getLetter(pText.charAt(pos)); - if(previousLetter != null) { + if (previousLetter != null) { width += previousLetter.getKerning(letter.mCharacter); } previousLetter = letter; /* Check if this is the last character. */ - if(pos == (pEnd - 1)) { + if (pos == (pEnd - 1)) { width += letter.mOffsetX + letter.mWidth; } else { width += letter.mAdvance; } - if(pWidths != null) { + if (pWidths != null) { pWidths[i] = width; } } @@ -143,7 +143,7 @@ public static > L splitLines(final IFont pFont, fin /** * TODO In order to respect already existing linebreaks, {@link FontUtils#split(CharSequence, List)} could be leveraged and than the following methods could be called for each line. */ - switch(pAutoWrap) { + switch (pAutoWrap) { case LETTERS: return FontUtils.splitLinesByLetters(pFont, pText, pResult, pAutoWrapWidth); case WORDS: @@ -164,10 +164,10 @@ private static > L splitLinesByLetters(final IFont int lastNonWhitespace = 0; boolean charsAvailable = false; - for(int i = 0; i < textLength; i++) { + for (int i = 0; i < textLength; i++) { final char character = pText.charAt(i); - if(character != ' ') { - if(charsAvailable) { + if (character != ' ') { + if (charsAvailable) { lastNonWhitespace = i + 1; } else { charsAvailable = true; @@ -177,7 +177,7 @@ private static > L splitLinesByLetters(final IFont } } - if(charsAvailable) { + if (charsAvailable) { // /* Just for debugging. */ // final CharSequence line = pText.subSequence(lineStart, lineEnd); // final float lineWidth = FontUtils.measureText(pFont, pText, lineStart, lineEnd); @@ -186,19 +186,19 @@ private static > L splitLinesByLetters(final IFont final float lookaheadLineWidth = FontUtils.measureText(pFont, pText, lineStart, lastNonWhitespace); final boolean isEndReached = (i == (textLength - 1)); - if(isEndReached) { + if (isEndReached) { /* When the end of the string is reached, add remainder to result. */ - if(lookaheadLineWidth <= pAutoWrapWidth) { + if (lookaheadLineWidth <= pAutoWrapWidth) { pResult.add(pText.subSequence(lineStart, lastNonWhitespace)); } else { pResult.add(pText.subSequence(lineStart, lineEnd)); /* Avoid special case where last line is added twice. */ - if(lineStart != i) { + if (lineStart != i) { pResult.add(pText.subSequence(i, lastNonWhitespace)); } } } else { - if(lookaheadLineWidth <= pAutoWrapWidth) { + if (lookaheadLineWidth <= pAutoWrapWidth) { lineEnd = lastNonWhitespace; } else { pResult.add(pText.subSequence(lineStart, lineEnd)); @@ -215,7 +215,7 @@ private static > L splitLinesByLetters(final IFont private static > L splitLinesByWords(final IFont pFont, final CharSequence pText, final L pResult, final float pAutoWrapWidth) { final int textLength = pText.length(); - if(textLength == 0) { + if (textLength == 0) { return pResult; } @@ -240,7 +240,7 @@ private static > L splitLinesByWords(final IFont pF final int wordStart = i; /* Mark beginning of a new line. */ - if(lineStart == FontUtils.UNSPECIFIED) { + if (lineStart == FontUtils.UNSPECIFIED) { lineStart = wordStart; } @@ -252,8 +252,8 @@ private static > L splitLinesByWords(final IFont pF final int wordEnd = i; /* Nothing more could be read. */ - if(wordStart == wordEnd) { - if(!firstWordInLine) { + if (wordStart == wordEnd) { + if (!firstWordInLine) { pResult.add(pText.subSequence(lineStart, lineEnd)); } break; @@ -266,7 +266,7 @@ private static > L splitLinesByWords(final IFont pF /* Determine the width actually needed for the current word. */ final float widthNeeded; - if(firstWordInLine) { + if (firstWordInLine) { widthNeeded = wordWidth; } else { widthNeeded = (spacesSkipped * spaceWidth) + wordWidth; @@ -274,7 +274,7 @@ private static > L splitLinesByWords(final IFont pF /* Check if the word fits into the rest of the line. */ if (widthNeeded <= lineWidthRemaining) { - if(firstWordInLine) { + if (firstWordInLine) { firstWordInLine = false; } else { lineWidthRemaining -= FontUtils.getAdvanceCorrection(pFont, pText, lastWordEnd - 1); @@ -284,23 +284,23 @@ private static > L splitLinesByWords(final IFont pF lineEnd = wordEnd; /* Check if the end was reached. */ - if(wordEnd == textLength) { + if (wordEnd == textLength) { pResult.add(pText.subSequence(lineStart, lineEnd)); /* Added the last line. */ break; } } else { /* Special case for lines with only one word. */ - if(firstWordInLine) { + if (firstWordInLine) { /* Check for lines that are just too big. */ - if(wordWidth >= pAutoWrapWidth) { + if (wordWidth >= pAutoWrapWidth) { pResult.add(pText.subSequence(wordStart, wordEnd)); lineWidthRemaining = pAutoWrapWidth; } else { lineWidthRemaining = pAutoWrapWidth - wordWidth; /* Check if the end was reached. */ - if(wordEnd == textLength) { + if (wordEnd == textLength) { pResult.add(pText.subSequence(wordStart, wordEnd)); /* Added the last line. */ break; @@ -317,7 +317,7 @@ private static > L splitLinesByWords(final IFont pF pResult.add(pText.subSequence(lineStart, lineEnd)); /* Check if the end was reached. */ - if(wordEnd == textLength) { + if (wordEnd == textLength) { /* Add the last word. */ pResult.add(pText.subSequence(wordStart, wordEnd)); // TODO Does this cover all cases? break; @@ -378,7 +378,7 @@ private static > L splitLinesByCJK(final IFont pFon final float lineWidth = FontUtils.measureText(pFont, pText, lineStart, lineEnd); - if(lineWidth > pAutoWrapWidth) { + if (lineWidth > pAutoWrapWidth) { if ( lineStart < lineEnd - 1 ) { lineEnd--; } @@ -391,7 +391,7 @@ private static > L splitLinesByCJK(final IFont pFon i = lineEnd; } - if(charsAvailable) { + if (charsAvailable) { pResult.add(pText.subSequence(lineStart, lineEnd)); } } diff --git a/src/org/andengine/opengl/font/Letter.java b/src/org/andengine/opengl/font/Letter.java index a62ded3a9..7cfda118c 100644 --- a/src/org/andengine/opengl/font/Letter.java +++ b/src/org/andengine/opengl/font/Letter.java @@ -69,7 +69,7 @@ private Letter(final char pCharacter, final boolean pWhitespace, final int pText // =========================================================== public int getKerning(final int pCharacter) { - if(this.mKernings == null) { + if (this.mKernings == null) { return 0; } return this.mKernings.get(pCharacter, 0); @@ -93,17 +93,17 @@ public int hashCode() { @Override public boolean equals(final Object pObject) { - if(this == pObject) { + if (this == pObject) { return true; } - if(pObject == null) { + if (pObject == null) { return false; } - if(this.getClass() != pObject.getClass()) { + if (this.getClass() != pObject.getClass()) { return false; } final Letter other = (Letter) pObject; - if(this.mCharacter != other.mCharacter) { + if (this.mCharacter != other.mCharacter) { return false; } return true; @@ -136,7 +136,7 @@ public String toString() { } void addKerning(final int pCharacter, final int pKerning) { - if(this.mKernings == null) { + if (this.mKernings == null) { this.mKernings = new SparseIntArray(); } this.mKernings.put(pCharacter, pKerning); diff --git a/src/org/andengine/opengl/font/StrokeFont.java b/src/org/andengine/opengl/font/StrokeFont.java index bfc657fdd..00844db75 100644 --- a/src/org/andengine/opengl/font/StrokeFont.java +++ b/src/org/andengine/opengl/font/StrokeFont.java @@ -79,7 +79,7 @@ protected void updateTextBounds(final String pCharacterAsString) { @Override protected void drawLetter(final String pCharacterAsString, final float pLeft, final float pTop) { - if(!this.mStrokeOnly) { + if (!this.mStrokeOnly) { super.drawLetter(pCharacterAsString, pLeft, pTop); } this.mCanvas.drawText(pCharacterAsString, pLeft + Font.LETTER_TEXTURE_PADDING, pTop + Font.LETTER_TEXTURE_PADDING, this.mStrokePaint); diff --git a/src/org/andengine/opengl/shader/PositionColorShaderProgram.java b/src/org/andengine/opengl/shader/PositionColorShaderProgram.java index 02b1844b0..60f2724cc 100644 --- a/src/org/andengine/opengl/shader/PositionColorShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionColorShaderProgram.java @@ -52,7 +52,7 @@ private PositionColorShaderProgram() { } public static PositionColorShaderProgram getInstance() { - if(PositionColorShaderProgram.INSTANCE == null) { + if (PositionColorShaderProgram.INSTANCE == null) { PositionColorShaderProgram.INSTANCE = new PositionColorShaderProgram(); } return PositionColorShaderProgram.INSTANCE; diff --git a/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java b/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java index ec6b9432c..3e692c27a 100644 --- a/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java @@ -58,7 +58,7 @@ private PositionColorTextureCoordinatesShaderProgram() { } public static PositionColorTextureCoordinatesShaderProgram getInstance() { - if(PositionColorTextureCoordinatesShaderProgram.INSTANCE == null) { + if (PositionColorTextureCoordinatesShaderProgram.INSTANCE == null) { PositionColorTextureCoordinatesShaderProgram.INSTANCE = new PositionColorTextureCoordinatesShaderProgram(); } return PositionColorTextureCoordinatesShaderProgram.INSTANCE; diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java index 5d60c210a..6c51c352b 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java @@ -55,7 +55,7 @@ private PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgra } public static PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram getInstance() { - if(PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.INSTANCE == null) { + if (PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.INSTANCE == null) { PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.INSTANCE = new PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram(); } return PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.INSTANCE; diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java index 0033d41d1..34e68279f 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java @@ -54,7 +54,7 @@ private PositionTextureCoordinatesShaderProgram() { } public static PositionTextureCoordinatesShaderProgram getInstance() { - if(PositionTextureCoordinatesShaderProgram.INSTANCE == null) { + if (PositionTextureCoordinatesShaderProgram.INSTANCE == null) { PositionTextureCoordinatesShaderProgram.INSTANCE = new PositionTextureCoordinatesShaderProgram(); } return PositionTextureCoordinatesShaderProgram.INSTANCE; diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java index 05914ad9b..34628c862 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java @@ -29,7 +29,7 @@ public class PositionTextureCoordinatesTextureSelectShaderProgram extends Shader "uniform bool " + ShaderProgramConstants.UNIFORM_TEXTURESELECT_TEXTURE_0 + ";\n" + "varying mediump vec2 " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ";\n" + "void main() {\n" + - " if(" + ShaderProgramConstants.UNIFORM_TEXTURESELECT_TEXTURE_0 + ") {\n" + + " if (" + ShaderProgramConstants.UNIFORM_TEXTURESELECT_TEXTURE_0 + ") {\n" + " gl_FragColor = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_0 + ", " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ");\n" + " } else {\n" + " gl_FragColor = texture2D(" + ShaderProgramConstants.UNIFORM_TEXTURE_1 + ", " + ShaderProgramConstants.VARYING_TEXTURECOORDINATES + ");\n" + @@ -54,7 +54,7 @@ private PositionTextureCoordinatesTextureSelectShaderProgram() { } public static PositionTextureCoordinatesTextureSelectShaderProgram getInstance() { - if(PositionTextureCoordinatesTextureSelectShaderProgram.INSTANCE == null) { + if (PositionTextureCoordinatesTextureSelectShaderProgram.INSTANCE == null) { PositionTextureCoordinatesTextureSelectShaderProgram.INSTANCE = new PositionTextureCoordinatesTextureSelectShaderProgram(); } return PositionTextureCoordinatesTextureSelectShaderProgram.INSTANCE; diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java index 2fa560734..3bec5ca2b 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java @@ -56,7 +56,7 @@ private PositionTextureCoordinatesUniformColorShaderProgram() { } public static PositionTextureCoordinatesUniformColorShaderProgram getInstance() { - if(PositionTextureCoordinatesUniformColorShaderProgram.INSTANCE == null) { + if (PositionTextureCoordinatesUniformColorShaderProgram.INSTANCE == null) { PositionTextureCoordinatesUniformColorShaderProgram.INSTANCE = new PositionTextureCoordinatesUniformColorShaderProgram(); } return PositionTextureCoordinatesUniformColorShaderProgram.INSTANCE; diff --git a/src/org/andengine/opengl/shader/ShaderProgram.java b/src/org/andengine/opengl/shader/ShaderProgram.java index 094575a07..15fe2cb0a 100644 --- a/src/org/andengine/opengl/shader/ShaderProgram.java +++ b/src/org/andengine/opengl/shader/ShaderProgram.java @@ -75,7 +75,7 @@ public void setCompiled(final boolean pCompiled) { public int getAttributeLocation(final String pAttributeName) { final Integer location = this.mAttributeLocations.get(pAttributeName); - if(location != null) { + if (location != null) { return location.intValue(); } else { throw new ShaderProgramException("Unexpected attribute: '" + pAttributeName + "'. Existing attributes: " + this.mAttributeLocations.toString()); @@ -84,7 +84,7 @@ public int getAttributeLocation(final String pAttributeName) { public int getAttributeLocationOptional(final String pAttributeName) { final Integer location = this.mAttributeLocations.get(pAttributeName); - if(location != null) { + if (location != null) { return location.intValue(); } else { return ShaderProgramConstants.LOCATION_INVALID; @@ -93,7 +93,7 @@ public int getAttributeLocationOptional(final String pAttributeName) { public int getUniformLocation(final String pUniformName) { final Integer location = this.mUniformLocations.get(pUniformName); - if(location != null) { + if (location != null) { return location.intValue(); } else { throw new ShaderProgramException("Unexpected uniform: '" + pUniformName + "'. Existing uniforms: " + this.mUniformLocations.toString()); @@ -102,7 +102,7 @@ public int getUniformLocation(final String pUniformName) { public int getUniformLocationOptional(final String pUniformName) { final Integer location = this.mUniformLocations.get(pUniformName); - if(location != null) { + if (location != null) { return location.intValue(); } else { return ShaderProgramConstants.LOCATION_INVALID; @@ -118,7 +118,7 @@ public int getUniformLocationOptional(final String pUniformName) { // =========================================================== public void bind(final GLState pGLState, final VertexBufferObjectAttributes pVertexBufferObjectAttributes) throws ShaderProgramException { - if(!this.mCompiled) { + if (!this.mCompiled) { this.compile(pGLState); } pGLState.useProgram(this.mProgramID); @@ -131,7 +131,7 @@ public void unbind(final GLState pGLState) throws ShaderProgramException { } public void delete(final GLState pGLState) { - if(this.mCompiled) { + if (this.mCompiled) { this.mCompiled = false; pGLState.deleteProgram(this.mProgramID); this.mProgramID = -1; @@ -163,7 +163,7 @@ protected void link(final GLState pGLState) throws ShaderProgramLinkException { GLES20.glLinkProgram(this.mProgramID); GLES20.glGetProgramiv(this.mProgramID, GLES20.GL_LINK_STATUS, ShaderProgram.HARDWAREID_CONTAINER, 0); - if(ShaderProgram.HARDWAREID_CONTAINER[0] == 0) { + if (ShaderProgram.HARDWAREID_CONTAINER[0] == 0) { throw new ShaderProgramLinkException(GLES20.glGetProgramInfoLog(this.mProgramID)); } @@ -175,7 +175,7 @@ protected void link(final GLState pGLState) throws ShaderProgramLinkException { private static int compileShader(final String pSource, final int pType) throws ShaderProgramException { final int shaderID = GLES20.glCreateShader(pType); - if(shaderID == 0) { + if (shaderID == 0) { throw new ShaderProgramException("Could not create Shader of type: '" + pType + '"'); } @@ -183,7 +183,7 @@ private static int compileShader(final String pSource, final int pType) throws S GLES20.glCompileShader(shaderID); GLES20.glGetShaderiv(shaderID, GLES20.GL_COMPILE_STATUS, ShaderProgram.HARDWAREID_CONTAINER, 0); - if(ShaderProgram.HARDWAREID_CONTAINER[0] == 0) { + if (ShaderProgram.HARDWAREID_CONTAINER[0] == 0) { throw new ShaderProgramCompileException(GLES20.glGetShaderInfoLog(shaderID), pSource); } return shaderID; @@ -196,13 +196,13 @@ private void initUniformLocations() throws ShaderProgramLinkException { GLES20.glGetProgramiv(this.mProgramID, GLES20.GL_ACTIVE_UNIFORMS, ShaderProgram.PARAMETERS_CONTAINER, 0); final int numUniforms = ShaderProgram.PARAMETERS_CONTAINER[0]; - for(int i = 0; i < numUniforms; i++) { + for (int i = 0; i < numUniforms; i++) { GLES20.glGetActiveUniform(this.mProgramID, i, ShaderProgram.NAME_CONTAINER_SIZE, ShaderProgram.LENGTH_CONTAINER, 0, ShaderProgram.SIZE_CONTAINER, 0, ShaderProgram.TYPE_CONTAINER, 0, ShaderProgram.NAME_CONTAINER, 0); int length = ShaderProgram.LENGTH_CONTAINER[0]; /* Some drivers do not report the actual length here, but zero. Then the name is '\0' terminated. */ - if(length == 0) { + if (length == 0) { while((length < ShaderProgram.NAME_CONTAINER_SIZE) && (ShaderProgram.NAME_CONTAINER[length] != '\0')) { length++; } @@ -211,7 +211,7 @@ private void initUniformLocations() throws ShaderProgramLinkException { String name = new String(ShaderProgram.NAME_CONTAINER, 0, length); int location = GLES20.glGetUniformLocation(this.mProgramID, name); - if(location == ShaderProgramConstants.LOCATION_INVALID) { + if (location == ShaderProgramConstants.LOCATION_INVALID) { /* Some drivers do not report an incorrect length. Then the name is '\0' terminated. */ length = 0; while(length < ShaderProgram.NAME_CONTAINER_SIZE && ShaderProgram.NAME_CONTAINER[length] != '\0') { @@ -221,7 +221,7 @@ private void initUniformLocations() throws ShaderProgramLinkException { name = new String(ShaderProgram.NAME_CONTAINER, 0, length); location = GLES20.glGetUniformLocation(this.mProgramID, name); - if(location == ShaderProgramConstants.LOCATION_INVALID) { + if (location == ShaderProgramConstants.LOCATION_INVALID) { throw new ShaderProgramLinkException("Invalid location for uniform: '" + name + "'."); } } @@ -241,13 +241,13 @@ private void initAttributeLocations() { GLES20.glGetProgramiv(this.mProgramID, GLES20.GL_ACTIVE_ATTRIBUTES, ShaderProgram.PARAMETERS_CONTAINER, 0); final int numAttributes = ShaderProgram.PARAMETERS_CONTAINER[0]; - for(int i = 0; i < numAttributes; i++) { + for (int i = 0; i < numAttributes; i++) { GLES20.glGetActiveAttrib(this.mProgramID, i, ShaderProgram.NAME_CONTAINER_SIZE, ShaderProgram.LENGTH_CONTAINER, 0, ShaderProgram.SIZE_CONTAINER, 0, ShaderProgram.TYPE_CONTAINER, 0, ShaderProgram.NAME_CONTAINER, 0); int length = ShaderProgram.LENGTH_CONTAINER[0]; /* Some drivers do not report the actual length here, but zero. Then the name is '\0' terminated. */ - if(length == 0) { + if (length == 0) { while((length < ShaderProgram.NAME_CONTAINER_SIZE) && (ShaderProgram.NAME_CONTAINER[length] != '\0')) { length++; } @@ -256,7 +256,7 @@ private void initAttributeLocations() { String name = new String(ShaderProgram.NAME_CONTAINER, 0, length); int location = GLES20.glGetAttribLocation(this.mProgramID, name); - if(location == ShaderProgramConstants.LOCATION_INVALID) { + if (location == ShaderProgramConstants.LOCATION_INVALID) { /* Some drivers do not report an incorrect length. Then the name is '\0' terminated. */ length = 0; while(length < ShaderProgram.NAME_CONTAINER_SIZE && ShaderProgram.NAME_CONTAINER[length] != '\0') { @@ -266,7 +266,7 @@ private void initAttributeLocations() { name = new String(ShaderProgram.NAME_CONTAINER, 0, length); location = GLES20.glGetAttribLocation(this.mProgramID, name); - if(location == ShaderProgramConstants.LOCATION_INVALID) { + if (location == ShaderProgramConstants.LOCATION_INVALID) { throw new ShaderProgramLinkException("Invalid location for attribute: '" + name + "'."); } } @@ -281,7 +281,7 @@ public void setUniform(final String pUniformName, final float[] pGLMatrix) { public void setUniformOptional(final String pUniformName, final float[] pGLMatrix) { final int location = this.getUniformLocationOptional(pUniformName); - if(location != ShaderProgramConstants.LOCATION_INVALID) { + if (location != ShaderProgramConstants.LOCATION_INVALID) { GLES20.glUniformMatrix4fv(this.getUniformLocationOptional(pUniformName), 1, false, pGLMatrix, 0); } } @@ -292,7 +292,7 @@ public void setUniform(final String pUniformName, final float pX) { public void setUniformOptional(final String pUniformName, final float pX) { final int location = this.getUniformLocationOptional(pUniformName); - if(location != ShaderProgramConstants.LOCATION_INVALID) { + if (location != ShaderProgramConstants.LOCATION_INVALID) { GLES20.glUniform1f(this.getUniformLocationOptional(pUniformName), pX); } } @@ -303,7 +303,7 @@ public void setUniform(final String pUniformName, final float pX, final float pY public void setUniformOptional(final String pUniformName, final float pX, final float pY) { final int location = this.getUniformLocationOptional(pUniformName); - if(location != ShaderProgramConstants.LOCATION_INVALID) { + if (location != ShaderProgramConstants.LOCATION_INVALID) { GLES20.glUniform2f(this.getUniformLocationOptional(pUniformName), pX, pY); } } @@ -314,7 +314,7 @@ public void setUniform(final String pUniformName, final float pX, final float pY public void setUniformOptional(final String pUniformName, final float pX, final float pY, final float pZ) { final int location = this.getUniformLocationOptional(pUniformName); - if(location != ShaderProgramConstants.LOCATION_INVALID) { + if (location != ShaderProgramConstants.LOCATION_INVALID) { GLES20.glUniform3f(this.getUniformLocationOptional(pUniformName), pX, pY, pZ); } } @@ -325,7 +325,7 @@ public void setUniform(final String pUniformName, final float pX, final float pY public void setUniformOptional(final String pUniformName, final float pX, final float pY, final float pZ, final float pW) { final int location = this.getUniformLocationOptional(pUniformName); - if(location != ShaderProgramConstants.LOCATION_INVALID) { + if (location != ShaderProgramConstants.LOCATION_INVALID) { GLES20.glUniform4f(this.getUniformLocationOptional(pUniformName), pX, pY, pZ, pW); } } @@ -344,7 +344,7 @@ public void setTexture(final String pUniformName, final int pTexture) { */ public void setTextureOptional(final String pUniformName, final int pTexture) { final int location = this.getUniformLocationOptional(pUniformName); - if(location != ShaderProgramConstants.LOCATION_INVALID) { + if (location != ShaderProgramConstants.LOCATION_INVALID) { GLES20.glUniform1i(location, pTexture); } } diff --git a/src/org/andengine/opengl/shader/ShaderProgramManager.java b/src/org/andengine/opengl/shader/ShaderProgramManager.java index 245a949fd..11d0077c0 100644 --- a/src/org/andengine/opengl/shader/ShaderProgramManager.java +++ b/src/org/andengine/opengl/shader/ShaderProgramManager.java @@ -49,7 +49,7 @@ public synchronized void onCreate() { public synchronized void onDestroy() { final ArrayList managedShaderPrograms = this.mShaderProgramsManaged; - for(int i = managedShaderPrograms.size() - 1; i >= 0; i--) { + for (int i = managedShaderPrograms.size() - 1; i >= 0; i--) { managedShaderPrograms.get(i).setCompiled(false); } @@ -57,17 +57,17 @@ public synchronized void onDestroy() { } public synchronized void loadShaderProgram(final ShaderProgram pShaderProgram) { - if(pShaderProgram == null) { + if (pShaderProgram == null) { throw new IllegalArgumentException("pShaderProgram must not be null!"); } - if(pShaderProgram.isCompiled()) { + if (pShaderProgram.isCompiled()) { Debug.w("Loading an already compiled " + ShaderProgram.class.getSimpleName() + ": '" + pShaderProgram.getClass().getSimpleName() + "'. '" + pShaderProgram.getClass().getSimpleName() + "' will be recompiled."); pShaderProgram.setCompiled(false); } - if(this.mShaderProgramsManaged.contains(pShaderProgram)) { + if (this.mShaderProgramsManaged.contains(pShaderProgram)) { Debug.w("Loading an already loaded " + ShaderProgram.class.getSimpleName() + ": '" + pShaderProgram.getClass().getSimpleName() + "'."); } else { this.mShaderProgramsManaged.add(pShaderProgram); @@ -75,14 +75,14 @@ public synchronized void loadShaderProgram(final ShaderProgram pShaderProgram) { } public void loadShaderPrograms(final ShaderProgram ... pShaderPrograms) { - for(int i = pShaderPrograms.length - 1; i >= 0; i--) { + for (int i = pShaderPrograms.length - 1; i >= 0; i--) { this.loadShaderProgram(pShaderPrograms[i]); } } public synchronized void onReload() { final ArrayList managedShaderPrograms = this.mShaderProgramsManaged; - for(int i = managedShaderPrograms.size() - 1; i >= 0; i--) { + for (int i = managedShaderPrograms.size() - 1; i >= 0; i--) { managedShaderPrograms.get(i).setCompiled(false); } } diff --git a/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java b/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java index 30edfcea8..77fdb2007 100644 --- a/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java +++ b/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java @@ -39,9 +39,9 @@ public CriteriaShaderSource(final CriteriaShaderSourceEntry ... pCriteriaShaderS @Override public String getShaderSource(final GLState pGLState) { - for(int i = 0; i < this.mCriteriaShaderSourceEntries.length; i++) { + for (int i = 0; i < this.mCriteriaShaderSourceEntries.length; i++) { final CriteriaShaderSourceEntry criteriaShaderSourceEntry = this.mCriteriaShaderSourceEntries[i]; - if(criteriaShaderSourceEntry.isMet(pGLState)) { + if (criteriaShaderSourceEntry.isMet(pGLState)) { return criteriaShaderSourceEntry.getShaderSource(); } } @@ -98,9 +98,9 @@ public String getShaderSource() { // =========================================================== public boolean isMet(final GLState pGLState) { - if(this.mGLCriterias != null) { - for(IGLCriteria gLCriteria : this.mGLCriterias) { - if(!gLCriteria.isMet(pGLState)) { + if (this.mGLCriterias != null) { + for (IGLCriteria gLCriteria : this.mGLCriterias) { + if (!gLCriteria.isMet(pGLState)) { return false; } } diff --git a/src/org/andengine/opengl/texture/DebugTextureStateListener.java b/src/org/andengine/opengl/texture/DebugTextureStateListener.java index f3c94a56e..d80f12700 100644 --- a/src/org/andengine/opengl/texture/DebugTextureStateListener.java +++ b/src/org/andengine/opengl/texture/DebugTextureStateListener.java @@ -33,14 +33,14 @@ public class DebugTextureStateListener implements @Override public void onLoadedToHardware(final ITexture pTexture) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d("Texture loaded: " + pTexture.toString()); } } @Override public void onUnloadedFromHardware(final ITexture pTexture) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d("Texture unloaded: " + pTexture.toString()); } } diff --git a/src/org/andengine/opengl/texture/Texture.java b/src/org/andengine/opengl/texture/Texture.java index 618de5f3c..65f57bdb3 100644 --- a/src/org/andengine/opengl/texture/Texture.java +++ b/src/org/andengine/opengl/texture/Texture.java @@ -140,7 +140,7 @@ public void loadToHardware(final GLState pGLState) throws IOException { this.mUpdateOnHardwareNeeded = false; - if(this.mTextureStateListener != null) { + if (this.mTextureStateListener != null) { this.mTextureStateListener.onLoadedToHardware(this); } } @@ -151,7 +151,7 @@ public void unloadFromHardware(final GLState pGLState) { this.mHardwareTextureID = Texture.HARDWARE_TEXTURE_ID_INVALID; - if(this.mTextureStateListener != null) { + if (this.mTextureStateListener != null) { this.mTextureStateListener.onUnloadedFromHardware(this); } } diff --git a/src/org/andengine/opengl/texture/TextureManager.java b/src/org/andengine/opengl/texture/TextureManager.java index bc02d1733..6c2b85a11 100644 --- a/src/org/andengine/opengl/texture/TextureManager.java +++ b/src/org/andengine/opengl/texture/TextureManager.java @@ -62,18 +62,18 @@ public synchronized void onCreate() { public synchronized void onReload() { final HashSet managedTextures = this.mTexturesManaged; - if(!managedTextures.isEmpty()) { - for(final ITexture texture : managedTextures) { // TODO Can the use of the iterator be avoided somehow? + if (!managedTextures.isEmpty()) { + for (final ITexture texture : managedTextures) { // TODO Can the use of the iterator be avoided somehow? texture.setNotLoadedToHardware(); } } - if(!this.mTexturesLoaded.isEmpty()) { + if (!this.mTexturesLoaded.isEmpty()) { this.mTexturesToBeLoaded.addAll(this.mTexturesLoaded); // TODO Check if addAll uses iterator internally! this.mTexturesLoaded.clear(); } - if(!this.mTexturesToBeUnloaded.isEmpty()) { + if (!this.mTexturesToBeUnloaded.isEmpty()) { this.mTexturesManaged.removeAll(this.mTexturesToBeUnloaded); // TODO Check if removeAll uses iterator internally! this.mTexturesToBeUnloaded.clear(); } @@ -83,7 +83,7 @@ public synchronized void onReload() { public synchronized void onDestroy() { final HashSet managedTextures = this.mTexturesManaged; - for(final ITexture texture : managedTextures) { // TODO Can the use of the iterator be avoided somehow? + for (final ITexture texture : managedTextures) { // TODO Can the use of the iterator be avoided somehow? texture.setNotLoadedToHardware(); } @@ -97,32 +97,32 @@ public synchronized void onDestroy() { } public synchronized boolean hasMappedTexture(final String pID) { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); } return this.mTexturesMapped.containsKey(pID); } public synchronized ITexture getMappedTexture(final String pID) { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); } return this.mTexturesMapped.get(pID); } public synchronized void addMappedTexture(final String pID, final ITexture pTexture) throws IllegalArgumentException { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); - } else if(pTexture == null) { + } else if (pTexture == null) { throw new IllegalArgumentException("pTexture must not be null!"); - } else if(this.mTexturesMapped.containsKey(pID)) { + } else if (this.mTexturesMapped.containsKey(pID)) { throw new IllegalArgumentException("Collision for pID: '" + pID + "'."); } this.mTexturesMapped.put(pID, pTexture); } public synchronized ITexture removedMappedTexture(final String pID) { - if(pID == null) { + if (pID == null) { throw new IllegalArgumentException("pID must not be null!"); } return this.mTexturesMapped.remove(pID); @@ -133,11 +133,11 @@ public synchronized ITexture removedMappedTexture(final String pID) { * @return true when the {@link ITexture} was previously not managed by this {@link TextureManager}, false if it was already managed. */ public synchronized boolean loadTexture(final ITexture pTexture) { - if(pTexture == null) { + if (pTexture == null) { throw new IllegalArgumentException("pTexture must not be null!"); } - if(this.mTexturesManaged.contains(pTexture)) { + if (this.mTexturesManaged.contains(pTexture)) { /* Just make sure it doesn't get deleted. */ this.mTexturesToBeUnloaded.remove(pTexture); return false; @@ -156,17 +156,17 @@ public synchronized boolean loadTexture(final ITexture pTexture) { * @return true when the {@link ITexture} was previously not managed by this {@link TextureManager}, false if it was already managed. */ public synchronized boolean loadTexture(final GLState pGLState, final ITexture pTexture) throws IOException { - if(pTexture == null) { + if (pTexture == null) { throw new IllegalArgumentException("pTexture must not be null!"); } - if(!pTexture.isLoadedToHardware()) { + if (!pTexture.isLoadedToHardware()) { pTexture.loadToHardware(pGLState); - } else if(pTexture.isUpdateOnHardwareNeeded()) { + } else if (pTexture.isUpdateOnHardwareNeeded()) { pTexture.reloadToHardware(pGLState); } - if(this.mTexturesManaged.contains(pTexture)) { + if (this.mTexturesManaged.contains(pTexture)) { /* Just make sure it doesn't get deleted. */ this.mTexturesToBeUnloaded.remove(pTexture); return false; @@ -182,16 +182,16 @@ public synchronized boolean loadTexture(final GLState pGLState, final ITexture p * @return true when the {@link ITexture} was already managed by this {@link TextureManager}, false if it was not managed. */ public synchronized boolean unloadTexture(final ITexture pTexture) { - if(pTexture == null) { + if (pTexture == null) { throw new IllegalArgumentException("pTexture must not be null!"); } - if(this.mTexturesManaged.contains(pTexture)) { + if (this.mTexturesManaged.contains(pTexture)) { /* If the Texture is loaded, unload it. * If the Texture is about to be loaded, stop it from being loaded. */ - if(this.mTexturesLoaded.contains(pTexture)) { + if (this.mTexturesLoaded.contains(pTexture)) { this.mTexturesToBeUnloaded.add(pTexture); - } else if(this.mTexturesToBeLoaded.remove(pTexture)) { + } else if (this.mTexturesToBeLoaded.remove(pTexture)) { this.mTexturesManaged.remove(pTexture); } return true; @@ -208,13 +208,13 @@ public synchronized boolean unloadTexture(final ITexture pTexture) { * @return true when the {@link ITexture} was already managed by this {@link TextureManager}, false if it was not managed. */ public synchronized boolean unloadTexture(final GLState pGLState, final ITexture pTexture) { - if(pTexture == null) { + if (pTexture == null) { throw new IllegalArgumentException("pTexture must not be null!"); - } else if(pTexture.isLoadedToHardware()) { + } else if (pTexture.isLoadedToHardware()) { pTexture.unloadFromHardware(pGLState); } - if(this.mTexturesManaged.contains(pTexture)) { + if (this.mTexturesManaged.contains(pTexture)) { /* Just make sure it doesn't get loaded. */ this.mTexturesLoaded.remove(pTexture); this.mTexturesToBeLoaded.remove(pTexture); @@ -232,9 +232,9 @@ public synchronized void updateTextures(final GLState pGLState) { final ArrayList texturesToBeUnloaded = this.mTexturesToBeUnloaded; /* First reload Textures that need to be updated. */ - for(int i = texturesLoaded.size() - 1; i >= 0; i--) { + for (int i = texturesLoaded.size() - 1; i >= 0; i--) { final ITexture textureToBeReloaded = texturesLoaded.get(i); - if(textureToBeReloaded.isUpdateOnHardwareNeeded()) { + if (textureToBeReloaded.isUpdateOnHardwareNeeded()) { try { textureToBeReloaded.reloadToHardware(pGLState); } catch (final IOException e) { @@ -246,10 +246,10 @@ public synchronized void updateTextures(final GLState pGLState) { /* Then load pending Textures. */ final int texturesToBeLoadedCount = texturesToBeLoaded.size(); - if(texturesToBeLoadedCount > 0) { - for(int i = texturesToBeLoadedCount - 1; i >= 0; i--) { + if (texturesToBeLoadedCount > 0) { + for (int i = texturesToBeLoadedCount - 1; i >= 0; i--) { final ITexture textureToBeLoaded = texturesToBeLoaded.remove(i); - if(!textureToBeLoaded.isLoadedToHardware()) { + if (!textureToBeLoaded.isLoadedToHardware()) { try { textureToBeLoaded.loadToHardware(pGLState); @@ -266,10 +266,10 @@ public synchronized void updateTextures(final GLState pGLState) { /* Then unload pending Textures. */ final int texturesToBeUnloadedCount = texturesToBeUnloaded.size(); - if(texturesToBeUnloadedCount > 0) { - for(int i = texturesToBeUnloadedCount - 1; i >= 0; i--) { + if (texturesToBeUnloadedCount > 0) { + for (int i = texturesToBeUnloadedCount - 1; i >= 0; i--) { final ITexture textureToBeUnloaded = texturesToBeUnloaded.remove(i); - if(textureToBeUnloaded.isLoadedToHardware()) { + if (textureToBeUnloaded.isLoadedToHardware()) { textureToBeUnloaded.unloadFromHardware(pGLState); } texturesLoaded.remove(textureToBeUnloaded); @@ -278,7 +278,7 @@ public synchronized void updateTextures(final GLState pGLState) { } /* Finally invoke the GC if anything has changed. */ - if((texturesToBeLoadedCount > 0) || (texturesToBeUnloadedCount > 0)) { + if ((texturesToBeLoadedCount > 0) || (texturesToBeUnloadedCount > 0)) { System.gc(); } } @@ -288,7 +288,7 @@ public synchronized ITexture getTexture(final String pID, final AssetManager pAs } public synchronized ITexture getTexture(final String pID, final AssetManager pAssetManager, final String pAssetPath, final TextureOptions pTextureOptions) throws IOException { - if(this.hasMappedTexture(pID)) { + if (this.hasMappedTexture(pID)) { return this.getMappedTexture(pID); } else { final ITexture texture = new AssetBitmapTexture(this, pAssetManager, pAssetPath, pTextureOptions); @@ -312,11 +312,11 @@ public synchronized ITexture getTexture(final String pID, final IInputStreamOpen } public synchronized ITexture getTexture(final String pID, final IInputStreamOpener pInputStreamOpener, final BitmapTextureFormat pBitmapTextureFormat, final TextureOptions pTextureOptions, final boolean pLoadToHardware) throws IOException { - if(this.hasMappedTexture(pID)) { + if (this.hasMappedTexture(pID)) { return this.getMappedTexture(pID); } else { final ITexture texture = new BitmapTexture(this, pInputStreamOpener, pBitmapTextureFormat, pTextureOptions); - if(pLoadToHardware) { + if (pLoadToHardware) { this.loadTexture(texture); } this.addMappedTexture(pID, texture); diff --git a/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java b/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java index 1b1f2c72f..11b335023 100644 --- a/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java @@ -80,7 +80,7 @@ public void onUnloadedFromHardware(final ITexture pTexture) { } public static class DebugTextureAtlasStateListener implements ITextureAtlasStateListener { @Override public void onLoadedToHardware(final ITexture pTexture) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d("Texture loaded: " + pTexture.toString()); } } @@ -97,7 +97,7 @@ public void onTextureAtlasSourceLoadExeption(final ITextureAtlas pTextureAtla @Override public void onUnloadedFromHardware(final ITexture pTexture) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d("Texture unloaded: " + pTexture.toString()); } } diff --git a/src/org/andengine/opengl/texture/atlas/TextureAtlas.java b/src/org/andengine/opengl/texture/atlas/TextureAtlas.java index 8ac0faa6f..549830a05 100644 --- a/src/org/andengine/opengl/texture/atlas/TextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/TextureAtlas.java @@ -113,24 +113,24 @@ public void addTextureAtlasSource(final T pTextureAtlasSource, final int pTextur public void addTextureAtlasSource(final T pTextureAtlasSource, final int pTextureX, final int pTextureY, final int pTextureAtlasSourcePadding) throws IllegalArgumentException { this.addTextureAtlasSource(pTextureAtlasSource, pTextureX, pTextureY); - if(pTextureAtlasSourcePadding > 0) { + if (pTextureAtlasSourcePadding > 0) { /* Left padding. */ - if(pTextureX >= pTextureAtlasSourcePadding) { + if (pTextureX >= pTextureAtlasSourcePadding) { this.addEmptyTextureAtlasSource(pTextureX - pTextureAtlasSourcePadding, pTextureY, pTextureAtlasSourcePadding, pTextureAtlasSource.getTextureHeight()); } /* Top padding. */ - if(pTextureY >= pTextureAtlasSourcePadding) { + if (pTextureY >= pTextureAtlasSourcePadding) { this.addEmptyTextureAtlasSource(pTextureX, pTextureY - pTextureAtlasSourcePadding, pTextureAtlasSource.getTextureWidth(), pTextureAtlasSourcePadding); } /* Right padding. */ - if(pTextureX + pTextureAtlasSource.getTextureWidth() - 1 + pTextureAtlasSourcePadding <= this.getWidth()) { + if (pTextureX + pTextureAtlasSource.getTextureWidth() - 1 + pTextureAtlasSourcePadding <= this.getWidth()) { this.addEmptyTextureAtlasSource(pTextureX + pTextureAtlasSource.getTextureWidth(), pTextureY, pTextureAtlasSourcePadding, pTextureAtlasSource.getTextureHeight()); } /* Bottom padding. */ - if(pTextureY + pTextureAtlasSource.getTextureHeight() - 1 + pTextureAtlasSourcePadding <= this.getHeight()) { + if (pTextureY + pTextureAtlasSource.getTextureHeight() - 1 + pTextureAtlasSourcePadding <= this.getHeight()) { this.addEmptyTextureAtlasSource(pTextureX, pTextureY + pTextureAtlasSource.getTextureHeight(), pTextureAtlasSource.getTextureWidth(), pTextureAtlasSourcePadding); } } @@ -139,9 +139,9 @@ public void addTextureAtlasSource(final T pTextureAtlasSource, final int pTextur @Override public void removeTextureAtlasSource(final T pTextureAtlasSource, final int pTextureX, final int pTextureY) { final ArrayList textureSources = this.mTextureAtlasSources; - for(int i = textureSources.size() - 1; i >= 0; i--) { + for (int i = textureSources.size() - 1; i >= 0; i--) { final T textureSource = textureSources.get(i); - if(textureSource == pTextureAtlasSource && textureSource.getTextureX() == pTextureX && textureSource.getTextureY() == pTextureY) { + if (textureSource == pTextureAtlasSource && textureSource.getTextureX() == pTextureX && textureSource.getTextureY() == pTextureY) { textureSources.remove(i); this.mUpdateOnHardwareNeeded = true; return; @@ -160,11 +160,11 @@ public void clearTextureAtlasSources() { // =========================================================== private void checkTextureAtlasSourcePosition(final T pTextureAtlasSource, final int pTextureX, final int pTextureY) throws IllegalArgumentException { - if(pTextureX < 0) { + if (pTextureX < 0) { throw new IllegalArgumentException("Illegal negative pTextureX supplied: '" + pTextureX + "'"); - } else if(pTextureY < 0) { + } else if (pTextureY < 0) { throw new IllegalArgumentException("Illegal negative pTextureY supplied: '" + pTextureY + "'"); - } else if(pTextureX + pTextureAtlasSource.getTextureWidth() > this.getWidth() || pTextureY + pTextureAtlasSource.getTextureHeight() > this.getHeight()) { + } else if (pTextureX + pTextureAtlasSource.getTextureWidth() > this.getWidth() || pTextureY + pTextureAtlasSource.getTextureHeight() > this.getHeight()) { throw new IllegalArgumentException("Supplied pTextureAtlasSource must not exceed bounds of Texture."); } } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java index 313cdd307..790b32b1b 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java @@ -148,38 +148,38 @@ protected void writeTextureToHardware(final GLState pGLState) { final int textureSourceCount = textureSources.size(); final ITextureAtlasStateListener textureStateListener = this.getTextureAtlasStateListener(); - for(int i = 0; i < textureSourceCount; i++) { + for (int i = 0; i < textureSourceCount; i++) { final IBitmapTextureAtlasSource bitmapTextureAtlasSource = textureSources.get(i); try { final Bitmap bitmap = bitmapTextureAtlasSource.onLoadBitmap(bitmapConfig); - if(bitmap == null) { + if (bitmap == null) { throw new NullBitmapException("Caused by: " + bitmapTextureAtlasSource.getClass().toString() + " --> " + bitmapTextureAtlasSource.toString() + " returned a null Bitmap."); } final boolean useDefaultAlignment = MathUtils.isPowerOfTwo(bitmap.getWidth()) && MathUtils.isPowerOfTwo(bitmap.getHeight()) && pixelFormat == PixelFormat.RGBA_8888; - if(!useDefaultAlignment) { + if (!useDefaultAlignment) { /* Adjust unpack alignment. */ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1); } - if(preMultipyAlpha) { + if (preMultipyAlpha) { GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, bitmapTextureAtlasSource.getTextureX(), bitmapTextureAtlasSource.getTextureY(), bitmap, glFormat, glType); } else { pGLState.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, bitmapTextureAtlasSource.getTextureX(), bitmapTextureAtlasSource.getTextureY(), bitmap, this.mPixelFormat); } - if(!useDefaultAlignment) { + if (!useDefaultAlignment) { /* Restore default unpack alignment. */ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, GLState.GL_UNPACK_ALIGNMENT_DEFAULT); } bitmap.recycle(); - if(textureStateListener != null) { + if (textureStateListener != null) { textureStateListener.onTextureAtlasSourceLoaded(this, bitmapTextureAtlasSource); } } catch (final NullBitmapException e) { - if(textureStateListener != null) { + if (textureStateListener != null) { textureStateListener.onTextureAtlasSourceLoadExeption(this, bitmapTextureAtlasSource, e); } else { throw e; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java index 821542ebd..eb1865817 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java @@ -47,7 +47,7 @@ public class BitmapTextureAtlasTextureRegionFactory { * @param pAssetBasePath must end with '/' or have .length() == 0. */ public static void setAssetBasePath(final String pAssetBasePath) { - if(pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { + if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { BitmapTextureAtlasTextureRegionFactory.sAssetBasePath = pAssetBasePath; } else { throw new IllegalArgumentException("pAssetBasePath must end with '/' or be lenght zero."); diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java index 5a63ce903..9b662face 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java @@ -62,7 +62,7 @@ public PictureBitmapTextureAtlasSource(final Picture pPicture, final int pTextur @Override public Bitmap onLoadBitmap(final Config pBitmapConfig) { final Picture picture = this.mPicture; - if(picture == null) { + if (picture == null) { Debug.e("Failed loading Bitmap in " + this.getClass().getSimpleName() + "."); return null; } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java index ae5577132..cb6dadf15 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java @@ -102,7 +102,7 @@ public Bitmap onLoadBitmap(final Config pBitmapConfig) { // =========================================================== private Bitmap ensureLoadedBitmapIsMutable(final Bitmap pBitmap) { - if(pBitmap.isMutable()) { + if (pBitmap.isMutable()) { return pBitmap; } else { final Bitmap mutableBitmap = pBitmap.copy(pBitmap.getConfig(), true); diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java index 5fa008c21..c71884387 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java @@ -45,7 +45,7 @@ public BaseShapeBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSourc // =========================================================== @Override - protected void onDecorateBitmap(final Canvas pCanvas){ + protected void onDecorateBitmap(final Canvas pCanvas) { this.mBitmapTextureAtlasSourceDecoratorShape.onDecorateBitmap(pCanvas, this.mPaint, (this.mTextureAtlasSourceDecoratorOptions == null) ? TextureAtlasSourceDecoratorOptions.DEFAULT : this.mTextureAtlasSourceDecoratorOptions); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java index 04369da2a..fc1a1f85d 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java @@ -62,7 +62,7 @@ public RadialGradientFillBitmapTextureAtlasSourceDecorator(final IBitmapTextureA final float radius = Math.max(centerX, centerY); - switch(pRadialGradientDirection) { + switch (pRadialGradientDirection) { case INSIDE_OUT: this.mPaint.setShader(new RadialGradient(centerX, centerY, radius, pColors, pPositions, TileMode.CLAMP)); break; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java index 404d0edb5..4d4171b5d 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java @@ -50,7 +50,7 @@ public ArcBitmapTextureAtlasSourceDecoratorShape(final float pStartAngle, final @Deprecated public static ArcBitmapTextureAtlasSourceDecoratorShape getDefaultInstance() { - if(sDefaultInstance == null) { + if (sDefaultInstance == null) { sDefaultInstance = new ArcBitmapTextureAtlasSourceDecoratorShape(); } return sDefaultInstance; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java index 5d4170fc8..85823397e 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java @@ -32,7 +32,7 @@ public CircleBitmapTextureAtlasSourceDecoratorShape() { } public static CircleBitmapTextureAtlasSourceDecoratorShape getDefaultInstance() { - if(sDefaultInstance == null) { + if (sDefaultInstance == null) { sDefaultInstance = new CircleBitmapTextureAtlasSourceDecoratorShape(); } return sDefaultInstance; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java index a8fdca1b7..2e43b1450 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java @@ -35,7 +35,7 @@ public EllipseBitmapTextureAtlasSourceDecoratorShape() { } public static EllipseBitmapTextureAtlasSourceDecoratorShape getDefaultInstance() { - if(sDefaultInstance == null) { + if (sDefaultInstance == null) { sDefaultInstance = new EllipseBitmapTextureAtlasSourceDecoratorShape(); } return sDefaultInstance; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java index 0a2b58507..a78becc84 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RectangleBitmapTextureAtlasSourceDecoratorShape.java @@ -25,7 +25,7 @@ public RectangleBitmapTextureAtlasSourceDecoratorShape() { } public static RectangleBitmapTextureAtlasSourceDecoratorShape getDefaultInstance() { - if(sDefaultInstance == null) { + if (sDefaultInstance == null) { sDefaultInstance = new RectangleBitmapTextureAtlasSourceDecoratorShape(); } return sDefaultInstance; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java index 24134ffe5..685eecf22 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java @@ -45,7 +45,7 @@ public RoundedRectangleBitmapTextureAtlasSourceDecoratorShape(final float pCorne } public static RoundedRectangleBitmapTextureAtlasSourceDecoratorShape getDefaultInstance() { - if(sDefaultInstance == null) { + if (sDefaultInstance == null) { sDefaultInstance = new RoundedRectangleBitmapTextureAtlasSourceDecoratorShape(); } return sDefaultInstance; diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java index 44b70c771..7f26b1fca 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java @@ -221,9 +221,9 @@ public void addTextureAtlasSource(final S pTextureAtlasSource, final Callback @Override public void removeTextureAtlasSource(final ITextureAtlasSource pTextureAtlasSource) { final ArrayList> textureSources = this.mTextureAtlasSourcesToPlace; - for(int i = textureSources.size() - 1; i >= 0; i--) { + for (int i = textureSources.size() - 1; i >= 0; i--) { final TextureAtlasSourceWithWithLocationCallback textureSource = textureSources.get(i); - if(textureSource.mTextureAtlasSource == pTextureAtlasSource) { + if (textureSource.mTextureAtlasSource == pTextureAtlasSource) { textureSources.remove(i); this.mTextureAtlas.setUpdateOnHardwareNeeded(true); return; diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java index 83207935f..9410f7824 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java @@ -67,8 +67,8 @@ public void onCallback(final T pCallbackValue) { final int tileWidth = pTextureAtlasSource.getTextureWidth() / pTileColumns; final int tileHeight = pTextureAtlasSource.getTextureHeight() / pTileRows; - for(int tileColumn = 0; tileColumn < pTileColumns; tileColumn++) { - for(int tileRow = 0; tileRow < pTileRows; tileRow++) { + for (int tileColumn = 0; tileColumn < pTileColumns; tileColumn++) { + for (int tileRow = 0; tileRow < pTileRows; tileRow++) { final int tileIndex = tileRow * pTileColumns + tileColumn; final int x = pCallbackValue.getTextureX() + tileColumn * tileWidth; diff --git a/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java b/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java index 8d4df2fd8..8717a982e 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java @@ -26,7 +26,7 @@ public class BlackPawnTextureAtlasBuilder pTextureAtlasSourceWithWithLocationCallbackA, final TextureAtlasSourceWithWithLocationCallback pTextureAtlasSourceWithWithLocationCallbackB) { final int deltaWidth = pTextureAtlasSourceWithWithLocationCallbackB.getTextureAtlasSource().getTextureWidth() - pTextureAtlasSourceWithWithLocationCallbackA.getTextureAtlasSource().getTextureWidth(); - if(deltaWidth != 0) { + if (deltaWidth != 0) { return deltaWidth; } else { return pTextureAtlasSourceWithWithLocationCallbackB.getTextureAtlasSource().getTextureHeight() - pTextureAtlasSourceWithWithLocationCallbackA.getTextureAtlasSource().getTextureHeight(); @@ -77,19 +77,19 @@ public void build(final A pTextureAtlas, final ArrayList textureSourceWithLocationCallback = pTextureAtlasSourcesWithLocationCallback.get(i); final T textureAtlasSource = textureSourceWithLocationCallback.getTextureAtlasSource(); final Node inserted = root.insert(textureAtlasSource, rootWidth, rootHeight, this.mTextureAtlasSourceSpacing, this.mTextureAtlasSourcePadding); - if(inserted == null) { + if (inserted == null) { throw new TextureAtlasBuilderException("Could not build: '" + textureAtlasSource.toString() + "' into: '" + pTextureAtlas.getClass().getSimpleName() + "'."); } final int textureAtlasSourceLeft = inserted.mRect.mLeft + this.mTextureAtlasBorderSpacing + this.mTextureAtlasSourcePadding; final int textureAtlasSourceTop = inserted.mRect.mTop + this.mTextureAtlasBorderSpacing + this.mTextureAtlasSourcePadding; - if(this.mTextureAtlasSourcePadding == 0) { + if (this.mTextureAtlasSourcePadding == 0) { pTextureAtlas.addTextureAtlasSource(textureAtlasSource, textureAtlasSourceLeft, textureAtlasSourceTop); } else { pTextureAtlas.addTextureAtlasSource(textureAtlasSource, textureAtlasSourceLeft, textureAtlasSourceTop, this.mTextureAtlasSourcePadding); @@ -229,15 +229,15 @@ public Node getChildB() { // =========================================================== public Node insert(final ITextureAtlasSource pTextureAtlasSource, final int pTextureWidth, final int pTextureHeight, final int pTextureAtlasSourceSpacing, final int pTextureAtlasSourcePadding) throws IllegalArgumentException { - if(this.mChildA != null && this.mChildB != null) { + if (this.mChildA != null && this.mChildB != null) { final Node newNode = this.mChildA.insert(pTextureAtlasSource, pTextureWidth, pTextureHeight, pTextureAtlasSourceSpacing, pTextureAtlasSourcePadding); - if(newNode != null){ + if (newNode != null) { return newNode; } else { return this.mChildB.insert(pTextureAtlasSource, pTextureWidth, pTextureHeight, pTextureAtlasSourceSpacing, pTextureAtlasSourcePadding); } } else { - if(this.mTextureAtlasSource != null) { + if (this.mTextureAtlasSource != null) { return null; } @@ -247,7 +247,7 @@ public Node insert(final ITextureAtlasSource pTextureAtlasSource, final int pTex final int rectWidth = this.mRect.getWidth(); final int rectHeight = this.mRect.getHeight(); - if(textureSourceWidth > rectWidth || textureSourceHeight > rectHeight) { + if (textureSourceWidth > rectWidth || textureSourceHeight > rectHeight) { return null; } @@ -260,40 +260,40 @@ public Node insert(final ITextureAtlasSource pTextureAtlasSource, final int pTex final boolean fitToBottomWithoutSpacing = textureSourceHeight == rectHeight && rectTop + textureSourceHeight == pTextureHeight; final boolean fitToRightWithoutSpacing = textureSourceWidth == rectWidth && rectLeft + textureSourceWidth == pTextureWidth; - if(textureSourceWidthWithSpacing == rectWidth){ - if(textureSourceHeightWithSpacing == rectHeight) { /* Normal case with padding. */ + if (textureSourceWidthWithSpacing == rectWidth) { + if (textureSourceHeightWithSpacing == rectHeight) { /* Normal case with padding. */ this.mTextureAtlasSource = pTextureAtlasSource; return this; - } else if(fitToBottomWithoutSpacing) { /* Bottom edge of the BitmapTexture. */ + } else if (fitToBottomWithoutSpacing) { /* Bottom edge of the BitmapTexture. */ this.mTextureAtlasSource = pTextureAtlasSource; return this; } } - if(fitToRightWithoutSpacing) { /* Right edge of the BitmapTexture. */ - if(textureSourceHeightWithSpacing == rectHeight) { + if (fitToRightWithoutSpacing) { /* Right edge of the BitmapTexture. */ + if (textureSourceHeightWithSpacing == rectHeight) { this.mTextureAtlasSource = pTextureAtlasSource; return this; - } else if(fitToBottomWithoutSpacing) { /* Bottom edge of the BitmapTexture. */ + } else if (fitToBottomWithoutSpacing) { /* Bottom edge of the BitmapTexture. */ this.mTextureAtlasSource = pTextureAtlasSource; return this; - } else if(textureSourceHeightWithSpacing > rectHeight) { + } else if (textureSourceHeightWithSpacing > rectHeight) { return null; } else { return this.createChildren(pTextureAtlasSource, pTextureWidth, pTextureHeight, pTextureAtlasSourceSpacing, pTextureAtlasSourcePadding, rectWidth - textureSourceWidth, rectHeight - textureSourceHeightWithSpacing); } } - if(fitToBottomWithoutSpacing) { - if(textureSourceWidthWithSpacing == rectWidth) { + if (fitToBottomWithoutSpacing) { + if (textureSourceWidthWithSpacing == rectWidth) { this.mTextureAtlasSource = pTextureAtlasSource; return this; - } else if(textureSourceWidthWithSpacing > rectWidth) { + } else if (textureSourceWidthWithSpacing > rectWidth) { return null; } else { return this.createChildren(pTextureAtlasSource, pTextureWidth, pTextureHeight, pTextureAtlasSourceSpacing, pTextureAtlasSourcePadding, rectWidth - textureSourceWidthWithSpacing, rectHeight - textureSourceHeight); } - } else if(textureSourceWidthWithSpacing > rectWidth || textureSourceHeightWithSpacing > rectHeight) { + } else if (textureSourceWidthWithSpacing > rectWidth || textureSourceHeightWithSpacing > rectHeight) { return null; } else { return this.createChildren(pTextureAtlasSource, pTextureWidth, pTextureHeight, pTextureAtlasSourceSpacing, pTextureAtlasSourcePadding, rectWidth - textureSourceWidthWithSpacing, rectHeight - textureSourceHeightWithSpacing); @@ -304,7 +304,7 @@ public Node insert(final ITextureAtlasSource pTextureAtlasSource, final int pTex private Node createChildren(final ITextureAtlasSource pTextureAtlasSource, final int pTextureWidth, final int pTextureHeight, final int pTextureAtlasSourceSpacing, final int pTextureAtlasSourcePadding, final int pDeltaWidth, final int pDeltaHeight) { final Rect rect = this.mRect; - if(pDeltaWidth >= pDeltaHeight) { + if (pDeltaWidth >= pDeltaHeight) { /* Split using a vertical axis. */ this.mChildA = new Node( rect.getLeft(), diff --git a/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java b/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java index 86f935e13..0e01ca29f 100644 --- a/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java +++ b/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java @@ -103,24 +103,24 @@ protected void writeTextureToHardware(final GLState pGLState) throws IOException final Config bitmapConfig = this.mBitmapTextureFormat.getBitmapConfig(); final Bitmap bitmap = this.onGetBitmap(bitmapConfig); - if(bitmap == null) { + if (bitmap == null) { throw new NullBitmapException("Caused by: '" + this.toString() + "'."); } final boolean useDefaultAlignment = MathUtils.isPowerOfTwo(bitmap.getWidth()) && MathUtils.isPowerOfTwo(bitmap.getHeight()) && (this.mPixelFormat == PixelFormat.RGBA_8888); - if(!useDefaultAlignment) { + if (!useDefaultAlignment) { /* Adjust unpack alignment. */ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1); } final boolean preMultipyAlpha = this.mTextureOptions.mPreMultiplyAlpha; - if(preMultipyAlpha) { + if (preMultipyAlpha) { GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); } else { pGLState.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0, this.mPixelFormat); } - if(!useDefaultAlignment) { + if (!useDefaultAlignment) { /* Restore default unpack alignment. */ GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, GLState.GL_UNPACK_ALIGNMENT_DEFAULT); } diff --git a/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java b/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java index 49ad3d4ab..4b4e50450 100644 --- a/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java +++ b/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java @@ -41,7 +41,7 @@ private BitmapTextureFormat(final Config pBitmapConfig, final PixelFormat pPixel } public static BitmapTextureFormat fromPixelFormat(final PixelFormat pPixelFormat) { - switch(pPixelFormat) { + switch (pPixelFormat) { case RGBA_8888: return RGBA_8888; case RGBA_4444: diff --git a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java index b4beb5c03..a40d7cce2 100644 --- a/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java +++ b/src/org/andengine/opengl/texture/compressed/etc1/ETC1Texture.java @@ -21,7 +21,7 @@ import android.opengl.GLES20; /** - * TODO if(!SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.FROYO)) --> Meaningful Exception! + * TODO if (!SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.FROYO)) --> Meaningful Exception! * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -65,8 +65,8 @@ public ETC1Texture(final TextureManager pTextureManager, final TextureOptions pT this.mETC1TextureHeader = new ETC1TextureHeader(StreamUtils.streamToBytes(inputStream, ETC1.ETC_PKM_HEADER_SIZE)); - if(BuildConfig.DEBUG) { - if(!(MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mWidth) && MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mHeight))) { + if (BuildConfig.DEBUG) { + if (!(MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mWidth) && MathUtils.isPowerOfTwo(this.mETC1TextureHeader.mHeight))) { Debug.w("ETC1 textures with NPOT sizes can cause a crash on PowerVR GPUs!"); } } @@ -128,7 +128,7 @@ public static class ETC1TextureHeader { // =========================================================== public ETC1TextureHeader(final byte[] pData) { - if(pData.length != ETC1.ETC_PKM_HEADER_SIZE) { + if (pData.length != ETC1.ETC_PKM_HEADER_SIZE) { throw new IllegalArgumentException("Invalid " + this.getClass().getSimpleName() + "!"); } diff --git a/src/org/andengine/opengl/texture/compressed/pvr/PVRCCZTexture.java b/src/org/andengine/opengl/texture/compressed/pvr/PVRCCZTexture.java index bb91df0de..b9ddaaaaf 100644 --- a/src/org/andengine/opengl/texture/compressed/pvr/PVRCCZTexture.java +++ b/src/org/andengine/opengl/texture/compressed/pvr/PVRCCZTexture.java @@ -137,7 +137,7 @@ public CCZHeader(final byte[] pData) { this.mDataByteBuffer.order(ByteOrder.BIG_ENDIAN); /* Check magic bytes. */ - if(!ArrayUtils.equals(pData, 0, CCZHeader.MAGIC_IDENTIFIER, 0, CCZHeader.MAGIC_IDENTIFIER.length)) { + if (!ArrayUtils.equals(pData, 0, CCZHeader.MAGIC_IDENTIFIER, 0, CCZHeader.MAGIC_IDENTIFIER.length)) { throw new IllegalArgumentException("Invalid " + this.getClass().getSimpleName() + "!"); } @@ -212,7 +212,7 @@ private CCZCompressionFormat(final short pID) { } public InflaterInputStream wrap(final InputStream pInputStream) throws IOException { - switch(this) { + switch (this) { case GZIP: return new GZIPInputStream(pInputStream); case ZLIB: @@ -227,9 +227,9 @@ public InflaterInputStream wrap(final InputStream pInputStream) throws IOExcepti public static CCZCompressionFormat fromID(final short pID) { final CCZCompressionFormat[] cczCompressionFormats = CCZCompressionFormat.values(); final int cczCompressionFormatCount = cczCompressionFormats.length; - for(int i = 0; i < cczCompressionFormatCount; i++) { + for (int i = 0; i < cczCompressionFormatCount; i++) { final CCZCompressionFormat cczCompressionFormat = cczCompressionFormats[i]; - if(cczCompressionFormat.mID == pID) { + if (cczCompressionFormat.mID == pID) { return cczCompressionFormat; } } diff --git a/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java b/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java index d37274ee5..1b597858a 100644 --- a/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java +++ b/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java @@ -97,23 +97,23 @@ public PVRTexture(final TextureManager pTextureManager, final PVRTextureFormat p StreamUtils.close(inputStream); } - if(this.mPVRTextureHeader.getPVRTextureFormat().getPixelFormat() != pPVRTextureFormat.getPixelFormat()) { + if (this.mPVRTextureHeader.getPVRTextureFormat().getPixelFormat() != pPVRTextureFormat.getPixelFormat()) { throw new IllegalArgumentException("Other PVRTextureFormat: '" + this.mPVRTextureHeader.getPVRTextureFormat().getPixelFormat() + "' found than expected: '" + pPVRTextureFormat.getPixelFormat() + "'."); } - if(this.mPVRTextureHeader.getPVRTextureFormat().isCompressed()) { // TODO && ! GLHELPER_EXTENSION_PVRTC] ) { + if (this.mPVRTextureHeader.getPVRTextureFormat().isCompressed()) { // TODO && ! GLHELPER_EXTENSION_PVRTC] ) { throw new IllegalArgumentException("Invalid PVRTextureFormat: '" + this.mPVRTextureHeader.getPVRTextureFormat() + "'."); } - if(this.hasMipMaps()) { - switch(pTextureOptions.mMinFilter){ + if (this.hasMipMaps()) { + switch (pTextureOptions.mMinFilter) { case GLES20.GL_NEAREST_MIPMAP_NEAREST: case GLES20.GL_NEAREST_MIPMAP_LINEAR: case GLES20.GL_LINEAR_MIPMAP_NEAREST: case GLES20.GL_LINEAR_MIPMAP_LINEAR: break; default: - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.w("This '" + this.getClass().getSimpleName() + "' contains mipmaps, but the provided '" + pTextureOptions.getClass().getSimpleName() + "' don't have MipMaps enabled on the MinFilter!"); } } @@ -244,7 +244,7 @@ public PVRTextureHeader(final byte[] pData) { this.mDataByteBuffer.order(ByteOrder.LITTLE_ENDIAN); /* Check magic bytes. */ - if(!ArrayUtils.equals(pData, 11 * DataConstants.BYTES_PER_INT, PVRTextureHeader.MAGIC_IDENTIFIER, 0, PVRTextureHeader.MAGIC_IDENTIFIER.length)) { + if (!ArrayUtils.equals(pData, 11 * DataConstants.BYTES_PER_INT, PVRTextureHeader.MAGIC_IDENTIFIER, 0, PVRTextureHeader.MAGIC_IDENTIFIER.length)) { throw new IllegalArgumentException("Invalid " + this.getClass().getSimpleName() + "!"); } @@ -371,9 +371,9 @@ private PVRTextureFormat(final int pID, final boolean pCompressed, final PixelFo public static PVRTextureFormat fromID(final int pID) { final PVRTextureFormat[] pvrTextureFormats = PVRTextureFormat.values(); final int pvrTextureFormatCount = pvrTextureFormats.length; - for(int i = 0; i < pvrTextureFormatCount; i++) { + for (int i = 0; i < pvrTextureFormatCount; i++) { final PVRTextureFormat pvrTextureFormat = pvrTextureFormats[i]; - if(pvrTextureFormat.mID == pID) { + if (pvrTextureFormat.mID == pID) { return pvrTextureFormat; } } @@ -381,7 +381,7 @@ public static PVRTextureFormat fromID(final int pID) { } public static PVRTextureFormat fromPixelFormat(final PixelFormat pPixelFormat) throws IllegalArgumentException { - switch(pPixelFormat) { + switch (pPixelFormat) { case RGBA_8888: return PVRTextureFormat.RGBA_8888; case RGBA_4444: diff --git a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java index bb3b1989d..5ad368ef0 100644 --- a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java +++ b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java @@ -120,23 +120,23 @@ public SmartPVRTexturePixelBufferStrategyBufferManager(final PVRTexture pPVRText @Override public ByteBuffer getPixelBuffer(final int pStart, final int pByteCount) throws IOException { - if(pStart < this.mInputStreamPosition) { + if (pStart < this.mInputStreamPosition) { throw new AndEngineRuntimeException("Cannot read data that has been read already. (pStart: '" + pStart + "', this.mInputStreamPosition: '" + this.mInputStreamPosition + "')"); } /* Ensure data buffer is bug enough. */ - if(this.mData == null || this.mData.length < pByteCount) { + if (this.mData == null || this.mData.length < pByteCount) { this.mData = new byte[pByteCount]; } /* If needed, skip bytes up to where the data was requested. */ - if(this.mInputStreamPosition < pStart) { + if (this.mInputStreamPosition < pStart) { final int bytesToSkip = pStart - this.mInputStreamPosition; final long skipped = this.mInputStream.skip(bytesToSkip); this.mInputStreamPosition += skipped; - if(bytesToSkip != skipped) { + if (bytesToSkip != skipped) { throw new AndEngineRuntimeException("Skipped: '" + skipped + "' instead of '" + bytesToSkip + "'."); } } diff --git a/src/org/andengine/opengl/texture/region/TextureRegion.java b/src/org/andengine/opengl/texture/region/TextureRegion.java index 3df2033a7..c3f71a5be 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegion.java +++ b/src/org/andengine/opengl/texture/region/TextureRegion.java @@ -56,7 +56,7 @@ public TextureRegion(final ITexture pTexture, final float pTextureX, final float this.mTextureY = pTextureY; this.mRotated = pRotated; - if(this.mRotated) { + if (this.mRotated) { this.mTextureWidth = pTextureHeight; this.mTextureHeight = pTextureWidth; } else { @@ -71,7 +71,7 @@ public TextureRegion(final ITexture pTexture, final float pTextureX, final float @Override public TextureRegion deepCopy() { - if(this.mRotated) { + if (this.mRotated) { return new TextureRegion(this.mTexture, this.mTextureX, this.mTextureY, this.mTextureHeight, this.mTextureWidth, this.mScale, this.mRotated); } else { return new TextureRegion(this.mTexture, this.mTextureX, this.mTextureY, this.mTextureWidth, this.mTextureHeight, this.mScale, this.mRotated); @@ -116,7 +116,7 @@ public void setTexturePosition(final float pTextureX, final float pTextureY) { @Override public float getWidth() { - if(this.mRotated) { + if (this.mRotated) { return this.mTextureHeight * this.mScale; } else { return this.mTextureWidth * this.mScale; @@ -125,7 +125,7 @@ public float getWidth() { @Override public float getHeight() { - if(this.mRotated) { + if (this.mRotated) { return this.mTextureWidth * this.mScale; } else { return this.mTextureHeight * this.mScale; diff --git a/src/org/andengine/opengl/texture/region/TiledTextureRegion.java b/src/org/andengine/opengl/texture/region/TiledTextureRegion.java index bb0d05e76..3f55b35f8 100644 --- a/src/org/andengine/opengl/texture/region/TiledTextureRegion.java +++ b/src/org/andengine/opengl/texture/region/TiledTextureRegion.java @@ -42,9 +42,9 @@ public TiledTextureRegion(final ITexture pTexture, final boolean pPerformSameTex this.mTextureRegions = pTextureRegions; this.mTileCount = this.mTextureRegions.length; - if(pPerformSameTextureSanityCheck) { - for(int i = this.mTileCount - 1; i >= 0; i--) { - if(pTextureRegions[i].getTexture() != pTexture) { + if (pPerformSameTextureSanityCheck) { + for (int i = this.mTileCount - 1; i >= 0; i--) { + if (pTextureRegions[i].getTexture() != pTexture) { throw new IllegalArgumentException("The " + ITextureRegion.class.getSimpleName() + ": '" + pTextureRegions[i].toString() + "' at index: '" + i + "' is not on the same " + ITexture.class.getSimpleName() + ": '" + pTextureRegions[i].getTexture().toString() + "' as the supplied " + ITexture.class.getSimpleName() + ": '" + pTexture.toString() + "'."); } } @@ -61,8 +61,8 @@ public static TiledTextureRegion create(final ITexture pTexture, final int pText final int tileWidth = pTextureWidth / pTileColumns; final int tileHeight = pTextureHeight / pTileRows; - for(int tileColumn = 0; tileColumn < pTileColumns; tileColumn++) { - for(int tileRow = 0; tileRow < pTileRows; tileRow++) { + for (int tileColumn = 0; tileColumn < pTileColumns; tileColumn++) { + for (int tileRow = 0; tileRow < pTileRows; tileRow++) { final int tileIndex = tileRow * pTileColumns + tileColumn; final int x = pTextureX + tileColumn * tileWidth; @@ -80,7 +80,7 @@ public TiledTextureRegion deepCopy() { final ITextureRegion[] textureRegions = new ITextureRegion[tileCount]; - for(int i = 0; i < tileCount; i++) { + for (int i = 0; i < tileCount; i++) { textureRegions[i] = this.mTextureRegions[i].deepCopy(); } @@ -104,7 +104,7 @@ public void setCurrentTileIndex(final int pCurrentTileIndex) { @Override public void nextTile() { this.mCurrentTileIndex++; - if(this.mCurrentTileIndex >= this.mTileCount) { + if (this.mCurrentTileIndex >= this.mTileCount) { this.mCurrentTileIndex = this.mCurrentTileIndex % this.mTileCount; } } diff --git a/src/org/andengine/opengl/texture/render/RenderTexture.java b/src/org/andengine/opengl/texture/render/RenderTexture.java index e83a21f73..43f81da71 100644 --- a/src/org/andengine/opengl/texture/render/RenderTexture.java +++ b/src/org/andengine/opengl/texture/render/RenderTexture.java @@ -235,14 +235,14 @@ public void begin(final GLState pGLState, final boolean pFlipX, final boolean pF final float right; final float bottom; final float top; - if(pFlipX) { + if (pFlipX) { left = this.mWidth; right = 0; } else { left = 0; right = this.mWidth; } - if(pFlipY) { + if (pFlipY) { top = 0; bottom = this.mHeight; } else { @@ -297,9 +297,9 @@ public void end(final GLState pGLState) { * {@link RenderTexture#begin(GLState, boolean, boolean, float, float, float, float)}. */ public void end(final GLState pGLState, final boolean pFlush, final boolean pFinish) { - if(pFinish) { + if (pFinish) { this.finish(pGLState); - } else if(pFlush) { + } else if (pFlush) { this.flush(pGLState); } @@ -362,7 +362,7 @@ public Bitmap getBitmap(final GLState pGLState) { } public Bitmap getBitmap(final GLState pGLState, final int pX, final int pY, final int pWidth, final int pHeight) { - if(this.mPixelFormat != PixelFormat.RGBA_8888) { + if (this.mPixelFormat != PixelFormat.RGBA_8888) { throw new IllegalStateException("Currently only 'PixelFormat." + PixelFormat.RGBA_8888 + "' is supported to be retrieved as a Bitmap."); } diff --git a/src/org/andengine/opengl/util/BufferUtils.java b/src/org/andengine/opengl/util/BufferUtils.java index 9fa34cc39..c506b9e0f 100644 --- a/src/org/andengine/opengl/util/BufferUtils.java +++ b/src/org/andengine/opengl/util/BufferUtils.java @@ -37,21 +37,21 @@ public class BufferUtils { } NATIVE_LIB_LOADED = loadLibrarySuccess; - if(BufferUtils.NATIVE_LIB_LOADED) { - if(SystemUtils.isAndroidVersion(Build.VERSION_CODES.HONEYCOMB, Build.VERSION_CODES.HONEYCOMB_MR2)) { + if (BufferUtils.NATIVE_LIB_LOADED) { + if (SystemUtils.isAndroidVersion(Build.VERSION_CODES.HONEYCOMB, Build.VERSION_CODES.HONEYCOMB_MR2)) { WORKAROUND_BYTEBUFFER_ALLOCATE_DIRECT = true; } else { WORKAROUND_BYTEBUFFER_ALLOCATE_DIRECT = false; } - if(SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO)) { + if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO)) { WORKAROUND_BYTEBUFFER_PUT_FLOATARRAY = true; } else { WORKAROUND_BYTEBUFFER_PUT_FLOATARRAY = false; } } else { WORKAROUND_BYTEBUFFER_ALLOCATE_DIRECT = false; - if(SystemUtils.isAndroidVersion(Build.VERSION_CODES.HONEYCOMB, Build.VERSION_CODES.HONEYCOMB_MR2)) { + if (SystemUtils.isAndroidVersion(Build.VERSION_CODES.HONEYCOMB, Build.VERSION_CODES.HONEYCOMB_MR2)) { Debug.w("Creating a " + ByteBuffer.class.getSimpleName() + " will actually allocate 4x the memory than requested!"); } @@ -84,7 +84,7 @@ public class BufferUtils { * @return */ public static ByteBuffer allocateDirectByteBuffer(final int pCapacity) { - if(BufferUtils.WORKAROUND_BYTEBUFFER_ALLOCATE_DIRECT) { + if (BufferUtils.WORKAROUND_BYTEBUFFER_ALLOCATE_DIRECT) { return BufferUtils.jniAllocateDirect(pCapacity); } else { return ByteBuffer.allocateDirect(pCapacity); @@ -92,7 +92,7 @@ public static ByteBuffer allocateDirectByteBuffer(final int pCapacity) { } public static void freeDirectByteBuffer(final ByteBuffer pByteBuffer) { - if(BufferUtils.WORKAROUND_BYTEBUFFER_ALLOCATE_DIRECT) { + if (BufferUtils.WORKAROUND_BYTEBUFFER_ALLOCATE_DIRECT) { BufferUtils.jniFreeDirect(pByteBuffer); } } @@ -107,10 +107,10 @@ public static void freeDirectByteBuffer(final ByteBuffer pByteBuffer) { * @param pOffset in pSource. */ public static void put(final ByteBuffer pByteBuffer, final float[] pSource, final int pLength, final int pOffset) { - if(BufferUtils.WORKAROUND_BYTEBUFFER_PUT_FLOATARRAY) { + if (BufferUtils.WORKAROUND_BYTEBUFFER_PUT_FLOATARRAY) { BufferUtils.jniPut(pByteBuffer, pSource, pLength, pOffset); } else { - for(int i = pOffset; i < (pOffset + pLength); i++) { + for (int i = pOffset; i < (pOffset + pLength); i++) { pByteBuffer.putFloat(pSource[i]); } } diff --git a/src/org/andengine/opengl/util/GLHelper.java b/src/org/andengine/opengl/util/GLHelper.java index 4f5c971e2..e58398da6 100644 --- a/src/org/andengine/opengl/util/GLHelper.java +++ b/src/org/andengine/opengl/util/GLHelper.java @@ -40,7 +40,7 @@ public static Buffer getPixels(final Bitmap pBitmap, final PixelFormat pPixelFor public static Buffer getPixels(final Bitmap pBitmap, final PixelFormat pPixelFormat, final ByteOrder pByteOrder) { final int[] pixelsARGB_8888 = GLHelper.getPixelsARGB_8888(pBitmap); - switch(pPixelFormat) { + switch (pPixelFormat) { case RGB_565: return ShortBuffer.wrap(GLHelper.convertARGB_8888toRGB_565(pixelsARGB_8888, pByteOrder)); // TODO Is ShortBuffer or IntBuffer faster? case RGBA_8888: @@ -61,8 +61,8 @@ public static int[] convertARGB_8888toRGBA_8888(final int[] pPixelsARGB_8888) { } public static int[] convertARGB_8888toRGBA_8888(final int[] pPixelsARGB_8888, final ByteOrder pByteOrder) { - if(pByteOrder == ByteOrder.LITTLE_ENDIAN) { - for(int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { + if (pByteOrder == ByteOrder.LITTLE_ENDIAN) { + for (int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsARGB_8888[i]; /* [A][R][G][B] to [A][B][G][R] */ @@ -71,7 +71,7 @@ public static int[] convertARGB_8888toRGBA_8888(final int[] pPixelsARGB_8888, fi pPixelsARGB_8888[i] = (pixel & 0xFF00FF00) | ((pixel << 16) & 0x00FF0000) | ((pixel >> 16) & 0x000000FF); } } else { - for(int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { + for (int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsARGB_8888[i]; /* [A][R][G][B] to [R][G][B][A] */ @@ -89,8 +89,8 @@ public static short[] convertARGB_8888toRGB_565(final int[] pPixelsARGB_8888) { public static short[] convertARGB_8888toRGB_565(final int[] pPixelsARGB_8888, final ByteOrder pByteOrder) { final short[] pixelsRGB_565 = new short[pPixelsARGB_8888.length]; - if(pByteOrder == ByteOrder.LITTLE_ENDIAN) { - for(int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { + if (pByteOrder == ByteOrder.LITTLE_ENDIAN) { + for (int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsARGB_8888[i]; /* [A][R][G][B] to [GB][RG] */ @@ -101,7 +101,7 @@ public static short[] convertARGB_8888toRGB_565(final int[] pPixelsARGB_8888, fi pixelsRGB_565[i] = (short)(((pixel >> 16) & 0x00F8) | ((pixel >> 13) & 0x07) | ((pixel << 3) & 0xE000) | ((pixel << 5) & 0x1F00)); } } else { - for(int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { + for (int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsARGB_8888[i]; /* [A][R][G][B] to [RG][GB] */ @@ -121,8 +121,8 @@ public static short[] convertARGB_8888toRGBA_4444(final int[] pPixelsARGB_8888) public static short[] convertARGB_8888toRGBA_4444(final int[] pPixelsARGB_8888, final ByteOrder pByteOrder) { final short[] pixelsRGBA_4444 = new short[pPixelsARGB_8888.length]; - if(pByteOrder == ByteOrder.LITTLE_ENDIAN) { - for(int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { + if (pByteOrder == ByteOrder.LITTLE_ENDIAN) { + for (int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsARGB_8888[i]; /* [A][R][G][B] to [BA][RG] */ @@ -133,7 +133,7 @@ public static short[] convertARGB_8888toRGBA_4444(final int[] pPixelsARGB_8888, pixelsRGBA_4444[i] = (short)(((pixel >> 16) & 0x00F0) | ((pixel >> 12) & 0x000F) | ((pixel << 8) & 0xF000) | ((pixel >> 20) & 0x0F00)); } } else { - for(int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { + for (int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsARGB_8888[i]; /* [A][R][G][B] to [RG][BA] */ @@ -149,7 +149,7 @@ public static short[] convertARGB_8888toRGBA_4444(final int[] pPixelsARGB_8888, public static byte[] convertARGB_8888toA_8(final int[] pPixelsARGB_8888) { final byte[] pixelsA_8 = new byte[pPixelsARGB_8888.length]; - for(int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { + for (int i = pPixelsARGB_8888.length - 1; i >= 0; i--) { /* [A][R][G][B] to [A] */ /* From : [ A7 A6 A5 A4 A3 A2 A1 A0 | R7 R6 R5 R4 R3 R2 R1 R0 | G7 G6 G5 G4 G3 G2 G1 G0 | B7 B6 B5 B4 B3 B2 B1 B0 ] */ /* To : [ A7 A6 A5 A4 A3 A2 A1 A0 ] */ @@ -173,8 +173,8 @@ public static int[] convertRGBA_8888toARGB_8888(final int[] pPixelsRGBA_8888) { } public static int[] convertRGBA_8888toARGB_8888(final int[] pPixelsRGBA_8888, final ByteOrder pByteOrder) { - if(pByteOrder == ByteOrder.LITTLE_ENDIAN) { - for(int i = pPixelsRGBA_8888.length - 1; i >= 0; i--) { + if (pByteOrder == ByteOrder.LITTLE_ENDIAN) { + for (int i = pPixelsRGBA_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsRGBA_8888[i]; /* [A][B][G][R] to [A][R][G][B] */ /* From : [ A7 A6 A5 A4 A3 A2 A1 A0 | B7 B6 B5 B4 B3 B2 B1 B0 | G7 G6 G5 G4 G3 G2 G1 G0 | R7 R6 R5 R4 R3 R2 R1 R0 ] */ @@ -182,7 +182,7 @@ public static int[] convertRGBA_8888toARGB_8888(final int[] pPixelsRGBA_8888, fi pPixelsRGBA_8888[i] = (pixel & 0xFF00FF00) | ((pixel << 16) & 0x00FF0000) | ((pixel >> 16) & 0x000000FF); } } else { - for(int i = pPixelsRGBA_8888.length - 1; i >= 0; i--) { + for (int i = pPixelsRGBA_8888.length - 1; i >= 0; i--) { final int pixel = pPixelsRGBA_8888[i]; /* [R][G][B][A] to [A][R][G][B] */ /* From : [ R7 R6 R5 R4 R3 R2 R1 R0 | G7 G6 G5 G4 G3 G2 G1 G0 | B7 B6 B5 B4 B3 B2 B1 B0 | A7 A6 A5 A4 A3 A2 A1 A0 ] */ @@ -200,9 +200,9 @@ public static int[] convertRGBA_8888toARGB_8888_FlippedVertical(final int[] pPix public static int[] convertRGBA_8888toARGB_8888_FlippedVertical(final int[] pPixelsRGBA_8888, final int pWidth, final int pHeight, final ByteOrder pByteOrder) { final int[] pixelsARGB_8888 = new int[pWidth * pHeight]; - if(pByteOrder == ByteOrder.LITTLE_ENDIAN) { - for(int y = 0; y < pHeight; y++) { - for(int x = 0; x < pWidth; x++) { + if (pByteOrder == ByteOrder.LITTLE_ENDIAN) { + for (int y = 0; y < pHeight; y++) { + for (int x = 0; x < pWidth; x++) { final int pixel = pPixelsRGBA_8888[x + (y * pWidth)]; /* [A][B][G][R] to [A][R][G][B] */ /* From : [ A7 A6 A5 A4 A3 A2 A1 A0 | B7 B6 B5 B4 B3 B2 B1 B0 | G7 G6 G5 G4 G3 G2 G1 G0 | R7 R6 R5 R4 R3 R2 R1 R0 ] */ @@ -211,8 +211,8 @@ public static int[] convertRGBA_8888toARGB_8888_FlippedVertical(final int[] pPix } } } else { - for(int y = 0; y < pHeight; y++) { - for(int x = 0; x < pWidth; x++) { + for (int y = 0; y < pHeight; y++) { + for (int x = 0; x < pWidth; x++) { final int pixel = pPixelsRGBA_8888[x + (y * pWidth)]; /* [R][G][B][A] to [A][R][G][B] */ /* From : [ R7 R6 R5 R4 R3 R2 R1 R0 | G7 G6 G5 G4 G3 G2 G1 G0 | B7 B6 B5 B4 B3 B2 B1 B0 | A7 A6 A5 A4 A3 A2 A1 A0 ] */ diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index 972a70a7e..c0d38e44e 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -130,7 +130,7 @@ public void reset(final RenderOptions pRenderOptions, final ConfigChooser pConfi this.mMaximumTextureUnits = this.getInteger(GLES20.GL_MAX_TEXTURE_IMAGE_UNITS); this.mMaximumTextureSize = this.getInteger(GLES20.GL_MAX_TEXTURE_SIZE); - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d("VERSION: " + this.mVersion); Debug.d("RENDERER: " + this.mRenderer); Debug.d("EGLCONFIG: " + EGLConfig.class.getSimpleName() + "(Red=" + pConfigChooser.getActualRedSize() + ", Green=" + pConfigChooser.getActualGreenSize() + ", Blue=" + pConfigChooser.getActualBlueSize() + ", Alpha=" + pConfigChooser.getActualAlphaSize() + ", Depth=" + pConfigChooser.getActualDepthSize() + ", Stencil=" + pConfigChooser.getActualStencilSize() + ")"); @@ -177,7 +177,7 @@ public boolean isScissorTestEnabled() { * @return the previous state. */ public boolean enableScissorTest() { - if(this.mScissorTestEnabled) { + if (this.mScissorTestEnabled) { return true; } @@ -189,7 +189,7 @@ public boolean enableScissorTest() { * @return the previous state. */ public boolean disableScissorTest() { - if(!this.mScissorTestEnabled) { + if (!this.mScissorTestEnabled) { return false; } @@ -201,7 +201,7 @@ public boolean disableScissorTest() { * @return the previous state. */ public boolean setScissorTestEnabled(final boolean pEnabled) { - if(pEnabled) { + if (pEnabled) { return this.enableScissorTest(); } else { return this.disableScissorTest(); @@ -215,7 +215,7 @@ public boolean isBlendEnabled() { * @return the previous state. */ public boolean enableBlend() { - if(this.mBlendEnabled) { + if (this.mBlendEnabled) { return true; } @@ -227,7 +227,7 @@ public boolean enableBlend() { * @return the previous state. */ public boolean disableBlend() { - if(!this.mBlendEnabled) { + if (!this.mBlendEnabled) { return false; } @@ -239,7 +239,7 @@ public boolean disableBlend() { * @return the previous state. */ public boolean setBlendEnabled(final boolean pEnabled) { - if(pEnabled) { + if (pEnabled) { return this.enableBlend(); } else { return this.disableBlend(); @@ -253,7 +253,7 @@ public boolean isCullingEnabled() { * @return the previous state. */ public boolean enableCulling() { - if(this.mCullingEnabled) { + if (this.mCullingEnabled) { return true; } @@ -265,7 +265,7 @@ public boolean enableCulling() { * @return the previous state. */ public boolean disableCulling() { - if(!this.mCullingEnabled) { + if (!this.mCullingEnabled) { return false; } @@ -277,7 +277,7 @@ public boolean disableCulling() { * @return the previous state. */ public boolean setCullingEnabled(final boolean pEnabled) { - if(pEnabled) { + if (pEnabled) { return this.enableCulling(); } else { return this.disableCulling(); @@ -291,7 +291,7 @@ public boolean isDitherEnabled() { * @return the previous state. */ public boolean enableDither() { - if(this.mDitherEnabled) { + if (this.mDitherEnabled) { return true; } @@ -303,7 +303,7 @@ public boolean enableDither() { * @return the previous state. */ public boolean disableDither() { - if(!this.mDitherEnabled) { + if (!this.mDitherEnabled) { return false; } @@ -315,7 +315,7 @@ public boolean disableDither() { * @return the previous state. */ public boolean setDitherEnabled(final boolean pEnabled) { - if(pEnabled) { + if (pEnabled) { return this.enableDither(); } else { return this.disableDither(); @@ -329,7 +329,7 @@ public boolean isDepthTestEnabled() { * @return the previous state. */ public boolean enableDepthTest() { - if(this.mDepthTestEnabled) { + if (this.mDepthTestEnabled) { return true; } @@ -341,7 +341,7 @@ public boolean enableDepthTest() { * @return the previous state. */ public boolean disableDepthTest() { - if(!this.mDepthTestEnabled) { + if (!this.mDepthTestEnabled) { return false; } @@ -353,7 +353,7 @@ public boolean disableDepthTest() { * @return the previous state. */ public boolean setDepthTestEnabled(final boolean pEnabled) { - if(pEnabled) { + if (pEnabled) { return this.enableDepthTest(); } else { return this.disableDepthTest(); @@ -377,14 +377,14 @@ public int generateArrayBuffer(final int pSize, final int pUsage) { } public void bindArrayBuffer(final int pHardwareBufferID) { - if(this.mCurrentArrayBufferID != pHardwareBufferID) { + if (this.mCurrentArrayBufferID != pHardwareBufferID) { this.mCurrentArrayBufferID = pHardwareBufferID; GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, pHardwareBufferID); } } public void deleteArrayBuffer(final int pHardwareBufferID) { - if(this.mCurrentArrayBufferID == pHardwareBufferID) { + if (this.mCurrentArrayBufferID == pHardwareBufferID) { this.mCurrentArrayBufferID = -1; } this.mHardwareIDContainer[0] = pHardwareBufferID; @@ -403,14 +403,14 @@ public int generateIndexBuffer(final int pSize, final int pUsage) { } public void bindIndexBuffer(final int pHardwareBufferID) { - if(this.mCurrentIndexBufferID != pHardwareBufferID) { + if (this.mCurrentIndexBufferID != pHardwareBufferID) { this.mCurrentIndexBufferID = pHardwareBufferID; GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, pHardwareBufferID); } } public void deleteIndexBuffer(final int pHardwareBufferID) { - if(this.mCurrentIndexBufferID == pHardwareBufferID) { + if (this.mCurrentIndexBufferID == pHardwareBufferID) { this.mCurrentIndexBufferID = -1; } this.mHardwareIDContainer[0] = pHardwareBufferID; @@ -432,7 +432,7 @@ public int getFramebufferStatus() { public void checkFramebufferStatus() throws GLFrameBufferException, GLException { final int framebufferStatus = this.getFramebufferStatus(); - switch(framebufferStatus) { + switch (framebufferStatus) { case GLES20.GL_FRAMEBUFFER_COMPLETE: return; case GLES20.GL_FRAMEBUFFER_UNSUPPORTED: @@ -455,7 +455,7 @@ public int getActiveFramebuffer() { } public void deleteFramebuffer(final int pHardwareFramebufferID) { - if(this.mCurrentFramebufferID == pHardwareFramebufferID) { + if (this.mCurrentFramebufferID == pHardwareFramebufferID) { this.mCurrentFramebufferID = -1; } this.mHardwareIDContainer[0] = pHardwareFramebufferID; @@ -463,14 +463,14 @@ public void deleteFramebuffer(final int pHardwareFramebufferID) { } public void useProgram(final int pShaderProgramID) { - if(this.mCurrentShaderProgramID != pShaderProgramID) { + if (this.mCurrentShaderProgramID != pShaderProgramID) { this.mCurrentShaderProgramID = pShaderProgramID; GLES20.glUseProgram(pShaderProgramID); } } public void deleteProgram(final int pShaderProgramID) { - if(this.mCurrentShaderProgramID == pShaderProgramID) { + if (this.mCurrentShaderProgramID == pShaderProgramID) { this.mCurrentShaderProgramID = -1; } GLES20.glDeleteProgram(pShaderProgramID); @@ -497,7 +497,7 @@ public int getActiveTexture() { */ public void activeTexture(final int pGLActiveTexture) { final int activeTextureIndex = pGLActiveTexture - GLES20.GL_TEXTURE0; - if(pGLActiveTexture != this.mCurrentActiveTextureIndex) { + if (pGLActiveTexture != this.mCurrentActiveTextureIndex) { this.mCurrentActiveTextureIndex = activeTextureIndex; GLES20.glActiveTexture(pGLActiveTexture); } @@ -509,14 +509,14 @@ public void activeTexture(final int pGLActiveTexture) { * @param pHardwareTextureID */ public void bindTexture(final int pHardwareTextureID) { - if(this.mCurrentBoundTextureIDs[this.mCurrentActiveTextureIndex] != pHardwareTextureID) { + if (this.mCurrentBoundTextureIDs[this.mCurrentActiveTextureIndex] != pHardwareTextureID) { this.mCurrentBoundTextureIDs[this.mCurrentActiveTextureIndex] = pHardwareTextureID; GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, pHardwareTextureID); } } public void deleteTexture(final int pHardwareTextureID) { - if(this.mCurrentBoundTextureIDs[this.mCurrentActiveTextureIndex] == pHardwareTextureID) { + if (this.mCurrentBoundTextureIDs[this.mCurrentActiveTextureIndex] == pHardwareTextureID) { this.mCurrentBoundTextureIDs[this.mCurrentActiveTextureIndex] = -1; } this.mHardwareIDContainer[0] = pHardwareTextureID; @@ -524,7 +524,7 @@ public void deleteTexture(final int pHardwareTextureID) { } public void blendFunction(final int pSourceBlendMode, final int pDestinationBlendMode) { - if(this.mCurrentSourceBlendMode != pSourceBlendMode || this.mCurrentDestinationBlendMode != pDestinationBlendMode) { + if (this.mCurrentSourceBlendMode != pSourceBlendMode || this.mCurrentDestinationBlendMode != pDestinationBlendMode) { this.mCurrentSourceBlendMode = pSourceBlendMode; this.mCurrentDestinationBlendMode = pDestinationBlendMode; GLES20.glBlendFunc(pSourceBlendMode, pDestinationBlendMode); @@ -532,7 +532,7 @@ public void blendFunction(final int pSourceBlendMode, final int pDestinationBlen } public void lineWidth(final float pLineWidth) { - if(this.mLineWidth != pLineWidth) { + if (this.mLineWidth != pLineWidth) { this.mLineWidth = pLineWidth; GLES20.glLineWidth(pLineWidth); } @@ -688,7 +688,7 @@ public int getError() { public void checkError() throws GLException { final int error = GLES20.glGetError(); - if(error != GLES20.GL_NO_ERROR) { + if (error != GLES20.GL_NO_ERROR) { throw new GLException(error); } } diff --git a/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java b/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java index 8e8511f3b..85d7e0f61 100644 --- a/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java @@ -37,8 +37,8 @@ public LogicalAndGLCriteria(final IGLCriteria ... pGLCriterias) { @Override public boolean isMet(final GLState pGLState) { - for(final IGLCriteria gLCriteria : this.mGLCriterias) { - if(!gLCriteria.isMet(pGLState)) { + for (final IGLCriteria gLCriteria : this.mGLCriterias) { + if (!gLCriteria.isMet(pGLState)) { return false; } } diff --git a/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java b/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java index d21aa86e2..fad76787d 100644 --- a/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java @@ -37,8 +37,8 @@ public LogicalOrGLCriteria(final IGLCriteria ... pGLCriterias) { @Override public boolean isMet(final GLState pGLState) { - for(final IGLCriteria gLCriteria : this.mGLCriterias) { - if(gLCriteria.isMet(pGLState)) { + for (final IGLCriteria gLCriteria : this.mGLCriterias) { + if (gLCriteria.isMet(pGLState)) { return true; } } diff --git a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java index 15348865c..f89e527c2 100644 --- a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java @@ -39,7 +39,7 @@ public HighPerformanceVertexBufferObject(final VertexBufferObjectManager pVertex super(pVertexBufferObjectManager, pCapacity, pDrawType, pAutoDispose, pVertexBufferObjectAttributes); this.mBufferData = new float[pCapacity]; - if(SystemUtils.SDK_VERSION_HONEYCOMB_OR_LATER) { + if (SystemUtils.SDK_VERSION_HONEYCOMB_OR_LATER) { this.mFloatBuffer = this.mByteBuffer.asFloatBuffer(); } else { this.mFloatBuffer = null; @@ -50,7 +50,7 @@ public HighPerformanceVertexBufferObject(final VertexBufferObjectManager pVertex super(pVertexBufferObjectManager, pBufferData.length, pDrawType, pAutoDispose, pVertexBufferObjectAttributes); this.mBufferData = pBufferData; - if(SystemUtils.SDK_VERSION_HONEYCOMB_OR_LATER) { + if (SystemUtils.SDK_VERSION_HONEYCOMB_OR_LATER) { this.mFloatBuffer = this.mByteBuffer.asFloatBuffer(); } else { this.mFloatBuffer = null; @@ -82,7 +82,7 @@ public int getNativeHeapMemoryByteSize() { @Override protected void onBufferData() { // TODO Check if, and how mow this condition affects performance. - if(SystemUtils.SDK_VERSION_HONEYCOMB_OR_LATER) { + if (SystemUtils.SDK_VERSION_HONEYCOMB_OR_LATER) { // TODO Check if this is similar fast or faster than the non Honeycomb codepath. this.mFloatBuffer.position(0); this.mFloatBuffer.put(this.mBufferData); diff --git a/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java index b6c6e71e8..396f065a5 100644 --- a/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java @@ -36,7 +36,7 @@ public static int getSharedByteBufferByteCapacity() { SharedMemoryVertexBufferObject.sSharedByteBufferLock.lock(); final ByteBuffer sharedByteBuffer = SharedMemoryVertexBufferObject.sSharedByteBuffer; - if(sharedByteBuffer == null) { + if (sharedByteBuffer == null) { byteCapacity = 0; } else { byteCapacity = sharedByteBuffer.capacity(); @@ -75,7 +75,7 @@ public void dispose() { try { SharedMemoryVertexBufferObject.sSharedByteBufferLock.lock(); - if(SharedMemoryVertexBufferObject.sSharedByteBuffer != null) { + if (SharedMemoryVertexBufferObject.sSharedByteBuffer != null) { BufferUtils.freeDirectByteBuffer(SharedMemoryVertexBufferObject.sSharedByteBuffer); SharedMemoryVertexBufferObject.sSharedByteBuffer = null; @@ -91,8 +91,8 @@ protected ByteBuffer aquireByteBuffer() { final int byteCapacity = this.getByteCapacity(); - if(SharedMemoryVertexBufferObject.sSharedByteBuffer == null || SharedMemoryVertexBufferObject.sSharedByteBuffer.capacity() < byteCapacity) { - if(SharedMemoryVertexBufferObject.sSharedByteBuffer != null) { + if (SharedMemoryVertexBufferObject.sSharedByteBuffer == null || SharedMemoryVertexBufferObject.sSharedByteBuffer.capacity() < byteCapacity) { + if (SharedMemoryVertexBufferObject.sSharedByteBuffer != null) { BufferUtils.freeDirectByteBuffer(SharedMemoryVertexBufferObject.sSharedByteBuffer); } diff --git a/src/org/andengine/opengl/vbo/VertexBufferObject.java b/src/org/andengine/opengl/vbo/VertexBufferObject.java index b14c46ac6..7527c170b 100644 --- a/src/org/andengine/opengl/vbo/VertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/VertexBufferObject.java @@ -123,7 +123,7 @@ public int getByteCapacity() { @Override public int getGPUMemoryByteSize() { - if(this.isLoadedToHardware()) { + if (this.isLoadedToHardware()) { return this.getByteCapacity(); } else { return 0; @@ -138,17 +138,17 @@ public int getGPUMemoryByteSize() { @Override public void bind(final GLState pGLState) { - if(this.mHardwareBufferID == IVertexBufferObject.HARDWARE_BUFFER_ID_INVALID) { + if (this.mHardwareBufferID == IVertexBufferObject.HARDWARE_BUFFER_ID_INVALID) { this.loadToHardware(pGLState); - if(this.mVertexBufferObjectManager != null) { + if (this.mVertexBufferObjectManager != null) { this.mVertexBufferObjectManager.onVertexBufferObjectLoaded(this); } } pGLState.bindArrayBuffer(this.mHardwareBufferID); - if(this.mDirtyOnHardware) { + if (this.mDirtyOnHardware) { this.onBufferData(); this.mDirtyOnHardware = false; @@ -189,10 +189,10 @@ public void draw(final int pPrimitiveType, final int pOffset, final int pCount) @Override public void dispose() { - if(!this.mDisposed) { + if (!this.mDisposed) { this.mDisposed = true; - if(this.mVertexBufferObjectManager != null) { + if (this.mVertexBufferObjectManager != null) { this.mVertexBufferObjectManager.onUnloadVertexBufferObject(this); } @@ -206,7 +206,7 @@ public void dispose() { protected void finalize() throws Throwable { super.finalize(); - if(!this.mDisposed) { + if (!this.mDisposed) { this.dispose(); } } diff --git a/src/org/andengine/opengl/vbo/VertexBufferObjectManager.java b/src/org/andengine/opengl/vbo/VertexBufferObjectManager.java index 0c9762093..64290e2be 100644 --- a/src/org/andengine/opengl/vbo/VertexBufferObjectManager.java +++ b/src/org/andengine/opengl/vbo/VertexBufferObjectManager.java @@ -35,7 +35,7 @@ public class VertexBufferObjectManager { public synchronized int getHeapMemoryByteSize() { int byteSize = 0; final ArrayList vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded; - for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { + for (int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { byteSize += vertexBufferObjectsLoaded.get(i).getHeapMemoryByteSize(); } return byteSize; @@ -44,7 +44,7 @@ public synchronized int getHeapMemoryByteSize() { public synchronized int getNativeHeapMemoryByteSize() { int byteSize = 0; final ArrayList vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded; - for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { + for (int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { byteSize += vertexBufferObjectsLoaded.get(i).getNativeHeapMemoryByteSize(); } return byteSize; @@ -53,7 +53,7 @@ public synchronized int getNativeHeapMemoryByteSize() { public synchronized int getGPUHeapMemoryByteSize() { int byteSize = 0; final ArrayList vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded; - for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { + for (int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { byteSize += vertexBufferObjectsLoaded.get(i).getGPUMemoryByteSize(); } return byteSize; @@ -73,7 +73,7 @@ public void onCreate() { public synchronized void onDestroy() { final ArrayList vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded; - for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { + for (int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { vertexBufferObjectsLoaded.get(i).setNotLoadedToHardware(); } @@ -85,14 +85,14 @@ public synchronized void onVertexBufferObjectLoaded(final IVertexBufferObject pV } public synchronized void onUnloadVertexBufferObject(final IVertexBufferObject pVertexBufferObject) { - if(this.mVertexBufferObjectsLoaded.remove(pVertexBufferObject)) { + if (this.mVertexBufferObjectsLoaded.remove(pVertexBufferObject)) { this.mVertexBufferObjectsToBeUnloaded.add(pVertexBufferObject); } } public synchronized void onReload() { final ArrayList vertexBufferObjectsLoaded = this.mVertexBufferObjectsLoaded; - for(int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { + for (int i = vertexBufferObjectsLoaded.size() - 1; i >= 0; i--) { vertexBufferObjectsLoaded.get(i).setNotLoadedToHardware(); } @@ -104,9 +104,9 @@ public synchronized void updateVertexBufferObjects(final GLState pGLState) { final ArrayList vertexBufferObjectsToBeUnloaded = this.mVertexBufferObjectsToBeUnloaded; /* Unload pending VertexBufferObjects. */ - for(int i = vertexBufferObjectsToBeUnloaded.size() - 1; i >= 0; i--){ + for (int i = vertexBufferObjectsToBeUnloaded.size() - 1; i >= 0; i--) { final IVertexBufferObject vertexBufferObjectToBeUnloaded = vertexBufferObjectsToBeUnloaded.remove(i); - if(vertexBufferObjectToBeUnloaded.isLoadedToHardware()){ + if (vertexBufferObjectToBeUnloaded.isLoadedToHardware()) { vertexBufferObjectToBeUnloaded.unloadFromHardware(pGLState); } vertexBufferObjectsLoaded.remove(vertexBufferObjectToBeUnloaded); diff --git a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java index 4da8df9b4..ac910c294 100644 --- a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java @@ -128,7 +128,7 @@ public int getNativeHeapMemoryByteSize() { @Override public int getGPUMemoryByteSize() { - if(this.isLoadedToHardware()) { + if (this.isLoadedToHardware()) { return this.getByteCapacity(); } else { return 0; @@ -143,14 +143,14 @@ public int getGPUMemoryByteSize() { @Override public void bind(final GLState pGLState) { - if(this.mHardwareBufferID == IVertexBufferObject.HARDWARE_BUFFER_ID_INVALID) { + if (this.mHardwareBufferID == IVertexBufferObject.HARDWARE_BUFFER_ID_INVALID) { this.loadToHardware(pGLState); this.mVertexBufferObjectManager.onVertexBufferObjectLoaded(this); } pGLState.bindArrayBuffer(this.mHardwareBufferID); - if(this.mDirtyOnHardware) { + if (this.mDirtyOnHardware) { ByteBuffer byteBuffer = null; try { byteBuffer = this.aquireByteBuffer(); @@ -159,7 +159,7 @@ public void bind(final GLState pGLState) { GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, byteBuffer.limit(), byteBuffer, this.mUsage); } finally { - if(byteBuffer != null) { + if (byteBuffer != null) { this.releaseByteBuffer(byteBuffer); } } @@ -201,7 +201,7 @@ public void draw(final int pPrimitiveType, final int pOffset, final int pCount) @Override public void dispose() { - if(!this.mDisposed) { + if (!this.mDisposed) { this.mDisposed = true; this.mVertexBufferObjectManager.onUnloadVertexBufferObject(this); @@ -214,7 +214,7 @@ public void dispose() { protected void finalize() throws Throwable { super.finalize(); - if(!this.mDisposed) { + if (!this.mDisposed) { this.dispose(); } } diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java index 2843d79f9..5a1fb121d 100644 --- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java +++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java @@ -46,7 +46,7 @@ public void glVertexAttribPointers() { final int stride = this.mStride; final int vertexBufferObjectAttributeCount = vertexBufferObjectAttributes.length; - for(int i = 0; i < vertexBufferObjectAttributeCount; i++) { + for (int i = 0; i < vertexBufferObjectAttributeCount; i++) { vertexBufferObjectAttributes[i].glVertexAttribPointer(stride); } } diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java index 2b9098a57..d42f17508 100644 --- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java +++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java @@ -55,13 +55,13 @@ public VertexBufferObjectAttributesBuilder(final int pCount) { // =========================================================== public VertexBufferObjectAttributesBuilder add(final int pLocation, final String pName, final int pSize, final int pType, final boolean pNormalized) { - if(VertexBufferObjectAttributesBuilder.WORAROUND_GLES2_GLVERTEXATTRIBPOINTER_MISSING) { + if (VertexBufferObjectAttributesBuilder.WORAROUND_GLES2_GLVERTEXATTRIBPOINTER_MISSING) { this.mVertexBufferObjectAttributes[this.mIndex] = new VertexBufferObjectAttributeFix(pLocation, pName, pSize, pType, pNormalized, this.mOffset); } else { this.mVertexBufferObjectAttributes[this.mIndex] = new VertexBufferObjectAttribute(pLocation, pName, pSize, pType, pNormalized, this.mOffset); } - switch(pType) { + switch (pType) { case GLES20.GL_FLOAT: this.mOffset += pSize * DataConstants.BYTES_PER_FLOAT; break; @@ -78,7 +78,7 @@ public VertexBufferObjectAttributesBuilder add(final int pLocation, final String } public VertexBufferObjectAttributes build() { - if(this.mIndex != this.mVertexBufferObjectAttributes.length) { + if (this.mIndex != this.mVertexBufferObjectAttributes.length) { throw new AndEngineRuntimeException("Not enough " + VertexBufferObjectAttribute.class.getSimpleName() + "s added to this " + this.getClass().getSimpleName() + "."); } diff --git a/src/org/andengine/opengl/view/ConfigChooser.java b/src/org/andengine/opengl/view/ConfigChooser.java index 3ff752678..1c24857f3 100644 --- a/src/org/andengine/opengl/view/ConfigChooser.java +++ b/src/org/andengine/opengl/view/ConfigChooser.java @@ -208,22 +208,22 @@ private EGLConfig chooseConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, f int eglConfigCount; - if(this.mRequestedMultiSampling) { + if (this.mRequestedMultiSampling) { eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, this.mMultiSampleEGLConfig); - if(eglConfigCount > 0) { + if (eglConfigCount > 0) { this.mActualMultiSampling = true; return this.findEGLConfig(pEGL, pEGLDisplay, this.mMultiSampleEGLConfig, eglConfigCount, pConfigChooserMatcher); } eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, this.mNvidiaCoverageMultiSampleEGLConfig); - if(eglConfigCount > 0) { + if (eglConfigCount > 0) { this.mActualCoverageMultiSampling = true; return this.findEGLConfig(pEGL, pEGLDisplay, this.mNvidiaCoverageMultiSampleEGLConfig, eglConfigCount, pConfigChooserMatcher); } } eglConfigCount = this.getEGLConfigCount(pEGL, pEGLDisplay, this.mDefaultEGLConfig); - if(eglConfigCount > 0) { + if (eglConfigCount > 0) { return this.findEGLConfig(pEGL, pEGLDisplay, this.mDefaultEGLConfig, eglConfigCount, pConfigChooserMatcher); } else { throw new IllegalArgumentException("No " + EGLConfig.class.getSimpleName() + " found!"); @@ -235,7 +235,7 @@ private EGLConfig chooseConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, f // =========================================================== private int getEGLConfigCount(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final int[] pEGLConfigAttributes) { - if(pEGL.eglChooseConfig(pEGLDisplay, pEGLConfigAttributes, null, 0, ConfigChooser.BUFFER) == false) { + if (pEGL.eglChooseConfig(pEGLDisplay, pEGLConfigAttributes, null, 0, ConfigChooser.BUFFER) == false) { throw new IllegalArgumentException("EGLCONFIG_FALLBACK failed!"); } return ConfigChooser.BUFFER[0]; @@ -243,7 +243,7 @@ private int getEGLConfigCount(final EGL10 pEGL, final EGLDisplay pEGLDisplay, fi private EGLConfig findEGLConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final int[] pEGLConfigAttributes, final int pEGLConfigCount, final ConfigChooserMatcher pConfigChooserMatcher) { final EGLConfig[] eglConfigs = new EGLConfig[pEGLConfigCount]; - if(!pEGL.eglChooseConfig(pEGLDisplay, pEGLConfigAttributes, eglConfigs, pEGLConfigCount, ConfigChooser.BUFFER)) { + if (!pEGL.eglChooseConfig(pEGLDisplay, pEGLConfigAttributes, eglConfigs, pEGLConfigCount, ConfigChooser.BUFFER)) { throw new IllegalArgumentException("findEGLConfig failed!"); } @@ -251,9 +251,9 @@ private EGLConfig findEGLConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, } private EGLConfig findEGLConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final EGLConfig[] pEGLConfigs, final ConfigChooserMatcher pConfigChooserMatcher) { - for(int i = 0; i < pEGLConfigs.length; ++i) { + for (int i = 0; i < pEGLConfigs.length; ++i) { final EGLConfig config = pEGLConfigs[i]; - if(config != null) { + if (config != null) { final int redSize = this.getConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_RED_SIZE, 0); final int greenSize = this.getConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_GREEN_SIZE, 0); final int blueSize = this.getConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_BLUE_SIZE, 0); @@ -261,7 +261,7 @@ private EGLConfig findEGLConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final int depthSize = this.getConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_DEPTH_SIZE, 0); final int stencilSize = this.getConfigAttrib(pEGL, pEGLDisplay, config, EGL10.EGL_STENCIL_SIZE, 0); - if(pConfigChooserMatcher.matches(this.mRequestedRedSize, redSize, this.mRequestedGreenSize, greenSize, this.mRequestedBlueSize, blueSize, this.mRequestedAlphaSize, alphaSize, this.mRequestedDepthSize, depthSize, this.mRequestedStencilSize, stencilSize)) { + if (pConfigChooserMatcher.matches(this.mRequestedRedSize, redSize, this.mRequestedGreenSize, greenSize, this.mRequestedBlueSize, blueSize, this.mRequestedAlphaSize, alphaSize, this.mRequestedDepthSize, depthSize, this.mRequestedStencilSize, stencilSize)) { this.mActualRedSize = redSize; this.mActualGreenSize = greenSize; this.mActualBlueSize = blueSize; @@ -276,7 +276,7 @@ private EGLConfig findEGLConfig(final EGL10 pEGL, final EGLDisplay pEGLDisplay, } private int getConfigAttrib(final EGL10 pEGL, final EGLDisplay pEGLDisplay, final EGLConfig pEGLConfig, final int pAttribute, final int pDefaultValue) { - if(pEGL.eglGetConfigAttrib(pEGLDisplay, pEGLConfig, pAttribute, ConfigChooser.BUFFER)) { + if (pEGL.eglGetConfigAttrib(pEGLDisplay, pEGLConfig, pAttribute, ConfigChooser.BUFFER)) { return ConfigChooser.BUFFER[0]; } else { return pDefaultValue; diff --git a/src/org/andengine/opengl/view/ConfigChooserMatcher.java b/src/org/andengine/opengl/view/ConfigChooserMatcher.java index c9b26f50f..4d74c78a3 100644 --- a/src/org/andengine/opengl/view/ConfigChooserMatcher.java +++ b/src/org/andengine/opengl/view/ConfigChooserMatcher.java @@ -14,8 +14,8 @@ public abstract class ConfigChooserMatcher { public static final ConfigChooserMatcher STRICT = new ConfigChooserMatcher() { @Override public boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize) { - if(pDepthSize == pRequestedDepthSize && pStencilSize == pRequestedStencilSize) { - if(pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { + if (pDepthSize == pRequestedDepthSize && pStencilSize == pRequestedStencilSize) { + if (pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { return true; } } @@ -26,8 +26,8 @@ public boolean matches(final int pRequestedRedSize, final int pRedSize, final in public static final ConfigChooserMatcher LOOSE_STENCIL = new ConfigChooserMatcher() { @Override public boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize) { - if(pDepthSize == pRequestedDepthSize && pStencilSize >= pRequestedStencilSize) { - if(pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { + if (pDepthSize == pRequestedDepthSize && pStencilSize >= pRequestedStencilSize) { + if (pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { return true; } } @@ -38,8 +38,8 @@ public boolean matches(final int pRequestedRedSize, final int pRedSize, final in public static final ConfigChooserMatcher LOOSE_DEPTH_AND_STENCIL = new ConfigChooserMatcher() { @Override public boolean matches(final int pRequestedRedSize, final int pRedSize, final int pRequestedGreenSize, final int pGreenSize, final int pRequestedBlueSize, final int pBlueSize, final int pRequestedAlphaSize, final int pAlphaSize, final int pRequestedDepthSize, final int pDepthSize, final int pRequestedStencilSize, final int pStencilSize) { - if(pDepthSize >= pRequestedDepthSize && pStencilSize >= pRequestedStencilSize) { - if(pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { + if (pDepthSize >= pRequestedDepthSize && pStencilSize >= pRequestedStencilSize) { + if (pRedSize == pRequestedRedSize && pGreenSize == pRequestedGreenSize && pBlueSize == pRequestedBlueSize && pAlphaSize == pRequestedAlphaSize) { return true; } } diff --git a/src/org/andengine/opengl/view/EngineRenderer.java b/src/org/andengine/opengl/view/EngineRenderer.java index 41fe65da0..3b7d23869 100644 --- a/src/org/andengine/opengl/view/EngineRenderer.java +++ b/src/org/andengine/opengl/view/EngineRenderer.java @@ -76,7 +76,7 @@ public void onSurfaceCreated(final GL10 pGL, final EGLConfig pEGLConfig) { // GLES20.glFrontFace(GLES20.GL_CCW); // GLES20.glCullFace(GLES20.GL_BACK); - if(this.mRendererListener != null) { + if (this.mRendererListener != null) { this.mRendererListener.onSurfaceCreated(this.mGLState); } } @@ -88,7 +88,7 @@ public void onSurfaceChanged(final GL10 pGL, final int pWidth, final int pHeight GLES20.glViewport(0, 0, pWidth, pHeight); this.mGLState.loadProjectionGLMatrixIdentity(); - if(this.mRendererListener != null) { + if (this.mRendererListener != null) { this.mRendererListener.onSurfaceChanged(this.mGLState, pWidth, pHeight); } } diff --git a/src/org/andengine/opengl/view/RenderSurfaceView.java b/src/org/andengine/opengl/view/RenderSurfaceView.java index e237e71e9..8ad296880 100644 --- a/src/org/andengine/opengl/view/RenderSurfaceView.java +++ b/src/org/andengine/opengl/view/RenderSurfaceView.java @@ -48,7 +48,7 @@ public RenderSurfaceView(final Context pContext, final AttributeSet pAttrs) { // =========================================================== public ConfigChooser getConfigChooser() throws IllegalStateException { - if(this.mConfigChooser == null) { + if (this.mConfigChooser == null) { throw new IllegalStateException(ConfigChooser.class.getSimpleName() + " not yet set."); } return this.mConfigChooser; @@ -76,14 +76,14 @@ public void onResolutionChanged(final int pWidth, final int pHeight) { // =========================================================== public void setRenderer(final Engine pEngine, final IRendererListener pRendererListener) { - if(this.mConfigChooser == null) { + if (this.mConfigChooser == null) { final ConfigChooserOptions configChooserOptions = pEngine.getEngineOptions().getRenderOptions().getConfigChooserOptions(); this.mConfigChooser = new ConfigChooser(configChooserOptions); // TODO We don't know yet if the requested color size will actually be accepted! - if(configChooserOptions.isRequestedRGBA8888()) { + if (configChooserOptions.isRequestedRGBA8888()) { this.getHolder().setFormat(android.graphics.PixelFormat.RGBA_8888); - } else if(configChooserOptions.isRequestedRGB565()) { + } else if (configChooserOptions.isRequestedRGB565()) { this.getHolder().setFormat(android.graphics.PixelFormat.RGB_565); } } diff --git a/src/org/andengine/ui/activity/BaseActivity.java b/src/org/andengine/ui/activity/BaseActivity.java index 962a405b6..abf680a39 100644 --- a/src/org/andengine/ui/activity/BaseActivity.java +++ b/src/org/andengine/ui/activity/BaseActivity.java @@ -48,7 +48,7 @@ public void toastOnUiThread(final CharSequence pText) { } public void toastOnUiThread(final CharSequence pText, final int pDuration) { - if(ActivityUtils.isOnUiThread()) { + if (ActivityUtils.isOnUiThread()) { Toast.makeText(BaseActivity.this, pText, pDuration).show(); } else { this.runOnUiThread(new Runnable() { @@ -67,7 +67,7 @@ public void showDialogOnUiThread(final int pDialogID) { @Deprecated public void showDialogOnUiThread(final int pDialogID, final Bundle pBundle) { - if(ActivityUtils.isOnUiThread()) { + if (ActivityUtils.isOnUiThread()) { this.showDialog(pDialogID, pBundle); } else { this.runOnUiThread(new Runnable() { diff --git a/src/org/andengine/ui/activity/BaseGameActivity.java b/src/org/andengine/ui/activity/BaseGameActivity.java index 4a906905b..598ddb817 100644 --- a/src/org/andengine/ui/activity/BaseGameActivity.java +++ b/src/org/andengine/ui/activity/BaseGameActivity.java @@ -71,7 +71,7 @@ public abstract class BaseGameActivity extends BaseActivity implements IGameInte @Override protected void onCreate(final Bundle pSavedInstanceState) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onCreate" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -94,18 +94,18 @@ public Engine onCreateEngine(final EngineOptions pEngineOptions) { @Override public synchronized void onSurfaceCreated(final GLState pGLState) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onSurfaceCreated" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } - if(this.mGameCreated) { + if (this.mGameCreated) { this.onReloadResources(); - if(this.mGamePaused && this.mGameCreated) { + if (this.mGamePaused && this.mGameCreated) { this.onResumeGame(); } } else { - if(this.mCreateGameCalled) { + if (this.mCreateGameCalled) { this.mOnReloadResourcesScheduled = true; } else { this.mCreateGameCalled = true; @@ -116,13 +116,13 @@ public synchronized void onSurfaceCreated(final GLState pGLState) { @Override public synchronized void onSurfaceChanged(final GLState pGLState, final int pWidth, final int pHeight) { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onSurfaceChanged(Width=" + pWidth + ", Height=" + pHeight + ")" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } } protected synchronized void onCreateGame() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onCreateGame" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -130,7 +130,7 @@ protected synchronized void onCreateGame() { @Override public void onPopulateSceneFinished() { try { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(BaseGameActivity.this.getClass().getSimpleName() + ".onGameCreated" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -149,7 +149,7 @@ public void onCreateSceneFinished(final Scene pScene) { BaseGameActivity.this.mEngine.setScene(pScene); try { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(BaseGameActivity.this.getClass().getSimpleName() + ".onPopulateScene" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -164,7 +164,7 @@ public void onCreateSceneFinished(final Scene pScene) { @Override public void onCreateResourcesFinished() { try { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(BaseGameActivity.this.getClass().getSimpleName() + ".onCreateScene" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -176,7 +176,7 @@ public void onCreateResourcesFinished() { }; try { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onCreateResources" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -193,7 +193,7 @@ public synchronized void onGameCreated() { /* Since the potential asynchronous resource creation, * the surface might already be invalid * and a resource reloading might be necessary. */ - if(this.mOnReloadResourcesScheduled) { + if (this.mOnReloadResourcesScheduled) { this.mOnReloadResourcesScheduled = false; try { this.onReloadResources(); @@ -205,7 +205,7 @@ public synchronized void onGameCreated() { @Override protected synchronized void onResume() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onResume" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -217,7 +217,7 @@ protected synchronized void onResume() { @Override public synchronized void onResumeGame() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onResumeGame" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -230,14 +230,14 @@ public synchronized void onResumeGame() { public synchronized void onWindowFocusChanged(final boolean pHasWindowFocus) { super.onWindowFocusChanged(pHasWindowFocus); - if(pHasWindowFocus && this.mGamePaused && this.mGameCreated) { + if (pHasWindowFocus && this.mGamePaused && this.mGameCreated) { this.onResumeGame(); } } @Override public void onReloadResources() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onReloadResources" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -246,7 +246,7 @@ public void onReloadResources() { @Override protected void onPause() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onPause" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -255,14 +255,14 @@ protected void onPause() { this.mRenderSurfaceView.onPause(); this.releaseWakeLock(); - if(!this.mGamePaused) { + if (!this.mGamePaused) { this.onPauseGame(); } } @Override public synchronized void onPauseGame() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onPauseGame" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -273,7 +273,7 @@ public synchronized void onPauseGame() { @Override protected void onDestroy() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onDestroy" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -294,22 +294,22 @@ protected void onDestroy() { @Override public void onDestroyResources() throws IOException { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onDestroyResources" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } - if(this.mEngine.getEngineOptions().getAudioOptions().needsMusic()) { + if (this.mEngine.getEngineOptions().getAudioOptions().needsMusic()) { this.getMusicManager().releaseAll(); } - if(this.mEngine.getEngineOptions().getAudioOptions().needsSound()) { + if (this.mEngine.getEngineOptions().getAudioOptions().needsSound()) { this.getSoundManager().releaseAll(); } } @Override public synchronized void onGameDestroyed() { - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.d(this.getClass().getSimpleName() + ".onGameDestroyed" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } @@ -403,7 +403,7 @@ private void acquireWakeLock() { } private void acquireWakeLock(final WakeLockOptions pWakeLockOptions) { - if(pWakeLockOptions == WakeLockOptions.SCREEN_ON) { + if (pWakeLockOptions == WakeLockOptions.SCREEN_ON) { ActivityUtils.keepScreenOn(this); } else { final PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE); @@ -417,7 +417,7 @@ private void acquireWakeLock(final WakeLockOptions pWakeLockOptions) { } private void releaseWakeLock() { - if(this.mWakeLock != null && this.mWakeLock.isHeld()) { + if (this.mWakeLock != null && this.mWakeLock.isHeld()) { this.mWakeLock.release(); } } @@ -425,20 +425,20 @@ private void releaseWakeLock() { private void applyEngineOptions() { final EngineOptions engineOptions = this.mEngine.getEngineOptions(); - if(engineOptions.isFullscreen()) { + if (engineOptions.isFullscreen()) { ActivityUtils.requestFullscreen(this); } - if(engineOptions.getAudioOptions().needsMusic() || engineOptions.getAudioOptions().needsSound()) { + if (engineOptions.getAudioOptions().needsMusic() || engineOptions.getAudioOptions().needsSound()) { this.setVolumeControlStream(AudioManager.STREAM_MUSIC); } - switch(engineOptions.getScreenOrientation()) { + switch (engineOptions.getScreenOrientation()) { case LANDSCAPE_FIXED: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case LANDSCAPE_SENSOR: - if(SystemUtils.SDK_VERSION_GINGERBREAD_OR_LATER) { + if (SystemUtils.SDK_VERSION_GINGERBREAD_OR_LATER) { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); } else { Debug.w(ScreenOrientation.class.getSimpleName() + "." + ScreenOrientation.LANDSCAPE_SENSOR + " is not supported on this device. Falling back to " + ScreenOrientation.class.getSimpleName() + "." + ScreenOrientation.LANDSCAPE_FIXED); @@ -449,7 +449,7 @@ private void applyEngineOptions() { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); break; case PORTRAIT_SENSOR: - if(SystemUtils.SDK_VERSION_GINGERBREAD_OR_LATER) { + if (SystemUtils.SDK_VERSION_GINGERBREAD_OR_LATER) { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); } else { Debug.w(ScreenOrientation.class.getSimpleName() + "." + ScreenOrientation.PORTRAIT_SENSOR + " is not supported on this device. Falling back to " + ScreenOrientation.class.getSimpleName() + "." + ScreenOrientation.PORTRAIT_FIXED); diff --git a/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java b/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java index 4d9b724d6..98bc2118d 100644 --- a/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java +++ b/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java @@ -41,11 +41,11 @@ public abstract class GenericInputDialogBuilder { // Constructors // =========================================================== - public GenericInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener){ + public GenericInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener) { this(pContext, pTitleResID, pMessageResID, pErrorResID, pIconResID, "", pSuccessCallback, pOnCancelListener); } - public GenericInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final String pDefaultText, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener){ + public GenericInputDialogBuilder(final Context pContext, final int pTitleResID, final int pMessageResID, final int pErrorResID, final int pIconResID, final String pDefaultText, final Callback pSuccessCallback, final OnCancelListener pOnCancelListener) { this.mContext = pContext; this.mTitleResID = pTitleResID; this.mMessageResID = pMessageResID; @@ -75,13 +75,13 @@ public Dialog create() { etInput.setText(this.mDefaultText); final AlertDialog.Builder ab = new AlertDialog.Builder(this.mContext); - if(this.mTitleResID != 0) { + if (this.mTitleResID != 0) { ab.setTitle(this.mTitleResID); } - if(this.mMessageResID != 0) { + if (this.mMessageResID != 0) { ab.setMessage(this.mMessageResID); } - if(this.mIconResID != 0) { + if (this.mIconResID != 0) { ab.setIcon(this.mIconResID); } diff --git a/src/org/andengine/util/ActivityUtils.java b/src/org/andengine/util/ActivityUtils.java index bc5e4008a..cd88f4edb 100644 --- a/src/org/andengine/util/ActivityUtils.java +++ b/src/org/andengine/util/ActivityUtils.java @@ -112,7 +112,7 @@ public static final void doAsync(final Context pContext, final CharSequence @Override public void onPreExecute() { this.mPD = ProgressDialog.show(pContext, pTitle, pMessage, true, pCancelable); - if(pCancelable) { + if (pCancelable) { this.mPD.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(final DialogInterface pDialogInterface) { @@ -142,14 +142,14 @@ public void onPostExecute(final T result) { Debug.e("Error", e); } - if(this.isCancelled()) { + if (this.isCancelled()) { this.mException = new CancelledException(); } - if(this.mException == null) { + if (this.mException == null) { pCallback.onCallback(result); } else { - if(pExceptionCallback == null) { + if (pExceptionCallback == null) { Debug.e("Error", this.mException); } else { pExceptionCallback.onCallback(this.mException); @@ -218,14 +218,14 @@ public void onPostExecute(final T result) { /* Nothing. */ } - if(this.isCancelled()) { + if (this.isCancelled()) { this.mException = new CancelledException(); } - if(this.mException == null) { + if (this.mException == null) { pCallback.onCallback(result); } else { - if(pExceptionCallback == null) { + if (pExceptionCallback == null) { Debug.e("Error", this.mException); } else { pExceptionCallback.onCallback(this.mException); diff --git a/src/org/andengine/util/BetaUtils.java b/src/org/andengine/util/BetaUtils.java index 635ea5dc6..bfc4d360a 100644 --- a/src/org/andengine/util/BetaUtils.java +++ b/src/org/andengine/util/BetaUtils.java @@ -61,16 +61,16 @@ public static boolean finishWhenExpired(final Activity pActivity, final Gregoria final GregorianCalendar lastuseDate = new GregorianCalendar(); lastuseDate.setTimeInMillis(lastuse); - if(lastuseDate.after(pExpirationDate)){ + if (lastuseDate.after(pExpirationDate)) { final Builder alertDialogBuilder = new AlertDialog.Builder(pActivity) .setTitle(pTitleResourceID) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(pMessageResourceID); - alertDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){ + alertDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface pDialog, final int pWhich) { - if(pOkIntent != null) { + if (pOkIntent != null) { pActivity.startActivity(pOkIntent); } pActivity.finish(); @@ -79,7 +79,7 @@ public void onClick(final DialogInterface pDialog, final int pWhich) { alertDialogBuilder.setNegativeButton(android.R.string.cancel, new OnClickListener() { @Override public void onClick(final DialogInterface pDialog, final int pWhich) { - if(pCancelIntent != null) { + if (pCancelIntent != null) { pActivity.startActivity(pCancelIntent); } pActivity.finish(); diff --git a/src/org/andengine/util/DatabaseUtils.java b/src/org/andengine/util/DatabaseUtils.java index 2279b3ba6..c49f0d8e9 100644 --- a/src/org/andengine/util/DatabaseUtils.java +++ b/src/org/andengine/util/DatabaseUtils.java @@ -34,7 +34,7 @@ public class DatabaseUtils { // =========================================================== public static final void close(final Cursor pCursor) { - if(pCursor != null) { + if (pCursor != null) { pCursor.close(); } } diff --git a/src/org/andengine/util/FileUtils.java b/src/org/andengine/util/FileUtils.java index 4e780b225..ae6bd4c82 100644 --- a/src/org/andengine/util/FileUtils.java +++ b/src/org/andengine/util/FileUtils.java @@ -186,12 +186,12 @@ public static void copyFile(final File pSourceFile, final File pDestinationFile) * @return true, if all deletions were successful. false, if a deletion fails (the recursion is stopped then). */ public static boolean delete(final File pFileOrDirectory) { - if(pFileOrDirectory.isDirectory()) { + if (pFileOrDirectory.isDirectory()) { final String[] children = pFileOrDirectory.list(); final int childCount = children.length; - for(int i = 0; i < childCount; i++) { + for (int i = 0; i < childCount; i++) { final boolean success = FileUtils.delete(new File(pFileOrDirectory, children[i])); - if(!success) { + if (!success) { return false; } } diff --git a/src/org/andengine/util/ProbabilityGenerator.java b/src/org/andengine/util/ProbabilityGenerator.java index 15e5f1c40..b7c563c21 100644 --- a/src/org/andengine/util/ProbabilityGenerator.java +++ b/src/org/andengine/util/ProbabilityGenerator.java @@ -40,7 +40,7 @@ public class ProbabilityGenerator { // Methods // =========================================================== - public void add(final float pFactor, final T ... pElements){ + public void add(final float pFactor, final T ... pElements) { this.mProbabilitySum += pFactor; this.mEntries.add(new Entry(pFactor, pElements)); } @@ -50,10 +50,10 @@ public T next() { final ArrayList> factors = this.mEntries; - for(int i = factors.size() - 1; i >= 0; i--){ + for (int i = factors.size() - 1; i >= 0; i--) { final Entry entry = factors.get(i); random -= entry.mFactor; - if(random <= 0){ + if (random <= 0) { return entry.getReturnValue(); } } @@ -87,7 +87,7 @@ private static class Entry { // Constructors // =========================================================== - public Entry(final float pFactor, final T ... pData){ + public Entry(final float pFactor, final T ... pData) { this.mFactor = pFactor; this.mData = pData; } @@ -97,7 +97,7 @@ public Entry(final float pFactor, final T ... pData){ // =========================================================== public T getReturnValue() { - if(this.mData.length == 1){ + if (this.mData.length == 1) { return this.mData[0]; }else{ return ArrayUtils.random(mData); diff --git a/src/org/andengine/util/SAXUtils.java b/src/org/andengine/util/SAXUtils.java index dd4b16d9e..2d5609201 100644 --- a/src/org/andengine/util/SAXUtils.java +++ b/src/org/andengine/util/SAXUtils.java @@ -41,7 +41,7 @@ public static final boolean hasAttribute(final Attributes pAttributes, final Str public static final void hasAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) throws IllegalArgumentException { final String value = pAttributes.getValue("", pAttributeName); - if(value == null) { + if (value == null) { throw new IllegalArgumentException("No value found for attribute: '" + pAttributeName + "'"); } } @@ -53,7 +53,7 @@ public static final String getAttribute(final Attributes pAttributes, final Stri public static final String getAttributeOrThrow(final Attributes pAttributes, final String pAttributeName) { final String value = pAttributes.getValue("", pAttributeName); - if(value != null) { + if (value != null) { return value; } else { throw new IllegalArgumentException("No value found for attribute: '" + pAttributeName + "'"); diff --git a/src/org/andengine/util/SocketUtils.java b/src/org/andengine/util/SocketUtils.java index 0503345a0..97d1c966f 100644 --- a/src/org/andengine/util/SocketUtils.java +++ b/src/org/andengine/util/SocketUtils.java @@ -40,13 +40,13 @@ public final class SocketUtils { // =========================================================== public static final void closeSocket(final DatagramSocket pDatagramSocket) { - if(pDatagramSocket != null && !pDatagramSocket.isClosed()) { + if (pDatagramSocket != null && !pDatagramSocket.isClosed()) { pDatagramSocket.close(); } } public static final void closeSocket(final Socket pSocket) { - if(pSocket != null && !pSocket.isClosed()) { + if (pSocket != null && !pSocket.isClosed()) { try { pSocket.close(); } catch (final IOException e) { @@ -56,7 +56,7 @@ public static final void closeSocket(final Socket pSocket) { } public static final void closeSocket(final ServerSocket pServerSocket) { - if(pServerSocket != null && !pServerSocket.isClosed()) { + if (pServerSocket != null && !pServerSocket.isClosed()) { try { pServerSocket.close(); } catch (final IOException e) { diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java index ea3b897f3..40c0f10ae 100644 --- a/src/org/andengine/util/StreamUtils.java +++ b/src/org/andengine/util/StreamUtils.java @@ -90,7 +90,7 @@ public static final void streamToBytes(final InputStream pInputStream, final int * @throws IOException */ public static final void streamToBytes(final InputStream pInputStream, final int pByteLimit, final byte[] pData, final int pOffset) throws IOException { - if(pByteLimit > pData.length - pOffset) { + if (pByteLimit > pData.length - pOffset) { throw new IOException("pData is not big enough."); } @@ -99,14 +99,14 @@ public static final void streamToBytes(final InputStream pInputStream, final int int read; while((read = pInputStream.read(pData, pOffset + readTotal, pBytesLeftToRead)) != StreamUtils.END_OF_STREAM) { readTotal += read; - if(pBytesLeftToRead > read) { + if (pBytesLeftToRead > read) { pBytesLeftToRead -= read; } else { break; } } - if(readTotal != pByteLimit) { + if (readTotal != pByteLimit) { throw new IOException("ReadLimit: '" + pByteLimit + "', Read: '" + readTotal + "'."); } } @@ -144,7 +144,7 @@ public static final void copy(final InputStream pInputStream, final ByteBuffer p * @throws IOException If any error occurs during the copy. */ public static final void copy(final InputStream pInputStream, final OutputStream pOutputStream, final int pByteLimit) throws IOException { - if(pByteLimit == StreamUtils.END_OF_STREAM) { + if (pByteLimit == StreamUtils.END_OF_STREAM) { final byte[] buf = new byte[StreamUtils.IO_BUFFER_SIZE]; int read; while((read = pInputStream.read(buf)) != StreamUtils.END_OF_STREAM) { @@ -157,7 +157,7 @@ public static final void copy(final InputStream pInputStream, final OutputStream int read; while((read = pInputStream.read(buf, 0, bufferReadLimit)) != StreamUtils.END_OF_STREAM) { - if(pBytesLeftToRead > read) { + if (pBytesLeftToRead > read) { pOutputStream.write(buf, 0, read); pBytesLeftToRead -= read; } else { @@ -182,7 +182,7 @@ public static final boolean copyAndClose(final InputStream pInputStream, final O } public static final void close(final Closeable pCloseable) { - if(pCloseable != null) { + if (pCloseable != null) { try { pCloseable.close(); } catch (final IOException e) { @@ -192,7 +192,7 @@ public static final void close(final Closeable pCloseable) { } public static final void flushAndCloseStream(final OutputStream pOutputStream) { - if(pOutputStream != null) { + if (pOutputStream != null) { try { pOutputStream.flush(); } catch (final IOException e) { @@ -204,7 +204,7 @@ public static final void flushAndCloseStream(final OutputStream pOutputStream) { } public static final void flushAndCloseWriter(final Writer pWriter) { - if(pWriter != null) { + if (pWriter != null) { try { pWriter.flush(); } catch (final IOException e) { diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java index c44523141..d3e1bd859 100644 --- a/src/org/andengine/util/TextUtils.java +++ b/src/org/andengine/util/TextUtils.java @@ -42,13 +42,13 @@ public final class TextUtils { public static final CharSequence pad(final CharSequence pText, final char pPadChar, final int pLength) { final int padCount = pLength - pText.length(); - if(padCount <= 0) { + if (padCount <= 0) { return pText; } else { final StringBuilder sb = new StringBuilder(); sb.append(pText); - for(int i = padCount - 1; i >= 0; i--) { + for (int i = padCount - 1; i >= 0; i--) { sb.append(pPadChar); } @@ -58,12 +58,12 @@ public static final CharSequence pad(final CharSequence pText, final char pPadCh public static final CharSequence padFront(final CharSequence pText, final char pPadChar, final int pLength) { final int padCount = pLength - pText.length(); - if(padCount <= 0) { + if (padCount <= 0) { return pText; } else { final StringBuilder sb = new StringBuilder(); - for(int i = padCount - 1; i >= 0; i--) { + for (int i = padCount - 1; i >= 0; i--) { sb.append(pPadChar); } sb.append(pText); @@ -100,7 +100,7 @@ public static final ArrayList split(final CharSequence pText, fina public static final > L split(final CharSequence pText, final char pCharacter, final L pResult) { final int partCount = TextUtils.countOccurrences(pText, pCharacter) + 1; - if(partCount == 0) { + if (partCount == 0) { pResult.add(pText); } else { int from = 0; @@ -134,9 +134,9 @@ public static final String formatStackTrace(final StackTraceElement pStackTraceE public static final String formatStackTrace(final StackTraceElement[] pStackTraceElements) { final StringBuilder sb = new StringBuilder(); final int stackTraceElementCount = pStackTraceElements.length; - for(int i = 0; i < stackTraceElementCount; i++) { + for (int i = 0; i < stackTraceElementCount; i++) { sb.append(pStackTraceElements[i]); - if(i < (stackTraceElementCount - 1)) { + if (i < (stackTraceElementCount - 1)) { sb.append('\n'); } } @@ -149,18 +149,18 @@ public static int countCharacters(final List pTexts) { public static int countCharacters(final List pTexts, final boolean pIgnoreWhitespaces) { int characters = 0; - if(pIgnoreWhitespaces) { - for(int i = pTexts.size() - 1; i >= 0; i--) { + if (pIgnoreWhitespaces) { + for (int i = pTexts.size() - 1; i >= 0; i--) { final CharSequence text = pTexts.get(i); - for(int j = text.length() - 1; j >= 0; j--) { + for (int j = text.length() - 1; j >= 0; j--) { final char character = text.charAt(j); - if(!Character.isWhitespace(character)) { + if (!Character.isWhitespace(character)) { characters++; } } } } else { - for(int i = pTexts.size() - 1; i >= 0; i--) { + for (int i = pTexts.size() - 1; i >= 0; i--) { final CharSequence text = pTexts.get(i); characters += text.length(); } diff --git a/src/org/andengine/util/TimeUtils.java b/src/org/andengine/util/TimeUtils.java index 0a851b2c9..d2826800c 100644 --- a/src/org/andengine/util/TimeUtils.java +++ b/src/org/andengine/util/TimeUtils.java @@ -45,7 +45,7 @@ public static final String formatSeconds(final int pSecondsTotal, final StringBu pStringBuilder.append(minutes); pStringBuilder.append(':'); - if(seconds < 10) { + if (seconds < 10) { pStringBuilder.append('0'); } pStringBuilder.append(seconds); diff --git a/src/org/andengine/util/ViewUtils.java b/src/org/andengine/util/ViewUtils.java index b0fae518d..45ada7fc3 100644 --- a/src/org/andengine/util/ViewUtils.java +++ b/src/org/andengine/util/ViewUtils.java @@ -37,11 +37,11 @@ public final class ViewUtils { // Methods // =========================================================== - public static final View inflate(final Context pContext, final int pLayoutID){ + public static final View inflate(final Context pContext, final int pLayoutID) { return LayoutInflater.from(pContext).inflate(pLayoutID, null); } - public static final View inflate(final Context pContext, final int pLayoutID, final ViewGroup pViewGroup){ + public static final View inflate(final Context pContext, final int pLayoutID, final ViewGroup pViewGroup) { return LayoutInflater.from(pContext).inflate(pLayoutID, pViewGroup, true); } diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java index 861160f22..7c9e14925 100644 --- a/src/org/andengine/util/adt/array/ArrayUtils.java +++ b/src/org/andengine/util/adt/array/ArrayUtils.java @@ -65,7 +65,7 @@ public static final T random(final T[] pArray) { } public static final void reverse(final byte[] pArray) { - if(pArray == null) { + if (pArray == null) { return; } int i = 0; @@ -81,7 +81,7 @@ public static final void reverse(final byte[] pArray) { } public static final void reverse(final short[] pArray) { - if(pArray == null) { + if (pArray == null) { return; } int i = 0; @@ -97,7 +97,7 @@ public static final void reverse(final short[] pArray) { } public static final void reverse(final int[] pArray) { - if(pArray == null) { + if (pArray == null) { return; } int i = 0; @@ -113,7 +113,7 @@ public static final void reverse(final int[] pArray) { } public static final void reverse(final long[] pArray) { - if(pArray == null) { + if (pArray == null) { return; } int i = 0; @@ -129,7 +129,7 @@ public static final void reverse(final long[] pArray) { } public static final void reverse(final float[] pArray) { - if(pArray == null) { + if (pArray == null) { return; } int i = 0; @@ -145,7 +145,7 @@ public static final void reverse(final float[] pArray) { } public static final void reverse(final double[] pArray) { - if(pArray == null) { + if (pArray == null) { return; } int i = 0; @@ -161,7 +161,7 @@ public static final void reverse(final double[] pArray) { } public static final void reverse(final Object[] pArray) { - if(pArray == null) { + if (pArray == null) { return; } int i = 0; @@ -178,17 +178,17 @@ public static final void reverse(final Object[] pArray) { public static final boolean equals(final byte[] pArrayA, final int pOffsetA, final byte[] pArrayB, final int pOffsetB, final int pLength) { final int lastIndexA = pOffsetA + pLength; - if(lastIndexA > pArrayA.length) { + if (lastIndexA > pArrayA.length) { throw new ArrayIndexOutOfBoundsException(pArrayA.length); } final int lastIndexB = pOffsetB + pLength; - if(lastIndexB > pArrayB.length) { + if (lastIndexB > pArrayB.length) { throw new ArrayIndexOutOfBoundsException(pArrayB.length); } - for(int a = pOffsetA, b = pOffsetB; a < lastIndexA; a++, b++) { - if(pArrayA[a] != pArrayB[b]) { + for (int a = pOffsetA, b = pOffsetB; a < lastIndexA; a++, b++) { + if (pArrayA[a] != pArrayB[b]) { return false; } } @@ -198,7 +198,7 @@ public static final boolean equals(final byte[] pArrayA, final int pOffsetA, fin public static final byte[] toByteArray(final List pItems) { final byte[] out = new byte[pItems.size()]; - for(int i = out.length - 1; i >= 0; i--) { + for (int i = out.length - 1; i >= 0; i--) { out[i] = pItems.get(i); } return out; @@ -206,7 +206,7 @@ public static final byte[] toByteArray(final List pItems) { public static final char[] toCharArray(final List pItems) { final char[] out = new char[pItems.size()]; - for(int i = out.length - 1; i >= 0; i--) { + for (int i = out.length - 1; i >= 0; i--) { out[i] = pItems.get(i); } return out; @@ -214,7 +214,7 @@ public static final char[] toCharArray(final List pItems) { public static final short[] toShortArray(final List pItems) { final short[] out = new short[pItems.size()]; - for(int i = out.length - 1; i >= 0; i--) { + for (int i = out.length - 1; i >= 0; i--) { out[i] = pItems.get(i); } return out; @@ -222,7 +222,7 @@ public static final short[] toShortArray(final List pItems) { public static final int[] toIntArray(final List pItems) { final int[] out = new int[pItems.size()]; - for(int i = out.length - 1; i >= 0; i--) { + for (int i = out.length - 1; i >= 0; i--) { out[i] = pItems.get(i); } return out; @@ -230,7 +230,7 @@ public static final int[] toIntArray(final List pItems) { public static final long[] toLongArray(final List pItems) { final long[] out = new long[pItems.size()]; - for(int i = out.length - 1; i >= 0; i--) { + for (int i = out.length - 1; i >= 0; i--) { out[i] = pItems.get(i); } return out; @@ -238,7 +238,7 @@ public static final long[] toLongArray(final List pItems) { public static final float[] toFloatArray(final List pItems) { final float[] out = new float[pItems.size()]; - for(int i = out.length - 1; i >= 0; i--) { + for (int i = out.length - 1; i >= 0; i--) { out[i] = pItems.get(i); } return out; @@ -246,15 +246,15 @@ public static final float[] toFloatArray(final List pItems) { public static final double[] toDoubleArray(final List pItems) { final double[] out = new double[pItems.size()]; - for(int i = out.length - 1; i >= 0; i--) { + for (int i = out.length - 1; i >= 0; i--) { out[i] = pItems.get(i); } return out; } public static final boolean contains(final byte[] pItems, final byte pItem) { - for(int i = pItems.length - 1; i >= 0; i--) { - if(pItems[i] == pItem) { + for (int i = pItems.length - 1; i >= 0; i--) { + if (pItems[i] == pItem) { return true; } } @@ -262,8 +262,8 @@ public static final boolean contains(final byte[] pItems, final byte pItem) { } public static final boolean contains(final char[] pItems, final char pItem) { - for(int i = pItems.length - 1; i >= 0; i--) { - if(pItems[i] == pItem) { + for (int i = pItems.length - 1; i >= 0; i--) { + if (pItems[i] == pItem) { return true; } } @@ -271,8 +271,8 @@ public static final boolean contains(final char[] pItems, final char pItem) { } public static final boolean contains(final short[] pItems, final short pItem) { - for(int i = pItems.length - 1; i >= 0; i--) { - if(pItems[i] == pItem) { + for (int i = pItems.length - 1; i >= 0; i--) { + if (pItems[i] == pItem) { return true; } } @@ -280,8 +280,8 @@ public static final boolean contains(final short[] pItems, final short pItem) { } public static final boolean contains(final int[] pItems, final int pItem) { - for(int i = pItems.length - 1; i >= 0; i--) { - if(pItems[i] == pItem) { + for (int i = pItems.length - 1; i >= 0; i--) { + if (pItems[i] == pItem) { return true; } } @@ -289,8 +289,8 @@ public static final boolean contains(final int[] pItems, final int pItem) { } public static final boolean contains(final long[] pItems, final long pItem) { - for(int i = pItems.length - 1; i >= 0; i--) { - if(pItems[i] == pItem) { + for (int i = pItems.length - 1; i >= 0; i--) { + if (pItems[i] == pItem) { return true; } } @@ -298,8 +298,8 @@ public static final boolean contains(final long[] pItems, final long pItem) { } public static final boolean contains(final float[] pItems, final float pItem) { - for(int i = pItems.length - 1; i >= 0; i--) { - if(pItems[i] == pItem) { + for (int i = pItems.length - 1; i >= 0; i--) { + if (pItems[i] == pItem) { return true; } } @@ -307,8 +307,8 @@ public static final boolean contains(final float[] pItems, final float pItem) { } public static final boolean contains(final double[] pItems, final double pItem) { - for(int i = pItems.length - 1; i >= 0; i--) { - if(pItems[i] == pItem) { + for (int i = pItems.length - 1; i >= 0; i--) { + if (pItems[i] == pItem) { return true; } } @@ -322,36 +322,36 @@ public static final boolean contains(final double[] pItems, final double pItem) */ @SuppressWarnings("unchecked") public static T[] join(final Class pClass, final T[]... pArrays) { - if(pArrays == null) { + if (pArrays == null) { return null; } final int arrayCount = pArrays.length; - if(arrayCount == 0) { + if (arrayCount == 0) { return null; - } else if(arrayCount == 1) { + } else if (arrayCount == 1) { return pArrays[0]; } int resultLength = 0; /* Determine length of result. */ - for(int i = pArrays.length - 1; i >= 0; i--) { + for (int i = pArrays.length - 1; i >= 0; i--) { final T[] array = pArrays[i]; - if((array != null) && (array.length > 0)) { + if ((array != null) && (array.length > 0)) { resultLength += array.length; } } - if(resultLength == 0) { + if (resultLength == 0) { return null; } /* Determine length of result. */ final T[] result = (T[]) java.lang.reflect.Array.newInstance(pClass.getComponentType(), resultLength); int offset = 0; - for(int i = 0; i < arrayCount; i++) { + for (int i = 0; i < arrayCount; i++) { final T[] array = pArrays[i]; - if((array != null) && (array.length > 0)) { + if ((array != null) && (array.length > 0)) { System.arraycopy(array, 0, result, offset, array.length); offset += array.length; } @@ -360,8 +360,8 @@ public static T[] join(final Class pClass, final T[]... pArrays) { } public static int idealByteArraySize(final int pSize) { - for(int i = 4; i < 32; i++) { - if(pSize <= ((1 << i) - 12)) { + for (int i = 4; i < 32; i++) { + if (pSize <= ((1 << i) - 12)) { return (1 << i) - 12; } } @@ -403,14 +403,14 @@ public static int idealObjectArraySize(final int pSize) { public static final void sumCummulative(final int[] pValues) { final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { + for (int i = 1; i < valueCount; i++) { pValues[i] = pValues[i-1] + pValues[i]; } } public static final void sumCummulative(final long[] pValues) { final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { + for (int i = 1; i < valueCount; i++) { pValues[i] = pValues[i-1] + pValues[i]; } } @@ -418,7 +418,7 @@ public static final void sumCummulative(final long[] pValues) { public static final void sumCummulative(final long[] pValues, final long pFactor) { pValues[0] = pValues[0] * pFactor; final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { + for (int i = 1; i < valueCount; i++) { pValues[i] = pValues[i-1] + (pValues[i] * pFactor); } } @@ -426,7 +426,7 @@ public static final void sumCummulative(final long[] pValues, final long pFactor public static final void sumCummulative(final long[] pValues, final long pFactor, final long[] pTargetValues) { pTargetValues[0] = pValues[0] * pFactor; final int valueCount = pValues.length; - for(int i = 1; i < valueCount; i++) { + for (int i = 1; i < valueCount; i++) { pTargetValues[i] = pTargetValues[i-1] + (pValues[i] * pFactor); } } @@ -434,7 +434,7 @@ public static final void sumCummulative(final long[] pValues, final long pFactor public static final float sum(final float[] pValues) { float sum = 0; final int valueCount = pValues.length; - for(int i = 0; i < valueCount; i++) { + for (int i = 0; i < valueCount; i++) { sum += pValues[i]; } return sum; @@ -445,13 +445,13 @@ public static final float average(final float[] pValues) { } public static void multiply(final int[] pArray, final float pFactor) { - for(int i = 0; i < pArray.length; i++) { + for (int i = 0; i < pArray.length; i++) { pArray[i] = Math.round(pArray[i] * pFactor); } } public static void multiply(final long[] pArray, final double pFactor) { - for(int i = 0; i < pArray.length; i++) { + for (int i = 0; i < pArray.length; i++) { pArray[i] = Math.round(pArray[i] * pFactor); } } diff --git a/src/org/andengine/util/adt/bit/BitVector.java b/src/org/andengine/util/adt/bit/BitVector.java index f6ca4373b..f4c8e1c1c 100644 --- a/src/org/andengine/util/adt/bit/BitVector.java +++ b/src/org/andengine/util/adt/bit/BitVector.java @@ -26,7 +26,7 @@ public final class BitVector { // =========================================================== private BitVector(final int pCapacity) { - if(pCapacity <= 0) { + if (pCapacity <= 0) { throw new IllegalArgumentException("pCapacity must be > 0."); } this.mCapacity = pCapacity; @@ -35,7 +35,7 @@ private BitVector(final int pCapacity) { final boolean perfectDataFit = pCapacity % DataConstants.BITS_PER_LONG == 0; final int dataCapacity; - if(perfectDataFit) { + if (perfectDataFit) { dataCapacity = pCapacity / DataConstants.BITS_PER_LONG; } else { /* Extra field for overflow bytes. */ @@ -55,7 +55,7 @@ public BitVector(final byte[] pBytes) { final int dataCapacity = data.length; final int lastCompleteDataIndex = (perfectDataFit) ? dataCapacity - 1 : dataCapacity - 2; - for(int i = lastCompleteDataIndex; i >= 0; i--) { + for (int i = lastCompleteDataIndex; i >= 0; i--) { final int bytesOffset = i * DataConstants.BYTES_PER_LONG; data[i] = ((((long)pBytes[bytesOffset + 0]) << 56) & 0xFF00000000000000L) @@ -69,14 +69,14 @@ public BitVector(final byte[] pBytes) { } /* Put overflow bytes into last data field. */ - if(!perfectDataFit) { + if (!perfectDataFit) { long overflowData = 0; final int overflowDataIndex = dataCapacity - 1; final int overflowBytesOffset = overflowDataIndex * DataConstants.BYTES_PER_LONG; final int overflowByteCount = pBytes.length - overflowBytesOffset; - switch(overflowByteCount) { + switch (overflowByteCount) { case 7: overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 6]) << 8) & 0xFF00L); case 6: @@ -106,10 +106,10 @@ public int getCapacity() { } public boolean getBit(final int pPosition) { - if(pPosition < 0) { + if (pPosition < 0) { throw new IllegalArgumentException("pPosition must be >= 0."); } - if(pPosition >= this.mCapacity) { + if (pPosition >= this.mCapacity) { throw new IllegalArgumentException("pPosition must be < capacity."); } @@ -142,18 +142,18 @@ public long getLong(final int pPosition) { public long getBits(final int pPosition, final int pLength) { /* Sanity checks. */ - if(pPosition < 0) { + if (pPosition < 0) { throw new IllegalArgumentException("pPosition must be >= 0."); } - if(pLength < 0) { + if (pLength < 0) { throw new IllegalArgumentException("pLength must be >= 0."); } - if(pPosition + pLength > this.mCapacity) { + if (pPosition + pLength > this.mCapacity) { throw new IllegalArgumentException("pPosition + pLength must be <= capacity."); } /* Early exit. */ - if(pLength == 0) { + if (pLength == 0) { return 0L; } @@ -161,16 +161,16 @@ public long getBits(final int pPosition, final int pLength) { final int offset = pPosition % DataConstants.BITS_PER_LONG; final long data; - if(offset == 0) { + if (offset == 0) { data = this.mData[dataIndex]; - } else if(offset + pLength <= DataConstants.BITS_PER_LONG) { + } else if (offset + pLength <= DataConstants.BITS_PER_LONG) { data = this.mData[dataIndex] << offset; } else { /* Join bits from adjacent data fields. */ data = (this.mData[dataIndex] << offset) | (this.mData[dataIndex + 1] >>> (DataConstants.BITS_PER_LONG - offset)); } - if(pLength == DataConstants.BITS_PER_LONG) { + if (pLength == DataConstants.BITS_PER_LONG) { return data; } else { final int rightShift = DataConstants.BITS_PER_LONG - pLength; @@ -188,9 +188,9 @@ public long getBits(final int pPosition, final int pLength) { public String toString() { final StringBuilder sb = new StringBuilder(); sb.append('['); - for(int i = 0; i < this.mCapacity; i++) { + for (int i = 0; i < this.mCapacity; i++) { sb.append(this.getBit(i) ? '1' : '0'); - if(i % 8 == 7 && i < this.mCapacity -1) { + if (i % 8 == 7 && i < this.mCapacity -1) { sb.append(' '); } } @@ -204,7 +204,7 @@ public String toString() { public byte[] toByteArray() { final int byteArrayLength; - if(this.mCapacity % DataConstants.BITS_PER_BYTE == 0) { + if (this.mCapacity % DataConstants.BITS_PER_BYTE == 0) { byteArrayLength = this.mCapacity / DataConstants.BITS_PER_BYTE; } else { byteArrayLength = (this.mCapacity / DataConstants.BITS_PER_BYTE) + 1; @@ -219,7 +219,7 @@ public byte[] toByteArray() { final int lastCompleteDataIndex = (perfectDataFit) ? dataCapacity - 1 : dataCapacity - 2; int bytesOffset = lastCompleteDataIndex * DataConstants.BYTES_PER_LONG + (DataConstants.BYTES_PER_LONG - 1); - for(int i = lastCompleteDataIndex; i >= 0; i--) { + for (int i = lastCompleteDataIndex; i >= 0; i--) { final long dataField = data[i]; bytes[bytesOffset--] = (byte) ((dataField >> 0) & 0xFF); @@ -233,14 +233,14 @@ public byte[] toByteArray() { } /* Put overflow bytes into last data field. */ - if(!perfectDataFit) { + if (!perfectDataFit) { final int overflowDataIndex = dataCapacity - 1; final long overflowDataField = data[overflowDataIndex]; final int overflowBytesOffset = overflowDataIndex * DataConstants.BYTES_PER_LONG; final int overflowByteCount = bytes.length % DataConstants.BYTES_PER_LONG; - switch(overflowByteCount) { + switch (overflowByteCount) { case 7: bytes[overflowBytesOffset + 6] = (byte) ((overflowDataField >> 8) & 0xFF); case 6: diff --git a/src/org/andengine/util/adt/bounds/FloatBounds.java b/src/org/andengine/util/adt/bounds/FloatBounds.java index a65292fec..35737814c 100644 --- a/src/org/andengine/util/adt/bounds/FloatBounds.java +++ b/src/org/andengine/util/adt/bounds/FloatBounds.java @@ -68,10 +68,10 @@ public void set(final float pXMin, final float pYMin, final float pXMax, final f this.mXMax = pXMax; this.mYMax = pYMax; - if(pXMin > pXMax) { + if (pXMin > pXMax) { throw new IllegalArgumentException("pXMin: '" + pXMin + "' must be smaller or equal to pXMax: '" + pXMax + "'."); } - if(pYMin > pYMax) { + if (pYMin > pYMax) { throw new IllegalArgumentException("pYMin: '" + pYMin + "' must be smaller or equal to pYMax: '" + pYMax + "'."); } } diff --git a/src/org/andengine/util/adt/bounds/IntBounds.java b/src/org/andengine/util/adt/bounds/IntBounds.java index 72edb2859..ea2111f94 100644 --- a/src/org/andengine/util/adt/bounds/IntBounds.java +++ b/src/org/andengine/util/adt/bounds/IntBounds.java @@ -68,10 +68,10 @@ public void set(final int pXMin, final int pYMin, final int pXMax, final int pYM this.mXMax = pXMax; this.mYMax = pYMax; - if(pXMin > pXMax) { + if (pXMin > pXMax) { throw new IllegalArgumentException("pXMin: '" + pXMin + "' must be smaller or equal to pXMax: '" + pXMax + "'."); } - if(pYMin > pYMax) { + if (pYMin > pYMax) { throw new IllegalArgumentException("pYMin: '" + pYMin + "' must be smaller or equal to pYMax: '" + pYMax + "'."); } } diff --git a/src/org/andengine/util/adt/cache/IntLRUCache.java b/src/org/andengine/util/adt/cache/IntLRUCache.java index 3c816e07c..320fcfbbe 100644 --- a/src/org/andengine/util/adt/cache/IntLRUCache.java +++ b/src/org/andengine/util/adt/cache/IntLRUCache.java @@ -70,14 +70,14 @@ public boolean isEmpty() { public V put(final int pKey, final V pValue) { final IntLRUCacheValueHolder existingIntLRUCacheValueHolder = this.mSparseArray.get(pKey); - if(existingIntLRUCacheValueHolder != null) { + if (existingIntLRUCacheValueHolder != null) { /* Just heat up that item. */ this.mIntLRUCacheQueue.moveToTail(existingIntLRUCacheValueHolder.mIntLRUCacheQueueNode); return existingIntLRUCacheValueHolder.mValue; } - if(this.mSize >= this.mCapacity) { + if (this.mSize >= this.mCapacity) { final int deadKey = this.mIntLRUCacheQueue.poll(); this.mSparseArray.remove(deadKey); this.mSize--; @@ -99,7 +99,7 @@ public V put(final int pKey, final V pValue) { public V get(final int pKey) { final IntLRUCacheValueHolder IntLRUCacheValueHolder = this.mSparseArray.get(pKey); - if(IntLRUCacheValueHolder == null) { + if (IntLRUCacheValueHolder == null) { return null; } @@ -112,7 +112,7 @@ public void clear() { while(!this.mIntLRUCacheQueue.isEmpty()) { final int key = this.mIntLRUCacheQueue.poll(); final IntLRUCacheValueHolder lruCacheValueHolder = this.mSparseArray.get(key); - if(lruCacheValueHolder == null) { + if (lruCacheValueHolder == null) { throw new IllegalArgumentException(); } this.mSparseArray.remove(key); @@ -251,7 +251,7 @@ public IntLRUCacheQueueNode add(final int pKey) { } private IntLRUCacheQueueNode add(final IntLRUCacheQueueNode pIntLRUCacheQueueNode) { - if(this.isEmpty()) { + if (this.isEmpty()) { this.mHead = pIntLRUCacheQueueNode; this.mTail = this.mHead; } else { @@ -266,12 +266,12 @@ private IntLRUCacheQueueNode add(final IntLRUCacheQueueNode pIntLRUCacheQueueNod public int poll() { final IntLRUCacheQueueNode head = this.mHead; final int key = this.mHead.mKey; - if(key == 0) { + if (key == 0) { throw new IllegalStateException(); } /* Check if item to poll is the tail. */ - if(this.mHead.mNext == null) { + if (this.mHead.mNext == null) { this.mHead = null; this.mTail = null; } else { @@ -287,14 +287,14 @@ public void moveToTail(final IntLRUCacheQueueNode pIntLRUCacheQueueNode) { final IntLRUCacheQueueNode next = pIntLRUCacheQueueNode.mNext; /* Check if the node already is the tail. */ - if(next == null) { + if (next == null) { return; } else { final IntLRUCacheQueueNode previous = pIntLRUCacheQueueNode.mPrevious; next.mPrevious = previous; /* Check if item to bump is the head. */ - if(previous == null) { + if (previous == null) { this.mHead = next; } else { previous.mNext = next; diff --git a/src/org/andengine/util/adt/cache/LRUCache.java b/src/org/andengine/util/adt/cache/LRUCache.java index 5dfed46db..41237b00c 100644 --- a/src/org/andengine/util/adt/cache/LRUCache.java +++ b/src/org/andengine/util/adt/cache/LRUCache.java @@ -70,14 +70,14 @@ public boolean isEmpty() { public V put(final K pKey, final V pValue) { final LRUCacheValueHolder existingLRUCacheValueHolder = this.mMap.get(pKey); - if(existingLRUCacheValueHolder != null) { + if (existingLRUCacheValueHolder != null) { /* Just heat up that item. */ this.mLRUCacheQueue.moveToTail(existingLRUCacheValueHolder.mLRUCacheQueueNode); return existingLRUCacheValueHolder.mValue; } - if(this.mSize >= this.mCapacity) { + if (this.mSize >= this.mCapacity) { final K deadKey = this.mLRUCacheQueue.poll(); this.mMap.remove(deadKey); this.mSize--; @@ -99,7 +99,7 @@ public V put(final K pKey, final V pValue) { public V get(final K pKey) { final LRUCacheValueHolder lruCacheValueHolder = this.mMap.get(pKey); - if(lruCacheValueHolder == null) { + if (lruCacheValueHolder == null) { return null; } @@ -248,7 +248,7 @@ public LRUCacheQueueNode add(final K pKey) { } private LRUCacheQueueNode add(final LRUCacheQueueNode pLRUCacheQueueNode) { - if(this.isEmpty()) { + if (this.isEmpty()) { this.mHead = pLRUCacheQueueNode; this.mTail = this.mHead; } else { @@ -265,7 +265,7 @@ public K poll() { final K key = this.mHead.mKey; /* Check if item to poll is the tail. */ - if(this.mHead.mNext == null) { + if (this.mHead.mNext == null) { this.mHead = null; this.mTail = null; } else { @@ -281,14 +281,14 @@ public void moveToTail(final LRUCacheQueueNode pLRUCacheQueueNode) { final LRUCacheQueueNode next = pLRUCacheQueueNode.mNext; /* Check if the node already is the tail. */ - if(next == null) { + if (next == null) { return; } else { final LRUCacheQueueNode previous = pLRUCacheQueueNode.mPrevious; next.mPrevious = previous; /* Check if item to bump is the head. */ - if(previous == null) { + if (previous == null) { this.mHead = next; } else { previous.mNext = next; diff --git a/src/org/andengine/util/adt/color/Color.java b/src/org/andengine/util/adt/color/Color.java index d26581eb3..9aee9d699 100644 --- a/src/org/andengine/util/adt/color/Color.java +++ b/src/org/andengine/util/adt/color/Color.java @@ -126,7 +126,7 @@ public final void setRed(final float pRed) { } public final boolean setRedChecking(final float pRed) { - if(this.mRed != pRed) { + if (this.mRed != pRed) { this.mRed = pRed; this.packABGRRed(); @@ -142,7 +142,7 @@ public final void setGreen(final float pGreen) { } public final boolean setGreenChecking(final float pGreen) { - if(this.mGreen != pGreen) { + if (this.mGreen != pGreen) { this.mGreen = pGreen; this.packABGRGreen(); @@ -158,7 +158,7 @@ public final void setBlue(final float pBlue) { } public final boolean setBlueChecking(final float pBlue) { - if(this.mBlue != pBlue) { + if (this.mBlue != pBlue) { this.mBlue = pBlue; this.packABGRBlue(); @@ -174,7 +174,7 @@ public final void setAlpha(final float pAlpha) { } public final boolean setAlphaChecking(final float pAlpha) { - if(this.mAlpha != pAlpha) { + if (this.mAlpha != pAlpha) { this.mAlpha = pAlpha; this.packABGRAlpha(); @@ -192,7 +192,7 @@ public final void set(final float pRed, final float pGreen, final float pBlue) { } public final boolean setChecking(final float pRed, final float pGreen, final float pBlue) { - if((this.mRed != pRed) || (this.mGreen != pGreen) || (this.mBlue != pBlue)) { + if ((this.mRed != pRed) || (this.mGreen != pGreen) || (this.mBlue != pBlue)) { this.mRed = pRed; this.mGreen = pGreen; this.mBlue = pBlue; @@ -213,7 +213,7 @@ public final void set(final float pRed, final float pGreen, final float pBlue, f } public final boolean setChecking(final float pRed, final float pGreen, final float pBlue, final float pAlpha) { - if((this.mAlpha != pAlpha) || (this.mRed != pRed) || (this.mGreen != pGreen) || (this.mBlue != pBlue)) { + if ((this.mAlpha != pAlpha) || (this.mRed != pRed) || (this.mGreen != pGreen) || (this.mBlue != pBlue)) { this.mRed = pRed; this.mGreen = pGreen; this.mBlue = pBlue; @@ -236,7 +236,7 @@ public final void set(final Color pColor) { } public final boolean setChecking(final Color pColor) { - if(this.mABGRPackedInt != pColor.mABGRPackedInt) { + if (this.mABGRPackedInt != pColor.mABGRPackedInt) { this.mRed = pColor.mRed; this.mGreen = pColor.mGreen; this.mBlue = pColor.mBlue; @@ -279,11 +279,11 @@ public int hashCode() { @Override public boolean equals(final Object pObject) { - if(this == pObject) { + if (this == pObject) { return true; - } else if(pObject == null) { + } else if (pObject == null) { return false; - } else if(this.getClass() != pObject.getClass()) { + } else if (this.getClass() != pObject.getClass()) { return false; } diff --git a/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java b/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java index 713f8a386..0056e712d 100644 --- a/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java +++ b/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java @@ -67,7 +67,7 @@ public void close() throws IOException { // =========================================================== private void ensureCapacity(final int pDesiredCapacity) { - if(pDesiredCapacity - this.mData.length > 0) { + if (pDesiredCapacity - this.mData.length > 0) { this.grow(pDesiredCapacity); } } @@ -77,11 +77,11 @@ private void grow(final int pDesiredCapacity) { final int grow = Math.min(this.mMaximumGrow, oldCapacity); int newCapacity = oldCapacity + grow; - if(newCapacity - pDesiredCapacity < 0) { + if (newCapacity - pDesiredCapacity < 0) { newCapacity = pDesiredCapacity; } - if(newCapacity < 0) { - if(pDesiredCapacity < 0) { + if (newCapacity < 0) { + if (pDesiredCapacity < 0) { throw new OutOfMemoryError(); } else { newCapacity = Integer.MAX_VALUE; diff --git a/src/org/andengine/util/adt/list/BooleanArrayList.java b/src/org/andengine/util/adt/list/BooleanArrayList.java index 0c3a91d48..aa82cad77 100644 --- a/src/org/andengine/util/adt/list/BooleanArrayList.java +++ b/src/org/andengine/util/adt/list/BooleanArrayList.java @@ -75,7 +75,7 @@ public boolean remove(final int pIndex) throws ArrayIndexOutOfBoundsException { final boolean oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; - if(numMoved > 0) { + if (numMoved > 0) { System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); } @@ -107,7 +107,7 @@ public int[] toArray() { private void ensureCapacity(final int pCapacity) { final int currentCapacity = this.mItems.length; - if(currentCapacity < pCapacity) { + if (currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final boolean[] newItems = new boolean[newCapacity]; diff --git a/src/org/andengine/util/adt/list/ByteArrayList.java b/src/org/andengine/util/adt/list/ByteArrayList.java index 8a73e3861..7d45a61ba 100644 --- a/src/org/andengine/util/adt/list/ByteArrayList.java +++ b/src/org/andengine/util/adt/list/ByteArrayList.java @@ -75,7 +75,7 @@ public byte remove(final int pIndex) throws ArrayIndexOutOfBoundsException { final byte oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; - if(numMoved > 0) { + if (numMoved > 0) { System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); } @@ -107,7 +107,7 @@ public byte[] toArray() { private void ensureCapacity(final int pCapacity) { final int currentCapacity = this.mItems.length; - if(currentCapacity < pCapacity) { + if (currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final byte[] newItems = new byte[newCapacity]; diff --git a/src/org/andengine/util/adt/list/CharArrayList.java b/src/org/andengine/util/adt/list/CharArrayList.java index ac3b55415..26e23d9b2 100644 --- a/src/org/andengine/util/adt/list/CharArrayList.java +++ b/src/org/andengine/util/adt/list/CharArrayList.java @@ -75,7 +75,7 @@ public char remove(final int pIndex) throws ArrayIndexOutOfBoundsException { final char oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; - if(numMoved > 0) { + if (numMoved > 0) { System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); } @@ -107,7 +107,7 @@ public char[] toArray() { private void ensureCapacity(final int pCapacity) { final int currentCapacity = this.mItems.length; - if(currentCapacity < pCapacity) { + if (currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final char[] newItems = new char[newCapacity]; diff --git a/src/org/andengine/util/adt/list/CircularList.java b/src/org/andengine/util/adt/list/CircularList.java index adbd351bf..8863cc25a 100644 --- a/src/org/andengine/util/adt/list/CircularList.java +++ b/src/org/andengine/util/adt/list/CircularList.java @@ -77,15 +77,15 @@ public void set(final int pIndex, final T pItem) throws IndexOutOfBoundsExceptio @Override public int indexOf(final T pItem) { final int size = this.size(); - if(pItem == null) { - for(int i = 0; i < size; i++) { - if(this.get(i) == null) { + if (pItem == null) { + for (int i = 0; i < size; i++) { + if (this.get(i) == null) { return i; } } } else { - for(int i = 0; i < size; i++) { - if(pItem.equals(this.get(i))) { + for (int i = 0; i < size; i++) { + if (pItem.equals(this.get(i))) { return i; } } @@ -100,37 +100,37 @@ public void add(final int pIndex, final T pItem) { this.ensureCapacity(); final int internalTail = this.encodeToInternalIndex(this.mSize); - if(internalIndex == internalTail) { + if (internalIndex == internalTail) { // nothing to shift, tail is free - } else if(internalIndex == this.mHead) { + } else if (internalIndex == this.mHead) { this.mHead--; - if(this.mHead == -1) { + if (this.mHead == -1) { this.mHead = this.mItems.length - 1; } internalIndex--; - if(internalIndex == -1) { + if (internalIndex == -1) { internalIndex = this.mItems.length - 1; } - } else if((internalIndex < this.mHead) || (this.mHead == 0)) { + } else if ((internalIndex < this.mHead) || (this.mHead == 0)) { System.arraycopy(this.mItems, internalIndex, this.mItems, internalIndex + 1, internalTail - internalIndex); - } else if(internalIndex > internalTail) { + } else if (internalIndex > internalTail) { System.arraycopy(this.mItems, this.mHead, this.mItems, this.mHead - 1, pIndex); this.mHead--; - if(this.mHead == -1) { + if (this.mHead == -1) { this.mHead = this.mItems.length - 1; } internalIndex--; - if(internalIndex == -1) { + if (internalIndex == -1) { internalIndex = this.mItems.length - 1; } - } else if(pIndex < (this.mSize >> 1)) { + } else if (pIndex < (this.mSize >> 1)) { System.arraycopy(this.mItems, this.mHead, this.mItems, this.mHead - 1, pIndex); this.mHead--; - if(this.mHead == -1) { + if (this.mHead == -1) { this.mHead = this.mItems.length - 1; } internalIndex--; - if(internalIndex == -1) { + if (internalIndex == -1) { internalIndex = this.mItems.length - 1; } } else { @@ -153,7 +153,7 @@ public T removeLast() { @Override public boolean remove(final T pItem) { final int index = this.indexOf(pItem); - if(index >= 0) { + if (index >= 0) { this.remove(index); return true; } else { @@ -169,29 +169,29 @@ public T remove(final int pIndex) { final int internalTail = this.encodeToInternalIndex(this.mSize - 1); - if(internalIndex == internalTail) { + if (internalIndex == internalTail) { this.mItems[internalTail] = null; - } else if(internalIndex == this.mHead) { + } else if (internalIndex == this.mHead) { this.mItems[this.mHead] = null; this.mHead++; - if(this.mHead == this.mItems.length) { + if (this.mHead == this.mItems.length) { this.mHead = 0; } - } else if(internalIndex < this.mHead) { + } else if (internalIndex < this.mHead) { System.arraycopy(this.mItems, internalIndex + 1, this.mItems, internalIndex, internalTail - internalIndex); this.mItems[internalTail] = null; - } else if(internalIndex > internalTail) { + } else if (internalIndex > internalTail) { System.arraycopy(this.mItems, this.mHead, this.mItems, this.mHead + 1, pIndex); this.mItems[this.mHead] = null; this.mHead++; - if(this.mHead == this.mItems.length) { + if (this.mHead == this.mItems.length) { this.mHead = 0; } - } else if(pIndex < (this.mSize >> 1)) { + } else if (pIndex < (this.mSize >> 1)) { System.arraycopy(this.mItems, this.mHead, this.mItems, this.mHead + 1, pIndex); this.mItems[this.mHead] = null; this.mHead++; - if(this.mHead == this.mItems.length) { + if (this.mHead == this.mItems.length) { this.mHead = 0; } } else { @@ -213,7 +213,7 @@ public void clear() { final int tail = this.mHead + this.mSize; final int capacity = this.mItems.length; /* Check if items can be blacked out in one or two calls. */ - if(tail <= capacity) { + if (tail <= capacity) { Arrays.fill(this.mItems, this.mHead, tail, null); } else { final int headToCapacity = capacity - this.mHead; @@ -232,7 +232,7 @@ public void clear() { private void ensureCapacity() { final int currentCapacity = this.mItems.length; - if(this.mSize == currentCapacity) { + if (this.mSize == currentCapacity) { final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final Object newItems[] = new Object[newCapacity]; @@ -246,7 +246,7 @@ private void ensureCapacity() { private int encodeToInternalIndex(final int pIndex) { int internalIndex = this.mHead + pIndex; - if(internalIndex >= this.mItems.length) { + if (internalIndex >= this.mItems.length) { internalIndex -= this.mItems.length; } return internalIndex; diff --git a/src/org/andengine/util/adt/list/DoubleArrayList.java b/src/org/andengine/util/adt/list/DoubleArrayList.java index f447f4f9f..df57c4ea0 100644 --- a/src/org/andengine/util/adt/list/DoubleArrayList.java +++ b/src/org/andengine/util/adt/list/DoubleArrayList.java @@ -75,7 +75,7 @@ public double remove(final int pIndex) throws ArrayIndexOutOfBoundsException { final double oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; - if(numMoved > 0) { + if (numMoved > 0) { System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); } @@ -107,7 +107,7 @@ public double[] toArray() { private void ensureCapacity(final int pCapacity) { final int currentCapacity = this.mItems.length; - if(currentCapacity < pCapacity) { + if (currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final double[] newItems = new double[newCapacity]; diff --git a/src/org/andengine/util/adt/list/FloatArrayList.java b/src/org/andengine/util/adt/list/FloatArrayList.java index 288d3de08..b9d91958d 100644 --- a/src/org/andengine/util/adt/list/FloatArrayList.java +++ b/src/org/andengine/util/adt/list/FloatArrayList.java @@ -75,7 +75,7 @@ public float remove(final int pIndex) throws ArrayIndexOutOfBoundsException { final float oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; - if(numMoved > 0) { + if (numMoved > 0) { System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); } @@ -107,7 +107,7 @@ public float[] toArray() { private void ensureCapacity(final int pCapacity) { final int currentCapacity = this.mItems.length; - if(currentCapacity < pCapacity) { + if (currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final float[] newItems = new float[newCapacity]; diff --git a/src/org/andengine/util/adt/list/IntArrayList.java b/src/org/andengine/util/adt/list/IntArrayList.java index a48750de8..76902c747 100644 --- a/src/org/andengine/util/adt/list/IntArrayList.java +++ b/src/org/andengine/util/adt/list/IntArrayList.java @@ -75,7 +75,7 @@ public int remove(final int pIndex) throws ArrayIndexOutOfBoundsException { final int oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; - if(numMoved > 0) { + if (numMoved > 0) { System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); } @@ -107,7 +107,7 @@ public int[] toArray() { private void ensureCapacity(final int pCapacity) { final int currentCapacity = this.mItems.length; - if(currentCapacity < pCapacity) { + if (currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final int[] newItems = new int[newCapacity]; diff --git a/src/org/andengine/util/adt/list/ListUtils.java b/src/org/andengine/util/adt/list/ListUtils.java index 0d7134d73..0a57c209c 100644 --- a/src/org/andengine/util/adt/list/ListUtils.java +++ b/src/org/andengine/util/adt/list/ListUtils.java @@ -56,7 +56,7 @@ public static final ArrayList toList(final T pItem) { public static final ArrayList toList(final T ... pItems) { final ArrayList out = new ArrayList(); final int itemCount = pItems.length; - for(int i = 0; i < itemCount; i++) { + for (int i = 0; i < itemCount; i++) { out.add(pItems[i]); } return out; diff --git a/src/org/andengine/util/adt/list/LongArrayList.java b/src/org/andengine/util/adt/list/LongArrayList.java index 34ff118e6..e6c9fc4ad 100644 --- a/src/org/andengine/util/adt/list/LongArrayList.java +++ b/src/org/andengine/util/adt/list/LongArrayList.java @@ -75,7 +75,7 @@ public long remove(final int pIndex) throws ArrayIndexOutOfBoundsException { final long oldValue = this.mItems[pIndex]; final int numMoved = this.mSize - pIndex - 1; - if(numMoved > 0) { + if (numMoved > 0) { System.arraycopy(this.mItems, pIndex + 1, this.mItems, pIndex, numMoved); } @@ -107,7 +107,7 @@ public long[] toArray() { private void ensureCapacity(final int pCapacity) { final int currentCapacity = this.mItems.length; - if(currentCapacity < pCapacity) { + if (currentCapacity < pCapacity) { /* Increase array size. */ final int newCapacity = ((currentCapacity * 3) >> 1) + 1; final long[] newItems = new long[newCapacity]; diff --git a/src/org/andengine/util/adt/list/ShiftList.java b/src/org/andengine/util/adt/list/ShiftList.java index dead363b9..3ff6ac587 100644 --- a/src/org/andengine/util/adt/list/ShiftList.java +++ b/src/org/andengine/util/adt/list/ShiftList.java @@ -73,15 +73,15 @@ public void set(final int pIndex, final T pItem) throws IndexOutOfBoundsExceptio @Override public int indexOf(final T pItem) { - if(pItem == null) { - for(int i = this.mHead; i < this.mTail; i++) { - if(this.mItems[i] == null) { + if (pItem == null) { + for (int i = this.mHead; i < this.mTail; i++) { + if (this.mItems[i] == null) { return i - this.mHead; } } } else { - for(int i = this.mHead; i < this.mTail; i++) { - if(pItem.equals(this.mItems[i])) { + for (int i = this.mHead; i < this.mTail; i++) { + if (pItem.equals(this.mItems[i])) { return i - this.mHead; } } @@ -92,7 +92,7 @@ public int indexOf(final T pItem) { @SuppressWarnings("unchecked") @Override public T peek() { - if(this.mHead == this.mTail) { + if (this.mHead == this.mTail) { return null; } else { return (T) this.mItems[this.mHead]; @@ -102,13 +102,13 @@ public T peek() { @SuppressWarnings("unchecked") @Override public T poll() { - if(this.mHead == this.mTail) { + if (this.mHead == this.mTail) { return null; } else { final T item = (T) this.mItems[this.mHead]; this.mItems[this.mHead] = null; this.mHead++; - if(this.mHead == this.mTail) { + if (this.mHead == this.mTail) { this.mHead = 0; this.mTail = 0; } @@ -127,7 +127,7 @@ public void enter(final T pItem) { public void enter(final int pIndex, final T pItem) throws ArrayIndexOutOfBoundsException { final int size = this.mTail - this.mHead; /* Check which side to shift to is more efficient. */ - if(pIndex < (size >> 1)) { + if (pIndex < (size >> 1)) { /* Shift left. */ this.enterShiftingLeft(pIndex, pItem); } else { @@ -141,7 +141,7 @@ private void enterShiftingRight(final int pIndex, final T pItem, final int size) /* Check if items need to be copied. */ final int shiftAmount = size - pIndex; - if(shiftAmount == 0) { + if (shiftAmount == 0) { /* Nothing to shift, we can insert at the tail. */ this.mItems[this.mTail] = pItem; } else { @@ -160,7 +160,7 @@ private void enterShiftingLeft(final int pIndex, final T pItem) { this.mHead--; /* Check if items need to be copied. */ - if(pIndex == 0) { + if (pIndex == 0) { /* Nothing to shift, we can insert at the head. */ this.mItems[this.mHead] = pItem; } else { @@ -194,7 +194,7 @@ public T removeLast() { @Override public boolean remove(final T pItem) { final int index = this.indexOf(pItem); - if(index >= 0) { + if (index >= 0) { this.remove(index); return true; } else { @@ -212,9 +212,9 @@ public T remove(final int pIndex) throws ArrayIndexOutOfBoundsException { /* Determine which side to shift to makes more sense. */ final int center = size >> 1; - if(pIndex < center) { + if (pIndex < center) { /* Shift right. */ - if(internalIndex > this.mHead) { + if (internalIndex > this.mHead) { System.arraycopy(this.mItems, this.mHead, this.mItems, this.mHead + 1, pIndex); } this.mItems[this.mHead] = null; @@ -222,7 +222,7 @@ public T remove(final int pIndex) throws ArrayIndexOutOfBoundsException { } else { /* Shift left. */ final int shiftAmount = size - pIndex - 1; - if(shiftAmount > 0) { + if (shiftAmount > 0) { System.arraycopy(this.mItems, internalIndex + 1, this.mItems, internalIndex, shiftAmount); } this.mTail--; @@ -250,7 +250,7 @@ public void clear() { public void shift() { final int size = this.mTail - this.mHead; - if(size == 0) { + if (size == 0) { this.mHead = 0; this.mTail = 0; } else { @@ -260,7 +260,7 @@ public void shift() { /* Null out old item references, ensuring not to overwrite just copied ones. */ final int start = Math.max(size, this.mHead); final int end = Math.max(start, this.mTail); - if(start < end) { + if (start < end) { Arrays.fill(this.mItems, start, end, null); } @@ -272,11 +272,11 @@ public void shift() { private void ensureShiftableRight() { final int currentCapacity = this.mItems.length; /* Check if tail reached the end. */ - if(this.mTail == currentCapacity) { + if (this.mTail == currentCapacity) { final int size = this.mTail - this.mHead; /* Check if space problem can be solved by shifting. */ - if(size != currentCapacity) { + if (size != currentCapacity) { this.shift(); } else { /* Increase array capacity. */ @@ -290,13 +290,13 @@ private void ensureShiftableRight() { private void ensureShiftableLeft() { /* Check if there is room at the head. */ - if(this.mHead == 0) { + if (this.mHead == 0) { final int size = this.mTail - this.mHead; final int currentCapacity = this.mItems.length; /* Check if space problem can be solved by shifting. */ - if(size < currentCapacity) { - if(size == 0) { + if (size < currentCapacity) { + if (size == 0) { this.mHead = 1; this.mTail = 1; } else { diff --git a/src/org/andengine/util/adt/list/SmartList.java b/src/org/andengine/util/adt/list/SmartList.java index 47f8b644e..86d04b783 100644 --- a/src/org/andengine/util/adt/list/SmartList.java +++ b/src/org/andengine/util/adt/list/SmartList.java @@ -62,9 +62,9 @@ public T getLast() throws IndexOutOfBoundsException { public T get(final IMatcher pMatcher) { final int size = this.size(); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { final T item = this.get(i); - if(pMatcher.matches(item)) { + if (pMatcher.matches(item)) { return item; } } @@ -85,15 +85,15 @@ public T removeLast() throws IndexOutOfBoundsException { */ public boolean remove(final T pItem, final ParameterCallable pParameterCallable) { final boolean removed = this.remove(pItem); - if(removed) { + if (removed) { pParameterCallable.call(pItem); } return removed; } public T remove(final IMatcher pMatcher) { - for(int i = 0; i < this.size(); i++) { - if(pMatcher.matches(this.get(i))) { + for (int i = 0; i < this.size(); i++) { + if (pMatcher.matches(this.get(i))) { return this.remove(i); } } @@ -101,8 +101,8 @@ public T remove(final IMatcher pMatcher) { } public T remove(final IMatcher pMatcher, final ParameterCallable pParameterCallable) { - for(int i = this.size() - 1; i >= 0; i--) { - if(pMatcher.matches(this.get(i))) { + for (int i = this.size() - 1; i >= 0; i--) { + if (pMatcher.matches(this.get(i))) { final T removed = this.remove(i); pParameterCallable.call(removed); return removed; @@ -113,8 +113,8 @@ public T remove(final IMatcher pMatcher, final ParameterCallable pParamete public boolean removeAll(final IMatcher pMatcher) { boolean result = false; - for(int i = this.size() - 1; i >= 0; i--) { - if(pMatcher.matches(this.get(i))) { + for (int i = this.size() - 1; i >= 0; i--) { + if (pMatcher.matches(this.get(i))) { this.remove(i); result = true; } @@ -128,8 +128,8 @@ public boolean removeAll(final IMatcher pMatcher) { */ public boolean removeAll(final IMatcher pMatcher, final ParameterCallable pParameterCallable) { boolean result = false; - for(int i = this.size() - 1; i >= 0; i--) { - if(pMatcher.matches(this.get(i))) { + for (int i = this.size() - 1; i >= 0; i--) { + if (pMatcher.matches(this.get(i))) { final T removed = this.remove(i); pParameterCallable.call(removed); result = true; @@ -139,7 +139,7 @@ public boolean removeAll(final IMatcher pMatcher, final ParameterCallable } public void clear(final ParameterCallable pParameterCallable) { - for(int i = this.size() - 1; i >= 0; i--) { + for (int i = this.size() - 1; i >= 0; i--) { final T removed = this.remove(i); pParameterCallable.call(removed); } @@ -147,9 +147,9 @@ public void clear(final ParameterCallable pParameterCallable) { public int indexOf(final IMatcher pMatcher) { final int size = this.size(); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { final T item = this.get(i); - if(pMatcher.matches(item)) { + if (pMatcher.matches(item)) { return i; } } @@ -157,9 +157,9 @@ public int indexOf(final IMatcher pMatcher) { } public int lastIndexOf(final IMatcher pMatcher) { - for(int i = this.size() - 1; i >= 0; i--) { + for (int i = this.size() - 1; i >= 0; i--) { final T item = this.get(i); - if(pMatcher.matches(item)) { + if (pMatcher.matches(item)) { return i; } } @@ -172,9 +172,9 @@ public ArrayList query(final IMatcher pMatcher) { public > L query(final IMatcher pMatcher, final L pResult) { final int size = this.size(); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { final T item = this.get(i); - if(pMatcher.matches(item)) { + if (pMatcher.matches(item)) { pResult.add(item); } } @@ -189,9 +189,9 @@ public ArrayList queryForSubclass(final IMatcher pMatcher) { @SuppressWarnings("unchecked") public , S extends T> L queryForSubclass(final IMatcher pMatcher, final L pResult) { final int size = this.size(); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { final T item = this.get(i); - if(pMatcher.matches(item)) { + if (pMatcher.matches(item)) { pResult.add((S)item); } } @@ -200,16 +200,16 @@ public , S extends T> L queryForSubclass(final IMatcher pMa } public void call(final ParameterCallable pParameterCallable) { - for(int i = this.size() - 1; i >= 0; i--) { + for (int i = this.size() - 1; i >= 0; i--) { final T item = this.get(i); pParameterCallable.call(item); } } public void call(final IMatcher pMatcher, final ParameterCallable pParameterCallable) { - for(int i = this.size() - 1; i >= 0; i--) { + for (int i = this.size() - 1; i >= 0; i--) { final T item = this.get(i); - if(pMatcher.matches(item)) { + if (pMatcher.matches(item)) { pParameterCallable.call(item); } } diff --git a/src/org/andengine/util/adt/list/SortedList.java b/src/org/andengine/util/adt/list/SortedList.java index 26d2ae740..d9a55718e 100644 --- a/src/org/andengine/util/adt/list/SortedList.java +++ b/src/org/andengine/util/adt/list/SortedList.java @@ -72,7 +72,7 @@ public void add(final int pIndex, final T pItem) { @Override public void add(final T pItem) { final int index = this.binarySearch(pItem, true); - if(index < 0) { + if (index < 0) { this.mList.add(ListUtils.encodeInsertionIndex(index), pItem); } else { this.mList.add(index, pItem); @@ -91,12 +91,12 @@ public T removeLast() { @Override public boolean remove(final T pItem) { - if(pItem == null) { + if (pItem == null) { return this.mList.remove(pItem); } final int index = this.binarySearch(pItem, false); - if(index >= 0) { + if (index >= 0) { this.mList.remove(index); return true; } else { @@ -126,7 +126,7 @@ public void clear() { private int binarySearch(final T pItem, final boolean pReturnSequenceEndIfNoEqualItemFound) { final int size = this.mList.size(); final int guess = this.binarySearch(0, size, pItem); - if(guess >= 0) { + if (guess >= 0) { return this.scanForEqualItem(0, size, guess, pItem, pReturnSequenceEndIfNoEqualItemFound); } else { return guess; @@ -142,9 +142,9 @@ private int binarySearch(final int pStart, final int pEnd, final T pItem) { final T midVal = this.mList.get(mid); final int diff = pItem.compareTo(midVal); - if(diff > 0) { + if (diff > 0) { low = mid + 1; - } else if(diff < 0) { + } else if (diff < 0) { high = mid - 1; } else { return mid; @@ -174,16 +174,16 @@ private int scanForEqualItem(final int pStart, final int pEnd, final int pGuess, /* From the beginning of the sequence, advance until the first item equals pItem or the end has been reached. */ while(i < pEnd) { final T item = this.mList.get(i); - if(i <= pGuess) { + if (i <= pGuess) { /* Since the compartTo check has already been performed, only equals needs to be checked. */ - if(pItem.equals(item)) { + if (pItem.equals(item)) { /* Item found. */ return i; } } else { /* Check if the sequence is still ongoing. */ - if(pItem.compareTo(item) == 0) { - if(pItem.equals(item)) { + if (pItem.compareTo(item) == 0) { + if (pItem.equals(item)) { /* Item found. */ return i; } @@ -195,7 +195,7 @@ private int scanForEqualItem(final int pStart, final int pEnd, final int pGuess, i++; } - if(pReturnSequenceEndIfNoEqualItemFound) { + if (pReturnSequenceEndIfNoEqualItemFound) { return i; } else { return SortedList.INDEX_INVALID; diff --git a/src/org/andengine/util/adt/list/UniqueList.java b/src/org/andengine/util/adt/list/UniqueList.java index 7249a4d05..290c27a71 100644 --- a/src/org/andengine/util/adt/list/UniqueList.java +++ b/src/org/andengine/util/adt/list/UniqueList.java @@ -65,7 +65,7 @@ public int indexOf(final T pItem) { @Deprecated public void add(final int pIndex, final T pItem) { final int index = this.indexOf(pItem); - if(index < 0) { + if (index < 0) { this.mList.add(pItem); } } @@ -73,7 +73,7 @@ public void add(final int pIndex, final T pItem) { @Override public void add(final T pItem) { final int index = this.indexOf(pItem); - if(index < 0) { + if (index < 0) { this.mList.add(ListUtils.encodeInsertionIndex(index), pItem); } } diff --git a/src/org/andengine/util/adt/map/IntLookupMap.java b/src/org/andengine/util/adt/map/IntLookupMap.java index 75e1960ef..302cba8a6 100644 --- a/src/org/andengine/util/adt/map/IntLookupMap.java +++ b/src/org/andengine/util/adt/map/IntLookupMap.java @@ -48,7 +48,7 @@ public T item(final int pValue) { @Override public int value(final T pName) { final Integer value = this.mItemToValueMapping.get(pName); - if(value == null) { + if (value == null) { return -1; } else { return value.intValue(); diff --git a/src/org/andengine/util/adt/map/Library.java b/src/org/andengine/util/adt/map/Library.java index b1062345c..b64c47d74 100644 --- a/src/org/andengine/util/adt/map/Library.java +++ b/src/org/andengine/util/adt/map/Library.java @@ -43,7 +43,7 @@ public T get(final int pID) { public void put(final int pID, final T pItem) { final T item = this.mItems.get(pID); - if(item == null) { + if (item == null) { this.mItems.put(pID, pItem); } else { throw new IllegalArgumentException("ID: '" + pID + "' is already associated with item: '" + item.toString() + "'."); diff --git a/src/org/andengine/util/adt/map/MultiKey.java b/src/org/andengine/util/adt/map/MultiKey.java index 4e4a8717d..6404b19b8 100644 --- a/src/org/andengine/util/adt/map/MultiKey.java +++ b/src/org/andengine/util/adt/map/MultiKey.java @@ -45,10 +45,10 @@ public K[] getKeys() { @Override public boolean equals(final Object pOther) { - if(pOther == this) { + if (pOther == this) { return true; } - if(pOther instanceof MultiKey) { + if (pOther instanceof MultiKey) { final MultiKey otherMultiKey = (MultiKey) pOther; return Arrays.equals(this.mKeys, otherMultiKey.mKeys); } @@ -57,8 +57,8 @@ public boolean equals(final Object pOther) { public static int hash(final Object ... pKeys) { int hashCode = 0; - for(final Object key : pKeys) { - if(key != null) { + for (final Object key : pKeys) { + if (key != null) { hashCode ^= key.hashCode(); } } diff --git a/src/org/andengine/util/adt/map/MultiKeyHashMap.java b/src/org/andengine/util/adt/map/MultiKeyHashMap.java index 06ad365ba..81ab63e13 100644 --- a/src/org/andengine/util/adt/map/MultiKeyHashMap.java +++ b/src/org/andengine/util/adt/map/MultiKeyHashMap.java @@ -59,12 +59,12 @@ private boolean isEqualKey(final K[] pKeysA, final K[] pKeysB) { for (int i = 0; i < pKeysA.length; i++) { final K keyA = pKeysA[i]; final K keyB = pKeysB[i]; - if(keyA == null) { - if(keyB != null) { + if (keyA == null) { + if (keyB != null) { return false; } } else { - if(!keyA.equals(keyB)) { + if (!keyA.equals(keyB)) { return false; } } diff --git a/src/org/andengine/util/adt/map/SparseArrayUtils.java b/src/org/andengine/util/adt/map/SparseArrayUtils.java index 7999636e3..78914efd3 100644 --- a/src/org/andengine/util/adt/map/SparseArrayUtils.java +++ b/src/org/andengine/util/adt/map/SparseArrayUtils.java @@ -50,9 +50,9 @@ public static final String toString(final SparseBooleanArray pSparseBooleanArray final int size = pSparseBooleanArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseBooleanArray.keyAt(i)).append('=').append(pSparseBooleanArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -66,9 +66,9 @@ public static final String toString(final SparseByteArray pSparseByteArray) { final int size = pSparseByteArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseByteArray.keyAt(i)).append('=').append(pSparseByteArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -82,9 +82,9 @@ public static final String toString(final SparseCharArray pSparseCharArray) { final int size = pSparseCharArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseCharArray.keyAt(i)).append('=').append(pSparseCharArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -98,9 +98,9 @@ public static final String toString(final SparseIntArray pSparseIntArray) { final int size = pSparseIntArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseIntArray.keyAt(i)).append('=').append(pSparseIntArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -114,9 +114,9 @@ public static final String toString(final SparseLongArray pSparseLongArray) { final int size = pSparseLongArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseLongArray.keyAt(i)).append('=').append(pSparseLongArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -130,9 +130,9 @@ public static final String toString(final SparseFloatArray pSparseFloatArray) { final int size = pSparseFloatArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseFloatArray.keyAt(i)).append('=').append(pSparseFloatArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -146,9 +146,9 @@ public static final String toString(final SparseDoubleArray pSparseDoubleArray) final int size = pSparseDoubleArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseDoubleArray.keyAt(i)).append('=').append(pSparseDoubleArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -162,9 +162,9 @@ public static final String toString(final SparseArray pSparseArray) { final int size = pSparseArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pSparseArray.keyAt(i)).append('=').append(pSparseArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } @@ -178,9 +178,9 @@ public static final String toString(final LongSparseArray pLongSparseArray) { final int size = pLongSparseArray.size(); stringBuilder.append('{'); - for(int i = 0; i < size; i++) { + for (int i = 0; i < size; i++) { stringBuilder.append(pLongSparseArray.keyAt(i)).append('=').append(pLongSparseArray.valueAt(i)); - if(i < (size - 1)) { + if (i < (size - 1)) { stringBuilder.append(", "); } } diff --git a/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java b/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java index 4e00bcb5f..622cded42 100644 --- a/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java +++ b/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java @@ -50,7 +50,7 @@ public void setCallback(final Callback pCallback) { public void run() { this.mEntity.detachSelf(); - if(this.mCallback != null) { + if (this.mCallback != null) { this.mCallback.onCallback(this.mEntity); } } diff --git a/src/org/andengine/util/adt/pool/GenericPool.java b/src/org/andengine/util/adt/pool/GenericPool.java index a03420648..96a143057 100644 --- a/src/org/andengine/util/adt/pool/GenericPool.java +++ b/src/org/andengine/util/adt/pool/GenericPool.java @@ -47,10 +47,10 @@ public GenericPool(final int pInitialSize, final int pGrowth) { } public GenericPool(final int pInitialSize, final int pGrowth, final int pAvailableItemsMaximum) { - if(pGrowth <= 0) { + if (pGrowth <= 0) { throw new IllegalArgumentException("pGrowth must be greater than 0!"); } - if(pAvailableItemsMaximum < 0) { + if (pAvailableItemsMaximum < 0) { throw new IllegalArgumentException("pAvailableItemsMaximum must be at least 0!"); } @@ -58,7 +58,7 @@ public GenericPool(final int pInitialSize, final int pGrowth, final int pAvailab this.mAvailableItemCountMaximum = pAvailableItemsMaximum; this.mAvailableItems = new ArrayList(pInitialSize); - if(pInitialSize > 0) { + if (pInitialSize > 0) { this.batchAllocatePoolItems(pInitialSize); } } @@ -111,11 +111,11 @@ public synchronized void batchAllocatePoolItems(final int pCount) { final ArrayList availableItems = this.mAvailableItems; int allocationCount = this.mAvailableItemCountMaximum - availableItems.size(); - if(pCount < allocationCount) { + if (pCount < allocationCount) { allocationCount = pCount; } - for(int i = allocationCount - 1; i >= 0; i--) { + for (int i = allocationCount - 1; i >= 0; i--) { availableItems.add(this.onHandleAllocatePoolItem()); } } @@ -123,16 +123,16 @@ public synchronized void batchAllocatePoolItems(final int pCount) { public synchronized T obtainPoolItem() { final T item; - if(this.mAvailableItems.size() > 0) { + if (this.mAvailableItems.size() > 0) { item = this.mAvailableItems.remove(this.mAvailableItems.size() - 1); } else { - if(this.mGrowth == 1 || this.mAvailableItemCountMaximum == 0) { + if (this.mGrowth == 1 || this.mAvailableItemCountMaximum == 0) { item = this.onHandleAllocatePoolItem(); } else { this.batchAllocatePoolItems(this.mGrowth); item = this.mAvailableItems.remove(this.mAvailableItems.size() - 1); } - if(BuildConfig.DEBUG) { + if (BuildConfig.DEBUG) { Debug.v(this.getClass().getName() + "<" + item.getClass().getSimpleName() +"> was exhausted, with " + this.mUnrecycledItemCount + " item not yet recycled. Allocated " + this.mGrowth + " more."); } } @@ -143,19 +143,19 @@ public synchronized T obtainPoolItem() { } public synchronized void recyclePoolItem(final T pItem) { - if(pItem == null) { + if (pItem == null) { throw new IllegalArgumentException("Cannot recycle null item!"); } this.onHandleRecycleItem(pItem); - if(this.mAvailableItems.size() < this.mAvailableItemCountMaximum) { + if (this.mAvailableItems.size() < this.mAvailableItemCountMaximum) { this.mAvailableItems.add(pItem); } this.mUnrecycledItemCount--; - if(this.mUnrecycledItemCount < 0) { + if (this.mUnrecycledItemCount < 0) { Debug.e("More items recycled than obtained!"); } } diff --git a/src/org/andengine/util/adt/pool/MultiPool.java b/src/org/andengine/util/adt/pool/MultiPool.java index 7da1a94d1..ccf6234c2 100644 --- a/src/org/andengine/util/adt/pool/MultiPool.java +++ b/src/org/andengine/util/adt/pool/MultiPool.java @@ -42,7 +42,7 @@ public void registerPool(final int pID, final GenericPool pPool) { public T obtainPoolItem(final int pID) { final GenericPool pool = this.mPools.get(pID); - if(pool == null) { + if (pool == null) { return null; } else { return pool.obtainPoolItem(); @@ -51,7 +51,7 @@ public T obtainPoolItem(final int pID) { public void recyclePoolItem(final int pID, final T pItem) { final GenericPool pool = this.mPools.get(pID); - if(pool != null) { + if (pool != null) { pool.recyclePoolItem(pItem); } } diff --git a/src/org/andengine/util/adt/pool/Pool.java b/src/org/andengine/util/adt/pool/Pool.java index aae137b3e..45150a487 100644 --- a/src/org/andengine/util/adt/pool/Pool.java +++ b/src/org/andengine/util/adt/pool/Pool.java @@ -68,11 +68,11 @@ protected void onHandleRecycleItem(final T pPoolItem) { @Override public synchronized void recyclePoolItem(final T pPoolItem) { - if(pPoolItem.mParent == null) { + if (pPoolItem.mParent == null) { throw new IllegalArgumentException("PoolItem not assigned to a pool!"); - } else if(!pPoolItem.isFromPool(this)) { + } else if (!pPoolItem.isFromPool(this)) { throw new IllegalArgumentException("PoolItem from another pool!"); - } else if(pPoolItem.isRecycled()) { + } else if (pPoolItem.isRecycled()) { throw new IllegalArgumentException("PoolItem already recycled!"); } diff --git a/src/org/andengine/util/adt/pool/PoolItem.java b/src/org/andengine/util/adt/pool/PoolItem.java index 95e209df2..47a913211 100644 --- a/src/org/andengine/util/adt/pool/PoolItem.java +++ b/src/org/andengine/util/adt/pool/PoolItem.java @@ -58,7 +58,7 @@ protected void onObtain() { } public void recycle() { - if(this.mParent == null) { + if (this.mParent == null) { throw new IllegalStateException("Item already recycled!"); } diff --git a/src/org/andengine/util/adt/pool/PoolUpdateHandler.java b/src/org/andengine/util/adt/pool/PoolUpdateHandler.java index 9bb277543..1dd732873 100644 --- a/src/org/andengine/util/adt/pool/PoolUpdateHandler.java +++ b/src/org/andengine/util/adt/pool/PoolUpdateHandler.java @@ -110,9 +110,9 @@ public T obtainPoolItem() { } public void postPoolItem(final T pPoolItem) { - if(pPoolItem == null) { + if (pPoolItem == null) { throw new IllegalArgumentException("PoolItem already recycled!"); - } else if(!this.mPool.ownsPoolItem(pPoolItem)) { + } else if (!this.mPool.ownsPoolItem(pPoolItem)) { throw new IllegalArgumentException("PoolItem from another pool!"); } diff --git a/src/org/andengine/util/adt/queue/CircularQueue.java b/src/org/andengine/util/adt/queue/CircularQueue.java index 5cec43b16..7c8ce92cb 100644 --- a/src/org/andengine/util/adt/queue/CircularQueue.java +++ b/src/org/andengine/util/adt/queue/CircularQueue.java @@ -39,7 +39,7 @@ public CircularQueue(final int pInitialCapacity) { @Override public T peek() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.get(0); @@ -48,7 +48,7 @@ public T peek() { @Override public T poll() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.remove(0); diff --git a/src/org/andengine/util/adt/queue/ShiftQueue.java b/src/org/andengine/util/adt/queue/ShiftQueue.java index f0e038778..9f1abbea5 100644 --- a/src/org/andengine/util/adt/queue/ShiftQueue.java +++ b/src/org/andengine/util/adt/queue/ShiftQueue.java @@ -39,7 +39,7 @@ public ShiftQueue(final int pInitialCapacity) { @Override public T peek() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.get(0); @@ -48,7 +48,7 @@ public T peek() { @Override public T poll() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.remove(0); diff --git a/src/org/andengine/util/adt/queue/SortedQueue.java b/src/org/andengine/util/adt/queue/SortedQueue.java index 23d9e6396..f71393427 100644 --- a/src/org/andengine/util/adt/queue/SortedQueue.java +++ b/src/org/andengine/util/adt/queue/SortedQueue.java @@ -35,7 +35,7 @@ public SortedQueue(final IQueue pQueue) { @Override public T peek() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.get(0); @@ -44,7 +44,7 @@ public T peek() { @Override public T poll() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.remove(0); diff --git a/src/org/andengine/util/adt/queue/UniqueQueue.java b/src/org/andengine/util/adt/queue/UniqueQueue.java index 94ebfd300..90351ed65 100644 --- a/src/org/andengine/util/adt/queue/UniqueQueue.java +++ b/src/org/andengine/util/adt/queue/UniqueQueue.java @@ -35,7 +35,7 @@ public UniqueQueue(final IQueue pQueue) { @Override public T peek() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.get(0); @@ -44,7 +44,7 @@ public T peek() { @Override public T poll() { - if(this.isEmpty()) { + if (this.isEmpty()) { return null; } else { return this.remove(0); diff --git a/src/org/andengine/util/adt/spatial/Direction.java b/src/org/andengine/util/adt/spatial/Direction.java index de6423bd2..15ad7e6d5 100644 --- a/src/org/andengine/util/adt/spatial/Direction.java +++ b/src/org/andengine/util/adt/spatial/Direction.java @@ -42,9 +42,9 @@ private Direction(final int pDeltaX, final int pDeltaY) { } public static Direction fromDelta(final int pDeltaX, final int pDeltaY) { - switch(pDeltaX) { + switch (pDeltaX) { case -1: - switch(pDeltaY) { + switch (pDeltaY) { case 1: return UP_LEFT; case 0: @@ -54,7 +54,7 @@ public static Direction fromDelta(final int pDeltaX, final int pDeltaY) { } break; case 0: - switch(pDeltaY) { + switch (pDeltaY) { case 1: return UP; case -1: @@ -62,7 +62,7 @@ public static Direction fromDelta(final int pDeltaX, final int pDeltaY) { } break; case 1: - switch(pDeltaY) { + switch (pDeltaY) { case 1: return UP_RIGHT; case 0: @@ -96,7 +96,7 @@ public int getDeltaY() { } public Direction rotateLeft() { - switch(this) { + switch (this) { case UP: return LEFT; case UP_RIGHT: @@ -118,7 +118,7 @@ public Direction rotateLeft() { } public Direction rotateRight() { - switch(this) { + switch (this) { case UP: return RIGHT; case UP_RIGHT: @@ -140,7 +140,7 @@ public Direction rotateRight() { } public Direction opposite() { - switch(this) { + switch (this) { case UP: return DOWN; case UP_RIGHT: diff --git a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java index bd7dd5449..973c3abf7 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java @@ -195,10 +195,10 @@ public FloatQuadTreeNode(final int pLevel, final float pXMin, final float pYMin, this.mXMax = pXMax; this.mYMax = pYMax; - if(pXMin > pXMax) { + if (pXMin > pXMax) { throw new IllegalArgumentException("pXMin must be smaller or equal to pXMax."); } - if(pYMin > pYMax) { + if (pYMin > pYMax) { throw new IllegalArgumentException("pYMin must be smaller or equal to pYMax."); } } @@ -295,7 +295,7 @@ protected void appendBoundsToString(final StringBuilder pStringBuilder) { private float getXMin(final BoundsSplit pBoundsSplit) { final float halfWidth = this.getWidth() / 2; - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mXMin; case TOP_RIGHT: @@ -312,7 +312,7 @@ private float getXMin(final BoundsSplit pBoundsSplit) { private float getYMin(final BoundsSplit pBoundsSplit) { final float halfHeight = this.getHeight() / 2; - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mYMin; case TOP_RIGHT: @@ -329,7 +329,7 @@ private float getYMin(final BoundsSplit pBoundsSplit) { private float getXMax(final BoundsSplit pBoundsSplit) { final float halfWidth = this.getWidth() / 2; - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mXMin + halfWidth; case TOP_RIGHT: @@ -346,7 +346,7 @@ private float getXMax(final BoundsSplit pBoundsSplit) { private float getYMax(final BoundsSplit pBoundsSplit) { final float halfHeight = this.getHeight() / 2; - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mYMin + halfHeight; case TOP_RIGHT: diff --git a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java index 94e3932f4..139f584a7 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java @@ -196,10 +196,10 @@ public IntQuadTreeNode(final int pLevel, final int pXMin, final int pYMin, final this.mXMax = pXMax; this.mYMax = pYMax; - if(pXMin > pXMax) { + if (pXMin > pXMax) { throw new IllegalArgumentException("pXMin must be smaller or equal to pXMax."); } - if(pYMin > pYMax) { + if (pYMin > pYMax) { throw new IllegalArgumentException("pYMin must be smaller or equal to pYMax."); } } @@ -245,7 +245,7 @@ protected IntQuadTreeNode split(final BoundsSplit pBoundsSplit) { final int width = this.getWidth(); final int height = this.getHeight(); - if(width <= 2 && height <= 2) { + if (width <= 2 && height <= 2) { throw new BoundsSplitException(); } @@ -304,8 +304,8 @@ private int getXMin(final BoundsSplit pBoundsSplit) { final int width = this.getWidth(); final int halfWidth = width / 2; - if(width <= 2) { - switch(pBoundsSplit) { + if (width <= 2) { + switch (pBoundsSplit) { case TOP_LEFT: case BOTTOM_LEFT: return this.mXMin; @@ -316,7 +316,7 @@ private int getXMin(final BoundsSplit pBoundsSplit) { throw new IllegalArgumentException("Unexpected " + BoundsSplit.class.getSimpleName() + ": '" + pBoundsSplit + "'."); } } else { - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mXMin; case TOP_RIGHT: @@ -335,8 +335,8 @@ private int getYMin(final BoundsSplit pBoundsSplit) { final int height = this.getHeight(); final int halfHeight = height / 2; - if(height <= 2) { - switch(pBoundsSplit) { + if (height <= 2) { + switch (pBoundsSplit) { case TOP_LEFT: case TOP_RIGHT: return this.mYMin; @@ -347,7 +347,7 @@ private int getYMin(final BoundsSplit pBoundsSplit) { throw new IllegalArgumentException("Unexpected " + BoundsSplit.class.getSimpleName() + ": '" + pBoundsSplit + "'."); } } else { - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mYMin; case TOP_RIGHT: @@ -366,8 +366,8 @@ private int getXMax(final BoundsSplit pBoundsSplit) { final int width = this.getWidth(); final int halfWidth = width / 2; - if(width <= 2) { - switch(pBoundsSplit) { + if (width <= 2) { + switch (pBoundsSplit) { case TOP_LEFT: case BOTTOM_LEFT: return this.mXMax; @@ -378,7 +378,7 @@ private int getXMax(final BoundsSplit pBoundsSplit) { throw new IllegalArgumentException("Unexpected " + BoundsSplit.class.getSimpleName() + ": '" + pBoundsSplit + "'."); } } else { - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mXMin + halfWidth; case TOP_RIGHT: @@ -397,8 +397,8 @@ private int getYMax(final BoundsSplit pBoundsSplit) { final int height = this.getHeight(); final int halfHeight = height / 2; - if(height <= 2) { - switch(pBoundsSplit) { + if (height <= 2) { + switch (pBoundsSplit) { case TOP_LEFT: case TOP_RIGHT: return this.mYMax; @@ -409,7 +409,7 @@ private int getYMax(final BoundsSplit pBoundsSplit) { throw new IllegalArgumentException("Unexpected " + BoundsSplit.class.getSimpleName() + ": '" + pBoundsSplit + "'."); } } else { - switch(pBoundsSplit) { + switch (pBoundsSplit) { case TOP_LEFT: return this.mYMin + halfHeight; case TOP_RIGHT: diff --git a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java index e5a632082..31c02cdea 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java @@ -120,27 +120,27 @@ public synchronized void add(final T pItem) { } public synchronized void addAll(final T ... pItems) { - for(final T item : pItems) { + for (final T item : pItems) { this.add(item); } } public synchronized void addAll(final ArrayList pItems) { final int itemCount = pItems.size(); - for(int i = 0; i < itemCount; i++) { + for (int i = 0; i < itemCount; i++) { this.add(pItems.get(i)); } } public synchronized void addAll(final Collection pItems) { - for(final T item : pItems) { + for (final T item : pItems) { this.add(item); } } @Deprecated public synchronized void add(final T pItem, final B pBounds) { - if(!this.mRoot.contains(pBounds)) { + if (!this.mRoot.contains(pBounds)) { Debug.w("pBounds are out of the bounds of this " + this.getClass().getSimpleName() + "."); this.mRoot.addItemSafe(pItem); return; @@ -156,7 +156,7 @@ public synchronized void add(final T pItem, final B pBounds) { */ public synchronized void move(final T pItem, final B pBounds) throws AndEngineRuntimeException { final boolean success = this.remove(pItem, pBounds); - if(!success) { + if (!success) { throw new AndEngineRuntimeException("Failed to remove item: '" + pItem.toString() + " from old bounds: '" + pBounds.toString() + "'."); } this.add(pItem); @@ -172,7 +172,7 @@ public synchronized void move(final T pItem, final B pBounds) throws AndEngineRu @Deprecated public synchronized void move(final T pItem, final B pOldBounds, final B pNewBounds) throws AndEngineRuntimeException { final boolean success = this.remove(pItem, pOldBounds); - if(!success) { + if (!success) { throw new AndEngineRuntimeException("Failed to remove item: '" + pItem.toString() + " from old bounds: '" + pOldBounds.toString() + "'."); } this.add(pItem, pNewBounds); @@ -321,7 +321,7 @@ public String toString(final int pIndent) { .append(indents) .append("\tItems: "); - if(this.mItems != null) { + if (this.mItems != null) { sb.append(this.mItems.toString()); } else { sb.append("[]"); @@ -333,31 +333,31 @@ public String toString(final int pIndent) { .append("Children: ["); /* Children */ - if(this.mTopLeftChild == null && this.mTopRightChild == null && this.mBottomLeftChild == null && this.mBottomRightChild == null) { + if (this.mTopLeftChild == null && this.mTopRightChild == null && this.mBottomLeftChild == null && this.mBottomRightChild == null) { sb.append(']'); } else { - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { sb.append('\n'); sb.append(this.mTopLeftChild.toString(pIndent + 2)); - if(this.mTopRightChild != null || this.mBottomLeftChild != null || this.mBottomRightChild != null) { + if (this.mTopRightChild != null || this.mBottomLeftChild != null || this.mBottomRightChild != null) { sb.append(','); } } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { sb.append('\n'); sb.append(this.mTopRightChild.toString(pIndent + 2)); - if(this.mBottomLeftChild != null || this.mBottomRightChild != null) { + if (this.mBottomLeftChild != null || this.mBottomRightChild != null) { sb.append(','); } } - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { sb.append('\n'); sb.append(this.mBottomLeftChild.toString(pIndent + 2)); - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { sb.append(','); } } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { sb.append('\n'); sb.append(this.mBottomRightChild.toString(pIndent + 2)); } @@ -380,22 +380,22 @@ public String toString(final int pIndent) { public int getItemCount() { int count; - if(this.mItems == null) { + if (this.mItems == null) { count = 0; } else { count = this.mItems.size(); } - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { count += this.mTopLeftChild.getItemCount(); } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { count += this.mTopRightChild.getItemCount(); } - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { count += this.mBottomLeftChild.getItemCount(); } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { count += this.mBottomRightChild.getItemCount(); } @@ -403,24 +403,24 @@ public int getItemCount() { } public void callItems(final ParameterCallable pParameterCallable) { - if(this.mItems != null) { + if (this.mItems != null) { final int itemCount = this.mItems.size(); - for(int i = 0; i < itemCount; i++) { + for (int i = 0; i < itemCount; i++) { final T item = this.mItems.get(i); pParameterCallable.call(item); } } - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { this.mTopLeftChild.callItems(pParameterCallable); } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { this.mTopRightChild.callItems(pParameterCallable); } - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { this.mBottomLeftChild.callItems(pParameterCallable); } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { this.mBottomRightChild.callItems(pParameterCallable); } } @@ -428,16 +428,16 @@ public void callItems(final ParameterCallable pParameterCallable) { public void callNodes(final ParameterCallable pParameterCallable) { pParameterCallable.call(this); - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { this.mTopLeftChild.callNodes(pParameterCallable); } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { this.mTopRightChild.callNodes(pParameterCallable); } - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { this.mBottomLeftChild.callNodes(pParameterCallable); } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { this.mBottomRightChild.callNodes(pParameterCallable); } } @@ -450,20 +450,20 @@ public ArrayList getItemsAndItemsBelow() { * @return the items of this {@link QuadTreeNode} and all children (recursively). */ public > L getItemsAndItemsBelow(final L pResult) { - if(this.mItems != null) { + if (this.mItems != null) { pResult.addAll(this.mItems); // TODO Does addAll use an iterator internally? } - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { this.mTopLeftChild.getItemsAndItemsBelow(pResult); } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { this.mTopRightChild.getItemsAndItemsBelow(pResult); } - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { this.mBottomLeftChild.getItemsAndItemsBelow(pResult); } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { this.mBottomRightChild.getItemsAndItemsBelow(pResult); } @@ -475,24 +475,24 @@ public ArrayList getItemsAndItemsBelow(final IMatcher pMatcher) { } public > L getItemsAndItemsBelow(final IMatcher pMatcher, final L pResult) { - if(this.mItems != null) { - for(final T item : this.mItems) { // TODO Check if iteration is allocation free. - if(pMatcher.matches(item)) { + if (this.mItems != null) { + for (final T item : this.mItems) { // TODO Check if iteration is allocation free. + if (pMatcher.matches(item)) { pResult.add(item); } } } - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { this.mTopLeftChild.getItemsAndItemsBelow(pMatcher, pResult); } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { this.mTopRightChild.getItemsAndItemsBelow(pMatcher, pResult); } - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { this.mBottomLeftChild.getItemsAndItemsBelow(pMatcher, pResult); } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { this.mBottomRightChild.getItemsAndItemsBelow(pMatcher, pResult); } @@ -501,26 +501,26 @@ public > L getItemsAndItemsBelow(final IMatcher pMatcher, f @SuppressWarnings("unchecked") public , S extends T> L getItemsAndItemsBelowForSubclass(final IMatcher pMatcher, final L pResult) throws ClassCastException { - if(this.mItems != null) { + if (this.mItems != null) { final int itemCount = this.mItems.size(); - for(int i = 0; i < itemCount; i++) { + for (int i = 0; i < itemCount; i++) { final T item = this.mItems.get(i); - if(pMatcher.matches(item)) { + if (pMatcher.matches(item)) { pResult.add((S)item); } } } - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { this.mTopLeftChild.getItemsAndItemsBelowForSubclass(pMatcher, pResult); } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { this.mTopRightChild.getItemsAndItemsBelowForSubclass(pMatcher, pResult); } - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { this.mBottomLeftChild.getItemsAndItemsBelowForSubclass(pMatcher, pResult); } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { this.mBottomRightChild.getItemsAndItemsBelowForSubclass(pMatcher, pResult); } @@ -533,24 +533,24 @@ public ArrayList query(final B pBounds) { public > L query(final B pBounds, final L pResult) { /* Test against all items in this node. */ - if(this.mItems != null) { + if (this.mItems != null) { final int itemCount = this.mItems.size(); - for(int i = 0; i < itemCount; i++) { + for (int i = 0; i < itemCount; i++) { final T item = this.mItems.get(i); - if(this.intersects(pBounds, item.getBounds())) { + if (this.intersects(pBounds, item.getBounds())) { pResult.add(item); } } } /* Check children. */ - if(this.queryChild(pBounds, pResult, this.mTopLeftChild)) { + if (this.queryChild(pBounds, pResult, this.mTopLeftChild)) { return pResult; - } else if(this.queryChild(pBounds, pResult, this.mTopRightChild)) { + } else if (this.queryChild(pBounds, pResult, this.mTopRightChild)) { return pResult; - } else if(this.queryChild(pBounds, pResult, this.mBottomLeftChild)) { + } else if (this.queryChild(pBounds, pResult, this.mBottomLeftChild)) { return pResult; - } else if(this.queryChild(pBounds, pResult, this.mBottomRightChild)) { + } else if (this.queryChild(pBounds, pResult, this.mBottomRightChild)) { return pResult; } else { return pResult; @@ -559,22 +559,22 @@ public > L query(final B pBounds, final L pResult) { public > L query(final B pBounds, final IMatcher pMatcher, final L pResult) { /* Test against all items in this node. */ - if(this.mItems != null) { - for(final T item : this.mItems) { - if(this.intersects(pBounds, item.getBounds()) && pMatcher.matches(item)) { + if (this.mItems != null) { + for (final T item : this.mItems) { + if (this.intersects(pBounds, item.getBounds()) && pMatcher.matches(item)) { pResult.add(item); } } } /* Check children. */ - if(this.queryChild(pBounds, pMatcher, pResult, this.mTopLeftChild)) { + if (this.queryChild(pBounds, pMatcher, pResult, this.mTopLeftChild)) { return pResult; - } else if(this.queryChild(pBounds, pMatcher, pResult, this.mTopRightChild)) { + } else if (this.queryChild(pBounds, pMatcher, pResult, this.mTopRightChild)) { return pResult; - } else if(this.queryChild(pBounds, pMatcher, pResult, this.mBottomLeftChild)) { + } else if (this.queryChild(pBounds, pMatcher, pResult, this.mBottomLeftChild)) { return pResult; - } else if(this.queryChild(pBounds, pMatcher, pResult, this.mBottomRightChild)) { + } else if (this.queryChild(pBounds, pMatcher, pResult, this.mBottomRightChild)) { return pResult; } else { return pResult; @@ -584,22 +584,22 @@ public > L query(final B pBounds, final IMatcher pMatcher, @SuppressWarnings("unchecked") public , S extends T> L queryForSubclass(final B pBounds, final IMatcher pMatcher, final L pResult) throws ClassCastException { /* Test against all items in this node. */ - if(this.mItems != null) { - for(final T item : this.mItems) { - if(this.intersects(pBounds, item.getBounds()) && pMatcher.matches(item)) { + if (this.mItems != null) { + for (final T item : this.mItems) { + if (this.intersects(pBounds, item.getBounds()) && pMatcher.matches(item)) { pResult.add((S)item); } } } /* Check children. */ - if(this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mTopLeftChild)) { + if (this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mTopLeftChild)) { return pResult; - } else if(this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mTopRightChild)) { + } else if (this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mTopRightChild)) { return pResult; - } else if(this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mBottomLeftChild)) { + } else if (this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mBottomLeftChild)) { return pResult; - } else if(this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mBottomRightChild)) { + } else if (this.queryChildForSubclass(pBounds, pMatcher, pResult, this.mBottomRightChild)) { return pResult; } else { return pResult; @@ -613,18 +613,18 @@ public , S extends T> L queryForSubclass(final B pBounds, fina * @return true when the child contains pBounds, false otherwise. */ private > boolean queryChild(final B pBounds, final L pResult, final QuadTreeNode pChild) { - if(pChild == null) { + if (pChild == null) { return false; } - if(pChild.contains(pBounds)) { + if (pChild.contains(pBounds)) { pChild.query(pBounds, pResult); return true; } - if(pChild.containedBy(pBounds)) { + if (pChild.containedBy(pBounds)) { pChild.getItemsAndItemsBelow(pResult); - } else if(pChild.intersects(pBounds)) { + } else if (pChild.intersects(pBounds)) { pChild.query(pBounds, pResult); } @@ -639,18 +639,18 @@ private > boolean queryChild(final B pBounds, final L pResult, * @return true when the child contains pBounds, false otherwise. */ private > boolean queryChild(final B pBounds, final IMatcher pMatcher, final L pResult, final QuadTreeNode pChild) { - if(pChild == null) { + if (pChild == null) { return false; } - if(pChild.contains(pBounds)) { + if (pChild.contains(pBounds)) { pChild.query(pBounds, pMatcher, pResult); return true; } - if(pChild.containedBy(pBounds)) { + if (pChild.containedBy(pBounds)) { pChild.getItemsAndItemsBelow(pMatcher, pResult); - } else if(pChild.intersects(pBounds)) { + } else if (pChild.intersects(pBounds)) { pChild.query(pBounds, pMatcher, pResult); } @@ -665,18 +665,18 @@ private > boolean queryChild(final B pBounds, final IMatchertrue when the child contains pBounds, false otherwise. */ private , S extends T> boolean queryChildForSubclass(final B pBounds, final IMatcher pMatcher, final L pResult, final QuadTreeNode pChild) throws ClassCastException { - if(pChild == null) { + if (pChild == null) { return false; } - if(pChild.contains(pBounds)) { + if (pChild.contains(pBounds)) { pChild.queryForSubclass(pBounds, pMatcher, pResult); return true; } - if(pChild.containedBy(pBounds)) { + if (pChild.containedBy(pBounds)) { pChild.getItemsAndItemsBelowForSubclass(pMatcher, pResult); - } else if(pChild.intersects(pBounds)) { + } else if (pChild.intersects(pBounds)) { pChild.queryForSubclass(pBounds, pMatcher, pResult); } @@ -685,24 +685,24 @@ private , S extends T> boolean queryChildForSubclass(final B p public boolean containsAny(final B pBounds, final IMatcher pMatcher) { /* Test against all items in this node. */ - if(this.mItems != null) { + if (this.mItems != null) { final int itemCount = this.mItems.size(); - for(int i = 0; i < itemCount; i++) { + for (int i = 0; i < itemCount; i++) { final T item = this.mItems.get(i); - if(this.intersects(pBounds, item.getBounds()) && pMatcher.matches(item)) { + if (this.intersects(pBounds, item.getBounds()) && pMatcher.matches(item)) { return true; } } } /* Check children. */ - if(this.containsAnyChild(pBounds, pMatcher, this.mTopLeftChild)) { + if (this.containsAnyChild(pBounds, pMatcher, this.mTopLeftChild)) { return true; - } else if(this.containsAnyChild(pBounds, pMatcher, this.mTopRightChild)) { + } else if (this.containsAnyChild(pBounds, pMatcher, this.mTopRightChild)) { return true; - } else if(this.containsAnyChild(pBounds, pMatcher, this.mBottomLeftChild)) { + } else if (this.containsAnyChild(pBounds, pMatcher, this.mBottomLeftChild)) { return true; - } else if(this.containsAnyChild(pBounds, pMatcher, this.mBottomRightChild)) { + } else if (this.containsAnyChild(pBounds, pMatcher, this.mBottomRightChild)) { return true; } else { return false; @@ -711,24 +711,24 @@ public boolean containsAny(final B pBounds, final IMatcher pMatcher) { public boolean containsAny(final B pBounds) { /* Test against all items in this node. */ - if(this.mItems != null) { + if (this.mItems != null) { final int itemCount = this.mItems.size(); - for(int i = 0; i < itemCount; i++) { + for (int i = 0; i < itemCount; i++) { final T item = this.mItems.get(i); - if(this.intersects(pBounds, item.getBounds())) { + if (this.intersects(pBounds, item.getBounds())) { return true; } } } /* Check children. */ - if(this.containsAnyChild(pBounds, this.mTopLeftChild)) { + if (this.containsAnyChild(pBounds, this.mTopLeftChild)) { return true; - } else if(this.containsAnyChild(pBounds, this.mTopRightChild)) { + } else if (this.containsAnyChild(pBounds, this.mTopRightChild)) { return true; - } else if(this.containsAnyChild(pBounds, this.mBottomLeftChild)) { + } else if (this.containsAnyChild(pBounds, this.mBottomLeftChild)) { return true; - } else if(this.containsAnyChild(pBounds, this.mBottomRightChild)) { + } else if (this.containsAnyChild(pBounds, this.mBottomRightChild)) { return true; } else { return false; @@ -736,11 +736,11 @@ public boolean containsAny(final B pBounds) { } private boolean containsAnyChild(final B pBounds, final IMatcher pMatcher, final QuadTreeNode pChild) { - if(pChild == null) { + if (pChild == null) { return false; } - if(pChild.intersects(pBounds) && pChild.containsAny(pBounds, pMatcher)) { + if (pChild.intersects(pBounds) && pChild.containsAny(pBounds, pMatcher)) { return true; } @@ -748,11 +748,11 @@ private boolean containsAnyChild(final B pBounds, final IMatcher pMatcher, fi } private boolean containsAnyChild(final B pBounds, final QuadTreeNode pChild) { - if(pChild == null) { + if (pChild == null) { return false; } - if(pChild.intersects(pBounds) && pChild.containsAny(pBounds)) { + if (pChild.intersects(pBounds) && pChild.containsAny(pBounds)) { return true; } @@ -761,18 +761,18 @@ private boolean containsAnyChild(final B pBounds, final QuadTreeNode pChild) { public void add(final T pItem, final B pBounds) throws IllegalArgumentException { /* Check if this node is in the maximum level. */ - if(this.mLevel >= QuadTree.this.mMaxLevel) { + if (this.mLevel >= QuadTree.this.mMaxLevel) { /* No more levels allowed, so this node has to take the item. */ this.addItemSafe(pItem); return; } /* If the node contains the item, add the item to that node. */ - if(this.mTopLeftChild != null && this.mTopLeftChild.contains(pBounds)) { + if (this.mTopLeftChild != null && this.mTopLeftChild.contains(pBounds)) { this.mTopLeftChild.add(pItem, pBounds); return; - } else if(this.contains(BoundsSplit.TOP_LEFT, pBounds)) { - if(this.mTopLeftChild == null) { + } else if (this.contains(BoundsSplit.TOP_LEFT, pBounds)) { + if (this.mTopLeftChild == null) { try { this.mTopLeftChild = this.split(BoundsSplit.TOP_LEFT); this.mTopLeftChild.add(pItem, pBounds); @@ -783,11 +783,11 @@ public void add(final T pItem, final B pBounds) throws IllegalArgumentException } } - if(this.mTopRightChild != null && this.mTopRightChild.contains(pBounds)) { + if (this.mTopRightChild != null && this.mTopRightChild.contains(pBounds)) { this.mTopRightChild.add(pItem, pBounds); return; - } else if(this.contains(BoundsSplit.TOP_RIGHT, pBounds)) { - if(this.mTopRightChild == null) { + } else if (this.contains(BoundsSplit.TOP_RIGHT, pBounds)) { + if (this.mTopRightChild == null) { try { this.mTopRightChild = this.split(BoundsSplit.TOP_RIGHT); this.mTopRightChild.add(pItem, pBounds); @@ -798,11 +798,11 @@ public void add(final T pItem, final B pBounds) throws IllegalArgumentException } } - if(this.mBottomLeftChild != null && this.mBottomLeftChild.contains(pBounds)) { + if (this.mBottomLeftChild != null && this.mBottomLeftChild.contains(pBounds)) { this.mBottomLeftChild.add(pItem, pBounds); return; - } else if(this.contains(BoundsSplit.BOTTOM_LEFT, pBounds)) { - if(this.mBottomLeftChild == null) { + } else if (this.contains(BoundsSplit.BOTTOM_LEFT, pBounds)) { + if (this.mBottomLeftChild == null) { try { this.mBottomLeftChild = this.split(BoundsSplit.BOTTOM_LEFT); this.mBottomLeftChild.add(pItem, pBounds); @@ -813,11 +813,11 @@ public void add(final T pItem, final B pBounds) throws IllegalArgumentException } } - if(this.mBottomRightChild != null && this.mBottomRightChild.contains(pBounds)) { + if (this.mBottomRightChild != null && this.mBottomRightChild.contains(pBounds)) { this.mBottomRightChild.add(pItem, pBounds); return; - } else if(this.contains(BoundsSplit.BOTTOM_RIGHT, pBounds)) { - if(this.mBottomRightChild == null) { + } else if (this.contains(BoundsSplit.BOTTOM_RIGHT, pBounds)) { + if (this.mBottomRightChild == null) { try { this.mBottomRightChild = this.split(BoundsSplit.BOTTOM_RIGHT); this.mBottomRightChild.add(pItem, pBounds); @@ -837,22 +837,22 @@ public boolean remove(final T pItem) throws IllegalArgumentException { } public boolean remove(final T pItem, final B pBounds) throws IllegalArgumentException { - if(!this.contains(pBounds)) { // TODO Perform this check only for the root? + if (!this.contains(pBounds)) { // TODO Perform this check only for the root? throw new IllegalArgumentException("pItem (" + pItem.toString() + ") is out of the bounds of this " + this.getClass().getSimpleName() + "."); } /* If there are no children, try to remove from self. */ - if(this.mTopLeftChild != null && this.mTopLeftChild.contains(pBounds)) { + if (this.mTopLeftChild != null && this.mTopLeftChild.contains(pBounds)) { return this.mTopLeftChild.remove(pItem, pBounds); - } else if(this.mTopRightChild != null && this.mTopRightChild.contains(pBounds)) { + } else if (this.mTopRightChild != null && this.mTopRightChild.contains(pBounds)) { return this.mTopRightChild.remove(pItem, pBounds); - } else if(this.mBottomLeftChild != null && this.mBottomLeftChild.contains(pBounds)) { + } else if (this.mBottomLeftChild != null && this.mBottomLeftChild.contains(pBounds)) { return this.mBottomLeftChild.remove(pItem, pBounds); - } else if(this.mBottomRightChild != null && this.mBottomRightChild.contains(pBounds)) { + } else if (this.mBottomRightChild != null && this.mBottomRightChild.contains(pBounds)) { return this.mBottomRightChild.remove(pItem, pBounds); } else { /* None of the children completely contained the item. */ - if(this.mItems == null) { + if (this.mItems == null) { return false; } else { // TODO Potentially mItems could be set to null when its size is 0. @@ -862,31 +862,31 @@ public boolean remove(final T pItem, final B pBounds) throws IllegalArgumentExce } private void addItemSafe(final T pItem) { - if(this.mItems == null) { + if (this.mItems == null) { this.mItems = new ArrayList(1); } this.mItems.add(pItem); } protected void clear() { - if(this.mBottomLeftChild != null) { + if (this.mBottomLeftChild != null) { this.mBottomLeftChild.clear(); this.mBottomLeftChild = null; } - if(this.mBottomRightChild != null) { + if (this.mBottomRightChild != null) { this.mBottomRightChild.clear(); this.mBottomRightChild = null; } - if(this.mTopLeftChild != null) { + if (this.mTopLeftChild != null) { this.mTopLeftChild.clear(); this.mTopLeftChild = null; } - if(this.mTopRightChild != null) { + if (this.mTopRightChild != null) { this.mTopRightChild.clear(); this.mTopRightChild = null; } - if(this.mItems != null) { + if (this.mItems != null) { this.mItems.clear(); this.mItems = null; } diff --git a/src/org/andengine/util/adt/trie/Trie.java b/src/org/andengine/util/adt/trie/Trie.java index 67e0aeefc..d115c90b1 100644 --- a/src/org/andengine/util/adt/trie/Trie.java +++ b/src/org/andengine/util/adt/trie/Trie.java @@ -101,7 +101,7 @@ public TrieNode(final boolean pWordEndFlag) { @Override public void add(final CharSequence pCharSequence) { final int length = pCharSequence.length(); - if(length == 0) { + if (length == 0) { return; } @@ -110,18 +110,18 @@ public void add(final CharSequence pCharSequence) { @Override public void add(final CharSequence pCharSequence, final int pStart, final int pEnd) { - if(this.mChildren == null) { + if (this.mChildren == null) { this.mChildren = new SparseArray(Trie.CHILDREN_SIZE_DEFAULT); } final char character = pCharSequence.charAt(pStart); TrieNode child = this.mChildren.get(character); - if(child == null) { + if (child == null) { child = new TrieNode(); this.mChildren.put(character, child); } - if(pStart < pEnd - 1) { + if (pStart < pEnd - 1) { child.add(pCharSequence, pStart + 1, pEnd); } else { child.mWordEndFlag = true; @@ -131,7 +131,7 @@ public void add(final CharSequence pCharSequence, final int pStart, final int pE @Override public boolean contains(final CharSequence pCharSequence) { final int length = pCharSequence.length(); - if(length == 0) { + if (length == 0) { throw new IllegalArgumentException(); } return this.contains(pCharSequence, 0, length); @@ -139,16 +139,16 @@ public boolean contains(final CharSequence pCharSequence) { @Override public boolean contains(final CharSequence pCharSequence, final int pStart, final int pEnd) { - if(this.mChildren == null) { + if (this.mChildren == null) { return false; } final char character = pCharSequence.charAt(pStart); final TrieNode child = this.mChildren.get(character); - if(child == null) { + if (child == null) { return false; } else { - if(pStart < pEnd - 1) { + if (pStart < pEnd - 1) { return child.contains(pCharSequence, pStart + 1, pEnd); } else { return child.mWordEndFlag; diff --git a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java index 303d58e7f..1db2eedb4 100644 --- a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java +++ b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java @@ -146,21 +146,21 @@ public static boolean checkCollision(final float[] pVerticesA, final int pVertex */ public static boolean checkCollision(final float[] pVerticesA, final int pVertexCountA, final int pVertexOffsetXA, final int pVertexOffsetYA, final int pVertexStrideA, final float[] pVerticesB, final int pVertexCountB, final int pVertexOffsetXB, final int pVertexOffsetYB, final int pVertexStrideB) { /* Check all the lines of A ... */ - for(int a = pVertexCountA - 2; a >= 0; a--) { + for (int a = pVertexCountA - 2; a >= 0; a--) { /* ... against all lines in B. */ - if(BaseCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, a, a + 1, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)){ + if (BaseCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, a, a + 1, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)) { return true; } } /* Also check the 'around the corner of the array' line of A against all lines in B. */ - if(BaseCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, pVertexCountA - 1, 0, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)){ + if (BaseCollisionChecker.checkCollisionSub(pVerticesA, pVertexOffsetXA, pVertexOffsetYA, pVertexStrideA, pVertexCountA - 1, 0, pVerticesB, pVertexCountB, pVertexOffsetXB, pVertexOffsetYB, pVertexStrideB)) { return true; } else { /* At last check if one polygon 'contains' the other one by checking * if one vertex of the one vertices is contained by all of the other vertices. */ - if(BaseCollisionChecker.checkContains(pVerticesA, pVertexCountA, VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, 0), VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, 0))) { + if (BaseCollisionChecker.checkContains(pVerticesA, pVertexCountA, VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, 0), VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, 0))) { return true; - } else if(BaseCollisionChecker.checkContains(pVerticesB, pVertexCountB, VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, 0), VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, 0))) { + } else if (BaseCollisionChecker.checkContains(pVerticesB, pVertexCountB, VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, 0), VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, 0))) { return true; } else { return false; @@ -191,12 +191,12 @@ static boolean checkCollisionSub(final float[] pVerticesA, final int pVertexOffs final float vertexA2X = VertexUtils.getVertex(pVerticesA, pVertexOffsetXA, pVertexStrideA, pVertexIndexA2); final float vertexA2Y = VertexUtils.getVertex(pVerticesA, pVertexOffsetYA, pVertexStrideA, pVertexIndexA2); - for(int b = pVertexCountB - 2; b >= 0; b--) { + for (int b = pVertexCountB - 2; b >= 0; b--) { final float vertexB1X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, b); final float vertexB1Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, b); final float vertexB2X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, b + 1); final float vertexB2Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, b + 1); - if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)){ + if (LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)) { return true; } } @@ -205,7 +205,7 @@ static boolean checkCollisionSub(final float[] pVerticesA, final int pVertexOffs final float vertexB1Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, pVertexCountB - 1); final float vertexB2X = VertexUtils.getVertex(pVerticesB, pVertexOffsetXB, pVertexStrideB, 0); final float vertexB2Y = VertexUtils.getVertex(pVerticesB, pVertexOffsetYB, pVertexStrideB, 0); - if(LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)){ + if (LineCollisionChecker.checkLineCollision(vertexA1X, vertexA1Y, vertexA2X, vertexA2Y, vertexB1X, vertexB1Y, vertexB2X, vertexB2Y)) { return true; } return false; @@ -242,13 +242,13 @@ public static boolean checkContains(final float[] pVertices, final int pVertexCo boolean odd = false; int j = pVertexCount - 1; - for(int i = 0; i < pVertexCount; i++) { + for (int i = 0; i < pVertexCount; i++) { final float vertexXI = VertexUtils.getVertex(pVertices, pVertexOffsetX, pVertexStride, i); final float vertexYI = VertexUtils.getVertex(pVertices, pVertexOffsetY, pVertexStride, i); final float vertexXJ = VertexUtils.getVertex(pVertices, pVertexOffsetX, pVertexStride, j); final float vertexYJ = VertexUtils.getVertex(pVertices, pVertexOffsetY, pVertexStride, j); - if((((vertexYI < pY) && (vertexYJ >= pY)) || ((vertexYJ < pY) && (vertexYI >= pY))) && ((vertexXI <= pX) || (vertexXJ <= pX))) { + if ((((vertexYI < pY) && (vertexYJ >= pY)) || ((vertexYJ < pY) && (vertexYI >= pY))) && ((vertexXI <= pX) || (vertexXJ <= pX))) { odd ^= ((vertexXI + (((pY - vertexYI) / (vertexYJ - vertexYI)) * (vertexXJ - vertexXI))) < pX); } j = i; diff --git a/src/org/andengine/util/algorithm/hull/HullUtils.java b/src/org/andengine/util/algorithm/hull/HullUtils.java index 036022aa7..94904e8a4 100644 --- a/src/org/andengine/util/algorithm/hull/HullUtils.java +++ b/src/org/andengine/util/algorithm/hull/HullUtils.java @@ -48,7 +48,7 @@ public static int indexOfLowestVertex(final float[] pVertices, final int pVertex final float currentVertexY = pVertices[currentVertexOffsetY]; /* Check if the current candidate is lower and if so, assign it. */ - if(currentVertexY < lowestVertexY) { + if (currentVertexY < lowestVertexY) { lowestVertexIndex = currentVertexIndex; lowestVertexY = currentVertexY; } @@ -62,7 +62,7 @@ public static void swap(final float[] pVertices, final int pVertexStride, final final int vertexOffsetA = pVertexIndexA * pVertexStride; final int vertexOffsetB = pVertexIndexB * pVertexStride; - for(int i = pVertexStride - 1; i >= 0; i--) { + for (int i = pVertexStride - 1; i >= 0; i--) { final float tmp = pVertices[vertexOffsetA + i]; pVertices[vertexOffsetA + i] = pVertices[vertexOffsetB + i]; pVertices[vertexOffsetB + i] = tmp; diff --git a/src/org/andengine/util/algorithm/hull/JarvisMarch.java b/src/org/andengine/util/algorithm/hull/JarvisMarch.java index 6c5514238..fc5b4b2a0 100644 --- a/src/org/andengine/util/algorithm/hull/JarvisMarch.java +++ b/src/org/andengine/util/algorithm/hull/JarvisMarch.java @@ -71,20 +71,20 @@ private int jarvisMarch(final float[] pVertices, final int pVertexCount, final i float nextHullVertexAngle = MathConstants.PI_TWICE; /* 360 degrees. */ /* Start searching one behind the already found hull vertices. */ - for(int j = hullVertexCount; j < pVertexCount; j++) { + for (int j = hullVertexCount; j < pVertexCount; j++) { final float possibleNextHullVertexX = VertexUtils.getVertex(pVertices, pVertexOffsetX, pVertexStride, j); final float possibleNextHullVertexY = VertexUtils.getVertex(pVertices, pVertexOffsetY, pVertexStride, j); /* Ignore identical vertices. */ - if(currentHullPointVertexX != possibleNextHullVertexX || currentHullPointVertexY != possibleNextHullVertexY) { + if (currentHullPointVertexX != possibleNextHullVertexX || currentHullPointVertexY != possibleNextHullVertexY) { final float dX = possibleNextHullVertexX - currentHullPointVertexX; final float dY = possibleNextHullVertexY - currentHullPointVertexY; float possibleNextHullVertexAngle = MathUtils.atan2(dY, dX); - if(possibleNextHullVertexAngle < 0) { + if (possibleNextHullVertexAngle < 0) { possibleNextHullVertexAngle += MathConstants.PI_TWICE; /* 360 degrees. */ } - if((possibleNextHullVertexAngle >= currentHullVertexAngle) && (possibleNextHullVertexAngle <= nextHullVertexAngle)) { + if ((possibleNextHullVertexAngle >= currentHullVertexAngle) && (possibleNextHullVertexAngle <= nextHullVertexAngle)) { nextHullVertexIndex = j; nextHullVertexAngle = possibleNextHullVertexAngle; } @@ -92,15 +92,15 @@ private int jarvisMarch(final float[] pVertices, final int pVertexCount, final i } /* Compare against first hull vertex. */ - if(hullVertexCount > 1) { + if (hullVertexCount > 1) { final float dX = firstHullVertexX - currentHullPointVertexX; final float dY = firstHullVertexY - currentHullPointVertexY; float possibleNextHullVertexAngle = MathUtils.atan2(dY, dX); - if(possibleNextHullVertexAngle < 0) { + if (possibleNextHullVertexAngle < 0) { possibleNextHullVertexAngle += MathConstants.PI_TWICE; /* 360 degrees. */ } - if((possibleNextHullVertexAngle >= currentHullVertexAngle) && (possibleNextHullVertexAngle <= nextHullVertexAngle)) { + if ((possibleNextHullVertexAngle >= currentHullVertexAngle) && (possibleNextHullVertexAngle <= nextHullVertexAngle)) { break; } } diff --git a/src/org/andengine/util/algorithm/path/Path.java b/src/org/andengine/util/algorithm/path/Path.java index 5b6300d07..931b173b6 100644 --- a/src/org/andengine/util/algorithm/path/Path.java +++ b/src/org/andengine/util/algorithm/path/Path.java @@ -79,8 +79,8 @@ public void set(final int pIndex, final int pX, final int pY) { public boolean contains(final int pX, final int pY) { final int[] xs = this.mXs; final int[] ys = this.mYs; - for(int i = this.getLength() - 1; i >= 0; i--) { - if(xs[i] == pX && ys[i] == pY) { + for (int i = this.getLength() - 1; i >= 0; i--) { + if (xs[i] == pX && ys[i] == pY) { return true; } } @@ -88,7 +88,7 @@ public boolean contains(final int pX, final int pY) { } public Direction getDirectionToPreviousStep(final int pIndex) { - if(pIndex == 0) { + if (pIndex == 0) { return null; } else { final int dX = this.getX(pIndex - 1) - this.getX(pIndex); @@ -98,7 +98,7 @@ public Direction getDirectionToPreviousStep(final int pIndex) { } public Direction getDirectionToNextStep(final int pIndex) { - if(pIndex == this.getLength() - 1) { + if (pIndex == this.getLength() - 1) { return null; } else { final int dX = this.getX(pIndex + 1) - this.getX(pIndex); diff --git a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java index 2dc63cc2b..0a8403db1 100644 --- a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java +++ b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java @@ -53,7 +53,7 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi @Override public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, final int pYMin, final int pXMax, final int pYMax, final T pEntity, final int pFromX, final int pFromY, final int pToX, final int pToY, final boolean pAllowDiagonal, final IAStarHeuristic pAStarHeuristic, final ICostFunction pCostFunction, final float pMaxCost, final IPathFinderListener pPathFinderListener) { - if(((pFromX == pToX) && (pFromY == pToY)) || pPathFinderMap.isBlocked(pFromX, pFromY, pEntity) || pPathFinderMap.isBlocked(pToX, pToY, pEntity)) { + if (((pFromX == pToX) && (pFromY == pToY)) || pPathFinderMap.isBlocked(pFromX, pFromY, pEntity) || pPathFinderMap.isBlocked(pToX, pToY, pEntity)) { return null; } @@ -78,20 +78,20 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi /* The first Node in the open list is the one with the lowest cost. */ currentNode = sortedOpenNodes.poll(); final long currentNodeID = currentNode.mID; - if(currentNodeID == toNodeID) { + if (currentNodeID == toNodeID) { break; } visitedNodes.put(currentNodeID, currentNode); /* Loop over all neighbors of this position. */ - for(int dX = -1; dX <= 1; dX++) { - for(int dY = -1; dY <= 1; dY++) { - if((dX == 0) && (dY == 0)) { + for (int dX = -1; dX <= 1; dX++) { + for (int dY = -1; dY <= 1; dY++) { + if ((dX == 0) && (dY == 0)) { continue; } - if(!allowDiagonalMovement && (dX != 0) && (dY != 0)) { + if (!allowDiagonalMovement && (dX != 0) && (dY != 0)) { continue; } @@ -99,18 +99,18 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi final int neighborNodeY = dY + currentNode.mY; final long neighborNodeID = Node.calculateID(neighborNodeX, neighborNodeY); - if(!IntBoundsUtils.contains(pXMin, pYMin, pXMax, pYMax, neighborNodeX, neighborNodeY) || pPathFinderMap.isBlocked(neighborNodeX, neighborNodeY, pEntity)) { + if (!IntBoundsUtils.contains(pXMin, pYMin, pXMax, pYMax, neighborNodeX, neighborNodeY) || pPathFinderMap.isBlocked(neighborNodeX, neighborNodeY, pEntity)) { continue; } - if(visitedNodes.indexOfKey(neighborNodeID) >= 0) { + if (visitedNodes.indexOfKey(neighborNodeID) >= 0) { continue; } Node neighborNode = openNodes.get(neighborNodeID); final boolean neighborNodeIsNew; /* Check if neighbor exists. */ - if(neighborNode == null) { + if (neighborNode == null) { neighborNodeIsNew = true; neighborNode = new Node(neighborNodeX, neighborNodeY, pAStarHeuristic.getExpectedRestCost(pPathFinderMap, pEntity, neighborNodeX, neighborNodeY, pToX, pToY)); } else { @@ -120,14 +120,14 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi /* Update cost of neighbor as cost of current plus step from current to neighbor. */ final float costFromCurrentToNeigbor = pCostFunction.getCost(pPathFinderMap, currentNode.mX, currentNode.mY, neighborNodeX, neighborNodeY, pEntity); final float neighborNodeCost = currentNode.mCost + costFromCurrentToNeigbor; - if(neighborNodeCost > pMaxCost) { + if (neighborNodeCost > pMaxCost) { /* Too expensive -> remove if isn't a new node. */ - if(!neighborNodeIsNew) { + if (!neighborNodeIsNew) { openNodes.remove(neighborNodeID); } } else { neighborNode.setParent(currentNode, costFromCurrentToNeigbor); - if(neighborNodeIsNew) { + if (neighborNodeIsNew) { openNodes.put(neighborNodeID, neighborNode); } else { /* Remove so that re-insertion puts it to the correct spot. */ @@ -136,7 +136,7 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi sortedOpenNodes.enter(neighborNode); - if(pPathFinderListener != null) { + if (pPathFinderListener != null) { pPathFinderListener.onVisited(pEntity, neighborNodeX, neighborNodeY); } } @@ -151,7 +151,7 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi sortedOpenNodes.clear(); /* Check if a path was found. */ - if(currentNode.mID != toNodeID) { + if (currentNode.mID != toNodeID) { return null; } @@ -233,9 +233,9 @@ public void setParent(final Node pParent, final float pCost) { @Override public int compareTo(final Node pNode) { final float diff = this.mTotalCost - pNode.mTotalCost; - if(diff > 0) { + if (diff > 0) { return 1; - } else if(diff < 0) { + } else if (diff < 0) { return -1; } else { return 0; @@ -244,11 +244,11 @@ public int compareTo(final Node pNode) { @Override public boolean equals(final Object pOther) { - if(this == pOther) { + if (this == pOther) { return true; - } else if(pOther == null) { + } else if (pOther == null) { return false; - } else if(this.getClass() != pOther.getClass()) { + } else if (this.getClass() != pOther.getClass()) { return false; } return this.equals((Node)pOther); diff --git a/src/org/andengine/util/algorithm/sort/InsertionSorter.java b/src/org/andengine/util/algorithm/sort/InsertionSorter.java index 2904ec692..629acf815 100644 --- a/src/org/andengine/util/algorithm/sort/InsertionSorter.java +++ b/src/org/andengine/util/algorithm/sort/InsertionSorter.java @@ -36,10 +36,10 @@ public class InsertionSorter extends Sorter { @Override public void sort(final T[] pArray, final int pStart, final int pEnd, final Comparator pComparator) { - for(int i = pStart + 1; i < pEnd; i++) { + for (int i = pStart + 1; i < pEnd; i++) { final T current = pArray[i]; T prev = pArray[i - 1]; - if(pComparator.compare(current, prev) < 0) { + if (pComparator.compare(current, prev) < 0) { int j = i; do { pArray[j--] = prev; @@ -52,10 +52,10 @@ public void sort(final T[] pArray, final int pStart, final int pEnd, final Compa @Override public void sort(final List pList, final int pStart, final int pEnd, final Comparator pComparator) { - for(int i = pStart + 1; i < pEnd; i++) { + for (int i = pStart + 1; i < pEnd; i++) { final T current = pList.get(i); T prev = pList.get(i - 1); - if(pComparator.compare(current, prev) < 0) { + if (pComparator.compare(current, prev) < 0) { int j = i; do { pList.set(j--, prev); @@ -68,10 +68,10 @@ public void sort(final List pList, final int pStart, final int pEnd, final Co @Override public void sort(final IList pList, final int pStart, final int pEnd, final Comparator pComparator) { - for(int i = pStart + 1; i < pEnd; i++) { + for (int i = pStart + 1; i < pEnd; i++) { final T current = pList.get(i); T prev = pList.get(i - 1); - if(pComparator.compare(current, prev) < 0) { + if (pComparator.compare(current, prev) < 0) { int j = i; do { pList.set(j--, prev); diff --git a/src/org/andengine/util/algorithm/sort/Sorter.java b/src/org/andengine/util/algorithm/sort/Sorter.java index 4704122d5..b28ee6595 100644 --- a/src/org/andengine/util/algorithm/sort/Sorter.java +++ b/src/org/andengine/util/algorithm/sort/Sorter.java @@ -42,15 +42,15 @@ public abstract class Sorter { // Methods // =========================================================== - public final void sort(final T[] pArray, final Comparator pComparator){ + public final void sort(final T[] pArray, final Comparator pComparator) { this.sort(pArray, 0, pArray.length, pComparator); } - public final void sort(final List pList, final Comparator pComparator){ + public final void sort(final List pList, final Comparator pComparator) { this.sort(pList, 0, pList.size(), pComparator); } - public final void sort(final IList pList, final Comparator pComparator){ + public final void sort(final IList pList, final Comparator pComparator) { this.sort(pList, 0, pList.size(), pComparator); } diff --git a/src/org/andengine/util/animationpack/AnimationPackParser.java b/src/org/andengine/util/animationpack/AnimationPackParser.java index 6e4dc49d8..bcd1126a6 100644 --- a/src/org/andengine/util/animationpack/AnimationPackParser.java +++ b/src/org/andengine/util/animationpack/AnimationPackParser.java @@ -88,9 +88,9 @@ public AnimationPack getAnimationPack() { @Override public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException { - if(pLocalName.equals(AnimationPackParser.TAG_ANIMATIONPACK)) { + if (pLocalName.equals(AnimationPackParser.TAG_ANIMATIONPACK)) { final int version = SAXUtils.getIntAttributeOrThrow(pAttributes, AnimationPackParser.TAG_ANIMATIONPACK_ATTRIBUTE_VERSION); - if(version != 1) { + if (version != 1) { throw new AnimationPackParseException("Unexpected version: '" + version + "'."); } @@ -98,21 +98,21 @@ public void startElement(final String pUri, final String pLocalName, final Strin this.mTexturePackLibrary = new TexturePackLibrary(); this.mAnimationPackTiledTextureRegionLibrary = new AnimationPackTiledTextureRegionLibrary(); this.mAnimationPack = new AnimationPack(this.mTexturePackLibrary, this.mAnimationPackTiledTextureRegionLibrary); - } else if(pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACKS)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACKS)) { /* Nothing. */ - } else if(pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACK)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACK)) { final String texturePackName = SAXUtils.getAttributeOrThrow(pAttributes, AnimationPackParser.TAG_TEXTUREPACK_ATTRIBUTE_FILENAME); final String texturePackPath = this.mAssetBasePath + texturePackName; final TexturePack texturePack = this.mTexturePackLoader.loadFromAsset(texturePackPath, this.mAssetBasePath); this.mTexturePackLibrary.put(texturePackName, texturePack); texturePack.loadTexture(); - } else if(pLocalName.equals(AnimationPackParser.TAG_ANIMATIONS)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_ANIMATIONS)) { /* Nothing. */ - } else if(pLocalName.equals(AnimationPackParser.TAG_ANIMATION)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_ANIMATION)) { this.mCurrentAnimationName = SAXUtils.getAttributeOrThrow(pAttributes, AnimationPackParser.TAG_ANIMATION_ATTRIBUTE_NAME); this.mCurrentAnimationLoopCount = SAXUtils.getIntAttribute(pAttributes, AnimationPackParser.TAG_ANIMATION_ATTRIBUTE_LOOPCOUNT, IAnimationData.LOOP_CONTINUOUS); - } else if(pLocalName.equals(AnimationPackParser.TAG_ANIMATIONFRAME)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_ANIMATIONFRAME)) { final int duration = SAXUtils.getIntAttributeOrThrow(pAttributes, AnimationPackParser.TAG_ANIMATIONFRAME_ATTRIBUTE_DURATION); this.mCurrentAnimationFrameDurations.add(duration); @@ -126,15 +126,15 @@ public void startElement(final String pUri, final String pLocalName, final Strin @Override public void endElement(final String pUri, final String pLocalName, final String pQualifiedName) throws SAXException { - if(pLocalName.equals(AnimationPackParser.TAG_ANIMATIONPACK)) { + if (pLocalName.equals(AnimationPackParser.TAG_ANIMATIONPACK)) { /* Nothing. */ - } else if(pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACKS)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACKS)) { /* Nothing. */ - } else if(pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACK)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_TEXTUREPACK)) { /* Nothing. */ - } else if(pLocalName.equals(AnimationPackParser.TAG_ANIMATIONS)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_ANIMATIONS)) { /* Nothing. */ - } else if(pLocalName.equals(AnimationPackParser.TAG_ANIMATION)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_ANIMATION)) { final int currentAnimationFrameFrameCount = this.mCurrentAnimationFrameDurations.size(); final long[] frameDurations = this.mCurrentAnimationFrameDurations.toArray(); final TexturePackTextureRegion[] textureRegions = new TexturePackTextureRegion[currentAnimationFrameFrameCount]; @@ -147,7 +147,7 @@ public void endElement(final String pUri, final String pLocalName, final String this.mCurrentAnimationLoopCount = IAnimationData.LOOP_CONTINUOUS; this.mCurrentAnimationFrameDurations.clear(); this.mCurrentAnimationFrameTexturePackTextureRegions.clear(); - } else if(pLocalName.equals(AnimationPackParser.TAG_ANIMATIONFRAME)) { + } else if (pLocalName.equals(AnimationPackParser.TAG_ANIMATIONFRAME)) { /* Nothing. */ } else { throw new AnimationPackParseException("Unexpected end tag: '" + pLocalName + "'."); diff --git a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java index e726c6249..71e39cf20 100644 --- a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java +++ b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java @@ -34,7 +34,7 @@ public AnimationPackTiledTextureRegion(final String pAnimationName, final long[] final int frameCount = pFrameDurations.length; final int[] frames= new int[frameCount]; - for(int i = 0; i < frameCount; i++) { + for (int i = 0; i < frameCount; i++) { frames[i] = i; } diff --git a/src/org/andengine/util/debug/Debug.java b/src/org/andengine/util/debug/Debug.java index a9fa397ff..4f13c28d8 100644 --- a/src/org/andengine/util/debug/Debug.java +++ b/src/org/andengine/util/debug/Debug.java @@ -45,14 +45,14 @@ public static DebugLevel getDebugLevel() { } public static void setDebugLevel(final DebugLevel pDebugLevel) { - if(pDebugLevel == null) { + if (pDebugLevel == null) { throw new IllegalArgumentException("pDebugLevel must not be null!"); } Debug.sDebugLevel = pDebugLevel; } public static void setDebugUser(final String pDebugUser) { - if(pDebugUser == null) { + if (pDebugUser == null) { throw new IllegalArgumentException("pDebugUser must not be null!"); } Debug.sDebugUser = pDebugUser; @@ -67,7 +67,7 @@ public static void setDebugUser(final String pDebugUser) { // =========================================================== public static void log(final DebugLevel pDebugLevel, final String pMessage) { - switch(pDebugLevel) { + switch (pDebugLevel) { case NONE: return; case VERBOSE: @@ -89,7 +89,7 @@ public static void log(final DebugLevel pDebugLevel, final String pMessage) { } public static void log(final DebugLevel pDebugLevel, final String pMessage, final Throwable pThrowable) { - switch(pDebugLevel) { + switch (pDebugLevel) { case NONE: return; case VERBOSE: @@ -111,7 +111,7 @@ public static void log(final DebugLevel pDebugLevel, final String pMessage, fina } public static void log(final DebugLevel pDebugLevel, final String pTag, final String pMessage) { - switch(pDebugLevel) { + switch (pDebugLevel) { case NONE: return; case VERBOSE: @@ -133,7 +133,7 @@ public static void log(final DebugLevel pDebugLevel, final String pTag, final St } public static void log(final DebugLevel pDebugLevel, final String pTag, final String pMessage, final Throwable pThrowable) { - switch(pDebugLevel) { + switch (pDebugLevel) { case NONE: return; case VERBOSE: @@ -167,8 +167,8 @@ public static void v(final String pTag, final String pMessage) { } public static void v(final String pTag, final String pMessage, final Throwable pThrowable) { - if(Debug.sDebugLevel.isSameOrLessThan(DebugLevel.VERBOSE)) { - if(pThrowable == null) { + if (Debug.sDebugLevel.isSameOrLessThan(DebugLevel.VERBOSE)) { + if (pThrowable == null) { Log.v(pTag, pMessage); } else { Log.v(pTag, pMessage, pThrowable); @@ -177,25 +177,25 @@ public static void v(final String pTag, final String pMessage, final Throwable p } public static void vUser(final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.v(pMessage); } } public static void vUser(final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.v(pMessage, pThrowable); } } public static void vUser(final String pTag, final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.v(pTag, pMessage); } } public static void vUser(final String pTag, final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.v(pTag, pMessage, pThrowable); } } @@ -213,8 +213,8 @@ public static void d(final String pTag, final String pMessage) { } public static void d(final String pTag, final String pMessage, final Throwable pThrowable) { - if(Debug.sDebugLevel.isSameOrLessThan(DebugLevel.DEBUG)) { - if(pThrowable == null) { + if (Debug.sDebugLevel.isSameOrLessThan(DebugLevel.DEBUG)) { + if (pThrowable == null) { Log.d(pTag, pMessage); } else { Log.d(pTag, pMessage, pThrowable); @@ -223,25 +223,25 @@ public static void d(final String pTag, final String pMessage, final Throwable p } public static void dUser(final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.d(pMessage); } } public static void dUser(final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.d(pMessage, pThrowable); } } public static void dUser(final String pTag, final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.d(pTag, pMessage); } } public static void dUser(final String pTag, final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.d(pTag, pMessage, pThrowable); } } @@ -259,8 +259,8 @@ public static void i(final String pTag, final String pMessage) { } public static void i(final String pTag, final String pMessage, final Throwable pThrowable) { - if(Debug.sDebugLevel.isSameOrLessThan(DebugLevel.INFO)) { - if(pThrowable == null) { + if (Debug.sDebugLevel.isSameOrLessThan(DebugLevel.INFO)) { + if (pThrowable == null) { Log.i(pTag, pMessage); } else { Log.i(pTag, pMessage, pThrowable); @@ -269,25 +269,25 @@ public static void i(final String pTag, final String pMessage, final Throwable p } public static void iUser(final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.i(pMessage); } } public static void iUser(final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.i(pMessage, pThrowable); } } public static void iUser(final String pTag, final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.i(pTag, pMessage); } } public static void iUser(final String pTag, final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.i(pTag, pMessage, pThrowable); } } @@ -309,8 +309,8 @@ public static void w(final String pTag, final String pMessage) { } public static void w(final String pTag, final String pMessage, final Throwable pThrowable) { - if(Debug.sDebugLevel.isSameOrLessThan(DebugLevel.WARNING)) { - if(pThrowable == null) { + if (Debug.sDebugLevel.isSameOrLessThan(DebugLevel.WARNING)) { + if (pThrowable == null) { Log.w(pTag, pMessage); } else { Log.w(pTag, pMessage, pThrowable); @@ -319,31 +319,31 @@ public static void w(final String pTag, final String pMessage, final Throwable p } public static void wUser(final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.w(pMessage); } } public static void wUser(final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.w(pThrowable); } } public static void wUser(final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.w(pMessage, pThrowable); } } public static void wUser(final String pTag, final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.w(pTag, pMessage); } } public static void wUser(final String pTag, final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.w(pTag, pMessage, pThrowable); } } @@ -365,8 +365,8 @@ public static void e(final String pTag, final String pMessage) { } public static void e(final String pTag, final String pMessage, final Throwable pThrowable) { - if(Debug.sDebugLevel.isSameOrLessThan(DebugLevel.ERROR)) { - if(pThrowable == null) { + if (Debug.sDebugLevel.isSameOrLessThan(DebugLevel.ERROR)) { + if (pThrowable == null) { Log.e(pTag, pMessage); } else { Log.e(pTag, pMessage, pThrowable); @@ -375,31 +375,31 @@ public static void e(final String pTag, final String pMessage, final Throwable p } public static void eUser(final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.e(pMessage); } } public static void eUser(final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.e(pThrowable); } } public static void eUser(final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.e(pMessage, pThrowable); } } public static void eUser(final String pTag, final String pMessage, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.e(pTag, pMessage); } } public static void eUser(final String pTag, final String pMessage, final Throwable pThrowable, final String pDebugUser) { - if(Debug.sDebugUser.equals(pDebugUser)) { + if (Debug.sDebugUser.equals(pDebugUser)) { Debug.e(pTag, pMessage, pThrowable); } } diff --git a/src/org/andengine/util/debug/DebugTimer.java b/src/org/andengine/util/debug/DebugTimer.java index ad529152b..832e9b85e 100644 --- a/src/org/andengine/util/debug/DebugTimer.java +++ b/src/org/andengine/util/debug/DebugTimer.java @@ -71,7 +71,7 @@ public void split(final String pLabel) { public void end() { final long now = System.currentTimeMillis(); - if(this.mDebugTimes.size() == 1) { + if (this.mDebugTimes.size() == 1) { throw new IllegalStateException("Cannot end the root of this " + this.getClass().getSimpleName()); } else { this.mDebugTimes.pop().end(now); @@ -84,7 +84,7 @@ public void dump() { public void dump(final boolean pClear) { final long now = System.currentTimeMillis(); - if(this.mDebugTimes.size() > 1) { + if (this.mDebugTimes.size() > 1) { Debug.w(this.getClass().getSimpleName() + " not all ended!"); } @@ -92,7 +92,7 @@ public void dump(final boolean pClear) { root.end(now); root.dump(0); - if(pClear) { + if (pClear) { this.clear(); } } @@ -159,7 +159,7 @@ public void split(final String pLabel) { final long now = System.currentTimeMillis(); final DebugTime split; - if(this.mLastSplit == null) { + if (this.mLastSplit == null) { split = new DebugTime(this.mStartTime, pLabel, true); } else { split = new DebugTime(this.mLastSplit.mEndTime, pLabel, true); @@ -181,21 +181,21 @@ public void dump(final int pIndent) { } public void dump(final int pIndent, final String pPostfix) { - if(this.mSplit) { + if (this.mSplit) { final char[] indent = new char[(pIndent - 1) * INDENT_SPACES]; Arrays.fill(indent, ' '); Debug.log(DebugTimer.this.mDebugLevel, new String(indent) + SPLIT_STRING + "'" + this.mLabel + "'" + " @( " + (this.mEndTime - this.mStartTime) + "ms )" + pPostfix); } else { final char[] indent = new char[pIndent * INDENT_SPACES]; Arrays.fill(indent, ' '); - if(this.mChildren == null) { + if (this.mChildren == null) { Debug.log(DebugTimer.this.mDebugLevel, new String(indent) + "'" + this.mLabel + "' @( " + (this.mEndTime - this.mStartTime) + "ms )" + pPostfix); } else { final ArrayList children = this.mChildren; final int childCount = children.size(); Debug.log(DebugTimer.this.mDebugLevel, new String(indent) + "'" + this.mLabel + "' {"); - for(int i = 0; i < childCount - 1; i++) { + for (int i = 0; i < childCount - 1; i++) { children.get(i).dump(pIndent + 1, ","); } children.get(childCount - 1).dump(pIndent + 1); @@ -205,7 +205,7 @@ public void dump(final int pIndent, final String pPostfix) { } private void ensureChildrenAllocated() { - if(this.mChildren == null) { + if (this.mChildren == null) { this.mChildren = new ArrayList(); } } diff --git a/src/org/andengine/util/escape/Unescaper.java b/src/org/andengine/util/escape/Unescaper.java index 34da63db7..25f25ee3b 100644 --- a/src/org/andengine/util/escape/Unescaper.java +++ b/src/org/andengine/util/escape/Unescaper.java @@ -54,19 +54,19 @@ public static String unescape(final CharSequence pCharSequence, final IIntLookup final StringBuilder stringBuilder = new StringBuilder(stringLength); int i; - for(i = 0; i < stringLength; ++i) { + for (i = 0; i < stringLength; ++i) { final char ch = pCharSequence.charAt(i); - if(ch == '&') { + if (ch == '&') { final int semi = TextUtils.indexOf(pCharSequence, ';', i + 1); - if(semi == -1) { + if (semi == -1) { stringBuilder.append(ch); continue; } final CharSequence entityName = pCharSequence.subSequence(i + 1, semi); int entityValue; - if(entityName.charAt(0) == '#') { + if (entityName.charAt(0) == '#') { final char charAt1 = entityName.charAt(1); - if((charAt1 == 'x') || (charAt1 == 'X')) { + if ((charAt1 == 'x') || (charAt1 == 'X')) { entityValue = Integer.valueOf(entityName.subSequence(2, entityName.length()).toString(), 16).intValue(); } else { entityValue = Integer.parseInt(entityName.subSequence(1, entityName.length()).toString()); @@ -74,7 +74,7 @@ public static String unescape(final CharSequence pCharSequence, final IIntLookup } else { entityValue = pIntLookupMap.value(entityName); } - if(entityValue == -1) { + if (entityValue == -1) { stringBuilder.append('&'); stringBuilder.append(entityName); stringBuilder.append(';'); diff --git a/src/org/andengine/util/escape/UnescaperEntityMap.java b/src/org/andengine/util/escape/UnescaperEntityMap.java index 83695bd5a..25a92acce 100644 --- a/src/org/andengine/util/escape/UnescaperEntityMap.java +++ b/src/org/andengine/util/escape/UnescaperEntityMap.java @@ -39,14 +39,14 @@ public class UnescaperEntityMap extends IntLookupMap { @Override public CharSequence item(final int pValue) { - if(pValue < UnescaperEntityMap.LOOKUP_TABLE_SIZE) { + if (pValue < UnescaperEntityMap.LOOKUP_TABLE_SIZE) { return this.mLookupTable[pValue]; } return super.item(pValue); } public void init() { - for(int i = 0; i < UnescaperEntityMap.LOOKUP_TABLE_SIZE; ++i) { + for (int i = 0; i < UnescaperEntityMap.LOOKUP_TABLE_SIZE; ++i) { this.mLookupTable[i] = super.item(i); } } diff --git a/src/org/andengine/util/level/LevelLoader.java b/src/org/andengine/util/level/LevelLoader.java index cb5bf070c..59488432e 100644 --- a/src/org/andengine/util/level/LevelLoader.java +++ b/src/org/andengine/util/level/LevelLoader.java @@ -68,7 +68,7 @@ public void setDefaultEntityLoader(final IEntityLoader pDefaultEntityLoader) public void registerEntityLoader(final IEntityLoader pEntityLoader) { final String[] entityNames = pEntityLoader.getEntityNames(); - for(int i = 0; i < entityNames.length; i++) { + for (int i = 0; i < entityNames.length; i++) { final String entityName = entityNames[i]; this.mEntityLoaders.put(entityName, pEntityLoader); } diff --git a/src/org/andengine/util/level/LevelLoaderContentHandler.java b/src/org/andengine/util/level/LevelLoaderContentHandler.java index 67414a912..8674e269f 100644 --- a/src/org/andengine/util/level/LevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/LevelLoaderContentHandler.java @@ -67,8 +67,8 @@ public void startElement(final String pUri, final String pLocalName, final Strin final IEntity parent = (this.mParentEntityStack.isEmpty()) ? null : this.mParentEntityStack.getLast(); IEntityLoader entityLoader = this.mEntityLoaders.get(entityName); - if(entityLoader == null) { - if(this.mDefaultEntityLoader == null) { + if (entityLoader == null) { + if (this.mDefaultEntityLoader == null) { throw new LevelLoaderException("Unexpected tag: '" + entityName + "'."); } else { entityLoader = this.mDefaultEntityLoader; @@ -82,17 +82,17 @@ public void startElement(final String pUri, final String pLocalName, final Strin throw new LevelLoaderException("Exception when loading entity: '" + entityName + "'.", e); } - if(entity == null) { + if (entity == null) { throw new LevelLoaderException(); } - if(parent == null) { + if (parent == null) { this.mRootEntity = entity; } else { parent.attachChild(entity); } - if(this.mEntityLoaderListener != null) { + if (this.mEntityLoaderListener != null) { this.mEntityLoaderListener.onEntityLoaded(entity, pAttributes); } diff --git a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java index dc0af6c29..c475fa8c5 100644 --- a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java +++ b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java @@ -53,7 +53,7 @@ public LevelStatsDBConnector(final Context pContext, final String pSecret, final final SharedPreferences simplePreferences = SimplePreferences.getInstance(pContext); final int playerID = simplePreferences.getInt(PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_ID, -1); - if(playerID != -1) { + if (playerID != -1) { this.mPlayerID = playerID; } else { this.mPlayerID = MathUtils.random(1000000000, Integer.MAX_VALUE); @@ -97,26 +97,26 @@ public void run() { final HttpResponse httpResponse = httpClient.execute(httpPost); final int statusCode = httpResponse.getStatusLine().getStatusCode(); - if(statusCode == HttpStatus.SC_OK) { + if (statusCode == HttpStatus.SC_OK) { final String response = StreamUtils.readFully(httpResponse.getEntity().getContent()); - if(response.equals("")) { - if(pCallback != null) { + if (response.equals("")) { + if (pCallback != null) { pCallback.onCallback(true); } } else { - if(pCallback != null) { + if (pCallback != null) { pCallback.onCallback(false); } } } else { - if(pCallback != null) { + if (pCallback != null) { pCallback.onCallback(false); } } }catch(final IOException e) { Debug.e(e); - if(pCallback != null) { + if (pCallback != null) { pCallback.onCallback(false); } } diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index efe934d4d..2d70e36ea 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -195,9 +195,9 @@ public static final float degToRad(final float pDegree) { } public static final int signum(final int n) { - if(n == 0) { + if (n == 0) { return 0; - } else if(n > 0) { + } else if (n > 0) { return 1; } else { return -1; @@ -205,7 +205,7 @@ public static final int signum(final int n) { } public static final int randomSign() { - if(MathUtils.RANDOM.nextBoolean()) { + if (MathUtils.RANDOM.nextBoolean()) { return 1; } else { return -1; @@ -251,7 +251,7 @@ public static final int nextPowerOfTwo(final int n) { public static final int sum(final int[] pValues) { int sum = 0; - for(int i = pValues.length - 1; i >= 0; i--) { + for (int i = pValues.length - 1; i >= 0; i--) { sum += pValues[i]; } @@ -259,12 +259,12 @@ public static final int sum(final int[] pValues) { } public static float[] rotateAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY) { - if(pRotation != 0) { + if (pRotation != 0) { final float rotationRad = MathUtils.degToRad(pRotation); final float sinRotationRad = FloatMath.sin(rotationRad); final float cosRotationInRad = FloatMath.cos(rotationRad); - for(int i = pVertices.length - 2; i >= 0; i -= 2) { + for (int i = pVertices.length - 2; i >= 0; i -= 2) { final float pX = pVertices[i]; final float pY = pVertices[i + 1]; pVertices[i] = pRotationCenterX + ((cosRotationInRad * (pX - pRotationCenterX)) - (sinRotationRad * (pY - pRotationCenterY))); @@ -275,8 +275,8 @@ public static float[] rotateAroundCenter(final float[] pVertices, final float pR } public static float[] scaleAroundCenter(final float[] pVertices, final float pScaleX, final float pScaleY, final float pScaleCenterX, final float pScaleCenterY) { - if((pScaleX != 1) || (pScaleY != 1)) { - for(int i = pVertices.length - 2; i >= 0; i -= 2) { + if ((pScaleX != 1) || (pScaleY != 1)) { + for (int i = pVertices.length - 2; i >= 0; i -= 2) { pVertices[i] = pScaleCenterX + ((pVertices[i] - pScaleCenterX) * pScaleX); pVertices[i + 1] = pScaleCenterY + ((pVertices[i + 1] - pScaleCenterY) * pScaleY); } @@ -334,7 +334,7 @@ public static final float bringToBounds(final float pMinValue, final float pMaxV /** * @return the euclidean distance between the points (pX1, pY1) and (pX2, pY2). */ - public static final float distance(final float pX1, final float pY1, final float pX2, final float pY2){ + public static final float distance(final float pX1, final float pY1, final float pX2, final float pY2) { final float dX = pX2 - pX1; final float dY = pY2 - pY1; return FloatMath.sqrt((dX * dX) + (dY * dY)); @@ -343,7 +343,7 @@ public static final float distance(final float pX1, final float pY1, final float /** * @return the euclidean distance between the origin (0, 0) and (pX, pY). */ - public static final float length(final float pX, final float pY){ + public static final float length(final float pX, final float pY) { return FloatMath.sqrt((pX * pX) + (pY * pY)); } diff --git a/src/org/andengine/util/mime/MIMEType.java b/src/org/andengine/util/mime/MIMEType.java index 6308b50f2..b329dad24 100644 --- a/src/org/andengine/util/mime/MIMEType.java +++ b/src/org/andengine/util/mime/MIMEType.java @@ -13,7 +13,7 @@ public enum MIMEType { // =========================================================== JPEG("image/jpeg"), - GIF("image/gif"), + Gif ("image/gif"), PNG("image/png"), TEXT("text/plain"); diff --git a/src/org/andengine/util/modifier/BaseDurationModifier.java b/src/org/andengine/util/modifier/BaseDurationModifier.java index 6ba287f6c..422407589 100644 --- a/src/org/andengine/util/modifier/BaseDurationModifier.java +++ b/src/org/andengine/util/modifier/BaseDurationModifier.java @@ -62,16 +62,16 @@ public float getDuration() { @Override public final float onUpdate(final float pSecondsElapsed, final T pItem) { - if(this.mFinished){ + if (this.mFinished) { return 0; } else { - if(this.mSecondsElapsed == 0) { + if (this.mSecondsElapsed == 0) { this.onManagedInitialize(pItem); this.onModifierStarted(pItem); } final float secondsElapsedUsed; - if(this.mSecondsElapsed + pSecondsElapsed < this.mDuration) { + if (this.mSecondsElapsed + pSecondsElapsed < this.mDuration) { secondsElapsedUsed = pSecondsElapsed; } else { secondsElapsedUsed = this.mDuration - this.mSecondsElapsed; @@ -80,7 +80,7 @@ public final float onUpdate(final float pSecondsElapsed, final T pItem) { this.mSecondsElapsed += secondsElapsedUsed; this.onManagedUpdate(secondsElapsedUsed, pItem); - if(this.mDuration != -1 && this.mSecondsElapsed >= this.mDuration) { + if (this.mDuration != -1 && this.mSecondsElapsed >= this.mDuration) { this.mSecondsElapsed = this.mDuration; this.mFinished = true; this.onModifierFinished(pItem); diff --git a/src/org/andengine/util/modifier/BaseModifier.java b/src/org/andengine/util/modifier/BaseModifier.java index a18ec6334..570ad3b62 100644 --- a/src/org/andengine/util/modifier/BaseModifier.java +++ b/src/org/andengine/util/modifier/BaseModifier.java @@ -61,14 +61,14 @@ public final void setAutoUnregisterWhenFinished(final boolean pAutoUnregisterWhe @Override public void addModifierListener(final IModifierListener pModifierListener) { - if(pModifierListener != null) { + if (pModifierListener != null) { this.mModifierListeners.add(pModifierListener); } } @Override public boolean removeModifierListener(final IModifierListener pModifierListener) { - if(pModifierListener == null) { + if (pModifierListener == null) { return false; } else { return this.mModifierListeners.remove(pModifierListener); @@ -85,7 +85,7 @@ public boolean removeModifierListener(final IModifierListener pModifierListen protected void onModifierStarted(final T pItem) { final SmartList> modifierListeners = this.mModifierListeners; final int modifierListenerCount = modifierListeners.size(); - for(int i = modifierListenerCount - 1; i >= 0; i--) { + for (int i = modifierListenerCount - 1; i >= 0; i--) { modifierListeners.get(i).onModifierStarted(this, pItem); } } @@ -93,21 +93,21 @@ protected void onModifierStarted(final T pItem) { protected void onModifierFinished(final T pItem) { final SmartList> modifierListeners = this.mModifierListeners; final int modifierListenerCount = modifierListeners.size(); - for(int i = modifierListenerCount - 1; i >= 0; i--) { + for (int i = modifierListenerCount - 1; i >= 0; i--) { modifierListeners.get(i).onModifierFinished(this, pItem); } } protected final void assertNoNullModifier(final IModifier pModifier) { - if(pModifier == null) { + if (pModifier == null) { throw new IllegalArgumentException("Illegal 'null' " + IModifier.class.getSimpleName() + " detected!"); } } protected final void assertNoNullModifier(final IModifier ... pModifiers) { final int modifierCount = pModifiers.length; - for(int i = 0; i < modifierCount; i++) { - if(pModifiers[i] == null) { + for (int i = 0; i < modifierCount; i++) { + if (pModifiers[i] == null) { throw new IllegalArgumentException("Illegal 'null' " + IModifier.class.getSimpleName() + " detected at position: '" + i + "'!"); } } diff --git a/src/org/andengine/util/modifier/LoopModifier.java b/src/org/andengine/util/modifier/LoopModifier.java index bc90815d8..c998f433b 100644 --- a/src/org/andengine/util/modifier/LoopModifier.java +++ b/src/org/andengine/util/modifier/LoopModifier.java @@ -107,7 +107,7 @@ public float getDuration() { @Override public float onUpdate(final float pSecondsElapsed, final T pItem) { - if(this.mFinished){ + if (this.mFinished) { return 0; } else { float secondsElapsedRemaining = pSecondsElapsed; @@ -140,27 +140,27 @@ public void reset() { @Override public void onModifierStarted(final IModifier pModifier, final T pItem) { - if(!this.mModifierStartedCalled) { + if (!this.mModifierStartedCalled) { this.mModifierStartedCalled = true; this.onModifierStarted(pItem); } - if(this.mLoopModifierListener != null) { + if (this.mLoopModifierListener != null) { this.mLoopModifierListener.onLoopStarted(this, this.mLoop, this.mLoopCount); } } @Override public void onModifierFinished(final IModifier pModifier, final T pItem) { - if(this.mLoopModifierListener != null) { + if (this.mLoopModifierListener != null) { this.mLoopModifierListener.onLoopFinished(this, this.mLoop, this.mLoopCount); } - if(this.mLoopCount == LoopModifier.LOOP_CONTINUOUS) { + if (this.mLoopCount == LoopModifier.LOOP_CONTINUOUS) { this.mSecondsElapsed = 0; this.mModifier.reset(); } else { this.mLoop++; - if(this.mLoop >= this.mLoopCount) { + if (this.mLoop >= this.mLoopCount) { this.mFinished = true; this.mFinishedCached = true; this.onModifierFinished(pItem); diff --git a/src/org/andengine/util/modifier/ModifierList.java b/src/org/andengine/util/modifier/ModifierList.java index 5558aa109..3f8424615 100644 --- a/src/org/andengine/util/modifier/ModifierList.java +++ b/src/org/andengine/util/modifier/ModifierList.java @@ -31,7 +31,7 @@ public ModifierList(final T pTarget) { this.mTarget = pTarget; } - public ModifierList(final T pTarget, final int pCapacity){ + public ModifierList(final T pTarget, final int pCapacity) { super(pCapacity); this.mTarget = pTarget; } @@ -50,7 +50,7 @@ public T getTarget() { @Override public boolean add(final IModifier pModifier) { - if(pModifier == null) { + if (pModifier == null) { throw new IllegalArgumentException("Supplied " + IModifier.class.getSimpleName() + " must not be null."); } else { return super.add(pModifier); @@ -60,11 +60,11 @@ public boolean add(final IModifier pModifier) { @Override public void onUpdate(final float pSecondsElapsed) { final int modifierCount = this.size(); - if(modifierCount > 0) { - for(int i = modifierCount - 1; i >= 0; i--) { + if (modifierCount > 0) { + for (int i = modifierCount - 1; i >= 0; i--) { final IModifier modifier = this.get(i); modifier.onUpdate(pSecondsElapsed, this.mTarget); - if(modifier.isFinished() && modifier.isAutoUnregisterWhenFinished()) { + if (modifier.isFinished() && modifier.isAutoUnregisterWhenFinished()) { this.remove(i); } } @@ -73,7 +73,7 @@ public void onUpdate(final float pSecondsElapsed) { @Override public void reset() { - for(int i = this.size() - 1; i >= 0; i--) { + for (int i = this.size() - 1; i >= 0; i--) { this.get(i).reset(); } } diff --git a/src/org/andengine/util/modifier/ParallelModifier.java b/src/org/andengine/util/modifier/ParallelModifier.java index 335cd869c..c9fb2b923 100644 --- a/src/org/andengine/util/modifier/ParallelModifier.java +++ b/src/org/andengine/util/modifier/ParallelModifier.java @@ -38,7 +38,7 @@ public ParallelModifier(final IModifier ... pModifiers) throws IllegalArgumen public ParallelModifier(final IModifierListener pModifierListener, final IModifier ... pModifiers) throws IllegalArgumentException { super(pModifierListener); - if(pModifiers.length == 0) { + if (pModifiers.length == 0) { throw new IllegalArgumentException("pModifiers must not be empty!"); } @@ -58,7 +58,7 @@ protected ParallelModifier(final ParallelModifier pParallelModifier) throws D this.mModifiers = new IModifier[otherModifiers.length]; final IModifier[] modifiers = this.mModifiers; - for(int i = modifiers.length - 1; i >= 0; i--) { + for (int i = modifiers.length - 1; i >= 0; i--) { modifiers[i] = otherModifiers[i].deepCopy(); } @@ -92,7 +92,7 @@ public float getDuration() { @Override public float onUpdate(final float pSecondsElapsed, final T pItem) { - if(this.mFinished){ + if (this.mFinished) { return 0; } else { float secondsElapsedRemaining = pSecondsElapsed; @@ -102,7 +102,7 @@ public float onUpdate(final float pSecondsElapsed, final T pItem) { this.mFinishedCached = false; while(secondsElapsedRemaining > 0 && !this.mFinishedCached) { float secondsElapsedUsed = 0; - for(int i = shapeModifiers.length - 1; i >= 0; i--) { + for (int i = shapeModifiers.length - 1; i >= 0; i--) { secondsElapsedUsed = Math.max(secondsElapsedUsed, shapeModifiers[i].onUpdate(pSecondsElapsed, pItem)); } secondsElapsedRemaining -= secondsElapsedUsed; @@ -121,7 +121,7 @@ public void reset() { this.mSecondsElapsed = 0; final IModifier[] shapeModifiers = this.mModifiers; - for(int i = shapeModifiers.length - 1; i >= 0; i--) { + for (int i = shapeModifiers.length - 1; i >= 0; i--) { shapeModifiers[i].reset(); } } diff --git a/src/org/andengine/util/modifier/SequenceModifier.java b/src/org/andengine/util/modifier/SequenceModifier.java index 224e9e9e1..d6a018015 100644 --- a/src/org/andengine/util/modifier/SequenceModifier.java +++ b/src/org/andengine/util/modifier/SequenceModifier.java @@ -49,7 +49,7 @@ public SequenceModifier(final IModifierListener pModifierListener, final IMod public SequenceModifier(final ISubSequenceModifierListener pSubSequenceModifierListener, final IModifierListener pModifierListener, final IModifier ... pModifiers) throws IllegalArgumentException { super(pModifierListener); - if(pModifiers.length == 0) { + if (pModifiers.length == 0) { throw new IllegalArgumentException("pModifiers must not be empty!"); } @@ -71,7 +71,7 @@ protected SequenceModifier(final SequenceModifier pSequenceModifier) throws D this.mSubSequenceModifiers = new IModifier[otherModifiers.length]; final IModifier[] subSequenceModifiers = this.mSubSequenceModifiers; - for(int i = subSequenceModifiers.length - 1; i >= 0; i--) { + for (int i = subSequenceModifiers.length - 1; i >= 0; i--) { subSequenceModifiers[i] = otherModifiers[i].deepCopy(); } @@ -111,7 +111,7 @@ public float getDuration() { @Override public float onUpdate(final float pSecondsElapsed, final T pItem) { - if(this.mFinished){ + if (this.mFinished) { return 0; } else { float secondsElapsedRemaining = pSecondsElapsed; @@ -129,7 +129,7 @@ public float onUpdate(final float pSecondsElapsed, final T pItem) { @Override public void reset() { - if(this.isFinished()) { + if (this.isFinished()) { this.mSubSequenceModifiers[this.mSubSequenceModifiers.length - 1].removeModifierListener(this); } else { this.mSubSequenceModifiers[this.mCurrentSubSequenceModifierIndex].removeModifierListener(this); @@ -142,32 +142,32 @@ public void reset() { this.mSubSequenceModifiers[0].addModifierListener(this); final IModifier[] subSequenceModifiers = this.mSubSequenceModifiers; - for(int i = subSequenceModifiers.length - 1; i >= 0; i--) { + for (int i = subSequenceModifiers.length - 1; i >= 0; i--) { subSequenceModifiers[i].reset(); } } @Override public void onModifierStarted(final IModifier pModifier, final T pItem) { - if(this.mCurrentSubSequenceModifierIndex == 0) { + if (this.mCurrentSubSequenceModifierIndex == 0) { this.onModifierStarted(pItem); } - if(this.mSubSequenceModifierListener != null) { + if (this.mSubSequenceModifierListener != null) { this.mSubSequenceModifierListener.onSubSequenceStarted(pModifier, pItem, this.mCurrentSubSequenceModifierIndex); } } @Override public void onModifierFinished(final IModifier pModifier, final T pItem) { - if(this.mSubSequenceModifierListener != null) { + if (this.mSubSequenceModifierListener != null) { this.mSubSequenceModifierListener.onSubSequenceFinished(pModifier, pItem, this.mCurrentSubSequenceModifierIndex); } pModifier.removeModifierListener(this); this.mCurrentSubSequenceModifierIndex++; - if(this.mCurrentSubSequenceModifierIndex < this.mSubSequenceModifiers.length) { + if (this.mCurrentSubSequenceModifierIndex < this.mSubSequenceModifiers.length) { final IModifier nextSubSequenceModifier = this.mSubSequenceModifiers[this.mCurrentSubSequenceModifierIndex]; nextSubSequenceModifier.addModifierListener(this); } else { diff --git a/src/org/andengine/util/modifier/ease/EaseBackIn.java b/src/org/andengine/util/modifier/ease/EaseBackIn.java index ee0282b85..a0296aa92 100644 --- a/src/org/andengine/util/modifier/ease/EaseBackIn.java +++ b/src/org/andengine/util/modifier/ease/EaseBackIn.java @@ -30,7 +30,7 @@ private EaseBackIn() { } public static EaseBackIn getInstance() { - if(null == INSTANCE) { + if (null == INSTANCE) { INSTANCE = new EaseBackIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseBackInOut.java b/src/org/andengine/util/modifier/ease/EaseBackInOut.java index c3e68fd70..69170bb0e 100644 --- a/src/org/andengine/util/modifier/ease/EaseBackInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseBackInOut.java @@ -28,7 +28,7 @@ private EaseBackInOut() { } public static EaseBackInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseBackInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseBackInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseBackIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseBackOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseBackOut.java b/src/org/andengine/util/modifier/ease/EaseBackOut.java index 71e302e0d..f7a24ad0c 100644 --- a/src/org/andengine/util/modifier/ease/EaseBackOut.java +++ b/src/org/andengine/util/modifier/ease/EaseBackOut.java @@ -28,7 +28,7 @@ private EaseBackOut() { } public static EaseBackOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseBackOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseBounceIn.java b/src/org/andengine/util/modifier/ease/EaseBounceIn.java index ef2e25995..3008aba00 100644 --- a/src/org/andengine/util/modifier/ease/EaseBounceIn.java +++ b/src/org/andengine/util/modifier/ease/EaseBounceIn.java @@ -28,7 +28,7 @@ private EaseBounceIn() { } public static EaseBounceIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseBounceIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseBounceInOut.java b/src/org/andengine/util/modifier/ease/EaseBounceInOut.java index fec86ba0b..0ad71b2f2 100644 --- a/src/org/andengine/util/modifier/ease/EaseBounceInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseBounceInOut.java @@ -28,7 +28,7 @@ private EaseBounceInOut() { } public static EaseBounceInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseBounceInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseBounceInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseBounceIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseBounceOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseBounceOut.java b/src/org/andengine/util/modifier/ease/EaseBounceOut.java index 13d058598..ca52cb753 100644 --- a/src/org/andengine/util/modifier/ease/EaseBounceOut.java +++ b/src/org/andengine/util/modifier/ease/EaseBounceOut.java @@ -28,7 +28,7 @@ private EaseBounceOut() { } public static EaseBounceOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseBounceOut(); } return INSTANCE; @@ -52,12 +52,12 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) { // =========================================================== public static float getValue(final float pPercentage) { - if(pPercentage < (1f / 2.75f)) { + if (pPercentage < (1f / 2.75f)) { return 7.5625f * pPercentage * pPercentage; - } else if(pPercentage < (2f / 2.75f)) { + } else if (pPercentage < (2f / 2.75f)) { final float t = pPercentage - (1.5f / 2.75f); return 7.5625f * t * t + 0.75f; - } else if(pPercentage < (2.5f / 2.75f)) { + } else if (pPercentage < (2.5f / 2.75f)) { final float t = pPercentage - (2.25f / 2.75f); return 7.5625f * t * t + 0.9375f; } else { diff --git a/src/org/andengine/util/modifier/ease/EaseCircularIn.java b/src/org/andengine/util/modifier/ease/EaseCircularIn.java index bd707d8d1..d6b90820d 100644 --- a/src/org/andengine/util/modifier/ease/EaseCircularIn.java +++ b/src/org/andengine/util/modifier/ease/EaseCircularIn.java @@ -30,7 +30,7 @@ private EaseCircularIn() { } public static EaseCircularIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseCircularIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseCircularInOut.java b/src/org/andengine/util/modifier/ease/EaseCircularInOut.java index 53058ba2a..0be0f0862 100644 --- a/src/org/andengine/util/modifier/ease/EaseCircularInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseCircularInOut.java @@ -28,7 +28,7 @@ private EaseCircularInOut() { } public static EaseCircularInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseCircularInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseCircularInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseCircularIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseCircularOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseCircularOut.java b/src/org/andengine/util/modifier/ease/EaseCircularOut.java index cad80942c..d27cfa255 100644 --- a/src/org/andengine/util/modifier/ease/EaseCircularOut.java +++ b/src/org/andengine/util/modifier/ease/EaseCircularOut.java @@ -30,7 +30,7 @@ private EaseCircularOut() { } public static EaseCircularOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseCircularOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseCubicIn.java b/src/org/andengine/util/modifier/ease/EaseCubicIn.java index 526515a7c..15f8a0004 100644 --- a/src/org/andengine/util/modifier/ease/EaseCubicIn.java +++ b/src/org/andengine/util/modifier/ease/EaseCubicIn.java @@ -28,7 +28,7 @@ private EaseCubicIn() { } public static EaseCubicIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseCubicIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseCubicInOut.java b/src/org/andengine/util/modifier/ease/EaseCubicInOut.java index 50cae7a23..dd948c170 100644 --- a/src/org/andengine/util/modifier/ease/EaseCubicInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseCubicInOut.java @@ -28,7 +28,7 @@ private EaseCubicInOut() { } public static EaseCubicInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseCubicInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseCubicInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseCubicIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseCubicOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseCubicOut.java b/src/org/andengine/util/modifier/ease/EaseCubicOut.java index 315eb16c3..ba24db6f5 100644 --- a/src/org/andengine/util/modifier/ease/EaseCubicOut.java +++ b/src/org/andengine/util/modifier/ease/EaseCubicOut.java @@ -28,7 +28,7 @@ private EaseCubicOut() { } public static EaseCubicOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseCubicOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseElasticIn.java b/src/org/andengine/util/modifier/ease/EaseElasticIn.java index 8de385399..0d80cdd37 100644 --- a/src/org/andengine/util/modifier/ease/EaseElasticIn.java +++ b/src/org/andengine/util/modifier/ease/EaseElasticIn.java @@ -32,7 +32,7 @@ private EaseElasticIn() { } public static EaseElasticIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseElasticIn(); } return INSTANCE; @@ -56,10 +56,10 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) { // =========================================================== public static float getValue(final float pSecondsElapsed, final float pDuration, final float pPercentage) { - if(pSecondsElapsed == 0) { + if (pSecondsElapsed == 0) { return 0; } - if(pSecondsElapsed == pDuration) { + if (pSecondsElapsed == pDuration) { return 1; } diff --git a/src/org/andengine/util/modifier/ease/EaseElasticInOut.java b/src/org/andengine/util/modifier/ease/EaseElasticInOut.java index afb13dc56..dc40f0b08 100644 --- a/src/org/andengine/util/modifier/ease/EaseElasticInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseElasticInOut.java @@ -29,7 +29,7 @@ private EaseElasticInOut() { } public static EaseElasticInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseElasticInOut(); } return INSTANCE; @@ -47,7 +47,7 @@ public static EaseElasticInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseElasticIn.getValue(2 * pSecondsElapsed, pDuration, 2 * percentage); } else { return 0.5f + 0.5f * EaseElasticOut.getValue(pSecondsElapsed * 2 - pDuration, pDuration, percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseElasticOut.java b/src/org/andengine/util/modifier/ease/EaseElasticOut.java index 3ae923f50..18bc8ccd7 100644 --- a/src/org/andengine/util/modifier/ease/EaseElasticOut.java +++ b/src/org/andengine/util/modifier/ease/EaseElasticOut.java @@ -32,7 +32,7 @@ private EaseElasticOut() { } public static EaseElasticOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseElasticOut(); } return INSTANCE; @@ -56,10 +56,10 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) { // =========================================================== public static float getValue(final float pSecondsElapsed, final float pDuration, final float pPercentageDone) { - if(pSecondsElapsed == 0) { + if (pSecondsElapsed == 0) { return 0; } - if(pSecondsElapsed == pDuration) { + if (pSecondsElapsed == pDuration) { return 1; } diff --git a/src/org/andengine/util/modifier/ease/EaseExponentialIn.java b/src/org/andengine/util/modifier/ease/EaseExponentialIn.java index 4553f64c7..73a95dfd8 100644 --- a/src/org/andengine/util/modifier/ease/EaseExponentialIn.java +++ b/src/org/andengine/util/modifier/ease/EaseExponentialIn.java @@ -28,7 +28,7 @@ private EaseExponentialIn() { } public static EaseExponentialIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseExponentialIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseExponentialInOut.java b/src/org/andengine/util/modifier/ease/EaseExponentialInOut.java index 7d1eb296b..3817550f6 100644 --- a/src/org/andengine/util/modifier/ease/EaseExponentialInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseExponentialInOut.java @@ -28,7 +28,7 @@ private EaseExponentialInOut() { } public static EaseExponentialInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseExponentialInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseExponentialInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseExponentialIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseExponentialOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseExponentialOut.java b/src/org/andengine/util/modifier/ease/EaseExponentialOut.java index cd56c467f..f38ab2e5a 100644 --- a/src/org/andengine/util/modifier/ease/EaseExponentialOut.java +++ b/src/org/andengine/util/modifier/ease/EaseExponentialOut.java @@ -28,7 +28,7 @@ private EaseExponentialOut() { } public static EaseExponentialOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseExponentialOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseLinear.java b/src/org/andengine/util/modifier/ease/EaseLinear.java index c81879128..f9c7cc6a2 100644 --- a/src/org/andengine/util/modifier/ease/EaseLinear.java +++ b/src/org/andengine/util/modifier/ease/EaseLinear.java @@ -28,7 +28,7 @@ private EaseLinear() { } public static EaseLinear getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseLinear(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseQuadIn.java b/src/org/andengine/util/modifier/ease/EaseQuadIn.java index 443c5a2d7..245516068 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuadIn.java +++ b/src/org/andengine/util/modifier/ease/EaseQuadIn.java @@ -28,7 +28,7 @@ private EaseQuadIn() { } public static EaseQuadIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuadIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseQuadInOut.java b/src/org/andengine/util/modifier/ease/EaseQuadInOut.java index ca3780c32..67aae9154 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuadInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseQuadInOut.java @@ -28,7 +28,7 @@ private EaseQuadInOut() { } public static EaseQuadInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuadInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseQuadInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseQuadIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseQuadOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseQuadOut.java b/src/org/andengine/util/modifier/ease/EaseQuadOut.java index 706382d2d..02d985c69 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuadOut.java +++ b/src/org/andengine/util/modifier/ease/EaseQuadOut.java @@ -28,7 +28,7 @@ private EaseQuadOut() { } public static EaseQuadOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuadOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseQuartIn.java b/src/org/andengine/util/modifier/ease/EaseQuartIn.java index b8a1d861c..c2e09f7ba 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuartIn.java +++ b/src/org/andengine/util/modifier/ease/EaseQuartIn.java @@ -28,7 +28,7 @@ private EaseQuartIn() { } public static EaseQuartIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuartIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseQuartInOut.java b/src/org/andengine/util/modifier/ease/EaseQuartInOut.java index c93b7bfa1..a8b9bbc98 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuartInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseQuartInOut.java @@ -28,7 +28,7 @@ private EaseQuartInOut() { } public static EaseQuartInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuartInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseQuartInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseQuartIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseQuartOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseQuartOut.java b/src/org/andengine/util/modifier/ease/EaseQuartOut.java index bd5bf3f7d..a0aac2714 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuartOut.java +++ b/src/org/andengine/util/modifier/ease/EaseQuartOut.java @@ -28,7 +28,7 @@ private EaseQuartOut() { } public static EaseQuartOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuartOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseQuintIn.java b/src/org/andengine/util/modifier/ease/EaseQuintIn.java index 296be6aef..2517650bf 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuintIn.java +++ b/src/org/andengine/util/modifier/ease/EaseQuintIn.java @@ -28,7 +28,7 @@ private EaseQuintIn() { } public static EaseQuintIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuintIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseQuintInOut.java b/src/org/andengine/util/modifier/ease/EaseQuintInOut.java index 46905b107..e795d0090 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuintInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseQuintInOut.java @@ -28,7 +28,7 @@ private EaseQuintInOut() { } public static EaseQuintInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuintInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseQuintInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseQuintIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseQuintOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseQuintOut.java b/src/org/andengine/util/modifier/ease/EaseQuintOut.java index 1ff5e9017..be4e479d5 100644 --- a/src/org/andengine/util/modifier/ease/EaseQuintOut.java +++ b/src/org/andengine/util/modifier/ease/EaseQuintOut.java @@ -28,7 +28,7 @@ private EaseQuintOut() { } public static EaseQuintOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseQuintOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseSineIn.java b/src/org/andengine/util/modifier/ease/EaseSineIn.java index 23e629cb3..dc8115297 100644 --- a/src/org/andengine/util/modifier/ease/EaseSineIn.java +++ b/src/org/andengine/util/modifier/ease/EaseSineIn.java @@ -32,7 +32,7 @@ private EaseSineIn() { } public static EaseSineIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseSineIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseSineInOut.java b/src/org/andengine/util/modifier/ease/EaseSineInOut.java index 98dcd4113..f6726f569 100644 --- a/src/org/andengine/util/modifier/ease/EaseSineInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseSineInOut.java @@ -31,7 +31,7 @@ private EaseSineInOut() { } public static EaseSineInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseSineInOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseSineOut.java b/src/org/andengine/util/modifier/ease/EaseSineOut.java index 46bf096ff..07b4462a8 100644 --- a/src/org/andengine/util/modifier/ease/EaseSineOut.java +++ b/src/org/andengine/util/modifier/ease/EaseSineOut.java @@ -32,7 +32,7 @@ private EaseSineOut() { } public static EaseSineOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseSineOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseStrongIn.java b/src/org/andengine/util/modifier/ease/EaseStrongIn.java index 1393781e4..f8f462d7d 100644 --- a/src/org/andengine/util/modifier/ease/EaseStrongIn.java +++ b/src/org/andengine/util/modifier/ease/EaseStrongIn.java @@ -28,7 +28,7 @@ private EaseStrongIn() { } public static EaseStrongIn getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseStrongIn(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/ease/EaseStrongInOut.java b/src/org/andengine/util/modifier/ease/EaseStrongInOut.java index 0d6ca61f6..3b2dd4157 100644 --- a/src/org/andengine/util/modifier/ease/EaseStrongInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseStrongInOut.java @@ -28,7 +28,7 @@ private EaseStrongInOut() { } public static EaseStrongInOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseStrongInOut(); } return INSTANCE; @@ -46,7 +46,7 @@ public static EaseStrongInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - if(percentage < 0.5f) { + if (percentage < 0.5f) { return 0.5f * EaseStrongIn.getValue(2 * percentage); } else { return 0.5f + 0.5f * EaseStrongOut.getValue(percentage * 2 - 1); diff --git a/src/org/andengine/util/modifier/ease/EaseStrongOut.java b/src/org/andengine/util/modifier/ease/EaseStrongOut.java index cae57dd0e..5cad9f608 100644 --- a/src/org/andengine/util/modifier/ease/EaseStrongOut.java +++ b/src/org/andengine/util/modifier/ease/EaseStrongOut.java @@ -28,7 +28,7 @@ private EaseStrongOut() { } public static EaseStrongOut getInstance() { - if(INSTANCE == null) { + if (INSTANCE == null) { INSTANCE = new EaseStrongOut(); } return INSTANCE; diff --git a/src/org/andengine/util/modifier/util/ModifierUtils.java b/src/org/andengine/util/modifier/util/ModifierUtils.java index f426f80bd..ac8758bc5 100644 --- a/src/org/andengine/util/modifier/util/ModifierUtils.java +++ b/src/org/andengine/util/modifier/util/ModifierUtils.java @@ -34,10 +34,10 @@ public class ModifierUtils { // Methods // =========================================================== - public static float getSequenceDurationOfModifier(final IModifier[] pModifiers){ + public static float getSequenceDurationOfModifier(final IModifier[] pModifiers) { float duration = Float.MIN_VALUE; - for(int i = pModifiers.length - 1; i >= 0; i--) { + for (int i = pModifiers.length - 1; i >= 0; i--) { duration += pModifiers[i].getDuration(); } diff --git a/src/org/andengine/util/preferences/SimplePreferences.java b/src/org/andengine/util/preferences/SimplePreferences.java index 6ab383ec6..5694badba 100644 --- a/src/org/andengine/util/preferences/SimplePreferences.java +++ b/src/org/andengine/util/preferences/SimplePreferences.java @@ -30,14 +30,14 @@ public class SimplePreferences { // =========================================================== public static SharedPreferences getInstance(final Context pContext) { - if(SimplePreferences.INSTANCE == null) { + if (SimplePreferences.INSTANCE == null) { SimplePreferences.INSTANCE = PreferenceManager.getDefaultSharedPreferences(pContext); } return SimplePreferences.INSTANCE; } public static Editor getEditorInstance(final Context pContext) { - if(SimplePreferences.EDITORINSTANCE == null) { + if (SimplePreferences.EDITORINSTANCE == null) { SimplePreferences.EDITORINSTANCE = SimplePreferences.getInstance(pContext).edit(); } return SimplePreferences.EDITORINSTANCE; diff --git a/src/org/andengine/util/progress/ProgressMonitor.java b/src/org/andengine/util/progress/ProgressMonitor.java index 2d84cc578..248b53006 100644 --- a/src/org/andengine/util/progress/ProgressMonitor.java +++ b/src/org/andengine/util/progress/ProgressMonitor.java @@ -47,7 +47,7 @@ public ProgressMonitor(final IProgressListener pProgressListener) { @Override public void onProgressChanged(final int pProgress) { final int progressListenerCount = this.mProgressListeners.size(); - for(int i = 0; i < progressListenerCount; i++) { + for (int i = 0; i < progressListenerCount; i++) { this.mProgressListeners.get(i).onProgressChanged(pProgress); } } diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index aab7ab99f..64d5b116c 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -55,7 +55,7 @@ public class SystemUtils { public static MemoryInfo getMemoryInfo() { /* Lazy allocation. */ - if(SystemUtils.sMemoryInfo == null) { + if (SystemUtils.sMemoryInfo == null) { SystemUtils.sMemoryInfo = new MemoryInfo(); } @@ -140,7 +140,7 @@ public static float getCPUBogoMips() throws SystemUtilsException { final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/cpuinfo", SystemUtils.BOGOMIPS_PATTERN, 1000); try { - if(matchResult.groupCount() > 0) { + if (matchResult.groupCount() > 0) { return Float.parseFloat(matchResult.group(1)); } else { throw new SystemUtilsException(); @@ -158,7 +158,7 @@ public static long getSystemMemorySize() throws SystemUtilsException { final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/meminfo", SystemUtils.MEMTOTAL_PATTERN, 1000); try { - if(matchResult.groupCount() > 0) { + if (matchResult.groupCount() > 0) { return Long.parseLong(matchResult.group(1)); } else { throw new SystemUtilsException(); @@ -176,7 +176,7 @@ public static long getSystemMemoryFreeSize() throws SystemUtilsException { final MatchResult matchResult = SystemUtils.matchSystemFile("/proc/meminfo", SystemUtils.MEMFREE_PATTERN, 1000); try { - if(matchResult.groupCount() > 0) { + if (matchResult.groupCount() > 0) { return Long.parseLong(matchResult.group(1)); } else { throw new SystemUtilsException(); @@ -235,7 +235,7 @@ private static MatchResult matchSystemFile(final String pSystemFile, final Strin final Scanner scanner = new Scanner(in); final boolean matchFound = scanner.findWithinHorizon(pPattern, pHorizon) != null; - if(matchFound) { + if (matchFound) { return scanner.match(); } else { throw new SystemUtilsException(); diff --git a/src/org/andengine/util/texturepack/TexturePackParser.java b/src/org/andengine/util/texturepack/TexturePackParser.java index bd8034546..b4786fbd2 100644 --- a/src/org/andengine/util/texturepack/TexturePackParser.java +++ b/src/org/andengine/util/texturepack/TexturePackParser.java @@ -118,13 +118,13 @@ public TexturePack getTexturePack() { @Override public void startElement(final String pUri, final String pLocalName, final String pQualifiedName, final Attributes pAttributes) throws SAXException { - if(pLocalName.equals(TexturePackParser.TAG_TEXTURE)) { + if (pLocalName.equals(TexturePackParser.TAG_TEXTURE)) { this.mVersion = SAXUtils.getIntAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTURE_ATTRIBUTE_VERSION); this.mTexture = this.parseTexture(pAttributes); this.mTextureRegionLibrary = new TexturePackTextureRegionLibrary(10); this.mTexturePack = new TexturePack(this.mTexture, this.mTextureRegionLibrary); - } else if(pLocalName.equals(TexturePackParser.TAG_TEXTUREREGION)) { + } else if (pLocalName.equals(TexturePackParser.TAG_TEXTUREREGION)) { final int id = SAXUtils.getIntAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTUREREGION_ATTRIBUTE_ID); final int x = SAXUtils.getIntAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTUREREGION_ATTRIBUTE_X); final int y = SAXUtils.getIntAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTUREREGION_ATTRIBUTE_Y); @@ -158,7 +158,7 @@ protected InputStream onGetInputStream(final String pFilename) throws IOExceptio private ITexture parseTexture(final Attributes pAttributes) throws TexturePackParseException { final String file = SAXUtils.getAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTURE_ATTRIBUTE_FILE); - if(this.mTextureManager.hasMappedTexture(file)) { + if (this.mTextureManager.hasMappedTexture(file)) { return this.mTextureManager.getMappedTexture(file); } @@ -168,7 +168,7 @@ private ITexture parseTexture(final Attributes pAttributes) throws TexturePackPa final TextureOptions textureOptions = this.parseTextureOptions(pAttributes); final ITexture texture; - if(type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_BITMAP)) { + if (type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_BITMAP)) { try { texture = new BitmapTexture(this.mTextureManager, new IInputStreamOpener() { @Override @@ -179,7 +179,7 @@ public InputStream open() throws IOException { } catch (final IOException e) { throw new TexturePackParseException(e); } - } else if(type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVR)) { + } else if (type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVR)) { try { texture = new PVRTexture(this.mTextureManager, PVRTextureFormat.fromPixelFormat(pixelFormat), new SmartPVRTexturePixelBufferStrategy(DataConstants.BYTES_PER_MEGABYTE / 8), textureOptions) { @Override @@ -190,7 +190,7 @@ protected InputStream onGetInputStream() throws IOException { } catch (final IOException e) { throw new TexturePackParseException(e); } - } else if(type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVRGZ)) { + } else if (type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVRGZ)) { try { texture = new PVRGZTexture(this.mTextureManager, PVRTextureFormat.fromPixelFormat(pixelFormat), new SmartPVRTexturePixelBufferStrategy(DataConstants.BYTES_PER_MEGABYTE / 8), textureOptions) { @Override @@ -201,7 +201,7 @@ protected InputStream onGetInputStream() throws IOException { } catch (final IOException e) { throw new TexturePackParseException(e); } - } else if(type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVRCCZ)) { + } else if (type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_PVRCCZ)) { try { texture = new PVRCCZTexture(this.mTextureManager, PVRTextureFormat.fromPixelFormat(pixelFormat), new SmartPVRTexturePixelBufferStrategy(DataConstants.BYTES_PER_MEGABYTE / 8), textureOptions) { @Override @@ -248,17 +248,17 @@ private TextureOptions parseTextureOptions(final Attributes pAttributes) { private static int parseMinFilter(final Attributes pAttributes) { final String minFilter = SAXUtils.getAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER); - if(minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_NEAREST)) { + if (minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_NEAREST)) { return GL10.GL_NEAREST; - } else if(minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_LINEAR)) { + } else if (minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_LINEAR)) { return GL10.GL_LINEAR; - } else if(minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_LINEAR_MIPMAP_LINEAR)) { + } else if (minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_LINEAR_MIPMAP_LINEAR)) { return GL10.GL_LINEAR_MIPMAP_LINEAR; - } else if(minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_LINEAR_MIPMAP_NEAREST)) { + } else if (minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_LINEAR_MIPMAP_NEAREST)) { return GL10.GL_LINEAR_MIPMAP_NEAREST; - } else if(minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_NEAREST_MIPMAP_LINEAR)) { + } else if (minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_NEAREST_MIPMAP_LINEAR)) { return GL10.GL_NEAREST_MIPMAP_LINEAR; - } else if(minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_NEAREST_MIPMAP_NEAREST)) { + } else if (minFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER_VALUE_NEAREST_MIPMAP_NEAREST)) { return GL10.GL_NEAREST_MIPMAP_NEAREST; } else { throw new IllegalArgumentException("Unexpected " + TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MINFILTER + " attribute: '" + minFilter + "'."); @@ -267,9 +267,9 @@ private static int parseMinFilter(final Attributes pAttributes) { private static int parseMagFilter(final Attributes pAttributes) { final String magFilter = SAXUtils.getAttributeOrThrow(pAttributes, TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MAGFILTER); - if(magFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MAGFILTER_VALUE_NEAREST)) { + if (magFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MAGFILTER_VALUE_NEAREST)) { return GL10.GL_NEAREST; - } else if(magFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MAGFILTER_VALUE_LINEAR)) { + } else if (magFilter.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MAGFILTER_VALUE_LINEAR)) { return GL10.GL_LINEAR; } else { throw new IllegalArgumentException("Unexpected " + TexturePackParser.TAG_TEXTURE_ATTRIBUTE_MAGFILTER + " attribute: '" + magFilter + "'."); @@ -286,11 +286,11 @@ private int parseWrapS(final Attributes pAttributes) { private int parseWrap(final Attributes pAttributes, final String pWrapAttributeName) { final String wrapAttribute = SAXUtils.getAttributeOrThrow(pAttributes, pWrapAttributeName); - if(this.mVersion == 1 && wrapAttribute.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_WRAP_VALUE_CLAMP)) { + if (this.mVersion == 1 && wrapAttribute.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_WRAP_VALUE_CLAMP)) { return GL10.GL_CLAMP_TO_EDGE; - } else if(wrapAttribute.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_WRAP_VALUE_CLAMP_TO_EDGE)) { + } else if (wrapAttribute.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_WRAP_VALUE_CLAMP_TO_EDGE)) { return GL10.GL_CLAMP_TO_EDGE; - } else if(wrapAttribute.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_WRAP_VALUE_REPEAT)) { + } else if (wrapAttribute.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_WRAP_VALUE_REPEAT)) { return GL10.GL_REPEAT; } else { throw new IllegalArgumentException("Unexpected " + pWrapAttributeName + " attribute: '" + wrapAttribute + "'."); diff --git a/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java b/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java index 65d1cc55f..f556bf21e 100644 --- a/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java +++ b/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java @@ -71,9 +71,9 @@ public TexturePackTextureRegion get(final String pSource) { } public TexturePackTextureRegion get(final String pSource, final boolean pStripExtension) { - if(pStripExtension) { + if (pStripExtension) { final int indexOfExtension = pSource.lastIndexOf('.'); - if(indexOfExtension == -1) { + if (indexOfExtension == -1) { return this.get(pSource); } else { final String stripped = pSource.substring(0, indexOfExtension); @@ -85,9 +85,9 @@ public TexturePackTextureRegion get(final String pSource, final boolean pStripEx } private void throwOnCollision(final TexturePackTextureRegion pTexturePackTextureRegion) throws IllegalArgumentException { - if(this.mIDMapping.get(pTexturePackTextureRegion.getID()) != null) { + if (this.mIDMapping.get(pTexturePackTextureRegion.getID()) != null) { throw new IllegalArgumentException("Collision with ID: '" + pTexturePackTextureRegion.getID() + "'."); - } else if(this.mSourceMapping.get(pTexturePackTextureRegion.getSource()) != null) { + } else if (this.mSourceMapping.get(pTexturePackTextureRegion.getSource()) != null) { throw new IllegalArgumentException("Collision with Source: '" + pTexturePackTextureRegion.getSource() + "'."); } } From 6a08408037c2be4fce541072bb1cebebdbf2ae5c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 10 Feb 2013 17:20:17 -0800 Subject: [PATCH 111/252] Added more StrokeFont methods in FontFactory. --- .../andengine/opengl/font/FontFactory.java | 87 +++++++++++++++++-- 1 file changed, 82 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java index c4fb05d61..b0f7b9007 100644 --- a/src/org/andengine/opengl/font/FontFactory.java +++ b/src/org/andengine/opengl/font/FontFactory.java @@ -160,20 +160,97 @@ public static Font createFromAsset(final FontManager pFontManager, final Texture } + public static StrokeFont createStroke(final FontManager pFontManager, final ITexture pTexture, final float pSize, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTexture, pSize, FontFactory.ANTIALIAS_DEFAULT, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final ITexture pTexture, final float pSize, final boolean pAntiAlias, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTexture, pSize, pAntiAlias, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final ITexture pTexture, final float pSize, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTexture, pSize, FontFactory.ANTIALIAS_DEFAULT, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final ITexture pTexture, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTexture, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL), pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, TextureOptions.DEFAULT, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pTextureOptions, Typeface.create(Typeface.DEFAULT, Typeface.NORMAL), pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final Typeface pTypeface, final float pSize, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, TextureOptions.DEFAULT, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, TextureOptions.DEFAULT, pTypeface, pSize, pAntiAlias, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final Typeface pTypeface, final float pSize, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, TextureOptions.DEFAULT, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, TextureOptions.DEFAULT, pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pTextureOptions, pTypeface, pSize, pAntiAlias, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, PixelFormat.RGBA_8888, pTextureOptions, pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions, pTypeface, pSize, pAntiAlias, FontFactory.COLOR_DEFAULT, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions, pTypeface, pSize, FontFactory.ANTIALIAS_DEFAULT, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStroke(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStroke(pFontManager, new EmptyTexture(pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions), pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + public static StrokeFont createStroke(final FontManager pFontManager, final ITexture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { return new StrokeFont(pFontManager, pTexture, pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); } - public static StrokeFont createStroke(final FontManager pFontManager, final ITexture pTexture, final Typeface pTypeface, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor, final boolean pStrokeOnly) { - return new StrokeFont(pFontManager, pTexture, pTypeface, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor, pStrokeOnly); - } public static StrokeFont createStrokeFromAsset(final FontManager pFontManager, final ITexture pTexture, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { return new StrokeFont(pFontManager, pTexture, Typeface.createFromAsset(pAssetManager, FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); } - public static StrokeFont createStrokeFromAsset(final FontManager pFontManager, final ITexture pTexture, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor, final boolean pStrokeOnly) { - return new StrokeFont(pFontManager, pTexture, Typeface.createFromAsset(pAssetManager, FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor, pStrokeOnly); + public static StrokeFont createStrokeFromAsset(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStrokeFromAsset(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, TextureOptions.DEFAULT, pAssetManager, pAssetPath, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStrokeFromAsset(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final TextureOptions pTextureOptions, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return FontFactory.createStrokeFromAsset(pFontManager, pTextureManager, pTextureWidth, pTextureHeight, PixelFormat.RGBA_8888, pTextureOptions, pAssetManager, pAssetPath, pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); + } + + public static StrokeFont createStrokeFromAsset(final FontManager pFontManager, final TextureManager pTextureManager, final int pTextureWidth, final int pTextureHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final AssetManager pAssetManager, final String pAssetPath, final float pSize, final boolean pAntiAlias, final int pColor, final float pStrokeWidth, final int pStrokeColor) { + return new StrokeFont(pFontManager, new EmptyTexture(pTextureManager, pTextureWidth, pTextureHeight, pPixelFormat, pTextureOptions), Typeface.createFromAsset(pAssetManager, FontFactory.sAssetBasePath + pAssetPath), pSize, pAntiAlias, pColor, pStrokeWidth, pStrokeColor); } // =========================================================== From 95d4ccc45440d9de6b526ba4f5101503f0769d19 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 10 Feb 2013 17:57:33 -0800 Subject: [PATCH 112/252] Removed usage of FloatMath since it's slower than plain Math since API level 8. --- project.properties | 2 +- .../camera/hud/controls/AnalogOnScreenControl.java | 4 +--- .../andengine/entity/modifier/PathModifier.java | 4 +--- .../andengine/entity/particle/ParticleSystem.java | 4 +--- .../emitter/CircleOutlineParticleEmitter.java | 6 ++---- .../particle/emitter/CircleParticleEmitter.java | 6 ++---- src/org/andengine/entity/primitive/Gradient.java | 3 +-- src/org/andengine/opengl/font/StrokeFont.java | 3 +-- .../andengine/opengl/texture/TextureManager.java | 2 +- .../util/adt/transformation/Transformation.java | 14 ++++++-------- .../algorithm/path/astar/EuclideanHeuristic.java | 4 +--- src/org/andengine/util/math/MathConstants.java | 3 +-- src/org/andengine/util/math/MathUtils.java | 12 +++++------- .../util/modifier/ease/EaseCircularIn.java | 3 +-- .../util/modifier/ease/EaseCircularOut.java | 3 +-- .../util/modifier/ease/EaseElasticIn.java | 4 +--- .../util/modifier/ease/EaseElasticOut.java | 4 +--- .../andengine/util/modifier/ease/EaseSineIn.java | 4 +--- .../util/modifier/ease/EaseSineInOut.java | 3 +-- .../andengine/util/modifier/ease/EaseSineOut.java | 4 +--- 20 files changed, 31 insertions(+), 61 deletions(-) diff --git a/project.properties b/project.properties index b3dbf357e..8624e6ba8 100644 --- a/project.properties +++ b/project.properties @@ -11,4 +11,4 @@ android.library=true # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-15 +target=android-17 diff --git a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java index 2529c95c5..d691151ca 100644 --- a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java @@ -8,8 +8,6 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; import org.andengine.util.math.MathUtils; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -82,7 +80,7 @@ protected void onUpdateControlKnob(final float pRelativeX, final float pRelative super.onUpdateControlKnob(pRelativeX, pRelativeY); } else { final float angleRad = MathUtils.atan2(pRelativeY, pRelativeX); - super.onUpdateControlKnob(FloatMath.cos(angleRad) * 0.5f, FloatMath.sin(angleRad) * 0.5f); + super.onUpdateControlKnob((float)Math.cos(angleRad) * 0.5f, (float)Math.sin(angleRad) * 0.5f); } } diff --git a/src/org/andengine/entity/modifier/PathModifier.java b/src/org/andengine/entity/modifier/PathModifier.java index ca0d094be..164ebd146 100644 --- a/src/org/andengine/entity/modifier/PathModifier.java +++ b/src/org/andengine/entity/modifier/PathModifier.java @@ -7,8 +7,6 @@ import org.andengine.util.modifier.ease.EaseLinear; import org.andengine.util.modifier.ease.IEaseFunction; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -316,7 +314,7 @@ public float getSegmentLength(final int pSegmentIndex) { final float dx = coordinatesX[pSegmentIndex] - coordinatesX[nextSegmentIndex]; final float dy = coordinatesY[pSegmentIndex] - coordinatesY[nextSegmentIndex]; - return FloatMath.sqrt(dx * dx + dy * dy); + return (float)Math.sqrt(dx * dx + dy * dy); } // =========================================================== diff --git a/src/org/andengine/entity/particle/ParticleSystem.java b/src/org/andengine/entity/particle/ParticleSystem.java index 3faa71ccf..db9e42a52 100644 --- a/src/org/andengine/entity/particle/ParticleSystem.java +++ b/src/org/andengine/entity/particle/ParticleSystem.java @@ -13,8 +13,6 @@ import org.andengine.util.Constants; import org.andengine.util.math.MathUtils; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -178,7 +176,7 @@ private void spawnParticles(final float pSecondsElapsed) { this.mParticlesDueToSpawn += newParticlesThisFrame; - final int particlesToSpawnThisFrame = Math.min(this.mParticlesMaximum - this.mParticlesAlive, (int)FloatMath.floor(this.mParticlesDueToSpawn)); + final int particlesToSpawnThisFrame = Math.min(this.mParticlesMaximum - this.mParticlesAlive, (int)Math.floor(this.mParticlesDueToSpawn)); this.mParticlesDueToSpawn -= particlesToSpawnThisFrame; for (int i = 0; i < particlesToSpawnThisFrame; i++) { diff --git a/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java b/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java index 95ad9e4e8..23d3a86d4 100644 --- a/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java +++ b/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java @@ -6,8 +6,6 @@ import org.andengine.util.math.MathConstants; import org.andengine.util.math.MathUtils; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -47,8 +45,8 @@ public CircleOutlineParticleEmitter(final float pCenterX, final float pCenterY, @Override public void getPositionOffset(final float[] pOffset) { final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI * 2; - pOffset[VERTEX_INDEX_X] = this.mCenterX + FloatMath.cos(random) * this.mRadiusX; - pOffset[VERTEX_INDEX_Y] = this.mCenterY + FloatMath.sin(random) * this.mRadiusY; + pOffset[VERTEX_INDEX_X] = this.mCenterX + (float)Math.cos(random) * this.mRadiusX; + pOffset[VERTEX_INDEX_Y] = this.mCenterY + (float)Math.sin(random) * this.mRadiusY; } // =========================================================== diff --git a/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java b/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java index ba8c69a7b..f460cb1d4 100644 --- a/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java +++ b/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java @@ -6,8 +6,6 @@ import org.andengine.util.math.MathConstants; import org.andengine.util.math.MathUtils; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -47,8 +45,8 @@ public CircleParticleEmitter(final float pCenterX, final float pCenterY, final f @Override public void getPositionOffset(final float[] pOffset) { final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI * 2; - pOffset[VERTEX_INDEX_X] = this.mCenterX + FloatMath.cos(random) * this.mRadiusX * MathUtils.RANDOM.nextFloat(); - pOffset[VERTEX_INDEX_Y] = this.mCenterY + FloatMath.sin(random) * this.mRadiusY * MathUtils.RANDOM.nextFloat(); + pOffset[VERTEX_INDEX_X] = this.mCenterX + (float)Math.cos(random) * this.mRadiusX * MathUtils.RANDOM.nextFloat(); + pOffset[VERTEX_INDEX_Y] = this.mCenterY + (float)Math.sin(random) * this.mRadiusY * MathUtils.RANDOM.nextFloat(); } // =========================================================== diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index 2efe89078..f2980b4b3 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -16,7 +16,6 @@ import org.andengine.util.math.MathUtils; import android.opengl.GLES20; -import android.util.FloatMath; /** * (c) Zynga 2012 @@ -375,7 +374,7 @@ public void setGradientVector(final float pGradientVectorX, final float pGradien public void setGradientAngle(final float pGradientAngle) { final float angleInRad = MathUtils.degToRad(pGradientAngle); - this.setGradientVector(FloatMath.cos(angleInRad), FloatMath.sin(angleInRad)); + this.setGradientVector((float)Math.cos(angleInRad), (float)Math.sin(angleInRad)); } public void setGradientColor(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue) { diff --git a/src/org/andengine/opengl/font/StrokeFont.java b/src/org/andengine/opengl/font/StrokeFont.java index 00844db75..85291135f 100644 --- a/src/org/andengine/opengl/font/StrokeFont.java +++ b/src/org/andengine/opengl/font/StrokeFont.java @@ -6,7 +6,6 @@ import android.graphics.Paint; import android.graphics.Paint.Style; import android.graphics.Typeface; -import android.util.FloatMath; /** * TODO Re-implement with Font changes. @@ -73,7 +72,7 @@ public StrokeFont(final FontManager pFontManager, final ITexture pTexture, final @Override protected void updateTextBounds(final String pCharacterAsString) { this.mStrokePaint.getTextBounds(pCharacterAsString, 0, 1, this.mTextBounds); - final int inset = -(int)FloatMath.floor(this.mStrokeWidth * 0.5f); + final int inset = -(int)Math.floor(this.mStrokeWidth * 0.5f); this.mTextBounds.inset(inset, inset); } diff --git a/src/org/andengine/opengl/texture/TextureManager.java b/src/org/andengine/opengl/texture/TextureManager.java index 6c2b85a11..b15a2afb8 100644 --- a/src/org/andengine/opengl/texture/TextureManager.java +++ b/src/org/andengine/opengl/texture/TextureManager.java @@ -231,7 +231,7 @@ public synchronized void updateTextures(final GLState pGLState) { final ArrayList texturesToBeLoaded = this.mTexturesToBeLoaded; final ArrayList texturesToBeUnloaded = this.mTexturesToBeUnloaded; - /* First reload Textures that need to be updated. */ + /* First reCreate Textures that need to be updated. */ for (int i = texturesLoaded.size() - 1; i >= 0; i--) { final ITexture textureToBeReloaded = texturesLoaded.get(i); if (textureToBeReloaded.isUpdateOnHardwareNeeded()) { diff --git a/src/org/andengine/util/adt/transformation/Transformation.java b/src/org/andengine/util/adt/transformation/Transformation.java index 8e1f0b36c..6cba2d39d 100644 --- a/src/org/andengine/util/adt/transformation/Transformation.java +++ b/src/org/andengine/util/adt/transformation/Transformation.java @@ -2,8 +2,6 @@ import org.andengine.util.math.MathConstants; -import android.util.FloatMath; - /** *

This class is basically a java-space replacement for the native {@link android.graphics.Matrix} class.

@@ -119,8 +117,8 @@ public final Transformation setToTranslate(final float pX, final float pY) { public final void preRotate(final float pAngle) { final float angleRad = MathConstants.DEG_TO_RAD * pAngle; - final float sin = FloatMath.sin(angleRad); - final float cos = FloatMath.cos(angleRad); + final float sin = (float)Math.sin(angleRad); + final float cos = (float)Math.cos(angleRad); final float a = this.a; final float b = this.b; @@ -136,8 +134,8 @@ public final void preRotate(final float pAngle) { public final void postRotate(final float pAngle) { final float angleRad = MathConstants.DEG_TO_RAD * pAngle; - final float sin = FloatMath.sin(angleRad); - final float cos = FloatMath.cos(angleRad); + final float sin = (float)Math.sin(angleRad); + final float cos = (float)Math.cos(angleRad); final float a = this.a; final float b = this.b; @@ -157,8 +155,8 @@ public final void postRotate(final float pAngle) { public final Transformation setToRotate(final float pAngle) { final float angleRad = MathConstants.DEG_TO_RAD * pAngle; - final float sin = FloatMath.sin(angleRad); - final float cos = FloatMath.cos(angleRad); + final float sin = (float)Math.sin(angleRad); + final float cos = (float)Math.cos(angleRad); this.a = cos; this.b = sin; diff --git a/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java b/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java index 8e3a934a4..8e817d816 100644 --- a/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java +++ b/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java @@ -2,8 +2,6 @@ import org.andengine.util.algorithm.path.IPathFinderMap; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -37,7 +35,7 @@ public float getExpectedRestCost(final IPathFinderMap pPathFinderMap, final T final float dX = pToX - pFromX; final float dY = pToY - pFromY; - return FloatMath.sqrt(dX * dX + dY * dY); + return (float)Math.sqrt(dX * dX + dY * dY); } // =========================================================== diff --git a/src/org/andengine/util/math/MathConstants.java b/src/org/andengine/util/math/MathConstants.java index 7baf36b82..e0d531e62 100644 --- a/src/org/andengine/util/math/MathConstants.java +++ b/src/org/andengine/util/math/MathConstants.java @@ -1,6 +1,5 @@ package org.andengine.util.math; -import android.util.FloatMath; /** * (c) 2010 Nicolas Gramlich @@ -22,7 +21,7 @@ public interface MathConstants { public static final float DEG_TO_RAD = PI / 180.0f; public static final float RAD_TO_DEG = 180.0f / PI; - public static final float SQRT_2 = FloatMath.sqrt(2); + public static final float SQRT_2 = (float)Math.sqrt(2); // =========================================================== // Methods diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index 2d70e36ea..b56200a1c 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -2,8 +2,6 @@ import java.util.Random; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -230,7 +228,7 @@ public static final boolean isPowerOfTwo(final int n) { } public static final int nextPowerOfTwo(final float f) { - return MathUtils.nextPowerOfTwo((int)(FloatMath.ceil(f))); + return MathUtils.nextPowerOfTwo((int)(Math.ceil(f))); } public static final int nextPowerOfTwo(final int n) { @@ -261,8 +259,8 @@ public static final int sum(final int[] pValues) { public static float[] rotateAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY) { if (pRotation != 0) { final float rotationRad = MathUtils.degToRad(pRotation); - final float sinRotationRad = FloatMath.sin(rotationRad); - final float cosRotationInRad = FloatMath.cos(rotationRad); + final float sinRotationRad = (float)Math.sin(rotationRad); + final float cosRotationInRad = (float)Math.cos(rotationRad); for (int i = pVertices.length - 2; i >= 0; i -= 2) { final float pX = pVertices[i]; @@ -337,14 +335,14 @@ public static final float bringToBounds(final float pMinValue, final float pMaxV public static final float distance(final float pX1, final float pY1, final float pX2, final float pY2) { final float dX = pX2 - pX1; final float dY = pY2 - pY1; - return FloatMath.sqrt((dX * dX) + (dY * dY)); + return (float)Math.sqrt((dX * dX) + (dY * dY)); } /** * @return the euclidean distance between the origin (0, 0) and (pX, pY). */ public static final float length(final float pX, final float pY) { - return FloatMath.sqrt((pX * pX) + (pY * pY)); + return (float)Math.sqrt((pX * pX) + (pY * pY)); } /** diff --git a/src/org/andengine/util/modifier/ease/EaseCircularIn.java b/src/org/andengine/util/modifier/ease/EaseCircularIn.java index d6b90820d..7091f992c 100644 --- a/src/org/andengine/util/modifier/ease/EaseCircularIn.java +++ b/src/org/andengine/util/modifier/ease/EaseCircularIn.java @@ -1,6 +1,5 @@ package org.andengine.util.modifier.ease; -import android.util.FloatMath; /** * (c) 2010 Nicolas Gramlich @@ -54,7 +53,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) { // =========================================================== public static float getValue(final float pPercentage) { - return -(FloatMath.sqrt(1 - pPercentage * pPercentage) - 1.0f); + return -((float)Math.sqrt(1 - pPercentage * pPercentage) - 1.0f); } // =========================================================== diff --git a/src/org/andengine/util/modifier/ease/EaseCircularOut.java b/src/org/andengine/util/modifier/ease/EaseCircularOut.java index d27cfa255..3ddbf3035 100644 --- a/src/org/andengine/util/modifier/ease/EaseCircularOut.java +++ b/src/org/andengine/util/modifier/ease/EaseCircularOut.java @@ -1,6 +1,5 @@ package org.andengine.util.modifier.ease; -import android.util.FloatMath; /** * (c) 2010 Nicolas Gramlich @@ -55,7 +54,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) { public static float getValue(final float pPercentage) { final float t = pPercentage - 1; - return FloatMath.sqrt(1 - t * t); + return (float)Math.sqrt(1 - t * t); } // =========================================================== diff --git a/src/org/andengine/util/modifier/ease/EaseElasticIn.java b/src/org/andengine/util/modifier/ease/EaseElasticIn.java index 0d80cdd37..462ece6f6 100644 --- a/src/org/andengine/util/modifier/ease/EaseElasticIn.java +++ b/src/org/andengine/util/modifier/ease/EaseElasticIn.java @@ -2,8 +2,6 @@ import org.andengine.util.math.MathConstants; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -67,7 +65,7 @@ public static float getValue(final float pSecondsElapsed, final float pDuration, final float s = p / 4; final float t = pPercentage - 1; - return -(float)Math.pow(2, 10 * t) * FloatMath.sin((t * pDuration - s) * MathConstants.PI_TWICE / p); + return -(float)Math.pow(2, 10 * t) * (float)Math.sin((t * pDuration - s) * MathConstants.PI_TWICE / p); } // =========================================================== diff --git a/src/org/andengine/util/modifier/ease/EaseElasticOut.java b/src/org/andengine/util/modifier/ease/EaseElasticOut.java index 18bc8ccd7..6aac543ff 100644 --- a/src/org/andengine/util/modifier/ease/EaseElasticOut.java +++ b/src/org/andengine/util/modifier/ease/EaseElasticOut.java @@ -2,8 +2,6 @@ import org.andengine.util.math.MathConstants; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -66,7 +64,7 @@ public static float getValue(final float pSecondsElapsed, final float pDuration, final float p = pDuration * 0.3f; final float s = p / 4; - return 1 + (float)Math.pow(2, -10 * pPercentageDone) * FloatMath.sin((pPercentageDone * pDuration - s) * MathConstants.PI_TWICE / p); + return 1 + (float)Math.pow(2, -10 * pPercentageDone) * (float)Math.sin((pPercentageDone * pDuration - s) * MathConstants.PI_TWICE / p); } // =========================================================== diff --git a/src/org/andengine/util/modifier/ease/EaseSineIn.java b/src/org/andengine/util/modifier/ease/EaseSineIn.java index dc8115297..c992f11ed 100644 --- a/src/org/andengine/util/modifier/ease/EaseSineIn.java +++ b/src/org/andengine/util/modifier/ease/EaseSineIn.java @@ -2,8 +2,6 @@ import org.andengine.util.math.MathConstants; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -56,7 +54,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) { // =========================================================== public static float getValue(final float pPercentage) { - return -FloatMath.cos(pPercentage * MathConstants.PI_HALF) + 1; + return -(float)Math.cos(pPercentage * MathConstants.PI_HALF) + 1; } // =========================================================== diff --git a/src/org/andengine/util/modifier/ease/EaseSineInOut.java b/src/org/andengine/util/modifier/ease/EaseSineInOut.java index f6726f569..b4c89e7c9 100644 --- a/src/org/andengine/util/modifier/ease/EaseSineInOut.java +++ b/src/org/andengine/util/modifier/ease/EaseSineInOut.java @@ -1,7 +1,6 @@ package org.andengine.util.modifier.ease; import static org.andengine.util.math.MathConstants.PI; -import android.util.FloatMath; /** * (c) 2010 Nicolas Gramlich @@ -49,7 +48,7 @@ public static EaseSineInOut getInstance() { public float getPercentage(final float pSecondsElapsed, final float pDuration) { final float percentage = pSecondsElapsed / pDuration; - return -0.5f * (FloatMath.cos(percentage * PI) - 1); + return -0.5f * ((float)Math.cos(percentage * PI) - 1); } // =========================================================== diff --git a/src/org/andengine/util/modifier/ease/EaseSineOut.java b/src/org/andengine/util/modifier/ease/EaseSineOut.java index 07b4462a8..1539a2c23 100644 --- a/src/org/andengine/util/modifier/ease/EaseSineOut.java +++ b/src/org/andengine/util/modifier/ease/EaseSineOut.java @@ -2,8 +2,6 @@ import org.andengine.util.math.MathConstants; -import android.util.FloatMath; - /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -56,7 +54,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) { // =========================================================== public static float getValue(final float pPercentage) { - return FloatMath.sin(pPercentage * MathConstants.PI_HALF); + return (float)Math.sin(pPercentage * MathConstants.PI_HALF); } // =========================================================== From 7edaaac1b71a58bebfde598e3d94e4bf9fe74a0e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 11 Feb 2013 00:30:28 -0800 Subject: [PATCH 113/252] Now allowing EntityLoaders to return null. --- .../util/level/LevelLoaderContentHandler.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/org/andengine/util/level/LevelLoaderContentHandler.java b/src/org/andengine/util/level/LevelLoaderContentHandler.java index 8674e269f..1272789b4 100644 --- a/src/org/andengine/util/level/LevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/LevelLoaderContentHandler.java @@ -3,8 +3,10 @@ import java.io.IOException; import java.util.HashMap; +import org.andengine.BuildConfig; import org.andengine.entity.IEntity; import org.andengine.util.adt.list.SmartList; +import org.andengine.util.debug.Debug; import org.andengine.util.level.exception.LevelLoaderException; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -83,17 +85,21 @@ public void startElement(final String pUri, final String pLocalName, final Strin } if (entity == null) { - throw new LevelLoaderException(); - } - - if (parent == null) { - this.mRootEntity = entity; + if (BuildConfig.DEBUG) { + Debug.w("No '" + IEntity.class.getSimpleName() + "' created for entity name: '" + entityName + "'."); + } } else { - parent.attachChild(entity); - } + if (parent == null) { + if (this.mRootEntity == null) { + this.mRootEntity = entity; + } + } else { + parent.attachChild(entity); + } - if (this.mEntityLoaderListener != null) { - this.mEntityLoaderListener.onEntityLoaded(entity, pAttributes); + if (this.mEntityLoaderListener != null) { + this.mEntityLoaderListener.onEntityLoaded(entity, pAttributes); + } } this.mParentEntityStack.addLast(entity); From e1722bc7fc146943c5dece0fb330a7b90513a670 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 12 Feb 2013 16:24:36 -0800 Subject: [PATCH 114/252] Minor whitespace formatting. --- src/org/andengine/audio/BaseAudioEntity.java | 2 +- src/org/andengine/entity/particle/Particle.java | 2 +- src/org/andengine/util/adt/list/BooleanArrayList.java | 2 +- src/org/andengine/util/adt/list/ByteArrayList.java | 2 +- src/org/andengine/util/adt/list/CharArrayList.java | 2 +- src/org/andengine/util/adt/list/DoubleArrayList.java | 2 +- src/org/andengine/util/adt/list/FloatArrayList.java | 2 +- src/org/andengine/util/adt/list/IntArrayList.java | 2 +- src/org/andengine/util/adt/list/LongArrayList.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/org/andengine/audio/BaseAudioEntity.java b/src/org/andengine/audio/BaseAudioEntity.java index c342018c5..dcd48d000 100644 --- a/src/org/andengine/audio/BaseAudioEntity.java +++ b/src/org/andengine/audio/BaseAudioEntity.java @@ -69,7 +69,7 @@ protected float getMasterVolume() throws AudioException { // Methods for/from SuperClass/Interfaces // =========================================================== - protected abstract void throwOnReleased() throws AudioException ; + protected abstract void throwOnReleased() throws AudioException; @Override public float getVolume() throws AudioException { diff --git a/src/org/andengine/entity/particle/Particle.java b/src/org/andengine/entity/particle/Particle.java index abd93528c..99ac0582b 100644 --- a/src/org/andengine/entity/particle/Particle.java +++ b/src/org/andengine/entity/particle/Particle.java @@ -61,7 +61,7 @@ public void setExpireTime(final float pExpireTime) { } public boolean isExpired() { - return this.mExpired ; + return this.mExpired; } public void setExpired(final boolean pExpired) { diff --git a/src/org/andengine/util/adt/list/BooleanArrayList.java b/src/org/andengine/util/adt/list/BooleanArrayList.java index aa82cad77..8e0336a10 100644 --- a/src/org/andengine/util/adt/list/BooleanArrayList.java +++ b/src/org/andengine/util/adt/list/BooleanArrayList.java @@ -98,7 +98,7 @@ public void clear() { public int[] toArray() { final int[] array = new int[this.mSize]; System.arraycopy(this.mItems, 0, array, 0, this.mSize); - return array ; + return array; } // =========================================================== diff --git a/src/org/andengine/util/adt/list/ByteArrayList.java b/src/org/andengine/util/adt/list/ByteArrayList.java index 7d45a61ba..3955a2b31 100644 --- a/src/org/andengine/util/adt/list/ByteArrayList.java +++ b/src/org/andengine/util/adt/list/ByteArrayList.java @@ -98,7 +98,7 @@ public void clear() { public byte[] toArray() { final byte[] array = new byte[this.mSize]; System.arraycopy(this.mItems, 0, array, 0, this.mSize); - return array ; + return array; } // =========================================================== diff --git a/src/org/andengine/util/adt/list/CharArrayList.java b/src/org/andengine/util/adt/list/CharArrayList.java index 26e23d9b2..24eee3a76 100644 --- a/src/org/andengine/util/adt/list/CharArrayList.java +++ b/src/org/andengine/util/adt/list/CharArrayList.java @@ -98,7 +98,7 @@ public void clear() { public char[] toArray() { final char[] array = new char[this.mSize]; System.arraycopy(this.mItems, 0, array, 0, this.mSize); - return array ; + return array; } // =========================================================== diff --git a/src/org/andengine/util/adt/list/DoubleArrayList.java b/src/org/andengine/util/adt/list/DoubleArrayList.java index df57c4ea0..37786b4fe 100644 --- a/src/org/andengine/util/adt/list/DoubleArrayList.java +++ b/src/org/andengine/util/adt/list/DoubleArrayList.java @@ -98,7 +98,7 @@ public void clear() { public double[] toArray() { final double[] array = new double[this.mSize]; System.arraycopy(this.mItems, 0, array, 0, this.mSize); - return array ; + return array; } // =========================================================== diff --git a/src/org/andengine/util/adt/list/FloatArrayList.java b/src/org/andengine/util/adt/list/FloatArrayList.java index b9d91958d..0aabda4b6 100644 --- a/src/org/andengine/util/adt/list/FloatArrayList.java +++ b/src/org/andengine/util/adt/list/FloatArrayList.java @@ -98,7 +98,7 @@ public void clear() { public float[] toArray() { final float[] array = new float[this.mSize]; System.arraycopy(this.mItems, 0, array, 0, this.mSize); - return array ; + return array; } // =========================================================== diff --git a/src/org/andengine/util/adt/list/IntArrayList.java b/src/org/andengine/util/adt/list/IntArrayList.java index 76902c747..375de24d2 100644 --- a/src/org/andengine/util/adt/list/IntArrayList.java +++ b/src/org/andengine/util/adt/list/IntArrayList.java @@ -98,7 +98,7 @@ public void clear() { public int[] toArray() { final int[] array = new int[this.mSize]; System.arraycopy(this.mItems, 0, array, 0, this.mSize); - return array ; + return array; } // =========================================================== diff --git a/src/org/andengine/util/adt/list/LongArrayList.java b/src/org/andengine/util/adt/list/LongArrayList.java index e6c9fc4ad..1d1ce9ecf 100644 --- a/src/org/andengine/util/adt/list/LongArrayList.java +++ b/src/org/andengine/util/adt/list/LongArrayList.java @@ -98,7 +98,7 @@ public void clear() { public long[] toArray() { final long[] array = new long[this.mSize]; System.arraycopy(this.mItems, 0, array, 0, this.mSize); - return array ; + return array; } // =========================================================== From c7fa4c0ec472e7179fa5834da70e7b8a3cf8c680 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 16 Feb 2013 19:49:22 -0800 Subject: [PATCH 115/252] Added Entity.setColor(pARGBPackedInt). --- src/org/andengine/entity/Entity.java | 8 ++++++++ src/org/andengine/entity/IEntity.java | 1 + .../modifier/ColorParticleModifier.java | 9 +++++++++ .../item/decorator/BaseMenuItemDecorator.java | 5 +++++ src/org/andengine/util/adt/color/Color.java | 4 ++++ .../andengine/util/adt/color/ColorUtils.java | 20 +++++++++++++++++-- 6 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index f68e52400..774cd6f18 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -14,6 +14,7 @@ import org.andengine.opengl.util.GLState; import org.andengine.util.Constants; import org.andengine.util.adt.color.Color; +import org.andengine.util.adt.color.ColorUtils; import org.andengine.util.adt.list.SmartList; import org.andengine.util.adt.transformation.Transformation; import org.andengine.util.algorithm.collision.EntityCollisionChecker; @@ -692,6 +693,13 @@ public void setColor(final Color pColor) { this.onUpdateColor(); } + @Override + public void setColor(final int pARGBPackedInt) { + ColorUtils.convertARGBPackedIntToColor(pARGBPackedInt, this.mColor); + + this.onUpdateColor(); + } + /** * @param pRed from 0.0f to 1.0f */ diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index 4ef8f47b5..4771248e7 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -167,6 +167,7 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou public void setBlue(final float pBlue); public void setAlpha(final float pAlpha); public void setColor(final Color pColor); + public void setColor(final int pARGBPackedInt); public void setColor(final float pRed, final float pGreen, final float pBlue); public void setColor(final float pRed, final float pGreen, final float pBlue, final float pAlpha); diff --git a/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java b/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java index 4a6c81852..0552b0515 100644 --- a/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java @@ -2,6 +2,7 @@ import org.andengine.entity.IEntity; import org.andengine.entity.particle.Particle; +import org.andengine.util.adt.color.Color; import org.andengine.util.modifier.ease.EaseLinear; import org.andengine.util.modifier.ease.IEaseFunction; @@ -25,6 +26,14 @@ public class ColorParticleModifier extends BaseTripleValueSpa // Constructors // =========================================================== + public ColorParticleModifier(final float pFromTime, final float pToTime, final Color pFromColor, final Color pToColor) { + this(pFromTime, pToTime, pFromColor.getRed(), pToColor.getRed(), pFromColor.getGreen(), pToColor.getGreen(), pFromColor.getBlue(), pToColor.getBlue()); + } + + public ColorParticleModifier(final float pFromTime, final float pToTime, final Color pFromColor, final Color pToColor, final IEaseFunction pEaseFunction) { + super(pFromTime, pToTime, pFromColor.getRed(), pToColor.getRed(), pFromColor.getGreen(), pToColor.getGreen(), pFromColor.getBlue(), pToColor.getBlue(), pEaseFunction); + } + public ColorParticleModifier(final float pFromTime, final float pToTime, final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue) { this(pFromTime, pToTime, pFromRed, pToRed, pFromGreen, pToGreen, pFromBlue, pToBlue, EaseLinear.getInstance()); } diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index d1cbcff3d..4c2b7ad85 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -204,6 +204,11 @@ public void setColor(final Color pColor) { this.mMenuItem.setColor(pColor); } + @Override + public void setColor(final int pARGBPackedInt) { + this.mMenuItem.setColor(pARGBPackedInt); + } + @Override public void setColor(final float pRed, final float pGreen, final float pBlue) { this.mMenuItem.setColor(pRed, pGreen, pBlue); diff --git a/src/org/andengine/util/adt/color/Color.java b/src/org/andengine/util/adt/color/Color.java index 9aee9d699..aa8f1db86 100644 --- a/src/org/andengine/util/adt/color/Color.java +++ b/src/org/andengine/util/adt/color/Color.java @@ -87,6 +87,10 @@ public class Color { // Constructors // =========================================================== + /* package */ Color() { + + } + public Color(final Color pColor) { this.set(pColor); } diff --git a/src/org/andengine/util/adt/color/ColorUtils.java b/src/org/andengine/util/adt/color/ColorUtils.java index 8ea036f84..72f0184ed 100644 --- a/src/org/andengine/util/adt/color/ColorUtils.java +++ b/src/org/andengine/util/adt/color/ColorUtils.java @@ -64,21 +64,37 @@ public static final Color convertHSVToColor(final float pHue, final float pSatur public static Color convertARGBPackedIntToColor(final int pARGBPackedInt) { + final Color color = new Color(); + + ColorUtils.convertARGBPackedIntToColor(pARGBPackedInt, color); + + return color; + } + + public static void convertARGBPackedIntToColor(final int pARGBPackedInt, final Color pColor) { final float alpha = ColorUtils.extractAlphaFromARGBPackedInt(pARGBPackedInt); final float red = ColorUtils.extractRedFromARGBPackedInt(pARGBPackedInt); final float green = ColorUtils.extractGreenFromARGBPackedInt(pARGBPackedInt); final float blue = ColorUtils.extractBlueFromARGBPackedInt(pARGBPackedInt); - return new Color(red, green, blue, alpha); + pColor.set(red, green, blue, alpha); } public static Color convertABGRPackedIntToColor(final int pABGRPackedInt) { + final Color color = new Color(); + + ColorUtils.convertABGRPackedIntToColor(pABGRPackedInt, color); + + return color; + } + + public static void convertABGRPackedIntToColor(final int pABGRPackedInt, final Color pColor) { final float alpha = ColorUtils.extractAlphaFromABGRPackedInt(pABGRPackedInt); final float blue = ColorUtils.extractBlueFromABGRPackedInt(pABGRPackedInt); final float green = ColorUtils.extractGreenFromABGRPackedInt(pABGRPackedInt); final float red = ColorUtils.extractRedFromABGRPackedInt(pABGRPackedInt); - return new Color(red, green, blue, alpha); + pColor.set(red, green, blue, alpha); } From f8e7a26c2c506482b8c69c2693fd95f00c980f7c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 17 Feb 2013 19:02:55 -0800 Subject: [PATCH 116/252] Minor change. --- src/org/andengine/entity/Entity.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 774cd6f18..71ba3828a 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -331,7 +331,7 @@ public float getWidthScaled() { public void setWidth(final float pWidth) { this.mWidth = pWidth; - this.updateLocalCentersXs(); + this.updateLocalCenterXs(); } @Override @@ -349,7 +349,7 @@ public float getHeightScaled() { public void setHeight(final float pHeight) { this.mHeight = pHeight; - this.updateLocalCentersYs(); + this.updateLocalCenterYs(); } @Override @@ -1617,18 +1617,18 @@ protected void onManagedUpdate(final float pSecondsElapsed) { } protected void updateLocalCenters() { - this.updateLocalCentersXs(); - this.updateLocalCentersYs(); + this.updateLocalCenterXs(); + this.updateLocalCenterYs(); } - protected void updateLocalCentersXs() { + protected void updateLocalCenterXs() { this.updateLocalOffsetCenterX(); this.updateLocalRotationCenterX(); this.updateLocalScaleCenterX(); this.updateLocalSkewCenterX(); } - protected void updateLocalCentersYs() { + protected void updateLocalCenterYs() { this.updateLocalOffsetCenterY(); this.updateLocalRotationCenterY(); this.updateLocalScaleCenterY(); From fdb777833eea8cd254d6c2199501689bab7f979e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 18 Feb 2013 19:03:36 -0800 Subject: [PATCH 117/252] Deprecated ColorKeyBitmapTextureAtlasSourceDecorator and ColorSwapBitmapTextureAtlasSourceDecorator on JellyBean and higher. Added (universally working, but potentially slower) ColorKeyBitmapTextureAtlasSource and ColorSwapBitmapTextureAtlasSource. IBitmapTextureAtlasSource.onLoadBitmap(Config, boolean) to directly create mutable Bitmaps (faster on Honeycomb and higher). --- .../source/AssetBitmapTextureAtlasSource.java | 24 +++- .../source/BaseBitmapTextureAtlasSource.java | 74 ++++++++++ .../ColorKeyBitmapTextureAtlasSource.java | 61 +++++++++ .../ColorSwapBitmapTextureAtlasSource.java | 127 ++++++++++++++++++ .../source/EmptyBitmapTextureAtlasSource.java | 5 + .../source/FileBitmapTextureAtlasSource.java | 23 +++- .../source/IBitmapTextureAtlasSource.java | 1 + .../ResourceBitmapTextureAtlasSource.java | 24 +++- ...BaseBitmapTextureAtlasSourceDecorator.java | 34 +---- ...rKeyBitmapTextureAtlasSourceDecorator.java | 8 ++ ...SwapBitmapTextureAtlasSourceDecorator.java | 15 ++- .../opengl/texture/bitmap/BitmapTexture.java | 1 + src/org/andengine/util/BitmapUtils.java | 54 ++++++++ 13 files changed, 419 insertions(+), 32 deletions(-) create mode 100644 src/org/andengine/opengl/texture/atlas/bitmap/source/BaseBitmapTextureAtlasSource.java create mode 100644 src/org/andengine/opengl/texture/atlas/bitmap/source/ColorKeyBitmapTextureAtlasSource.java create mode 100644 src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java create mode 100644 src/org/andengine/util/BitmapUtils.java diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java index 9b8462aab..c5ad8d09c 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java @@ -4,13 +4,17 @@ import java.io.InputStream; import org.andengine.opengl.texture.atlas.source.BaseTextureAtlasSource; +import org.andengine.util.BitmapUtils; import org.andengine.util.StreamUtils; import org.andengine.util.debug.Debug; +import org.andengine.util.system.SystemUtils; +import android.annotation.TargetApi; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; +import android.os.Build; /** * (c) 2010 Nicolas Gramlich @@ -78,13 +82,31 @@ public AssetBitmapTextureAtlasSource deepCopy() { @Override public Bitmap onLoadBitmap(final Config pBitmapConfig) { + return this.onLoadBitmap(pBitmapConfig, false); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig, final boolean pMutable) { InputStream in = null; try { final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); decodeOptions.inPreferredConfig = pBitmapConfig; + decodeOptions.inDither = false; + + if (pMutable && SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB)) { + decodeOptions.inMutable = pMutable; + } in = this.mAssetManager.open(this.mAssetPath); - return BitmapFactory.decodeStream(in, null, decodeOptions); + + final Bitmap bitmap = BitmapFactory.decodeStream(in, null, decodeOptions); + + if (pMutable) { + return BitmapUtils.ensureBitmapIsMutable(bitmap); + } else { + return bitmap; + } } catch (final IOException e) { Debug.e("Failed loading Bitmap in " + this.getClass().getSimpleName() + ". AssetPath: " + this.mAssetPath, e); return null; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/BaseBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/BaseBitmapTextureAtlasSource.java new file mode 100644 index 000000000..eac074d1d --- /dev/null +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/BaseBitmapTextureAtlasSource.java @@ -0,0 +1,74 @@ +package org.andengine.opengl.texture.atlas.bitmap.source; + +import org.andengine.opengl.texture.atlas.source.BaseTextureAtlasSource; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 16:43:29 - 06.08.2010 + */ +public abstract class BaseBitmapTextureAtlasSource extends BaseTextureAtlasSource implements IBitmapTextureAtlasSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected final IBitmapTextureAtlasSource mBitmapTextureAtlasSource; + + // =========================================================== + // Constructors + // =========================================================== + + public BaseBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource) { + super(pBitmapTextureAtlasSource.getTextureX(), pBitmapTextureAtlasSource.getTextureY(), pBitmapTextureAtlasSource.getTextureWidth(), pBitmapTextureAtlasSource.getTextureHeight()); + + this.mBitmapTextureAtlasSource = pBitmapTextureAtlasSource; + } + + @Override + public abstract BaseBitmapTextureAtlasSource deepCopy(); + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public int getTextureWidth() { + return this.mBitmapTextureAtlasSource.getTextureWidth(); + } + + @Override + public int getTextureHeight() { + return this.mBitmapTextureAtlasSource.getTextureHeight(); + } + + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig) { + return this.mBitmapTextureAtlasSource.onLoadBitmap(pBitmapConfig); + } + + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig, final boolean pMutable) { + return this.mBitmapTextureAtlasSource.onLoadBitmap(pBitmapConfig, pMutable); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorKeyBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorKeyBitmapTextureAtlasSource.java new file mode 100644 index 000000000..99c9edfa0 --- /dev/null +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorKeyBitmapTextureAtlasSource.java @@ -0,0 +1,61 @@ +package org.andengine.opengl.texture.atlas.bitmap.source; + +import org.andengine.util.adt.color.Color; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 22:16:41 - 06.08.2010 + */ +public class ColorKeyBitmapTextureAtlasSource extends ColorSwapBitmapTextureAtlasSource { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public ColorKeyBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final Color pColorKeyColor) { + super(pBitmapTextureAtlasSource, pColorKeyColor, Color.TRANSPARENT); + } + + public ColorKeyBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final int pColorKeyColorARGBPackedInt) { + super(pBitmapTextureAtlasSource, pColorKeyColorARGBPackedInt, Color.TRANSPARENT_ARGB_PACKED_INT); + } + + public ColorKeyBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final Color pColorKeyColor, final int pTolerance) { + super(pBitmapTextureAtlasSource, pColorKeyColor, pTolerance, Color.TRANSPARENT); + } + + public ColorKeyBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final int pColorKeyColorARGBPackedInt, final int pTolerance) { + super(pBitmapTextureAtlasSource, pColorKeyColorARGBPackedInt, pTolerance, Color.TRANSPARENT_ARGB_PACKED_INT); + } + + @Override + public ColorKeyBitmapTextureAtlasSource deepCopy() { + return new ColorKeyBitmapTextureAtlasSource(this.mBitmapTextureAtlasSource, this.mColorKeyColorARGBPackedInt, this.mTolerance); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java new file mode 100644 index 000000000..6e47c5755 --- /dev/null +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java @@ -0,0 +1,127 @@ +package org.andengine.opengl.texture.atlas.bitmap.source; + +import org.andengine.opengl.util.GLHelper; +import org.andengine.util.adt.color.Color; +import org.andengine.util.debug.Debug; + +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; + +/** + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. + * + * @author Nicolas Gramlich + * @since 19:41:39 - 07.06.2011 + */ +public class ColorSwapBitmapTextureAtlasSource extends BaseBitmapTextureAtlasSource { + // =========================================================== + // Constants + // =========================================================== + + private static final int TOLERANCE_DEFAULT = 0; + + // =========================================================== + // Fields + // =========================================================== + + protected final int mColorKeyColorARGBPackedInt; + protected final int mTolerance; + protected final int mColorSwapColorARGBPackedInt; + + // =========================================================== + // Constructors + // =========================================================== + + public ColorSwapBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final Color pColorKeyColor, final Color pColorSwapColor) { + this(pBitmapTextureAtlasSource, pColorKeyColor.getARGBPackedInt(), pColorSwapColor.getARGBPackedInt()); + } + + public ColorSwapBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final int pColorKeyColorARGBPackedInt, final int pColorSwapColorARGBPackedInt) { + this(pBitmapTextureAtlasSource, pColorKeyColorARGBPackedInt, ColorSwapBitmapTextureAtlasSource.TOLERANCE_DEFAULT, pColorSwapColorARGBPackedInt); + } + + public ColorSwapBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final Color pColorKeyColor, final int pTolerance, final Color pColorSwapColor) { + this(pBitmapTextureAtlasSource, pColorKeyColor.getARGBPackedInt(), pTolerance, pColorSwapColor.getARGBPackedInt()); + } + + public ColorSwapBitmapTextureAtlasSource(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final int pColorKeyColorARGBPackedInt, final int pTolerance, final int pColorSwapColorARGBPackedInt) { + super(pBitmapTextureAtlasSource); + + this.mColorKeyColorARGBPackedInt = pColorKeyColorARGBPackedInt; + this.mTolerance = pTolerance; + this.mColorSwapColorARGBPackedInt = pColorSwapColorARGBPackedInt; + } + + @Override + public ColorSwapBitmapTextureAtlasSource deepCopy() { + return new ColorSwapBitmapTextureAtlasSource(this.mBitmapTextureAtlasSource, this.mColorKeyColorARGBPackedInt, this.mTolerance, this.mColorSwapColorARGBPackedInt); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig) { + return this.swapColor(super.onLoadBitmap(pBitmapConfig)); + } + + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig, final boolean pMutable) { + return this.swapColor(super.onLoadBitmap(pBitmapConfig, pMutable)); + } + + // =========================================================== + // Methods + // =========================================================== + + protected Bitmap swapColor(final Bitmap pBitmap) { + final Config config = pBitmap.getConfig(); + switch (config) { + case ARGB_8888: + return ColorSwapBitmapTextureAtlasSource.swapColorARGB_8888(pBitmap, this.mColorKeyColorARGBPackedInt, this.mTolerance, this.mColorSwapColorARGBPackedInt); + default: + Debug.w("Unexpected " + Bitmap.Config.class.getSimpleName() + ": '" + config + "'."); + return pBitmap; + } + } + + protected static final Bitmap swapColorARGB_8888(final Bitmap pBitmap, final int pColorKeyColorARGBPackedInt, final int pTolerance, final int pColorSwapColorARGBPackedInt) { + final int[] pixelsARGB_8888 = GLHelper.getPixelsARGB_8888(pBitmap); + pBitmap.recycle(); + + final int keyRed = (pColorKeyColorARGBPackedInt >> Color.ARGB_PACKED_RED_SHIFT) & 0xFF; + final int keyGreen = (pColorKeyColorARGBPackedInt >> Color.ARGB_PACKED_GREEN_SHIFT) & 0xFF; + final int keyBlue = (pColorKeyColorARGBPackedInt >> Color.ARGB_PACKED_BLUE_SHIFT) & 0xFF; + final int keyAlpha = (pColorKeyColorARGBPackedInt >> Color.ARGB_PACKED_ALPHA_SHIFT) & 0xFF; + + for (int i = pixelsARGB_8888.length - 1; i >= 0; i--) { + final int pixelARGB_8888 = pixelsARGB_8888[i]; + + final int red = (pixelARGB_8888 >> Color.ARGB_PACKED_RED_SHIFT) & 0xFF; + if (Math.abs(red - keyRed) <= pTolerance) { + final int green = (pixelARGB_8888 >> Color.ARGB_PACKED_GREEN_SHIFT) & 0xFF; + if (Math.abs(green - keyGreen) <= pTolerance) { + final int blue = (pixelARGB_8888 >> Color.ARGB_PACKED_BLUE_SHIFT) & 0xFF; + if (Math.abs(blue - keyBlue) <= pTolerance) { + final int alpha = (pixelARGB_8888 >> Color.ARGB_PACKED_ALPHA_SHIFT) & 0xFF; + if (Math.abs(alpha - keyAlpha) <= pTolerance) { + pixelsARGB_8888[i] = pColorSwapColorARGBPackedInt; + } + } + } + } + } + + return Bitmap.createBitmap(pixelsARGB_8888, pBitmap.getWidth(), pBitmap.getHeight(), Config.ARGB_8888); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java index 29d9bafb7..6dc30da4d 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java @@ -49,6 +49,11 @@ public EmptyBitmapTextureAtlasSource deepCopy() { @Override public Bitmap onLoadBitmap(final Config pBitmapConfig) { + return this.onLoadBitmap(pBitmapConfig, false); + } + + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig, final boolean pMutable) { return Bitmap.createBitmap(this.mTextureWidth, this.mTextureHeight, pBitmapConfig); } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java index 4dae09740..925a4e76a 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java @@ -6,14 +6,18 @@ import java.io.InputStream; import org.andengine.opengl.texture.atlas.source.BaseTextureAtlasSource; +import org.andengine.util.BitmapUtils; import org.andengine.util.FileUtils; import org.andengine.util.StreamUtils; import org.andengine.util.debug.Debug; +import org.andengine.util.system.SystemUtils; +import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; +import android.os.Build; /** * @@ -88,13 +92,30 @@ public FileBitmapTextureAtlasSource deepCopy() { @Override public Bitmap onLoadBitmap(final Config pBitmapConfig) { + return this.onLoadBitmap(pBitmapConfig, false); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig, final boolean pMutable) { final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); decodeOptions.inPreferredConfig = pBitmapConfig; + decodeOptions.inDither = false; + + if (pMutable && SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB)) { + decodeOptions.inMutable = pMutable; + } InputStream in = null; try { in = new FileInputStream(this.mFile); - return BitmapFactory.decodeStream(in, null, decodeOptions); + final Bitmap bitmap = BitmapFactory.decodeStream(in, null, decodeOptions); + + if (pMutable) { + return BitmapUtils.ensureBitmapIsMutable(bitmap); + } else { + return bitmap; + } } catch (final IOException e) { Debug.e("Failed loading Bitmap in " + this.getClass().getSimpleName() + ". File: " + this.mFile, e); return null; diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java index a022f0b24..d66edcbc5 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java @@ -25,4 +25,5 @@ public interface IBitmapTextureAtlasSource extends ITextureAtlasSource { public IBitmapTextureAtlasSource deepCopy(); public Bitmap onLoadBitmap(final Config pBitmapConfig); + public Bitmap onLoadBitmap(final Config pBitmapConfig, final boolean pMutable); } \ No newline at end of file diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java index 8bc451cf9..8670eb608 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java @@ -2,11 +2,15 @@ import org.andengine.opengl.texture.atlas.source.BaseTextureAtlasSource; +import org.andengine.util.BitmapUtils; +import org.andengine.util.system.SystemUtils; +import android.annotation.TargetApi; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; +import android.os.Build; /** * (c) 2010 Nicolas Gramlich @@ -67,10 +71,28 @@ public ResourceBitmapTextureAtlasSource deepCopy() { @Override public Bitmap onLoadBitmap(final Config pBitmapConfig) { + return this.onLoadBitmap(pBitmapConfig, false); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + @Override + public Bitmap onLoadBitmap(final Config pBitmapConfig, final boolean pMutable) { final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); decodeOptions.inPreferredConfig = pBitmapConfig; + decodeOptions.inDither = false; // decodeOptions.inScaled = false; // TODO Check how this behaves with drawable-""/nodpi/ldpi/mdpi/hdpi folders - return BitmapFactory.decodeResource(this.mResources, this.mDrawableResourceID, decodeOptions); + + if (pMutable && SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB)) { + decodeOptions.inMutable = pMutable; + } + + final Bitmap bitmap = BitmapFactory.decodeResource(this.mResources, this.mDrawableResourceID, decodeOptions); + + if (pMutable) { + return BitmapUtils.ensureBitmapIsMutable(bitmap); + } else { + return bitmap; + } } @Override diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java index cb6dadf15..92eded248 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseBitmapTextureAtlasSourceDecorator.java @@ -1,7 +1,7 @@ package org.andengine.opengl.texture.atlas.bitmap.source.decorator; +import org.andengine.opengl.texture.atlas.bitmap.source.BaseBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; -import org.andengine.opengl.texture.atlas.source.BaseTextureAtlasSource; import org.andengine.util.debug.Debug; import android.graphics.Bitmap; @@ -10,13 +10,13 @@ import android.graphics.Paint; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:43:29 - 06.08.2010 */ -public abstract class BaseBitmapTextureAtlasSourceDecorator extends BaseTextureAtlasSource implements IBitmapTextureAtlasSource { +public abstract class BaseBitmapTextureAtlasSourceDecorator extends BaseBitmapTextureAtlasSource { // =========================================================== // Constants // =========================================================== @@ -25,7 +25,6 @@ public abstract class BaseBitmapTextureAtlasSourceDecorator extends BaseTextureA // Fields // =========================================================== - protected final IBitmapTextureAtlasSource mBitmapTextureAtlasSource; protected TextureAtlasSourceDecoratorOptions mTextureAtlasSourceDecoratorOptions; protected Paint mPaint = new Paint(); @@ -38,9 +37,8 @@ public BaseBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBi } public BaseBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final TextureAtlasSourceDecoratorOptions pTextureAtlasSourceDecoratorOptions) { - super(pBitmapTextureAtlasSource.getTextureX(), pBitmapTextureAtlasSource.getTextureY(), pBitmapTextureAtlasSource.getTextureWidth(), pBitmapTextureAtlasSource.getTextureHeight()); + super(pBitmapTextureAtlasSource); - this.mBitmapTextureAtlasSource = pBitmapTextureAtlasSource; this.mTextureAtlasSourceDecoratorOptions = (pTextureAtlasSourceDecoratorOptions == null) ? new TextureAtlasSourceDecoratorOptions() : pTextureAtlasSourceDecoratorOptions; this.mPaint.setAntiAlias(this.mTextureAtlasSourceDecoratorOptions.getAntiAliasing()); } @@ -74,19 +72,9 @@ public void setTextureAtlasSourceDecoratorOptions(final TextureAtlasSourceDecora protected abstract void onDecorateBitmap(final Canvas pCanvas) throws Exception; - @Override - public int getTextureWidth() { - return this.mBitmapTextureAtlasSource.getTextureWidth(); - } - - @Override - public int getTextureHeight() { - return this.mBitmapTextureAtlasSource.getTextureHeight(); - } - @Override public Bitmap onLoadBitmap(final Config pBitmapConfig) { - final Bitmap bitmap = this.ensureLoadedBitmapIsMutable(this.mBitmapTextureAtlasSource.onLoadBitmap(pBitmapConfig)); + final Bitmap bitmap = this.onLoadBitmap(pBitmapConfig, true); final Canvas canvas = new Canvas(bitmap); try { @@ -101,16 +89,6 @@ public Bitmap onLoadBitmap(final Config pBitmapConfig) { // Methods // =========================================================== - private Bitmap ensureLoadedBitmapIsMutable(final Bitmap pBitmap) { - if (pBitmap.isMutable()) { - return pBitmap; - } else { - final Bitmap mutableBitmap = pBitmap.copy(pBitmap.getConfig(), true); - pBitmap.recycle(); - return mutableBitmap; - } - } - // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java index 8f7d25747..1a55309c1 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java @@ -1,16 +1,24 @@ package org.andengine.opengl.texture.atlas.bitmap.source.decorator; +import org.andengine.opengl.texture.atlas.bitmap.source.ColorKeyBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.decorator.shape.IBitmapTextureAtlasSourceDecoratorShape; import org.andengine.util.adt.color.Color; +import android.os.Build; + /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * + * @deprecated On {@link Build.VERSION_CODES#JELLY_BEAN} and higher! + * + * @see {@link ColorKeyBitmapTextureAtlasSource} + * * @author Nicolas Gramlich * @since 22:16:41 - 06.08.2010 */ +@Deprecated public class ColorKeyBitmapTextureAtlasSourceDecorator extends ColorSwapBitmapTextureAtlasSourceDecorator { // =========================================================== // Constants diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java index 4236d897a..4680c8b52 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java @@ -1,19 +1,28 @@ package org.andengine.opengl.texture.atlas.bitmap.source.decorator; +import org.andengine.opengl.texture.atlas.bitmap.source.ColorSwapBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.IBitmapTextureAtlasSource; import org.andengine.opengl.texture.atlas.bitmap.source.decorator.shape.IBitmapTextureAtlasSourceDecoratorShape; import org.andengine.util.adt.color.Color; +import org.andengine.util.debug.Debug; +import org.andengine.util.system.SystemUtils; import android.graphics.AvoidXfermode; import android.graphics.AvoidXfermode.Mode; +import android.os.Build; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * + * @deprecated On {@link Build.VERSION_CODES#JELLY_BEAN} and higher! + * + * @see {@link ColorSwapBitmapTextureAtlasSource} + * * @author Nicolas Gramlich * @since 19:41:39 - 07.06.2011 */ +@Deprecated public class ColorSwapBitmapTextureAtlasSourceDecorator extends BaseShapeBitmapTextureAtlasSourceDecorator { // =========================================================== // Constants @@ -69,6 +78,10 @@ public ColorSwapBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSourc this.mColorSwapColorARGBPackedInt = pColorSwapColorARGBPackedInt; this.mPaint.setXfermode(new AvoidXfermode(pColorKeyColorARGBPackedInt, pTolerance, Mode.TARGET)); this.mPaint.setColor(pColorSwapColorARGBPackedInt); + + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.JELLY_BEAN)) { + Debug.w("The class " + ColorSwapBitmapTextureAtlasSourceDecorator.class.getSimpleName() + " is deprecated for Android API Level: '" + Build.VERSION_CODES.JELLY_BEAN + "' and higher, since the class " + AvoidXfermode.class.getSimpleName() + " is deprecated since then."); + } } @Override diff --git a/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java b/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java index 0e01ca29f..03a9cbccc 100644 --- a/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java +++ b/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java @@ -135,6 +135,7 @@ protected void writeTextureToHardware(final GLState pGLState) throws IOException protected Bitmap onGetBitmap(final Config pBitmapConfig) throws IOException { final BitmapFactory.Options decodeOptions = new BitmapFactory.Options(); decodeOptions.inPreferredConfig = pBitmapConfig; + decodeOptions.inDither = false; return BitmapFactory.decodeStream(this.mInputStreamOpener.open(), null, decodeOptions); } diff --git a/src/org/andengine/util/BitmapUtils.java b/src/org/andengine/util/BitmapUtils.java new file mode 100644 index 000000000..7d6b932c2 --- /dev/null +++ b/src/org/andengine/util/BitmapUtils.java @@ -0,0 +1,54 @@ +package org.andengine.util; + +import android.graphics.Bitmap; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 18:52:32 - 18.02.2013 + */ +public class BitmapUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * @param pBitmap + * + * @return a {@link Bitmap} that is {@link Bitmap#isMutable()}. If pBitmap is {@link Bitmap#isMutable()} then pBitmap is returned, otherwise a new {@link Bitmap} instance is returned that is {@link Bitmap#isMutable()} and pBitmap is {@link Bitmap#recycle()}d. + */ + public static Bitmap ensureBitmapIsMutable(final Bitmap pBitmap) { + if (pBitmap.isMutable()) { + return pBitmap; + } else { + final Bitmap mutableBitmap = pBitmap.copy(pBitmap.getConfig(), true); + pBitmap.recycle(); + return mutableBitmap; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From d3165cdfb2232a16f35f9c95feabeaed89f288a6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 18 Feb 2013 23:45:49 -0800 Subject: [PATCH 118/252] Removed trailing whitespaces. --- src/org/andengine/audio/BaseAudioEntity.java | 2 +- src/org/andengine/audio/BaseAudioManager.java | 4 ++-- src/org/andengine/audio/IAudioEntity.java | 4 ++-- src/org/andengine/audio/IAudioManager.java | 4 ++-- src/org/andengine/audio/music/Music.java | 2 +- src/org/andengine/audio/music/MusicFactory.java | 4 ++-- src/org/andengine/audio/music/MusicManager.java | 4 ++-- src/org/andengine/audio/sound/Sound.java | 2 +- src/org/andengine/audio/sound/SoundFactory.java | 4 ++-- src/org/andengine/audio/sound/SoundLibrary.java | 4 ++-- src/org/andengine/audio/sound/SoundManager.java | 4 ++-- src/org/andengine/engine/Engine.java | 2 +- src/org/andengine/engine/FixedStepEngine.java | 6 +++--- src/org/andengine/engine/LimitedFPSEngine.java | 6 +++--- src/org/andengine/engine/camera/BoundCamera.java | 8 ++++---- src/org/andengine/engine/camera/Camera.java | 2 +- src/org/andengine/engine/camera/CameraFactory.java | 4 ++-- src/org/andengine/engine/camera/SmoothCamera.java | 4 ++-- src/org/andengine/engine/camera/ZoomCamera.java | 2 +- src/org/andengine/engine/camera/hud/HUD.java | 6 +++--- .../camera/hud/controls/AnalogOnScreenControl.java | 4 ++-- .../camera/hud/controls/BaseOnScreenControl.java | 2 +- .../hud/controls/DigitalOnScreenControl.java | 4 ++-- .../engine/handler/BaseEntityUpdateHandler.java | 2 +- src/org/andengine/engine/handler/IDrawHandler.java | 4 ++-- .../andengine/engine/handler/IUpdateHandler.java | 4 ++-- .../engine/handler/UpdateHandlerList.java | 4 ++-- .../engine/handler/collision/CollisionHandler.java | 4 ++-- .../handler/collision/ICollisionCallback.java | 4 ++-- .../engine/handler/physics/PhysicsHandler.java | 4 ++-- .../engine/handler/runnable/RunnableHandler.java | 4 ++-- .../engine/handler/timer/ITimerCallback.java | 4 ++-- .../engine/handler/timer/TimerHandler.java | 4 ++-- src/org/andengine/engine/options/AudioOptions.java | 2 +- .../andengine/engine/options/EngineOptions.java | 2 +- .../andengine/engine/options/RenderOptions.java | 2 +- .../andengine/engine/options/WakeLockOptions.java | 4 ++-- .../resolutionpolicy/BaseResolutionPolicy.java | 4 ++-- .../resolutionpolicy/FillResolutionPolicy.java | 4 ++-- .../resolutionpolicy/FixedResolutionPolicy.java | 4 ++-- .../resolutionpolicy/IResolutionPolicy.java | 4 ++-- .../resolutionpolicy/RatioResolutionPolicy.java | 4 ++-- .../resolutionpolicy/RelativeResolutionPolicy.java | 4 ++-- .../splitscreen/DoubleSceneSplitScreenEngine.java | 4 ++-- .../splitscreen/SingleSceneSplitScreenEngine.java | 4 ++-- src/org/andengine/entity/Entity.java | 4 ++-- src/org/andengine/entity/IEntity.java | 6 +++--- .../andengine/entity/modifier/AlphaModifier.java | 4 ++-- .../andengine/entity/modifier/ColorModifier.java | 2 +- .../modifier/CubicBezierCurveMoveModifier.java | 2 +- .../andengine/entity/modifier/DelayModifier.java | 4 ++-- .../modifier/DoubleValueSpanEntityModifier.java | 4 ++-- .../entity/modifier/DurationEntityModifier.java | 4 ++-- .../andengine/entity/modifier/EntityModifier.java | 4 ++-- .../entity/modifier/EntityModifierList.java | 4 ++-- .../andengine/entity/modifier/FadeInModifier.java | 4 ++-- .../andengine/entity/modifier/FadeOutModifier.java | 4 ++-- .../andengine/entity/modifier/IEntityModifier.java | 4 ++-- .../entity/modifier/LoopEntityModifier.java | 4 ++-- .../andengine/entity/modifier/MoveByModifier.java | 2 +- .../andengine/entity/modifier/MoveModifier.java | 4 ++-- .../andengine/entity/modifier/MoveXModifier.java | 4 ++-- .../andengine/entity/modifier/MoveYModifier.java | 4 ++-- .../entity/modifier/ParallelEntityModifier.java | 4 ++-- .../andengine/entity/modifier/PathModifier.java | 4 ++-- .../modifier/QuadraticBezierCurveMoveModifier.java | 2 +- .../entity/modifier/RotationAtModifier.java | 4 ++-- .../entity/modifier/RotationByModifier.java | 4 ++-- .../entity/modifier/RotationModifier.java | 4 ++-- .../andengine/entity/modifier/ScaleAtModifier.java | 4 ++-- .../andengine/entity/modifier/ScaleModifier.java | 4 ++-- .../entity/modifier/SequenceEntityModifier.java | 4 ++-- .../modifier/SingleValueChangeEntityModifier.java | 4 ++-- .../modifier/SingleValueSpanEntityModifier.java | 4 ++-- .../modifier/TripleValueSpanEntityModifier.java | 4 ++-- .../particle/BatchedSpriteParticleSystem.java | 2 +- src/org/andengine/entity/particle/Particle.java | 2 +- .../andengine/entity/particle/ParticleSystem.java | 4 ++-- .../emitter/BaseCircleParticleEmitter.java | 4 ++-- .../particle/emitter/BaseParticleEmitter.java | 4 ++-- .../emitter/BaseRectangleParticleEmitter.java | 4 ++-- .../emitter/CircleOutlineParticleEmitter.java | 4 ++-- .../particle/emitter/CircleParticleEmitter.java | 4 ++-- .../entity/particle/emitter/IParticleEmitter.java | 4 ++-- .../particle/emitter/PointParticleEmitter.java | 4 ++-- .../emitter/RectangleOutlineParticleEmitter.java | 4 ++-- .../particle/emitter/RectangleParticleEmitter.java | 4 ++-- .../AccelerationParticleInitializer.java | 4 ++-- .../initializer/AlphaParticleInitializer.java | 4 ++-- .../BaseDoubleValueParticleInitializer.java | 4 ++-- .../BaseSingleValueParticleInitializer.java | 4 ++-- .../BaseTripleValueParticleInitializer.java | 4 ++-- .../BlendFunctionParticleInitializer.java | 4 ++-- .../initializer/ColorParticleInitializer.java | 4 ++-- .../initializer/GravityParticleInitializer.java | 4 ++-- .../particle/initializer/IParticleInitializer.java | 4 ++-- .../initializer/RotationParticleInitializer.java | 4 ++-- .../initializer/VelocityParticleInitializer.java | 4 ++-- .../particle/modifier/AlphaParticleModifier.java | 4 ++-- .../BaseDoubleValueSpanParticleModifier.java | 4 ++-- .../BaseSingleValueSpanParticleModifier.java | 4 ++-- .../BaseTripleValueSpanParticleModifier.java | 4 ++-- .../particle/modifier/ColorParticleModifier.java | 4 ++-- .../modifier/ExpireParticleInitializer.java | 4 ++-- .../particle/modifier/IParticleModifier.java | 4 ++-- .../modifier/OffCameraExpireParticleModifier.java | 4 ++-- .../modifier/RotationParticleModifier.java | 4 ++-- .../particle/modifier/ScaleParticleModifier.java | 4 ++-- src/org/andengine/entity/primitive/Gradient.java | 2 +- src/org/andengine/entity/primitive/Line.java | 2 +- src/org/andengine/entity/primitive/Rectangle.java | 2 +- src/org/andengine/entity/scene/CameraScene.java | 2 +- .../entity/scene/IOnAreaTouchListener.java | 4 ++-- .../entity/scene/IOnSceneTouchListener.java | 4 ++-- src/org/andengine/entity/scene/Scene.java | 8 ++++---- .../scene/background/AutoParallaxBackground.java | 4 ++-- .../entity/scene/background/Background.java | 2 +- .../entity/scene/background/EntityBackground.java | 4 ++-- .../entity/scene/background/IBackground.java | 4 ++-- .../scene/background/ParallaxBackground.java | 6 +++--- .../background/RepeatingSpriteBackground.java | 2 +- .../entity/scene/background/SpriteBackground.java | 4 ++-- .../modifier/ColorBackgroundModifier.java | 2 +- .../background/modifier/IBackgroundModifier.java | 4 ++-- .../modifier/LoopBackgroundModifier.java | 4 ++-- .../modifier/ParallelBackgroundModifier.java | 4 ++-- .../modifier/SequenceBackgroundModifier.java | 4 ++-- src/org/andengine/entity/scene/menu/MenuScene.java | 2 +- .../menu/animator/AlphaMenuSceneAnimator.java | 2 +- .../scene/menu/animator/IMenuSceneAnimator.java | 2 +- .../menu/animator/InstantMenuSceneAnimator.java | 2 +- .../scene/menu/animator/MenuSceneAnimator.java | 2 +- .../menu/animator/SlideMenuSceneAnimator.java | 2 +- .../scene/menu/item/AnimatedSpriteMenuItem.java | 2 +- .../entity/scene/menu/item/IMenuItem.java | 4 ++-- .../entity/scene/menu/item/SpriteMenuItem.java | 2 +- .../entity/scene/menu/item/TextMenuItem.java | 2 +- .../menu/item/decorator/BaseMenuItemDecorator.java | 4 ++-- .../item/decorator/ColorMenuItemDecorator.java | 2 +- .../item/decorator/ScaleMenuItemDecorator.java | 4 ++-- src/org/andengine/entity/shape/IShape.java | 4 ++-- src/org/andengine/entity/shape/Shape.java | 2 +- .../andengine/entity/sprite/AnimatedSprite.java | 14 +++++++------- src/org/andengine/entity/sprite/AnimationData.java | 8 ++++---- .../andengine/entity/sprite/IAnimationData.java | 6 +++--- src/org/andengine/entity/sprite/Sprite.java | 2 +- src/org/andengine/entity/sprite/TiledSprite.java | 2 +- .../andengine/entity/sprite/UncoloredSprite.java | 2 +- .../entity/sprite/UniformColorSprite.java | 2 +- .../andengine/entity/sprite/batch/SpriteBatch.java | 4 ++-- .../andengine/entity/sprite/batch/SpriteGroup.java | 2 +- src/org/andengine/entity/text/Text.java | 2 +- src/org/andengine/entity/text/TickerText.java | 2 +- .../entity/text/vbo/ITextVertexBufferObject.java | 2 +- .../andengine/entity/util/AverageFPSCounter.java | 4 ++-- src/org/andengine/entity/util/FPSCounter.java | 4 ++-- src/org/andengine/entity/util/FPSLogger.java | 2 +- .../andengine/entity/util/FrameCountCrasher.java | 4 ++-- src/org/andengine/entity/util/FrameCounter.java | 4 ++-- src/org/andengine/entity/util/ScreenCapture.java | 4 ++-- src/org/andengine/entity/util/ScreenGrabber.java | 4 ++-- src/org/andengine/input/sensor/BaseSensorData.java | 4 ++-- src/org/andengine/input/sensor/SensorDelay.java | 4 ++-- .../sensor/acceleration/AccelerationData.java | 4 ++-- .../acceleration/AccelerationSensorOptions.java | 4 ++-- .../sensor/acceleration/IAccelerationListener.java | 4 ++-- .../input/sensor/location/ILocationListener.java | 4 ++-- .../sensor/location/LocationProviderStatus.java | 4 ++-- .../sensor/location/LocationSensorOptions.java | 4 ++-- .../sensor/orientation/IOrientationListener.java | 4 ++-- .../input/sensor/orientation/OrientationData.java | 4 ++-- .../orientation/OrientationSensorOptions.java | 4 ++-- src/org/andengine/input/touch/TouchEvent.java | 4 ++-- .../touch/controller/BaseTouchController.java | 2 +- .../input/touch/controller/ITouchController.java | 4 ++-- .../input/touch/controller/MultiTouch.java | 2 +- .../touch/controller/MultiTouchController.java | 2 +- .../touch/controller/SingleTouchController.java | 4 ++-- .../input/touch/detector/BaseDetector.java | 2 +- .../input/touch/detector/ClickDetector.java | 2 +- .../touch/detector/ContinuousHoldDetector.java | 4 ++-- .../input/touch/detector/HoldDetector.java | 2 +- .../input/touch/detector/PinchZoomDetector.java | 2 +- .../input/touch/detector/ScrollDetector.java | 2 +- .../touch/detector/SurfaceGestureDetector.java | 2 +- .../touch/detector/SurfaceScrollDetector.java | 2 +- src/org/andengine/opengl/font/Font.java | 2 +- src/org/andengine/opengl/font/FontFactory.java | 2 +- src/org/andengine/opengl/font/FontLibrary.java | 4 ++-- src/org/andengine/opengl/font/FontManager.java | 2 +- src/org/andengine/opengl/font/FontUtils.java | 2 +- src/org/andengine/opengl/font/Letter.java | 2 +- src/org/andengine/opengl/font/StrokeFont.java | 4 ++-- .../opengl/shader/ShaderProgramManager.java | 2 +- src/org/andengine/opengl/texture/ITexture.java | 4 ++-- src/org/andengine/opengl/texture/PixelFormat.java | 2 +- src/org/andengine/opengl/texture/Texture.java | 2 +- .../andengine/opengl/texture/TextureManager.java | 2 +- .../andengine/opengl/texture/TextureOptions.java | 6 +++--- .../opengl/texture/atlas/ITextureAtlas.java | 2 +- .../opengl/texture/atlas/TextureAtlas.java | 2 +- .../texture/atlas/bitmap/BitmapTextureAtlas.java | 2 +- .../atlas/bitmap/BuildableBitmapTextureAtlas.java | 4 ++-- .../source/AssetBitmapTextureAtlasSource.java | 4 ++-- .../source/ColorSwapBitmapTextureAtlasSource.java | 2 +- .../source/EmptyBitmapTextureAtlasSource.java | 4 ++-- .../source/FileBitmapTextureAtlasSource.java | 6 +++--- .../bitmap/source/IBitmapTextureAtlasSource.java | 4 ++-- .../source/PictureBitmapTextureAtlasSource.java | 4 ++-- .../source/ResourceBitmapTextureAtlasSource.java | 4 ++-- ...BaseShapeBitmapTextureAtlasSourceDecorator.java | 4 ++-- .../ColorKeyBitmapTextureAtlasSourceDecorator.java | 8 ++++---- ...ColorSwapBitmapTextureAtlasSourceDecorator.java | 2 +- .../FillBitmapTextureAtlasSourceDecorator.java | 4 ++-- ...dientFillBitmapTextureAtlasSourceDecorator.java | 4 ++-- .../OutlineBitmapTextureAtlasSourceDecorator.java | 4 ++-- ...dientFillBitmapTextureAtlasSourceDecorator.java | 6 +++--- .../ArcBitmapTextureAtlasSourceDecoratorShape.java | 4 ++-- ...rcleBitmapTextureAtlasSourceDecoratorShape.java | 4 ++-- ...ipseBitmapTextureAtlasSourceDecoratorShape.java | 4 ++-- .../IBitmapTextureAtlasSourceDecoratorShape.java | 4 ++-- ...ngleBitmapTextureAtlasSourceDecoratorShape.java | 4 ++-- .../atlas/buildable/BuildableTextureAtlas.java | 2 +- .../BuildableTextureAtlasTextureRegionFactory.java | 4 ++-- .../builder/BlackPawnTextureAtlasBuilder.java | 6 +++--- .../buildable/builder/ITextureAtlasBuilder.java | 4 ++-- .../atlas/source/BaseTextureAtlasSource.java | 4 ++-- .../texture/atlas/source/ITextureAtlasSource.java | 4 ++-- .../opengl/texture/region/BaseTextureRegion.java | 2 +- .../opengl/texture/region/TextureRegion.java | 2 +- .../texture/region/TextureRegionFactory.java | 2 +- .../texture/region/TextureRegionLibrary.java | 2 +- .../opengl/texture/region/TiledTextureRegion.java | 2 +- .../opengl/texture/render/RenderTexture.java | 4 ++-- src/org/andengine/opengl/util/GLMatrixStack.java | 2 +- src/org/andengine/opengl/util/VertexUtils.java | 2 +- .../vbo/HighPerformanceVertexBufferObject.java | 4 ++-- .../opengl/vbo/LowMemoryVertexBufferObject.java | 6 +++--- .../andengine/opengl/vbo/VertexBufferObject.java | 4 ++-- .../attribute/VertexBufferObjectAttributeFix.java | 2 +- src/org/andengine/opengl/view/EngineRenderer.java | 2 +- .../andengine/opengl/view/IRendererListener.java | 2 +- .../andengine/opengl/view/RenderSurfaceView.java | 2 +- src/org/andengine/ui/IGameInterface.java | 4 ++-- src/org/andengine/ui/activity/BaseActivity.java | 14 +++++++------- .../andengine/ui/activity/BaseGameActivity.java | 2 +- .../andengine/ui/activity/LayoutGameActivity.java | 4 ++-- .../ui/activity/LegacyBaseGameActivity.java | 2 +- .../ui/activity/SimpleBaseGameActivity.java | 2 +- .../ui/dialog/GenericInputDialogBuilder.java | 4 ++-- .../ui/dialog/StringInputDialogBuilder.java | 4 ++-- src/org/andengine/util/ActivityUtils.java | 4 ++-- src/org/andengine/util/BetaUtils.java | 4 ++-- src/org/andengine/util/BitmapUtils.java | 2 +- src/org/andengine/util/Constants.java | 4 ++-- src/org/andengine/util/DatabaseUtils.java | 2 +- src/org/andengine/util/DialogUtils.java | 4 ++-- src/org/andengine/util/FileUtils.java | 6 +++--- src/org/andengine/util/IMatcher.java | 4 ++-- src/org/andengine/util/ProbabilityGenerator.java | 4 ++-- src/org/andengine/util/SAXUtils.java | 2 +- src/org/andengine/util/SocketUtils.java | 4 ++-- src/org/andengine/util/StreamUtils.java | 2 +- src/org/andengine/util/TextUtils.java | 2 +- src/org/andengine/util/TimeUtils.java | 4 ++-- src/org/andengine/util/ViewUtils.java | 4 ++-- src/org/andengine/util/adt/DataConstants.java | 2 +- .../andengine/util/adt/align/HorizontalAlign.java | 4 ++-- .../andengine/util/adt/align/VerticalAlign.java | 4 ++-- src/org/andengine/util/adt/array/ArrayUtils.java | 2 +- src/org/andengine/util/adt/color/ColorUtils.java | 2 +- .../util/adt/color/constants/ColorConstants.java | 4 ++-- src/org/andengine/util/adt/data/DataUtils.java | 4 ++-- src/org/andengine/util/adt/list/ListUtils.java | 2 +- src/org/andengine/util/adt/list/ShiftList.java | 2 +- src/org/andengine/util/adt/list/SmartList.java | 2 +- src/org/andengine/util/adt/map/Library.java | 4 ++-- .../andengine/util/adt/map/LongSparseArray.java | 4 ++-- src/org/andengine/util/adt/map/MultiKey.java | 4 ++-- .../andengine/util/adt/map/MultiKeyHashMap.java | 4 ++-- .../andengine/util/adt/map/SparseByteArray.java | 8 ++++---- .../andengine/util/adt/map/SparseCharArray.java | 8 ++++---- .../andengine/util/adt/map/SparseDoubleArray.java | 8 ++++---- .../andengine/util/adt/map/SparseFloatArray.java | 8 ++++---- .../andengine/util/adt/map/SparseLongArray.java | 8 ++++---- .../adt/pool/EntityDetachRunnablePoolItem.java | 4 ++-- .../EntityDetachRunnablePoolUpdateHandler.java | 2 +- src/org/andengine/util/adt/pool/GenericPool.java | 4 ++-- src/org/andengine/util/adt/pool/MultiPool.java | 4 ++-- src/org/andengine/util/adt/pool/Pool.java | 4 ++-- src/org/andengine/util/adt/pool/PoolItem.java | 6 +++--- .../andengine/util/adt/pool/PoolUpdateHandler.java | 4 ++-- .../andengine/util/adt/pool/RunnablePoolItem.java | 4 ++-- .../util/adt/pool/RunnablePoolUpdateHandler.java | 4 ++-- src/org/andengine/util/adt/spatial/Direction.java | 2 +- .../util/adt/spatial/quadtree/QuadTree.java | 2 +- .../util/adt/transformation/Transformation.java | 6 +++--- .../adt/transformation/TransformationPool.java | 4 ++-- .../algorithm/collision/BaseCollisionChecker.java | 6 +++--- .../collision/EntityCollisionChecker.java | 2 +- .../algorithm/collision/LineCollisionChecker.java | 4 ++-- .../andengine/util/algorithm/hull/HullUtils.java | 2 +- .../util/algorithm/hull/IHullAlgorithm.java | 4 ++-- .../andengine/util/algorithm/hull/JarvisMarch.java | 4 ++-- .../util/algorithm/path/ICostFunction.java | 4 ++-- .../andengine/util/algorithm/path/IPathFinder.java | 4 ++-- .../util/algorithm/path/IPathFinderMap.java | 4 ++-- src/org/andengine/util/algorithm/path/Path.java | 2 +- .../util/algorithm/path/astar/AStarPathFinder.java | 2 +- .../algorithm/path/astar/EuclideanHeuristic.java | 4 ++-- .../util/algorithm/path/astar/IAStarHeuristic.java | 4 ++-- .../algorithm/path/astar/ManhattanHeuristic.java | 4 ++-- .../util/algorithm/path/astar/NullHeuristic.java | 4 ++-- .../util/algorithm/sort/InsertionSorter.java | 4 ++-- src/org/andengine/util/algorithm/sort/Sorter.java | 4 ++-- src/org/andengine/util/call/AsyncCallable.java | 4 ++-- src/org/andengine/util/call/Callable.java | 4 ++-- src/org/andengine/util/call/Callback.java | 4 ++-- src/org/andengine/util/call/ParameterCallable.java | 4 ++-- src/org/andengine/util/debug/Debug.java | 2 +- src/org/andengine/util/level/LevelLoader.java | 2 +- .../util/level/LevelLoaderContentHandler.java | 4 ++-- .../util/level/constants/LevelConstants.java | 4 ++-- .../util/levelstats/LevelStatsDBConnector.java | 4 ++-- src/org/andengine/util/math/MathConstants.java | 4 ++-- src/org/andengine/util/math/MathUtils.java | 2 +- src/org/andengine/util/mime/MIMEType.java | 4 ++-- .../util/modifier/BaseDoubleValueSpanModifier.java | 4 ++-- .../util/modifier/BaseDurationModifier.java | 4 ++-- src/org/andengine/util/modifier/BaseModifier.java | 4 ++-- .../modifier/BaseQuadrupelValueSpanModifier.java | 2 +- .../modifier/BaseSingleValueChangeModifier.java | 2 +- .../util/modifier/BaseSingleValueSpanModifier.java | 4 ++-- .../util/modifier/BaseTripleValueSpanModifier.java | 4 ++-- src/org/andengine/util/modifier/IModifier.java | 2 +- src/org/andengine/util/modifier/LoopModifier.java | 2 +- src/org/andengine/util/modifier/ModifierList.java | 4 ++-- .../andengine/util/modifier/ParallelModifier.java | 4 ++-- .../andengine/util/modifier/SequenceModifier.java | 4 ++-- .../util/modifier/util/ModifierUtils.java | 4 ++-- .../util/preferences/SimplePreferences.java | 4 ++-- .../andengine/util/progress/IProgressListener.java | 4 ++-- .../andengine/util/progress/ProgressCallable.java | 4 ++-- .../andengine/util/progress/ProgressMonitor.java | 2 +- src/org/andengine/util/system/SystemUtils.java | 2 +- .../util/texturepack/TexturePackTextureRegion.java | 2 +- src/org/andengine/util/time/TimeConstants.java | 4 ++-- 347 files changed, 626 insertions(+), 626 deletions(-) diff --git a/src/org/andengine/audio/BaseAudioEntity.java b/src/org/andengine/audio/BaseAudioEntity.java index dcd48d000..894973b00 100644 --- a/src/org/andengine/audio/BaseAudioEntity.java +++ b/src/org/andengine/audio/BaseAudioEntity.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:35:37 - 13.06.2010 */ diff --git a/src/org/andengine/audio/BaseAudioManager.java b/src/org/andengine/audio/BaseAudioManager.java index 3b554549f..64bc0c6e3 100644 --- a/src/org/andengine/audio/BaseAudioManager.java +++ b/src/org/andengine/audio/BaseAudioManager.java @@ -3,9 +3,9 @@ import java.util.ArrayList; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:07:02 - 13.06.2010 */ diff --git a/src/org/andengine/audio/IAudioEntity.java b/src/org/andengine/audio/IAudioEntity.java index c235465df..d029522ac 100644 --- a/src/org/andengine/audio/IAudioEntity.java +++ b/src/org/andengine/audio/IAudioEntity.java @@ -1,9 +1,9 @@ package org.andengine.audio; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:53:29 - 13.06.2010 */ diff --git a/src/org/andengine/audio/IAudioManager.java b/src/org/andengine/audio/IAudioManager.java index c290bdc3a..0183ae0db 100644 --- a/src/org/andengine/audio/IAudioManager.java +++ b/src/org/andengine/audio/IAudioManager.java @@ -1,9 +1,9 @@ package org.andengine.audio; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:02:06 - 13.06.2010 */ diff --git a/src/org/andengine/audio/music/Music.java b/src/org/andengine/audio/music/Music.java index 921dd5d26..1c42b40ec 100644 --- a/src/org/andengine/audio/music/Music.java +++ b/src/org/andengine/audio/music/Music.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:53:12 - 13.06.2010 */ diff --git a/src/org/andengine/audio/music/MusicFactory.java b/src/org/andengine/audio/music/MusicFactory.java index 973d45810..df84bd91c 100644 --- a/src/org/andengine/audio/music/MusicFactory.java +++ b/src/org/andengine/audio/music/MusicFactory.java @@ -9,9 +9,9 @@ import android.media.MediaPlayer; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:05:49 - 13.06.2010 */ diff --git a/src/org/andengine/audio/music/MusicManager.java b/src/org/andengine/audio/music/MusicManager.java index 639b5338a..9d23d32fc 100644 --- a/src/org/andengine/audio/music/MusicManager.java +++ b/src/org/andengine/audio/music/MusicManager.java @@ -3,9 +3,9 @@ import org.andengine.audio.BaseAudioManager; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:01:23 - 13.06.2010 */ diff --git a/src/org/andengine/audio/sound/Sound.java b/src/org/andengine/audio/sound/Sound.java index 72a743aa9..897f5b5e3 100644 --- a/src/org/andengine/audio/sound/Sound.java +++ b/src/org/andengine/audio/sound/Sound.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:22:15 - 11.03.2010 */ diff --git a/src/org/andengine/audio/sound/SoundFactory.java b/src/org/andengine/audio/sound/SoundFactory.java index ca7b4845d..7aa916b27 100644 --- a/src/org/andengine/audio/sound/SoundFactory.java +++ b/src/org/andengine/audio/sound/SoundFactory.java @@ -8,9 +8,9 @@ import android.content.res.AssetFileDescriptor; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:23:03 - 11.03.2010 */ diff --git a/src/org/andengine/audio/sound/SoundLibrary.java b/src/org/andengine/audio/sound/SoundLibrary.java index c617891bb..8c92e9e93 100644 --- a/src/org/andengine/audio/sound/SoundLibrary.java +++ b/src/org/andengine/audio/sound/SoundLibrary.java @@ -3,9 +3,9 @@ import org.andengine.util.adt.map.Library; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:41:56 - 20.08.2010 */ diff --git a/src/org/andengine/audio/sound/SoundManager.java b/src/org/andengine/audio/sound/SoundManager.java index a2d2ebbc3..1be77d35d 100644 --- a/src/org/andengine/audio/sound/SoundManager.java +++ b/src/org/andengine/audio/sound/SoundManager.java @@ -9,9 +9,9 @@ import android.util.SparseArray; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:22:59 - 11.03.2010 */ diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index 016a64a71..6d2ce80b5 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -62,7 +62,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:21:31 - 08.03.2010 */ diff --git a/src/org/andengine/engine/FixedStepEngine.java b/src/org/andengine/engine/FixedStepEngine.java index 924add30b..04d212930 100644 --- a/src/org/andengine/engine/FixedStepEngine.java +++ b/src/org/andengine/engine/FixedStepEngine.java @@ -7,10 +7,10 @@ /** * A subclass of {@link Engine} that tries to achieve a specific amount of updates per second. * When the time since the last update is bigger long the steplength, additional updates are executed. - * - * (c) 2010 Nicolas Gramlich + * + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:17:47 - 02.08.2010 */ diff --git a/src/org/andengine/engine/LimitedFPSEngine.java b/src/org/andengine/engine/LimitedFPSEngine.java index 7f73ba8d6..e09c27f2c 100644 --- a/src/org/andengine/engine/LimitedFPSEngine.java +++ b/src/org/andengine/engine/LimitedFPSEngine.java @@ -7,10 +7,10 @@ * A subclass of {@link Engine} that tries to achieve a specific amount of * updates per second. When the time since the last update is bigger long the * steplength, additional updates are executed. - * - * (c) 2010 Nicolas Gramlich + * + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:17:47 - 02.08.2010 */ diff --git a/src/org/andengine/engine/camera/BoundCamera.java b/src/org/andengine/engine/camera/BoundCamera.java index 9b5a7d537..9faeea074 100644 --- a/src/org/andengine/engine/camera/BoundCamera.java +++ b/src/org/andengine/engine/camera/BoundCamera.java @@ -1,9 +1,9 @@ package org.andengine.engine.camera; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:55:54 - 27.07.2010 */ @@ -114,13 +114,13 @@ protected void ensureInBounds() { if (this.mBoundsWidth < this.getWidth()) { centerX = this.mBoundsCenterX; } else { - centerX = getBoundedX(this.getCenterX()); + centerX = getBoundedX(this.getCenterX()); } final float centerY; if (this.mBoundsHeight < this.getHeight()) { centerY = this.mBoundsCenterY; } else { - centerY = getBoundedY(this.getCenterY()); + centerY = getBoundedY(this.getCenterY()); } super.setCenter(centerX, centerY); } diff --git a/src/org/andengine/engine/camera/Camera.java b/src/org/andengine/engine/camera/Camera.java index 2589406b5..169a6fd49 100644 --- a/src/org/andengine/engine/camera/Camera.java +++ b/src/org/andengine/engine/camera/Camera.java @@ -15,7 +15,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:24:18 - 25.03.2010 */ diff --git a/src/org/andengine/engine/camera/CameraFactory.java b/src/org/andengine/engine/camera/CameraFactory.java index ad64d1312..c51a0cc7a 100644 --- a/src/org/andengine/engine/camera/CameraFactory.java +++ b/src/org/andengine/engine/camera/CameraFactory.java @@ -4,9 +4,9 @@ import android.util.DisplayMetrics; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:50:42 - 03.07.2010 */ diff --git a/src/org/andengine/engine/camera/SmoothCamera.java b/src/org/andengine/engine/camera/SmoothCamera.java index a2ba695d7..0f0823500 100644 --- a/src/org/andengine/engine/camera/SmoothCamera.java +++ b/src/org/andengine/engine/camera/SmoothCamera.java @@ -2,9 +2,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:11:17 - 25.03.2010 */ diff --git a/src/org/andengine/engine/camera/ZoomCamera.java b/src/org/andengine/engine/camera/ZoomCamera.java index 6a9e5acd4..d40c6958f 100644 --- a/src/org/andengine/engine/camera/ZoomCamera.java +++ b/src/org/andengine/engine/camera/ZoomCamera.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:48:11 - 24.06.2010 * TODO min/max(X/Y) values could be cached and only updated once the zoomfactor/center changed. diff --git a/src/org/andengine/engine/camera/hud/HUD.java b/src/org/andengine/engine/camera/hud/HUD.java index 052805d3b..4fa0bebe2 100644 --- a/src/org/andengine/engine/camera/hud/HUD.java +++ b/src/org/andengine/engine/camera/hud/HUD.java @@ -7,10 +7,10 @@ /** * While you can add a {@link HUD} to {@link Scene}, you should not do so. * {@link HUD}s are meant to be added to {@link Camera}s via {@link Camera#setHUD(HUD)}. - * - * (c) 2010 Nicolas Gramlich + * + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:13:13 - 01.04.2010 */ diff --git a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java index d691151ca..dc453c1f5 100644 --- a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java @@ -9,9 +9,9 @@ import org.andengine.util.math.MathUtils; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 00:21:55 - 11.07.2010 */ diff --git a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java index 22c45e0b8..baf5b4c96 100644 --- a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java @@ -17,7 +17,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:43:09 - 11.07.2010 */ diff --git a/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java index 09fa90205..818fe7010 100644 --- a/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/DigitalOnScreenControl.java @@ -6,9 +6,9 @@ import org.andengine.util.math.MathUtils; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 00:21:55 - 11.07.2010 */ diff --git a/src/org/andengine/engine/handler/BaseEntityUpdateHandler.java b/src/org/andengine/engine/handler/BaseEntityUpdateHandler.java index 33c49e2ba..26883ea76 100644 --- a/src/org/andengine/engine/handler/BaseEntityUpdateHandler.java +++ b/src/org/andengine/engine/handler/BaseEntityUpdateHandler.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:00:25 - 24.12.2010 */ diff --git a/src/org/andengine/engine/handler/IDrawHandler.java b/src/org/andengine/engine/handler/IDrawHandler.java index d7d0ccfa5..c3d1fc5e9 100644 --- a/src/org/andengine/engine/handler/IDrawHandler.java +++ b/src/org/andengine/engine/handler/IDrawHandler.java @@ -5,9 +5,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:50:58 - 08.08.2010 */ diff --git a/src/org/andengine/engine/handler/IUpdateHandler.java b/src/org/andengine/engine/handler/IUpdateHandler.java index b776be770..f9ac4927d 100644 --- a/src/org/andengine/engine/handler/IUpdateHandler.java +++ b/src/org/andengine/engine/handler/IUpdateHandler.java @@ -3,9 +3,9 @@ import org.andengine.util.IMatcher; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:24:09 - 11.03.2010 */ diff --git a/src/org/andengine/engine/handler/UpdateHandlerList.java b/src/org/andengine/engine/handler/UpdateHandlerList.java index edf1458d2..cad9a696d 100644 --- a/src/org/andengine/engine/handler/UpdateHandlerList.java +++ b/src/org/andengine/engine/handler/UpdateHandlerList.java @@ -3,9 +3,9 @@ import org.andengine.util.adt.list.SmartList; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 09:45:22 - 31.03.2010 */ diff --git a/src/org/andengine/engine/handler/collision/CollisionHandler.java b/src/org/andengine/engine/handler/collision/CollisionHandler.java index 797a08960..085c77a71 100644 --- a/src/org/andengine/engine/handler/collision/CollisionHandler.java +++ b/src/org/andengine/engine/handler/collision/CollisionHandler.java @@ -7,9 +7,9 @@ import org.andengine.util.adt.list.ListUtils; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:19:35 - 11.03.2010 */ diff --git a/src/org/andengine/engine/handler/collision/ICollisionCallback.java b/src/org/andengine/engine/handler/collision/ICollisionCallback.java index ece85fcb2..c944609f2 100644 --- a/src/org/andengine/engine/handler/collision/ICollisionCallback.java +++ b/src/org/andengine/engine/handler/collision/ICollisionCallback.java @@ -3,9 +3,9 @@ import org.andengine.entity.shape.IShape; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:05:39 - 11.03.2010 */ diff --git a/src/org/andengine/engine/handler/physics/PhysicsHandler.java b/src/org/andengine/engine/handler/physics/PhysicsHandler.java index 811f6ecb0..c95ddf1a3 100644 --- a/src/org/andengine/engine/handler/physics/PhysicsHandler.java +++ b/src/org/andengine/engine/handler/physics/PhysicsHandler.java @@ -4,9 +4,9 @@ import org.andengine.entity.IEntity; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:53:07 - 24.12.2010 */ diff --git a/src/org/andengine/engine/handler/runnable/RunnableHandler.java b/src/org/andengine/engine/handler/runnable/RunnableHandler.java index 8b29cdbaf..db7d3301d 100644 --- a/src/org/andengine/engine/handler/runnable/RunnableHandler.java +++ b/src/org/andengine/engine/handler/runnable/RunnableHandler.java @@ -5,9 +5,9 @@ import org.andengine.engine.handler.IUpdateHandler; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:24:39 - 18.06.2010 */ diff --git a/src/org/andengine/engine/handler/timer/ITimerCallback.java b/src/org/andengine/engine/handler/timer/ITimerCallback.java index 14c45fd8d..2139ec622 100644 --- a/src/org/andengine/engine/handler/timer/ITimerCallback.java +++ b/src/org/andengine/engine/handler/timer/ITimerCallback.java @@ -1,9 +1,9 @@ package org.andengine.engine.handler.timer; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:23:25 - 12.03.2010 */ diff --git a/src/org/andengine/engine/handler/timer/TimerHandler.java b/src/org/andengine/engine/handler/timer/TimerHandler.java index 8b8744961..daafab6c4 100644 --- a/src/org/andengine/engine/handler/timer/TimerHandler.java +++ b/src/org/andengine/engine/handler/timer/TimerHandler.java @@ -3,9 +3,9 @@ import org.andengine.engine.handler.IUpdateHandler; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:23:58 - 12.03.2010 */ diff --git a/src/org/andengine/engine/options/AudioOptions.java b/src/org/andengine/engine/options/AudioOptions.java index 3dbfe3a73..b8c73c2fc 100644 --- a/src/org/andengine/engine/options/AudioOptions.java +++ b/src/org/andengine/engine/options/AudioOptions.java @@ -1,6 +1,6 @@ package org.andengine.engine.options; -/** +/** * (c) Zynga 2011 * * @author Nicolas Gramlich diff --git a/src/org/andengine/engine/options/EngineOptions.java b/src/org/andengine/engine/options/EngineOptions.java index 2eae1c417..e3a55cfc8 100644 --- a/src/org/andengine/engine/options/EngineOptions.java +++ b/src/org/andengine/engine/options/EngineOptions.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:59:52 - 09.03.2010 */ diff --git a/src/org/andengine/engine/options/RenderOptions.java b/src/org/andengine/engine/options/RenderOptions.java index 448c6a93a..398ea8137 100644 --- a/src/org/andengine/engine/options/RenderOptions.java +++ b/src/org/andengine/engine/options/RenderOptions.java @@ -3,7 +3,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:01:40 - 02.07.2010 */ diff --git a/src/org/andengine/engine/options/WakeLockOptions.java b/src/org/andengine/engine/options/WakeLockOptions.java index 8d007ac83..efd295bdf 100644 --- a/src/org/andengine/engine/options/WakeLockOptions.java +++ b/src/org/andengine/engine/options/WakeLockOptions.java @@ -3,9 +3,9 @@ import android.os.PowerManager; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:45:23 - 10.07.2010 */ diff --git a/src/org/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java index 40abb95c9..6cfad8583 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/BaseResolutionPolicy.java @@ -3,9 +3,9 @@ import android.view.View.MeasureSpec; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:46:43 - 06.10.2010 */ diff --git a/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java index c9d33ffc9..874b714e8 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/FillResolutionPolicy.java @@ -3,9 +3,9 @@ import android.view.View.MeasureSpec; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:22:48 - 29.03.2010 */ diff --git a/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java index e295b0144..f64ca3dfe 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/FixedResolutionPolicy.java @@ -2,9 +2,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:23:00 - 29.03.2010 */ diff --git a/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java index c972eca4f..6d0ded3da 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/IResolutionPolicy.java @@ -2,9 +2,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:02:35 - 29.03.2010 */ diff --git a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java index 8df06c00d..1db37f172 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java @@ -3,9 +3,9 @@ import android.view.View.MeasureSpec; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:23:00 - 29.03.2010 */ diff --git a/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java index ee10795ef..a4d6f7056 100644 --- a/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java +++ b/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java @@ -3,9 +3,9 @@ import android.view.View.MeasureSpec; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:23:00 - 29.03.2010 */ diff --git a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java index 911d9ceb0..8bb8beb0e 100644 --- a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java @@ -10,9 +10,9 @@ import android.opengl.GLES20; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:28:34 - 27.03.2010 */ diff --git a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java index 2914aa812..f001f7e2c 100644 --- a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java @@ -9,9 +9,9 @@ import android.opengl.GLES20; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:28:34 - 27.03.2010 */ diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 71ba3828a..0e3fb1c0a 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -24,7 +24,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:00:48 - 08.03.2010 */ @@ -253,7 +253,7 @@ public IEntity getRootEntity() { rootEntity = rootEntity.getParent(); } - return rootEntity; + return rootEntity; } @Override diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index 4771248e7..d4ebfbd99 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -21,7 +21,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:20:25 - 08.03.2010 */ @@ -293,9 +293,9 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou public void sortChildren(); /** * Sorts the {@link IEntity}s based on their ZIndex. Sort is stable. - * In contrast to {@link IEntity#sortChildren()} this method is particularly useful to avoid multiple sorts per frame. + * In contrast to {@link IEntity#sortChildren()} this method is particularly useful to avoid multiple sorts per frame. * @param pImmediate if true, the sorting is executed immediately. - * If false the sorting is executed before the next (visible) drawing of the children of this {@link IEntity}. + * If false the sorting is executed before the next (visible) drawing of the children of this {@link IEntity}. */ public void sortChildren(final boolean pImmediate); /** diff --git a/src/org/andengine/entity/modifier/AlphaModifier.java b/src/org/andengine/entity/modifier/AlphaModifier.java index 6442d947e..f25a37c22 100644 --- a/src/org/andengine/entity/modifier/AlphaModifier.java +++ b/src/org/andengine/entity/modifier/AlphaModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 23:13:01 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/ColorModifier.java b/src/org/andengine/entity/modifier/ColorModifier.java index 5093f3180..e482502e3 100644 --- a/src/org/andengine/entity/modifier/ColorModifier.java +++ b/src/org/andengine/entity/modifier/ColorModifier.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:39:50 - 29.06.2010 */ diff --git a/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java b/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java index a8e7e826c..4a6542d4c 100644 --- a/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java +++ b/src/org/andengine/entity/modifier/CubicBezierCurveMoveModifier.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Pawel Plewa * @author Nicolas Gramlich * @since 23:24:26 - 16.07.2011 diff --git a/src/org/andengine/entity/modifier/DelayModifier.java b/src/org/andengine/entity/modifier/DelayModifier.java index 6c168ef39..f66c61138 100644 --- a/src/org/andengine/entity/modifier/DelayModifier.java +++ b/src/org/andengine/entity/modifier/DelayModifier.java @@ -3,9 +3,9 @@ import org.andengine.entity.IEntity; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:55:13 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/DoubleValueSpanEntityModifier.java b/src/org/andengine/entity/modifier/DoubleValueSpanEntityModifier.java index 6158e9fdd..a5b87712d 100644 --- a/src/org/andengine/entity/modifier/DoubleValueSpanEntityModifier.java +++ b/src/org/andengine/entity/modifier/DoubleValueSpanEntityModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 23:29:22 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/DurationEntityModifier.java b/src/org/andengine/entity/modifier/DurationEntityModifier.java index bf751878a..01f3ef530 100644 --- a/src/org/andengine/entity/modifier/DurationEntityModifier.java +++ b/src/org/andengine/entity/modifier/DurationEntityModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.BaseDurationModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:10:42 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/EntityModifier.java b/src/org/andengine/entity/modifier/EntityModifier.java index 1953a6722..fc8d7c80a 100644 --- a/src/org/andengine/entity/modifier/EntityModifier.java +++ b/src/org/andengine/entity/modifier/EntityModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.BaseModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:53:16 - 03.09.2010 */ diff --git a/src/org/andengine/entity/modifier/EntityModifierList.java b/src/org/andengine/entity/modifier/EntityModifierList.java index 1af8dcd9a..70bafd2eb 100644 --- a/src/org/andengine/entity/modifier/EntityModifierList.java +++ b/src/org/andengine/entity/modifier/EntityModifierList.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.ModifierList; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:19:18 - 24.12.2010 */ diff --git a/src/org/andengine/entity/modifier/FadeInModifier.java b/src/org/andengine/entity/modifier/FadeInModifier.java index 40c98e579..6c40b4e22 100644 --- a/src/org/andengine/entity/modifier/FadeInModifier.java +++ b/src/org/andengine/entity/modifier/FadeInModifier.java @@ -5,9 +5,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:03:12 - 08.06.2010 */ diff --git a/src/org/andengine/entity/modifier/FadeOutModifier.java b/src/org/andengine/entity/modifier/FadeOutModifier.java index e89a9fb14..e325875ae 100644 --- a/src/org/andengine/entity/modifier/FadeOutModifier.java +++ b/src/org/andengine/entity/modifier/FadeOutModifier.java @@ -5,9 +5,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:03:12 - 08.06.2010 */ diff --git a/src/org/andengine/entity/modifier/IEntityModifier.java b/src/org/andengine/entity/modifier/IEntityModifier.java index 206f2c54a..0349e9872 100644 --- a/src/org/andengine/entity/modifier/IEntityModifier.java +++ b/src/org/andengine/entity/modifier/IEntityModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.IModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:17:50 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/LoopEntityModifier.java b/src/org/andengine/entity/modifier/LoopEntityModifier.java index 1f5fde527..6eb8638e4 100644 --- a/src/org/andengine/entity/modifier/LoopEntityModifier.java +++ b/src/org/andengine/entity/modifier/LoopEntityModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.LoopModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:42:13 - 03.09.2010 */ diff --git a/src/org/andengine/entity/modifier/MoveByModifier.java b/src/org/andengine/entity/modifier/MoveByModifier.java index 03b328e0c..535fd1ee3 100644 --- a/src/org/andengine/entity/modifier/MoveByModifier.java +++ b/src/org/andengine/entity/modifier/MoveByModifier.java @@ -4,7 +4,7 @@ /** * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:15:52 - 10.08.2011 */ diff --git a/src/org/andengine/entity/modifier/MoveModifier.java b/src/org/andengine/entity/modifier/MoveModifier.java index ac2e58a38..f4abbb4e9 100644 --- a/src/org/andengine/entity/modifier/MoveModifier.java +++ b/src/org/andengine/entity/modifier/MoveModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:12:52 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/MoveXModifier.java b/src/org/andengine/entity/modifier/MoveXModifier.java index d093e0d9a..ba0390b56 100644 --- a/src/org/andengine/entity/modifier/MoveXModifier.java +++ b/src/org/andengine/entity/modifier/MoveXModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:03:22 - 30.08.2010 */ diff --git a/src/org/andengine/entity/modifier/MoveYModifier.java b/src/org/andengine/entity/modifier/MoveYModifier.java index b5d178b7b..06ba983eb 100644 --- a/src/org/andengine/entity/modifier/MoveYModifier.java +++ b/src/org/andengine/entity/modifier/MoveYModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:04:21 - 30.08.2010 */ diff --git a/src/org/andengine/entity/modifier/ParallelEntityModifier.java b/src/org/andengine/entity/modifier/ParallelEntityModifier.java index 5b9a25521..d0dc539dd 100644 --- a/src/org/andengine/entity/modifier/ParallelEntityModifier.java +++ b/src/org/andengine/entity/modifier/ParallelEntityModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.ParallelModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:40:31 - 03.09.2010 */ diff --git a/src/org/andengine/entity/modifier/PathModifier.java b/src/org/andengine/entity/modifier/PathModifier.java index 164ebd146..9925e4717 100644 --- a/src/org/andengine/entity/modifier/PathModifier.java +++ b/src/org/andengine/entity/modifier/PathModifier.java @@ -8,9 +8,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:50:02 - 16.06.2010 */ diff --git a/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java b/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java index be9f6fa69..dcfda3409 100644 --- a/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java +++ b/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 23:24:26 - 16.07.2011 */ diff --git a/src/org/andengine/entity/modifier/RotationAtModifier.java b/src/org/andengine/entity/modifier/RotationAtModifier.java index dea948b23..5c3d12a31 100644 --- a/src/org/andengine/entity/modifier/RotationAtModifier.java +++ b/src/org/andengine/entity/modifier/RotationAtModifier.java @@ -6,9 +6,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:59:38 - 06.07.2010 */ diff --git a/src/org/andengine/entity/modifier/RotationByModifier.java b/src/org/andengine/entity/modifier/RotationByModifier.java index 10ccd07db..c07446081 100644 --- a/src/org/andengine/entity/modifier/RotationByModifier.java +++ b/src/org/andengine/entity/modifier/RotationByModifier.java @@ -3,9 +3,9 @@ import org.andengine.entity.IEntity; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:12:52 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/RotationModifier.java b/src/org/andengine/entity/modifier/RotationModifier.java index bf9f6d304..59a89c1ac 100644 --- a/src/org/andengine/entity/modifier/RotationModifier.java +++ b/src/org/andengine/entity/modifier/RotationModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:12:52 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/ScaleAtModifier.java b/src/org/andengine/entity/modifier/ScaleAtModifier.java index 16fabecc5..4bc3953ae 100644 --- a/src/org/andengine/entity/modifier/ScaleAtModifier.java +++ b/src/org/andengine/entity/modifier/ScaleAtModifier.java @@ -6,9 +6,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:53:30 - 06.07.2010 */ diff --git a/src/org/andengine/entity/modifier/ScaleModifier.java b/src/org/andengine/entity/modifier/ScaleModifier.java index 1f579a865..bb52d3ce8 100644 --- a/src/org/andengine/entity/modifier/ScaleModifier.java +++ b/src/org/andengine/entity/modifier/ScaleModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 23:37:53 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/SequenceEntityModifier.java b/src/org/andengine/entity/modifier/SequenceEntityModifier.java index 416fd7be5..4ed06c5fe 100644 --- a/src/org/andengine/entity/modifier/SequenceEntityModifier.java +++ b/src/org/andengine/entity/modifier/SequenceEntityModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.SequenceModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:41:15 - 03.09.2010 */ diff --git a/src/org/andengine/entity/modifier/SingleValueChangeEntityModifier.java b/src/org/andengine/entity/modifier/SingleValueChangeEntityModifier.java index dc9dd8023..cdcc35d2a 100644 --- a/src/org/andengine/entity/modifier/SingleValueChangeEntityModifier.java +++ b/src/org/andengine/entity/modifier/SingleValueChangeEntityModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.BaseSingleValueChangeModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:34:35 - 17.06.2010 */ diff --git a/src/org/andengine/entity/modifier/SingleValueSpanEntityModifier.java b/src/org/andengine/entity/modifier/SingleValueSpanEntityModifier.java index d18d79d26..bea60d136 100644 --- a/src/org/andengine/entity/modifier/SingleValueSpanEntityModifier.java +++ b/src/org/andengine/entity/modifier/SingleValueSpanEntityModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 23:29:22 - 19.03.2010 */ diff --git a/src/org/andengine/entity/modifier/TripleValueSpanEntityModifier.java b/src/org/andengine/entity/modifier/TripleValueSpanEntityModifier.java index 5a72e145e..591777edf 100644 --- a/src/org/andengine/entity/modifier/TripleValueSpanEntityModifier.java +++ b/src/org/andengine/entity/modifier/TripleValueSpanEntityModifier.java @@ -5,9 +5,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:35:18 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java index a6bc0c2a1..cae06572e 100644 --- a/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java @@ -33,7 +33,7 @@ public class BatchedSpriteParticleSystem extends BlendFunctionParticleSystem implements IParticleInitializer { diff --git a/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java b/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java index aea9e524d..f2502cb24 100644 --- a/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/ColorParticleInitializer.java @@ -6,9 +6,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:17:42 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/initializer/GravityParticleInitializer.java b/src/org/andengine/entity/particle/initializer/GravityParticleInitializer.java index 3dde7d5d7..bf08927e3 100644 --- a/src/org/andengine/entity/particle/initializer/GravityParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/GravityParticleInitializer.java @@ -5,9 +5,9 @@ import android.hardware.SensorManager; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:04:00 - 15.03.2010 */ diff --git a/src/org/andengine/entity/particle/initializer/IParticleInitializer.java b/src/org/andengine/entity/particle/initializer/IParticleInitializer.java index fd2e4f361..64a01968d 100644 --- a/src/org/andengine/entity/particle/initializer/IParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/IParticleInitializer.java @@ -4,9 +4,9 @@ import org.andengine.entity.particle.Particle; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:12:09 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/initializer/RotationParticleInitializer.java b/src/org/andengine/entity/particle/initializer/RotationParticleInitializer.java index 785eb8388..2a3bd9c2e 100644 --- a/src/org/andengine/entity/particle/initializer/RotationParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/RotationParticleInitializer.java @@ -4,9 +4,9 @@ import org.andengine.entity.particle.Particle; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:17:42 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/initializer/VelocityParticleInitializer.java b/src/org/andengine/entity/particle/initializer/VelocityParticleInitializer.java index dd4c46458..f0c69b20f 100644 --- a/src/org/andengine/entity/particle/initializer/VelocityParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/VelocityParticleInitializer.java @@ -4,9 +4,9 @@ import org.andengine.entity.particle.Particle; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:21:10 - 14.03.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/AlphaParticleModifier.java b/src/org/andengine/entity/particle/modifier/AlphaParticleModifier.java index 93faec292..e57a9237d 100644 --- a/src/org/andengine/entity/particle/modifier/AlphaParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/AlphaParticleModifier.java @@ -6,9 +6,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:21:10 - 14.03.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/BaseDoubleValueSpanParticleModifier.java b/src/org/andengine/entity/particle/modifier/BaseDoubleValueSpanParticleModifier.java index 177fd125d..f78ef2b3f 100644 --- a/src/org/andengine/entity/particle/modifier/BaseDoubleValueSpanParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/BaseDoubleValueSpanParticleModifier.java @@ -6,9 +6,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:19:46 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java b/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java index c24b84ce2..d1342a156 100644 --- a/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/BaseSingleValueSpanParticleModifier.java @@ -6,9 +6,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:10:16 - 04.05.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/BaseTripleValueSpanParticleModifier.java b/src/org/andengine/entity/particle/modifier/BaseTripleValueSpanParticleModifier.java index b46418390..fb6fb90e9 100644 --- a/src/org/andengine/entity/particle/modifier/BaseTripleValueSpanParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/BaseTripleValueSpanParticleModifier.java @@ -6,9 +6,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:19:46 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java b/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java index 0552b0515..365809cc5 100644 --- a/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/ColorParticleModifier.java @@ -7,9 +7,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:22:26 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/ExpireParticleInitializer.java b/src/org/andengine/entity/particle/modifier/ExpireParticleInitializer.java index 9bbdf4ac7..5f2a8abe7 100644 --- a/src/org/andengine/entity/particle/modifier/ExpireParticleInitializer.java +++ b/src/org/andengine/entity/particle/modifier/ExpireParticleInitializer.java @@ -6,9 +6,9 @@ import org.andengine.util.math.MathUtils; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:21:10 - 14.03.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/IParticleModifier.java b/src/org/andengine/entity/particle/modifier/IParticleModifier.java index 1e9a1360d..e078b583c 100644 --- a/src/org/andengine/entity/particle/modifier/IParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/IParticleModifier.java @@ -5,9 +5,9 @@ import org.andengine.entity.particle.initializer.IParticleInitializer; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:06:05 - 14.03.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java b/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java index 5cf3eeda5..c2d54e29b 100644 --- a/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/OffCameraExpireParticleModifier.java @@ -6,9 +6,9 @@ import org.andengine.entity.particle.Particle; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:21:10 - 14.03.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/RotationParticleModifier.java b/src/org/andengine/entity/particle/modifier/RotationParticleModifier.java index cd9a3de64..de8ec793b 100644 --- a/src/org/andengine/entity/particle/modifier/RotationParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/RotationParticleModifier.java @@ -6,9 +6,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:36:18 - 29.06.2010 */ diff --git a/src/org/andengine/entity/particle/modifier/ScaleParticleModifier.java b/src/org/andengine/entity/particle/modifier/ScaleParticleModifier.java index 1243eee51..d94cf2786 100644 --- a/src/org/andengine/entity/particle/modifier/ScaleParticleModifier.java +++ b/src/org/andengine/entity/particle/modifier/ScaleParticleModifier.java @@ -6,9 +6,9 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:37:27 - 04.05.2010 */ diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index f2980b4b3..cdb34960b 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -369,7 +369,7 @@ public void setGradientVector(final float pGradientVectorX, final float pGradien } /** - * @param pGradientAngle in degrees. 0 is a 'left-to-right', 90 is 'top-to-bottom', ... + * @param pGradientAngle in degrees. 0 is a 'left-to-right', 90 is 'top-to-bottom', ... */ public void setGradientAngle(final float pGradientAngle) { final float angleInRad = MathUtils.degToRad(pGradientAngle); diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java index e01a221bf..6085cfb7a 100644 --- a/src/org/andengine/entity/primitive/Line.java +++ b/src/org/andengine/entity/primitive/Line.java @@ -21,7 +21,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 09:50:36 - 04.04.2010 */ diff --git a/src/org/andengine/entity/primitive/Rectangle.java b/src/org/andengine/entity/primitive/Rectangle.java index cc497800e..c56ec30b6 100644 --- a/src/org/andengine/entity/primitive/Rectangle.java +++ b/src/org/andengine/entity/primitive/Rectangle.java @@ -18,7 +18,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:18:49 - 13.03.2010 */ diff --git a/src/org/andengine/entity/scene/CameraScene.java b/src/org/andengine/entity/scene/CameraScene.java index 31ab369c7..c9210677a 100644 --- a/src/org/andengine/entity/scene/CameraScene.java +++ b/src/org/andengine/entity/scene/CameraScene.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:35:53 - 29.03.2010 */ diff --git a/src/org/andengine/entity/scene/IOnAreaTouchListener.java b/src/org/andengine/entity/scene/IOnAreaTouchListener.java index 58da60934..9446191ea 100644 --- a/src/org/andengine/entity/scene/IOnAreaTouchListener.java +++ b/src/org/andengine/entity/scene/IOnAreaTouchListener.java @@ -24,12 +24,12 @@ public interface IOnAreaTouchListener { /** * Called when a {@link TouchEvent} is dispatched to an {@link ITouchArea}. This allows * listeners to get a chance to respond before the target {@link ITouchArea#onAreaTouched(TouchEvent, float, float)} is called. - * + * * @param pTouchArea The {@link ITouchArea} that the {@link TouchEvent} has been dispatched to. * @param pSceneTouchEvent The {@link TouchEvent} object containing full information about the event. * @param pTouchAreaLocalX the x coordinate within the area touched. * @param pTouchAreaLocalY the y coordinate within the area touched. - * + * * @return true if this {@link IOnAreaTouchListener} has consumed the {@link TouchEvent}, false otherwise. */ public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY); diff --git a/src/org/andengine/entity/scene/IOnSceneTouchListener.java b/src/org/andengine/entity/scene/IOnSceneTouchListener.java index ed99f5718..1fcaa1938 100644 --- a/src/org/andengine/entity/scene/IOnSceneTouchListener.java +++ b/src/org/andengine/entity/scene/IOnSceneTouchListener.java @@ -23,10 +23,10 @@ public interface IOnSceneTouchListener { /** * Called when a {@link TouchEvent} is dispatched to a {@link Scene}. - * + * * @param pScene The {@link Scene} that the {@link TouchEvent} has been dispatched to. * @param pSceneTouchEvent The {@link TouchEvent} object containing full information about the event. - * + * * @return true if this {@link IOnSceneTouchListener} has consumed the {@link TouchEvent}, false otherwise. */ public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent); diff --git a/src/org/andengine/entity/scene/Scene.java b/src/org/andengine/entity/scene/Scene.java index ee877552e..70f2b2240 100644 --- a/src/org/andengine/entity/scene/Scene.java +++ b/src/org/andengine/entity/scene/Scene.java @@ -19,7 +19,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:47:39 - 08.03.2010 */ @@ -180,7 +180,7 @@ public boolean isTouchAreaBindingOnActionMoveEnabled() { * with {@link TouchEvent#ACTION_DOWN}, they will receive all subsequent {@link TouchEvent}s * that are made with the same PointerID (finger) * even if the {@link TouchEvent} is outside of the actual {@link ITouchArea}! - * + * * @param pTouchAreaBindingOnActionDownEnabled */ public void setTouchAreaBindingOnActionDownEnabled(final boolean pTouchAreaBindingOnActionDownEnabled) { @@ -198,7 +198,7 @@ public void setTouchAreaBindingOnActionDownEnabled(final boolean pTouchAreaBindi * with {@link TouchEvent#ACTION_MOVE}, they will receive all subsequent {@link TouchEvent}s * that are made with the same PointerID (finger) * even if the {@link TouchEvent} is outside of the actual {@link ITouchArea}! - * + * * @param pTouchAreaBindingOnActionMoveEnabled */ public void setTouchAreaBindingOnActionMoveEnabled(final boolean pTouchAreaBindingOnActionMoveEnabled) { @@ -220,7 +220,7 @@ public boolean isOnSceneTouchListenerBindingOnActionDownEnabled() { * with {@link TouchEvent#ACTION_DOWN}, it will receive all subsequent {@link TouchEvent}s * that are made with the same PointerID (finger) * even if the {@link TouchEvent} is would belong to an overlaying {@link ITouchArea}! - * + * * @param pOnSceneTouchListenerBindingOnActionDownEnabled */ public void setOnSceneTouchListenerBindingOnActionDownEnabled(final boolean pOnSceneTouchListenerBindingOnActionDownEnabled) { diff --git a/src/org/andengine/entity/scene/background/AutoParallaxBackground.java b/src/org/andengine/entity/scene/background/AutoParallaxBackground.java index 83d71855e..745c49068 100644 --- a/src/org/andengine/entity/scene/background/AutoParallaxBackground.java +++ b/src/org/andengine/entity/scene/background/AutoParallaxBackground.java @@ -3,9 +3,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:44:31 - 19.07.2010 */ diff --git a/src/org/andengine/entity/scene/background/Background.java b/src/org/andengine/entity/scene/background/Background.java index 981547202..fe24b9c88 100644 --- a/src/org/andengine/entity/scene/background/Background.java +++ b/src/org/andengine/entity/scene/background/Background.java @@ -12,7 +12,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:08:17 - 19.07.2010 */ diff --git a/src/org/andengine/entity/scene/background/EntityBackground.java b/src/org/andengine/entity/scene/background/EntityBackground.java index 9cba6efa3..dd7c942bb 100644 --- a/src/org/andengine/entity/scene/background/EntityBackground.java +++ b/src/org/andengine/entity/scene/background/EntityBackground.java @@ -5,9 +5,9 @@ import org.andengine.opengl.util.GLState; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:25:10 - 21.07.2010 */ diff --git a/src/org/andengine/entity/scene/background/IBackground.java b/src/org/andengine/entity/scene/background/IBackground.java index a4ebf6eeb..9f7a83137 100644 --- a/src/org/andengine/entity/scene/background/IBackground.java +++ b/src/org/andengine/entity/scene/background/IBackground.java @@ -6,9 +6,9 @@ import org.andengine.util.modifier.IModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:47:41 - 19.07.2010 */ diff --git a/src/org/andengine/entity/scene/background/ParallaxBackground.java b/src/org/andengine/entity/scene/background/ParallaxBackground.java index 55cc0ea3d..572b03098 100644 --- a/src/org/andengine/entity/scene/background/ParallaxBackground.java +++ b/src/org/andengine/entity/scene/background/ParallaxBackground.java @@ -8,9 +8,9 @@ import org.andengine.util.debug.Debug; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:36:26 - 19.07.2010 */ @@ -102,7 +102,7 @@ public ParallaxEntity(final float pParallaxFactor, final IEntity pEntity) { this.mParallaxFactor = pParallaxFactor; this.mEntity = pEntity; - // TODO Adjust onDraw calculations, so that these assumptions aren't necessary. + // TODO Adjust onDraw calculations, so that these assumptions aren't necessary. if (this.mEntity.getX() != 0) { Debug.w("The X position of a " + this.getClass().getSimpleName() + " is expected to be 0."); } diff --git a/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java b/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java index 080039e9a..319abc4c0 100644 --- a/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java +++ b/src/org/andengine/entity/scene/background/RepeatingSpriteBackground.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:11:10 - 19.07.2010 */ diff --git a/src/org/andengine/entity/scene/background/SpriteBackground.java b/src/org/andengine/entity/scene/background/SpriteBackground.java index c16b13f23..acec658c4 100644 --- a/src/org/andengine/entity/scene/background/SpriteBackground.java +++ b/src/org/andengine/entity/scene/background/SpriteBackground.java @@ -3,9 +3,9 @@ import org.andengine.entity.sprite.Sprite; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:01:43 - 19.07.2010 */ diff --git a/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java index 26604891a..5f8106994 100644 --- a/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/ColorBackgroundModifier.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:51:03 - 03.09.2010 */ diff --git a/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java index 35accdb31..31d92786d 100644 --- a/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.IModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:55:54 - 03.09.2010 */ diff --git a/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java index ab080d2b8..14dc9784f 100644 --- a/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.LoopModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:03:53 - 03.09.2010 */ diff --git a/src/org/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java index f5179dc73..c0713c44d 100644 --- a/src/org/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/ParallelBackgroundModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.ParallelModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:03:57 - 03.09.2010 */ diff --git a/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java index 009786794..f9a6006b4 100644 --- a/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java +++ b/src/org/andengine/entity/scene/background/modifier/SequenceBackgroundModifier.java @@ -4,9 +4,9 @@ import org.andengine.util.modifier.SequenceModifier; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:04:02 - 03.09.2010 */ diff --git a/src/org/andengine/entity/scene/menu/MenuScene.java b/src/org/andengine/entity/scene/menu/MenuScene.java index 844b79a49..e13102658 100644 --- a/src/org/andengine/entity/scene/menu/MenuScene.java +++ b/src/org/andengine/entity/scene/menu/MenuScene.java @@ -18,7 +18,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:06:51 - 01.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java index f0679a2a3..55e05ce21 100644 --- a/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/AlphaMenuSceneAnimator.java @@ -11,7 +11,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:04:35 - 02.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java index c19eb23ce..57c290a3e 100644 --- a/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/IMenuSceneAnimator.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:50:36 - 02.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java index 60651578d..30728db3d 100644 --- a/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/InstantMenuSceneAnimator.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:04:35 - 02.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java index 50328dd86..cafc6bdf8 100644 --- a/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/MenuSceneAnimator.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:17:32 - 02.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java index 001a5e9bd..5fa2c5f60 100644 --- a/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java +++ b/src/org/andengine/entity/scene/menu/animator/SlideMenuSceneAnimator.java @@ -12,7 +12,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:04:35 - 02.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java b/src/org/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java index 34593a4e2..2ff796544 100644 --- a/src/org/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java +++ b/src/org/andengine/entity/scene/menu/item/AnimatedSpriteMenuItem.java @@ -10,7 +10,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:44:39 - 07.07.2010 */ diff --git a/src/org/andengine/entity/scene/menu/item/IMenuItem.java b/src/org/andengine/entity/scene/menu/item/IMenuItem.java index bb1c6a49c..3e8d5b787 100644 --- a/src/org/andengine/entity/scene/menu/item/IMenuItem.java +++ b/src/org/andengine/entity/scene/menu/item/IMenuItem.java @@ -3,9 +3,9 @@ import org.andengine.entity.shape.IShape; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:27:16 - 07.07.2010 */ diff --git a/src/org/andengine/entity/scene/menu/item/SpriteMenuItem.java b/src/org/andengine/entity/scene/menu/item/SpriteMenuItem.java index df733a96b..69968bc85 100644 --- a/src/org/andengine/entity/scene/menu/item/SpriteMenuItem.java +++ b/src/org/andengine/entity/scene/menu/item/SpriteMenuItem.java @@ -10,7 +10,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:15:20 - 01.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/item/TextMenuItem.java b/src/org/andengine/entity/scene/menu/item/TextMenuItem.java index 8ef0ae031..716975b34 100644 --- a/src/org/andengine/entity/scene/menu/item/TextMenuItem.java +++ b/src/org/andengine/entity/scene/menu/item/TextMenuItem.java @@ -11,7 +11,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:15:20 - 01.04.2010 */ diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index 4c2b7ad85..72989bb90 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -22,10 +22,10 @@ /** * I HATE THIS CLASS! - * + * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:05:44 - 18.11.2010 */ diff --git a/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java index 1187d8c67..edfa41201 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/ColorMenuItemDecorator.java @@ -6,7 +6,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:25:35 - 07.07.2010 */ diff --git a/src/org/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java index a41071df6..80031924a 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/ScaleMenuItemDecorator.java @@ -3,9 +3,9 @@ import org.andengine.entity.scene.menu.item.IMenuItem; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:04:29 - 18.11.2010 */ diff --git a/src/org/andengine/entity/shape/IShape.java b/src/org/andengine/entity/shape/IShape.java index 966c6d1bf..008c3be52 100644 --- a/src/org/andengine/entity/shape/IShape.java +++ b/src/org/andengine/entity/shape/IShape.java @@ -8,9 +8,9 @@ import android.opengl.GLES20; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:32:52 - 07.07.2010 */ diff --git a/src/org/andengine/entity/shape/Shape.java b/src/org/andengine/entity/shape/Shape.java index 5296f02a9..d2ad07248 100644 --- a/src/org/andengine/entity/shape/Shape.java +++ b/src/org/andengine/entity/shape/Shape.java @@ -13,7 +13,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:51:27 - 13.03.2010 */ diff --git a/src/org/andengine/entity/sprite/AnimatedSprite.java b/src/org/andengine/entity/sprite/AnimatedSprite.java index 211d043a4..44f5aaed9 100644 --- a/src/org/andengine/entity/sprite/AnimatedSprite.java +++ b/src/org/andengine/entity/sprite/AnimatedSprite.java @@ -11,7 +11,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:25:46 - 10.03.2010 */ @@ -263,7 +263,7 @@ public void animate(final long[] pFrameDurations, final int pFirstTileIndex, fin /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. */ @@ -273,7 +273,7 @@ public void animate(final long[] pFrameDurations, final int[] pFrames) { /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pAnimationListener @@ -286,7 +286,7 @@ public void animate(final long[] pFrameDurations, final int[] pFrames, final IAn /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoop @@ -297,7 +297,7 @@ public void animate(final long[] pFrameDurations, final int[] pFrames, final boo /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoop @@ -311,7 +311,7 @@ public void animate(final long[] pFrameDurations, final int[] pFrames, final boo /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoopCount @@ -322,7 +322,7 @@ public void animate(final long[] pFrameDurations, final int[] pFrames, final int /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoopCount diff --git a/src/org/andengine/entity/sprite/AnimationData.java b/src/org/andengine/entity/sprite/AnimationData.java index 64eb83af6..49930c430 100644 --- a/src/org/andengine/entity/sprite/AnimationData.java +++ b/src/org/andengine/entity/sprite/AnimationData.java @@ -70,7 +70,7 @@ public AnimationData(final long[] pFrameDurations, final int pFirstFrameIndex, f /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoopCount @@ -214,7 +214,7 @@ public void set(final long[] pFrameDurations, final int pFirstFrameIndex, final /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. */ @@ -225,7 +225,7 @@ public void set(final long[] pFrameDurations, final int[] pFrames) { /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoop @@ -237,7 +237,7 @@ public void set(final long[] pFrameDurations, final int[] pFrames, final boolean /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoopCount diff --git a/src/org/andengine/entity/sprite/IAnimationData.java b/src/org/andengine/entity/sprite/IAnimationData.java index 61b612d8b..c4e53b2c6 100644 --- a/src/org/andengine/entity/sprite/IAnimationData.java +++ b/src/org/andengine/entity/sprite/IAnimationData.java @@ -51,14 +51,14 @@ public interface IAnimationData { /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. */ public void set(final long[] pFrameDurations, final int[] pFrames); /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoop @@ -66,7 +66,7 @@ public interface IAnimationData { public void set(final long[] pFrameDurations, final int[] pFrames, final boolean pLoop); /** * Animate specifics frames. - * + * * @param pFrameDurations must have the same length as pFrames. * @param pFrames indices of the frames to animate. * @param pLoopCount diff --git a/src/org/andengine/entity/sprite/Sprite.java b/src/org/andengine/entity/sprite/Sprite.java index 9edb77ffe..c4bb4135a 100644 --- a/src/org/andengine/entity/sprite/Sprite.java +++ b/src/org/andengine/entity/sprite/Sprite.java @@ -19,7 +19,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:22:38 - 09.03.2010 */ diff --git a/src/org/andengine/entity/sprite/TiledSprite.java b/src/org/andengine/entity/sprite/TiledSprite.java index 5290fd710..0bf979d8d 100644 --- a/src/org/andengine/entity/sprite/TiledSprite.java +++ b/src/org/andengine/entity/sprite/TiledSprite.java @@ -16,7 +16,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:30:13 - 09.03.2010 */ diff --git a/src/org/andengine/entity/sprite/UncoloredSprite.java b/src/org/andengine/entity/sprite/UncoloredSprite.java index 5f97a4fee..915f3629c 100644 --- a/src/org/andengine/entity/sprite/UncoloredSprite.java +++ b/src/org/andengine/entity/sprite/UncoloredSprite.java @@ -16,7 +16,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:22:38 - 09.03.2010 */ diff --git a/src/org/andengine/entity/sprite/UniformColorSprite.java b/src/org/andengine/entity/sprite/UniformColorSprite.java index 267ebabde..0135749a0 100644 --- a/src/org/andengine/entity/sprite/UniformColorSprite.java +++ b/src/org/andengine/entity/sprite/UniformColorSprite.java @@ -18,7 +18,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:22:38 - 09.03.2010 */ diff --git a/src/org/andengine/entity/sprite/batch/SpriteBatch.java b/src/org/andengine/entity/sprite/batch/SpriteBatch.java index c98af0258..dbc758c1a 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/SpriteBatch.java @@ -24,10 +24,10 @@ /** * TODO TRY DEGENERATE TRIANGLES! * TODO Check if there is this multiple-of-X-byte(?) alignment optimization? - * + * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:45:48 - 14.06.2011 */ diff --git a/src/org/andengine/entity/sprite/batch/SpriteGroup.java b/src/org/andengine/entity/sprite/batch/SpriteGroup.java index 2f4306f18..9686c0c3c 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteGroup.java +++ b/src/org/andengine/entity/sprite/batch/SpriteGroup.java @@ -14,7 +14,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:10:35 - 15.06.2011 */ diff --git a/src/org/andengine/entity/text/Text.java b/src/org/andengine/entity/text/Text.java index f8e9a4a5e..877275760 100644 --- a/src/org/andengine/entity/text/Text.java +++ b/src/org/andengine/entity/text/Text.java @@ -29,7 +29,7 @@ * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:54:59 - 03.04.2010 */ diff --git a/src/org/andengine/entity/text/TickerText.java b/src/org/andengine/entity/text/TickerText.java index 8297c210b..5b813df0b 100644 --- a/src/org/andengine/entity/text/TickerText.java +++ b/src/org/andengine/entity/text/TickerText.java @@ -12,7 +12,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:02:04 - 05.05.2010 */ diff --git a/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java index abac08460..934aaa305 100644 --- a/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java @@ -4,7 +4,7 @@ import org.andengine.opengl.vbo.IVertexBufferObject; /** - * + * * (c) Zynga 2012 * * @author Nicolas Gramlich diff --git a/src/org/andengine/entity/util/AverageFPSCounter.java b/src/org/andengine/entity/util/AverageFPSCounter.java index ac8617f00..a1bd1a98c 100644 --- a/src/org/andengine/entity/util/AverageFPSCounter.java +++ b/src/org/andengine/entity/util/AverageFPSCounter.java @@ -3,9 +3,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:52:31 - 09.03.2010 */ diff --git a/src/org/andengine/entity/util/FPSCounter.java b/src/org/andengine/entity/util/FPSCounter.java index ceeddac26..5b1f813f1 100644 --- a/src/org/andengine/entity/util/FPSCounter.java +++ b/src/org/andengine/entity/util/FPSCounter.java @@ -3,9 +3,9 @@ import org.andengine.engine.handler.IUpdateHandler; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:52:31 - 09.03.2010 */ diff --git a/src/org/andengine/entity/util/FPSLogger.java b/src/org/andengine/entity/util/FPSLogger.java index daaac54dc..81be5a635 100644 --- a/src/org/andengine/entity/util/FPSLogger.java +++ b/src/org/andengine/entity/util/FPSLogger.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:52:31 - 09.03.2010 */ diff --git a/src/org/andengine/entity/util/FrameCountCrasher.java b/src/org/andengine/entity/util/FrameCountCrasher.java index e35aeabf3..b1d2b31be 100644 --- a/src/org/andengine/entity/util/FrameCountCrasher.java +++ b/src/org/andengine/entity/util/FrameCountCrasher.java @@ -5,9 +5,9 @@ import org.andengine.util.debug.Debug; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:52:31 - 09.03.2010 */ diff --git a/src/org/andengine/entity/util/FrameCounter.java b/src/org/andengine/entity/util/FrameCounter.java index 49a4740b1..5ee3d578f 100644 --- a/src/org/andengine/entity/util/FrameCounter.java +++ b/src/org/andengine/entity/util/FrameCounter.java @@ -3,9 +3,9 @@ import org.andengine.engine.handler.IUpdateHandler; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:00:55 - 22.06.2010 */ diff --git a/src/org/andengine/entity/util/ScreenCapture.java b/src/org/andengine/entity/util/ScreenCapture.java index 3abb5b64c..4e9f56fa2 100644 --- a/src/org/andengine/entity/util/ScreenCapture.java +++ b/src/org/andengine/entity/util/ScreenCapture.java @@ -14,9 +14,9 @@ import android.graphics.Bitmap.CompressFormat; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:11:50 - 15.03.2010 */ diff --git a/src/org/andengine/entity/util/ScreenGrabber.java b/src/org/andengine/entity/util/ScreenGrabber.java index 567c67eba..7f9868b5d 100644 --- a/src/org/andengine/entity/util/ScreenGrabber.java +++ b/src/org/andengine/entity/util/ScreenGrabber.java @@ -12,9 +12,9 @@ import android.opengl.GLES20; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:27:22 - 10.01.2011 */ diff --git a/src/org/andengine/input/sensor/BaseSensorData.java b/src/org/andengine/input/sensor/BaseSensorData.java index 1ffbfc15d..4633f9d5c 100644 --- a/src/org/andengine/input/sensor/BaseSensorData.java +++ b/src/org/andengine/input/sensor/BaseSensorData.java @@ -3,9 +3,9 @@ import java.util.Arrays; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:50:44 - 10.03.2010 */ diff --git a/src/org/andengine/input/sensor/SensorDelay.java b/src/org/andengine/input/sensor/SensorDelay.java index ef8cf082c..99ae2d9f8 100644 --- a/src/org/andengine/input/sensor/SensorDelay.java +++ b/src/org/andengine/input/sensor/SensorDelay.java @@ -4,9 +4,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:14:38 - 31.10.2010 */ diff --git a/src/org/andengine/input/sensor/acceleration/AccelerationData.java b/src/org/andengine/input/sensor/acceleration/AccelerationData.java index 1007dd500..88d0d2b6c 100644 --- a/src/org/andengine/input/sensor/acceleration/AccelerationData.java +++ b/src/org/andengine/input/sensor/acceleration/AccelerationData.java @@ -8,9 +8,9 @@ import android.view.Surface; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:50:44 - 10.03.2010 */ diff --git a/src/org/andengine/input/sensor/acceleration/AccelerationSensorOptions.java b/src/org/andengine/input/sensor/acceleration/AccelerationSensorOptions.java index 675b76bbf..b68bf6b68 100644 --- a/src/org/andengine/input/sensor/acceleration/AccelerationSensorOptions.java +++ b/src/org/andengine/input/sensor/acceleration/AccelerationSensorOptions.java @@ -3,9 +3,9 @@ import org.andengine.input.sensor.SensorDelay; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:10:34 - 31.10.2010 */ diff --git a/src/org/andengine/input/sensor/acceleration/IAccelerationListener.java b/src/org/andengine/input/sensor/acceleration/IAccelerationListener.java index e37893a68..0bf394a1a 100644 --- a/src/org/andengine/input/sensor/acceleration/IAccelerationListener.java +++ b/src/org/andengine/input/sensor/acceleration/IAccelerationListener.java @@ -1,9 +1,9 @@ package org.andengine.input.sensor.acceleration; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:58:38 - 10.03.2010 */ diff --git a/src/org/andengine/input/sensor/location/ILocationListener.java b/src/org/andengine/input/sensor/location/ILocationListener.java index 117f31503..6eeb8c2b3 100644 --- a/src/org/andengine/input/sensor/location/ILocationListener.java +++ b/src/org/andengine/input/sensor/location/ILocationListener.java @@ -5,9 +5,9 @@ import android.os.Bundle; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:39:23 - 31.10.2010 */ diff --git a/src/org/andengine/input/sensor/location/LocationProviderStatus.java b/src/org/andengine/input/sensor/location/LocationProviderStatus.java index 0ef84e35c..ec003407e 100644 --- a/src/org/andengine/input/sensor/location/LocationProviderStatus.java +++ b/src/org/andengine/input/sensor/location/LocationProviderStatus.java @@ -1,9 +1,9 @@ package org.andengine.input.sensor.location; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:55:57 - 31.10.2010 */ diff --git a/src/org/andengine/input/sensor/location/LocationSensorOptions.java b/src/org/andengine/input/sensor/location/LocationSensorOptions.java index 8689b7667..457297f06 100644 --- a/src/org/andengine/input/sensor/location/LocationSensorOptions.java +++ b/src/org/andengine/input/sensor/location/LocationSensorOptions.java @@ -5,9 +5,9 @@ import android.location.Criteria; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:02:12 - 31.10.2010 */ diff --git a/src/org/andengine/input/sensor/orientation/IOrientationListener.java b/src/org/andengine/input/sensor/orientation/IOrientationListener.java index 1964f509f..6cd1da4ed 100644 --- a/src/org/andengine/input/sensor/orientation/IOrientationListener.java +++ b/src/org/andengine/input/sensor/orientation/IOrientationListener.java @@ -1,9 +1,9 @@ package org.andengine.input.sensor.orientation; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:30:42 - 25.05.2010 */ diff --git a/src/org/andengine/input/sensor/orientation/OrientationData.java b/src/org/andengine/input/sensor/orientation/OrientationData.java index 056062c2f..7d56e1baf 100644 --- a/src/org/andengine/input/sensor/orientation/OrientationData.java +++ b/src/org/andengine/input/sensor/orientation/OrientationData.java @@ -9,9 +9,9 @@ import android.view.Surface; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:30:33 - 25.05.2010 */ diff --git a/src/org/andengine/input/sensor/orientation/OrientationSensorOptions.java b/src/org/andengine/input/sensor/orientation/OrientationSensorOptions.java index 5945a010a..200440377 100644 --- a/src/org/andengine/input/sensor/orientation/OrientationSensorOptions.java +++ b/src/org/andengine/input/sensor/orientation/OrientationSensorOptions.java @@ -3,9 +3,9 @@ import org.andengine.input.sensor.SensorDelay; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:12:36 - 31.10.2010 */ diff --git a/src/org/andengine/input/touch/TouchEvent.java b/src/org/andengine/input/touch/TouchEvent.java index 00b26071b..b58455349 100644 --- a/src/org/andengine/input/touch/TouchEvent.java +++ b/src/org/andengine/input/touch/TouchEvent.java @@ -5,9 +5,9 @@ import android.view.MotionEvent; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:17:42 - 13.07.2010 */ diff --git a/src/org/andengine/input/touch/controller/BaseTouchController.java b/src/org/andengine/input/touch/controller/BaseTouchController.java index 1afab377e..628086ce1 100644 --- a/src/org/andengine/input/touch/controller/BaseTouchController.java +++ b/src/org/andengine/input/touch/controller/BaseTouchController.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:06:40 - 13.07.2010 */ diff --git a/src/org/andengine/input/touch/controller/ITouchController.java b/src/org/andengine/input/touch/controller/ITouchController.java index 06ffcf93c..888a41800 100644 --- a/src/org/andengine/input/touch/controller/ITouchController.java +++ b/src/org/andengine/input/touch/controller/ITouchController.java @@ -5,9 +5,9 @@ import android.view.MotionEvent; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:23:45 - 13.07.2010 */ diff --git a/src/org/andengine/input/touch/controller/MultiTouch.java b/src/org/andengine/input/touch/controller/MultiTouch.java index 3a7bbddd5..fce574f4f 100644 --- a/src/org/andengine/input/touch/controller/MultiTouch.java +++ b/src/org/andengine/input/touch/controller/MultiTouch.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:00:38 - 14.07.2010 */ diff --git a/src/org/andengine/input/touch/controller/MultiTouchController.java b/src/org/andengine/input/touch/controller/MultiTouchController.java index a0c2ae3b0..3bde441f4 100644 --- a/src/org/andengine/input/touch/controller/MultiTouchController.java +++ b/src/org/andengine/input/touch/controller/MultiTouchController.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:23:33 - 13.07.2010 */ diff --git a/src/org/andengine/input/touch/controller/SingleTouchController.java b/src/org/andengine/input/touch/controller/SingleTouchController.java index e0eeeefab..6e0a1d236 100644 --- a/src/org/andengine/input/touch/controller/SingleTouchController.java +++ b/src/org/andengine/input/touch/controller/SingleTouchController.java @@ -3,9 +3,9 @@ import android.view.MotionEvent; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:23:33 - 13.07.2010 */ diff --git a/src/org/andengine/input/touch/detector/BaseDetector.java b/src/org/andengine/input/touch/detector/BaseDetector.java index 827fa4ad6..a97e6d418 100644 --- a/src/org/andengine/input/touch/detector/BaseDetector.java +++ b/src/org/andengine/input/touch/detector/BaseDetector.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:59:00 - 05.11.2010 */ diff --git a/src/org/andengine/input/touch/detector/ClickDetector.java b/src/org/andengine/input/touch/detector/ClickDetector.java index 0bfa3d4c6..4a5153ba1 100644 --- a/src/org/andengine/input/touch/detector/ClickDetector.java +++ b/src/org/andengine/input/touch/detector/ClickDetector.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @author Greg Haynes * @since 14:29:59 - 16.08.2010 diff --git a/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java b/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java index 6b9fb56b9..3abedb0f0 100644 --- a/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java +++ b/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java @@ -11,10 +11,10 @@ /** * Note: Needs to be registered as an {@link IUpdateHandler} to the {@link Engine} or {@link Scene} to work properly. - * + * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @author Greg Haynes * @since 20:49:25 - 23.08.2010 diff --git a/src/org/andengine/input/touch/detector/HoldDetector.java b/src/org/andengine/input/touch/detector/HoldDetector.java index 38b394880..46787d572 100644 --- a/src/org/andengine/input/touch/detector/HoldDetector.java +++ b/src/org/andengine/input/touch/detector/HoldDetector.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @author Greg Haynes * @since 20:49:25 - 23.08.2010 diff --git a/src/org/andengine/input/touch/detector/PinchZoomDetector.java b/src/org/andengine/input/touch/detector/PinchZoomDetector.java index 1d0bac196..9a1065dba 100644 --- a/src/org/andengine/input/touch/detector/PinchZoomDetector.java +++ b/src/org/andengine/input/touch/detector/PinchZoomDetector.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:16:19 - 04.11.2010 */ diff --git a/src/org/andengine/input/touch/detector/ScrollDetector.java b/src/org/andengine/input/touch/detector/ScrollDetector.java index dc299e845..69bffb01e 100644 --- a/src/org/andengine/input/touch/detector/ScrollDetector.java +++ b/src/org/andengine/input/touch/detector/ScrollDetector.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:29:59 - 16.08.2010 */ diff --git a/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java b/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java index b44a66671..21ce4b58b 100644 --- a/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java +++ b/src/org/andengine/input/touch/detector/SurfaceGestureDetector.java @@ -11,7 +11,7 @@ * @author rkpost * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:36:26 - 11.10.2010 */ diff --git a/src/org/andengine/input/touch/detector/SurfaceScrollDetector.java b/src/org/andengine/input/touch/detector/SurfaceScrollDetector.java index 5ffb86b9c..1d4ae44e6 100644 --- a/src/org/andengine/input/touch/detector/SurfaceScrollDetector.java +++ b/src/org/andengine/input/touch/detector/SurfaceScrollDetector.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:12:29 - 16.08.2010 */ diff --git a/src/org/andengine/opengl/font/Font.java b/src/org/andengine/opengl/font/Font.java index 2331ddd28..d9e29d962 100644 --- a/src/org/andengine/opengl/font/Font.java +++ b/src/org/andengine/opengl/font/Font.java @@ -25,7 +25,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:39:33 - 03.04.2010 */ diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java index b0f7b9007..aa53a6be0 100644 --- a/src/org/andengine/opengl/font/FontFactory.java +++ b/src/org/andengine/opengl/font/FontFactory.java @@ -13,7 +13,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 17:17:28 - 16.06.2010 */ diff --git a/src/org/andengine/opengl/font/FontLibrary.java b/src/org/andengine/opengl/font/FontLibrary.java index a71d88969..c107c7b53 100644 --- a/src/org/andengine/opengl/font/FontLibrary.java +++ b/src/org/andengine/opengl/font/FontLibrary.java @@ -5,9 +5,9 @@ import android.util.SparseArray; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:52:26 - 20.08.2010 */ diff --git a/src/org/andengine/opengl/font/FontManager.java b/src/org/andengine/opengl/font/FontManager.java index 5b0aebd13..40dce056a 100644 --- a/src/org/andengine/opengl/font/FontManager.java +++ b/src/org/andengine/opengl/font/FontManager.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 17:48:46 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/font/FontUtils.java b/src/org/andengine/opengl/font/FontUtils.java index 3eb8d2e33..a3329e4ba 100644 --- a/src/org/andengine/opengl/font/FontUtils.java +++ b/src/org/andengine/opengl/font/FontUtils.java @@ -132,7 +132,7 @@ public static > L splitLines(final CharSequence pTe /** * Does not respect linebreaks! - * + * * @param pFont * @param pText * @param pResult diff --git a/src/org/andengine/opengl/font/Letter.java b/src/org/andengine/opengl/font/Letter.java index 7cfda118c..356bc8157 100644 --- a/src/org/andengine/opengl/font/Letter.java +++ b/src/org/andengine/opengl/font/Letter.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:30:22 - 03.04.2010 */ diff --git a/src/org/andengine/opengl/font/StrokeFont.java b/src/org/andengine/opengl/font/StrokeFont.java index 85291135f..a6678af8b 100644 --- a/src/org/andengine/opengl/font/StrokeFont.java +++ b/src/org/andengine/opengl/font/StrokeFont.java @@ -10,9 +10,9 @@ /** * TODO Re-implement with Font changes. * - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:39:33 - 03.04.2010 */ diff --git a/src/org/andengine/opengl/shader/ShaderProgramManager.java b/src/org/andengine/opengl/shader/ShaderProgramManager.java index 11d0077c0..7436f35c7 100644 --- a/src/org/andengine/opengl/shader/ShaderProgramManager.java +++ b/src/org/andengine/opengl/shader/ShaderProgramManager.java @@ -7,7 +7,7 @@ /** * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:55:26 - 11.08.2011 */ diff --git a/src/org/andengine/opengl/texture/ITexture.java b/src/org/andengine/opengl/texture/ITexture.java index 6fafaa8cb..7006302da 100644 --- a/src/org/andengine/opengl/texture/ITexture.java +++ b/src/org/andengine/opengl/texture/ITexture.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:01:03 - 11.07.2011 */ @@ -56,7 +56,7 @@ public interface ITexture { public void bind(final GLState pGLState); /** - * @param pGLActiveTexture from {@link GLES20#GL_TEXTURE0} to {@link GLES20#GL_TEXTURE31}. + * @param pGLActiveTexture from {@link GLES20#GL_TEXTURE0} to {@link GLES20#GL_TEXTURE31}. */ public void bind(final GLState pGLState, final int pGLActiveTexture); diff --git a/src/org/andengine/opengl/texture/PixelFormat.java b/src/org/andengine/opengl/texture/PixelFormat.java index 55e523a89..a63c16f89 100644 --- a/src/org/andengine/opengl/texture/PixelFormat.java +++ b/src/org/andengine/opengl/texture/PixelFormat.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:55:02 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/texture/Texture.java b/src/org/andengine/opengl/texture/Texture.java index 65f57bdb3..d9ecf6940 100644 --- a/src/org/andengine/opengl/texture/Texture.java +++ b/src/org/andengine/opengl/texture/Texture.java @@ -8,7 +8,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:55:02 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/texture/TextureManager.java b/src/org/andengine/opengl/texture/TextureManager.java index b15a2afb8..63c6b3665 100644 --- a/src/org/andengine/opengl/texture/TextureManager.java +++ b/src/org/andengine/opengl/texture/TextureManager.java @@ -17,7 +17,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 17:48:46 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/texture/TextureOptions.java b/src/org/andengine/opengl/texture/TextureOptions.java index 71219cae8..c5e682a3e 100644 --- a/src/org/andengine/opengl/texture/TextureOptions.java +++ b/src/org/andengine/opengl/texture/TextureOptions.java @@ -9,9 +9,9 @@ * WrapT and WrapS define how TextureCoordinates that exceed the [0,1] limit are treated. * I.e. {@link GLES20#GL_REPEAT} will repeat the {@link ITexture} and {@link GLES20#GL_CLAMP_TO_EDGE} will stretch the outermost pixels of the {@link ITexture}. * - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:00:09 - 05.04.2010 */ @@ -30,7 +30,7 @@ public class TextureOptions { public static final TextureOptions REPEATING_NEAREST_PREMULTIPLYALPHA = new TextureOptions(GLES20.GL_NEAREST, GLES20.GL_NEAREST, GLES20.GL_REPEAT, GLES20.GL_REPEAT, true); public static final TextureOptions REPEATING_BILINEAR_PREMULTIPLYALPHA = new TextureOptions(GLES20.GL_LINEAR, GLES20.GL_LINEAR, GLES20.GL_REPEAT, GLES20.GL_REPEAT, true); - public static final TextureOptions DEFAULT = NEAREST; + public static final TextureOptions DEFAULT = NEAREST; // =========================================================== // Fields diff --git a/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java b/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java index 11b335023..659e79ce8 100644 --- a/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/ITextureAtlas.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:24:29 - 14.07.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/TextureAtlas.java b/src/org/andengine/opengl/texture/atlas/TextureAtlas.java index 549830a05..e16f9b421 100644 --- a/src/org/andengine/opengl/texture/atlas/TextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/TextureAtlas.java @@ -12,7 +12,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:22:55 - 14.07.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java index 790b32b1b..3d2911974 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlas.java @@ -22,7 +22,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:55:02 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java index 738da5ba3..caa67ad49 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java @@ -8,9 +8,9 @@ import org.andengine.opengl.texture.bitmap.BitmapTextureFormat; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:51:46 - 12.07.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java index c5ad8d09c..91edaadb4 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/AssetBitmapTextureAtlasSource.java @@ -17,9 +17,9 @@ import android.os.Build; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:07:52 - 09.03.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java index 6e47c5755..2aff2fb6a 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/ColorSwapBitmapTextureAtlasSource.java @@ -10,7 +10,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:41:39 - 07.06.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java index 6dc30da4d..613fedc0c 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/EmptyBitmapTextureAtlasSource.java @@ -7,9 +7,9 @@ import android.graphics.Bitmap.Config; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:20:36 - 08.08.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java index 925a4e76a..dabfe617e 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/FileBitmapTextureAtlasSource.java @@ -20,10 +20,10 @@ import android.os.Build; /** - * - * (c) 2010 Nicolas Gramlich + * + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:39:22 - 10.08.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java index d66edcbc5..5c11f9035 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/IBitmapTextureAtlasSource.java @@ -6,9 +6,9 @@ import android.graphics.Bitmap.Config; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:08:52 - 09.03.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java index 9b662face..06d639711 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/PictureBitmapTextureAtlasSource.java @@ -9,9 +9,9 @@ import android.graphics.Picture; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:52:58 - 21.05.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java index 8670eb608..ca843db14 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/ResourceBitmapTextureAtlasSource.java @@ -13,9 +13,9 @@ import android.os.Build; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:07:23 - 09.03.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java index c71884387..2c9b12c62 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/BaseShapeBitmapTextureAtlasSourceDecorator.java @@ -6,9 +6,9 @@ import android.graphics.Canvas; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:09:41 - 05.11.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java index 1a55309c1..d3ebcfd2e 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorKeyBitmapTextureAtlasSourceDecorator.java @@ -8,13 +8,13 @@ import android.os.Build; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @deprecated On {@link Build.VERSION_CODES#JELLY_BEAN} and higher! - * + * * @see {@link ColorKeyBitmapTextureAtlasSource} - * + * * @author Nicolas Gramlich * @since 22:16:41 - 06.08.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java index 4680c8b52..8391d529f 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/ColorSwapBitmapTextureAtlasSourceDecorator.java @@ -12,7 +12,7 @@ import android.os.Build; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. * * @deprecated On {@link Build.VERSION_CODES#JELLY_BEAN} and higher! diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/FillBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/FillBitmapTextureAtlasSourceDecorator.java index ca26cd8d2..5138e45b3 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/FillBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/FillBitmapTextureAtlasSourceDecorator.java @@ -6,9 +6,9 @@ import android.graphics.Paint.Style; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:08:00 - 05.11.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/LinearGradientFillBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/LinearGradientFillBitmapTextureAtlasSourceDecorator.java index b9b6c2a6a..0845f6faf 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/LinearGradientFillBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/LinearGradientFillBitmapTextureAtlasSourceDecorator.java @@ -8,9 +8,9 @@ import android.graphics.Shader.TileMode; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:21:24 - 05.11.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/OutlineBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/OutlineBitmapTextureAtlasSourceDecorator.java index ee319428c..3e9520aea 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/OutlineBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/OutlineBitmapTextureAtlasSourceDecorator.java @@ -6,9 +6,9 @@ import android.graphics.Paint.Style; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:07:55 - 05.11.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java index fc1a1f85d..79930b743 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java @@ -9,9 +9,9 @@ import android.graphics.Shader.TileMode; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:21:24 - 05.11.2010 */ @@ -20,7 +20,7 @@ public class RadialGradientFillBitmapTextureAtlasSourceDecorator extends BaseSha // Constants // =========================================================== - private static final float[] POSITIONS_DEFAULT = new float[] { 0.0f, 1.0f }; + private static final float[] POSITIONS_DEFAULT = new float[] { 0.0f, 1.0f }; // =========================================================== // Fields diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java index 4d4171b5d..8279a929f 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/ArcBitmapTextureAtlasSourceDecoratorShape.java @@ -7,9 +7,9 @@ import android.graphics.RectF; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:52:55 - 04.01.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java index 85823397e..d3401285b 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/CircleBitmapTextureAtlasSourceDecoratorShape.java @@ -6,9 +6,9 @@ import android.graphics.Paint; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:53:13 - 04.01.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java index 2e43b1450..57d64a158 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/EllipseBitmapTextureAtlasSourceDecoratorShape.java @@ -7,9 +7,9 @@ import android.graphics.RectF; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:52:55 - 04.01.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/IBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/IBitmapTextureAtlasSourceDecoratorShape.java index a838878fd..e9fc8d6f7 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/IBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/IBitmapTextureAtlasSourceDecoratorShape.java @@ -6,9 +6,9 @@ import android.graphics.Paint; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:47:40 - 04.01.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java index 685eecf22..56d635f5d 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/shape/RoundedRectangleBitmapTextureAtlasSourceDecoratorShape.java @@ -7,9 +7,9 @@ import android.graphics.RectF; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:50:09 - 04.01.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java index 7f26b1fca..f5d9d3fb0 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java @@ -17,7 +17,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 21:26:38 - 12.08.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java index 9410f7824..6dabf25c4 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java @@ -9,9 +9,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:42:08 - 12.07.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java b/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java index 8717a982e..06533876e 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java @@ -9,9 +9,9 @@ import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @author Jim Scott (BlackPawn) * @since 16:03:01 - 12.08.2010 @@ -47,7 +47,7 @@ public int compare(final TextureAtlasSourceWithWithLocationCallback pTextureA // =========================================================== /** - * @param pTextureAtlasBorderSpacing the minimum spacing between the border of the texture and the {@link ITextureAtlasSource}s. + * @param pTextureAtlasBorderSpacing the minimum spacing between the border of the texture and the {@link ITextureAtlasSource}s. * @param pTextureAtlasSourceSpacing the spacing between the different {@link ITextureAtlasSource}s. * @param pTextureAtlasSourcePadding the transparent padding around each {@link ITextureAtlasSource} (prevents texture bleeding). */ diff --git a/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java b/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java index d9c5af3a2..aa1fd3091 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java @@ -7,9 +7,9 @@ import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:59:14 - 12.08.2010 */ diff --git a/src/org/andengine/opengl/texture/atlas/source/BaseTextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/source/BaseTextureAtlasSource.java index 47968fc59..154d459c7 100644 --- a/src/org/andengine/opengl/texture/atlas/source/BaseTextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/source/BaseTextureAtlasSource.java @@ -1,9 +1,9 @@ package org.andengine.opengl.texture.atlas.source; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:55:12 - 12.07.2011 */ diff --git a/src/org/andengine/opengl/texture/atlas/source/ITextureAtlasSource.java b/src/org/andengine/opengl/texture/atlas/source/ITextureAtlasSource.java index 8141f6f61..57cfef492 100644 --- a/src/org/andengine/opengl/texture/atlas/source/ITextureAtlasSource.java +++ b/src/org/andengine/opengl/texture/atlas/source/ITextureAtlasSource.java @@ -2,9 +2,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:46:56 - 12.07.2011 */ diff --git a/src/org/andengine/opengl/texture/region/BaseTextureRegion.java b/src/org/andengine/opengl/texture/region/BaseTextureRegion.java index 9273b84ae..62dca82a6 100644 --- a/src/org/andengine/opengl/texture/region/BaseTextureRegion.java +++ b/src/org/andengine/opengl/texture/region/BaseTextureRegion.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:29:59 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/texture/region/TextureRegion.java b/src/org/andengine/opengl/texture/region/TextureRegion.java index c3f71a5be..203a54383 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegion.java +++ b/src/org/andengine/opengl/texture/region/TextureRegion.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:29:59 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java index 328e3cadb..d3516f4ad 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:15:14 - 09.03.2010 */ diff --git a/src/org/andengine/opengl/texture/region/TextureRegionLibrary.java b/src/org/andengine/opengl/texture/region/TextureRegionLibrary.java index e45eb88ba..70f6fd52a 100644 --- a/src/org/andengine/opengl/texture/region/TextureRegionLibrary.java +++ b/src/org/andengine/opengl/texture/region/TextureRegionLibrary.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:52:26 - 20.08.2010 */ diff --git a/src/org/andengine/opengl/texture/region/TiledTextureRegion.java b/src/org/andengine/opengl/texture/region/TiledTextureRegion.java index 3f55b35f8..32988b66c 100644 --- a/src/org/andengine/opengl/texture/region/TiledTextureRegion.java +++ b/src/org/andengine/opengl/texture/region/TiledTextureRegion.java @@ -6,7 +6,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:14:42 - 09.03.2010 */ diff --git a/src/org/andengine/opengl/texture/render/RenderTexture.java b/src/org/andengine/opengl/texture/render/RenderTexture.java index 43f81da71..67a0e523e 100644 --- a/src/org/andengine/opengl/texture/render/RenderTexture.java +++ b/src/org/andengine/opengl/texture/render/RenderTexture.java @@ -20,7 +20,7 @@ import android.opengl.GLES20; /** - * The general workflow with a {@link RenderTexture} is: {@link RenderTexture#init(GLState)} -> {@link RenderTexture#begin(GLState)} -> {@link RenderTexture#end(GLState)} -> {@link RenderTexture#destroy(GLState)}. + * The general workflow with a {@link RenderTexture} is: {@link RenderTexture#init(GLState)} -> {@link RenderTexture#begin(GLState)} -> {@link RenderTexture#end(GLState)} -> {@link RenderTexture#destroy(GLState)}. * * (c) Zynga 2011 * @@ -288,7 +288,7 @@ public void end(final GLState pGLState) { * @param pGLState * @param pFlush {@link GLState#flush()} has lower preference than pFinish. * @param pFinish {@link GLState#finish()} had higher preference than pFlush. - * + * * @see {@link RenderTexture#begin(GLState)}, * {@link RenderTexture#begin(GLState, boolean, boolean)}, * {@link RenderTexture#begin(GLState, Color)}, diff --git a/src/org/andengine/opengl/util/GLMatrixStack.java b/src/org/andengine/opengl/util/GLMatrixStack.java index c2559afe1..306428b3d 100644 --- a/src/org/andengine/opengl/util/GLMatrixStack.java +++ b/src/org/andengine/opengl/util/GLMatrixStack.java @@ -7,7 +7,7 @@ /** * TODO Measure performance with inlined or native Matrix implementations. - * + * * (c) Zynga 2011 * * @author Nicolas Gramlich diff --git a/src/org/andengine/opengl/util/VertexUtils.java b/src/org/andengine/opengl/util/VertexUtils.java index 2f031b27e..6aa852add 100644 --- a/src/org/andengine/opengl/util/VertexUtils.java +++ b/src/org/andengine/opengl/util/VertexUtils.java @@ -36,7 +36,7 @@ public class VertexUtils { * @param pVertexOffset * @param pVertexStride * @param pVertexIndex - * @return the value of the pVertexOffset-th attribute of the pVertexIndex-th vertex. + * @return the value of the pVertexOffset-th attribute of the pVertexIndex-th vertex. */ public static float getVertex(final float[] pVertices, final int pVertexOffset, final int pVertexStride, final int pVertexIndex) { return pVertices[(pVertexIndex * pVertexStride) + pVertexOffset]; diff --git a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java index f89e527c2..6833bcd61 100644 --- a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java @@ -9,9 +9,9 @@ import android.opengl.GLES20; /** - * Compared to a {@link LowMemoryVertexBufferObject}, the {@link HighPerformanceVertexBufferObject} uses 2x the heap memory, + * Compared to a {@link LowMemoryVertexBufferObject}, the {@link HighPerformanceVertexBufferObject} uses 2x the heap memory, * at the benefit of significantly faster data buffering (up to 5x faster!). - * + * * @see {@link LowMemoryVertexBufferObject} when to prefer a {@link LowMemoryVertexBufferObject} instead of a {@link HighPerformanceVertexBufferObject} * *

(c) Zynga 2011

diff --git a/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java index f648d9615..7966e7dfe 100644 --- a/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java @@ -7,14 +7,14 @@ import android.opengl.GLES20; /** - * Compared to a {@link HighPerformanceVertexBufferObject}, the {@link LowMemoryVertexBufferObject} uses 50% less heap memory, + * Compared to a {@link HighPerformanceVertexBufferObject}, the {@link LowMemoryVertexBufferObject} uses 50% less heap memory, * at the cost of significantly slower data buffering (up to 5x slower!). - * + * * Usually a {@link LowMemoryVertexBufferObject} is preferred to a {@link HighPerformanceVertexBufferObject} when the following conditions are met: *
    *
  1. The applications is close to run out of memory.
  2. *
  3. You have very big {@link HighPerformanceVertexBufferObject} or an extreme number of small {@link HighPerformanceVertexBufferObject}s, where a 50% heap memory reduction would actually be significant.
  4. - *
  5. The content (color, vertices, texturecoordinates) of the {@link LowMemoryVertexBufferObject} is changed not often, or even better: never.
  6. + *
  7. The content (color, vertices, texturecoordinates) of the {@link LowMemoryVertexBufferObject} is changed not often, or even better: never.
  8. *
* * (c) Zynga 2011 diff --git a/src/org/andengine/opengl/vbo/VertexBufferObject.java b/src/org/andengine/opengl/vbo/VertexBufferObject.java index 7527c170b..019bc364f 100644 --- a/src/org/andengine/opengl/vbo/VertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/VertexBufferObject.java @@ -13,11 +13,11 @@ /** * TODO Extract a common base class from {@link VertexBufferObject} and {@link ZeroMemoryVertexBufferObject} (due to significant code duplication). - * For naming, maybe be inspired by the java ByteBuffer naming (i.e. HeapBackedFloatArrayVertexBufferObject, StreamBufferVertexBufferObject, SharedBufferStreamVertexBufferObject). + * For naming, maybe be inspired by the java ByteBuffer naming (i.e. HeapBackedFloatArrayVertexBufferObject, StreamBufferVertexBufferObject, SharedBufferStreamVertexBufferObject). * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:22:56 - 07.04.2010 */ diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java index 2715b677b..5282337f1 100644 --- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java +++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java @@ -3,7 +3,7 @@ import org.andengine.opengl.GLES20Fix; /** - * The {@link VertexBufferObjectAttributeFix} is a special + * The {@link VertexBufferObjectAttributeFix} is a special * (c) Zynga 2012 * * @author Nicolas Gramlich diff --git a/src/org/andengine/opengl/view/EngineRenderer.java b/src/org/andengine/opengl/view/EngineRenderer.java index 3b7d23869..bea7bb3b3 100644 --- a/src/org/andengine/opengl/view/EngineRenderer.java +++ b/src/org/andengine/opengl/view/EngineRenderer.java @@ -14,7 +14,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:57:29 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/view/IRendererListener.java b/src/org/andengine/opengl/view/IRendererListener.java index c2788d5b4..66d244b7b 100644 --- a/src/org/andengine/opengl/view/IRendererListener.java +++ b/src/org/andengine/opengl/view/IRendererListener.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:57:29 - 08.03.2010 */ diff --git a/src/org/andengine/opengl/view/RenderSurfaceView.java b/src/org/andengine/opengl/view/RenderSurfaceView.java index 8ad296880..7e9bf479b 100644 --- a/src/org/andengine/opengl/view/RenderSurfaceView.java +++ b/src/org/andengine/opengl/view/RenderSurfaceView.java @@ -11,7 +11,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:57:29 - 08.03.2010 */ diff --git a/src/org/andengine/ui/IGameInterface.java b/src/org/andengine/ui/IGameInterface.java index bbba788b8..93baac8bf 100644 --- a/src/org/andengine/ui/IGameInterface.java +++ b/src/org/andengine/ui/IGameInterface.java @@ -7,9 +7,9 @@ import org.andengine.entity.scene.Scene; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:03:08 - 14.03.2010 */ diff --git a/src/org/andengine/ui/activity/BaseActivity.java b/src/org/andengine/ui/activity/BaseActivity.java index abf680a39..3d0845dad 100644 --- a/src/org/andengine/ui/activity/BaseActivity.java +++ b/src/org/andengine/ui/activity/BaseActivity.java @@ -12,9 +12,9 @@ import android.widget.Toast; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:35:28 - 29.08.2009 */ @@ -82,7 +82,7 @@ public void run() { /** * Performs a task in the background, showing a {@link ProgressDialog}, * while the {@link Callable} is being processed. - * + * * @param * @param pTitleResourceID * @param pMessageResourceID @@ -97,7 +97,7 @@ protected void doAsync(final int pTitleResourceID, final int pMessageResourc /** * Performs a task in the background, showing a indeterminate {@link ProgressDialog}, * while the {@link Callable} is being processed. - * + * * @param * @param pTitleResourceID * @param pMessageResourceID @@ -113,7 +113,7 @@ protected void doAsync(final int pTitleResourceID, final int pMessageResourc /** * Performs a task in the background, showing a {@link ProgressDialog} with an ProgressBar, * while the {@link AsyncCallable} is being processed. - * + * * @param * @param pTitleResourceID * @param pMessageResourceID @@ -128,7 +128,7 @@ protected void doProgressAsync(final int pTitleResourceID, final int pIconRe /** * Performs a task in the background, showing a {@link ProgressDialog} with a ProgressBar, * while the {@link AsyncCallable} is being processed. - * + * * @param * @param pTitleResourceID * @param pMessageResourceID @@ -144,7 +144,7 @@ protected void doProgressAsync(final int pTitleResourceID, final int pIconRe /** * Performs a task in the background, showing an indeterminate {@link ProgressDialog}, * while the {@link AsyncCallable} is being processed. - * + * * @param * @param pTitleResourceID * @param pMessageResourceID diff --git a/src/org/andengine/ui/activity/BaseGameActivity.java b/src/org/andengine/ui/activity/BaseGameActivity.java index 598ddb817..55f0b33a0 100644 --- a/src/org/andengine/ui/activity/BaseGameActivity.java +++ b/src/org/andengine/ui/activity/BaseGameActivity.java @@ -41,7 +41,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:27:06 - 08.03.2010 */ diff --git a/src/org/andengine/ui/activity/LayoutGameActivity.java b/src/org/andengine/ui/activity/LayoutGameActivity.java index 88cf51e67..498259906 100644 --- a/src/org/andengine/ui/activity/LayoutGameActivity.java +++ b/src/org/andengine/ui/activity/LayoutGameActivity.java @@ -3,9 +3,9 @@ import org.andengine.opengl.view.RenderSurfaceView; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:18:50 - 06.10.2010 */ diff --git a/src/org/andengine/ui/activity/LegacyBaseGameActivity.java b/src/org/andengine/ui/activity/LegacyBaseGameActivity.java index 773966c04..c17631963 100644 --- a/src/org/andengine/ui/activity/LegacyBaseGameActivity.java +++ b/src/org/andengine/ui/activity/LegacyBaseGameActivity.java @@ -13,7 +13,7 @@ * * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:27:06 - 08.03.2010 */ diff --git a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java index 2750cf0e2..6cf4508db 100644 --- a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java @@ -8,7 +8,7 @@ /** * This class exists so that the callback parameters of the methods in {@link IGameInterface} get called automatically. - * + * * (c) Zynga 2011 * * @author Nicolas Gramlich diff --git a/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java b/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java index 98bc2118d..16c0d0b22 100644 --- a/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java +++ b/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java @@ -13,9 +13,9 @@ import android.widget.Toast; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 09:35:55 - 14.12.2009 */ diff --git a/src/org/andengine/ui/dialog/StringInputDialogBuilder.java b/src/org/andengine/ui/dialog/StringInputDialogBuilder.java index 3fc22ad9d..adc560733 100644 --- a/src/org/andengine/ui/dialog/StringInputDialogBuilder.java +++ b/src/org/andengine/ui/dialog/StringInputDialogBuilder.java @@ -6,9 +6,9 @@ import android.content.DialogInterface.OnCancelListener; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 09:46:00 - 14.12.2009 */ diff --git a/src/org/andengine/util/ActivityUtils.java b/src/org/andengine/util/ActivityUtils.java index cd88f4edb..af70fdd8a 100644 --- a/src/org/andengine/util/ActivityUtils.java +++ b/src/org/andengine/util/ActivityUtils.java @@ -19,9 +19,9 @@ import android.view.WindowManager; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 18:11:54 - 07.03.2011 */ diff --git a/src/org/andengine/util/BetaUtils.java b/src/org/andengine/util/BetaUtils.java index bfc4d360a..a8073f1bd 100644 --- a/src/org/andengine/util/BetaUtils.java +++ b/src/org/andengine/util/BetaUtils.java @@ -14,9 +14,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:43:32 - 02.11.2010 */ diff --git a/src/org/andengine/util/BitmapUtils.java b/src/org/andengine/util/BitmapUtils.java index 7d6b932c2..32fa3a536 100644 --- a/src/org/andengine/util/BitmapUtils.java +++ b/src/org/andengine/util/BitmapUtils.java @@ -36,7 +36,7 @@ public class BitmapUtils { /** * @param pBitmap * - * @return a {@link Bitmap} that is {@link Bitmap#isMutable()}. If pBitmap is {@link Bitmap#isMutable()} then pBitmap is returned, otherwise a new {@link Bitmap} instance is returned that is {@link Bitmap#isMutable()} and pBitmap is {@link Bitmap#recycle()}d. + * @return a {@link Bitmap} that is {@link Bitmap#isMutable()}. If pBitmap is {@link Bitmap#isMutable()} then pBitmap is returned, otherwise a new {@link Bitmap} instance is returned that is {@link Bitmap#isMutable()} and pBitmap is {@link Bitmap#recycle()}d. */ public static Bitmap ensureBitmapIsMutable(final Bitmap pBitmap) { if (pBitmap.isMutable()) { diff --git a/src/org/andengine/util/Constants.java b/src/org/andengine/util/Constants.java index ca2f28169..09228ae73 100644 --- a/src/org/andengine/util/Constants.java +++ b/src/org/andengine/util/Constants.java @@ -1,9 +1,9 @@ package org.andengine.util; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:52:21 - 08.03.2010 */ diff --git a/src/org/andengine/util/DatabaseUtils.java b/src/org/andengine/util/DatabaseUtils.java index c49f0d8e9..81efa78bb 100644 --- a/src/org/andengine/util/DatabaseUtils.java +++ b/src/org/andengine/util/DatabaseUtils.java @@ -4,7 +4,7 @@ /** * (c) 2013 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:30:15 - 23.01.2013 */ diff --git a/src/org/andengine/util/DialogUtils.java b/src/org/andengine/util/DialogUtils.java index 5aad4a09e..ca068250b 100644 --- a/src/org/andengine/util/DialogUtils.java +++ b/src/org/andengine/util/DialogUtils.java @@ -4,9 +4,9 @@ import android.view.WindowManager; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:04:09 - 12.05.2011 */ diff --git a/src/org/andengine/util/FileUtils.java b/src/org/andengine/util/FileUtils.java index ae6bd4c82..e147f04b8 100644 --- a/src/org/andengine/util/FileUtils.java +++ b/src/org/andengine/util/FileUtils.java @@ -13,9 +13,9 @@ import android.os.Environment; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:53:33 - 20.06.2010 */ @@ -181,7 +181,7 @@ public static void copyFile(final File pSourceFile, final File pDestinationFile) /** * Recursively deletes all files and sub-directories under pFileOrDirectory. - * + * * @param pFileOrDirectory * @return true, if all deletions were successful. false, if a deletion fails (the recursion is stopped then). */ diff --git a/src/org/andengine/util/IMatcher.java b/src/org/andengine/util/IMatcher.java index 102162f7f..0b8965236 100644 --- a/src/org/andengine/util/IMatcher.java +++ b/src/org/andengine/util/IMatcher.java @@ -1,9 +1,9 @@ package org.andengine.util; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:32:22 - 26.12.2010 */ diff --git a/src/org/andengine/util/ProbabilityGenerator.java b/src/org/andengine/util/ProbabilityGenerator.java index b7c563c21..fb4b73a1b 100644 --- a/src/org/andengine/util/ProbabilityGenerator.java +++ b/src/org/andengine/util/ProbabilityGenerator.java @@ -6,9 +6,9 @@ import org.andengine.util.math.MathUtils; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:54:24 - 07.11.2010 */ diff --git a/src/org/andengine/util/SAXUtils.java b/src/org/andengine/util/SAXUtils.java index 2d5609201..9f69cc53d 100644 --- a/src/org/andengine/util/SAXUtils.java +++ b/src/org/andengine/util/SAXUtils.java @@ -5,7 +5,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:02:09 - 21.07.2010 */ diff --git a/src/org/andengine/util/SocketUtils.java b/src/org/andengine/util/SocketUtils.java index 97d1c966f..15409808e 100644 --- a/src/org/andengine/util/SocketUtils.java +++ b/src/org/andengine/util/SocketUtils.java @@ -8,9 +8,9 @@ import org.andengine.util.debug.Debug; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 14:42:15 - 18.09.2009 */ diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java index 40c0f10ae..162f5c946 100644 --- a/src/org/andengine/util/StreamUtils.java +++ b/src/org/andengine/util/StreamUtils.java @@ -17,7 +17,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:48:56 - 03.09.2009 */ diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java index d3e1bd859..4e6b43967 100644 --- a/src/org/andengine/util/TextUtils.java +++ b/src/org/andengine/util/TextUtils.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 19:01:08 - 03.04.2010 */ diff --git a/src/org/andengine/util/TimeUtils.java b/src/org/andengine/util/TimeUtils.java index d2826800c..9a5296824 100644 --- a/src/org/andengine/util/TimeUtils.java +++ b/src/org/andengine/util/TimeUtils.java @@ -3,9 +3,9 @@ import org.andengine.util.time.TimeConstants; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:48:49 - 04.04.2011 */ diff --git a/src/org/andengine/util/ViewUtils.java b/src/org/andengine/util/ViewUtils.java index 45ada7fc3..723c66984 100644 --- a/src/org/andengine/util/ViewUtils.java +++ b/src/org/andengine/util/ViewUtils.java @@ -6,9 +6,9 @@ import android.view.ViewGroup; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 20:55:35 - 08.09.2009 */ diff --git a/src/org/andengine/util/adt/DataConstants.java b/src/org/andengine/util/adt/DataConstants.java index 81090915e..35d05b1fd 100644 --- a/src/org/andengine/util/adt/DataConstants.java +++ b/src/org/andengine/util/adt/DataConstants.java @@ -3,7 +3,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 17:59:55 - 14.07.2011 */ diff --git a/src/org/andengine/util/adt/align/HorizontalAlign.java b/src/org/andengine/util/adt/align/HorizontalAlign.java index 015ec2be8..98b56da98 100644 --- a/src/org/andengine/util/adt/align/HorizontalAlign.java +++ b/src/org/andengine/util/adt/align/HorizontalAlign.java @@ -1,9 +1,9 @@ package org.andengine.util.adt.align; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:47:33 - 11.05.2010 */ diff --git a/src/org/andengine/util/adt/align/VerticalAlign.java b/src/org/andengine/util/adt/align/VerticalAlign.java index 97bd1377b..79ccd36d4 100644 --- a/src/org/andengine/util/adt/align/VerticalAlign.java +++ b/src/org/andengine/util/adt/align/VerticalAlign.java @@ -1,9 +1,9 @@ package org.andengine.util.adt.align; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:15:23 - 24.07.2010 */ diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java index 7c9e14925..a2b43ab7e 100644 --- a/src/org/andengine/util/adt/array/ArrayUtils.java +++ b/src/org/andengine/util/adt/array/ArrayUtils.java @@ -7,7 +7,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:35:42 - 01.05.2011 */ diff --git a/src/org/andengine/util/adt/color/ColorUtils.java b/src/org/andengine/util/adt/color/ColorUtils.java index 72f0184ed..d0652030a 100644 --- a/src/org/andengine/util/adt/color/ColorUtils.java +++ b/src/org/andengine/util/adt/color/ColorUtils.java @@ -3,7 +3,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:13:45 - 04.08.2010 */ diff --git a/src/org/andengine/util/adt/color/constants/ColorConstants.java b/src/org/andengine/util/adt/color/constants/ColorConstants.java index 09581d907..eb862e2e4 100644 --- a/src/org/andengine/util/adt/color/constants/ColorConstants.java +++ b/src/org/andengine/util/adt/color/constants/ColorConstants.java @@ -1,9 +1,9 @@ package org.andengine.util.adt.color.constants; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:21:46 - 19.07.2010 */ diff --git a/src/org/andengine/util/adt/data/DataUtils.java b/src/org/andengine/util/adt/data/DataUtils.java index b905a8e40..ebc0ab98f 100644 --- a/src/org/andengine/util/adt/data/DataUtils.java +++ b/src/org/andengine/util/adt/data/DataUtils.java @@ -3,9 +3,9 @@ /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:01:49 - 20.03.2011 */ diff --git a/src/org/andengine/util/adt/list/ListUtils.java b/src/org/andengine/util/adt/list/ListUtils.java index 0a57c209c..49f0f1bc1 100644 --- a/src/org/andengine/util/adt/list/ListUtils.java +++ b/src/org/andengine/util/adt/list/ListUtils.java @@ -10,7 +10,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 12:43:39 - 11.03.2010 */ diff --git a/src/org/andengine/util/adt/list/ShiftList.java b/src/org/andengine/util/adt/list/ShiftList.java index 3ff6ac587..7d81109ee 100644 --- a/src/org/andengine/util/adt/list/ShiftList.java +++ b/src/org/andengine/util/adt/list/ShiftList.java @@ -10,7 +10,7 @@ * This implementation is particular useful/efficient for enter/poll operations. * Its {@link java.util.Queue} like behavior performs better than a plain {@link java.util.ArrayList}, since it automatically shift the contents of its internal Array only when really necessary. * Besides sparse allocations to increase the size of the internal Array, {@link ShiftList} is allocation free (unlike the {@link java.util.LinkedList} family). - * + * * Supports null items. * * (c) Zynga 2012 diff --git a/src/org/andengine/util/adt/list/SmartList.java b/src/org/andengine/util/adt/list/SmartList.java index 86d04b783..7144d5932 100644 --- a/src/org/andengine/util/adt/list/SmartList.java +++ b/src/org/andengine/util/adt/list/SmartList.java @@ -9,7 +9,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 22:20:08 - 27.12.2010 */ diff --git a/src/org/andengine/util/adt/map/Library.java b/src/org/andengine/util/adt/map/Library.java index b64c47d74..986a28cf2 100644 --- a/src/org/andengine/util/adt/map/Library.java +++ b/src/org/andengine/util/adt/map/Library.java @@ -3,9 +3,9 @@ import android.util.SparseArray; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 11:51:29 - 20.08.2010 * @param diff --git a/src/org/andengine/util/adt/map/LongSparseArray.java b/src/org/andengine/util/adt/map/LongSparseArray.java index ca54a8d32..2f13f61f0 100644 --- a/src/org/andengine/util/adt/map/LongSparseArray.java +++ b/src/org/andengine/util/adt/map/LongSparseArray.java @@ -50,7 +50,7 @@ public LongSparseArray(int initialCapacity) { mValues = new Object[initialCapacity]; mSize = 0; } - + /** * @return A copy of all keys contained in the sparse array. */ @@ -60,7 +60,7 @@ public long[] getKeys() { System.arraycopy(mKeys, 0, result, 0, length); return result; } - + /** * Sets all supplied keys to the given unique value. * @param keys Keys to set diff --git a/src/org/andengine/util/adt/map/MultiKey.java b/src/org/andengine/util/adt/map/MultiKey.java index 6404b19b8..0cd7edd0a 100644 --- a/src/org/andengine/util/adt/map/MultiKey.java +++ b/src/org/andengine/util/adt/map/MultiKey.java @@ -3,9 +3,9 @@ import java.util.Arrays; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:54:24 - 07.11.2010 */ diff --git a/src/org/andengine/util/adt/map/MultiKeyHashMap.java b/src/org/andengine/util/adt/map/MultiKeyHashMap.java index 81ab63e13..40a0fc572 100644 --- a/src/org/andengine/util/adt/map/MultiKeyHashMap.java +++ b/src/org/andengine/util/adt/map/MultiKeyHashMap.java @@ -5,9 +5,9 @@ import java.util.Map; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 16:54:24 - 07.11.2010 */ diff --git a/src/org/andengine/util/adt/map/SparseByteArray.java b/src/org/andengine/util/adt/map/SparseByteArray.java index a3c485ab8..b78c4c430 100644 --- a/src/org/andengine/util/adt/map/SparseByteArray.java +++ b/src/org/andengine/util/adt/map/SparseByteArray.java @@ -143,16 +143,16 @@ public int size() { /** * Given an index in the range 0...size()-1, returns * the key from the indexth key-value mapping that this - * SparseByteArray stores. + * SparseByteArray stores. */ public int keyAt(int index) { return mKeys[index]; } - + /** * Given an index in the range 0...size()-1, returns * the value from the indexth key-value mapping that this - * SparseByteArray stores. + * SparseByteArray stores. */ public byte valueAt(int index) { return mValues[index]; @@ -219,7 +219,7 @@ public void append(int key, byte value) { mValues[pos] = value; mSize = pos + 1; } - + private static int binarySearch(int[] a, int start, int len, int key) { int high = start + len, low = start - 1, guess; diff --git a/src/org/andengine/util/adt/map/SparseCharArray.java b/src/org/andengine/util/adt/map/SparseCharArray.java index eabbd481a..20cac5f81 100644 --- a/src/org/andengine/util/adt/map/SparseCharArray.java +++ b/src/org/andengine/util/adt/map/SparseCharArray.java @@ -143,16 +143,16 @@ public int size() { /** * Given an index in the range 0...size()-1, returns * the key from the indexth key-value mapping that this - * SparseCharArray stores. + * SparseCharArray stores. */ public int keyAt(int index) { return mKeys[index]; } - + /** * Given an index in the range 0...size()-1, returns * the value from the indexth key-value mapping that this - * SparseCharArray stores. + * SparseCharArray stores. */ public char valueAt(int index) { return mValues[index]; @@ -219,7 +219,7 @@ public void append(int key, char value) { mValues[pos] = value; mSize = pos + 1; } - + private static int binarySearch(int[] a, int start, int len, int key) { int high = start + len, low = start - 1, guess; diff --git a/src/org/andengine/util/adt/map/SparseDoubleArray.java b/src/org/andengine/util/adt/map/SparseDoubleArray.java index 53f40606a..c1e2e540a 100644 --- a/src/org/andengine/util/adt/map/SparseDoubleArray.java +++ b/src/org/andengine/util/adt/map/SparseDoubleArray.java @@ -143,16 +143,16 @@ public int size() { /** * Given an index in the range 0...size()-1, returns * the key from the indexth key-value mapping that this - * SparseDoubleArray stores. + * SparseDoubleArray stores. */ public int keyAt(int index) { return mKeys[index]; } - + /** * Given an index in the range 0...size()-1, returns * the value from the indexth key-value mapping that this - * SparseDoubleArray stores. + * SparseDoubleArray stores. */ public double valueAt(int index) { return mValues[index]; @@ -219,7 +219,7 @@ public void append(int key, double value) { mValues[pos] = value; mSize = pos + 1; } - + private static int binarySearch(int[] a, int start, int len, int key) { int high = start + len, low = start - 1, guess; diff --git a/src/org/andengine/util/adt/map/SparseFloatArray.java b/src/org/andengine/util/adt/map/SparseFloatArray.java index b29c17d8c..ffa6eb304 100644 --- a/src/org/andengine/util/adt/map/SparseFloatArray.java +++ b/src/org/andengine/util/adt/map/SparseFloatArray.java @@ -143,16 +143,16 @@ public int size() { /** * Given an index in the range 0...size()-1, returns * the key from the indexth key-value mapping that this - * SparseFloatArray stores. + * SparseFloatArray stores. */ public int keyAt(int index) { return mKeys[index]; } - + /** * Given an index in the range 0...size()-1, returns * the value from the indexth key-value mapping that this - * SparseFloatArray stores. + * SparseFloatArray stores. */ public float valueAt(int index) { return mValues[index]; @@ -219,7 +219,7 @@ public void append(int key, float value) { mValues[pos] = value; mSize = pos + 1; } - + private static int binarySearch(int[] a, int start, int len, int key) { int high = start + len, low = start - 1, guess; diff --git a/src/org/andengine/util/adt/map/SparseLongArray.java b/src/org/andengine/util/adt/map/SparseLongArray.java index ba2c0676d..99ef55fe9 100644 --- a/src/org/andengine/util/adt/map/SparseLongArray.java +++ b/src/org/andengine/util/adt/map/SparseLongArray.java @@ -143,16 +143,16 @@ public int size() { /** * Given an index in the range 0...size()-1, returns * the key from the indexth key-value mapping that this - * SparseLongArray stores. + * SparseLongArray stores. */ public int keyAt(int index) { return mKeys[index]; } - + /** * Given an index in the range 0...size()-1, returns * the value from the indexth key-value mapping that this - * SparseLongArray stores. + * SparseLongArray stores. */ public long valueAt(int index) { return mValues[index]; @@ -219,7 +219,7 @@ public void append(int key, long value) { mValues[pos] = value; mSize = pos + 1; } - + private static int binarySearch(int[] a, int start, int len, int key) { int high = start + len, low = start - 1, guess; diff --git a/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java b/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java index 622cded42..0e4e02530 100644 --- a/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java +++ b/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolItem.java @@ -4,9 +4,9 @@ import org.andengine.util.call.Callback; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 00:53:22 - 28.08.2010 */ diff --git a/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolUpdateHandler.java b/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolUpdateHandler.java index 8d6b388a3..8df8c9342 100644 --- a/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolUpdateHandler.java +++ b/src/org/andengine/util/adt/pool/EntityDetachRunnablePoolUpdateHandler.java @@ -6,7 +6,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 23:16:25 - 31.08.2010 */ diff --git a/src/org/andengine/util/adt/pool/GenericPool.java b/src/org/andengine/util/adt/pool/GenericPool.java index 96a143057..0cc241897 100644 --- a/src/org/andengine/util/adt/pool/GenericPool.java +++ b/src/org/andengine/util/adt/pool/GenericPool.java @@ -9,10 +9,10 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Valentin Milea * @author Nicolas Gramlich - * + * * @since 22:19:55 - 31.08.2010 */ public abstract class GenericPool { diff --git a/src/org/andengine/util/adt/pool/MultiPool.java b/src/org/andengine/util/adt/pool/MultiPool.java index ccf6234c2..a5d873058 100644 --- a/src/org/andengine/util/adt/pool/MultiPool.java +++ b/src/org/andengine/util/adt/pool/MultiPool.java @@ -3,9 +3,9 @@ import android.util.SparseArray; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 10:13:26 - 02.03.2011 */ diff --git a/src/org/andengine/util/adt/pool/Pool.java b/src/org/andengine/util/adt/pool/Pool.java index 45150a487..4186614ed 100644 --- a/src/org/andengine/util/adt/pool/Pool.java +++ b/src/org/andengine/util/adt/pool/Pool.java @@ -4,10 +4,10 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Valentin Milea * @author Nicolas Gramlich - * + * * @since 23:00:21 - 21.08.2010 */ public abstract class Pool extends GenericPool { diff --git a/src/org/andengine/util/adt/pool/PoolItem.java b/src/org/andengine/util/adt/pool/PoolItem.java index 47a913211..139b09d32 100644 --- a/src/org/andengine/util/adt/pool/PoolItem.java +++ b/src/org/andengine/util/adt/pool/PoolItem.java @@ -1,12 +1,12 @@ package org.andengine.util.adt.pool; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Valentin Milea * @author Nicolas Gramlich - * + * * @since 23:02:47 - 21.08.2010 */ public abstract class PoolItem { diff --git a/src/org/andengine/util/adt/pool/PoolUpdateHandler.java b/src/org/andengine/util/adt/pool/PoolUpdateHandler.java index 1dd732873..f78da8529 100644 --- a/src/org/andengine/util/adt/pool/PoolUpdateHandler.java +++ b/src/org/andengine/util/adt/pool/PoolUpdateHandler.java @@ -8,10 +8,10 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Valentin Milea * @author Nicolas Gramlich - * + * * @since 23:02:58 - 21.08.2010 */ public abstract class PoolUpdateHandler implements IUpdateHandler { diff --git a/src/org/andengine/util/adt/pool/RunnablePoolItem.java b/src/org/andengine/util/adt/pool/RunnablePoolItem.java index 2928a7c31..19e24df40 100644 --- a/src/org/andengine/util/adt/pool/RunnablePoolItem.java +++ b/src/org/andengine/util/adt/pool/RunnablePoolItem.java @@ -1,9 +1,9 @@ package org.andengine.util.adt.pool; /** - * (c) 2010 Nicolas Gramlich + * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 23:46:50 - 27.08.2010 */ diff --git a/src/org/andengine/util/adt/pool/RunnablePoolUpdateHandler.java b/src/org/andengine/util/adt/pool/RunnablePoolUpdateHandler.java index f389ff7de..0b7845fd2 100644 --- a/src/org/andengine/util/adt/pool/RunnablePoolUpdateHandler.java +++ b/src/org/andengine/util/adt/pool/RunnablePoolUpdateHandler.java @@ -3,10 +3,10 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Valentin Milea * @author Nicolas Gramlich - * + * * @since 23:03:58 - 21.08.2010 */ public abstract class RunnablePoolUpdateHandler extends PoolUpdateHandler { diff --git a/src/org/andengine/util/adt/spatial/Direction.java b/src/org/andengine/util/adt/spatial/Direction.java index 15ad7e6d5..deea9bae0 100644 --- a/src/org/andengine/util/adt/spatial/Direction.java +++ b/src/org/andengine/util/adt/spatial/Direction.java @@ -3,7 +3,7 @@ /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 15:19:11 - 17.08.2010 */ diff --git a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java index 31c02cdea..b5c614448 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java @@ -15,7 +15,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * TODO Make all methods non-synchronized and add a SynchronizedXZYQuadTree subclasses. + * TODO Make all methods non-synchronized and add a SynchronizedXZYQuadTree subclasses. * * (c) Zynga 2011 * diff --git a/src/org/andengine/util/adt/transformation/Transformation.java b/src/org/andengine/util/adt/transformation/Transformation.java index 6cba2d39d..6788c53c6 100644 --- a/src/org/andengine/util/adt/transformation/Transformation.java +++ b/src/org/andengine/util/adt/transformation/Transformation.java @@ -5,9 +5,9 @@ /** *

This class is basically a java-space replacement for the native {@link android.graphics.Matrix} class.

- * + * *
- * + * * This class represents an affine transformation with the following matrix: *
 [ a , b , 0 ]
  * [ c , d , 0 ]
@@ -24,7 +24,7 @@
  *
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 15:47:18 - 23.12.2010
  */
diff --git a/src/org/andengine/util/adt/transformation/TransformationPool.java b/src/org/andengine/util/adt/transformation/TransformationPool.java
index 5201324e7..6f245c44a 100644
--- a/src/org/andengine/util/adt/transformation/TransformationPool.java
+++ b/src/org/andengine/util/adt/transformation/TransformationPool.java
@@ -3,9 +3,9 @@
 import org.andengine.util.adt.pool.GenericPool;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 23:07:53 - 23.02.2011
  */
diff --git a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java
index 1db2eedb4..eeb2c296d 100644
--- a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java
+++ b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java
@@ -6,7 +6,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 11:50:19 - 11.03.2010
  */
@@ -72,7 +72,7 @@ public static boolean checkAxisAlignedRectangleContains(final float pLeft, final
 	 * If the point is colinear with the line segment, but not between the
 	 * endpoints, then the value will be -1 if the point lies
 	 * "beyond (X1, Y1)" or 1 if the point lies "beyond (X2, Y2)".
-	 * 
+	 *
 	 * @param pX1 ,
 	 * @param pY1 the coordinates of the beginning of the specified
 	 *            line segment
@@ -170,7 +170,7 @@ public static boolean checkCollision(final float[] pVerticesA, final int pVertex
 
 	/**
 	 * Checks line specified by pVertexIndexA1 and pVertexIndexA2 in pVerticesA against all lines in pVerticesB.
-	 * 
+	 *
 	 * @param pVerticesA
 	 * @param pVertexOffsetXA
 	 * @param pVertexOffsetYA
diff --git a/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java
index d41e373e9..1d012b73b 100644
--- a/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java
+++ b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java
@@ -10,7 +10,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 11:50:19 - 11.03.2010
  */
diff --git a/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java b/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java
index 1af4bb8ea..1abbab1ec 100644
--- a/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java
+++ b/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java
@@ -6,9 +6,9 @@
 import org.andengine.entity.primitive.Line;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 19:27:22 - 17.07.2010
  */
diff --git a/src/org/andengine/util/algorithm/hull/HullUtils.java b/src/org/andengine/util/algorithm/hull/HullUtils.java
index 94904e8a4..1bdd5b0fd 100644
--- a/src/org/andengine/util/algorithm/hull/HullUtils.java
+++ b/src/org/andengine/util/algorithm/hull/HullUtils.java
@@ -40,7 +40,7 @@ public static int indexOfLowestVertex(final float[] pVertices, final int pVertex
 		final int lastVertexOffset = pVertexCount * pVertexStride;
 
 		/* Starting at one since, since we chose 0 as a the first candidate. */
-		int currentVertexIndex = 1; 
+		int currentVertexIndex = 1;
 		int currentVertexOffsetY = pVertexStride + pVertexOffsetY;
 
 		/* Loop to the end. */
diff --git a/src/org/andengine/util/algorithm/hull/IHullAlgorithm.java b/src/org/andengine/util/algorithm/hull/IHullAlgorithm.java
index 846d1dab4..e5b880754 100644
--- a/src/org/andengine/util/algorithm/hull/IHullAlgorithm.java
+++ b/src/org/andengine/util/algorithm/hull/IHullAlgorithm.java
@@ -2,9 +2,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 13:46:22 - 14.09.2010
  */
diff --git a/src/org/andengine/util/algorithm/hull/JarvisMarch.java b/src/org/andengine/util/algorithm/hull/JarvisMarch.java
index fc5b4b2a0..01a7f495d 100644
--- a/src/org/andengine/util/algorithm/hull/JarvisMarch.java
+++ b/src/org/andengine/util/algorithm/hull/JarvisMarch.java
@@ -10,10 +10,10 @@
  * The Jarvis March algorithm marches around the hull,
  * like a ribbon wrapping itself around the points,
  * this algorithm also called the gift-wrapping algorithm.
- * 
+ *
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 14:01:18 - 14.09.2010
  * @see http://www.iti.fh-flensburg.de/lang/algorithmen/geo/
diff --git a/src/org/andengine/util/algorithm/path/ICostFunction.java b/src/org/andengine/util/algorithm/path/ICostFunction.java
index 5631430a2..0f705cf0d 100644
--- a/src/org/andengine/util/algorithm/path/ICostFunction.java
+++ b/src/org/andengine/util/algorithm/path/ICostFunction.java
@@ -1,9 +1,9 @@
 package org.andengine.util.algorithm.path;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 23:00:24 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/path/IPathFinder.java b/src/org/andengine/util/algorithm/path/IPathFinder.java
index c7c3fb925..8333ab2c5 100644
--- a/src/org/andengine/util/algorithm/path/IPathFinder.java
+++ b/src/org/andengine/util/algorithm/path/IPathFinder.java
@@ -3,9 +3,9 @@
 import org.andengine.util.algorithm.path.astar.IAStarHeuristic;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 22:57:13 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/path/IPathFinderMap.java b/src/org/andengine/util/algorithm/path/IPathFinderMap.java
index 782e5bd7f..d7c9f7e65 100644
--- a/src/org/andengine/util/algorithm/path/IPathFinderMap.java
+++ b/src/org/andengine/util/algorithm/path/IPathFinderMap.java
@@ -2,9 +2,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 23:00:24 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/path/Path.java b/src/org/andengine/util/algorithm/path/Path.java
index 931b173b6..dada81257 100644
--- a/src/org/andengine/util/algorithm/path/Path.java
+++ b/src/org/andengine/util/algorithm/path/Path.java
@@ -6,7 +6,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 23:00:24 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java
index 0a8403db1..a5b64b50d 100644
--- a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java
+++ b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java
@@ -15,7 +15,7 @@
  *
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @author Greg Haynes
  * @since 23:16:17 - 16.08.2010
diff --git a/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java b/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java
index 8e817d816..829296254 100644
--- a/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java
+++ b/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java
@@ -3,9 +3,9 @@
 import org.andengine.util.algorithm.path.IPathFinderMap;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 22:58:01 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/path/astar/IAStarHeuristic.java b/src/org/andengine/util/algorithm/path/astar/IAStarHeuristic.java
index 2471588da..03432e429 100644
--- a/src/org/andengine/util/algorithm/path/astar/IAStarHeuristic.java
+++ b/src/org/andengine/util/algorithm/path/astar/IAStarHeuristic.java
@@ -3,9 +3,9 @@
 import org.andengine.util.algorithm.path.IPathFinderMap;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 22:59:20 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java b/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java
index 2e8fe85be..6151d346f 100644
--- a/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java
+++ b/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java
@@ -3,9 +3,9 @@
 import org.andengine.util.algorithm.path.IPathFinderMap;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 22:58:01 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/path/astar/NullHeuristic.java b/src/org/andengine/util/algorithm/path/astar/NullHeuristic.java
index 3418aef95..5ceab683a 100644
--- a/src/org/andengine/util/algorithm/path/astar/NullHeuristic.java
+++ b/src/org/andengine/util/algorithm/path/astar/NullHeuristic.java
@@ -3,9 +3,9 @@
 import org.andengine.util.algorithm.path.IPathFinderMap;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 22:58:01 - 16.08.2010
  */
diff --git a/src/org/andengine/util/algorithm/sort/InsertionSorter.java b/src/org/andengine/util/algorithm/sort/InsertionSorter.java
index 629acf815..4c72592c9 100644
--- a/src/org/andengine/util/algorithm/sort/InsertionSorter.java
+++ b/src/org/andengine/util/algorithm/sort/InsertionSorter.java
@@ -6,9 +6,9 @@
 import org.andengine.util.adt.list.IList;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 14:14:31 - 06.08.2010
  * @param 
diff --git a/src/org/andengine/util/algorithm/sort/Sorter.java b/src/org/andengine/util/algorithm/sort/Sorter.java
index b28ee6595..249d83c04 100644
--- a/src/org/andengine/util/algorithm/sort/Sorter.java
+++ b/src/org/andengine/util/algorithm/sort/Sorter.java
@@ -6,9 +6,9 @@
 import org.andengine.util.adt.list.IList;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 14:14:39 - 06.08.2010
  * @param 
diff --git a/src/org/andengine/util/call/AsyncCallable.java b/src/org/andengine/util/call/AsyncCallable.java
index db9e47339..e4a829497 100644
--- a/src/org/andengine/util/call/AsyncCallable.java
+++ b/src/org/andengine/util/call/AsyncCallable.java
@@ -1,9 +1,9 @@
 package org.andengine.util.call;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 15:00:30 - 14.05.2010
  * @param 
diff --git a/src/org/andengine/util/call/Callable.java b/src/org/andengine/util/call/Callable.java
index 2d73ecdbb..b707618a2 100644
--- a/src/org/andengine/util/call/Callable.java
+++ b/src/org/andengine/util/call/Callable.java
@@ -1,9 +1,9 @@
 package org.andengine.util.call;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 20:52:44 - 03.01.2010
  */
diff --git a/src/org/andengine/util/call/Callback.java b/src/org/andengine/util/call/Callback.java
index 11feb98a6..e7c357dc4 100644
--- a/src/org/andengine/util/call/Callback.java
+++ b/src/org/andengine/util/call/Callback.java
@@ -1,9 +1,9 @@
 package org.andengine.util.call;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 09:40:55 - 14.12.2009
  */
diff --git a/src/org/andengine/util/call/ParameterCallable.java b/src/org/andengine/util/call/ParameterCallable.java
index a57dee24f..3bf37c5ca 100644
--- a/src/org/andengine/util/call/ParameterCallable.java
+++ b/src/org/andengine/util/call/ParameterCallable.java
@@ -1,9 +1,9 @@
 package org.andengine.util.call;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 23:40:42 - 27.12.2010
  */
diff --git a/src/org/andengine/util/debug/Debug.java b/src/org/andengine/util/debug/Debug.java
index 4f13c28d8..bdc873ecc 100644
--- a/src/org/andengine/util/debug/Debug.java
+++ b/src/org/andengine/util/debug/Debug.java
@@ -7,7 +7,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 13:29:16 - 08.03.2010
  */
diff --git a/src/org/andengine/util/level/LevelLoader.java b/src/org/andengine/util/level/LevelLoader.java
index 59488432e..a26a4fac2 100644
--- a/src/org/andengine/util/level/LevelLoader.java
+++ b/src/org/andengine/util/level/LevelLoader.java
@@ -18,7 +18,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @param 
  * @since 14:16:19 - 11.10.2010
diff --git a/src/org/andengine/util/level/LevelLoaderContentHandler.java b/src/org/andengine/util/level/LevelLoaderContentHandler.java
index 1272789b4..2c5e16f2c 100644
--- a/src/org/andengine/util/level/LevelLoaderContentHandler.java
+++ b/src/org/andengine/util/level/LevelLoaderContentHandler.java
@@ -13,9 +13,9 @@
 import org.xml.sax.helpers.DefaultHandler;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 14:35:32 - 11.10.2010
  */
diff --git a/src/org/andengine/util/level/constants/LevelConstants.java b/src/org/andengine/util/level/constants/LevelConstants.java
index ac244e9e6..edcb8bc35 100644
--- a/src/org/andengine/util/level/constants/LevelConstants.java
+++ b/src/org/andengine/util/level/constants/LevelConstants.java
@@ -2,9 +2,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 14:23:27 - 11.10.2010
  */
diff --git a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
index c475fa8c5..f30892795 100644
--- a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
+++ b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
@@ -22,9 +22,9 @@
 import android.content.SharedPreferences;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 21:13:55 - 18.10.2010
  */
diff --git a/src/org/andengine/util/math/MathConstants.java b/src/org/andengine/util/math/MathConstants.java
index e0d531e62..78bf53bee 100644
--- a/src/org/andengine/util/math/MathConstants.java
+++ b/src/org/andengine/util/math/MathConstants.java
@@ -2,9 +2,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 16:49:25 - 26.07.2010
  */
diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java
index b56200a1c..b7da0f68d 100644
--- a/src/org/andengine/util/math/MathUtils.java
+++ b/src/org/andengine/util/math/MathUtils.java
@@ -5,7 +5,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 20:42:15 - 17.12.2009
  */
diff --git a/src/org/andengine/util/mime/MIMEType.java b/src/org/andengine/util/mime/MIMEType.java
index b329dad24..ba824a805 100644
--- a/src/org/andengine/util/mime/MIMEType.java
+++ b/src/org/andengine/util/mime/MIMEType.java
@@ -1,9 +1,9 @@
 package org.andengine.util.mime;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 14:58:20 - 10.01.2011
  */
diff --git a/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java b/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java
index e365bbf9b..6b4deb12f 100644
--- a/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java
+++ b/src/org/andengine/util/modifier/BaseDoubleValueSpanModifier.java
@@ -4,9 +4,9 @@
 import org.andengine.util.modifier.ease.IEaseFunction;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 10:51:46 - 03.09.2010
  * @param 
diff --git a/src/org/andengine/util/modifier/BaseDurationModifier.java b/src/org/andengine/util/modifier/BaseDurationModifier.java
index 422407589..3d2d27bcd 100644
--- a/src/org/andengine/util/modifier/BaseDurationModifier.java
+++ b/src/org/andengine/util/modifier/BaseDurationModifier.java
@@ -1,9 +1,9 @@
 package org.andengine.util.modifier;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 10:48:13 - 03.09.2010
  * @param 
diff --git a/src/org/andengine/util/modifier/BaseModifier.java b/src/org/andengine/util/modifier/BaseModifier.java
index 570ad3b62..9c1322790 100644
--- a/src/org/andengine/util/modifier/BaseModifier.java
+++ b/src/org/andengine/util/modifier/BaseModifier.java
@@ -4,9 +4,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 10:47:23 - 03.09.2010
  * @param 
diff --git a/src/org/andengine/util/modifier/BaseQuadrupelValueSpanModifier.java b/src/org/andengine/util/modifier/BaseQuadrupelValueSpanModifier.java
index 1df2ce05e..5fca40e07 100644
--- a/src/org/andengine/util/modifier/BaseQuadrupelValueSpanModifier.java
+++ b/src/org/andengine/util/modifier/BaseQuadrupelValueSpanModifier.java
@@ -4,7 +4,7 @@
 
 /**
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 10:58:32 - 02.08.2011
  * @param 
diff --git a/src/org/andengine/util/modifier/BaseSingleValueChangeModifier.java b/src/org/andengine/util/modifier/BaseSingleValueChangeModifier.java
index 5959528f8..cbc3d8634 100644
--- a/src/org/andengine/util/modifier/BaseSingleValueChangeModifier.java
+++ b/src/org/andengine/util/modifier/BaseSingleValueChangeModifier.java
@@ -4,7 +4,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 10:49:51 - 03.09.2010
  * @param 
diff --git a/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java b/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java
index 4bdddcb6f..92aeedb95 100644
--- a/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java
+++ b/src/org/andengine/util/modifier/BaseSingleValueSpanModifier.java
@@ -4,9 +4,9 @@
 import org.andengine.util.modifier.ease.IEaseFunction;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 23:29:22 - 19.03.2010
  */
diff --git a/src/org/andengine/util/modifier/BaseTripleValueSpanModifier.java b/src/org/andengine/util/modifier/BaseTripleValueSpanModifier.java
index 7868528ca..3ec29edb9 100644
--- a/src/org/andengine/util/modifier/BaseTripleValueSpanModifier.java
+++ b/src/org/andengine/util/modifier/BaseTripleValueSpanModifier.java
@@ -3,9 +3,9 @@
 import org.andengine.util.modifier.ease.IEaseFunction;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 10:52:31 - 03.09.2010
  * @param 
diff --git a/src/org/andengine/util/modifier/IModifier.java b/src/org/andengine/util/modifier/IModifier.java
index f85f87ea1..0606a3f90 100644
--- a/src/org/andengine/util/modifier/IModifier.java
+++ b/src/org/andengine/util/modifier/IModifier.java
@@ -8,7 +8,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 11:17:50 - 19.03.2010
  */
diff --git a/src/org/andengine/util/modifier/LoopModifier.java b/src/org/andengine/util/modifier/LoopModifier.java
index c998f433b..6c334995c 100644
--- a/src/org/andengine/util/modifier/LoopModifier.java
+++ b/src/org/andengine/util/modifier/LoopModifier.java
@@ -6,7 +6,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 11:18:37 - 03.09.2010
  * @param 
diff --git a/src/org/andengine/util/modifier/ModifierList.java b/src/org/andengine/util/modifier/ModifierList.java
index 3f8424615..035573ac7 100644
--- a/src/org/andengine/util/modifier/ModifierList.java
+++ b/src/org/andengine/util/modifier/ModifierList.java
@@ -4,9 +4,9 @@
 import org.andengine.util.adt.list.SmartList;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 14:34:57 - 03.09.2010
  */
diff --git a/src/org/andengine/util/modifier/ParallelModifier.java b/src/org/andengine/util/modifier/ParallelModifier.java
index c9fb2b923..aa043757f 100644
--- a/src/org/andengine/util/modifier/ParallelModifier.java
+++ b/src/org/andengine/util/modifier/ParallelModifier.java
@@ -5,9 +5,9 @@
 import org.andengine.util.modifier.IModifier.IModifierListener;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 11:21:22 - 03.09.2010
  * @param 
diff --git a/src/org/andengine/util/modifier/SequenceModifier.java b/src/org/andengine/util/modifier/SequenceModifier.java
index d6a018015..c584f1c50 100644
--- a/src/org/andengine/util/modifier/SequenceModifier.java
+++ b/src/org/andengine/util/modifier/SequenceModifier.java
@@ -5,9 +5,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 19:39:25 - 19.03.2010
  */
diff --git a/src/org/andengine/util/modifier/util/ModifierUtils.java b/src/org/andengine/util/modifier/util/ModifierUtils.java
index ac8758bc5..b775e14ae 100644
--- a/src/org/andengine/util/modifier/util/ModifierUtils.java
+++ b/src/org/andengine/util/modifier/util/ModifierUtils.java
@@ -3,9 +3,9 @@
 import org.andengine.util.modifier.IModifier;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 11:16:36 - 03.09.2010
  */
diff --git a/src/org/andengine/util/preferences/SimplePreferences.java b/src/org/andengine/util/preferences/SimplePreferences.java
index 5694badba..4c0cc7bde 100644
--- a/src/org/andengine/util/preferences/SimplePreferences.java
+++ b/src/org/andengine/util/preferences/SimplePreferences.java
@@ -7,9 +7,9 @@
 import android.preference.PreferenceManager;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 18:55:12 - 02.08.2010
  */
diff --git a/src/org/andengine/util/progress/IProgressListener.java b/src/org/andengine/util/progress/IProgressListener.java
index 8dc3c4952..f16d01b50 100644
--- a/src/org/andengine/util/progress/IProgressListener.java
+++ b/src/org/andengine/util/progress/IProgressListener.java
@@ -2,9 +2,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 18:07:35 - 09.07.2009
  */
diff --git a/src/org/andengine/util/progress/ProgressCallable.java b/src/org/andengine/util/progress/ProgressCallable.java
index 4c51c5775..edd9dd279 100644
--- a/src/org/andengine/util/progress/ProgressCallable.java
+++ b/src/org/andengine/util/progress/ProgressCallable.java
@@ -2,9 +2,9 @@
 
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 20:52:44 - 03.01.2010
  */
diff --git a/src/org/andengine/util/progress/ProgressMonitor.java b/src/org/andengine/util/progress/ProgressMonitor.java
index 248b53006..64ea5b1e4 100644
--- a/src/org/andengine/util/progress/ProgressMonitor.java
+++ b/src/org/andengine/util/progress/ProgressMonitor.java
@@ -8,7 +8,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 18:07:35 - 09.07.2009
  */
diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java
index 64d5b116c..8c5b37545 100644
--- a/src/org/andengine/util/system/SystemUtils.java
+++ b/src/org/andengine/util/system/SystemUtils.java
@@ -20,7 +20,7 @@
 /**
  * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 15:50:31 - 14.07.2010
  */
diff --git a/src/org/andengine/util/texturepack/TexturePackTextureRegion.java b/src/org/andengine/util/texturepack/TexturePackTextureRegion.java
index 5d0b6835d..0818df2a8 100644
--- a/src/org/andengine/util/texturepack/TexturePackTextureRegion.java
+++ b/src/org/andengine/util/texturepack/TexturePackTextureRegion.java
@@ -4,7 +4,7 @@
 import org.andengine.opengl.texture.region.TextureRegion;
 
 /**
- * 
+ *
  * (c) Zynga 2011
  *
  * @author Nicolas Gramlich 
diff --git a/src/org/andengine/util/time/TimeConstants.java b/src/org/andengine/util/time/TimeConstants.java
index 00931b91f..e82cd457b 100644
--- a/src/org/andengine/util/time/TimeConstants.java
+++ b/src/org/andengine/util/time/TimeConstants.java
@@ -1,9 +1,9 @@
 package org.andengine.util.time;
 
 /**
- * (c) 2010 Nicolas Gramlich 
+ * (c) 2010 Nicolas Gramlich
  * (c) 2011 Zynga Inc.
- * 
+ *
  * @author Nicolas Gramlich
  * @since 16:49:25 - 26.07.2010
  */

From e081c4d1e2d1d3bb88441361ee97627f7dc9df43 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 2 Mar 2013 19:18:28 -0800
Subject: [PATCH 119/252] Added second BitVector class (backed by byte[]
 instead of long[]).

---
 src/org/andengine/util/FileUtils.java         |   4 +
 src/org/andengine/util/StreamUtils.java       |  18 +
 src/org/andengine/util/adt/bit/BitVector.java | 305 ++++-------
 .../util/adt/bit/ByteBackedBitVector.java     | 412 +++++++++++++++
 .../andengine/util/adt/bit/IBitVector.java    |  53 ++
 .../util/adt/bit/LongBackedBitVector.java     | 398 ++++++++++++++
 .../andengine/util/adt/data/DataUtils.java    |   4 +
 .../util/adt/dictionary/Dictionary.java       | 487 ++++++++++++++++++
 .../andengine/util/system/SystemUtils.java    |   9 +-
 9 files changed, 1489 insertions(+), 201 deletions(-)
 create mode 100644 src/org/andengine/util/adt/bit/ByteBackedBitVector.java
 create mode 100644 src/org/andengine/util/adt/bit/IBitVector.java
 create mode 100644 src/org/andengine/util/adt/bit/LongBackedBitVector.java
 create mode 100644 src/org/andengine/util/adt/dictionary/Dictionary.java

diff --git a/src/org/andengine/util/FileUtils.java b/src/org/andengine/util/FileUtils.java
index e147f04b8..d32bb13ce 100644
--- a/src/org/andengine/util/FileUtils.java
+++ b/src/org/andengine/util/FileUtils.java
@@ -44,6 +44,10 @@ public class FileUtils {
 	// Methods
 	// ===========================================================
 
+	public static String[] readLines(final File pFile) throws IOException {
+		return StreamUtils.readLines(new FileInputStream(pFile));
+	}
+
 	public static void copyToExternalStorage(final Context pContext, final int pSourceResourceID, final String pFilename) throws FileNotFoundException {
 		FileUtils.copyToExternalStorage(pContext, pContext.getResources().openRawResource(pSourceResourceID), pFilename);
 	}
diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java
index 162f5c946..6f04277ec 100644
--- a/src/org/andengine/util/StreamUtils.java
+++ b/src/org/andengine/util/StreamUtils.java
@@ -11,6 +11,7 @@
 import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 
 import org.andengine.util.debug.Debug;
 
@@ -50,6 +51,23 @@ public final class StreamUtils {
 	// Methods
 	// ===========================================================
 
+	public static String[] readLines(final InputStream pInputStream) throws IOException {
+		return StreamUtils.readLines(new InputStreamReader(pInputStream));
+	}
+
+	public static String[] readLines(final Reader pReader) throws IOException {
+		final BufferedReader reader = new BufferedReader(pReader);
+
+		final ArrayList lines = new ArrayList();
+
+		String line = null;
+		while((line = reader.readLine()) != null) {
+			lines.add(line);
+		}
+
+		return lines.toArray(new String[lines.size()]);
+	}
+
 	public static final String readFully(final InputStream pInputStream) throws IOException {
 		final StringWriter writer = new StringWriter();
 		final char[] buf = new char[StreamUtils.IO_BUFFER_SIZE];
diff --git a/src/org/andengine/util/adt/bit/BitVector.java b/src/org/andengine/util/adt/bit/BitVector.java
index f4c8e1c1c..f73b27d09 100644
--- a/src/org/andengine/util/adt/bit/BitVector.java
+++ b/src/org/andengine/util/adt/bit/BitVector.java
@@ -1,267 +1,174 @@
 package org.andengine.util.adt.bit;
 
-import org.andengine.util.adt.DataConstants;
-
-
 /**
- * (c) Zynga 2011
+ * (c) 2013 Nicolas Gramlich
  *
  * @author Nicolas Gramlich 
- * @since 15:56:32 - 30.10.2011
+ * @since 18:14:12 - 02.03.2013
+ * @author ngramlich
  */
-public final class BitVector {
+public class BitVector {
 	// ===========================================================
 	// Constants
 	// ===========================================================
 
+	public static final int TRUE = 1;
+	public static final int FALSE = 0;
+
 	// ===========================================================
 	// Fields
 	// ===========================================================
 
-	private final int mCapacity;
-	private final long[] mData;
-
 	// ===========================================================
 	// Constructors
 	// ===========================================================
 
-	private BitVector(final int pCapacity) {
-		if (pCapacity <= 0) {
-			throw new IllegalArgumentException("pCapacity must be > 0.");
-		}
-		this.mCapacity = pCapacity;
-
-		/* Check if bytes perfectly fit into the data fields or if there are some overflow bytes that need special treatment. */
-		final boolean perfectDataFit = pCapacity % DataConstants.BITS_PER_LONG == 0;
-
-		final int dataCapacity;
-		if (perfectDataFit) {
-			dataCapacity = pCapacity / DataConstants.BITS_PER_LONG;
-		} else {
-			/* Extra field for overflow bytes. */
-			dataCapacity = (pCapacity / DataConstants.BITS_PER_LONG) + 1;
-		}
-		this.mData = new long[dataCapacity];
+	public static IBitVector wrap(final byte[] pData) {
+		return new ByteBackedBitVector(pData);
+	}
+	
+	public static IBitVector wrap(final int pSize, final byte[] pData) {
+		return new ByteBackedBitVector(pData);
+	}
+	
+	public static IBitVector wrap(final long[] pData) {
+		return new LongBackedBitVector(pData);
+	}
+	
+	public static IBitVector wrap(final int pSize, final long[] pData) {
+		return new LongBackedBitVector(pSize, pData);
 	}
 
-	public BitVector(final byte[] pBytes) {
-		this(pBytes.length * DataConstants.BITS_PER_BYTE);
-
-		final long[] data = this.mData;
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
 
-		/* Check if bytes perfectly fit into the data fields or if there are some overflow bytes that need special treatment. */
-		final boolean perfectDataFit = pBytes.length % DataConstants.BYTES_PER_LONG == 0;
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
 
-		final int dataCapacity = data.length;
-		final int lastCompleteDataIndex = (perfectDataFit) ? dataCapacity - 1 : dataCapacity - 2;
+	// ===========================================================
+	// Methods
+	// ===========================================================
 
-		for (int i = lastCompleteDataIndex; i >= 0; i--) {
-			final int bytesOffset = i * DataConstants.BYTES_PER_LONG;
+	public static int getByteIndex(final int pIndex) {
+		return pIndex / Byte.SIZE;
+	}
 
-			data[i] = ((((long)pBytes[bytesOffset + 0]) << 56) & 0xFF00000000000000L)
-					| ((((long)pBytes[bytesOffset + 1]) << 48) & 0xFF000000000000L)
-					| ((((long)pBytes[bytesOffset + 2]) << 40) & 0xFF0000000000L)
-					| ((((long)pBytes[bytesOffset + 3]) << 32) & 0xFF00000000L)
-					| ((((long)pBytes[bytesOffset + 4]) << 24) & 0xFF000000L)
-					| ((((long)pBytes[bytesOffset + 5]) << 16) & 0xFF0000L)
-					| ((((long)pBytes[bytesOffset + 6]) <<  8) & 0xFF00L)
-					| ((((long)pBytes[bytesOffset + 7]) <<  0) & 0xFFL);
-		}
+	public static int getLongIndex(final int pIndex) {
+		return pIndex / Long.SIZE;
+	}
 
-		/* Put overflow bytes into last data field. */
-		if (!perfectDataFit) {
-			long overflowData = 0;
-
-			final int overflowDataIndex = dataCapacity - 1;
-			final int overflowBytesOffset = overflowDataIndex * DataConstants.BYTES_PER_LONG;
-
-			final int overflowByteCount = pBytes.length - overflowBytesOffset;
-			switch (overflowByteCount) {
-				case 7:
-					overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 6]) <<  8) & 0xFF00L);
-				case 6:
-					overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 5]) << 16) & 0xFF0000L);
-				case 5:
-					overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 4]) << 24) & 0xFF000000L);
-				case 4:
-					overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 3]) << 32) & 0xFF00000000L);
-				case 3:
-					overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 2]) << 40) & 0xFF0000000000L);
-				case 2:
-					overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 1]) << 48) & 0xFF000000000000L);
-				case 1:
-					overflowData = overflowData | ((((long)pBytes[overflowBytesOffset + 0]) << 56) & 0xFF00000000000000L);
-			}
-
-			data[overflowDataIndex] = overflowData;
-		}
+	public static int getIndexInByte(final int pIndex) {
+		return pIndex % Byte.SIZE;
 	}
 
-	// ===========================================================
-	// Getter & Setter
-	// ===========================================================
+	public static int getIndexInLong(final int pIndex) {
+		return pIndex % Long.SIZE;
+	}
 
-	public int getCapacity() {
-		return this.mCapacity;
+	public static int getBitInByte(final byte pByte, final int pIndex) throws IllegalArgumentException {
+		return BitVector.getBitsInByte(pByte, pIndex, 1);
 	}
 
-	public boolean getBit(final int pPosition) {
-		if (pPosition < 0) {
-			throw new IllegalArgumentException("pPosition must be >= 0.");
+	public static int getBitsInByte(final byte pByte, final int pIndex, final int pCount) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + pCount) > Byte.SIZE)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
 		}
-		if (pPosition >= this.mCapacity) {
-			throw new IllegalArgumentException("pPosition must be < capacity.");
+
+		if ((pCount < 0) || (pCount > Byte.SIZE)) {
+			throw new IllegalArgumentException("pBitCount out of bounds: " + pCount);
 		}
 
-		final int dataIndex = pPosition / DataConstants.BITS_PER_LONG;
-		final int dataOffset = pPosition % DataConstants.BITS_PER_LONG;
+		final int shift = Byte.SIZE - pIndex - pCount;
+		final int shiftedByte = ((pByte & 0xFF) >> shift);
 
-		final long dataField = this.mData[dataIndex];
+		final int mask = (0x01 << (pCount)) - 1;
 
-		final int rightShift = DataConstants.BITS_PER_LONG - dataOffset - 1;
-		final long bit = (dataField >> rightShift) & 0x01;
+		final int result = shiftedByte & mask;
 
-		return bit != 0;
+		return result;
 	}
 
-	public byte getByte(final int pPosition) {
-		return (byte) this.getBits(pPosition, DataConstants.BITS_PER_BYTE);
-	}
+	public static byte setBitInByte(final byte pByte, final int pIndex, final boolean pTrue) throws IllegalArgumentException {
+		if ((pIndex < 0) || (pIndex >= Byte.SIZE)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
 
-	public short getShort(final int pPosition) {
-		return (short) this.getBits(pPosition, DataConstants.BITS_PER_SHORT);
-	}
+		if (pTrue) {
+			final int mask = (0x80 >> pIndex);
 
-	public int getInt(final int pPosition) {
-		return (int) this.getBits(pPosition, DataConstants.BITS_PER_INT);
-	}
+			final byte result = (byte)(pByte | mask);
 
-	public long getLong(final int pPosition) {
-		return this.getBits(pPosition, DataConstants.BITS_PER_LONG);
-	}
+			return result;
+		} else {
+			final int mask = 0xFF ^ (0x80 >> pIndex);
 
-	public long getBits(final int pPosition, final int pLength) {
-		/* Sanity checks. */
-		if (pPosition < 0) {
-			throw new IllegalArgumentException("pPosition must be >= 0.");
+			final byte result = (byte)(pByte & mask);
+
+			return result;
 		}
-		if (pLength < 0) {
-			throw new IllegalArgumentException("pLength must be >= 0.");
+	}
+
+	public static byte setBitsInByte(final byte pByte, final int pIndex, final byte pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + pBitCount) > Byte.SIZE)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
 		}
-		if (pPosition + pLength > this.mCapacity) {
-			throw new IllegalArgumentException("pPosition + pLength must be <= capacity.");
+
+		if ((pBitIndex + pBitCount) > Byte.SIZE) {
+			throw new IllegalArgumentException("pBitIndex out of bounds: " + pIndex);
 		}
 
-		/* Early exit. */
-		if (pLength == 0) {
-			return 0L;
+		if ((pBitCount < 0) || (pBitCount > Byte.SIZE)) {
+			throw new IllegalArgumentException("pBitCount out of bounds: " + pIndex);
 		}
 
-		final int dataIndex = pPosition / DataConstants.BITS_PER_LONG;
-		final int offset = pPosition % DataConstants.BITS_PER_LONG;
+		final int sizeMask = (0x01 << (pBitCount)) - 1;
 
-		final long data;
-		if (offset == 0) {
-			data = this.mData[dataIndex];
-		} else if (offset + pLength <= DataConstants.BITS_PER_LONG) {
-			data = this.mData[dataIndex] << offset;
-		} else {
-			/* Join bits from adjacent data fields. */
-			data = (this.mData[dataIndex] << offset) | (this.mData[dataIndex + 1] >>> (DataConstants.BITS_PER_LONG - offset));
-		}
+		final int byteMask = (sizeMask << (Byte.SIZE - (pBitCount + pIndex))) ^ 0xFF;
+		final int maskedByte = (pByte & byteMask) & 0xFF;
+
+		final int bitMask = sizeMask << (Byte.SIZE - (pBitCount + pBitIndex));
+		final int maskedBits = (pBits & bitMask) & 0xFF;
 
-		if (pLength == DataConstants.BITS_PER_LONG) {
-			return data;
+		final int shift = (pBitIndex - pIndex);
+		final int shiftedBits;
+		if (shift < 0) {
+			shiftedBits = maskedBits >> -shift;
 		} else {
-			final int rightShift = DataConstants.BITS_PER_LONG - pLength;
-			final long mask = 0xFFFFFFFFFFFFFFFFL >>> rightShift;
-			final long unmaskedBits = data >> rightShift;
-			return unmaskedBits & mask;
+			shiftedBits = maskedBits << shift;
 		}
-	}
 
-	// ===========================================================
-	// Methods for/from SuperClass/Interfaces
-	// ===========================================================
+		final byte result = (byte)(maskedByte | shiftedBits);
 
-	@Override
-	public String toString() {
-		final StringBuilder sb = new StringBuilder();
-		sb.append('[');
-		for (int i = 0; i < this.mCapacity; i++) {
-			sb.append(this.getBit(i) ? '1' : '0');
-			if (i % 8 == 7 && i < this.mCapacity -1) {
-				sb.append(' ');
-			}
-		}
-		sb.append(']');
-		return sb.toString();
+		return result;
 	}
 
-	// ===========================================================
-	// Methods
-	// ===========================================================
+	public static int calculateByteSize(final int pBitSize) {
+		if (pBitSize < 0) {
+			throw new IllegalArgumentException("pBitSize out of bounds: " + pBitSize);
+		}
 
-	public byte[] toByteArray() {
-		final int byteArrayLength;
-		if (this.mCapacity % DataConstants.BITS_PER_BYTE == 0) {
-			byteArrayLength = this.mCapacity / DataConstants.BITS_PER_BYTE;
+		if (BitVector.getIndexInByte(pBitSize) == 0) {
+			return pBitSize / Byte.SIZE;
 		} else {
-			byteArrayLength = (this.mCapacity / DataConstants.BITS_PER_BYTE) + 1;
+			return 1 + (pBitSize / Byte.SIZE);
 		}
+	}
 
-		final byte[] bytes = new byte[byteArrayLength];
-		/* Check if bytes perfectly fit into the data fields or if there are some overflow bytes that need special treatment. */
-		final boolean perfectDataFit = this.mCapacity % DataConstants.BITS_PER_LONG == 0;
-
-		final long[] data = this.mData;
-		final int dataCapacity = data.length;
-		final int lastCompleteDataIndex = (perfectDataFit) ? dataCapacity - 1 : dataCapacity - 2;
-
-		int bytesOffset = lastCompleteDataIndex * DataConstants.BYTES_PER_LONG + (DataConstants.BYTES_PER_LONG - 1);
-		for (int i = lastCompleteDataIndex; i >= 0; i--) {
-			final long dataField = data[i];
-
-			bytes[bytesOffset--] = (byte) ((dataField >> 0) & 0xFF);
-			bytes[bytesOffset--] = (byte) ((dataField >> 8) & 0xFF);
-			bytes[bytesOffset--] = (byte) ((dataField >> 16) & 0xFF);
-			bytes[bytesOffset--] = (byte) ((dataField >> 24) & 0xFF);
-			bytes[bytesOffset--] = (byte) ((dataField >> 32) & 0xFF);
-			bytes[bytesOffset--] = (byte) ((dataField >> 40) & 0xFF);
-			bytes[bytesOffset--] = (byte) ((dataField >> 48) & 0xFF);
-			bytes[bytesOffset--] = (byte) ((dataField >> 56) & 0xFF);
+	public static int calculateLongSize(final int pBitSize) {
+		if (pBitSize < 0) {
+			throw new IllegalArgumentException("pBitSize out of bounds: " + pBitSize);
 		}
 
-		/* Put overflow bytes into last data field. */
-		if (!perfectDataFit) {
-			final int overflowDataIndex = dataCapacity - 1;
-			final long overflowDataField = data[overflowDataIndex];
-
-			final int overflowBytesOffset = overflowDataIndex * DataConstants.BYTES_PER_LONG;
-
-			final int overflowByteCount = bytes.length % DataConstants.BYTES_PER_LONG;
-			switch (overflowByteCount) {
-				case 7:
-					bytes[overflowBytesOffset + 6] = (byte) ((overflowDataField >> 8) & 0xFF);
-				case 6:
-					bytes[overflowBytesOffset + 5] = (byte) ((overflowDataField >> 16) & 0xFF);
-				case 5:
-					bytes[overflowBytesOffset + 4] = (byte) ((overflowDataField >> 24) & 0xFF);
-				case 4:
-					bytes[overflowBytesOffset + 3] = (byte) ((overflowDataField >> 32) & 0xFF);
-				case 3:
-					bytes[overflowBytesOffset + 2] = (byte) ((overflowDataField >> 40) & 0xFF);
-				case 2:
-					bytes[overflowBytesOffset + 1] = (byte) ((overflowDataField >> 48) & 0xFF);
-				case 1:
-					bytes[overflowBytesOffset + 0] = (byte) ((overflowDataField >> 56) & 0xFF);
-			}
+		if (BitVector.getIndexInLong(pBitSize) == 0) {
+			return pBitSize / Byte.SIZE;
+		} else {
+			return 1 + (pBitSize / Byte.SIZE);
 		}
-
-		return bytes;
 	}
 
 	// ===========================================================
 	// Inner and Anonymous Classes
 	// ===========================================================
-}
\ No newline at end of file
+}
diff --git a/src/org/andengine/util/adt/bit/ByteBackedBitVector.java b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
new file mode 100644
index 000000000..7e047ed4d
--- /dev/null
+++ b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
@@ -0,0 +1,412 @@
+package org.andengine.util.adt.bit;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.andengine.util.adt.DataConstants;
+import org.andengine.util.exception.MethodNotYetImplementedException;
+
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ *
+ * @author Nicolas Gramlich
+ * @since Nov 20, 2012
+ */
+public class ByteBackedBitVector extends BitVector implements IBitVector {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	private final int mSize;
+	private final byte[] mData;
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public ByteBackedBitVector(final int pSize) throws IllegalArgumentException {
+		this(pSize, new byte[BitVector.calculateByteSize(pSize)]);
+	}
+
+	public ByteBackedBitVector(final byte[] pData) throws IllegalArgumentException, NullPointerException {
+		this(pData.length * Byte.SIZE, pData);
+	}
+
+	public ByteBackedBitVector(final int pSize, final byte[] pData) throws IllegalArgumentException, NullPointerException {
+		if (pData == null){
+			throw new IllegalArgumentException("pData must not be null");
+		}
+
+		if (pSize > (pData.length * Byte.SIZE)) {
+			throw new IllegalArgumentException("pData is too short.");
+		}
+
+		if (BitVector.calculateByteSize(pSize) < pData.length) {
+			throw new IllegalArgumentException("pData is too long.");
+		}
+
+		this.mSize = pSize;
+
+		this.mData = pData;
+	}
+
+	public ByteBackedBitVector(final DataInputStream pDataInputStream) throws IOException {
+		this.mSize = pDataInputStream.readInt();
+		this.mData = new byte[BitVector.calculateByteSize(this.mSize)];
+
+		pDataInputStream.readFully(this.mData);
+	}
+
+	public static ByteBackedBitVector load(final DataInputStream pDataInputStream) throws IOException {
+		return new ByteBackedBitVector(pDataInputStream);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	@Override
+	public int getSize() {
+		return this.mSize;
+	}
+
+	public int getByteSize() {
+		return this.mData.length;
+	}
+
+	@Override
+	public int getBit(final int pIndex) throws IllegalArgumentException {
+		if ((pIndex < 0) || (pIndex >= this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final int byteIndex = BitVector.getByteIndex(pIndex);
+		final int indexInByte = BitVector.getIndexInByte(pIndex);
+
+		return BitVector.getBitInByte(this.mData[byteIndex], indexInByte);
+	}
+
+	@Override
+	public boolean getBitAsBoolean(final int pIndex) throws IllegalArgumentException {
+		return this.getBit(pIndex) == BitVector.TRUE;
+	}
+
+	@Override
+	public void setBit(final int pIndex) throws IllegalArgumentException {
+		this.setBit(pIndex, true);
+	}
+
+	@Override
+	public void clearBit(final int pIndex) throws IllegalArgumentException {
+		this.setBit(pIndex, false);
+	}
+
+	@Override
+	public void setBit(final int pIndex, final boolean pTrue) throws IllegalArgumentException {
+		if ((pIndex < 0) || (pIndex >= this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final int byteIndex = BitVector.getByteIndex(pIndex);
+		final int indexInByte = BitVector.getIndexInByte(pIndex);
+		final byte oldByte = this.mData[byteIndex];
+
+		final byte newByte = BitVector.setBitInByte(oldByte, indexInByte, pTrue);
+		this.mData[byteIndex] = newByte;
+	}
+
+	@Override
+	public int getBits(final int pIndex, final int pCount) throws IllegalArgumentException {
+		if ((pIndex < 0) || (pIndex + pCount > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		int bits = 0;
+
+		int bitsLeft = pCount;
+		int index = pIndex;
+		while (bitsLeft >= Byte.SIZE) {
+			bits = bits << Byte.SIZE;
+			bits |= (this.getByte(index)) & 0xFF;
+			index += Byte.SIZE;
+			bitsLeft -= Byte.SIZE;
+		}
+
+		for (int i = 0; i < bitsLeft; i++) {
+			bits = bits << 1;
+			if(this.getBit(index) == BitVector.TRUE) {
+				bits |= 0x01;
+			}
+			index++;
+		}
+
+		return bits;
+	}
+
+	@Override
+	public long getLongBits(final int pIndex, final int pLength) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public void setBits(final int pIndex, final byte pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + pBitCount) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		if ((pBitIndex < 0) || ((pBitIndex + pBitCount) > Byte.SIZE)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pBitIndex);
+		}
+
+		final int indexInByte = BitVector.getIndexInByte(pIndex);
+		final int byteIndex = BitVector.getByteIndex(pIndex);
+		if (indexInByte == 0) {
+			/* Perfect match, easy get. */
+			final byte newByte = BitVector.setBitsInByte(this.mData[byteIndex], 0, pBits, pBitIndex, pBitCount);
+			this.mData[byteIndex] = newByte;
+		} else {
+			final byte highByte = this.mData[byteIndex];
+			final int highByteBitCount = Math.min(pBitCount, Byte.SIZE - indexInByte);
+
+			final byte newHighByte = BitVector.setBitsInByte(highByte, indexInByte, pBits, pBitIndex, highByteBitCount);
+			this.mData[byteIndex] = newHighByte;
+
+			if (highByteBitCount < pBitCount) {
+				final byte lowByte = this.mData[byteIndex + 1];
+				final int lowByteBitIndex = pBitIndex + highByteBitCount;
+				final int lowByteBitCount = pBitCount - highByteBitCount;
+
+				final byte newLowByte = BitVector.setBitsInByte(lowByte, 0, pBits, lowByteBitIndex, lowByteBitCount);
+				this.mData[byteIndex + 1] = newLowByte;
+			}
+		}
+	}
+
+	@Override
+	public void setBits(final int pIndex, final short pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + pBitCount) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		if ((pBitIndex < 0) || ((pBitIndex + pBitCount) > Short.SIZE)) {
+			throw new IllegalArgumentException("pBitIndex out of bounds: " + pBitIndex);
+		}
+
+		final int highByteBitCount = Math.min(pBitCount, Math.max(0, Byte.SIZE - pBitIndex));
+		if (highByteBitCount != 0) {
+			final byte highByte = (byte)((pBits >> (1 * Byte.SIZE)) & 0xFF);
+			this.setBits(pIndex, highByte, pBitIndex, highByteBitCount);
+		}
+
+		if (pBitCount > highByteBitCount) {
+			final byte lowByte = (byte)((pBits >> (0 * Byte.SIZE)) & 0xFF);
+			final int lowByteBitCount = pBitCount - highByteBitCount;
+
+			if(highByteBitCount == 0) {
+				this.setBits(pIndex, lowByte, (pBitIndex - Byte.SIZE) % Byte.SIZE, lowByteBitCount);
+			} else {
+				this.setBits(pIndex + highByteBitCount, lowByte, 0, lowByteBitCount);
+			}
+		}
+	}
+
+	@Override
+	public void setBits(final int pIndex, final int pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + pBitCount) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		if ((pBitIndex < 0) || ((pBitIndex + pBitCount) > Integer.SIZE)) {
+			throw new IllegalArgumentException("pBitIndex out of bounds: " + pBitIndex);
+		}
+
+		final int highShortBitCount = Math.min(pBitCount, Math.max(0, Short.SIZE - pBitIndex));
+		if (highShortBitCount != 0) {
+			final short highShort = (short)((pBits >> (1 * Short.SIZE)) & 0xFFFF);
+			this.setBits(pIndex, highShort, pBitIndex, highShortBitCount);
+		}
+
+		if (pBitCount > highShortBitCount) {
+			final short lowShort = (short)((pBits >> (0 * Short.SIZE)) & 0xFFFF);
+			final int lowShortBitCount = pBitCount - highShortBitCount;
+
+			if(highShortBitCount == 0) {
+				this.setBits(pIndex, lowShort, (pBitIndex - Short.SIZE) % Short.SIZE, lowShortBitCount);
+			} else {
+				this.setBits(pIndex + highShortBitCount, lowShort, 0, lowShortBitCount);
+			}
+		}
+	}
+
+	@Override
+	public byte getByte(final int pIndex) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + Byte.SIZE) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final int indexInByte = BitVector.getIndexInByte(pIndex);
+		final int byteIndex = BitVector.getByteIndex(pIndex);
+		if (indexInByte == 0) {
+			/* Perfect match, easy get. */
+			return this.mData[byteIndex];
+		} else {
+			final byte highByte = this.mData[byteIndex];
+			final byte lowByte = this.mData[byteIndex + 1];
+
+			final int highBits = BitVector.getBitsInByte(highByte, indexInByte, Byte.SIZE - indexInByte);
+			final int lowBits = BitVector.getBitsInByte(lowByte, 0, indexInByte);
+
+			final int result = (highBits << indexInByte) + lowBits;
+
+			return (byte)result;
+		}
+	}
+
+	@Override
+	public final void setByte(final int pIndex, final byte pByte) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + Byte.SIZE) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final int indexInByte = BitVector.getIndexInByte(pIndex);
+		final int byteIndex = BitVector.getByteIndex(pIndex);
+		if (indexInByte == 0) {
+			/* Perfect match, easy set. */
+			this.mData[byteIndex] = pByte;
+		} else {
+			final byte highByte = this.mData[byteIndex];
+			final byte lowByte = this.mData[byteIndex + 1];
+
+			this.mData[byteIndex] = BitVector.setBitsInByte(highByte, indexInByte, pByte, 0, Byte.SIZE - indexInByte);
+			this.mData[byteIndex + 1] = BitVector.setBitsInByte(lowByte, 0, pByte, Byte.SIZE - indexInByte, indexInByte);
+		}
+	}
+
+	@Override
+	public short getShort(final int pIndex) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + Short.SIZE) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final int highByte = this.getByte(pIndex) & 0xFF;
+		final int lowByte = this.getByte(pIndex + Byte.SIZE) & 0xFF;
+
+		final short result = (short)((highByte << Byte.SIZE) | lowByte);
+
+		return result;
+	}
+
+	@Override
+	public final void setShort(final int pIndex, final short pShort) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + Short.SIZE) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final byte highByte = (byte)((pShort >> Byte.SIZE) & 0xFF);
+		final byte lowByte = (byte)(pShort & 0xFF);
+
+		this.setByte(pIndex, highByte);
+		this.setByte(pIndex + Byte.SIZE, lowByte);
+	}
+
+	@Override
+	public int getInt(final int pIndex) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + Integer.SIZE) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final int highestByte = this.getByte(pIndex + (0 * Byte.SIZE)) & 0xFF;
+		final int highByte = this.getByte(pIndex + (1 * Byte.SIZE)) & 0xFF;
+		final int lowByte = this.getByte(pIndex + (2 * Byte.SIZE)) & 0xFF;
+		final int lowestByte = this.getByte(pIndex + (3 * Byte.SIZE)) & 0xFF;
+
+		final int result = (highestByte << (3 * Byte.SIZE)) | (highByte << (2 * Byte.SIZE)) | (lowByte << (1 * Byte.SIZE)) | lowestByte;
+
+		return result;
+	}
+
+	@Override
+	public void setInt(final int pIndex, final int pInt) throws IllegalArgumentException {
+		if ((pIndex < 0) || ((pIndex + Integer.SIZE) > this.mSize)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		this.setByte(pIndex + (0 * Byte.SIZE), (byte)((pInt >> (3 * Byte.SIZE)) & 0xFF));
+		this.setByte(pIndex + (1 * Byte.SIZE), (byte)((pInt >> (2 * Byte.SIZE)) & 0xFF));
+		this.setByte(pIndex + (2 * Byte.SIZE), (byte)((pInt >> (1 * Byte.SIZE)) & 0xFF));
+		this.setByte(pIndex + (3 * Byte.SIZE), (byte)((pInt >> (0 * Byte.SIZE)) & 0xFF));
+	}
+
+	@Override
+	public long getLong(final int pIndex) throws IllegalArgumentException {
+		return this.getLongBits(pIndex, DataConstants.BITS_PER_LONG);
+	}
+
+	@Override
+	public void setLong(final int pIndex, final long pLong) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public void clear() {
+		this.fill((byte)0x00);
+	}
+
+	@Override
+	public void fill(final byte pByte) {
+		Arrays.fill(this.mData, pByte);
+	}
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	@Override
+	public void save(final DataOutputStream pDataOutputStream) throws IOException {
+		pDataOutputStream.writeInt(this.mSize);
+		pDataOutputStream.write(this.mData);
+	}
+
+	@Override
+	public byte[] toByteArray() {
+		final byte[] bytes = new byte[this.mData.length];
+		System.arraycopy(this.mData, 0, bytes, 0, this.mData.length);
+		return bytes;
+	}
+
+	@Override
+	public String toString() {
+		final StringBuilder stringBuilder = new StringBuilder();
+		stringBuilder.append('[');
+
+		for (int i = 0; i < this.mSize; i++) {
+			if (this.getBit(i) == BitVector.TRUE) {
+				stringBuilder.append('1');
+			} else {
+				stringBuilder.append('0');
+			}
+
+			if (((i % Byte.SIZE) == 7) && (i < (this.mSize - 1))) {
+				stringBuilder.append(',').append(' ');
+			}
+		}
+
+		stringBuilder.append(']');
+		return stringBuilder.toString();
+	}
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/adt/bit/IBitVector.java b/src/org/andengine/util/adt/bit/IBitVector.java
new file mode 100644
index 000000000..9f8832014
--- /dev/null
+++ b/src/org/andengine/util/adt/bit/IBitVector.java
@@ -0,0 +1,53 @@
+package org.andengine.util.adt.bit;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+/**
+ * (c) Zynga 2013
+ *
+ * @author Nicolas Gramlich 
+ * @since 18:14:12 - 02.03.2013
+ */
+public interface IBitVector {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public int getSize();
+	public int getBit(final int pIndex) throws IllegalArgumentException;
+	public void setBit(final int pIndex) throws IllegalArgumentException;
+	public void clearBit(final int pIndex) throws IllegalArgumentException;
+	public void setBit(final int pIndex, final boolean pTrue) throws IllegalArgumentException;
+	boolean getBitAsBoolean(int pIndex) throws IllegalArgumentException;
+
+	public byte getByte(final int pIndex) throws IllegalArgumentException;
+	public void setByte(final int pIndex, final byte pByte) throws IllegalArgumentException;
+
+	public short getShort(final int pIndex) throws IllegalArgumentException;
+	public void setShort(final int pIndex, final short pShort) throws IllegalArgumentException;
+
+	public int getInt(final int pIndex) throws IllegalArgumentException;
+	public void setInt(final int pIndex, final int pInt) throws IllegalArgumentException;
+
+	public long getLong(final int pIndex) throws IllegalArgumentException;
+	public void setLong(final int pIndex, final long pLong) throws IllegalArgumentException;
+
+	public int getBits(final int pIndex, final int pLength) throws IllegalArgumentException;
+	public void setBits(final int pIndex, final byte pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException;
+	public void setBits(final int pIndex, final short pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException;
+	public void setBits(final int pIndex, final int pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException;
+
+	public long getLongBits(int pIndex, int pLength) throws IllegalArgumentException;
+
+	public byte[] toByteArray();
+
+	public void save(final DataOutputStream pDataOutputStream) throws IOException;
+
+	public void clear();
+	public void fill(final byte pByte);
+}
\ No newline at end of file
diff --git a/src/org/andengine/util/adt/bit/LongBackedBitVector.java b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
new file mode 100644
index 000000000..7705d9030
--- /dev/null
+++ b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
@@ -0,0 +1,398 @@
+package org.andengine.util.adt.bit;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.andengine.util.adt.DataConstants;
+import org.andengine.util.exception.MethodNotYetImplementedException;
+
+
+/**
+ * (c) Zynga 2011
+ *
+ * @author Nicolas Gramlich 
+ * @since 15:56:32 - 30.10.2011
+ */
+public class LongBackedBitVector extends BitVector implements IBitVector {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	private final int mSize;
+	private final long[] mData;
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public LongBackedBitVector(final int pSize) throws IllegalArgumentException {
+		if (pSize <= 0) {
+			throw new IllegalArgumentException("pSize must be > 0.");
+		}
+		this.mSize = pSize;
+
+		/* Check if bytes perfectly fit into the data fields or if there are some overflow bytes that need special treatment. */
+		final boolean perfectDataFit = (pSize % DataConstants.BITS_PER_LONG) == 0;
+
+		final int dataLength;
+		if (perfectDataFit) {
+			dataLength = pSize / DataConstants.BITS_PER_LONG;
+		} else {
+			/* Extra field for overflow bytes. */
+			dataLength = (pSize / DataConstants.BITS_PER_LONG) + 1;
+		}
+		this.mData = new long[dataLength];
+	}
+
+	public LongBackedBitVector(final long[] pData) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	public LongBackedBitVector(final int pSize, final long[] pData) throws IllegalArgumentException {
+		if (pData == null){
+			throw new IllegalArgumentException("pData must not be null");
+		}
+
+		if (pSize > (pData.length * Long.SIZE)) {
+			throw new IllegalArgumentException("pData is too short.");
+		}
+
+		if (BitVector.calculateLongSize(pSize) < pData.length) {
+			throw new IllegalArgumentException("pData is too long.");
+		}
+
+		throw new MethodNotYetImplementedException();
+	}
+
+	public LongBackedBitVector(final byte[] pData) throws IllegalArgumentException, NullPointerException {
+		this(pData.length * DataConstants.BITS_PER_BYTE);
+
+		final long[] data = this.mData;
+
+		/* Check if bytes perfectly fit into the data fields or if there are some overflow bytes that need special treatment. */
+		final boolean perfectDataFit = (pData.length % DataConstants.BYTES_PER_LONG) == 0;
+
+		final int dataLength = data.length;
+		final int lastCompleteDataIndex = (perfectDataFit) ? dataLength - 1 : dataLength - 2;
+
+		for (int i = lastCompleteDataIndex; i >= 0; i--) {
+			final int bytesOffset = i * DataConstants.BYTES_PER_LONG;
+
+			data[i] = ((((long)pData[bytesOffset + 0]) << 56) & 0xFF00000000000000L)
+					| ((((long)pData[bytesOffset + 1]) << 48) & 0xFF000000000000L)
+					| ((((long)pData[bytesOffset + 2]) << 40) & 0xFF0000000000L)
+					| ((((long)pData[bytesOffset + 3]) << 32) & 0xFF00000000L)
+					| ((((long)pData[bytesOffset + 4]) << 24) & 0xFF000000L)
+					| ((((long)pData[bytesOffset + 5]) << 16) & 0xFF0000L)
+					| ((((long)pData[bytesOffset + 6]) <<  8) & 0xFF00L)
+					| ((((long)pData[bytesOffset + 7]) <<  0) & 0xFFL);
+		}
+
+		/* Put overflow bytes into last data field. */
+		if (!perfectDataFit) {
+			long overflowData = 0;
+
+			final int overflowDataIndex = dataLength - 1;
+			final int overflowBytesOffset = overflowDataIndex * DataConstants.BYTES_PER_LONG;
+
+			final int overflowByteCount = pData.length - overflowBytesOffset;
+			switch (overflowByteCount) {
+				case 7:
+					overflowData = overflowData | ((((long)pData[overflowBytesOffset + 6]) <<  8) & 0xFF00L);
+				case 6:
+					overflowData = overflowData | ((((long)pData[overflowBytesOffset + 5]) << 16) & 0xFF0000L);
+				case 5:
+					overflowData = overflowData | ((((long)pData[overflowBytesOffset + 4]) << 24) & 0xFF000000L);
+				case 4:
+					overflowData = overflowData | ((((long)pData[overflowBytesOffset + 3]) << 32) & 0xFF00000000L);
+				case 3:
+					overflowData = overflowData | ((((long)pData[overflowBytesOffset + 2]) << 40) & 0xFF0000000000L);
+				case 2:
+					overflowData = overflowData | ((((long)pData[overflowBytesOffset + 1]) << 48) & 0xFF000000000000L);
+				case 1:
+					overflowData = overflowData | ((((long)pData[overflowBytesOffset + 0]) << 56) & 0xFF00000000000000L);
+			}
+
+			data[overflowDataIndex] = overflowData;
+		}
+	}
+
+	public LongBackedBitVector(final DataInputStream pDataInputStream) throws IOException {
+		this.mSize = pDataInputStream.readInt();
+		this.mData = new long[BitVector.calculateLongSize(this.mSize)];
+
+		throw new MethodNotYetImplementedException();
+
+//		pDataInputStream.readFully(this.mData);
+	}
+
+	public static LongBackedBitVector load(final DataInputStream pDataInputStream) throws IOException {
+		return new LongBackedBitVector(pDataInputStream);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	@Override
+	public int getSize() {
+		return this.mSize;
+	}
+
+	@Override
+	public int getBit(final int pIndex) throws IllegalArgumentException {
+		if (pIndex < 0) {
+			throw new IllegalArgumentException("pIndex must be >= 0.");
+		}
+		if (pIndex >= this.mSize) {
+			throw new IllegalArgumentException("pIndex must be < size.");
+		}
+
+		final int dataIndex = pIndex / DataConstants.BITS_PER_LONG;
+		final int dataOffset = pIndex % DataConstants.BITS_PER_LONG;
+
+		final long dataField = this.mData[dataIndex];
+
+		final int rightShift = DataConstants.BITS_PER_LONG - dataOffset - 1;
+		final long dataBit = (dataField >> rightShift) & 0x01;
+		final int bit = (int)dataBit;
+
+		return bit;
+	}
+
+	@Override
+	public boolean getBitAsBoolean(final int pIndex) throws IllegalArgumentException {
+		return this.getBit(pIndex) == BitVector.TRUE;
+	}
+
+	@Override
+	public void setBit(final int pIndex) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public void clearBit(final int pIndex) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public void setBit(final int pIndex, final boolean pTrue) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public int getBits(final int pIndex, final int pLength) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public long getLongBits(final int pIndex, final int pLength) throws IllegalArgumentException {
+		/* Sanity checks. */
+		if (pIndex < 0) {
+			throw new IllegalArgumentException("pIndex must be >= 0.");
+		}
+		if (pLength < 0) {
+			throw new IllegalArgumentException("pLength must be >= 0.");
+		}
+		if ((pIndex + pLength) > this.mSize) {
+			throw new IllegalArgumentException("pIndex + pLength must be <= size.");
+		}
+
+		/* Early exit. */
+		if (pLength == 0) {
+			return 0L;
+		}
+
+		final int dataIndex = pIndex / DataConstants.BITS_PER_LONG;
+		final int offset = pIndex % DataConstants.BITS_PER_LONG;
+
+		final long data;
+		if (offset == 0) {
+			data = this.mData[dataIndex];
+		} else if ((offset + pLength) <= DataConstants.BITS_PER_LONG) {
+			data = this.mData[dataIndex] << offset;
+		} else {
+			/* Join bits from adjacent data fields. */
+			data = (this.mData[dataIndex] << offset) | (this.mData[dataIndex + 1] >>> (DataConstants.BITS_PER_LONG - offset));
+		}
+
+		if (pLength == DataConstants.BITS_PER_LONG) {
+			return data;
+		} else {
+			final int rightShift = DataConstants.BITS_PER_LONG - pLength;
+			final long mask = 0xFFFFFFFFFFFFFFFFL >>> rightShift;
+		final long unmaskedBits = data >> rightShift;
+					return unmaskedBits & mask;
+		}
+	}
+
+
+	@Override
+	public void setBits(final int pIndex, final byte pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public void setBits(final int pIndex, final short pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public void setBits(final int pIndex, final int pBits, final int pBitIndex, final int pBitCount) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public byte getByte(final int pIndex) throws IllegalArgumentException {
+		return (byte) this.getBits(pIndex, DataConstants.BITS_PER_BYTE);
+	}
+
+	@Override
+	public void setByte(final int pIndex, final byte pByte) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public short getShort(final int pIndex) throws IllegalArgumentException {
+		return (short) this.getBits(pIndex, DataConstants.BITS_PER_SHORT);
+	}
+
+	@Override
+	public void setShort(final int pIndex, final short pShort) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public int getInt(final int pIndex) throws IllegalArgumentException {
+		return this.getBits(pIndex, DataConstants.BITS_PER_INT);
+	}
+
+	@Override
+	public void setInt(final int pIndex, final int pInt) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public long getLong(final int pIndex) throws IllegalArgumentException {
+		return this.getLongBits(pIndex, DataConstants.BITS_PER_LONG);
+	}
+
+	@Override
+	public void setLong(final int pIndex, final long pLong) throws IllegalArgumentException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public void clear() {
+		Arrays.fill(this.mData, 0x00);
+	}
+
+	@Override
+	public void fill(final byte pByte) {
+		throw new MethodNotYetImplementedException();
+	}
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	@Override
+	public void save(final DataOutputStream pDataOutputStream) throws IOException {
+		throw new MethodNotYetImplementedException();
+	}
+
+	@Override
+	public byte[] toByteArray() {
+		final int byteArrayLength;
+		if ((this.mSize % DataConstants.BITS_PER_BYTE) == 0) {
+			byteArrayLength = this.mSize / DataConstants.BITS_PER_BYTE;
+		} else {
+			byteArrayLength = (this.mSize / DataConstants.BITS_PER_BYTE) + 1;
+		}
+
+		final byte[] bytes = new byte[byteArrayLength];
+		/* Check if bytes perfectly fit into the data fields or if there are some overflow bytes that need special treatment. */
+		final boolean perfectDataFit = (this.mSize % DataConstants.BITS_PER_LONG) == 0;
+
+		final long[] data = this.mData;
+		final int dataLength = data.length;
+		final int lastCompleteDataIndex = (perfectDataFit) ? dataLength - 1 : dataLength - 2;
+
+		int bytesOffset = (lastCompleteDataIndex * DataConstants.BYTES_PER_LONG) + (DataConstants.BYTES_PER_LONG - 1);
+		for (int i = lastCompleteDataIndex; i >= 0; i--) {
+			final long dataField = data[i];
+
+			bytes[bytesOffset--] = (byte) ((dataField >> 0) & 0xFF);
+			bytes[bytesOffset--] = (byte) ((dataField >> 8) & 0xFF);
+			bytes[bytesOffset--] = (byte) ((dataField >> 16) & 0xFF);
+			bytes[bytesOffset--] = (byte) ((dataField >> 24) & 0xFF);
+			bytes[bytesOffset--] = (byte) ((dataField >> 32) & 0xFF);
+			bytes[bytesOffset--] = (byte) ((dataField >> 40) & 0xFF);
+			bytes[bytesOffset--] = (byte) ((dataField >> 48) & 0xFF);
+			bytes[bytesOffset--] = (byte) ((dataField >> 56) & 0xFF);
+		}
+
+		/* Put overflow bytes into last data field. */
+		if (!perfectDataFit) {
+			final int overflowDataIndex = dataLength - 1;
+			final long overflowDataField = data[overflowDataIndex];
+
+			final int overflowBytesOffset = overflowDataIndex * DataConstants.BYTES_PER_LONG;
+
+			final int overflowByteCount = bytes.length % DataConstants.BYTES_PER_LONG;
+			switch (overflowByteCount) {
+				case 7:
+					bytes[overflowBytesOffset + 6] = (byte) ((overflowDataField >> 8) & 0xFF);
+				case 6:
+					bytes[overflowBytesOffset + 5] = (byte) ((overflowDataField >> 16) & 0xFF);
+				case 5:
+					bytes[overflowBytesOffset + 4] = (byte) ((overflowDataField >> 24) & 0xFF);
+				case 4:
+					bytes[overflowBytesOffset + 3] = (byte) ((overflowDataField >> 32) & 0xFF);
+				case 3:
+					bytes[overflowBytesOffset + 2] = (byte) ((overflowDataField >> 40) & 0xFF);
+				case 2:
+					bytes[overflowBytesOffset + 1] = (byte) ((overflowDataField >> 48) & 0xFF);
+				case 1:
+					bytes[overflowBytesOffset + 0] = (byte) ((overflowDataField >> 56) & 0xFF);
+			}
+		}
+
+		return bytes;
+	}
+
+	@Override
+	public String toString() {
+		final StringBuilder stringBuilder = new StringBuilder();
+		stringBuilder.append('[');
+
+		for (int i = 0; i < this.mSize; i++) {
+			if (this.getBit(i) == BitVector.TRUE) {
+				stringBuilder.append('1');
+			} else {
+				stringBuilder.append('0');
+			}
+
+			if (((i % Byte.SIZE) == 7) && (i < (this.mSize - 1))) {
+				stringBuilder.append(',').append(' ');
+			}
+		}
+
+		stringBuilder.append(']');
+		return stringBuilder.toString();
+	}
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
\ No newline at end of file
diff --git a/src/org/andengine/util/adt/data/DataUtils.java b/src/org/andengine/util/adt/data/DataUtils.java
index ebc0ab98f..eeb4f2071 100644
--- a/src/org/andengine/util/adt/data/DataUtils.java
+++ b/src/org/andengine/util/adt/data/DataUtils.java
@@ -34,6 +34,10 @@ public static final int unsignedByteToInt(final byte pByte) {
 		return pByte & 0xFF;
 	}
 
+	public static final int getBitLength(final int pNumber) {
+		return Integer.SIZE - Integer.numberOfLeadingZeros(pNumber);
+	}
+
 	// ===========================================================
 	// Methods
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/dictionary/Dictionary.java b/src/org/andengine/util/adt/dictionary/Dictionary.java
new file mode 100644
index 000000000..ea357dbe5
--- /dev/null
+++ b/src/org/andengine/util/adt/dictionary/Dictionary.java
@@ -0,0 +1,487 @@
+package org.andengine.util.adt.dictionary;
+
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.andengine.util.FileUtils;
+import org.andengine.util.StreamUtils;
+import org.andengine.util.adt.bit.BitVector;
+import org.andengine.util.adt.bit.ByteBackedBitVector;
+import org.andengine.util.adt.bit.IBitVector;
+import org.andengine.util.adt.bit.LongBackedBitVector;
+import org.andengine.util.adt.data.DataUtils;
+
+
+/**
+ * @author Nicolas Gramlich
+ * @since Nov 20, 2012
+ */
+public class Dictionary {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final short VERSION = 1;
+
+	private static final Comparator CASEINSENSITIVE_REVERSE_LEXICOGRAPHICAL_COMPARATOR = new Comparator() {
+		@Override
+		public int compare(final String pStringA, final String pStringB) {
+			return -(pStringA.compareTo(pStringB));
+		}
+	};
+
+	private static final int OFFSET_VERSION = 0;
+	private static final int SIZE_VERSION = Short.SIZE;
+
+	private static final int OFFSET_CHARACTER_COUNT = Dictionary.OFFSET_VERSION + Dictionary.SIZE_VERSION;
+	private static final int SIZE_CHARACTER_COUNT = Integer.SIZE;
+
+	private static final int OFFSET_CHARACTER_BITLENGTH = Dictionary.OFFSET_CHARACTER_COUNT + Dictionary.SIZE_CHARACTER_COUNT;
+	private static final int SIZE_CHARACTER_BITLENGTH = Byte.SIZE;
+
+	private static final int OFFSET_INDEXENTRY_COUNT = Dictionary.OFFSET_CHARACTER_BITLENGTH + Dictionary.SIZE_CHARACTER_BITLENGTH;
+	private static final int SIZE_INDEXENTRY_COUNT = Integer.SIZE;
+
+	private static final int OFFSET_INDEXENTRY_STARTINDEX_BITLENGTH = Dictionary.OFFSET_INDEXENTRY_COUNT + Dictionary.SIZE_INDEXENTRY_COUNT;
+	private static final int SIZE_INDEXENTRY_STARTINDEX_BITLENGTH = Byte.SIZE;
+
+	private static final int OFFSET_INDEXENTRY_LENGTH_BITLENGTH = Dictionary.OFFSET_INDEXENTRY_STARTINDEX_BITLENGTH + Dictionary.SIZE_INDEXENTRY_STARTINDEX_BITLENGTH;
+	private static final int SIZE_INDEXENTRY_LENGTH_BITLENGTH = Byte.SIZE;
+
+	private static final int OFFSET_CHARACTERS = Dictionary.OFFSET_INDEXENTRY_LENGTH_BITLENGTH + Dictionary.SIZE_INDEXENTRY_LENGTH_BITLENGTH;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	private final short mVersion;
+	private final IBitVector mBitVector;
+
+	private final int mCharacterCount;
+	private final int mCharacterBitLength;
+	private final char[] mCharacterTable;
+
+	private final int mEntryCount;
+	private final int mEntryStartIndexBitLength;
+	private final int mEntryLengthBitLength;
+
+	private final int mEntriesOffset;
+	private final int mCharacterSequenceOffset;
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public Dictionary(final byte[] pBytes) {
+		this(new LongBackedBitVector(pBytes));
+	}
+
+	public Dictionary(final IBitVector pBitVector) {
+		this.mBitVector = pBitVector;
+
+		this.mVersion = this.mBitVector.getShort(Dictionary.OFFSET_VERSION);
+		if (this.mVersion != Dictionary.VERSION) {
+			throw new IllegalArgumentException("Illegal version: " + this.mVersion);
+		}
+
+		this.mCharacterCount = this.mBitVector.getInt(Dictionary.OFFSET_CHARACTER_COUNT);
+		this.mCharacterBitLength = this.mBitVector.getByte(Dictionary.OFFSET_CHARACTER_BITLENGTH);
+		this.mCharacterTable = new char[this.mCharacterCount];
+		for (int i = 0; i < this.mCharacterCount; i++) {
+			this.mCharacterTable[i] = (char)this.mBitVector.getShort(Dictionary.OFFSET_CHARACTERS + (i * Character.SIZE));
+		}
+
+		this.mEntryCount = this.mBitVector.getInt(Dictionary.OFFSET_INDEXENTRY_COUNT);
+		this.mEntryStartIndexBitLength = this.mBitVector.getByte(Dictionary.OFFSET_INDEXENTRY_STARTINDEX_BITLENGTH);
+		this.mEntryLengthBitLength = this.mBitVector.getByte(Dictionary.OFFSET_INDEXENTRY_LENGTH_BITLENGTH);
+
+		this.mEntriesOffset = Dictionary.OFFSET_CHARACTERS + (this.mCharacterCount * Character.SIZE);
+		this.mCharacterSequenceOffset = this.mEntriesOffset + (this.mEntryCount * (this.mEntryStartIndexBitLength + this.mEntryLengthBitLength));
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	public int getVersion() {
+		return this.mVersion;
+	}
+
+	public int getEntryCount() {
+		return this.mEntryCount;
+	}
+
+	public String getEntry(final int pIndex) {
+		if ((pIndex < 0) || (pIndex > this.mEntryCount)) {
+			throw new IllegalArgumentException("pIndex out of bounds: " + pIndex);
+		}
+
+		final int offsetInEntries = pIndex * (this.mEntryStartIndexBitLength + this.mEntryLengthBitLength);
+		final int entryOffset = this.mEntriesOffset + offsetInEntries;
+
+		final int startIndex = this.mBitVector.getBits(entryOffset, this.mEntryStartIndexBitLength);
+		final int length = this.mBitVector.getBits(entryOffset + this.mEntryStartIndexBitLength, this.mEntryLengthBitLength);
+
+		final char[] chars = new char[length]; // TODO Try to avoid allocation
+
+		for (int i = 0; i < length; i++) {
+			final int characterOffset = this.mCharacterSequenceOffset + ((i + startIndex) * this.mCharacterBitLength);
+
+			final int characterBits = this.mBitVector.getBits(characterOffset, this.mCharacterBitLength);
+			final char character = this.mCharacterTable[characterBits];
+
+			chars[i] = character;
+		}
+
+		return new String(chars);
+	}
+
+	public String[] getEntries() {
+		final String[] entries = new String[this.mEntryCount];
+
+		for (int i = 0; i < this.mEntryCount; i++) {
+			entries[i] = this.getEntry(i);
+		}
+
+		return entries;
+	}
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public void save(final OutputStream pOutputStream) throws IOException {
+		this.mBitVector.save(new DataOutputStream(pOutputStream));
+	}
+
+	public static Dictionary load(final InputStream pInputStream) throws IOException {
+		return new Dictionary(ByteBackedBitVector.load(new DataInputStream(pInputStream)));
+	}
+
+	public boolean contains(final String pString) {
+		if (pString == null) {
+			throw new IllegalArgumentException("pCharSequence must not be null");
+		}
+
+		if (pString.length() < 0) {
+			throw new IllegalArgumentException("pCharSequence must not be empty");
+		}
+
+		int lowerBound = 0;
+		int higherBound = this.mEntryCount - 1;
+
+		/* Binary search. */
+		while (lowerBound <= higherBound) {
+			final int mid = ((lowerBound + higherBound) >>> 1);
+
+			// TODO Optimization: don't decode the whole String, but compare char by char?
+			final String midEntry = this.getEntry(mid);
+			final int compared = midEntry.compareTo(pString);
+
+			if (compared > 0) {
+				lowerBound = mid + 1;
+			} else if (compared < 0) {
+				higherBound = mid - 1;
+			} else {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+
+	public static class Factory {
+		// ===========================================================
+		// Constants
+		// ===========================================================
+
+		// ===========================================================
+		// Fields
+		// ===========================================================
+
+		// ===========================================================
+		// Constructors
+		// ===========================================================
+
+		public static Dictionary create(final File pFile) throws IOException {
+			return Dictionary.Factory.create(FileUtils.readLines(pFile));
+		}
+
+		public static Dictionary create(final InputStream pInputStream) throws IOException {
+			return Dictionary.Factory.create(StreamUtils.readLines(pInputStream));
+		}
+
+		public static Dictionary create(final Reader pReader) throws IOException {
+			return Dictionary.Factory.create(StreamUtils.readLines(pReader));
+		}
+
+		public static Dictionary create(final String ... pStrings) {
+			Arrays.sort(pStrings, Dictionary.CASEINSENSITIVE_REVERSE_LEXICOGRAPHICAL_COMPARATOR);
+
+			final Dictionary.Factory.Entries entryDictionary = Dictionary.Factory.createDictionary(pStrings);
+
+			final String string = entryDictionary.mString;
+
+			final int characterCountTotal = string.length();
+			final int characterCount = entryDictionary.mCharacters.length;
+			final int characterBitLength = DataUtils.getBitLength(entryDictionary.mCharacters.length);
+			final int entryCount = entryDictionary.mEntries.size();
+			final int entryStartIndexBitLength = DataUtils.getBitLength(entryDictionary.mEntryStartIndexMaximum);
+			final int entryLengthBitLength = DataUtils.getBitLength(entryDictionary.mEntryLengthMaximum);
+
+			final int bitsRequired = Dictionary.Factory.calculateBitsRequired(characterCountTotal, characterCount, characterBitLength, entryCount, entryStartIndexBitLength, entryLengthBitLength);
+
+			final IBitVector bitVector = new ByteBackedBitVector(bitsRequired);
+
+			/* Write meta data. */
+			bitVector.setShort(Dictionary.OFFSET_VERSION, Dictionary.VERSION);
+			bitVector.setInt(Dictionary.OFFSET_CHARACTER_COUNT, characterCount);
+			bitVector.setByte(Dictionary.OFFSET_CHARACTER_BITLENGTH, (byte)characterBitLength);
+			bitVector.setInt(Dictionary.OFFSET_INDEXENTRY_COUNT, entryCount);
+			bitVector.setByte(Dictionary.OFFSET_INDEXENTRY_STARTINDEX_BITLENGTH, (byte)entryStartIndexBitLength);
+			bitVector.setByte(Dictionary.OFFSET_INDEXENTRY_LENGTH_BITLENGTH, (byte)entryLengthBitLength);
+
+			/* Character table. */
+			for (int i = 0; i < characterCount; i++) {
+				final char character = entryDictionary.mCharacters[i];
+				final short characterBits = (short)character;
+				bitVector.setShort(Dictionary.OFFSET_CHARACTERS + (i * Character.SIZE), characterBits);
+			}
+
+			/* Index entries. */
+			final int offsetEntries = Dictionary.OFFSET_CHARACTERS + (characterCount * Character.SIZE);
+			for (int i = 0; i < entryCount; i++) {
+				final Entry entry = entryDictionary.mEntries.get(i);
+
+				final int entryStartIndexBits = entry.mStartIndex; // TODO Fix bug when this goes over 2048? Maybe it's masking in the decoder?
+				final int entryLengthBits = entry.mLength;
+
+				final int offsetInEntries = i * (entryStartIndexBitLength + entryLengthBitLength);
+				final int offsetEntryStartIndex = offsetEntries + offsetInEntries;
+				final int offsetEntryLength = offsetEntryStartIndex + entryStartIndexBitLength;
+
+				bitVector.setBits(offsetEntryStartIndex, entryStartIndexBits, Integer.SIZE - entryStartIndexBitLength, entryStartIndexBitLength);
+				bitVector.setBits(offsetEntryLength, entryLengthBits, Integer.SIZE - entryLengthBitLength, entryLengthBitLength);
+			}
+
+			final int offsetCharacterString = offsetEntries + (entryCount * (entryStartIndexBitLength + entryLengthBitLength));
+
+			/* Character string. */
+			for(int i = 0; i < characterCountTotal; i++) {
+				final int offsetInCharacterString = i * characterBitLength;
+				final int offsetCharacter = offsetCharacterString + offsetInCharacterString;
+
+				final char character = string.charAt(i);
+				final int characterBits = Arrays.binarySearch(entryDictionary.mCharacters, character); // TODO Use short?
+
+				bitVector.setBits(offsetCharacter, characterBits, Integer.SIZE - characterBitLength, characterBitLength);
+			}
+
+			return new Dictionary(bitVector);
+		}
+
+		private static int calculateBitsRequired(final int pCharacterCountTotal, final int pCharacterCount, final int pCharacterBitLength, final int pEntryCount, final int pEntryStartIndexBitLength, final int pEntryLengthBitLength) {
+			return Dictionary.SIZE_VERSION
+					+ Dictionary.SIZE_CHARACTER_COUNT
+					+ Dictionary.SIZE_CHARACTER_BITLENGTH
+					+ Dictionary.SIZE_INDEXENTRY_COUNT
+					+ Dictionary.SIZE_INDEXENTRY_STARTINDEX_BITLENGTH
+					+ Dictionary.SIZE_INDEXENTRY_LENGTH_BITLENGTH
+					+ (pCharacterCount * Character.SIZE)
+					+ (pEntryCount * (pEntryStartIndexBitLength + pEntryLengthBitLength))
+					+ (pCharacterBitLength * pCharacterCountTotal);
+		}
+
+		private static Entries createDictionary(final String... pStrings) {
+			final ArrayList entries = new ArrayList();
+			final StringBuilder stringBuilder = new StringBuilder();
+
+			for (final String string : pStrings) {
+				final int existingStringStartIndex = stringBuilder.indexOf(string);
+
+				final int stringBuilderLength = stringBuilder.length();
+				final int stringLength = string.length();
+				if (existingStringStartIndex >= 0) {
+					/* Reference string. */
+					final int startIndex = existingStringStartIndex;
+					entries.add(new Entry(startIndex, stringLength));
+				} else {
+					/* Check if the stringbuilder ends with any prefix of the string. */
+					final int prefixLength = Dictionary.Factory.getPrefixLength(stringBuilder, string);
+					if (prefixLength == -1) {
+						/* Append new string. */
+						final int startIndex = stringBuilderLength;
+						entries.add(new Entry(startIndex, stringLength));
+						stringBuilder.append(string);
+					} else {
+						/* Append remainder of string after prefix. */
+						final int startIndex = stringBuilderLength - prefixLength;
+						entries.add(new Entry(startIndex, stringLength));
+						stringBuilder.append(string.substring(prefixLength));
+					}
+				}
+			}
+
+			return new Dictionary.Factory.Entries(entries, stringBuilder.toString());
+		}
+
+		// ===========================================================
+		// Getter & Setter
+		// ===========================================================
+
+		// ===========================================================
+		// Methods for/from SuperClass/Interfaces
+		// ===========================================================
+
+		// ===========================================================
+		// Methods
+		// ===========================================================
+
+		private static int getPrefixLength(final StringBuilder pStringBuilder, final String pString) {
+			final int stringBuilderLength = pStringBuilder.length();
+
+			for (int prefixLength = pString.length() - 1; prefixLength > 0; prefixLength--) {
+				final String prefix = pString.substring(0, prefixLength);
+				final int prefixLastIndexStart = pStringBuilder.indexOf(prefix, stringBuilderLength - prefixLength);
+				if (prefixLastIndexStart >= 0) {
+					return prefixLength;
+				}
+			}
+
+			return -1;
+		}
+
+		// ===========================================================
+		// Inner and Anonymous Classes
+		// ===========================================================
+
+		public static class Entries {
+			// ===========================================================
+			// Constants
+			// ===========================================================
+
+			// ===========================================================
+			// Fields
+			// ===========================================================
+
+			private final ArrayList mEntries;
+			private final String mString;
+
+			private final int mEntryStartIndexMaximum;
+			private final int mEntryLengthMaximum;
+			private final char[] mCharacters;
+
+			// ===========================================================
+			// Constructors
+			// ===========================================================
+
+			public Entries(final ArrayList pEntries, final String pString) {
+				this.mEntries = pEntries;
+				this.mString = pString;
+
+				int entryStartIndexMaximum = 0;
+				int entryLengthMaximum = 0;
+				for (final Entry entry : pEntries) {
+					entryStartIndexMaximum = Math.max(entryStartIndexMaximum, entry.mStartIndex);
+					entryLengthMaximum = Math.max(entryLengthMaximum, entry.mLength);
+				}
+
+				this.mEntryStartIndexMaximum = entryStartIndexMaximum;
+				this.mEntryLengthMaximum = entryLengthMaximum;
+
+				/* Determine all characters used. */
+				final IBitVector characterBitVector = new ByteBackedBitVector(Character.MAX_VALUE);
+
+				final int stringLength = pString.length();
+				for (int i = 0; i < stringLength; i++) {
+					characterBitVector.setBit(pString.charAt(i));
+				}
+
+				int characterCount = 0;
+				for (int i = 0; i < Character.MAX_VALUE; i++) {
+					if (characterBitVector.getBit(i) == BitVector.TRUE) {
+						characterCount++;
+					}
+				}
+				this.mCharacters = new char[characterCount];
+
+				characterCount = 0;
+				for (int i = 0; i < Character.MAX_VALUE; i++) {
+					if (characterBitVector.getBit(i) == BitVector.TRUE) {
+						this.mCharacters[characterCount++] = (char)i;
+					}
+				}
+			}
+
+			// ===========================================================
+			// Getter & Setter
+			// ===========================================================
+
+			// ===========================================================
+			// Methods for/from SuperClass/Interfaces
+			// ===========================================================
+
+			// ===========================================================
+			// Methods
+			// ===========================================================
+
+			// ===========================================================
+			// Inner and Anonymous Classes
+			// ===========================================================
+		}
+
+		public static class Entry {
+			// ===========================================================
+			// Constants
+			// ===========================================================
+
+			// ===========================================================
+			// Fields
+			// ===========================================================
+
+			private final int mStartIndex;
+			private final int mLength;
+
+			// ===========================================================
+			// Constructors
+			// ===========================================================
+
+			public Entry(final int pStartIndex, final int pLength) {
+				this.mStartIndex = pStartIndex;
+				this.mLength = pLength;
+			}
+
+			// ===========================================================
+			// Getter & Setter
+			// ===========================================================
+
+			// ===========================================================
+			// Methods for/from SuperClass/Interfaces
+			// ===========================================================
+
+			// ===========================================================
+			// Methods
+			// ===========================================================
+
+			// ===========================================================
+			// Inner and Anonymous Classes
+			// ===========================================================
+		}
+	}
+}
diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java
index 8c5b37545..ba27d1af5 100644
--- a/src/org/andengine/util/system/SystemUtils.java
+++ b/src/org/andengine/util/system/SystemUtils.java
@@ -106,9 +106,14 @@ private static PackageInfo getPackageInfo(final Context pContext) throws SystemU
 	}
 
 	public static boolean hasSystemFeature(final Context pContext, final String pFeature) {
+		final PackageManager packageManager = pContext.getPackageManager();
 		try {
-			final Method PackageManager_hasSystemFeatures = PackageManager.class.getMethod("hasSystemFeature", new Class[] { String.class });
-			return (PackageManager_hasSystemFeatures == null) ? false : (Boolean) PackageManager_hasSystemFeatures.invoke(pContext.getPackageManager(), pFeature);
+			try {
+				return packageManager.hasSystemFeature(pFeature);
+			} catch (final Throwable t) {
+				final Method PackageManager_hasSystemFeatures = PackageManager.class.getMethod("hasSystemFeature", new Class[] { String.class });
+				return (PackageManager_hasSystemFeatures == null) ? false : (Boolean) PackageManager_hasSystemFeatures.invoke(packageManager, pFeature);
+			}
 		} catch (final Throwable t) {
 			return false;
 		}

From 7be8a6fd28f00b9213c73cdac2258d70412cc114 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 2 Mar 2013 19:26:10 -0800
Subject: [PATCH 120/252] Defining OpenGL ES 2.0 requirement in
 AndroidManifest.

---
 AndroidManifest.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f206a68bf..c6cad6ff4 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4,7 +4,7 @@
 	android:versionCode="1"
 	android:versionName="1.0">
 
-	
+	
 
-	
+	
 
\ No newline at end of file

From 27254d466e1fe70654b4ac690b4138c63a0d2251 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 2 Mar 2013 19:26:20 -0800
Subject: [PATCH 121/252] Removed trailing whitespaces.

---
 src/org/andengine/util/adt/bit/BitVector.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/org/andengine/util/adt/bit/BitVector.java b/src/org/andengine/util/adt/bit/BitVector.java
index f73b27d09..60ba83a78 100644
--- a/src/org/andengine/util/adt/bit/BitVector.java
+++ b/src/org/andengine/util/adt/bit/BitVector.java
@@ -26,15 +26,15 @@ public class BitVector {
 	public static IBitVector wrap(final byte[] pData) {
 		return new ByteBackedBitVector(pData);
 	}
-	
+
 	public static IBitVector wrap(final int pSize, final byte[] pData) {
 		return new ByteBackedBitVector(pData);
 	}
-	
+
 	public static IBitVector wrap(final long[] pData) {
 		return new LongBackedBitVector(pData);
 	}
-	
+
 	public static IBitVector wrap(final int pSize, final long[] pData) {
 		return new LongBackedBitVector(pSize, pData);
 	}

From e9ec552516bb25df294339fdc96bc6aa7fc419e1 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 2 Mar 2013 19:41:16 -0800
Subject: [PATCH 122/252] Added ArrayUtils.filter method.

---
 .../andengine/util/adt/array/ArrayUtils.java  | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java
index a2b43ab7e..7772d7761 100644
--- a/src/org/andengine/util/adt/array/ArrayUtils.java
+++ b/src/org/andengine/util/adt/array/ArrayUtils.java
@@ -2,6 +2,7 @@
 
 import java.util.List;
 
+import org.andengine.util.IMatcher;
 import org.andengine.util.math.MathUtils;
 
 /**
@@ -456,6 +457,29 @@ public static void multiply(final long[] pArray, final double pFactor) {
 		}
 	}
 
+	@SuppressWarnings("unchecked")
+	public static  T[] filter(final T[] pArray, final Class pClass, final IMatcher pMatcher) {
+		final int arrayLength = pArray.length;
+
+		int filteredArrayLength = 0;
+		for (int i = arrayLength - 1; i >= 0; i--) {
+			if (pMatcher.matches(pArray[i])) {
+				filteredArrayLength++;
+			}
+		}
+
+		final T[] filteredArray = (T[]) java.lang.reflect.Array.newInstance(pClass.getComponentType(), filteredArrayLength);
+		int resultIndex = 0;
+		for (int i = 0; i < arrayLength; i++) {
+			if (pMatcher.matches(pArray[i])) {
+				filteredArray[resultIndex] = pArray[i];
+				resultIndex++;
+			}
+		}
+
+		return filteredArray;
+	}
+
 	// ===========================================================
 	// Inner and Anonymous Classes
 	// ===========================================================

From 36328f9e72d192b18161080c98cefd2e2716bb25 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 2 Mar 2013 19:56:54 -0800
Subject: [PATCH 123/252] Added ListUtils.filter method.

---
 src/org/andengine/util/adt/list/ListUtils.java | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/org/andengine/util/adt/list/ListUtils.java b/src/org/andengine/util/adt/list/ListUtils.java
index 49f0f1bc1..b3df9d433 100644
--- a/src/org/andengine/util/adt/list/ListUtils.java
+++ b/src/org/andengine/util/adt/list/ListUtils.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.andengine.util.IMatcher;
 import org.andengine.util.adt.queue.IQueue;
 import org.andengine.util.adt.queue.concurrent.SynchronizedQueue;
 import org.andengine.util.math.MathUtils;
@@ -62,6 +63,18 @@ public static final  ArrayList toList(final T ... pItems) {
 		return out;
 	}
 
+	public static final  ArrayList filter(final List pItems, final IMatcher pMatcher) {
+		final ArrayList out = new ArrayList();
+		final int itemCount = pItems.size();
+		for (int i = 0; i < itemCount; i++) {
+			final T item = pItems.get(i);
+			if (pMatcher.matches(item)) {
+				out.add(item);
+			}
+		}
+		return out;
+	}
+
 	public static  void swap(final List pItems, final int pIndexA, final int pIndexB) {
 		final T tmp = pItems.get(pIndexA);
 		pItems.set(pIndexA, pItems.get(pIndexB));

From 9dd8b6bbaacfb5c04b5bfb8b610f0606fb9fecf1 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 2 Mar 2013 20:14:59 -0800
Subject: [PATCH 124/252] Minor changes.

---
 src/org/andengine/util/adt/bit/BitVector.java           | 2 +-
 src/org/andengine/util/adt/bit/ByteBackedBitVector.java | 4 ++--
 src/org/andengine/util/adt/bit/LongBackedBitVector.java | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/org/andengine/util/adt/bit/BitVector.java b/src/org/andengine/util/adt/bit/BitVector.java
index 60ba83a78..c516214a9 100644
--- a/src/org/andengine/util/adt/bit/BitVector.java
+++ b/src/org/andengine/util/adt/bit/BitVector.java
@@ -7,7 +7,7 @@
  * @since 18:14:12 - 02.03.2013
  * @author ngramlich
  */
-public class BitVector {
+public abstract class BitVector implements IBitVector {
 	// ===========================================================
 	// Constants
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/bit/ByteBackedBitVector.java b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
index 7e047ed4d..6ff2c1067 100644
--- a/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
+++ b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
@@ -15,7 +15,7 @@
  * @author Nicolas Gramlich
  * @since Nov 20, 2012
  */
-public class ByteBackedBitVector extends BitVector implements IBitVector {
+public class ByteBackedBitVector extends BitVector {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -393,7 +393,7 @@ public String toString() {
 				stringBuilder.append('0');
 			}
 
-			if (((i % Byte.SIZE) == 7) && (i < (this.mSize - 1))) {
+			if (((i % Byte.SIZE) == (Byte.SIZE - 1)) && (i < (this.mSize - 1))) {
 				stringBuilder.append(',').append(' ');
 			}
 		}
diff --git a/src/org/andengine/util/adt/bit/LongBackedBitVector.java b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
index 7705d9030..6d67d5512 100644
--- a/src/org/andengine/util/adt/bit/LongBackedBitVector.java
+++ b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
@@ -15,7 +15,7 @@
  * @author Nicolas Gramlich 
  * @since 15:56:32 - 30.10.2011
  */
-public class LongBackedBitVector extends BitVector implements IBitVector {
+public class LongBackedBitVector extends BitVector {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -379,7 +379,7 @@ public String toString() {
 				stringBuilder.append('0');
 			}
 
-			if (((i % Byte.SIZE) == 7) && (i < (this.mSize - 1))) {
+			if (((i % Byte.SIZE) == (Long.SIZE - 1)) && (i < (this.mSize - 1))) {
 				stringBuilder.append(',').append(' ');
 			}
 		}

From 2bbda591f4b050c2488ea2f03b070ccc3117767e Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 2 Mar 2013 21:19:44 -0800
Subject: [PATCH 125/252] Made ArrayUtils.join and ArrayUtils.filter type safe.

---
 src/org/andengine/util/adt/array/ArrayUtils.java | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java
index 7772d7761..680e91626 100644
--- a/src/org/andengine/util/adt/array/ArrayUtils.java
+++ b/src/org/andengine/util/adt/array/ArrayUtils.java
@@ -1,5 +1,6 @@
 package org.andengine.util.adt.array;
 
+import java.lang.reflect.Array;
 import java.util.List;
 
 import org.andengine.util.IMatcher;
@@ -321,8 +322,7 @@ public static final boolean contains(final double[] pItems, final double pItem)
 	 * @param pArrays items or pArrays itself can be null.
 	 * @return null when pArrays is null or all arrays in pArrays are null or of length zero. Otherwise an in-order joined array of T[] of all not null, not zero length arrays in pArrays.
 	 */
-	@SuppressWarnings("unchecked")
-	public static  T[] join(final Class pClass, final T[]... pArrays) {
+	public static  T[] join(final Class pClass, final T[]... pArrays) {
 		if (pArrays == null) {
 			return null;
 		}
@@ -348,7 +348,7 @@ public static  T[] join(final Class pClass, final T[]... pArrays) {
 		}
 
 		/* Determine length of result. */
-		final T[] result = (T[]) java.lang.reflect.Array.newInstance(pClass.getComponentType(), resultLength);
+		final T[] result = pClass.cast(Array.newInstance(pClass.getComponentType(), resultLength));
 		int offset = 0;
 		for (int i = 0; i < arrayCount; i++) {
 			final T[] array = pArrays[i];
@@ -457,8 +457,7 @@ public static void multiply(final long[] pArray, final double pFactor) {
 		}
 	}
 
-	@SuppressWarnings("unchecked")
-	public static  T[] filter(final T[] pArray, final Class pClass, final IMatcher pMatcher) {
+	public static  T[] filter(final T[] pArray, final Class pClass, final IMatcher pMatcher) {
 		final int arrayLength = pArray.length;
 
 		int filteredArrayLength = 0;
@@ -468,7 +467,7 @@ public static  T[] filter(final T[] pArray, final Class pClass, final IMat
 			}
 		}
 
-		final T[] filteredArray = (T[]) java.lang.reflect.Array.newInstance(pClass.getComponentType(), filteredArrayLength);
+		final T[] filteredArray = pClass.cast(Array.newInstance(pClass.getComponentType(), filteredArrayLength));
 		int resultIndex = 0;
 		for (int i = 0; i < arrayLength; i++) {
 			if (pMatcher.matches(pArray[i])) {

From a2eab920bdf5725a466288f4bbcfd3dbdc159c62 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 3 Mar 2013 21:31:15 -0800
Subject: [PATCH 126/252] Fixed bug in StrokeFont with thin strokes.

---
 src/org/andengine/opengl/font/StrokeFont.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/org/andengine/opengl/font/StrokeFont.java b/src/org/andengine/opengl/font/StrokeFont.java
index a6678af8b..0690568bb 100644
--- a/src/org/andengine/opengl/font/StrokeFont.java
+++ b/src/org/andengine/opengl/font/StrokeFont.java
@@ -72,7 +72,7 @@ public StrokeFont(final FontManager pFontManager, final ITexture pTexture, final
 	@Override
 	protected void updateTextBounds(final String pCharacterAsString) {
 		this.mStrokePaint.getTextBounds(pCharacterAsString, 0, 1, this.mTextBounds);
-		final int inset = -(int)Math.floor(this.mStrokeWidth * 0.5f);
+		final int inset = -(int)Math.ceil(this.mStrokeWidth * 0.5f);
 		this.mTextBounds.inset(inset, inset);
 	}
 

From 9e4efd9a901b1e9a57a7909e9538426bcf586d1f Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 3 Mar 2013 22:08:59 -0800
Subject: [PATCH 127/252] =?UTF-8?q?Added=20TextureMemoryLogger=20based=20o?=
 =?UTF-8?q?n=20Arturo=20Guti=C3=A9rrez=20pull=20request.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/org/andengine/entity/util/FPSLogger.java  |  11 +-
 .../entity/util/TextureMemoryLogger.java      | 102 ++++++++++++++++++
 .../andengine/opengl/texture/ITexture.java    |   5 +
 src/org/andengine/opengl/texture/Texture.java |   8 ++
 .../opengl/texture/TextureManager.java        |  18 ++++
 .../buildable/BuildableTextureAtlas.java      |   5 +
 6 files changed, 143 insertions(+), 6 deletions(-)
 create mode 100644 src/org/andengine/entity/util/TextureMemoryLogger.java

diff --git a/src/org/andengine/entity/util/FPSLogger.java b/src/org/andengine/entity/util/FPSLogger.java
index 81be5a635..df02d9f62 100644
--- a/src/org/andengine/entity/util/FPSLogger.java
+++ b/src/org/andengine/entity/util/FPSLogger.java
@@ -35,8 +35,6 @@ public FPSLogger() {
 	}
 
 	public FPSLogger(final DebugLevel pDebugLevel) {
-		super();
-
 		this.mDebugLevel = pDebugLevel;
 	}
 
@@ -88,10 +86,11 @@ public void reset() {
 
 	protected void onLogFPS() {
 		if (BuildConfig.DEBUG) {
-			Debug.log(this.mDebugLevel, String.format("FPS: %.2f (MIN: %.0f ms | MAX: %.0f ms)",
-				this.mFrames / this.mSecondsElapsed,
-				this.mShortestFrame * TimeConstants.MILLISECONDS_PER_SECOND,
-				this.mLongestFrame * TimeConstants.MILLISECONDS_PER_SECOND));
+			final float framesPerSecond = this.mFrames / this.mSecondsElapsed;
+			final float shortestFrameInMilliseconds = this.mShortestFrame * TimeConstants.MILLISECONDS_PER_SECOND;
+			final float longestFrameInMilliseconds = this.mLongestFrame * TimeConstants.MILLISECONDS_PER_SECOND;
+
+			Debug.log(this.mDebugLevel, String.format("FPS: %.2f (MIN: %.0f ms | MAX: %.0f ms)", framesPerSecond, shortestFrameInMilliseconds, longestFrameInMilliseconds));
 		}
 	}
 
diff --git a/src/org/andengine/entity/util/TextureMemoryLogger.java b/src/org/andengine/entity/util/TextureMemoryLogger.java
new file mode 100644
index 000000000..3236e7088
--- /dev/null
+++ b/src/org/andengine/entity/util/TextureMemoryLogger.java
@@ -0,0 +1,102 @@
+package org.andengine.entity.util;
+
+import org.andengine.BuildConfig;
+import org.andengine.engine.handler.IUpdateHandler;
+import org.andengine.opengl.texture.TextureManager;
+import org.andengine.util.debug.Debug;
+import org.andengine.util.debug.Debug.DebugLevel;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ *
+ * @author Arturo GutiŽrrez
+ * @author Nicolas Gramlich
+ * @since 22:07:46 - 03.03.2013
+ */
+public class TextureMemoryLogger implements IUpdateHandler {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final float AVERAGE_DURATION_DEFAULT = 5;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	private final TextureManager mTextureManager;
+
+	private final float mAverageDuration;
+	private float mSecondsElapsed;
+
+	private int mTextureMemoryUsedMax;
+	private int mTexturesLoadedCountMax;
+
+	private final DebugLevel mDebugLevel;
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public TextureMemoryLogger(final TextureManager pTextureManager) {
+		this(pTextureManager, DebugLevel.DEBUG);
+	}
+
+	public TextureMemoryLogger(final TextureManager pTextureManager, final DebugLevel pDebugLevel) {
+		this(pTextureManager, TextureMemoryLogger.AVERAGE_DURATION_DEFAULT);
+	}
+
+	public TextureMemoryLogger(final TextureManager pTextureManager, final float pAverageDuration) {
+		this(pTextureManager, pAverageDuration, DebugLevel.DEBUG);
+	}
+
+	public TextureMemoryLogger(final TextureManager pTextureManager, final float pAverageDuration, final DebugLevel pDebugLevel) {
+		this.mTextureManager = pTextureManager;
+		this.mAverageDuration = pAverageDuration;
+		this.mDebugLevel = pDebugLevel;
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	@Override
+	public void onUpdate(final float pSecondsElapsed) {
+		this.mSecondsElapsed += pSecondsElapsed;
+
+		if (this.mSecondsElapsed > this.mAverageDuration) {
+			this.onHandleAverageDurationElapsed();
+
+			this.mSecondsElapsed -= this.mAverageDuration;
+		}
+	}
+
+	@Override
+	public void reset() {
+		this.mSecondsElapsed = 0;
+	}
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	private void onHandleAverageDurationElapsed() {
+		if (BuildConfig.DEBUG) {
+			final int texturesLoadedCount = this.mTextureManager.getTexturesLoadedCount();
+			final int textureMemoryUsed = this.mTextureManager.getTextureMemoryUsed();
+
+			this.mTexturesLoadedCountMax = Math.max(texturesLoadedCount, this.mTexturesLoadedCountMax);
+			this.mTextureMemoryUsedMax = Math.max(textureMemoryUsed, this.mTextureMemoryUsedMax);
+
+			Debug.log(this.mDebugLevel, String.format("MEM: %d kB in %d textures (MAX: %d kB in %d textures)", textureMemoryUsed, texturesLoadedCount, this.mTextureMemoryUsedMax, this.mTexturesLoadedCountMax));
+		}
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
\ No newline at end of file
diff --git a/src/org/andengine/opengl/texture/ITexture.java b/src/org/andengine/opengl/texture/ITexture.java
index 7006302da..3e43a35e8 100644
--- a/src/org/andengine/opengl/texture/ITexture.java
+++ b/src/org/andengine/opengl/texture/ITexture.java
@@ -63,6 +63,11 @@ public interface ITexture {
 	public PixelFormat getPixelFormat();
 	public TextureOptions getTextureOptions();
 
+	/**
+	 * @return in kiloBytes.
+	 */
+	public int getTextureMemorySize();
+
 	public boolean hasTextureStateListener();
 	public ITextureStateListener getTextureStateListener();
 	public void setTextureStateListener(final ITextureStateListener pTextureStateListener);
diff --git a/src/org/andengine/opengl/texture/Texture.java b/src/org/andengine/opengl/texture/Texture.java
index d9ecf6940..5adfa6979 100644
--- a/src/org/andengine/opengl/texture/Texture.java
+++ b/src/org/andengine/opengl/texture/Texture.java
@@ -4,6 +4,7 @@
 
 import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource;
 import org.andengine.opengl.util.GLState;
+import org.andengine.util.adt.DataConstants;
 
 /**
  * (c) 2010 Nicolas Gramlich
@@ -87,6 +88,13 @@ public TextureOptions getTextureOptions() {
 		return this.mTextureOptions;
 	}
 
+	@Override
+	public int getTextureMemorySize() {
+		final int pixelCount = this.getWidth() * this.getHeight();
+		final int bytesPerPixel = this.mPixelFormat.getBitsPerPixel() * DataConstants.BITS_PER_BYTE;
+		return pixelCount * bytesPerPixel / DataConstants.BYTES_PER_KILOBYTE;
+	}
+
 	@Override
 	public ITextureStateListener getTextureStateListener() {
 		return this.mTextureStateListener;
diff --git a/src/org/andengine/opengl/texture/TextureManager.java b/src/org/andengine/opengl/texture/TextureManager.java
index 63c6b3665..82d9e56e5 100644
--- a/src/org/andengine/opengl/texture/TextureManager.java
+++ b/src/org/andengine/opengl/texture/TextureManager.java
@@ -40,6 +40,8 @@ public class TextureManager {
 
 	private TextureWarmUpVertexBufferObject mTextureWarmUpVertexBufferObject;
 
+	private int mTextureMemoryUsed;
+
 	// ===========================================================
 	// Constructors
 	// ===========================================================
@@ -48,6 +50,14 @@ public class TextureManager {
 	// Getter & Setter
 	// ===========================================================
 
+	public int getTextureMemoryUsed() {
+		return this.mTextureMemoryUsed;
+	}
+
+	public int getTexturesLoadedCount() {
+		return this.mTexturesLoaded.size();
+	}
+
 	// ===========================================================
 	// Methods for/from SuperClass/Interfaces
 	// ===========================================================
@@ -79,6 +89,8 @@ public synchronized void onReload() {
 		}
 
 		this.mTextureWarmUpVertexBufferObject.setNotLoadedToHardware();
+
+		this.mTextureMemoryUsed = 0;
 	}
 
 	public synchronized void onDestroy() {
@@ -94,6 +106,8 @@ public synchronized void onDestroy() {
 
 		this.mTextureWarmUpVertexBufferObject.dispose();
 		this.mTextureWarmUpVertexBufferObject = null;
+
+		this.mTextureMemoryUsed = 0;
 	}
 
 	public synchronized boolean hasMappedTexture(final String pID) {
@@ -253,6 +267,8 @@ public synchronized void updateTextures(final GLState pGLState) {
 					try {
 						textureToBeLoaded.loadToHardware(pGLState);
 
+						this.mTextureMemoryUsed += textureToBeLoaded.getTextureMemorySize();
+
 						/* Execute the warm-up to ensure the texture data is actually moved to the GPU. */
 						this.mTextureWarmUpVertexBufferObject.warmup(pGLState, textureToBeLoaded);
 					} catch (final IOException e) {
@@ -271,6 +287,8 @@ public synchronized void updateTextures(final GLState pGLState) {
 				final ITexture textureToBeUnloaded = texturesToBeUnloaded.remove(i);
 				if (textureToBeUnloaded.isLoadedToHardware()) {
 					textureToBeUnloaded.unloadFromHardware(pGLState);
+
+					this.mTextureMemoryUsed -= textureToBeUnloaded.getTextureMemorySize();
 				}
 				texturesLoaded.remove(textureToBeUnloaded);
 				texturesManaged.remove(textureToBeUnloaded);
diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java
index f5d9d3fb0..bb2fd0c07 100644
--- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java
+++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlas.java
@@ -139,6 +139,11 @@ public TextureOptions getTextureOptions() {
 		return this.mTextureAtlas.getTextureOptions();
 	}
 
+	@Override
+	public int getTextureMemorySize() {
+		return this.mTextureAtlas.getTextureMemorySize();
+	}
+
 	@Override
 	@Deprecated
 	public void addTextureAtlasSource(final S pTextureAtlasSource, final int pTextureX, final int pTextureY) {

From e211249ecd82e772a6a361a5acc3105e3f3946c2 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 3 Mar 2013 22:10:58 -0800
Subject: [PATCH 128/252] Changed encoding of TextureMemoryLogger to UTF-8 to
 display author name properly.

---
 src/org/andengine/entity/util/TextureMemoryLogger.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/org/andengine/entity/util/TextureMemoryLogger.java b/src/org/andengine/entity/util/TextureMemoryLogger.java
index 3236e7088..36a60acf7 100644
--- a/src/org/andengine/entity/util/TextureMemoryLogger.java
+++ b/src/org/andengine/entity/util/TextureMemoryLogger.java
@@ -9,7 +9,7 @@
 /**
  * (c) 2013 Nicolas Gramlich
  *
- * @author Arturo GutiŽrrez
+ * @author Arturo Gutiérrez
  * @author Nicolas Gramlich
  * @since 22:07:46 - 03.03.2013
  */

From 6190d6b3734046f094da9393dba7a4cd1dbd59dd Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 3 Mar 2013 22:14:28 -0800
Subject: [PATCH 129/252] Updated Authors.

---
 AUTHORS.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/AUTHORS.md b/AUTHORS.md
index 04786c3a5..391264692 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -45,6 +45,8 @@
 * Daniel Epstein 
   * Added possibility to define scaleX/scaleY instead of just scale.
   * Fixed horizontal/vertical flipping of BaseTextureRegionBuffer.
+* Arturo Gutiérrez
+  * Added TextureMemoryLogger.
 
 ## Suggestions / Issue-Reports:
 * Leandro De Brasi

From 835ec5b608f02c54e59fda16c66d899ba4c95cae Mon Sep 17 00:00:00 2001
From: Michal Stawinski 
Date: Wed, 6 Mar 2013 23:32:03 +0100
Subject: [PATCH 130/252] Added API to manage sound priorities

---
 src/org/andengine/audio/sound/Sound.java | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/org/andengine/audio/sound/Sound.java b/src/org/andengine/audio/sound/Sound.java
index 897f5b5e3..bd611f534 100644
--- a/src/org/andengine/audio/sound/Sound.java
+++ b/src/org/andengine/audio/sound/Sound.java
@@ -28,6 +28,7 @@ public class Sound extends BaseAudioEntity {
 
 	private int mLoopCount;
 	private float mRate = 1.0f;
+	private int mPriority = 1;
 
 	// ===========================================================
 	// Constructors
@@ -81,6 +82,19 @@ public void setRate(final float pRate) throws SoundReleasedException {
 		}
 	}
 
+	public int getPriority() {
+		return this.mPriority;
+	}
+
+	public void setPrioriyt(final int pPriority) throws SoundReleasedException {
+		this.assertNotReleased();
+
+		this.mPriority = pPriority;
+		if(this.mStreamID != 0) {
+			this.getSoundPool().setPriority(this.mStreamID, pPriority);
+		}
+	}
+
 	private SoundPool getSoundPool() throws SoundReleasedException {
 		return this.getAudioManager().getSoundPool();
 	}
@@ -107,7 +121,7 @@ public void play() throws SoundReleasedException {
 		final float leftVolume = this.mLeftVolume * masterVolume;
 		final float rightVolume = this.mRightVolume * masterVolume;
 
-		this.mStreamID = this.getSoundPool().play(this.mSoundID, leftVolume, rightVolume, 1, this.mLoopCount, this.mRate);
+		this.mStreamID = this.getSoundPool().play(this.mSoundID, leftVolume, rightVolume, this.mPriority, this.mLoopCount, this.mRate);
 	}
 
 	@Override

From 6861c8d498bb716214b0d6a325571b41520be85d Mon Sep 17 00:00:00 2001
From: YH Yang 
Date: Sun, 3 Feb 2013 10:44:51 +0800
Subject: [PATCH 131/252] Move ExpireParticleIntiializer. It may be placed
 under wrong package.

---
 .../{modifier => initializer}/ExpireParticleInitializer.java   | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
 rename src/org/andengine/entity/particle/{modifier => initializer}/ExpireParticleInitializer.java (95%)

diff --git a/src/org/andengine/entity/particle/modifier/ExpireParticleInitializer.java b/src/org/andengine/entity/particle/initializer/ExpireParticleInitializer.java
similarity index 95%
rename from src/org/andengine/entity/particle/modifier/ExpireParticleInitializer.java
rename to src/org/andengine/entity/particle/initializer/ExpireParticleInitializer.java
index 5f2a8abe7..c6a482bfb 100644
--- a/src/org/andengine/entity/particle/modifier/ExpireParticleInitializer.java
+++ b/src/org/andengine/entity/particle/initializer/ExpireParticleInitializer.java
@@ -1,8 +1,7 @@
-package org.andengine.entity.particle.modifier;
+package org.andengine.entity.particle.initializer;
 
 import org.andengine.entity.IEntity;
 import org.andengine.entity.particle.Particle;
-import org.andengine.entity.particle.initializer.IParticleInitializer;
 import org.andengine.util.math.MathUtils;
 
 /**

From 0bf3520f314810fa42be7895e3fb043ebac9340e Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 16 Mar 2013 20:26:06 -0700
Subject: [PATCH 132/252] Added cheskstyle config file.

---
 checkstyle.xml | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100644 checkstyle.xml

diff --git a/checkstyle.xml b/checkstyle.xml
new file mode 100644
index 000000000..11f50a92b
--- /dev/null
+++ b/checkstyle.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+  
+  
+    
+    
+    
+    
+      
+    
+    
+      
+    
+    
+      
+    
+    
+    
+    
+    
+    
+    
+    
+      
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      
+    
+    
+    
+      
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+      
+      
+    
+    
+    
+    
+  
+

From 86c02b813eb89a0caf60db7c77896b8d2addc167 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 16 Mar 2013 20:26:32 -0700
Subject: [PATCH 133/252] Fixed about a million checkstyle complaints.

---
 src/org/andengine/AndEngine.java              |  6 +++-
 src/org/andengine/audio/music/Music.java      |  2 +-
 .../andengine/audio/music/MusicFactory.java   | 14 ++++++--
 src/org/andengine/audio/sound/Sound.java      |  2 +-
 .../andengine/audio/sound/SoundFactory.java   | 16 +++++----
 src/org/andengine/engine/Engine.java          | 20 ++++++++---
 src/org/andengine/engine/FixedStepEngine.java |  2 +-
 .../engine/camera/CameraFactory.java          |  6 +++-
 .../hud/controls/AnalogOnScreenControl.java   |  2 +-
 .../engine/handler/timer/TimerHandler.java    |  2 +-
 .../engine/options/ConfigChooserOptions.java  |  2 +-
 .../engine/options/RenderOptions.java         |  2 +-
 .../RatioResolutionPolicy.java                |  2 +-
 .../RelativeResolutionPolicy.java             |  4 +--
 src/org/andengine/entity/Entity.java          | 28 ++-------------
 src/org/andengine/entity/clip/ClipEntity.java | 16 ++++-----
 .../entity/modifier/IEntityModifier.java      |  2 +-
 .../entity/modifier/PathModifier.java         |  4 +--
 .../QuadraticBezierCurveMoveModifier.java     |  4 +--
 .../particle/BlendFunctionParticleSystem.java |  4 +--
 .../entity/particle/ParticleSystem.java       |  5 +--
 .../emitter/CircleOutlineParticleEmitter.java |  4 +--
 .../emitter/CircleParticleEmitter.java        |  4 +--
 .../BlendFunctionParticleInitializer.java     |  2 +-
 .../andengine/entity/primitive/Gradient.java  |  2 +-
 src/org/andengine/entity/primitive/Line.java  |  2 +-
 .../entity/scene/background/Background.java   |  2 +-
 .../scene/background/ParallaxBackground.java  |  4 +--
 .../scene/background/SpriteBackground.java    |  2 +-
 .../modifier/IBackgroundModifier.java         |  2 +-
 .../modifier/LoopBackgroundModifier.java      |  2 +-
 src/org/andengine/entity/shape/Shape.java     |  2 +-
 .../entity/sprite/AnimatedSprite.java         |  6 ++--
 .../entity/sprite/NineSliceSprite.java        |  4 ++-
 .../entity/sprite/batch/SpriteGroup.java      |  4 +--
 src/org/andengine/entity/text/TickerText.java |  2 +-
 .../andengine/entity/util/ScreenCapture.java  |  4 ++-
 .../andengine/entity/util/ScreenGrabber.java  |  2 +-
 .../input/touch/controller/MultiTouch.java    | 22 +++++++-----
 src/org/andengine/opengl/font/BitmapFont.java |  2 +-
 .../andengine/opengl/font/FontFactory.java    |  6 +++-
 src/org/andengine/opengl/font/FontUtils.java  | 22 ++++++------
 .../opengl/shader/ShaderProgram.java          |  8 ++---
 .../opengl/texture/EmptyTexture.java          |  8 ++---
 ...itmapTextureAtlasTextureRegionFactory.java |  6 +++-
 ...dableTextureAtlasTextureRegionFactory.java |  6 +++-
 .../buildable/IBuildableTextureAtlas.java     |  2 +-
 .../SmartPVRTexturePixelBufferStrategy.java   |  2 +-
 .../texture/region/TextureRegionFactory.java  |  6 +++-
 .../ui/dialog/GenericInputDialogBuilder.java  |  2 +-
 src/org/andengine/util/ActivityUtils.java     | 28 ++++++++-------
 src/org/andengine/util/BetaUtils.java         |  8 +++--
 src/org/andengine/util/BitmapUtils.java       |  6 +++-
 src/org/andengine/util/DatabaseUtils.java     |  6 +++-
 src/org/andengine/util/DialogUtils.java       |  6 +++-
 src/org/andengine/util/FileUtils.java         |  6 +++-
 .../andengine/util/ProbabilityGenerator.java  |  4 +--
 src/org/andengine/util/SAXUtils.java          |  4 +++
 src/org/andengine/util/SocketUtils.java       |  4 +++
 src/org/andengine/util/StreamUtils.java       | 20 ++++++-----
 src/org/andengine/util/TextUtils.java         |  4 +++
 src/org/andengine/util/ThreadUtils.java       |  6 +++-
 src/org/andengine/util/TimeUtils.java         |  4 +++
 src/org/andengine/util/ViewUtils.java         |  4 +++
 src/org/andengine/util/adt/DataConstants.java |  6 ++--
 .../andengine/util/adt/array/ArrayUtils.java  | 34 ++++++++++++-------
 src/org/andengine/util/adt/bit/BitVector.java |  2 +-
 .../util/adt/bit/ByteBackedBitVector.java     |  2 +-
 .../util/adt/bit/LongBackedBitVector.java     |  2 +-
 .../andengine/util/adt/cache/IntLRUCache.java | 30 ++++++++--------
 .../andengine/util/adt/cache/LRUCache.java    |  2 +-
 .../andengine/util/adt/color/ColorUtils.java  |  6 +++-
 .../andengine/util/adt/data/DataUtils.java    |  4 +++
 .../util/adt/dictionary/Dictionary.java       | 16 ++++-----
 .../andengine/util/adt/list/ListUtils.java    |  4 +++
 .../andengine/util/adt/list/ShiftList.java    |  4 +--
 .../andengine/util/adt/list/SmartList.java    |  2 +-
 .../andengine/util/adt/list/SortedList.java   |  6 ++--
 .../adt/list/concurrent/SynchronizedList.java |  4 +--
 .../util/adt/map/MultiKeyHashMap.java         |  2 +-
 .../util/adt/pool/PoolUpdateHandler.java      |  4 +--
 .../andengine/util/adt/queue/SortedQueue.java |  2 +-
 .../andengine/util/adt/queue/UniqueQueue.java |  2 +-
 .../queue/concurrent/SynchronizedQueue.java   |  6 ++--
 .../spatial/bounds/util/FloatBoundsUtils.java |  4 +++
 .../spatial/bounds/util/IntBoundsUtils.java   |  4 +++
 .../util/adt/spatial/quadtree/QuadTree.java   |  8 ++---
 .../adt/transformation/Transformation.java    | 14 ++++----
 .../collision/BaseCollisionChecker.java       |  6 +++-
 .../collision/EntityCollisionChecker.java     |  6 +++-
 .../collision/LineCollisionChecker.java       |  6 +++-
 .../collision/TriangleCollisionChecker.java   |  6 +++-
 .../util/algorithm/hull/HullUtils.java        |  8 +++--
 .../util/algorithm/hull/JarvisMarch.java      |  2 +-
 .../algorithm/path/astar/AStarPathFinder.java | 10 +++---
 .../path/astar/EuclideanHeuristic.java        |  2 +-
 .../util/algorithm/sort/InsertionSorter.java  |  6 ++--
 .../animationpack/AnimationPackLoader.java    |  2 +-
 .../AnimationPackTiledTextureRegion.java      |  2 +-
 src/org/andengine/util/debug/Debug.java       |  8 +++--
 src/org/andengine/util/escape/Unescaper.java  |  2 +-
 .../andengine/util/escape/XMLUnescaper.java   |  6 +++-
 src/org/andengine/util/level/LevelLoader.java |  4 +--
 .../SimpleLevelLoaderContentHandler.java      |  2 +-
 .../levelstats/LevelStatsDBConnector.java     |  4 +--
 .../andengine/util/math/MathConstants.java    |  2 +-
 src/org/andengine/util/math/MathUtils.java    | 14 +++++---
 .../andengine/util/modifier/LoopModifier.java |  6 ++--
 .../util/modifier/ParallelModifier.java       |  4 +--
 .../util/modifier/SequenceModifier.java       |  4 +--
 .../util/modifier/ease/EaseCircularIn.java    |  2 +-
 .../util/modifier/ease/EaseCircularOut.java   |  2 +-
 .../util/modifier/ease/EaseElasticIn.java     |  2 +-
 .../util/modifier/ease/EaseElasticOut.java    |  2 +-
 .../modifier/ease/EaseExponentialOut.java     |  2 +-
 .../util/modifier/ease/EaseSineIn.java        |  2 +-
 .../util/modifier/ease/EaseSineInOut.java     |  2 +-
 .../util/modifier/ease/EaseSineOut.java       |  2 +-
 .../util/modifier/util/ModifierUtils.java     |  6 +++-
 .../util/texturepack/TexturePackLoader.java   |  2 +-
 120 files changed, 426 insertions(+), 277 deletions(-)

diff --git a/src/org/andengine/AndEngine.java b/src/org/andengine/AndEngine.java
index 7afe02b80..6ef4f2d93 100644
--- a/src/org/andengine/AndEngine.java
+++ b/src/org/andengine/AndEngine.java
@@ -21,7 +21,7 @@
  * @author Nicolas Gramlich 
  * @since 14:03:59 - 19.03.2012
  */
-public class AndEngine {
+public final class AndEngine {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -34,6 +34,10 @@ public class AndEngine {
 	// Constructors
 	// ===========================================================
 
+	private AndEngine() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/audio/music/Music.java b/src/org/andengine/audio/music/Music.java
index 1c42b40ec..fe52892a6 100644
--- a/src/org/andengine/audio/music/Music.java
+++ b/src/org/andengine/audio/music/Music.java
@@ -56,7 +56,7 @@ public MediaPlayer getMediaPlayer() throws MusicReleasedException {
 
 	@Override
 	protected MusicManager getAudioManager() throws MusicReleasedException {
-		return (MusicManager)super.getAudioManager();
+		return (MusicManager) super.getAudioManager();
 	}
 
 	@Override
diff --git a/src/org/andengine/audio/music/MusicFactory.java b/src/org/andengine/audio/music/MusicFactory.java
index df84bd91c..121012af2 100644
--- a/src/org/andengine/audio/music/MusicFactory.java
+++ b/src/org/andengine/audio/music/MusicFactory.java
@@ -1,9 +1,12 @@
 package org.andengine.audio.music;
 
 import java.io.File;
+import java.io.FileDescriptor;
 import java.io.FileInputStream;
 import java.io.IOException;
 
+import org.andengine.util.StreamUtils;
+
 import android.content.Context;
 import android.content.res.AssetFileDescriptor;
 import android.media.MediaPlayer;
@@ -15,7 +18,7 @@
  * @author Nicolas Gramlich
  * @since 15:05:49 - 13.06.2010
  */
-public class MusicFactory {
+public final class MusicFactory {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -30,6 +33,10 @@ public class MusicFactory {
 	// Constructors
 	// ===========================================================
 
+	private MusicFactory() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -64,7 +71,10 @@ public static void onCreate() {
 	public static Music createMusicFromFile(final MusicManager pMusicManager, final File pFile) throws IOException {
 		final MediaPlayer mediaPlayer = new MediaPlayer();
 
-		mediaPlayer.setDataSource(new FileInputStream(pFile).getFD());
+		final FileInputStream fileInputStream = new FileInputStream(pFile);
+		final FileDescriptor fileDescriptor = fileInputStream.getFD();
+		StreamUtils.close(fileInputStream);
+		mediaPlayer.setDataSource(fileDescriptor);
 		mediaPlayer.prepare();
 
 		final Music music = new Music(pMusicManager, mediaPlayer);
diff --git a/src/org/andengine/audio/sound/Sound.java b/src/org/andengine/audio/sound/Sound.java
index 897f5b5e3..16aa00c75 100644
--- a/src/org/andengine/audio/sound/Sound.java
+++ b/src/org/andengine/audio/sound/Sound.java
@@ -91,7 +91,7 @@ private SoundPool getSoundPool() throws SoundReleasedException {
 
 	@Override
 	protected SoundManager getAudioManager() throws SoundReleasedException {
-		return (SoundManager)super.getAudioManager();
+		return (SoundManager) super.getAudioManager();
 	}
 
 	@Override
diff --git a/src/org/andengine/audio/sound/SoundFactory.java b/src/org/andengine/audio/sound/SoundFactory.java
index 7aa916b27..376684e7b 100644
--- a/src/org/andengine/audio/sound/SoundFactory.java
+++ b/src/org/andengine/audio/sound/SoundFactory.java
@@ -14,7 +14,7 @@
  * @author Nicolas Gramlich
  * @since 14:23:03 - 11.03.2010
  */
-public class SoundFactory {
+public final class SoundFactory {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -29,6 +29,10 @@ public class SoundFactory {
 	// Constructors
 	// ===========================================================
 
+	private SoundFactory() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -61,7 +65,7 @@ public static void onCreate() {
 	// ===========================================================
 
 	public static Sound createSoundFromPath(final SoundManager pSoundManager, final String pPath) throws IOException {
-		synchronized(pSoundManager) {
+		synchronized (pSoundManager) {
 			final int soundID = pSoundManager.getSoundPool().load(pPath, 1);
 			final Sound sound = new Sound(pSoundManager, soundID);
 			pSoundManager.add(sound);
@@ -70,7 +74,7 @@ public static Sound createSoundFromPath(final SoundManager pSoundManager, final
 	}
 
 	public static Sound createSoundFromAsset(final SoundManager pSoundManager, final Context pContext, final String pAssetPath) throws IOException {
-		synchronized(pSoundManager) {
+		synchronized (pSoundManager) {
 			final int soundID = pSoundManager.getSoundPool().load(pContext.getAssets().openFd(SoundFactory.sAssetBasePath + pAssetPath), 1);
 			final Sound sound = new Sound(pSoundManager, soundID);
 			pSoundManager.add(sound);
@@ -79,7 +83,7 @@ public static Sound createSoundFromAsset(final SoundManager pSoundManager, final
 	}
 
 	public static Sound createSoundFromResource(final SoundManager pSoundManager, final Context pContext, final int pSoundResID) {
-		synchronized(pSoundManager) {
+		synchronized (pSoundManager) {
 			final int soundID = pSoundManager.getSoundPool().load(pContext, pSoundResID, 1);
 			final Sound sound = new Sound(pSoundManager, soundID);
 			pSoundManager.add(sound);
@@ -92,7 +96,7 @@ public static Sound createSoundFromFile(final SoundManager pSoundManager, final
 	}
 
 	public static Sound createSoundFromAssetFileDescriptor(final SoundManager pSoundManager, final AssetFileDescriptor pAssetFileDescriptor) {
-		synchronized(pSoundManager) {
+		synchronized (pSoundManager) {
 			final int soundID = pSoundManager.getSoundPool().load(pAssetFileDescriptor, 1);
 			final Sound sound = new Sound(pSoundManager, soundID);
 			pSoundManager.add(sound);
@@ -101,7 +105,7 @@ public static Sound createSoundFromAssetFileDescriptor(final SoundManager pSound
 	}
 
 	public static Sound createSoundFromFileDescriptor(final SoundManager pSoundManager, final FileDescriptor pFileDescriptor, final long pOffset, final long pLength) throws IOException {
-		synchronized(pSoundManager) {
+		synchronized (pSoundManager) {
 			final int soundID = pSoundManager.getSoundPool().load(pFileDescriptor, pOffset, pLength, 1);
 			final Sound sound = new Sound(pSoundManager, soundID);
 			pSoundManager.add(sound);
diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java
index 6d2ce80b5..2281bc71f 100644
--- a/src/org/andengine/engine/Engine.java
+++ b/src/org/andengine/engine/Engine.java
@@ -9,6 +9,7 @@
 import org.andengine.audio.music.MusicManager;
 import org.andengine.audio.sound.SoundFactory;
 import org.andengine.audio.sound.SoundManager;
+import org.andengine.audio.sound.exception.SoundException;
 import org.andengine.engine.camera.Camera;
 import org.andengine.engine.handler.DrawHandlerList;
 import org.andengine.engine.handler.IDrawHandler;
@@ -328,7 +329,8 @@ public void clearDrawHandlers() {
 	@Override
 	public void onAccuracyChanged(final Sensor pSensor, final int pAccuracy) {
 		if (this.mRunning) {
-			switch (pSensor.getType()) {
+			final int sensorType = pSensor.getType();
+			switch (sensorType) {
 				case Sensor.TYPE_ACCELEROMETER:
 					if (this.mAccelerationData != null) {
 						this.mAccelerationData.setAccuracy(pAccuracy);
@@ -342,6 +344,8 @@ public void onAccuracyChanged(final Sensor pSensor, final int pAccuracy) {
 					this.mOrientationData.setMagneticFieldAccuracy(pAccuracy);
 					this.mOrientationListener.onOrientationAccuracyChanged(this.mOrientationData);
 					break;
+				default:
+					throw new IllegalArgumentException("Unexpected " + Sensor.class.getSimpleName() + " of Type: '" + sensorType + "'.");
 			}
 		}
 	}
@@ -349,7 +353,9 @@ public void onAccuracyChanged(final Sensor pSensor, final int pAccuracy) {
 	@Override
 	public void onSensorChanged(final SensorEvent pEvent) {
 		if (this.mRunning) {
-			switch (pEvent.sensor.getType()) {
+			final Sensor sensor = pEvent.sensor;
+			final int sensorType = sensor.getType();
+			switch (sensorType) {
 				case Sensor.TYPE_ACCELEROMETER:
 					if (this.mAccelerationData != null) {
 						this.mAccelerationData.setDisplayRotation(this.getDisplayOrientation());
@@ -366,6 +372,8 @@ public void onSensorChanged(final SensorEvent pEvent) {
 					this.mOrientationData.setMagneticFieldValues(pEvent.values);
 					this.mOrientationListener.onOrientationChanged(this.mOrientationData);
 					break;
+				default:
+					throw new IllegalArgumentException("Unexpected " + Sensor.class.getSimpleName() + " of Type: '" + sensorType + "'.");
 			}
 		}
 	}
@@ -406,6 +414,8 @@ public void onStatusChanged(final String pProvider, final int pStatus, final Bun
 			case LocationProvider.TEMPORARILY_UNAVAILABLE:
 				this.mLocationListener.onLocationProviderStatusChanged(LocationProviderStatus.TEMPORARILY_UNAVAILABLE, pExtras);
 				break;
+			default:
+				throw new IllegalArgumentException("Unexpected " + LocationProvider.class.getSimpleName() + ": '" + pStatus + "'.");
 		}
 	}
 
@@ -837,7 +847,7 @@ public void setEngine(final Engine pEngine) {
 		public void run() {
 			android.os.Process.setThreadPriority(this.mEngine.getEngineOptions().getUpdateThreadPriority());
 			try {
-				while(true) {
+				while (true) {
 					this.mRunnableHandler.onUpdate(0);
 					this.mEngine.onTickUpdate();
 				}
@@ -939,13 +949,13 @@ void notifyCanUpdate() {
 		}
 
 		void waitUntilCanDraw() throws InterruptedException {
-			while(!this.mDrawing.get()) {
+			while (!this.mDrawing.get()) {
 				this.mDrawingCondition.await();
 			}
 		}
 
 		void waitUntilCanUpdate() throws InterruptedException {
-			while(this.mDrawing.get()) {
+			while (this.mDrawing.get()) {
 				this.mDrawingCondition.await();
 			}
 		}
diff --git a/src/org/andengine/engine/FixedStepEngine.java b/src/org/andengine/engine/FixedStepEngine.java
index 04d212930..63c9a12ac 100644
--- a/src/org/andengine/engine/FixedStepEngine.java
+++ b/src/org/andengine/engine/FixedStepEngine.java
@@ -48,7 +48,7 @@ public void onUpdate(final long pNanosecondsElapsed) throws InterruptedException
 		this.mSecondsElapsedAccumulator += pNanosecondsElapsed;
 
 		final long stepLength = this.mStepLength;
-		while(this.mSecondsElapsedAccumulator >= stepLength) {
+		while (this.mSecondsElapsedAccumulator >= stepLength) {
 			super.onUpdate(stepLength);
 			this.mSecondsElapsedAccumulator -= stepLength;
 		}
diff --git a/src/org/andengine/engine/camera/CameraFactory.java b/src/org/andengine/engine/camera/CameraFactory.java
index c51a0cc7a..e7dbadce9 100644
--- a/src/org/andengine/engine/camera/CameraFactory.java
+++ b/src/org/andengine/engine/camera/CameraFactory.java
@@ -10,7 +10,7 @@
  * @author Nicolas Gramlich
  * @since 13:50:42 - 03.07.2010
  */
-public class CameraFactory {
+public final class CameraFactory {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -23,6 +23,10 @@ public class CameraFactory {
 	// Constructors
 	// ===========================================================
 
+	private CameraFactory() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java
index dc453c1f5..8feff2a61 100644
--- a/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java
+++ b/src/org/andengine/engine/camera/hud/controls/AnalogOnScreenControl.java
@@ -80,7 +80,7 @@ protected void onUpdateControlKnob(final float pRelativeX, final float pRelative
 			super.onUpdateControlKnob(pRelativeX, pRelativeY);
 		} else {
 			final float angleRad = MathUtils.atan2(pRelativeY, pRelativeX);
-			super.onUpdateControlKnob((float)Math.cos(angleRad) * 0.5f, (float)Math.sin(angleRad) * 0.5f);
+			super.onUpdateControlKnob((float) Math.cos(angleRad) * 0.5f, (float) Math.sin(angleRad) * 0.5f);
 		}
 	}
 
diff --git a/src/org/andengine/engine/handler/timer/TimerHandler.java b/src/org/andengine/engine/handler/timer/TimerHandler.java
index daafab6c4..9b278632c 100644
--- a/src/org/andengine/engine/handler/timer/TimerHandler.java
+++ b/src/org/andengine/engine/handler/timer/TimerHandler.java
@@ -82,7 +82,7 @@ public void setTimerCallbackTriggered(boolean pTimerCallbackTriggered) {
 	public void onUpdate(final float pSecondsElapsed) {
 		if (this.mAutoReset) {
 			this.mTimerSecondsElapsed += pSecondsElapsed;
-			while(this.mTimerSecondsElapsed >= this.mTimerSeconds) {
+			while (this.mTimerSecondsElapsed >= this.mTimerSeconds) {
 				this.mTimerSecondsElapsed -= this.mTimerSeconds;
 				this.mTimerCallback.onTimePassed(this);
 			}
diff --git a/src/org/andengine/engine/options/ConfigChooserOptions.java b/src/org/andengine/engine/options/ConfigChooserOptions.java
index 6840de889..7eadfd079 100644
--- a/src/org/andengine/engine/options/ConfigChooserOptions.java
+++ b/src/org/andengine/engine/options/ConfigChooserOptions.java
@@ -22,7 +22,7 @@ public class ConfigChooserOptions {
 	// Fields
 	// ===========================================================
 
-	private boolean mRequestedMultiSampling = false;
+	private boolean mRequestedMultiSampling;
 
 	private int mRequestedRedSize = ConfigChooserOptions.RED_SIZE_DEFAULT;
 	private int mRequestedGreenSize = ConfigChooserOptions.GREEN_SIZE_DEFAULT;
diff --git a/src/org/andengine/engine/options/RenderOptions.java b/src/org/andengine/engine/options/RenderOptions.java
index 398ea8137..fadd067c4 100644
--- a/src/org/andengine/engine/options/RenderOptions.java
+++ b/src/org/andengine/engine/options/RenderOptions.java
@@ -16,7 +16,7 @@ public class RenderOptions {
 	// Fields
 	// ===========================================================
 
-	private boolean mDithering = false;
+	private boolean mDithering;
 
 	private ConfigChooserOptions mConfigChooserOptions = new ConfigChooserOptions();
 
diff --git a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java
index 1db37f172..57f86e7ac 100644
--- a/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java
+++ b/src/org/andengine/engine/options/resolutionpolicy/RatioResolutionPolicy.java
@@ -48,7 +48,7 @@ public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback
 		final int specHeight = MeasureSpec.getSize(pHeightMeasureSpec);
 
 		final float desiredRatio = this.mRatio;
-		final float realRatio = (float)specWidth / specHeight;
+		final float realRatio = ((float) specWidth) / specHeight;
 
 		int measuredWidth;
 		int measuredHeight;
diff --git a/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java b/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java
index a4d6f7056..c84f24c0b 100644
--- a/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java
+++ b/src/org/andengine/engine/options/resolutionpolicy/RelativeResolutionPolicy.java
@@ -46,8 +46,8 @@ public RelativeResolutionPolicy(final float pWidthScale, final float pHeightScal
 	public void onMeasure(final IResolutionPolicy.Callback pResolutionPolicyCallback, final int pWidthMeasureSpec, final int pHeightMeasureSpec) {
 		BaseResolutionPolicy.throwOnNotMeasureSpecEXACTLY(pWidthMeasureSpec, pHeightMeasureSpec);
 
-		final int measuredWidth = (int)(MeasureSpec.getSize(pWidthMeasureSpec) * this.mWidthScale);
-		final int measuredHeight = (int)(MeasureSpec.getSize(pHeightMeasureSpec) * this.mHeightScale);
+		final int measuredWidth = (int) (MeasureSpec.getSize(pWidthMeasureSpec) * this.mWidthScale);
+		final int measuredHeight = (int) (MeasureSpec.getSize(pHeightMeasureSpec) * this.mHeightScale);
 
 		pResolutionPolicyCallback.onResolutionChanged(measuredWidth, measuredHeight);
 	}
diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java
index 0e3fb1c0a..de6eeb50e 100644
--- a/src/org/andengine/entity/Entity.java
+++ b/src/org/andengine/entity/Entity.java
@@ -875,7 +875,7 @@ public , S extends IEntity> L queryForSubclass(final IEntityMa
 		for (int i = 0; i < childCount; i++) {
 			final IEntity child = this.mChildren.get(i);
 			if (pEntityMatcher.matches(child)) {
-				pResult.add((S)child);
+				pResult.add((S) child);
 			}
 
 			child.queryForSubclass(pEntityMatcher, pResult);
@@ -1242,17 +1242,11 @@ public Transformation getSceneToLocalTransformation() {
 		return sceneToLocalTransformation;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float, float)
-	 */
 	@Override
 	public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY) {
 		return this.convertLocalCoordinatesToSceneCoordinates(pX, pY, Entity.VERTICES_LOCAL_TO_SCENE_TMP);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float, float, float[])
-	 */
 	@Override
 	public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY, final float[] pReuse) {
 		final Transformation localToSceneTransformation = this.getLocalToSceneTransformation();
@@ -1265,17 +1259,11 @@ public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final f
 		return pReuse;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float[])
-	 */
 	@Override
 	public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates) {
 		return this.convertLocalCoordinatesToSceneCoordinates(pCoordinates, Entity.VERTICES_LOCAL_TO_SCENE_TMP);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertLocalToSceneCoordinates(float[], float[])
-	 */
 	@Override
 	public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordinates, final float[] pReuse) {
 		final Transformation localToSceneTransformation = this.getLocalToSceneTransformation();
@@ -1288,17 +1276,11 @@ public float[] convertLocalCoordinatesToSceneCoordinates(final float[] pCoordina
 		return pReuse;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float, float)
-	 */
 	@Override
 	public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY) {
 		return this.convertSceneCoordinatesToLocalCoordinates(pX, pY, Entity.VERTICES_SCENE_TO_LOCAL_TMP);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float, float, float[])
-	 */
 	@Override
 	public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final float pY, final float[] pReuse) {
 		pReuse[Constants.VERTEX_INDEX_X] = pX;
@@ -1309,17 +1291,11 @@ public float[] convertSceneCoordinatesToLocalCoordinates(final float pX, final f
 		return pReuse;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float[])
-	 */
 	@Override
 	public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates) {
 		return this.convertSceneCoordinatesToLocalCoordinates(pCoordinates, Entity.VERTICES_SCENE_TO_LOCAL_TMP);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.andengine.entity.IEntity#convertSceneToLocalCoordinates(float[], float[])
-	 */
 	@Override
 	public float[] convertSceneCoordinatesToLocalCoordinates(final float[] pCoordinates, final float[] pReuse) {
 		pReuse[Constants.VERTEX_INDEX_X] = pCoordinates[Constants.VERTEX_INDEX_X];
@@ -1704,7 +1680,7 @@ private void assertEntityHasNoParent(final IEntity pEntity) throws IllegalStateE
 			final String entityClassName = pEntity.getClass().getSimpleName();
 			final String currentParentClassName = pEntity.getParent().getClass().getSimpleName();
 			final String newParentClassName = this.getClass().getSimpleName();
-			throw new IllegalStateException("pEntity '" + entityClassName +"' already has a parent: '" + currentParentClassName + "'. New parent: '" + newParentClassName + "'!");
+			throw new IllegalStateException("pEntity '" + entityClassName + "' already has a parent: '" + currentParentClassName + "'. New parent: '" + newParentClassName + "'!");
 		}
 	}
 
diff --git a/src/org/andengine/entity/clip/ClipEntity.java b/src/org/andengine/entity/clip/ClipEntity.java
index 1bdb3fc64..e16bb76fe 100644
--- a/src/org/andengine/entity/clip/ClipEntity.java
+++ b/src/org/andengine/entity/clip/ClipEntity.java
@@ -72,20 +72,20 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) {
 
 			/* Determine clipping coordinates of each corner in surface coordinates. */
 			final float[] lowerLeftSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(0, 0));
-			final int lowerLeftX = (int)Math.round(lowerLeftSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
-			final int lowerLeftY = surfaceHeight - (int)Math.round(lowerLeftSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
+			final int lowerLeftX = (int) Math.round(lowerLeftSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
+			final int lowerLeftY = surfaceHeight - (int) Math.round(lowerLeftSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
 
 			final float[] upperLeftSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(0, this.mHeight));
-			final int upperLeftX = (int)Math.round(upperLeftSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
-			final int upperLeftY = surfaceHeight - (int)Math.round(upperLeftSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
+			final int upperLeftX = (int) Math.round(upperLeftSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
+			final int upperLeftY = surfaceHeight - (int) Math.round(upperLeftSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
 
 			final float[] upperRightSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(this.mWidth, this.mHeight));
-			final int upperRightX = (int)Math.round(upperRightSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
-			final int upperRightY = surfaceHeight - (int)Math.round(upperRightSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
+			final int upperRightX = (int) Math.round(upperRightSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
+			final int upperRightY = surfaceHeight - (int) Math.round(upperRightSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
 
 			final float[] lowerRightSurfaceCoordinates = pCamera.getSurfaceCoordinatesFromSceneCoordinates(this.convertLocalCoordinatesToSceneCoordinates(this.mWidth, 0));
-			final int lowerRightX = (int)Math.round(lowerRightSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
-			final int lowerRightY = surfaceHeight - (int)Math.round(lowerRightSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
+			final int lowerRightX = (int) Math.round(lowerRightSurfaceCoordinates[Constants.VERTEX_INDEX_X]);
+			final int lowerRightY = surfaceHeight - (int) Math.round(lowerRightSurfaceCoordinates[Constants.VERTEX_INDEX_Y]);
 
 			/* Determine minimum and maximum x clipping coordinates. */
 			final int minClippingX = MathUtils.min(lowerLeftX, upperLeftX, upperRightX, lowerRightX);
diff --git a/src/org/andengine/entity/modifier/IEntityModifier.java b/src/org/andengine/entity/modifier/IEntityModifier.java
index 0349e9872..3ac327a21 100644
--- a/src/org/andengine/entity/modifier/IEntityModifier.java
+++ b/src/org/andengine/entity/modifier/IEntityModifier.java
@@ -27,7 +27,7 @@ public interface IEntityModifier extends IModifier {
 	// Inner and Anonymous Classes
 	// ===========================================================
 
-	public static interface IEntityModifierListener extends IModifierListener{
+	public static interface IEntityModifierListener extends IModifierListener {
 		// ===========================================================
 		// Constants
 		// ===========================================================
diff --git a/src/org/andengine/entity/modifier/PathModifier.java b/src/org/andengine/entity/modifier/PathModifier.java
index 9925e4717..6845a0220 100644
--- a/src/org/andengine/entity/modifier/PathModifier.java
+++ b/src/org/andengine/entity/modifier/PathModifier.java
@@ -215,7 +215,7 @@ public static class Path {
 		private final float[] mYs;
 
 		private int mIndex;
-		private boolean mLengthChanged = false;
+		private boolean mLengthChanged;
 		private float mLength;
 
 		// ===========================================================
@@ -314,7 +314,7 @@ public float getSegmentLength(final int pSegmentIndex) {
 			final float dx = coordinatesX[pSegmentIndex] - coordinatesX[nextSegmentIndex];
 			final float dy = coordinatesY[pSegmentIndex] - coordinatesY[nextSegmentIndex];
 
-			return (float)Math.sqrt(dx * dx + dy * dy);
+			return (float) Math.sqrt(dx * dx + dy * dy);
 		}
 
 		// ===========================================================
diff --git a/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java b/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java
index dcfda3409..d3a236a3f 100644
--- a/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java
+++ b/src/org/andengine/entity/modifier/QuadraticBezierCurveMoveModifier.java
@@ -121,8 +121,8 @@ protected void onManagedUpdate(final float pSecondsElapsed, final IEntity pEntit
 		final float percentageDone = this.mEaseFunction.getPercentage(this.getSecondsElapsed(), this.mDuration);
 
 		final float u = 1 - percentageDone;
-		final float tt = percentageDone*percentageDone;
-		final float uu = u*u;
+		final float tt = percentageDone * percentageDone;
+		final float uu = u * u;
 
 		final float ut2 = 2 * u * percentageDone;
 
diff --git a/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java
index cdd6c7eec..b3c7c27ad 100644
--- a/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java
+++ b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java
@@ -30,11 +30,11 @@ public class BlendFunctionParticleSystem extends ParticleSyst
 	// Constructors
 	// ===========================================================
 
-	public BlendFunctionParticleSystem(IEntityFactory pEntityFactory, IParticleEmitter pParticleEmitter, float pRateMinimum, float pRateMaximum, int pParticlesMaximum) {
+	public BlendFunctionParticleSystem(final IEntityFactory pEntityFactory, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum) {
 		super(pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
 	}
 
-	public BlendFunctionParticleSystem(float pX, float pY, IEntityFactory pEntityFactory, IParticleEmitter pParticleEmitter, float pRateMinimum, float pRateMaximum, int pParticlesMaximum) {
+	public BlendFunctionParticleSystem(final float pX, final float pY, final IEntityFactory pEntityFactory, final IParticleEmitter pParticleEmitter, final float pRateMinimum, final float pRateMaximum, final int pParticlesMaximum) {
 		super(pX, pY, pEntityFactory, pParticleEmitter, pRateMinimum, pRateMaximum, pParticlesMaximum);
 	}
 
diff --git a/src/org/andengine/entity/particle/ParticleSystem.java b/src/org/andengine/entity/particle/ParticleSystem.java
index 2f9b1180c..725b0b946 100644
--- a/src/org/andengine/entity/particle/ParticleSystem.java
+++ b/src/org/andengine/entity/particle/ParticleSystem.java
@@ -11,6 +11,7 @@
 import org.andengine.entity.particle.modifier.IParticleModifier;
 import org.andengine.opengl.util.GLState;
 import org.andengine.util.Constants;
+import org.andengine.util.adt.array.ArrayUtils;
 import org.andengine.util.math.MathUtils;
 
 /**
@@ -62,7 +63,7 @@ public ParticleSystem(final float pX, final float pY, final IEntityFactory pE
 
 		this.mEntityFactory = pEntityFactory;
 		this.mParticleEmitter = pParticleEmitter;
-		this.mParticles = (Particle[])new Particle[pParticlesMaximum];
+		this.mParticles = (Particle[]) new Particle[pParticlesMaximum];
 		this.mRateMinimum = pRateMinimum;
 		this.mRateMaximum = pRateMaximum;
 		this.mParticlesMaximum = pParticlesMaximum;
@@ -176,7 +177,7 @@ private void spawnParticles(final float pSecondsElapsed) {
 
 		this.mParticlesDueToSpawn += newParticlesThisFrame;
 
-		final int particlesToSpawnThisFrame = Math.min(this.mParticlesMaximum - this.mParticlesAlive, (int)Math.floor(this.mParticlesDueToSpawn));
+		final int particlesToSpawnThisFrame = Math.min(this.mParticlesMaximum - this.mParticlesAlive, (int) Math.floor(this.mParticlesDueToSpawn));
 		this.mParticlesDueToSpawn -= particlesToSpawnThisFrame;
 
 		for (int i = 0; i < particlesToSpawnThisFrame; i++) {
diff --git a/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java b/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java
index b4788d190..9807c8247 100644
--- a/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java
+++ b/src/org/andengine/entity/particle/emitter/CircleOutlineParticleEmitter.java
@@ -45,8 +45,8 @@ public CircleOutlineParticleEmitter(final float pCenterX, final float pCenterY,
 	@Override
 	public void getPositionOffset(final float[] pOffset) {
 		final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI * 2;
-		pOffset[VERTEX_INDEX_X] = this.mCenterX + (float)Math.cos(random) * this.mRadiusX;
-		pOffset[VERTEX_INDEX_Y] = this.mCenterY + (float)Math.sin(random) * this.mRadiusY;
+		pOffset[VERTEX_INDEX_X] = this.mCenterX + (float) Math.cos(random) * this.mRadiusX;
+		pOffset[VERTEX_INDEX_Y] = this.mCenterY + (float) Math.sin(random) * this.mRadiusY;
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java b/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java
index 61503e894..f492a7609 100644
--- a/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java
+++ b/src/org/andengine/entity/particle/emitter/CircleParticleEmitter.java
@@ -45,8 +45,8 @@ public CircleParticleEmitter(final float pCenterX, final float pCenterY, final f
 	@Override
 	public void getPositionOffset(final float[] pOffset) {
 		final float random = MathUtils.RANDOM.nextFloat() * MathConstants.PI * 2;
-		pOffset[VERTEX_INDEX_X] = this.mCenterX + (float)Math.cos(random) * this.mRadiusX * MathUtils.RANDOM.nextFloat();
-		pOffset[VERTEX_INDEX_Y] = this.mCenterY + (float)Math.sin(random) * this.mRadiusY * MathUtils.RANDOM.nextFloat();
+		pOffset[VERTEX_INDEX_X] = this.mCenterX + (float) Math.cos(random) * this.mRadiusX * MathUtils.RANDOM.nextFloat();
+		pOffset[VERTEX_INDEX_Y] = this.mCenterY + (float) Math.sin(random) * this.mRadiusY * MathUtils.RANDOM.nextFloat();
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/entity/particle/initializer/BlendFunctionParticleInitializer.java b/src/org/andengine/entity/particle/initializer/BlendFunctionParticleInitializer.java
index b1c306d23..9c1909f9b 100644
--- a/src/org/andengine/entity/particle/initializer/BlendFunctionParticleInitializer.java
+++ b/src/org/andengine/entity/particle/initializer/BlendFunctionParticleInitializer.java
@@ -9,7 +9,7 @@
 /**
  * Sets the blend function used to draw the {@link Particle} during its lifespan. Only applicable to {@link Shape}s.
  *
- * @author janne.sinivirta
+ * @author Janne Sinivirta
  *
  * @since 17:24:32 - 28.12.2011
  */
diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java
index cdb34960b..e5de4c40b 100644
--- a/src/org/andengine/entity/primitive/Gradient.java
+++ b/src/org/andengine/entity/primitive/Gradient.java
@@ -374,7 +374,7 @@ public void setGradientVector(final float pGradientVectorX, final float pGradien
 	public void setGradientAngle(final float pGradientAngle) {
 		final float angleInRad = MathUtils.degToRad(pGradientAngle);
 
-		this.setGradientVector((float)Math.cos(angleInRad), (float)Math.sin(angleInRad));
+		this.setGradientVector((float) Math.cos(angleInRad), (float) Math.sin(angleInRad));
 	}
 
 	public void setGradientColor(final float pFromRed, final float pToRed, final float pFromGreen, final float pToGreen, final float pFromBlue, final float pToBlue) {
diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java
index 6085cfb7a..9c5a85c4c 100644
--- a/src/org/andengine/entity/primitive/Line.java
+++ b/src/org/andengine/entity/primitive/Line.java
@@ -219,7 +219,7 @@ public void setHeight(final float pHeight) {
 
 	@Deprecated
 	@Override
-	public void setSize(float pWidth, float pHeight) {
+	public void setSize(final float pWidth, final float pHeight) {
 		super.setSize(pWidth, pHeight);
 	}
 
diff --git a/src/org/andengine/entity/scene/background/Background.java b/src/org/andengine/entity/scene/background/Background.java
index fe24b9c88..7dfe93155 100644
--- a/src/org/andengine/entity/scene/background/Background.java
+++ b/src/org/andengine/entity/scene/background/Background.java
@@ -27,7 +27,7 @@ public class Background implements IBackground {
 	// Fields
 	// ===========================================================
 
-	private ModifierList mBackgroundModifiers = null;
+	private ModifierList mBackgroundModifiers;
 
 	private final Color mColor = new Color(0, 0, 0, 1);
 	private boolean mColorEnabled = true;
diff --git a/src/org/andengine/entity/scene/background/ParallaxBackground.java b/src/org/andengine/entity/scene/background/ParallaxBackground.java
index 572b03098..c3f0dc14c 100644
--- a/src/org/andengine/entity/scene/background/ParallaxBackground.java
+++ b/src/org/andengine/entity/scene/background/ParallaxBackground.java
@@ -131,7 +131,7 @@ public void onDraw(final GLState pGLState, final Camera pCamera, final float pPa
 				final float entityWidthScaled = this.mEntity.getWidth() * this.mEntity.getScaleX();
 				float baseOffset = (pParallaxValue * this.mParallaxFactor) % entityWidthScaled;
 
-				while(baseOffset > 0) {
+				while (baseOffset > 0) {
 					baseOffset -= entityWidthScaled;
 				}
 				pGLState.translateModelViewGLMatrixf(baseOffset, 0, 0);
@@ -142,7 +142,7 @@ public void onDraw(final GLState pGLState, final Camera pCamera, final float pPa
 					this.mEntity.onDraw(pGLState, pCamera);
 					pGLState.translateModelViewGLMatrixf(entityWidthScaled, 0, 0);
 					currentMaxX += entityWidthScaled;
-				} while(currentMaxX < cameraWidth);
+				} while (currentMaxX < cameraWidth);
 			}
 			pGLState.popModelViewGLMatrix();
 		}
diff --git a/src/org/andengine/entity/scene/background/SpriteBackground.java b/src/org/andengine/entity/scene/background/SpriteBackground.java
index acec658c4..9a752e67b 100644
--- a/src/org/andengine/entity/scene/background/SpriteBackground.java
+++ b/src/org/andengine/entity/scene/background/SpriteBackground.java
@@ -35,7 +35,7 @@ public SpriteBackground(final float pRed, final float pGreen, final float pBlue,
 	// ===========================================================
 
 	public Sprite getSprite() {
-		return (Sprite)this.mEntity;
+		return (Sprite) this.mEntity;
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java
index 31d92786d..eecd46d6a 100644
--- a/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java
+++ b/src/org/andengine/entity/scene/background/modifier/IBackgroundModifier.java
@@ -26,7 +26,7 @@ public interface IBackgroundModifier extends IModifier {
 	// Inner and Anonymous Classes
 	// ===========================================================
 
-	public static interface IBackgroundModifierListener extends IModifierListener{
+	public static interface IBackgroundModifierListener extends IModifierListener {
 		// ===========================================================
 		// Constants
 		// ===========================================================
diff --git a/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java b/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java
index 14dc9784f..0932a868d 100644
--- a/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java
+++ b/src/org/andengine/entity/scene/background/modifier/LoopBackgroundModifier.java
@@ -32,7 +32,7 @@ public LoopBackgroundModifier(final IBackgroundModifier pBackgroundModifier, fin
 	}
 
 	public LoopBackgroundModifier(final IBackgroundModifier pBackgroundModifier, final int pLoopCount, final ILoopBackgroundModifierListener pLoopModifierListener) {
-		super(pBackgroundModifier, pLoopCount, pLoopModifierListener, (IBackgroundModifierListener)null);
+		super(pBackgroundModifier, pLoopCount, pLoopModifierListener, (IBackgroundModifierListener) null);
 	}
 
 	public LoopBackgroundModifier(final IBackgroundModifier pBackgroundModifier, final int pLoopCount, final IBackgroundModifierListener pBackgroundModifierListener) {
diff --git a/src/org/andengine/entity/shape/Shape.java b/src/org/andengine/entity/shape/Shape.java
index d2ad07248..2bff0c0b3 100644
--- a/src/org/andengine/entity/shape/Shape.java
+++ b/src/org/andengine/entity/shape/Shape.java
@@ -29,7 +29,7 @@ public abstract class Shape extends Entity implements IShape {
 	protected int mBlendFunctionSource = IShape.BLENDFUNCTION_SOURCE_DEFAULT;
 	protected int mBlendFunctionDestination = IShape.BLENDFUNCTION_DESTINATION_DEFAULT;
 
-	protected boolean mBlendingEnabled = false;
+	protected boolean mBlendingEnabled;
 
 	protected ShaderProgram mShaderProgram;
 
diff --git a/src/org/andengine/entity/sprite/AnimatedSprite.java b/src/org/andengine/entity/sprite/AnimatedSprite.java
index 44f5aaed9..40fb4bb40 100644
--- a/src/org/andengine/entity/sprite/AnimatedSprite.java
+++ b/src/org/andengine/entity/sprite/AnimatedSprite.java
@@ -127,14 +127,14 @@ protected void onManagedUpdate(final float pSecondsElapsed) {
 			this.mAnimationProgress += nanoSecondsElapsed;
 
 			if (loopCount == IAnimationData.LOOP_CONTINUOUS) {
-				while(this.mAnimationProgress > animationDuration ) {
+				while (this.mAnimationProgress > animationDuration) {
 					this.mAnimationProgress -= animationDuration;
 					if (this.mAnimationListener != null) {
 						this.mAnimationListener.onAnimationLoopFinished(this, this.mRemainingLoopCount, loopCount);
 					}
 				}
 			} else {
-				while(this.mAnimationProgress > animationDuration) {
+				while (this.mAnimationProgress > animationDuration) {
 					this.mAnimationProgress -= animationDuration;
 					this.mRemainingLoopCount--;
 					if (this.mRemainingLoopCount < 0) {
@@ -212,7 +212,7 @@ public void animate(final long pFrameDurationEach, final int pLoopCount, final I
 	}
 
 	public void animate(final long[] pFrameDurations) {
-		this.animate(pFrameDurations, (IAnimationListener)null);
+		this.animate(pFrameDurations, (IAnimationListener) null);
 	}
 
 	public void animate(final long[] pFrameDurations, final IAnimationListener pAnimationListener) {
diff --git a/src/org/andengine/entity/sprite/NineSliceSprite.java b/src/org/andengine/entity/sprite/NineSliceSprite.java
index 875905c19..55dde6f11 100644
--- a/src/org/andengine/entity/sprite/NineSliceSprite.java
+++ b/src/org/andengine/entity/sprite/NineSliceSprite.java
@@ -20,6 +20,8 @@ public class NineSliceSprite extends Entity {
 	// Constants
 	// ===========================================================
 
+	private static final int NINESLICESPRITE_CHILD_COUNT = 9;
+
 	// ===========================================================
 	// Fields
 	// ===========================================================
@@ -69,7 +71,7 @@ public NineSliceSprite(final float pX, final float pY, final float pWidth, final
 		this.mInsetBottom = pInsetBottom;
 
 		final ITexture texture = pTextureRegion.getTexture();
-		this.mSpriteBatch = new SpriteBatch(texture, 9, pVertexBufferObjectManager, pShaderProgram);
+		this.mSpriteBatch = new SpriteBatch(texture, NINESLICESPRITE_CHILD_COUNT, pVertexBufferObjectManager, pShaderProgram);
 
 		this.mTopLeftTextureRegion = new TextureRegion(texture, 0, 0, 0, 0);
 		this.mTopCenterTextureRegion = new TextureRegion(texture, 0, 0, 0, 0);
diff --git a/src/org/andengine/entity/sprite/batch/SpriteGroup.java b/src/org/andengine/entity/sprite/batch/SpriteGroup.java
index 9686c0c3c..859eea85c 100644
--- a/src/org/andengine/entity/sprite/batch/SpriteGroup.java
+++ b/src/org/andengine/entity/sprite/batch/SpriteGroup.java
@@ -130,7 +130,7 @@ public SpriteGroup(final float pX, final float pY, final ITexture pTexture, fina
 	@Deprecated
 	public void attachChild(final IEntity pEntity) throws IllegalArgumentException {
 		if (pEntity instanceof Sprite) {
-			this.attachChild((Sprite)pEntity);
+			this.attachChild((Sprite) pEntity);
 		} else {
 			throw new IllegalArgumentException("A " + SpriteGroup.class.getSimpleName() + " can only handle children of type Sprite or subclasses of Sprite, like TiledSprite or AnimatedSprite.");
 		}
@@ -157,7 +157,7 @@ protected boolean onUpdateSpriteBatch() {
 		} else {
 			final int childCount = children.size();
 			for (int i = 0; i < childCount; i++) {
-				this.drawWithoutChecks((Sprite)children.get(i));
+				this.drawWithoutChecks((Sprite) children.get(i));
 			}
 			return true;
 		}
diff --git a/src/org/andengine/entity/text/TickerText.java b/src/org/andengine/entity/text/TickerText.java
index 5b813df0b..4f5a9fc1c 100644
--- a/src/org/andengine/entity/text/TickerText.java
+++ b/src/org/andengine/entity/text/TickerText.java
@@ -76,7 +76,7 @@ public int getCharactersVisible() {
 	}
 
 	@Override
-	public void setText(CharSequence pText) throws OutOfCharactersException {
+	public void setText(final CharSequence pText) throws OutOfCharactersException {
 		super.setText(pText);
 
 		if (this.mTickerTextOptions != null) {
diff --git a/src/org/andengine/entity/util/ScreenCapture.java b/src/org/andengine/entity/util/ScreenCapture.java
index 4e9f56fa2..53b78579d 100644
--- a/src/org/andengine/entity/util/ScreenCapture.java
+++ b/src/org/andengine/entity/util/ScreenCapture.java
@@ -25,6 +25,8 @@ public class ScreenCapture extends Entity implements IScreenGrabberCallback {
 	// Constants
 	// ===========================================================
 
+	private static final int PNG_QUALITY_MAXIMUM = 100;
+
 	// ===========================================================
 	// Fields
 	// ===========================================================
@@ -95,7 +97,7 @@ private static void saveCapture(final Bitmap pBitmap, final String pFilePath) th
 		FileOutputStream out = null;
 		try {
 			out = new FileOutputStream(pFilePath);
-			pBitmap.compress(CompressFormat.PNG, 100, out);
+			pBitmap.compress(CompressFormat.PNG, PNG_QUALITY_MAXIMUM, out);
 		} catch (final FileNotFoundException e) {
 			StreamUtils.flushAndCloseStream(out);
 			Debug.e("Error saving file to: " + pFilePath, e);
diff --git a/src/org/andengine/entity/util/ScreenGrabber.java b/src/org/andengine/entity/util/ScreenGrabber.java
index 7f9868b5d..371e76464 100644
--- a/src/org/andengine/entity/util/ScreenGrabber.java
+++ b/src/org/andengine/entity/util/ScreenGrabber.java
@@ -32,7 +32,7 @@ public class ScreenGrabber extends Entity {
 	private int mGrabWidth;
 	private int mGrabHeight;
 
-	private boolean mScreenGrabPending = false;
+	private boolean mScreenGrabPending;
 	private IScreenGrabberCallback mScreenGrabCallback;
 
 	// ===========================================================
diff --git a/src/org/andengine/input/touch/controller/MultiTouch.java b/src/org/andengine/input/touch/controller/MultiTouch.java
index fce574f4f..5dec02b9d 100644
--- a/src/org/andengine/input/touch/controller/MultiTouch.java
+++ b/src/org/andengine/input/touch/controller/MultiTouch.java
@@ -12,7 +12,7 @@
  * @author Nicolas Gramlich
  * @since 16:00:38 - 14.07.2010
  */
-public class MultiTouch {
+public final class MultiTouch {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -21,13 +21,17 @@ public class MultiTouch {
 	// Fields
 	// ===========================================================
 
-	private static Boolean SUPPORTED = null;
-	private static Boolean SUPPORTED_DISTINCT = null;
+	private static Boolean sSupported;
+	private static Boolean sSupportedDistinct;
 
 	// ===========================================================
 	// Constructors
 	// ===========================================================
 
+	private MultiTouch() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -41,19 +45,19 @@ public class MultiTouch {
 	// ===========================================================
 
 	public static boolean isSupported(final Context pContext) {
-		if (MultiTouch.SUPPORTED == null) {
-			MultiTouch.SUPPORTED = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH);
+		if (MultiTouch.sSupported == null) {
+			MultiTouch.sSupported = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH);
 		}
 
-		return MultiTouch.SUPPORTED;
+		return MultiTouch.sSupported;
 	}
 
 	public static boolean isSupportedDistinct(final Context pContext) {
-		if (MultiTouch.SUPPORTED_DISTINCT == null) {
-			MultiTouch.SUPPORTED_DISTINCT = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
+		if (MultiTouch.sSupportedDistinct == null) {
+			MultiTouch.sSupportedDistinct = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
 		}
 
-		return MultiTouch.SUPPORTED_DISTINCT;
+		return MultiTouch.sSupportedDistinct;
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/opengl/font/BitmapFont.java b/src/org/andengine/opengl/font/BitmapFont.java
index a67a647e7..52c494ed6 100644
--- a/src/org/andengine/opengl/font/BitmapFont.java
+++ b/src/org/andengine/opengl/font/BitmapFont.java
@@ -416,7 +416,7 @@ private void parseCharacters(final int pCharacterCount, final BufferedReader pBu
 			final float u2 = (x + width) / textureWidth;
 			final float v2 = (y + height) / textureHeight;
 
-			this.mCharacterToLetterMap.put(id, new Letter((char)id, x, y, width, height, xOffset, yOffset, xAdvance, u, v, u2, v2));
+			this.mCharacterToLetterMap.put(id, new Letter((char) id, x, y, width, height, xOffset, yOffset, xAdvance, u, v, u2, v2));
 		}
 	}
 
diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java
index aa53a6be0..892743442 100644
--- a/src/org/andengine/opengl/font/FontFactory.java
+++ b/src/org/andengine/opengl/font/FontFactory.java
@@ -17,7 +17,7 @@
  * @author Nicolas Gramlich
  * @since 17:17:28 - 16.06.2010
  */
-public class FontFactory {
+public final class FontFactory {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -35,6 +35,10 @@ public class FontFactory {
 	// Constructors
 	// ===========================================================
 
+	private FontFactory() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/opengl/font/FontUtils.java b/src/org/andengine/opengl/font/FontUtils.java
index a3329e4ba..2232cde0a 100644
--- a/src/org/andengine/opengl/font/FontUtils.java
+++ b/src/org/andengine/opengl/font/FontUtils.java
@@ -228,11 +228,11 @@ private static > L splitLinesByWords(final IFont pF
 		float lineWidthRemaining = pAutoWrapWidth;
 		boolean firstWordInLine = true;
 		int i = 0;
-		while(i < textLength) {
+		while (i < textLength) {
 			int spacesSkipped = 0;
 			/* Find next word. */
 			{ /* Skip whitespaces. */
-				while((i < textLength) && (pText.charAt(i) == ' ')) {
+				while ((i < textLength) && (pText.charAt(i) == ' ')) {
 					i++;
 					spacesSkipped++;
 				}
@@ -245,7 +245,7 @@ private static > L splitLinesByWords(final IFont pF
 			}
 
 			{ /* Skip non-whitespaces. */
-				while((i < textLength) && (pText.charAt(i) != ' ')) {
+				while ((i < textLength) && (pText.charAt(i) != ' ')) {
 					i++;
 				}
 			}
@@ -342,31 +342,31 @@ private static > L splitLinesByCJK(final IFont pFon
 		int lineEnd = 0;
 
 		/* Skip whitespaces at the beginning of the string. */
-		while((lineStart < textLength) && (pText.charAt(lineStart) == ' ')) {
+		while ((lineStart < textLength) && (pText.charAt(lineStart) == ' ')) {
 			lineStart++;
 			lineEnd++;
 		}
 
 		int i = lineEnd;
-		while(i < textLength) {
+		while (i < textLength) {
 			lineStart = lineEnd;
 
 			{ /* Look for a sub string */
 				boolean charsAvailable = true;
-				while(i < textLength) {
+				while (i < textLength) {
 
 					{ /* Skip whitespaces at the end of the string */
 						int j = lineEnd;
-						while ( j < textLength ) {
-							if ( pText.charAt( j ) == ' ' ) {
+						while (j < textLength) {
+							if (pText.charAt(j) == ' ') {
 								j++;
 							}
 							else {
 								break;
 							}
 						}
-						if ( j == textLength ) {
-							if ( lineStart == lineEnd ) {
+						if (j == textLength) {
+							if (lineStart == lineEnd) {
 								charsAvailable = false;
 							}
 							i = textLength;
@@ -379,7 +379,7 @@ private static > L splitLinesByCJK(final IFont pFon
 					final float lineWidth = FontUtils.measureText(pFont, pText, lineStart, lineEnd);
 
 					if (lineWidth > pAutoWrapWidth) {
-						if ( lineStart < lineEnd - 1 ) {
+						if (lineStart < lineEnd - 1) {
 							lineEnd--;
 						}
 
diff --git a/src/org/andengine/opengl/shader/ShaderProgram.java b/src/org/andengine/opengl/shader/ShaderProgram.java
index 15fe2cb0a..adaecfdeb 100644
--- a/src/org/andengine/opengl/shader/ShaderProgram.java
+++ b/src/org/andengine/opengl/shader/ShaderProgram.java
@@ -203,7 +203,7 @@ private void initUniformLocations() throws ShaderProgramLinkException {
 
 			/* Some drivers do not report the actual length here, but zero. Then the name is '\0' terminated. */
 			if (length == 0) {
-				while((length < ShaderProgram.NAME_CONTAINER_SIZE) && (ShaderProgram.NAME_CONTAINER[length] != '\0')) {
+				while ((length < ShaderProgram.NAME_CONTAINER_SIZE) && (ShaderProgram.NAME_CONTAINER[length] != '\0')) {
 					length++;
 				}
 			}
@@ -214,7 +214,7 @@ private void initUniformLocations() throws ShaderProgramLinkException {
 			if (location == ShaderProgramConstants.LOCATION_INVALID) {
 				/* Some drivers do not report an incorrect length. Then the name is '\0' terminated. */
 				length = 0;
-				while(length < ShaderProgram.NAME_CONTAINER_SIZE && ShaderProgram.NAME_CONTAINER[length] != '\0') {
+				while (length < ShaderProgram.NAME_CONTAINER_SIZE && ShaderProgram.NAME_CONTAINER[length] != '\0') {
 					length++;
 				}
 
@@ -248,7 +248,7 @@ private void initAttributeLocations() {
 
 			/* Some drivers do not report the actual length here, but zero. Then the name is '\0' terminated. */
 			if (length == 0) {
-				while((length < ShaderProgram.NAME_CONTAINER_SIZE) && (ShaderProgram.NAME_CONTAINER[length] != '\0')) {
+				while ((length < ShaderProgram.NAME_CONTAINER_SIZE) && (ShaderProgram.NAME_CONTAINER[length] != '\0')) {
 					length++;
 				}
 			}
@@ -259,7 +259,7 @@ private void initAttributeLocations() {
 			if (location == ShaderProgramConstants.LOCATION_INVALID) {
 				/* Some drivers do not report an incorrect length. Then the name is '\0' terminated. */
 				length = 0;
-				while(length < ShaderProgram.NAME_CONTAINER_SIZE && ShaderProgram.NAME_CONTAINER[length] != '\0') {
+				while (length < ShaderProgram.NAME_CONTAINER_SIZE && ShaderProgram.NAME_CONTAINER[length] != '\0') {
 					length++;
 				}
 
diff --git a/src/org/andengine/opengl/texture/EmptyTexture.java b/src/org/andengine/opengl/texture/EmptyTexture.java
index bc69fcc29..7615f8b9e 100644
--- a/src/org/andengine/opengl/texture/EmptyTexture.java
+++ b/src/org/andengine/opengl/texture/EmptyTexture.java
@@ -29,7 +29,7 @@ public class EmptyTexture extends Texture{
 	// ==========================================================
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight) {
-		this(pTextureManager, pWidth, pHeight, (ITextureStateListener)null);
+		this(pTextureManager, pWidth, pHeight, (ITextureStateListener) null);
 	}
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final ITextureStateListener pTextureStateListener) {
@@ -37,7 +37,7 @@ public EmptyTexture(final TextureManager pTextureManager, final int pWidth, fina
 	}
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat) {
-		this(pTextureManager, pWidth, pHeight, pPixelFormat, (ITextureStateListener)null);
+		this(pTextureManager, pWidth, pHeight, pPixelFormat, (ITextureStateListener) null);
 	}
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final ITextureStateListener pTextureStateListener) {
@@ -45,7 +45,7 @@ public EmptyTexture(final TextureManager pTextureManager, final int pWidth, fina
 	}
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final TextureOptions pTextureOptions) {
-		this(pTextureManager, pWidth, pHeight, pTextureOptions, (ITextureStateListener)null);
+		this(pTextureManager, pWidth, pHeight, pTextureOptions, (ITextureStateListener) null);
 	}
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) {
@@ -53,7 +53,7 @@ public EmptyTexture(final TextureManager pTextureManager, final int pWidth, fina
 	}
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions) {
-		this(pTextureManager, pWidth, pHeight, pPixelFormat, pTextureOptions, (ITextureStateListener)null);
+		this(pTextureManager, pWidth, pHeight, pPixelFormat, pTextureOptions, (ITextureStateListener) null);
 	}
 
 	public EmptyTexture(final TextureManager pTextureManager, final int pWidth, final int pHeight, final PixelFormat pPixelFormat, final TextureOptions pTextureOptions, final ITextureStateListener pTextureStateListener) {
diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java
index eb1865817..7ca1c24cb 100644
--- a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java
+++ b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java
@@ -24,7 +24,7 @@
  * @author Nicolas Gramlich
  * @since 18:15:14 - 09.03.2010
  */
-public class BitmapTextureAtlasTextureRegionFactory {
+public final class BitmapTextureAtlasTextureRegionFactory {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -39,6 +39,10 @@ public class BitmapTextureAtlasTextureRegionFactory {
 	// Constructors
 	// ===========================================================
 
+	private BitmapTextureAtlasTextureRegionFactory() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java
index 6dabf25c4..8b7773f07 100644
--- a/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java
+++ b/src/org/andengine/opengl/texture/atlas/buildable/BuildableTextureAtlasTextureRegionFactory.java
@@ -15,7 +15,7 @@
  * @author Nicolas Gramlich
  * @since 16:42:08 - 12.07.2011
  */
-public class BuildableTextureAtlasTextureRegionFactory {
+public final class BuildableTextureAtlasTextureRegionFactory {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -28,6 +28,10 @@ public class BuildableTextureAtlasTextureRegionFactory {
 	// Constructors
 	// ===========================================================
 
+	private BuildableTextureAtlasTextureRegionFactory() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java
index de02f9d9e..bfba68606 100644
--- a/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java
+++ b/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java
@@ -13,7 +13,7 @@
  * @author Nicolas Gramlich 
  * @since 15:17:47 - 23.01.2012
  */
-public interface IBuildableTextureAtlas> extends ITextureAtlas{
+public interface IBuildableTextureAtlas> extends ITextureAtlas {
 	// ===========================================================
 	// Constants
 	// ===========================================================
diff --git a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java
index 5ad368ef0..1f7053279 100644
--- a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java
+++ b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java
@@ -65,7 +65,7 @@ public void loadPVRTextureData(final IPVRTexturePixelBufferStrategyBufferManager
 		/* Load stripes. */
 		int currentStripePixelDataOffset = pCurrentPixelDataOffset;
 		int currentStripeOffsetY = 0;
-		while(currentStripeOffsetY < pHeight) {
+		while (currentStripeOffsetY < pHeight) {
 			final int currentStripeHeight = Math.min(pHeight - currentStripeOffsetY, stripeHeight);
 			final int currentStripePixelDataSize = currentStripeHeight * bytesPerRow;
 
diff --git a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java
index d3516f4ad..68069d798 100644
--- a/src/org/andengine/opengl/texture/region/TextureRegionFactory.java
+++ b/src/org/andengine/opengl/texture/region/TextureRegionFactory.java
@@ -13,7 +13,7 @@
  * @author Nicolas Gramlich
  * @since 18:15:14 - 09.03.2010
  */
-public class TextureRegionFactory {
+public final class TextureRegionFactory {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -26,6 +26,10 @@ public class TextureRegionFactory {
 	// Constructors
 	// ===========================================================
 
+	private TextureRegionFactory() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java b/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java
index 16c0d0b22..eaef8becb 100644
--- a/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java
+++ b/src/org/andengine/ui/dialog/GenericInputDialogBuilder.java
@@ -91,7 +91,7 @@ public Dialog create() {
 			@Override
 			public void onClick(final DialogInterface pDialog, final int pWhich) {
 				final T result;
-				try{
+				try {
 					result = GenericInputDialogBuilder.this.generateResult(etInput.getText().toString());
 				} catch (final IllegalArgumentException e) {
 					Debug.e("Error in GenericInputDialogBuilder.generateResult()", e);
diff --git a/src/org/andengine/util/ActivityUtils.java b/src/org/andengine/util/ActivityUtils.java
index af70fdd8a..482f2c4f3 100644
--- a/src/org/andengine/util/ActivityUtils.java
+++ b/src/org/andengine/util/ActivityUtils.java
@@ -38,6 +38,10 @@ public final class ActivityUtils {
 	// Constructors
 	// ===========================================================
 
+	private ActivityUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -107,7 +111,7 @@ public static final  void doAsync(final Context pContext, final int pTitleRes
 	public static final  void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) {
 		new AsyncTask() {
 			private ProgressDialog mPD;
-			private Exception mException = null;
+			private Exception mException;
 
 			@Override
 			public void onPreExecute() {
@@ -135,7 +139,7 @@ public T doInBackground(final Void... params) {
 			}
 
 			@Override
-			public void onPostExecute(final T result) {
+			public void onPostExecute(final T pResult) {
 				try {
 					this.mPD.dismiss();
 				} catch (final Exception e) {
@@ -147,7 +151,7 @@ public void onPostExecute(final T result) {
 				}
 
 				if (this.mException == null) {
-					pCallback.onCallback(result);
+					pCallback.onCallback(pResult);
 				} else {
 					if (pExceptionCallback == null) {
 						Debug.e("Error", this.mException);
@@ -156,7 +160,7 @@ public void onPostExecute(final T result) {
 					}
 				}
 
-				super.onPostExecute(result);
+				super.onPostExecute(pResult);
 			}
 		}.execute((Void[]) null);
 	}
@@ -176,7 +180,7 @@ public static final  void doProgressAsync(final Context pContext, final int p
 	public static final  void doProgressAsync(final Context pContext, final CharSequence pTitle, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) {
 		new AsyncTask() {
 			private ProgressDialog mPD;
-			private Exception mException = null;
+			private Exception mException;
 
 			@Override
 			public void onPreExecute() {
@@ -205,12 +209,12 @@ public void onProgressChanged(final int pProgress) {
 			}
 
 			@Override
-			public void onProgressUpdate(final Integer... values) {
-				this.mPD.setProgress(values[0]);
+			public void onProgressUpdate(final Integer... pValues) {
+				this.mPD.setProgress(pValues[0]);
 			}
 
 			@Override
-			public void onPostExecute(final T result) {
+			public void onPostExecute(final T pResult) {
 				try {
 					this.mPD.dismiss();
 				} catch (final Exception e) {
@@ -223,7 +227,7 @@ public void onPostExecute(final T result) {
 				}
 
 				if (this.mException == null) {
-					pCallback.onCallback(result);
+					pCallback.onCallback(pResult);
 				} else {
 					if (pExceptionCallback == null) {
 						Debug.e("Error", this.mException);
@@ -232,7 +236,7 @@ public void onPostExecute(final T result) {
 					}
 				}
 
-				super.onPostExecute(result);
+				super.onPostExecute(pResult);
 			}
 		}.execute((Void[]) null);
 	}
@@ -245,7 +249,7 @@ public static final  void doAsync(final Context pContext, final CharSequence
 		final ProgressDialog pd = ProgressDialog.show(pContext, pTitle, pMessage);
 		pAsyncCallable.call(new Callback() {
 			@Override
-			public void onCallback(final T result) {
+			public void onCallback(final T pResult) {
 				try {
 					pd.dismiss();
 				} catch (final Exception e) {
@@ -253,7 +257,7 @@ public void onCallback(final T result) {
 					/* Nothing. */
 				}
 
-				pCallback.onCallback(result);
+				pCallback.onCallback(pResult);
 			}
 		}, pExceptionCallback);
 	}
diff --git a/src/org/andengine/util/BetaUtils.java b/src/org/andengine/util/BetaUtils.java
index a8073f1bd..4c98c5ec1 100644
--- a/src/org/andengine/util/BetaUtils.java
+++ b/src/org/andengine/util/BetaUtils.java
@@ -20,7 +20,7 @@
  * @author Nicolas Gramlich
  * @since 22:43:32 - 02.11.2010
  */
-public class BetaUtils {
+public final class BetaUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -35,6 +35,10 @@ public class BetaUtils {
 	// Constructors
 	// ===========================================================
 
+	private BetaUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -87,7 +91,7 @@ public void onClick(final DialogInterface pDialog, final int pWhich) {
 			})
 			.create().show();
 			return true;
-		}else{
+		} else {
 			return false;
 		}
 	}
diff --git a/src/org/andengine/util/BitmapUtils.java b/src/org/andengine/util/BitmapUtils.java
index 32fa3a536..73cb25610 100644
--- a/src/org/andengine/util/BitmapUtils.java
+++ b/src/org/andengine/util/BitmapUtils.java
@@ -8,7 +8,7 @@
  * @author Nicolas Gramlich
  * @since 18:52:32 - 18.02.2013
  */
-public class BitmapUtils {
+public final class BitmapUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -21,6 +21,10 @@ public class BitmapUtils {
 	// Constructors
 	// ===========================================================
 
+	private BitmapUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/DatabaseUtils.java b/src/org/andengine/util/DatabaseUtils.java
index 81efa78bb..2a9b6372a 100644
--- a/src/org/andengine/util/DatabaseUtils.java
+++ b/src/org/andengine/util/DatabaseUtils.java
@@ -8,7 +8,7 @@
  * @author Nicolas Gramlich
  * @since 15:30:15 - 23.01.2013
  */
-public class DatabaseUtils {
+public final class DatabaseUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -21,6 +21,10 @@ public class DatabaseUtils {
 	// Constructors
 	// ===========================================================
 
+	private DatabaseUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/DialogUtils.java b/src/org/andengine/util/DialogUtils.java
index ca068250b..1a0842eb8 100644
--- a/src/org/andengine/util/DialogUtils.java
+++ b/src/org/andengine/util/DialogUtils.java
@@ -10,7 +10,7 @@
  * @author Nicolas Gramlich
  * @since 13:04:09 - 12.05.2011
  */
-public class DialogUtils {
+public final class DialogUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -23,6 +23,10 @@ public class DialogUtils {
 	// Constructors
 	// ===========================================================
 
+	private DialogUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/FileUtils.java b/src/org/andengine/util/FileUtils.java
index d32bb13ce..51fd01016 100644
--- a/src/org/andengine/util/FileUtils.java
+++ b/src/org/andengine/util/FileUtils.java
@@ -19,7 +19,7 @@
  * @author Nicolas Gramlich
  * @since 13:53:33 - 20.06.2010
  */
-public class FileUtils {
+public final class FileUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -32,6 +32,10 @@ public class FileUtils {
 	// Constructors
 	// ===========================================================
 
+	private FileUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/ProbabilityGenerator.java b/src/org/andengine/util/ProbabilityGenerator.java
index fb4b73a1b..b66f44b29 100644
--- a/src/org/andengine/util/ProbabilityGenerator.java
+++ b/src/org/andengine/util/ProbabilityGenerator.java
@@ -99,8 +99,8 @@ public Entry(final float pFactor, final T ... pData) {
 		public T getReturnValue() {
 			if (this.mData.length == 1) {
 				return this.mData[0];
-			}else{
-				return ArrayUtils.random(mData);
+			} else {
+				return ArrayUtils.random(this.mData);
 			}
 		}
 
diff --git a/src/org/andengine/util/SAXUtils.java b/src/org/andengine/util/SAXUtils.java
index 9f69cc53d..27360c660 100644
--- a/src/org/andengine/util/SAXUtils.java
+++ b/src/org/andengine/util/SAXUtils.java
@@ -22,6 +22,10 @@ public final class SAXUtils {
 	// Constructors
 	// ===========================================================
 
+	private SAXUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/SocketUtils.java b/src/org/andengine/util/SocketUtils.java
index 15409808e..20a2a2adf 100644
--- a/src/org/andengine/util/SocketUtils.java
+++ b/src/org/andengine/util/SocketUtils.java
@@ -27,6 +27,10 @@ public final class SocketUtils {
 	// Constructors
 	// ===========================================================
 
+	private SocketUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java
index 6f04277ec..aebebc3cd 100644
--- a/src/org/andengine/util/StreamUtils.java
+++ b/src/org/andengine/util/StreamUtils.java
@@ -39,6 +39,10 @@ public final class StreamUtils {
 	// Constructors
 	// ===========================================================
 
+	private StreamUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -61,7 +65,7 @@ public static String[] readLines(final Reader pReader) throws IOException {
 		final ArrayList lines = new ArrayList();
 
 		String line = null;
-		while((line = reader.readLine()) != null) {
+		while ((line = reader.readLine()) != null) {
 			lines.add(line);
 		}
 
@@ -74,7 +78,7 @@ public static final String readFully(final InputStream pInputStream) throws IOEx
 		try {
 			final Reader reader = new BufferedReader(new InputStreamReader(pInputStream, "UTF-8"));
 			int read;
-			while((read = reader.read(buf)) != StreamUtils.END_OF_STREAM) {
+			while ((read = reader.read(buf)) != StreamUtils.END_OF_STREAM) {
 				writer.write(buf, 0, read);
 			}
 		} finally {
@@ -115,7 +119,7 @@ public static final void streamToBytes(final InputStream pInputStream, final int
 		int pBytesLeftToRead = pByteLimit;
 		int readTotal = 0;
 		int read;
-		while((read = pInputStream.read(pData, pOffset + readTotal, pBytesLeftToRead)) != StreamUtils.END_OF_STREAM) {
+		while ((read = pInputStream.read(pData, pOffset + readTotal, pBytesLeftToRead)) != StreamUtils.END_OF_STREAM) {
 			readTotal += read;
 			if (pBytesLeftToRead > read) {
 				pBytesLeftToRead -= read;
@@ -137,7 +141,7 @@ public static final void copy(final InputStream pInputStream, final byte[] pData
 		int dataOffset = 0;
 		final byte[] buf = new byte[StreamUtils.IO_BUFFER_SIZE];
 		int read;
-		while((read = pInputStream.read(buf)) != StreamUtils.END_OF_STREAM) {
+		while ((read = pInputStream.read(buf)) != StreamUtils.END_OF_STREAM) {
 			System.arraycopy(buf, 0, pData, dataOffset, read);
 			dataOffset += read;
 		}
@@ -146,7 +150,7 @@ public static final void copy(final InputStream pInputStream, final byte[] pData
 	public static final void copy(final InputStream pInputStream, final ByteBuffer pByteBuffer) throws IOException {
 		final byte[] buf = new byte[StreamUtils.IO_BUFFER_SIZE];
 		int read;
-		while((read = pInputStream.read(buf)) != StreamUtils.END_OF_STREAM) {
+		while ((read = pInputStream.read(buf)) != StreamUtils.END_OF_STREAM) {
 			pByteBuffer.put(buf, 0, read);
 		}
 	}
@@ -165,16 +169,16 @@ public static final void copy(final InputStream pInputStream, final OutputStream
 		if (pByteLimit == StreamUtils.END_OF_STREAM) {
 			final byte[] buf = new byte[StreamUtils.IO_BUFFER_SIZE];
 			int read;
-			while((read = pInputStream.read(buf)) != StreamUtils.END_OF_STREAM) {
+			while ((read = pInputStream.read(buf)) != StreamUtils.END_OF_STREAM) {
 				pOutputStream.write(buf, 0, read);
 			}
 		} else {
 			final byte[] buf = new byte[StreamUtils.IO_BUFFER_SIZE];
-			final int bufferReadLimit = Math.min((int)pByteLimit, StreamUtils.IO_BUFFER_SIZE);
+			final int bufferReadLimit = Math.min((int) pByteLimit, StreamUtils.IO_BUFFER_SIZE);
 			long pBytesLeftToRead = pByteLimit;
 
 			int read;
-			while((read = pInputStream.read(buf, 0, bufferReadLimit)) != StreamUtils.END_OF_STREAM) {
+			while ((read = pInputStream.read(buf, 0, bufferReadLimit)) != StreamUtils.END_OF_STREAM) {
 				if (pBytesLeftToRead > read) {
 					pOutputStream.write(buf, 0, read);
 					pBytesLeftToRead -= read;
diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java
index 4e6b43967..1a6882d5d 100644
--- a/src/org/andengine/util/TextUtils.java
+++ b/src/org/andengine/util/TextUtils.java
@@ -28,6 +28,10 @@ public final class TextUtils {
 	// Constructors
 	// ===========================================================
 
+	private TextUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/ThreadUtils.java b/src/org/andengine/util/ThreadUtils.java
index 45ecc8434..c9aa0504a 100644
--- a/src/org/andengine/util/ThreadUtils.java
+++ b/src/org/andengine/util/ThreadUtils.java
@@ -9,7 +9,7 @@
  * @author Nicolas Gramlich 
  * @since 12:23:06 - 19.01.2012
  */
-public class ThreadUtils {
+public final class ThreadUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -24,6 +24,10 @@ public class ThreadUtils {
 	// Constructors
 	// ===========================================================
 
+	private ThreadUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/TimeUtils.java b/src/org/andengine/util/TimeUtils.java
index 9a5296824..3803f4daf 100644
--- a/src/org/andengine/util/TimeUtils.java
+++ b/src/org/andengine/util/TimeUtils.java
@@ -22,6 +22,10 @@ public final class TimeUtils implements TimeConstants {
 	// Constructors
 	// ===========================================================
 
+	private TimeUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/ViewUtils.java b/src/org/andengine/util/ViewUtils.java
index 723c66984..312e1c543 100644
--- a/src/org/andengine/util/ViewUtils.java
+++ b/src/org/andengine/util/ViewUtils.java
@@ -25,6 +25,10 @@ public final class ViewUtils {
 	// Constructors
 	// ===========================================================
 
+	private ViewUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/DataConstants.java b/src/org/andengine/util/adt/DataConstants.java
index 35d05b1fd..93faa6455 100644
--- a/src/org/andengine/util/adt/DataConstants.java
+++ b/src/org/andengine/util/adt/DataConstants.java
@@ -27,9 +27,9 @@ public interface DataConstants {
 	public static final int BYTE_TO_MEGABYTE_SHIFT = 20;
 	public static final int BYTE_TO_GIGABYTE_SHIFT = 30;
 
-	public static final short UNSIGNED_BYTE_MAX_VALUE = (short)Byte.MAX_VALUE - (short)Byte.MIN_VALUE;
-	public static final int UNSIGNED_SHORT_MAX_VALUE = (int)Short.MAX_VALUE - (int)Short.MIN_VALUE;
-	public static final long UNSIGNED_INT_MAX_VALUE = (long)Integer.MAX_VALUE - (long)Integer.MIN_VALUE;
+	public static final short UNSIGNED_BYTE_MAX_VALUE = (short) Byte.MAX_VALUE - (short) Byte.MIN_VALUE;
+	public static final int UNSIGNED_SHORT_MAX_VALUE = (int) Short.MAX_VALUE - (int) Short.MIN_VALUE;
+	public static final long UNSIGNED_INT_MAX_VALUE = (long) Integer.MAX_VALUE - (long) Integer.MIN_VALUE;
 
 	public static final int BITS_PER_BYTE = 8;
 	public static final int BITS_PER_SHORT = BYTES_PER_SHORT * BITS_PER_BYTE;
diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java
index 680e91626..d18b69066 100644
--- a/src/org/andengine/util/adt/array/ArrayUtils.java
+++ b/src/org/andengine/util/adt/array/ArrayUtils.java
@@ -26,6 +26,10 @@ public final class ArrayUtils {
 	// Constructors
 	// ===========================================================
 
+	private ArrayUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -38,6 +42,10 @@ public final class ArrayUtils {
 	// Methods
 	// ===========================================================
 
+	public static  T[] newArray(final Class pClass, final int pLength) {
+		return pClass.cast(Array.newInstance(pClass.getComponentType(), pLength));
+	}
+
 	public static final byte random(final byte[] pArray) {
 		return pArray[MathUtils.random(0, pArray.length - 1)];
 	}
@@ -73,7 +81,7 @@ public static final void reverse(final byte[] pArray) {
 		int i = 0;
 		int j = pArray.length - 1;
 		byte tmp;
-		while(j > i) {
+		while (j > i) {
 			tmp = pArray[j];
 			pArray[j] = pArray[i];
 			pArray[i] = tmp;
@@ -89,7 +97,7 @@ public static final void reverse(final short[] pArray) {
 		int i = 0;
 		int j = pArray.length - 1;
 		short tmp;
-		while(j > i) {
+		while (j > i) {
 			tmp = pArray[j];
 			pArray[j] = pArray[i];
 			pArray[i] = tmp;
@@ -105,7 +113,7 @@ public static final void reverse(final int[] pArray) {
 		int i = 0;
 		int j = pArray.length - 1;
 		int tmp;
-		while(j > i) {
+		while (j > i) {
 			tmp = pArray[j];
 			pArray[j] = pArray[i];
 			pArray[i] = tmp;
@@ -121,7 +129,7 @@ public static final void reverse(final long[] pArray) {
 		int i = 0;
 		int j = pArray.length - 1;
 		long tmp;
-		while(j > i) {
+		while (j > i) {
 			tmp = pArray[j];
 			pArray[j] = pArray[i];
 			pArray[i] = tmp;
@@ -137,7 +145,7 @@ public static final void reverse(final float[] pArray) {
 		int i = 0;
 		int j = pArray.length - 1;
 		float tmp;
-		while(j > i) {
+		while (j > i) {
 			tmp = pArray[j];
 			pArray[j] = pArray[i];
 			pArray[i] = tmp;
@@ -153,7 +161,7 @@ public static final void reverse(final double[] pArray) {
 		int i = 0;
 		int j = pArray.length - 1;
 		double tmp;
-		while(j > i) {
+		while (j > i) {
 			tmp = pArray[j];
 			pArray[j] = pArray[i];
 			pArray[i] = tmp;
@@ -169,7 +177,7 @@ public static final void reverse(final Object[] pArray) {
 		int i = 0;
 		int j = pArray.length - 1;
 		Object tmp;
-		while(j > i) {
+		while (j > i) {
 			tmp = pArray[j];
 			pArray[j] = pArray[i];
 			pArray[i] = tmp;
@@ -348,7 +356,7 @@ public static  T[] join(final Class pClass, final T[]... pArrays) {
 		}
 
 		/* Determine length of result. */
-		final T[] result = pClass.cast(Array.newInstance(pClass.getComponentType(), resultLength));
+		final T[] result = ArrayUtils.newArray(pClass, resultLength);
 		int offset = 0;
 		for (int i = 0; i < arrayCount; i++) {
 			final T[] array = pArrays[i];
@@ -405,14 +413,14 @@ public static int idealObjectArraySize(final int pSize) {
 	public static final void sumCummulative(final int[] pValues) {
 		final int valueCount = pValues.length;
 		for (int i = 1; i < valueCount; i++) {
-			pValues[i] = pValues[i-1] + pValues[i];
+			pValues[i] = pValues[i - 1] + pValues[i];
 		}
 	}
 
 	public static final void sumCummulative(final long[] pValues) {
 		final int valueCount = pValues.length;
 		for (int i = 1; i < valueCount; i++) {
-			pValues[i] = pValues[i-1] + pValues[i];
+			pValues[i] = pValues[i - 1] + pValues[i];
 		}
 	}
 
@@ -420,7 +428,7 @@ public static final void sumCummulative(final long[] pValues, final long pFactor
 		pValues[0] = pValues[0] * pFactor;
 		final int valueCount = pValues.length;
 		for (int i = 1; i < valueCount; i++) {
-			pValues[i] = pValues[i-1] + (pValues[i] * pFactor);
+			pValues[i] = pValues[i - 1] + (pValues[i] * pFactor);
 		}
 	}
 
@@ -428,7 +436,7 @@ public static final void sumCummulative(final long[] pValues, final long pFactor
 		pTargetValues[0] = pValues[0] * pFactor;
 		final int valueCount = pValues.length;
 		for (int i = 1; i < valueCount; i++) {
-			pTargetValues[i] = pTargetValues[i-1] + (pValues[i] * pFactor);
+			pTargetValues[i] = pTargetValues[i - 1] + (pValues[i] * pFactor);
 		}
 	}
 
@@ -467,7 +475,7 @@ public static  T[] filter(final T[] pArray, final Class pClass, final IM
 			}
 		}
 
-		final T[] filteredArray = pClass.cast(Array.newInstance(pClass.getComponentType(), filteredArrayLength));
+		final T[] filteredArray = ArrayUtils.newArray(pClass, filteredArrayLength);
 		int resultIndex = 0;
 		for (int i = 0; i < arrayLength; i++) {
 			if (pMatcher.matches(pArray[i])) {
diff --git a/src/org/andengine/util/adt/bit/BitVector.java b/src/org/andengine/util/adt/bit/BitVector.java
index c516214a9..a7b96d50a 100644
--- a/src/org/andengine/util/adt/bit/BitVector.java
+++ b/src/org/andengine/util/adt/bit/BitVector.java
@@ -139,7 +139,7 @@ public static byte setBitsInByte(final byte pByte, final int pIndex, final byte
 			shiftedBits = maskedBits << shift;
 		}
 
-		final byte result = (byte)(maskedByte | shiftedBits);
+		final byte result = (byte) (maskedByte | shiftedBits);
 
 		return result;
 	}
diff --git a/src/org/andengine/util/adt/bit/ByteBackedBitVector.java b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
index 6ff2c1067..fc629c8ab 100644
--- a/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
+++ b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
@@ -40,7 +40,7 @@ public ByteBackedBitVector(final byte[] pData) throws IllegalArgumentException,
 	}
 
 	public ByteBackedBitVector(final int pSize, final byte[] pData) throws IllegalArgumentException, NullPointerException {
-		if (pData == null){
+		if (pData == null) {
 			throw new IllegalArgumentException("pData must not be null");
 		}
 
diff --git a/src/org/andengine/util/adt/bit/LongBackedBitVector.java b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
index 6d67d5512..856b4f3c7 100644
--- a/src/org/andengine/util/adt/bit/LongBackedBitVector.java
+++ b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
@@ -55,7 +55,7 @@ public LongBackedBitVector(final long[] pData) throws IllegalArgumentException {
 	}
 
 	public LongBackedBitVector(final int pSize, final long[] pData) throws IllegalArgumentException {
-		if (pData == null){
+		if (pData == null) {
 			throw new IllegalArgumentException("pData must not be null");
 		}
 
diff --git a/src/org/andengine/util/adt/cache/IntLRUCache.java b/src/org/andengine/util/adt/cache/IntLRUCache.java
index 320fcfbbe..9e23e8c7d 100644
--- a/src/org/andengine/util/adt/cache/IntLRUCache.java
+++ b/src/org/andengine/util/adt/cache/IntLRUCache.java
@@ -83,14 +83,14 @@ public V put(final int pKey, final V pValue) {
 			this.mSize--;
 		}
 
-		final IntLRUCacheQueueNode IntLRUCacheQueueNode = this.mIntLRUCacheQueue.add(pKey);
+		final IntLRUCacheQueueNode intLRUCacheQueueNode = this.mIntLRUCacheQueue.add(pKey);
 
-		final IntLRUCacheValueHolder IntLRUCacheValueHolder = this.mIntLRUCacheValueHolderPool.obtainPoolItem();
-//		final IntLRUCacheValueHolder IntLRUCacheValueHolder = new IntLRUCacheValueHolder();
-		IntLRUCacheValueHolder.mValue = pValue;
-		IntLRUCacheValueHolder.mIntLRUCacheQueueNode = IntLRUCacheQueueNode;
+		final IntLRUCacheValueHolder intLRUCacheValueHolder = this.mIntLRUCacheValueHolderPool.obtainPoolItem();
+//		final IntLRUCacheValueHolder intLRUCacheValueHolder = new IntLRUCacheValueHolder();
+		intLRUCacheValueHolder.mValue = pValue;
+		intLRUCacheValueHolder.mIntLRUCacheQueueNode = intLRUCacheQueueNode;
 
-		this.mSparseArray.put(pKey, IntLRUCacheValueHolder);
+		this.mSparseArray.put(pKey, intLRUCacheValueHolder);
 
 		this.mSize++;
 
@@ -98,18 +98,18 @@ public V put(final int pKey, final V pValue) {
 	}
 
 	public V get(final int pKey) {
-		final IntLRUCacheValueHolder IntLRUCacheValueHolder = this.mSparseArray.get(pKey);
-		if (IntLRUCacheValueHolder == null) {
+		final IntLRUCacheValueHolder intLRUCacheValueHolder = this.mSparseArray.get(pKey);
+		if (intLRUCacheValueHolder == null) {
 			return null;
 		}
 
-		this.mIntLRUCacheQueue.moveToTail(IntLRUCacheValueHolder.mIntLRUCacheQueueNode);
+		this.mIntLRUCacheQueue.moveToTail(intLRUCacheValueHolder.mIntLRUCacheQueueNode);
 
-		return IntLRUCacheValueHolder.mValue;
+		return intLRUCacheValueHolder.mValue;
 	}
 
 	public void clear() {
-		while(!this.mIntLRUCacheQueue.isEmpty()) {
+		while (!this.mIntLRUCacheQueue.isEmpty()) {
 			final int key = this.mIntLRUCacheQueue.poll();
 			final IntLRUCacheValueHolder lruCacheValueHolder = this.mSparseArray.get(key);
 			if (lruCacheValueHolder == null) {
@@ -243,11 +243,11 @@ public boolean isEmpty() {
 		}
 
 		public IntLRUCacheQueueNode add(final int pKey) {
-			final IntLRUCacheQueueNode IntLRUCacheQueueNode = this.mIntLRUCacheQueueNodePool.obtainPoolItem();
-//			final IntLRUCacheQueueNode IntLRUCacheQueueNode = new IntLRUCacheQueueNode();
-			IntLRUCacheQueueNode.mKey = pKey;
+			final IntLRUCacheQueueNode intLRUCacheQueueNode = this.mIntLRUCacheQueueNodePool.obtainPoolItem();
+//			final IntLRUCacheQueueNode intLRUCacheQueueNode = new IntLRUCacheQueueNode();
+			intLRUCacheQueueNode.mKey = pKey;
 
-			return this.add(IntLRUCacheQueueNode);
+			return this.add(intLRUCacheQueueNode);
 		}
 
 		private IntLRUCacheQueueNode add(final IntLRUCacheQueueNode pIntLRUCacheQueueNode) {
diff --git a/src/org/andengine/util/adt/cache/LRUCache.java b/src/org/andengine/util/adt/cache/LRUCache.java
index 41237b00c..7b3b919c1 100644
--- a/src/org/andengine/util/adt/cache/LRUCache.java
+++ b/src/org/andengine/util/adt/cache/LRUCache.java
@@ -109,7 +109,7 @@ public V get(final K pKey) {
 	}
 
 	public void clear() {
-		while(!this.mLRUCacheQueue.isEmpty()) {
+		while (!this.mLRUCacheQueue.isEmpty()) {
 			final K key = this.mLRUCacheQueue.poll();
 			final LRUCacheValueHolder lruCacheValueHolder = this.mMap.remove(key);
 			this.mLRUCacheValueHolderPool.recyclePoolItem(lruCacheValueHolder);
diff --git a/src/org/andengine/util/adt/color/ColorUtils.java b/src/org/andengine/util/adt/color/ColorUtils.java
index d0652030a..238d78772 100644
--- a/src/org/andengine/util/adt/color/ColorUtils.java
+++ b/src/org/andengine/util/adt/color/ColorUtils.java
@@ -7,7 +7,7 @@
  * @author Nicolas Gramlich
  * @since 11:13:45 - 04.08.2010
  */
-public class ColorUtils {
+public final class ColorUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -28,6 +28,10 @@ public class ColorUtils {
 	// Constructors
 	// ===========================================================
 
+	private ColorUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/data/DataUtils.java b/src/org/andengine/util/adt/data/DataUtils.java
index eeb4f2071..bb717c1dc 100644
--- a/src/org/andengine/util/adt/data/DataUtils.java
+++ b/src/org/andengine/util/adt/data/DataUtils.java
@@ -22,6 +22,10 @@ public final class DataUtils {
 	// Constructors
 	// ===========================================================
 
+	private DataUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/dictionary/Dictionary.java b/src/org/andengine/util/adt/dictionary/Dictionary.java
index ea357dbe5..c088b4169 100644
--- a/src/org/andengine/util/adt/dictionary/Dictionary.java
+++ b/src/org/andengine/util/adt/dictionary/Dictionary.java
@@ -96,7 +96,7 @@ public Dictionary(final IBitVector pBitVector) {
 		this.mCharacterBitLength = this.mBitVector.getByte(Dictionary.OFFSET_CHARACTER_BITLENGTH);
 		this.mCharacterTable = new char[this.mCharacterCount];
 		for (int i = 0; i < this.mCharacterCount; i++) {
-			this.mCharacterTable[i] = (char)this.mBitVector.getShort(Dictionary.OFFSET_CHARACTERS + (i * Character.SIZE));
+			this.mCharacterTable[i] = (char) this.mBitVector.getShort(Dictionary.OFFSET_CHARACTERS + (i * Character.SIZE));
 		}
 
 		this.mEntryCount = this.mBitVector.getInt(Dictionary.OFFSET_INDEXENTRY_COUNT);
@@ -252,15 +252,15 @@ public static Dictionary create(final String ... pStrings) {
 			/* Write meta data. */
 			bitVector.setShort(Dictionary.OFFSET_VERSION, Dictionary.VERSION);
 			bitVector.setInt(Dictionary.OFFSET_CHARACTER_COUNT, characterCount);
-			bitVector.setByte(Dictionary.OFFSET_CHARACTER_BITLENGTH, (byte)characterBitLength);
+			bitVector.setByte(Dictionary.OFFSET_CHARACTER_BITLENGTH, (byte) characterBitLength);
 			bitVector.setInt(Dictionary.OFFSET_INDEXENTRY_COUNT, entryCount);
-			bitVector.setByte(Dictionary.OFFSET_INDEXENTRY_STARTINDEX_BITLENGTH, (byte)entryStartIndexBitLength);
-			bitVector.setByte(Dictionary.OFFSET_INDEXENTRY_LENGTH_BITLENGTH, (byte)entryLengthBitLength);
+			bitVector.setByte(Dictionary.OFFSET_INDEXENTRY_STARTINDEX_BITLENGTH, (byte) entryStartIndexBitLength);
+			bitVector.setByte(Dictionary.OFFSET_INDEXENTRY_LENGTH_BITLENGTH, (byte) entryLengthBitLength);
 
 			/* Character table. */
 			for (int i = 0; i < characterCount; i++) {
 				final char character = entryDictionary.mCharacters[i];
-				final short characterBits = (short)character;
+				final short characterBits = (short) character;
 				bitVector.setShort(Dictionary.OFFSET_CHARACTERS + (i * Character.SIZE), characterBits);
 			}
 
@@ -283,7 +283,7 @@ public static Dictionary create(final String ... pStrings) {
 			final int offsetCharacterString = offsetEntries + (entryCount * (entryStartIndexBitLength + entryLengthBitLength));
 
 			/* Character string. */
-			for(int i = 0; i < characterCountTotal; i++) {
+			for (int i = 0; i < characterCountTotal; i++) {
 				final int offsetInCharacterString = i * characterBitLength;
 				final int offsetCharacter = offsetCharacterString + offsetInCharacterString;
 
@@ -308,7 +308,7 @@ private static int calculateBitsRequired(final int pCharacterCountTotal, final i
 					+ (pCharacterBitLength * pCharacterCountTotal);
 		}
 
-		private static Entries createDictionary(final String... pStrings) {
+		private static Entries createDictionary(final String ... pStrings) {
 			final ArrayList entries = new ArrayList();
 			final StringBuilder stringBuilder = new StringBuilder();
 
@@ -424,7 +424,7 @@ public Entries(final ArrayList pEntries, final String pString) {
 				characterCount = 0;
 				for (int i = 0; i < Character.MAX_VALUE; i++) {
 					if (characterBitVector.getBit(i) == BitVector.TRUE) {
-						this.mCharacters[characterCount++] = (char)i;
+						this.mCharacters[characterCount++] = (char) i;
 					}
 				}
 			}
diff --git a/src/org/andengine/util/adt/list/ListUtils.java b/src/org/andengine/util/adt/list/ListUtils.java
index b3df9d433..5dd61f91a 100644
--- a/src/org/andengine/util/adt/list/ListUtils.java
+++ b/src/org/andengine/util/adt/list/ListUtils.java
@@ -28,6 +28,10 @@ public final class ListUtils {
 	// Constructors
 	// ===========================================================
 
+	private ListUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/list/ShiftList.java b/src/org/andengine/util/adt/list/ShiftList.java
index 7d81109ee..6ae48c3c8 100644
--- a/src/org/andengine/util/adt/list/ShiftList.java
+++ b/src/org/andengine/util/adt/list/ShiftList.java
@@ -136,11 +136,11 @@ public void enter(final int pIndex, final T pItem) throws ArrayIndexOutOfBoundsE
 		}
 	}
 
-	private void enterShiftingRight(final int pIndex, final T pItem, final int size) {
+	private void enterShiftingRight(final int pIndex, final T pItem, final int pSize) {
 		this.ensureShiftableRight();
 
 		/* Check if items need to be copied. */
-		final int shiftAmount = size - pIndex;
+		final int shiftAmount = pSize - pIndex;
 		if (shiftAmount == 0) {
 			/* Nothing to shift, we can insert at the tail. */
 			this.mItems[this.mTail] = pItem;
diff --git a/src/org/andengine/util/adt/list/SmartList.java b/src/org/andengine/util/adt/list/SmartList.java
index 7144d5932..57a5d98f3 100644
--- a/src/org/andengine/util/adt/list/SmartList.java
+++ b/src/org/andengine/util/adt/list/SmartList.java
@@ -192,7 +192,7 @@ public , S extends T> L queryForSubclass(final IMatcher pMa
 		for (int i = 0; i < size; i++) {
 			final T item = this.get(i);
 			if (pMatcher.matches(item)) {
-				pResult.add((S)item);
+				pResult.add((S) item);
 			}
 		}
 
diff --git a/src/org/andengine/util/adt/list/SortedList.java b/src/org/andengine/util/adt/list/SortedList.java
index d9a55718e..e0d844359 100644
--- a/src/org/andengine/util/adt/list/SortedList.java
+++ b/src/org/andengine/util/adt/list/SortedList.java
@@ -137,7 +137,7 @@ private int binarySearch(final int pStart, final int pEnd, final T pItem) {
 		int low = pStart;
 		int high = pEnd - 1;
 
-		while(low <= high) {
+		while (low <= high) {
 			final int mid = (low + high) >>> 1;
 			final T midVal = this.mList.get(mid);
 
@@ -166,13 +166,13 @@ private int binarySearch(final int pStart, final int pEnd, final T pItem) {
 	private int scanForEqualItem(final int pStart, final int pEnd, final int pGuess, final T pItem, final boolean pReturnSequenceEndIfNoEqualItemFound) {
 		/* Quickly move to the beginning of the sequence. */
 		int i = pGuess - 1;
-		while((i >= pStart) && (pItem.compareTo(this.mList.get(i)) == 0)) {
+		while ((i >= pStart) && (pItem.compareTo(this.mList.get(i)) == 0)) {
 			i--;
 		}
 		i++;
 
 		/* From the beginning of the sequence, advance until the first item equals pItem or the end has been reached. */
-		while(i < pEnd) {
+		while (i < pEnd) {
 			final T item = this.mList.get(i);
 			if (i <= pGuess) {
 				/* Since the compartTo check has already been performed, only equals needs to be checked. */
diff --git a/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java b/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java
index b38576b54..55e21ac5a 100644
--- a/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java
+++ b/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java
@@ -23,8 +23,8 @@ public class SynchronizedList implements IList {
 	// Constructors
 	// ===========================================================
 
-	public SynchronizedList(final IList mList) {
-		this.mList = mList;
+	public SynchronizedList(final IList pList) {
+		this.mList = pList;
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/map/MultiKeyHashMap.java b/src/org/andengine/util/adt/map/MultiKeyHashMap.java
index 40a0fc572..7a5bb517f 100644
--- a/src/org/andengine/util/adt/map/MultiKeyHashMap.java
+++ b/src/org/andengine/util/adt/map/MultiKeyHashMap.java
@@ -34,7 +34,7 @@ public V get(final K ... pKeys) {
 		final int hashCode = MultiKey.hash(pKeys);
 
 		final Iterator, V>> it = this.entrySet().iterator();
-		while(it.hasNext()) {
+		while (it.hasNext()) {
 			final Map.Entry, V> entry = it.next();
 			final MultiKey entryKey = entry.getKey();
 			if (entryKey.hashCode() == hashCode && this.isEqualKey(entryKey.getKeys(), pKeys)) {
diff --git a/src/org/andengine/util/adt/pool/PoolUpdateHandler.java b/src/org/andengine/util/adt/pool/PoolUpdateHandler.java
index f78da8529..ddfa44606 100644
--- a/src/org/andengine/util/adt/pool/PoolUpdateHandler.java
+++ b/src/org/andengine/util/adt/pool/PoolUpdateHandler.java
@@ -84,7 +84,7 @@ public void onUpdate(final float pSecondsElapsed) {
 		final Pool pool = this.mPool;
 
 		T item;
-		while((item = scheduledPoolItemQueue.poll()) != null) {
+		while ((item = scheduledPoolItemQueue.poll()) != null) {
 			this.onHandlePoolItem(item);
 			pool.recyclePoolItem(item);
 		}
@@ -96,7 +96,7 @@ public void reset() {
 		final Pool pool = this.mPool;
 
 		T item;
-		while((item = scheduledPoolItemQueue.poll()) != null) {
+		while ((item = scheduledPoolItemQueue.poll()) != null) {
 			pool.recyclePoolItem(item);
 		}
 	}
diff --git a/src/org/andengine/util/adt/queue/SortedQueue.java b/src/org/andengine/util/adt/queue/SortedQueue.java
index f71393427..ec6ff26ac 100644
--- a/src/org/andengine/util/adt/queue/SortedQueue.java
+++ b/src/org/andengine/util/adt/queue/SortedQueue.java
@@ -8,7 +8,7 @@
  * @author Nicolas Gramlich 
  * @since 17:17:33 PM - 03.022012
  */
-public class SortedQueue> extends SortedList implements ISortedQueue{
+public class SortedQueue> extends SortedList implements ISortedQueue {
 	// ===========================================================
 	// Constants
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/queue/UniqueQueue.java b/src/org/andengine/util/adt/queue/UniqueQueue.java
index 90351ed65..bd024063a 100644
--- a/src/org/andengine/util/adt/queue/UniqueQueue.java
+++ b/src/org/andengine/util/adt/queue/UniqueQueue.java
@@ -8,7 +8,7 @@
  * @author Nicolas Gramlich 
  * @since 17:17:33 PM - 03.022012
  */
-public class UniqueQueue> extends UniqueList implements IUniqueQueue{
+public class UniqueQueue> extends UniqueList implements IUniqueQueue {
 	// ===========================================================
 	// Constants
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java b/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java
index da83575f4..3827d6a91 100644
--- a/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java
+++ b/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java
@@ -46,7 +46,7 @@ public synchronized T get(final int pIndex) throws IndexOutOfBoundsException {
 	}
 
 	@Override
-	public synchronized void set(int pIndex, T pItem) throws IndexOutOfBoundsException {
+	public synchronized void set(final int pIndex, final T pItem) throws IndexOutOfBoundsException {
 		this.mQueue.set(pIndex, pItem);
 	}
 
@@ -81,7 +81,7 @@ public synchronized void enter(final T pItem) {
 	}
 
 	@Override
-	public synchronized void enter(final int pIndex, final T pItem) throws IndexOutOfBoundsException{
+	public synchronized void enter(final int pIndex, final T pItem) throws IndexOutOfBoundsException {
 		this.mQueue.enter(pIndex, pItem);
 	}
 
@@ -101,7 +101,7 @@ public synchronized boolean remove(final T pItem) {
 	}
 
 	@Override
-	public synchronized T remove(final int pIndex) throws IndexOutOfBoundsException{
+	public synchronized T remove(final int pIndex) throws IndexOutOfBoundsException {
 		return this.mQueue.remove(pIndex);
 	}
 
diff --git a/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java b/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java
index 8c87b8e07..4e570b124 100644
--- a/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java
+++ b/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java
@@ -22,6 +22,10 @@ public final class FloatBoundsUtils {
 	// Constructors
 	// ===========================================================
 
+	private FloatBoundsUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java b/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java
index 6035db38f..f7833e783 100644
--- a/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java
+++ b/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java
@@ -22,6 +22,10 @@ public final class IntBoundsUtils {
 	// Constructors
 	// ===========================================================
 
+	private IntBoundsUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java
index b5c614448..8bf3f89c8 100644
--- a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java
+++ b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java
@@ -308,7 +308,7 @@ public String toString(final int pIndent) {
 				.append('\t')
 				.append("Level: ")
 				.append(this.mLevel)
-				.append(',' )
+				.append(',')
 				.append('\n')
 				.append(indents)
 				.append('\t')
@@ -316,7 +316,7 @@ public String toString(final int pIndent) {
 
 			this.appendBoundsToString(sb);
 
-			sb.append(',' )
+			sb.append(',')
 				.append('\n')
 				.append(indents)
 				.append("\tItems: ");
@@ -506,7 +506,7 @@ public , S extends T> L getItemsAndItemsBelowForSubclass(final
 				for (int i = 0; i < itemCount; i++) {
 					final T item = this.mItems.get(i);
 					if (pMatcher.matches(item)) {
-						pResult.add((S)item);
+						pResult.add((S) item);
 					}
 				}
 			}
@@ -587,7 +587,7 @@ public , S extends T> L queryForSubclass(final B pBounds, fina
 			if (this.mItems != null) {
 				for (final T item : this.mItems) {
 					if (this.intersects(pBounds, item.getBounds()) && pMatcher.matches(item)) {
-						pResult.add((S)item);
+						pResult.add((S) item);
 					}
 				}
 			}
diff --git a/src/org/andengine/util/adt/transformation/Transformation.java b/src/org/andengine/util/adt/transformation/Transformation.java
index 6788c53c6..9ad1761f9 100644
--- a/src/org/andengine/util/adt/transformation/Transformation.java
+++ b/src/org/andengine/util/adt/transformation/Transformation.java
@@ -117,8 +117,8 @@ public final Transformation setToTranslate(final float pX, final float pY) {
 	public final void preRotate(final float pAngle) {
 		final float angleRad = MathConstants.DEG_TO_RAD * pAngle;
 
-		final float sin = (float)Math.sin(angleRad);
-		final float cos = (float)Math.cos(angleRad);
+		final float sin = (float) Math.sin(angleRad);
+		final float cos = (float) Math.cos(angleRad);
 
 		final float a = this.a;
 		final float b = this.b;
@@ -134,8 +134,8 @@ public final void preRotate(final float pAngle) {
 	public final void postRotate(final float pAngle) {
 		final float angleRad = MathConstants.DEG_TO_RAD * pAngle;
 
-		final float sin = (float)Math.sin(angleRad);
-		final float cos = (float)Math.cos(angleRad);
+		final float sin = (float) Math.sin(angleRad);
+		final float cos = (float) Math.cos(angleRad);
 
 		final float a = this.a;
 		final float b = this.b;
@@ -155,8 +155,8 @@ public final void postRotate(final float pAngle) {
 	public final Transformation setToRotate(final float pAngle) {
 		final float angleRad = MathConstants.DEG_TO_RAD * pAngle;
 
-		final float sin = (float)Math.sin(angleRad);
-		final float cos = (float)Math.cos(angleRad);
+		final float sin = (float) Math.sin(angleRad);
+		final float cos = (float) Math.cos(angleRad);
 
 		this.a = cos;
 		this.b = sin;
@@ -288,7 +288,7 @@ public final void transform(final float[] pVertices) {
 		int count = pVertices.length >> 1;
 		int i = 0;
 		int j = 0;
-		while(--count >= 0) {
+		while (--count >= 0) {
 			final float x = pVertices[i++];
 			final float y = pVertices[i++];
 			pVertices[j++] = x * this.a + y * this.c + this.tx;
diff --git a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java
index eeb2c296d..87fd9833f 100644
--- a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java
+++ b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java
@@ -10,7 +10,7 @@
  * @author Nicolas Gramlich
  * @since 11:50:19 - 11.03.2010
  */
-public class BaseCollisionChecker {
+public final class BaseCollisionChecker {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -23,6 +23,10 @@ public class BaseCollisionChecker {
 	// Constructors
 	// ===========================================================
 
+	private BaseCollisionChecker() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java
index 1d012b73b..83498bf82 100644
--- a/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java
+++ b/src/org/andengine/util/algorithm/collision/EntityCollisionChecker.java
@@ -14,7 +14,7 @@
  * @author Nicolas Gramlich
  * @since 11:50:19 - 11.03.2010
  */
-public class EntityCollisionChecker {
+public final class EntityCollisionChecker {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -33,6 +33,10 @@ public class EntityCollisionChecker {
 	// Constructors
 	// ===========================================================
 
+	private EntityCollisionChecker() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java b/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java
index 1abbab1ec..f174c4703 100644
--- a/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java
+++ b/src/org/andengine/util/algorithm/collision/LineCollisionChecker.java
@@ -12,7 +12,7 @@
  * @author Nicolas Gramlich
  * @since 19:27:22 - 17.07.2010
  */
-public class LineCollisionChecker {
+public final class LineCollisionChecker {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -27,6 +27,10 @@ public class LineCollisionChecker {
 	// Constructors
 	// ===========================================================
 
+	private LineCollisionChecker() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java b/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java
index 85c51820c..6d0203f96 100644
--- a/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java
+++ b/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java
@@ -9,7 +9,7 @@
  * @author Nicolas Gramlich 
  * @since 17:47:42 - 30.08.2011
  */
-public class TriangleCollisionChecker {
+public final class TriangleCollisionChecker {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -26,6 +26,10 @@ public class TriangleCollisionChecker {
 	// Constructors
 	// ===========================================================
 
+	private TriangleCollisionChecker() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/algorithm/hull/HullUtils.java b/src/org/andengine/util/algorithm/hull/HullUtils.java
index 1bdd5b0fd..1f2059d0d 100644
--- a/src/org/andengine/util/algorithm/hull/HullUtils.java
+++ b/src/org/andengine/util/algorithm/hull/HullUtils.java
@@ -7,7 +7,7 @@
  * @author Nicolas Gramlich 
  * @since 14:52:48 - 08.02.2012
  */
-public class HullUtils {
+public final class HullUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -20,6 +20,10 @@ public class HullUtils {
 	// Constructors
 	// ===========================================================
 
+	private HullUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -44,7 +48,7 @@ public static int indexOfLowestVertex(final float[] pVertices, final int pVertex
 		int currentVertexOffsetY = pVertexStride + pVertexOffsetY;
 
 		/* Loop to the end. */
-		while(currentVertexOffsetY < lastVertexOffset) {
+		while (currentVertexOffsetY < lastVertexOffset) {
 			final float currentVertexY = pVertices[currentVertexOffsetY];
 
 			/* Check if the current candidate is lower and if so, assign it. */
diff --git a/src/org/andengine/util/algorithm/hull/JarvisMarch.java b/src/org/andengine/util/algorithm/hull/JarvisMarch.java
index 01a7f495d..5919beb74 100644
--- a/src/org/andengine/util/algorithm/hull/JarvisMarch.java
+++ b/src/org/andengine/util/algorithm/hull/JarvisMarch.java
@@ -107,7 +107,7 @@ private int jarvisMarch(final float[] pVertices, final int pVertexCount, final i
 
 			currentHullVertexAngle = nextHullVertexAngle;
 			currentHullVertexIndex = nextHullVertexIndex;
-		} while(currentHullVertexIndex > 0);
+		} while (currentHullVertexIndex > 0);
 
 		return hullVertexCount;
 	}
diff --git a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java
index a5b64b50d..13be0af1e 100644
--- a/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java
+++ b/src/org/andengine/util/algorithm/path/astar/AStarPathFinder.java
@@ -74,7 +74,7 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi
 		sortedOpenNodes.enter(fromNode);
 
 		Node currentNode = null;
-		while(openNodes.size() > 0) {
+		while (openNodes.size() > 0) {
 			/* The first Node in the open list is the one with the lowest cost. */
 			currentNode = sortedOpenNodes.poll();
 			final long currentNodeID = currentNode.mID;
@@ -158,7 +158,7 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi
 		/* Calculate path length. */
 		int length = 1;
 		Node tmp = currentNode;
-		while(tmp.mID != fromNodeID) {
+		while (tmp.mID != fromNodeID) {
 			tmp = tmp.mParent;
 			length++;
 		}
@@ -167,7 +167,7 @@ public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, fi
 		final Path path = new Path(length);
 		int index = length - 1;
 		tmp = currentNode;
-		while(tmp.mID != fromNodeID) {
+		while (tmp.mID != fromNodeID) {
 			path.set(index, tmp.mX, tmp.mY);
 			tmp = tmp.mParent;
 			index--;
@@ -251,7 +251,7 @@ public boolean equals(final Object pOther) {
 			} else if (this.getClass() != pOther.getClass()) {
 				return false;
 			}
-			return this.equals((Node)pOther);
+			return this.equals((Node) pOther);
 		}
 
 		@Override
@@ -264,7 +264,7 @@ public String toString() {
 		// ===========================================================
 
 		public static long calculateID(final int pX, final int pY) {
-			return (((long)pX) << 32) | (((long)pY) & 0xFFFFFFFFL);
+			return (((long) pX) << 32) | (((long) pY) & 0xFFFFFFFFL);
 		}
 
 		public boolean equals(final Node pNode) {
diff --git a/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java b/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java
index 829296254..0bef540c5 100644
--- a/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java
+++ b/src/org/andengine/util/algorithm/path/astar/EuclideanHeuristic.java
@@ -35,7 +35,7 @@ public float getExpectedRestCost(final IPathFinderMap pPathFinderMap, final T
 		final float dX = pToX - pFromX;
 		final float dY = pToY - pFromY;
 
-		return (float)Math.sqrt(dX * dX + dY * dY);
+		return (float) Math.sqrt(dX * dX + dY * dY);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/algorithm/sort/InsertionSorter.java b/src/org/andengine/util/algorithm/sort/InsertionSorter.java
index 4c72592c9..f60427e48 100644
--- a/src/org/andengine/util/algorithm/sort/InsertionSorter.java
+++ b/src/org/andengine/util/algorithm/sort/InsertionSorter.java
@@ -43,7 +43,7 @@ public void sort(final T[] pArray, final int pStart, final int pEnd, final Compa
 				int j = i;
 				do {
 					pArray[j--] = prev;
-				} while(j > pStart && pComparator.compare(current, prev = pArray[j - 1]) < 0);
+				} while (j > pStart && pComparator.compare(current, prev = pArray[j - 1]) < 0);
 				pArray[j] = current;
 			}
 		}
@@ -59,7 +59,7 @@ public void sort(final List pList, final int pStart, final int pEnd, final Co
 				int j = i;
 				do {
 					pList.set(j--, prev);
-				} while(j > pStart && pComparator.compare(current, prev = pList.get(j - 1)) < 0);
+				} while (j > pStart && pComparator.compare(current, prev = pList.get(j - 1)) < 0);
 				pList.set(j, current);
 			}
 		}
@@ -75,7 +75,7 @@ public void sort(final IList pList, final int pStart, final int pEnd, final C
 				int j = i;
 				do {
 					pList.set(j--, prev);
-				} while(j > pStart && pComparator.compare(current, prev = pList.get(j - 1)) < 0);
+				} while (j > pStart && pComparator.compare(current, prev = pList.get(j - 1)) < 0);
 				pList.set(j, current);
 			}
 		}
diff --git a/src/org/andengine/util/animationpack/AnimationPackLoader.java b/src/org/andengine/util/animationpack/AnimationPackLoader.java
index af090df00..bd73a8d06 100644
--- a/src/org/andengine/util/animationpack/AnimationPackLoader.java
+++ b/src/org/andengine/util/animationpack/AnimationPackLoader.java
@@ -65,7 +65,7 @@ public AnimationPack loadFromAsset(final String pAssetPath, final String pAssetB
 	}
 
 	public AnimationPack load(final InputStream pInputStream, final String pAssetBasePath) throws AnimationPackParseException {
-		try{
+		try {
 			final SAXParserFactory spf = SAXParserFactory.newInstance();
 			final SAXParser sp = spf.newSAXParser();
 
diff --git a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java
index 71e39cf20..8b00d4380 100644
--- a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java
+++ b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java
@@ -33,7 +33,7 @@ public AnimationPackTiledTextureRegion(final String pAnimationName, final long[]
 		this.mAnimationName = pAnimationName;
 		final int frameCount = pFrameDurations.length;
 
-		final int[] frames= new int[frameCount];
+		final int[] frames = new int[frameCount];
 		for (int i = 0; i < frameCount; i++) {
 			frames[i] = i;
 		}
diff --git a/src/org/andengine/util/debug/Debug.java b/src/org/andengine/util/debug/Debug.java
index bdc873ecc..dd6fd8216 100644
--- a/src/org/andengine/util/debug/Debug.java
+++ b/src/org/andengine/util/debug/Debug.java
@@ -11,7 +11,7 @@
  * @author Nicolas Gramlich
  * @since 13:29:16 - 08.03.2010
  */
-public class Debug {
+public final class Debug {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -28,6 +28,10 @@ public class Debug {
 	// Constructors
 	// ===========================================================
 
+	private Debug() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -411,7 +415,7 @@ public static void eUser(final String pTag, final String pMessage, final Throwab
 	public static enum DebugLevel implements Comparable {
 		NONE, ERROR, WARNING, INFO, DEBUG, VERBOSE;
 
-		public static DebugLevel ALL = DebugLevel.VERBOSE;
+		public static final DebugLevel ALL = DebugLevel.VERBOSE;
 
 		public boolean isSameOrLessThan(final DebugLevel pDebugLevel) {
 			return this.compareTo(pDebugLevel) >= 0;
diff --git a/src/org/andengine/util/escape/Unescaper.java b/src/org/andengine/util/escape/Unescaper.java
index 25f25ee3b..40fee6cdc 100644
--- a/src/org/andengine/util/escape/Unescaper.java
+++ b/src/org/andengine/util/escape/Unescaper.java
@@ -10,7 +10,7 @@
  * @author Nicolas Gramlich 
  * @since 15:20:25 - 26.04.2012
  */
-/* package */final class Unescaper {
+public final class Unescaper {
 	// ===========================================================
 	// Constants
 	// ===========================================================
diff --git a/src/org/andengine/util/escape/XMLUnescaper.java b/src/org/andengine/util/escape/XMLUnescaper.java
index f064f8a0d..3a009adbe 100644
--- a/src/org/andengine/util/escape/XMLUnescaper.java
+++ b/src/org/andengine/util/escape/XMLUnescaper.java
@@ -6,7 +6,7 @@
  * @author Nicolas Gramlich 
  * @since 3:27:44 PM - Apr 26, 2012
  */
-public class XMLUnescaper {
+public final class XMLUnescaper {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -34,6 +34,10 @@ public class XMLUnescaper {
 	// Constructors
 	// ===========================================================
 
+	private XMLUnescaper() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/level/LevelLoader.java b/src/org/andengine/util/level/LevelLoader.java
index a26a4fac2..1d7db3c04 100644
--- a/src/org/andengine/util/level/LevelLoader.java
+++ b/src/org/andengine/util/level/LevelLoader.java
@@ -79,7 +79,7 @@ public void clearEntityLoaders() {
 	}
 
 	public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath) throws LevelLoaderException {
-		return this.loadLevelFromAsset(pAssetManager, pAssetPath, (L)null);
+		return this.loadLevelFromAsset(pAssetManager, pAssetPath, (L) null);
 	}
 
 	public R loadLevelFromAsset(final AssetManager pAssetManager, final String pAssetPath, final L pEntityLoaderListener) throws LevelLoaderException {
@@ -111,7 +111,7 @@ public R loadLevelFromStream(final InputStream pInputStream, final L pEntityLoad
 	}
 
 	public R loadLevelFromStream(final InputStream pInputStream, final T pEntityLoaderData, final L pEntityLoaderListener) throws LevelLoaderException {
-		try{
+		try {
 			final SAXParserFactory spf = SAXParserFactory.newInstance();
 			final SAXParser sp = spf.newSAXParser();
 
diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java
index 05d9a62ef..d0b715cfa 100644
--- a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java
+++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java
@@ -26,7 +26,7 @@ public class SimpleLevelLoaderContentHandler extends LevelLoaderContentHandler pDefaultEntityLoader, final HashMap> pEntityLoaders, SimpleLevelEntityLoaderData pEntityLoaderData) {
+	public SimpleLevelLoaderContentHandler(final IEntityLoader pDefaultEntityLoader, final HashMap> pEntityLoaders, final SimpleLevelEntityLoaderData pEntityLoaderData) {
 		super(pDefaultEntityLoader, pEntityLoaders, pEntityLoaderData);
 	}
 
diff --git a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
index f30892795..2e0df796a 100644
--- a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
+++ b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
@@ -77,7 +77,7 @@ public void submitAsync(final int pLevelID, final boolean pSolved, final int pSe
 		new Thread(new Runnable() {
 			@Override
 			public void run() {
-				try{
+				try {
 					/* Create a new HttpClient and Post Header. */
 					final HttpClient httpClient = new DefaultHttpClient();
 					final HttpPost httpPost = new HttpPost(LevelStatsDBConnector.this.mSubmitURL);
@@ -114,7 +114,7 @@ public void run() {
 							pCallback.onCallback(false);
 						}
 					}
-				}catch(final IOException e) {
+				} catch(final IOException e) {
 					Debug.e(e);
 					if (pCallback != null) {
 						pCallback.onCallback(false);
diff --git a/src/org/andengine/util/math/MathConstants.java b/src/org/andengine/util/math/MathConstants.java
index 78bf53bee..d9220e8cc 100644
--- a/src/org/andengine/util/math/MathConstants.java
+++ b/src/org/andengine/util/math/MathConstants.java
@@ -21,7 +21,7 @@ public interface MathConstants {
 	public static final float DEG_TO_RAD = PI / 180.0f;
 	public static final float RAD_TO_DEG = 180.0f / PI;
 
-	public static final float SQRT_2 = (float)Math.sqrt(2);
+	public static final float SQRT_2 = (float) Math.sqrt(2);
 
 	// ===========================================================
 	// Methods
diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java
index b7da0f68d..caafe45a9 100644
--- a/src/org/andengine/util/math/MathUtils.java
+++ b/src/org/andengine/util/math/MathUtils.java
@@ -24,6 +24,10 @@ public final class MathUtils {
 	// Constructors
 	// ===========================================================
 
+	private MathUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -181,7 +185,7 @@ public static double max(final double pA, final double pB, final double pC, fina
 	}
 
 	public static final float atan2(final float dY, final float dX) {
-		return (float)Math.atan2(dY, dX);
+		return (float) Math.atan2(dY, dX);
 	}
 
 	public static final float radToDeg(final float pRad) {
@@ -259,8 +263,8 @@ public static final int sum(final int[] pValues) {
 	public static float[] rotateAroundCenter(final float[] pVertices, final float pRotation, final float pRotationCenterX, final float pRotationCenterY) {
 		if (pRotation != 0) {
 			final float rotationRad = MathUtils.degToRad(pRotation);
-			final float sinRotationRad = (float)Math.sin(rotationRad);
-			final float cosRotationInRad = (float)Math.cos(rotationRad);
+			final float sinRotationRad = (float) Math.sin(rotationRad);
+			final float cosRotationInRad = (float) Math.cos(rotationRad);
 
 			for (int i = pVertices.length - 2; i >= 0; i -= 2) {
 				final float pX = pVertices[i];
@@ -335,14 +339,14 @@ public static final float bringToBounds(final float pMinValue, final float pMaxV
 	public static final float distance(final float pX1, final float pY1, final float pX2, final float pY2) {
 		final float dX = pX2 - pX1;
 		final float dY = pY2 - pY1;
-		return (float)Math.sqrt((dX * dX) + (dY * dY));
+		return (float) Math.sqrt((dX * dX) + (dY * dY));
 	}
 
 	/**
 	 * @return the euclidean distance between the origin (0, 0) and (pX, pY).
 	 */
 	public static final float length(final float pX, final float pY) {
-		return (float)Math.sqrt((pX * pX) + (pY * pY));
+		return (float) Math.sqrt((pX * pX) + (pY * pY));
 	}
 
 	/**
diff --git a/src/org/andengine/util/modifier/LoopModifier.java b/src/org/andengine/util/modifier/LoopModifier.java
index 6c334995c..20acc550d 100644
--- a/src/org/andengine/util/modifier/LoopModifier.java
+++ b/src/org/andengine/util/modifier/LoopModifier.java
@@ -44,7 +44,7 @@ public LoopModifier(final IModifier pModifier) {
 	}
 
 	public LoopModifier(final IModifier pModifier, final int pLoopCount) {
-		this(pModifier, pLoopCount, null, (IModifierListener)null);
+		this(pModifier, pLoopCount, null, (IModifierListener) null);
 	}
 
 	public LoopModifier(final IModifier pModifier, final int pLoopCount, final IModifierListener pModifierListener) {
@@ -52,7 +52,7 @@ public LoopModifier(final IModifier pModifier, final int pLoopCount, final IM
 	}
 
 	public LoopModifier(final IModifier pModifier, final int pLoopCount, final ILoopModifierListener pLoopModifierListener) {
-		this(pModifier, pLoopCount, pLoopModifierListener, (IModifierListener)null);
+		this(pModifier, pLoopCount, pLoopModifierListener, (IModifierListener) null);
 	}
 
 	public LoopModifier(final IModifier pModifier, final int pLoopCount, final ILoopModifierListener pLoopModifierListener, final IModifierListener pModifierListener) {
@@ -113,7 +113,7 @@ public float onUpdate(final float pSecondsElapsed, final T pItem) {
 			float secondsElapsedRemaining = pSecondsElapsed;
 
 			this.mFinishedCached = false;
-			while((secondsElapsedRemaining > 0) && !this.mFinishedCached) {
+			while ((secondsElapsedRemaining > 0) && !this.mFinishedCached) {
 				secondsElapsedRemaining -= this.mModifier.onUpdate(secondsElapsedRemaining, pItem);
 			}
 			this.mFinishedCached = false;
diff --git a/src/org/andengine/util/modifier/ParallelModifier.java b/src/org/andengine/util/modifier/ParallelModifier.java
index aa043757f..d33e0f3c0 100644
--- a/src/org/andengine/util/modifier/ParallelModifier.java
+++ b/src/org/andengine/util/modifier/ParallelModifier.java
@@ -68,7 +68,7 @@ protected ParallelModifier(final ParallelModifier pParallelModifier) throws D
 	}
 
 	@Override
-	public ParallelModifier deepCopy() throws DeepCopyNotSupportedException{
+	public ParallelModifier deepCopy() throws DeepCopyNotSupportedException {
 		return new ParallelModifier(this);
 	}
 
@@ -100,7 +100,7 @@ public float onUpdate(final float pSecondsElapsed, final T pItem) {
 			final IModifier[] shapeModifiers = this.mModifiers;
 
 			this.mFinishedCached = false;
-			while(secondsElapsedRemaining > 0 && !this.mFinishedCached) {
+			while (secondsElapsedRemaining > 0 && !this.mFinishedCached) {
 				float secondsElapsedUsed = 0;
 				for (int i = shapeModifiers.length - 1; i >= 0; i--) {
 					secondsElapsedUsed = Math.max(secondsElapsedUsed, shapeModifiers[i].onUpdate(pSecondsElapsed, pItem));
diff --git a/src/org/andengine/util/modifier/SequenceModifier.java b/src/org/andengine/util/modifier/SequenceModifier.java
index c584f1c50..4fe245b40 100644
--- a/src/org/andengine/util/modifier/SequenceModifier.java
+++ b/src/org/andengine/util/modifier/SequenceModifier.java
@@ -79,7 +79,7 @@ protected SequenceModifier(final SequenceModifier pSequenceModifier) throws D
 	}
 
 	@Override
-	public SequenceModifier deepCopy() throws DeepCopyNotSupportedException{
+	public SequenceModifier deepCopy() throws DeepCopyNotSupportedException {
 		return new SequenceModifier(this);
 	}
 
@@ -116,7 +116,7 @@ public float onUpdate(final float pSecondsElapsed, final T pItem) {
 		} else {
 			float secondsElapsedRemaining = pSecondsElapsed;
 			this.mFinishedCached = false;
-			while(secondsElapsedRemaining > 0 && !this.mFinishedCached) {
+			while (secondsElapsedRemaining > 0 && !this.mFinishedCached) {
 				secondsElapsedRemaining -= this.mSubSequenceModifiers[this.mCurrentSubSequenceModifierIndex].onUpdate(secondsElapsedRemaining, pItem);
 			}
 			this.mFinishedCached = false;
diff --git a/src/org/andengine/util/modifier/ease/EaseCircularIn.java b/src/org/andengine/util/modifier/ease/EaseCircularIn.java
index 7091f992c..b04c27287 100644
--- a/src/org/andengine/util/modifier/ease/EaseCircularIn.java
+++ b/src/org/andengine/util/modifier/ease/EaseCircularIn.java
@@ -53,7 +53,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) {
 	// ===========================================================
 
 	public static float getValue(final float pPercentage) {
-		return -((float)Math.sqrt(1 - pPercentage * pPercentage) - 1.0f);
+		return -((float) Math.sqrt(1 - pPercentage * pPercentage) - 1.0f);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/ease/EaseCircularOut.java b/src/org/andengine/util/modifier/ease/EaseCircularOut.java
index 3ddbf3035..d1662c15f 100644
--- a/src/org/andengine/util/modifier/ease/EaseCircularOut.java
+++ b/src/org/andengine/util/modifier/ease/EaseCircularOut.java
@@ -54,7 +54,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) {
 
 	public static float getValue(final float pPercentage) {
 		final float t = pPercentage - 1;
-		return (float)Math.sqrt(1 - t * t);
+		return (float) Math.sqrt(1 - t * t);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/ease/EaseElasticIn.java b/src/org/andengine/util/modifier/ease/EaseElasticIn.java
index 462ece6f6..bf4aa6f25 100644
--- a/src/org/andengine/util/modifier/ease/EaseElasticIn.java
+++ b/src/org/andengine/util/modifier/ease/EaseElasticIn.java
@@ -65,7 +65,7 @@ public static float getValue(final float pSecondsElapsed, final float pDuration,
 		final float s = p / 4;
 
 		final float t = pPercentage - 1;
-		return -(float)Math.pow(2, 10 * t) * (float)Math.sin((t * pDuration - s) * MathConstants.PI_TWICE / p);
+		return -(float) Math.pow(2, 10 * t) * (float) Math.sin((t * pDuration - s) * MathConstants.PI_TWICE / p);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/ease/EaseElasticOut.java b/src/org/andengine/util/modifier/ease/EaseElasticOut.java
index 6aac543ff..c773ee769 100644
--- a/src/org/andengine/util/modifier/ease/EaseElasticOut.java
+++ b/src/org/andengine/util/modifier/ease/EaseElasticOut.java
@@ -64,7 +64,7 @@ public static float getValue(final float pSecondsElapsed, final float pDuration,
 		final float p = pDuration * 0.3f;
 		final float s = p / 4;
 
-		return 1 + (float)Math.pow(2, -10 * pPercentageDone) * (float)Math.sin((pPercentageDone * pDuration - s) * MathConstants.PI_TWICE / p);
+		return 1 + (float) Math.pow(2, -10 * pPercentageDone) * (float) Math.sin((pPercentageDone * pDuration - s) * MathConstants.PI_TWICE / p);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/ease/EaseExponentialOut.java b/src/org/andengine/util/modifier/ease/EaseExponentialOut.java
index f38ab2e5a..d2ac43b34 100644
--- a/src/org/andengine/util/modifier/ease/EaseExponentialOut.java
+++ b/src/org/andengine/util/modifier/ease/EaseExponentialOut.java
@@ -52,7 +52,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) {
 	// ===========================================================
 
 	public static float getValue(final float pPercentage) {
-		return (pPercentage == 1) ? 1 : (-(float)Math.pow(2, -10 * pPercentage) + 1);
+		return (pPercentage == 1) ? 1 : (-(float) Math.pow(2, -10 * pPercentage) + 1);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/ease/EaseSineIn.java b/src/org/andengine/util/modifier/ease/EaseSineIn.java
index c992f11ed..0894b41d4 100644
--- a/src/org/andengine/util/modifier/ease/EaseSineIn.java
+++ b/src/org/andengine/util/modifier/ease/EaseSineIn.java
@@ -54,7 +54,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) {
 	// ===========================================================
 
 	public static float getValue(final float pPercentage) {
-		return -(float)Math.cos(pPercentage * MathConstants.PI_HALF) + 1;
+		return -(float) Math.cos(pPercentage * MathConstants.PI_HALF) + 1;
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/ease/EaseSineInOut.java b/src/org/andengine/util/modifier/ease/EaseSineInOut.java
index b4c89e7c9..36613596e 100644
--- a/src/org/andengine/util/modifier/ease/EaseSineInOut.java
+++ b/src/org/andengine/util/modifier/ease/EaseSineInOut.java
@@ -48,7 +48,7 @@ public static EaseSineInOut getInstance() {
 	public float getPercentage(final float pSecondsElapsed, final float pDuration) {
 		final float percentage = pSecondsElapsed / pDuration;
 
-		return -0.5f * ((float)Math.cos(percentage * PI) - 1);
+		return -0.5f * ((float) Math.cos(percentage * PI) - 1);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/ease/EaseSineOut.java b/src/org/andengine/util/modifier/ease/EaseSineOut.java
index 1539a2c23..b4434d46c 100644
--- a/src/org/andengine/util/modifier/ease/EaseSineOut.java
+++ b/src/org/andengine/util/modifier/ease/EaseSineOut.java
@@ -54,7 +54,7 @@ public float getPercentage(final float pSecondsElapsed, final float pDuration) {
 	// ===========================================================
 
 	public static float getValue(final float pPercentage) {
-		return (float)Math.sin(pPercentage * MathConstants.PI_HALF);
+		return (float) Math.sin(pPercentage * MathConstants.PI_HALF);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/modifier/util/ModifierUtils.java b/src/org/andengine/util/modifier/util/ModifierUtils.java
index b775e14ae..83bc156f3 100644
--- a/src/org/andengine/util/modifier/util/ModifierUtils.java
+++ b/src/org/andengine/util/modifier/util/ModifierUtils.java
@@ -9,7 +9,7 @@
  * @author Nicolas Gramlich
  * @since 11:16:36 - 03.09.2010
  */
-public class ModifierUtils {
+public final class ModifierUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -22,6 +22,10 @@ public class ModifierUtils {
 	// Constructors
 	// ===========================================================
 
+	private ModifierUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
diff --git a/src/org/andengine/util/texturepack/TexturePackLoader.java b/src/org/andengine/util/texturepack/TexturePackLoader.java
index 3c33c667f..a1b17447b 100644
--- a/src/org/andengine/util/texturepack/TexturePackLoader.java
+++ b/src/org/andengine/util/texturepack/TexturePackLoader.java
@@ -65,7 +65,7 @@ public TexturePack loadFromAsset(final String pAssetPath, final String pAssetBas
 	}
 
 	public TexturePack load(final InputStream pInputStream, final String pAssetBasePath) throws TexturePackParseException {
-		try{
+		try {
 			final SAXParserFactory spf = SAXParserFactory.newInstance();
 			final SAXParser sp = spf.newSAXParser();
 

From ff7f4787750d0ef8a773b913cb32e0b05aee954f Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 17 Mar 2013 16:34:18 -0700
Subject: [PATCH 134/252] Added MethodNotFoundException.

---
 .../exception/MethodNotFoundException.java    | 55 +++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 src/org/andengine/util/exception/MethodNotFoundException.java

diff --git a/src/org/andengine/util/exception/MethodNotFoundException.java b/src/org/andengine/util/exception/MethodNotFoundException.java
new file mode 100644
index 000000000..aabde4dc2
--- /dev/null
+++ b/src/org/andengine/util/exception/MethodNotFoundException.java
@@ -0,0 +1,55 @@
+package org.andengine.util.exception;
+
+/**
+ * (c) Nicolas Gramlich 2013
+ *
+ * @author Nicolas Gramlich 
+ * @since 18:13:32 - 26.12.2011
+ */
+public class MethodNotFoundException extends AndEngineRuntimeException {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final long serialVersionUID = -6878670836555401945L;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public MethodNotFoundException() {
+
+	}
+
+	public MethodNotFoundException(final String pMessage) {
+		super(pMessage);
+	}
+
+	public MethodNotFoundException(final Throwable pThrowable) {
+		super(pThrowable);
+	}
+
+	public MethodNotFoundException(final String pMessage, final Throwable pThrowable) {
+		super(pMessage, pThrowable);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}

From 2d76371c0c49599204d0979ab2dd8b311289dad1 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 17 Mar 2013 16:36:06 -0700
Subject: [PATCH 135/252] Minor refactoring in SystemUtils.

---
 .../input/touch/controller/MultiTouch.java    |  4 +-
 .../andengine/util/system/SystemUtils.java    | 48 ++++++++++++++-----
 2 files changed, 37 insertions(+), 15 deletions(-)

diff --git a/src/org/andengine/input/touch/controller/MultiTouch.java b/src/org/andengine/input/touch/controller/MultiTouch.java
index 5dec02b9d..e5c8a5b97 100644
--- a/src/org/andengine/input/touch/controller/MultiTouch.java
+++ b/src/org/andengine/input/touch/controller/MultiTouch.java
@@ -46,7 +46,7 @@ private MultiTouch() {
 
 	public static boolean isSupported(final Context pContext) {
 		if (MultiTouch.sSupported == null) {
-			MultiTouch.sSupported = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH);
+			MultiTouch.sSupported = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH, false);
 		}
 
 		return MultiTouch.sSupported;
@@ -54,7 +54,7 @@ public static boolean isSupported(final Context pContext) {
 
 	public static boolean isSupportedDistinct(final Context pContext) {
 		if (MultiTouch.sSupportedDistinct == null) {
-			MultiTouch.sSupportedDistinct = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
+			MultiTouch.sSupportedDistinct = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT, false);
 		}
 
 		return MultiTouch.sSupportedDistinct;
diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java
index ba27d1af5..fb36e7b3e 100644
--- a/src/org/andengine/util/system/SystemUtils.java
+++ b/src/org/andengine/util/system/SystemUtils.java
@@ -8,6 +8,7 @@
 
 import org.andengine.util.StreamUtils;
 import org.andengine.util.adt.DataConstants;
+import org.andengine.util.exception.MethodNotFoundException;
 
 import android.content.Context;
 import android.content.pm.PackageInfo;
@@ -53,6 +54,14 @@ public class SystemUtils {
 	// Getter & Setter
 	// ===========================================================
 
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
 	public static MemoryInfo getMemoryInfo() {
 		/* Lazy allocation. */
 		if (SystemUtils.sMemoryInfo == null) {
@@ -64,18 +73,18 @@ public static MemoryInfo getMemoryInfo() {
 		return SystemUtils.sMemoryInfo;
 	}
 
-	// ===========================================================
-	// Methods for/from SuperClass/Interfaces
-	// ===========================================================
-
-	// ===========================================================
-	// Methods
-	// ===========================================================
-
-	public static boolean isGoogleTV(final Context pContext) {
+	public static boolean isGoogleTV(final Context pContext) throws SystemUtilsException {
 		return SystemUtils.hasSystemFeature(pContext, "com.google.android.tv");
 	}
 
+	public static boolean isGoogleTV(final Context pContext, final boolean pDefault) {
+		try {
+			return SystemUtils.isGoogleTV(pContext);
+		} catch (final SystemUtilsException e) {
+			return pDefault;
+		}
+	}
+
 	public static int getPackageVersionCode(final Context pContext) throws SystemUtilsException {
 		return SystemUtils.getPackageInfo(pContext).versionCode;
 	}
@@ -105,17 +114,30 @@ private static PackageInfo getPackageInfo(final Context pContext) throws SystemU
 		}
 	}
 
-	public static boolean hasSystemFeature(final Context pContext, final String pFeature) {
+	public static boolean hasSystemFeature(final Context pContext, final String pFeature) throws SystemUtilsException {
 		final PackageManager packageManager = pContext.getPackageManager();
 		try {
 			try {
 				return packageManager.hasSystemFeature(pFeature);
 			} catch (final Throwable t) {
-				final Method PackageManager_hasSystemFeatures = PackageManager.class.getMethod("hasSystemFeature", new Class[] { String.class });
-				return (PackageManager_hasSystemFeatures == null) ? false : (Boolean) PackageManager_hasSystemFeatures.invoke(packageManager, pFeature);
+				final Method PackageManager_hasSystemFeatures = PackageManager.class.getMethod("hasSystemFeature", String.class);
+				if (PackageManager_hasSystemFeatures == null) {
+					throw new SystemUtilsException(new MethodNotFoundException(PackageManager.class.getSimpleName() + ".hasSystemFeature(String)"));
+				} else {
+					final boolean result = (Boolean) PackageManager_hasSystemFeatures.invoke(packageManager, pFeature);
+					return result;
+				}
 			}
 		} catch (final Throwable t) {
-			return false;
+			throw new SystemUtilsException(t);
+		}
+	}
+
+	public static boolean hasSystemFeature(final Context pContext, final String pFeature, final boolean pDefault) {
+		try {
+			return SystemUtils.hasSystemFeature(pContext, pFeature);
+		} catch (SystemUtilsException e) {
+			return pDefault;
 		}
 	}
 

From 6f2bac0e2f532162c217a826b0a4d47b79dc6f00 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 17 Mar 2013 16:37:50 -0700
Subject: [PATCH 136/252] Added WifiUtils (experimental).

---
 src/org/andengine/util/WiFiUtils.java | 129 ++++++++++++++++++++++++++
 1 file changed, 129 insertions(+)
 create mode 100644 src/org/andengine/util/WiFiUtils.java

diff --git a/src/org/andengine/util/WiFiUtils.java b/src/org/andengine/util/WiFiUtils.java
new file mode 100644
index 000000000..28d8e0e8f
--- /dev/null
+++ b/src/org/andengine/util/WiFiUtils.java
@@ -0,0 +1,129 @@
+package org.andengine.util;
+
+import java.lang.reflect.Method;
+
+import org.andengine.util.exception.MethodNotFoundException;
+
+import android.content.Context;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ * 
+ * @author Nicolas Gramlich
+ * @since 14:49:11 - 17.03.2013
+ */
+public final class WifiUtils {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	private WifiUtils() {
+
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public static boolean isWifiAccessPointEnabled(final Context pContext) throws WifiUtilsException {
+		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
+
+		try {
+			final Method WifiManager_isWifiApEnabled = wifiManager.getClass().getMethod("isWifiApEnabled");
+			if (WifiManager_isWifiApEnabled == null) {
+				throw new WifiUtilsException(new MethodNotFoundException(WifiManager.class.getSimpleName() + ".isWifiApEnabled()"));
+			} else {
+				final boolean result = (Boolean) WifiManager_isWifiApEnabled.invoke(wifiManager);
+				return result;
+			}
+		} catch (final Throwable t) {
+			throw new WifiUtilsException(t);
+		}
+	}
+
+	public static boolean isWifiAccessPointEnabled(final Context pContext, final boolean pDefault) {
+		try {
+			return WifiUtils.isWifiAccessPointEnabled(pContext);
+		} catch (final WifiUtilsException e) {
+			return pDefault;
+		}
+	}
+
+	public static boolean setWifiAccessPointEnabled(final Context pContext, final boolean pEnabled) throws WifiUtilsException {
+		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
+
+		try {
+			final Method WifiManager_setWifiApEnabled = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
+			if (WifiManager_setWifiApEnabled == null) {
+				throw new WifiUtilsException(new MethodNotFoundException(WifiManager.class.getSimpleName() + ".setWifiApEnabled(" + WifiConfiguration.class.getSimpleName() + ", " + boolean.class.getSimpleName() + ")"));
+			} else {
+				final boolean result = (Boolean) WifiManager_setWifiApEnabled.invoke(wifiManager, null, pEnabled);
+				return result;
+			}
+		} catch (final Throwable t) {
+			throw new WifiUtilsException(t);
+		}
+	}
+
+	public static int getWifiAccessPointState(final Context pContext) throws WifiUtilsException {
+		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
+
+		try {
+			final Method WifiManager_getWifiApState = wifiManager.getClass().getMethod("getWifiApState");
+			if (WifiManager_getWifiApState == null) {
+				throw new WifiUtilsException(new MethodNotFoundException(WifiManager.class.getSimpleName() + ".getWifiApState()"));
+			} else {
+				final int result = (Integer) WifiManager_getWifiApState.invoke(wifiManager);
+				return result;
+			}
+		} catch (final Throwable t) {
+			throw new WifiUtilsException(t);
+		}
+	}
+
+	private static WifiManager getWifiManager(final Context pContext) {
+		return (WifiManager) pContext.getSystemService(Context.WIFI_SERVICE);
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+
+	public static class WifiUtilsException extends Exception {
+		// ===========================================================
+		// Constants
+		// ===========================================================
+
+		private static final long serialVersionUID = 1108697754015225179L;
+
+		// ===========================================================
+		// Methods
+		// ===========================================================
+
+		public WifiUtilsException() {
+
+		}
+
+		public WifiUtilsException(final Throwable pThrowable) {
+			super(pThrowable);
+		}
+	}
+}

From dae7c75201eda527ba3206f6e152b2297452405f Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 17 Mar 2013 20:13:44 -0700
Subject: [PATCH 137/252] Moved/Merged WiFiUtils, IPUtils and Bluetooth from
 AndEngineMultiplayerExtension to AndEngine.

---
 src/org/andengine/util/Bluetooth.java         |  71 +++++
 src/org/andengine/util/IPUtils.java           |  73 +++++
 src/org/andengine/util/WiFiUtils.java         | 290 +++++++++++++++++-
 .../andengine/util/adt/array/ArrayUtils.java  |  20 ++
 .../util/exception/BluetoothException.java    |  52 ++++
 .../util/exception/WifiException.java         |  53 ++++
 6 files changed, 548 insertions(+), 11 deletions(-)
 create mode 100644 src/org/andengine/util/Bluetooth.java
 create mode 100644 src/org/andengine/util/IPUtils.java
 create mode 100644 src/org/andengine/util/exception/BluetoothException.java
 create mode 100644 src/org/andengine/util/exception/WifiException.java

diff --git a/src/org/andengine/util/Bluetooth.java b/src/org/andengine/util/Bluetooth.java
new file mode 100644
index 000000000..face24cb8
--- /dev/null
+++ b/src/org/andengine/util/Bluetooth.java
@@ -0,0 +1,71 @@
+package org.andengine.util;
+
+import org.andengine.util.system.SystemUtils;
+import org.andengine.util.system.SystemUtils.SystemUtilsException;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
+
+/**
+ * (c) 2010 Nicolas Gramlich
+ * (c) 2011 Zynga Inc.
+ *
+ * @author Nicolas Gramlich
+ * @since 21:44:07 - 04.03.2011
+ */
+public final class Bluetooth {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	private static Boolean sSupported;
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	private Bluetooth() {
+
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public static boolean isSupported(final Context pContext) {
+		if (sSupported == null) {
+			if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.ECLAIR_MR1)) {
+				try {
+					sSupported = SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_BLUETOOTH);
+				} catch (final SystemUtilsException e) {
+					sSupported = Boolean.FALSE;
+				}
+			} else {
+				sSupported = Boolean.FALSE;
+			}
+		}
+
+		return sSupported;
+	}
+
+	public static boolean isSupportedByAndroidVersion() {
+		return SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.ECLAIR_MR1);
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/IPUtils.java b/src/org/andengine/util/IPUtils.java
new file mode 100644
index 000000000..58504a7dc
--- /dev/null
+++ b/src/org/andengine/util/IPUtils.java
@@ -0,0 +1,73 @@
+package org.andengine.util;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.regex.Pattern;
+
+/**
+ * (c) 2010 Nicolas Gramlich
+ * (c) 2011 Zynga Inc.
+ *
+ * @author Nicolas Gramlich
+ * @since 17:16:20 - 20.06.2010
+ */
+public class IPUtils {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	public static final String LOCALHOST_IP = "127.0.0.1";
+
+	private static final String REGEXP_255 = "(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)"; // 25(<=5) or 2(<=4)(<=9) or (0|1)(<=9)(<=9)
+	public static final String REGEXP_IPv4 = REGEXP_255 + "\\." + REGEXP_255 + "\\." + REGEXP_255 + "\\." + REGEXP_255;
+
+	private static final Pattern IPv4_PATTERN = Pattern.compile(REGEXP_IPv4);
+
+	public static final int IPV4_LENGTH = 4;
+	public static final int IPV6_LENGTH = 16;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public static byte[] ipv4AddressToIPAddress(final int pIPv4Address) {
+		final byte[] ip = new byte[4];
+		ip[0] = (byte)((pIPv4Address >> 0) & 0xff);
+		ip[1] = (byte)((pIPv4Address >> 8) & 0xff);
+		ip[2] = (byte)((pIPv4Address >> 16) & 0xff);
+		ip[3] = (byte)((pIPv4Address >> 24) & 0xff);
+		return ip;
+	}
+
+	public static String ipAddressToString(final byte[] pIPAddress) throws UnknownHostException {
+		return InetAddress.getByAddress(pIPAddress).getHostAddress();
+	}
+
+	public static byte[] stringToIPAddress(final String pString) throws UnknownHostException {
+		return InetAddress.getByName(pString).getAddress();
+	}
+
+	public static boolean isValidIPv4(final String pIPv4Address) {
+		return IPv4_PATTERN.matcher(pIPv4Address).matches();
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/WiFiUtils.java b/src/org/andengine/util/WiFiUtils.java
index 28d8e0e8f..18dc755fe 100644
--- a/src/org/andengine/util/WiFiUtils.java
+++ b/src/org/andengine/util/WiFiUtils.java
@@ -1,24 +1,42 @@
 package org.andengine.util;
 
 import java.lang.reflect.Method;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Enumeration;
 
+import org.andengine.util.adt.array.ArrayUtils;
+import org.andengine.util.debug.Debug;
 import org.andengine.util.exception.MethodNotFoundException;
+import org.andengine.util.exception.WifiException;
+import org.andengine.util.system.SystemUtils;
 
 import android.content.Context;
+import android.net.DhcpInfo;
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
+import android.net.wifi.WifiManager.MulticastLock;
+import android.os.Build;
 
 /**
- * (c) 2013 Nicolas Gramlich
- * 
+ * (c) 2010 Nicolas Gramlich
+ * (c) 2011 Zynga Inc.
+ *
  * @author Nicolas Gramlich
- * @since 14:49:11 - 17.03.2013
+ * @since 16:54:01 - 20.03.2011
  */
 public final class WifiUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
 
+	private static final String IP_DEFAULT = "0.0.0.0";
+	private static final String[] HOTSPOT_NETWORKINTERFACE_NAMES = { "wl0.1", "wlan0" };
+	private static final String MULTICASTLOCK_NAME_DEFAULT = "AndEngineMulticastLock";
+
 	// ===========================================================
 	// Fields
 	// ===========================================================
@@ -43,7 +61,57 @@ private WifiUtils() {
 	// Methods
 	// ===========================================================
 
-	public static boolean isWifiAccessPointEnabled(final Context pContext) throws WifiUtilsException {
+	public static WifiManager getWifiManager(final Context pContext) {
+		return (WifiManager) pContext.getSystemService(Context.WIFI_SERVICE);
+	}
+
+	public static boolean isWifiEnabled(final Context pContext) {
+		return WifiUtils.getWifiManager(pContext).isWifiEnabled();
+	}
+
+	private static void setWifiEnabled(final Context pContext, final boolean pEnabled) {
+		WifiUtils.getWifiManager(pContext).setWifiEnabled(pEnabled);
+	}
+
+	public static String getWifiSSID(final Context pContext) {
+		return WifiUtils.getWifiManager(pContext).getConnectionInfo().getSSID();
+	}
+
+	public static byte[] getWifiIPv4AddressRaw(final Context pContext) {
+		return IPUtils.ipv4AddressToIPAddress(WifiUtils.getWifiManager(pContext).getConnectionInfo().getIpAddress());
+	}
+
+	public static String getWifiIPv4Address(final Context pContext) throws UnknownHostException {
+		return IPUtils.ipAddressToString(WifiUtils.getWifiIPv4AddressRaw(pContext));
+	}
+
+	public static boolean isWifiIPAddressValid(final Context pContext) {
+		return WifiUtils.getWifiManager(pContext).getConnectionInfo().getIpAddress() != 0;
+	}
+
+
+	/**
+	 * The check currently performed is not sufficient, as some carriers disabled this feature manually!
+	 */
+	public static boolean isWifiHotspotSupported(final Context pContext) {
+		if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.ECLAIR_MR1)) {
+			return false;
+		} else {
+			final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
+			for (Method m : wifiManager.getClass().getMethods()) {
+				Debug.d("WifiManager." + m.getName());
+			}
+
+			try {
+				final Method WifiManager_isWifiApEnabled = wifiManager.getClass().getMethod("isWifiApEnabled");
+				return WifiManager_isWifiApEnabled != null;
+			} catch (final Throwable t) {
+				return false;
+			}
+		}
+	}
+
+	public static boolean isWifiHotspotEnabled(final Context pContext) throws WifiUtilsException {
 		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
 
 		try {
@@ -59,23 +127,31 @@ public static boolean isWifiAccessPointEnabled(final Context pContext) throws Wi
 		}
 	}
 
-	public static boolean isWifiAccessPointEnabled(final Context pContext, final boolean pDefault) {
+	public static boolean isWifiHotspotEnabled(final Context pContext, final boolean pDefault) {
 		try {
-			return WifiUtils.isWifiAccessPointEnabled(pContext);
+			return WifiUtils.isWifiHotspotEnabled(pContext);
 		} catch (final WifiUtilsException e) {
 			return pDefault;
 		}
 	}
 
-	public static boolean setWifiAccessPointEnabled(final Context pContext, final boolean pEnabled) throws WifiUtilsException {
+	public static boolean setWifiHostpotEnabled(final Context pContext, final boolean pEnabled) throws WifiUtilsException {
+		return WifiUtils.setWifiHostpotEnabled(pContext, null, pEnabled);
+	}
+
+	public static boolean setWifiHostpotEnabled(final Context pContext, final WifiConfiguration pWifiConfiguration, final boolean pEnabled) throws WifiUtilsException {
 		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
 
 		try {
+			if (pEnabled) {
+				WifiUtils.setWifiEnabled(pContext, false);
+			}
+
 			final Method WifiManager_setWifiApEnabled = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
 			if (WifiManager_setWifiApEnabled == null) {
 				throw new WifiUtilsException(new MethodNotFoundException(WifiManager.class.getSimpleName() + ".setWifiApEnabled(" + WifiConfiguration.class.getSimpleName() + ", " + boolean.class.getSimpleName() + ")"));
 			} else {
-				final boolean result = (Boolean) WifiManager_setWifiApEnabled.invoke(wifiManager, null, pEnabled);
+				final boolean result = (Boolean) WifiManager_setWifiApEnabled.invoke(wifiManager, pWifiConfiguration, pEnabled);
 				return result;
 			}
 		} catch (final Throwable t) {
@@ -83,7 +159,7 @@ public static boolean setWifiAccessPointEnabled(final Context pContext, final bo
 		}
 	}
 
-	public static int getWifiAccessPointState(final Context pContext) throws WifiUtilsException {
+	public static WifiHotspotState getWifiHotspotState(final Context pContext) throws WifiUtilsException {
 		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
 
 		try {
@@ -92,6 +168,88 @@ public static int getWifiAccessPointState(final Context pContext) throws WifiUti
 				throw new WifiUtilsException(new MethodNotFoundException(WifiManager.class.getSimpleName() + ".getWifiApState()"));
 			} else {
 				final int result = (Integer) WifiManager_getWifiApState.invoke(wifiManager);
+
+				return WifiHotspotState.fromWifiApState(result);
+			}
+		} catch (final Throwable t) {
+			throw new WifiUtilsException(t);
+		}
+	}
+
+	public static boolean isWifiHotspotRunning() throws WifiException {
+		try {
+			final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces();
+			while (networkInterfaceEnumeration.hasMoreElements()) {
+				final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement();
+				final String networkInterfaceName = networkInterface.getName();
+
+				if (ArrayUtils.contains(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES, networkInterfaceName)) {
+					return true;
+				}
+			}
+			return false;
+		} catch (final SocketException e) {
+			throw new WifiException("Unexpected error!", e);
+		}
+	}
+
+	/**
+	 * @return prefers to return an IPv4 address if found, otherwise an IPv6 address.
+	 * @throws WifiException
+	 */
+	public static byte[] getWifiHotspotIPAddressRaw() throws WifiException {
+		try {
+			final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces();
+			while (networkInterfaceEnumeration.hasMoreElements()) {
+				final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement();
+				final String networkInterfaceName = networkInterface.getName();
+
+				if (ArrayUtils.contains(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES, networkInterfaceName)) {
+					byte[] ipv6Address = null;
+					final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses();
+					while (inetAddressEnumeration.hasMoreElements()) {
+						final byte[] ipAddress = inetAddressEnumeration.nextElement().getAddress();
+						if (ipAddress.length == 4) { // TODO Constant!
+							return ipAddress;
+						} else {
+							ipv6Address = ipAddress;
+						}
+					}
+					if (ipv6Address != null) {
+						return ipv6Address;
+					} else {
+						throw new WifiException("No IP bound to '" + Arrays.toString(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES) + "'!");
+					}
+				}
+			}
+			throw new WifiException("No NetworInterface '" + Arrays.toString(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES) + "' found!");
+		} catch (final SocketException e) {
+			throw new WifiException("Unexpected error!", e);
+		}
+	}
+
+	public static String getWifiHotspotIPAddress() throws WifiException {
+		try {
+			return IPUtils.ipAddressToString(WifiUtils.getWifiHotspotIPAddressRaw());
+		} catch (final UnknownHostException e) {
+			throw new WifiException("Unexpected error!", e);
+		}
+	}
+
+	public static boolean isWifiHotspotIPAddressValid() throws WifiException { // TODO!
+		return !WifiUtils.IP_DEFAULT.equals(WifiUtils.getWifiHotspotIPAddress());
+	}
+
+
+	public static boolean isMulticastEnabled(final Context pContext) throws WifiUtilsException {
+		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
+
+		try {
+			final Method WifiManager_isMulticastEnabled = wifiManager.getClass().getMethod("isMulticastEnabled");
+			if (WifiManager_isMulticastEnabled == null) {
+				throw new WifiUtilsException(new MethodNotFoundException(WifiManager.class.getSimpleName() + ".isMulticastEnabled()"));
+			} else {
+				final boolean result = (Boolean) WifiManager_isMulticastEnabled.invoke(wifiManager);
 				return result;
 			}
 		} catch (final Throwable t) {
@@ -99,14 +257,124 @@ public static int getWifiAccessPointState(final Context pContext) throws WifiUti
 		}
 	}
 
-	private static WifiManager getWifiManager(final Context pContext) {
-		return (WifiManager) pContext.getSystemService(Context.WIFI_SERVICE);
+	public static boolean isMulticastEnabled(final Context pContext, final boolean pDefault) {
+		try {
+			return WifiUtils.isMulticastEnabled(pContext);
+		} catch (final WifiUtilsException e) {
+			return pDefault;
+		}
+	}
+
+	public static MulticastLock aquireMulticastLock(final Context pContext) {
+		return WifiUtils.aquireMulticastLock(pContext, WifiUtils.MULTICASTLOCK_NAME_DEFAULT);
+	}
+
+	public static MulticastLock aquireMulticastLock(final Context pContext, final String pMulticastLockName) {
+		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
+		final MulticastLock multicastLock = wifiManager.createMulticastLock(pMulticastLockName);
+		multicastLock.setReferenceCounted(true);
+		multicastLock.acquire();
+		return multicastLock;
+	}
+
+	public static void releaseMulticastLock(final MulticastLock pMulticastLock) {
+		if (pMulticastLock.isHeld()) {
+			pMulticastLock.release();
+		}
+	}
+
+
+	public static byte[] getBroadcastIPAddressRaw(final Context pContext) throws WifiException {
+		final WifiManager wifiManager = WifiUtils.getWifiManager(pContext);
+		final DhcpInfo dhcp = wifiManager.getDhcpInfo();
+		// TODO handle null somehow...
+
+		final int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
+		final byte[] broadcastIP = new byte[4];
+		for (int k = 0; k < 4; k++) {
+			broadcastIP[k] = (byte) ((broadcast >> (k * 8)) & 0xFF);
+		}
+		return broadcastIP;
 	}
 
 	// ===========================================================
 	// Inner and Anonymous Classes
 	// ===========================================================
 
+	public enum WifiHotspotState {
+		// ===========================================================
+		// Elements
+		// ===========================================================
+
+		DISABLING,
+		DISABLED,
+		ENABLING,
+		ENABLED,
+		FAILED;
+
+		// ===========================================================
+		// Constants
+		// ===========================================================
+
+		// ===========================================================
+		// Fields
+		// ===========================================================
+
+		// ===========================================================
+		// Constructors
+		// ===========================================================
+
+		public static WifiHotspotState fromWifiApState(final int pWifiApState) throws WifiException {
+			if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.ICE_CREAM_SANDWICH)) {
+				switch (pWifiApState) {
+					case 0:
+						return DISABLING;
+					case 1:
+						return DISABLED;
+					case 2:
+						return ENABLING;
+					case 3:
+						return ENABLED;
+					case 4:
+						return FAILED;
+					default:
+						throw new WifiException("TODO...");
+				}
+			} else {
+				switch (pWifiApState) {
+					case 0:
+						return DISABLING;
+					case 1:
+						return DISABLED;
+					case 2:
+						return ENABLING;
+					case 3:
+						return ENABLED;
+					case 4:
+						return FAILED;
+					default:
+						throw new WifiException("TODO...");
+				}
+			}
+		}
+
+		// ===========================================================
+		// Getter & Setter
+		// ===========================================================
+
+		// ===========================================================
+		// Methods for/from SuperClass/Interfaces
+		// ===========================================================
+
+		// ===========================================================
+		// Methods
+		// ===========================================================
+
+		// ===========================================================
+		// Inner and Anonymous Classes
+		// ===========================================================
+	}
+
 	public static class WifiUtilsException extends Exception {
 		// ===========================================================
 		// Constants
diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java
index d18b69066..af45a8f81 100644
--- a/src/org/andengine/util/adt/array/ArrayUtils.java
+++ b/src/org/andengine/util/adt/array/ArrayUtils.java
@@ -325,6 +325,26 @@ public static final boolean contains(final double[] pItems, final double pItem)
 		return false;
 	}
 
+	public static final boolean contains(final Object[] pItems, final Object pItem) {
+		for (int i = pItems.length - 1; i >= 0; i--) {
+			final Object item = pItems[i];
+			if (pItem == null && item == null) {
+				return true;
+			} else {
+				if (item != null) {
+					if (item.equals(pItem)) {
+						return true;
+					}
+				} else {
+					if (pItem.equals(item)) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+
 	/**
 	 * @param pClass the type of the returned array T[].
 	 * @param pArrays items or pArrays itself can be null.
diff --git a/src/org/andengine/util/exception/BluetoothException.java b/src/org/andengine/util/exception/BluetoothException.java
new file mode 100644
index 000000000..4815c9ed8
--- /dev/null
+++ b/src/org/andengine/util/exception/BluetoothException.java
@@ -0,0 +1,52 @@
+package org.andengine.util.exception;
+
+/**
+ * (c) 2010 Nicolas Gramlich
+ * (c) 2011 Zynga Inc.
+ *
+ * @author Nicolas Gramlich
+ * @since 20:17:14 - 04.03.2011
+ */
+public class BluetoothException extends AndEngineException {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final long serialVersionUID = -8552336984977745238L;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public BluetoothException() {
+
+	}
+
+	public BluetoothException(final String pMessage) {
+		super(pMessage);
+	}
+
+	public BluetoothException(final String pMessage, final Throwable pThrowable) {
+		super(pMessage, pThrowable);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/exception/WifiException.java b/src/org/andengine/util/exception/WifiException.java
new file mode 100644
index 000000000..8a9b725b2
--- /dev/null
+++ b/src/org/andengine/util/exception/WifiException.java
@@ -0,0 +1,53 @@
+package org.andengine.util.exception;
+
+
+/**
+ * (c) 2010 Nicolas Gramlich
+ * (c) 2011 Zynga Inc.
+ *
+ * @author Nicolas Gramlich
+ * @since 16:58:37 - 20.03.2011
+ */
+public class WifiException extends AndEngineException {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final long serialVersionUID = -8647288255044498718L;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public WifiException() {
+
+	}
+
+	public WifiException(final String pMessage) {
+		super(pMessage);
+	}
+
+	public WifiException(final String pMessage, final Throwable pThrowable) {
+		super(pMessage, pThrowable);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}

From d4e8bdba630b555f13c73533681b004f0eb07a2b Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Mon, 18 Mar 2013 19:15:46 -0700
Subject: [PATCH 138/252] Fixed case of WifiUtils.java.

---
 src/org/andengine/util/{WiFiUtils.java => WifiUtils.java} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename src/org/andengine/util/{WiFiUtils.java => WifiUtils.java} (100%)

diff --git a/src/org/andengine/util/WiFiUtils.java b/src/org/andengine/util/WifiUtils.java
similarity index 100%
rename from src/org/andengine/util/WiFiUtils.java
rename to src/org/andengine/util/WifiUtils.java

From ca332450b443ad820b352fb4d469c7bb9846ebc5 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 22 Mar 2013 11:21:15 -0700
Subject: [PATCH 139/252] Fixed a few Exceptions not extending from
 AndEngineException.

---
 .../atlas/buildable/builder/ITextureAtlasBuilder.java        | 3 ++-
 src/org/andengine/util/WiFiUtils.java                        | 5 +++--
 src/org/andengine/util/system/SystemUtils.java               | 5 +++--
 3 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java b/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java
index aa1fd3091..6af984213 100644
--- a/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java
+++ b/src/org/andengine/opengl/texture/atlas/buildable/builder/ITextureAtlasBuilder.java
@@ -5,6 +5,7 @@
 import org.andengine.opengl.texture.atlas.ITextureAtlas;
 import org.andengine.opengl.texture.atlas.buildable.BuildableTextureAtlas.TextureAtlasSourceWithWithLocationCallback;
 import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource;
+import org.andengine.util.exception.AndEngineException;
 
 /**
  * (c) 2010 Nicolas Gramlich
@@ -28,7 +29,7 @@ public interface ITextureAtlasBuilder
Date: Fri, 22 Mar 2013 11:22:53 -0700
Subject: [PATCH 140/252] Minor changes.

---
 .../andengine/util/levelstats/LevelStatsDBConnector.java    | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
index 2e0df796a..f6108ed20 100644
--- a/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
+++ b/src/org/andengine/util/levelstats/LevelStatsDBConnector.java
@@ -33,7 +33,7 @@ public class LevelStatsDBConnector {
 	// Constants
 	// ===========================================================
 
-	private static final String PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_ID = "preferences.levelstatsdbconnector.playerid";
+	private static final String PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_KEY = "preferences.levelstatsdbconnector.playerid";
 
 	// ===========================================================
 	// Fields
@@ -52,12 +52,12 @@ public LevelStatsDBConnector(final Context pContext, final String pSecret, final
 		this.mSubmitURL = pSubmitURL;
 
 		final SharedPreferences simplePreferences = SimplePreferences.getInstance(pContext);
-		final int playerID = simplePreferences.getInt(PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_ID, -1);
+		final int playerID = simplePreferences.getInt(PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_KEY, -1);
 		if (playerID != -1) {
 			this.mPlayerID = playerID;
 		} else {
 			this.mPlayerID = MathUtils.random(1000000000, Integer.MAX_VALUE);
-			SimplePreferences.getEditorInstance(pContext).putInt(PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_ID, this.mPlayerID).commit();
+			SimplePreferences.getEditorInstance(pContext).putInt(PREFERENCES_LEVELSTATSDBCONNECTOR_PLAYERID_KEY, this.mPlayerID).commit();
 		}
 	}
 

From 6c9b0bf756e84556691b359448ad70c12e01f02a Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 22 Mar 2013 11:23:06 -0700
Subject: [PATCH 141/252] Added UUUIDManager.

---
 src/org/andengine/util/uuid/UUIDManager.java | 68 ++++++++++++++++++++
 1 file changed, 68 insertions(+)
 create mode 100644 src/org/andengine/util/uuid/UUIDManager.java

diff --git a/src/org/andengine/util/uuid/UUIDManager.java b/src/org/andengine/util/uuid/UUIDManager.java
new file mode 100644
index 000000000..b61e4a299
--- /dev/null
+++ b/src/org/andengine/util/uuid/UUIDManager.java
@@ -0,0 +1,68 @@
+package org.andengine.util.uuid;
+
+import java.util.UUID;
+
+import org.andengine.util.preferences.SimplePreferences;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ * 
+ * @author Nicolas Gramlich
+ * @since 01:15:12 - 22.03.2013
+ */
+public class UUIDManager {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final String PREFERENCES_UUIDMANAGER_UUID_KEY = "preferences.uuidmanager.uuid";
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public static synchronized UUID getUUID(final Context pContext) {
+		final SharedPreferences preferences = SimplePreferences.getInstance(pContext);
+		return UUIDManager.getUUID(preferences);
+	}
+
+	public static UUID getUUID(final SharedPreferences pSharedPreferences) {
+		final String uuidPreference = pSharedPreferences.getString(UUIDManager.PREFERENCES_UUIDMANAGER_UUID_KEY, null);
+
+		if (uuidPreference != null) {
+			return UUID.fromString(uuidPreference);
+		} else {
+			final UUID uuid = UUID.randomUUID();
+
+			final Editor editor = pSharedPreferences.edit();
+			editor.putString(UUIDManager.PREFERENCES_UUIDMANAGER_UUID_KEY, uuid.toString());
+			editor.commit();
+
+			return uuid;
+		}
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}

From 8c8659f4284cb6c9a804b93daaa395321ebe9ee3 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 22 Mar 2013 12:35:54 -0700
Subject: [PATCH 142/252] Added char based DataConstants.

---
 src/org/andengine/util/adt/DataConstants.java | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/org/andengine/util/adt/DataConstants.java b/src/org/andengine/util/adt/DataConstants.java
index 35d05b1fd..fdd8ece51 100644
--- a/src/org/andengine/util/adt/DataConstants.java
+++ b/src/org/andengine/util/adt/DataConstants.java
@@ -14,6 +14,7 @@ public interface DataConstants {
 
 	public static final int BYTES_PER_BYTE = 1;
 	public static final int BYTES_PER_SHORT = Short.SIZE / Byte.SIZE;
+	public static final int BYTES_PER_CHAR = Short.SIZE / Character.SIZE;
 	public static final int BYTES_PER_INT = Integer.SIZE / Byte.SIZE;
 	public static final int BYTES_PER_LONG = Long.SIZE / Byte.SIZE;
 	public static final int BYTES_PER_FLOAT = Float.SIZE / Byte.SIZE;
@@ -33,6 +34,7 @@ public interface DataConstants {
 
 	public static final int BITS_PER_BYTE = 8;
 	public static final int BITS_PER_SHORT = BYTES_PER_SHORT * BITS_PER_BYTE;
+	public static final int BITS_PER_CHAR = BYTES_PER_CHAR * BITS_PER_BYTE;
 	public static final int BITS_PER_INT = BYTES_PER_INT * BITS_PER_BYTE;
 	public static final int BITS_PER_LONG = BYTES_PER_LONG * BITS_PER_BYTE;
 	public static final int BITS_PER_FLOAT = BYTES_PER_FLOAT * BITS_PER_BYTE;

From 6d9c195e327e550947c4fbd6699f33d44f1cfb89 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 22 Mar 2013 12:36:06 -0700
Subject: [PATCH 143/252] Fixed a few chackstyle complaints.

---
 src/org/andengine/util/adt/DataConstants.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/org/andengine/util/adt/DataConstants.java b/src/org/andengine/util/adt/DataConstants.java
index fdd8ece51..ec6ecb9c7 100644
--- a/src/org/andengine/util/adt/DataConstants.java
+++ b/src/org/andengine/util/adt/DataConstants.java
@@ -28,9 +28,9 @@ public interface DataConstants {
 	public static final int BYTE_TO_MEGABYTE_SHIFT = 20;
 	public static final int BYTE_TO_GIGABYTE_SHIFT = 30;
 
-	public static final short UNSIGNED_BYTE_MAX_VALUE = (short)Byte.MAX_VALUE - (short)Byte.MIN_VALUE;
-	public static final int UNSIGNED_SHORT_MAX_VALUE = (int)Short.MAX_VALUE - (int)Short.MIN_VALUE;
-	public static final long UNSIGNED_INT_MAX_VALUE = (long)Integer.MAX_VALUE - (long)Integer.MIN_VALUE;
+	public static final short UNSIGNED_BYTE_MAX_VALUE = (short) Byte.MAX_VALUE - (short) Byte.MIN_VALUE;
+	public static final int UNSIGNED_SHORT_MAX_VALUE = (int) Short.MAX_VALUE - (int) Short.MIN_VALUE;
+	public static final long UNSIGNED_INT_MAX_VALUE = (long) Integer.MAX_VALUE - (long) Integer.MIN_VALUE;
 
 	public static final int BITS_PER_BYTE = 8;
 	public static final int BITS_PER_SHORT = BYTES_PER_SHORT * BITS_PER_BYTE;

From d28ff28d9df9e400c7317e296965265681b43e51 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 22 Mar 2013 12:53:06 -0700
Subject: [PATCH 144/252] Moved DataConstants to proper package.

---
 src/org/andengine/entity/text/Text.java                         | 2 +-
 src/org/andengine/opengl/texture/Texture.java                   | 2 +-
 src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java | 2 +-
 src/org/andengine/opengl/vbo/VertexBufferObject.java            | 2 +-
 src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java  | 2 +-
 .../vbo/attribute/VertexBufferObjectAttributesBuilder.java      | 2 +-
 src/org/andengine/util/adt/bit/ByteBackedBitVector.java         | 2 +-
 src/org/andengine/util/adt/bit/LongBackedBitVector.java         | 2 +-
 .../andengine/util/adt/{ => data/constants}/DataConstants.java  | 2 +-
 src/org/andengine/util/system/SystemUtils.java                  | 2 +-
 src/org/andengine/util/texturepack/TexturePackParser.java       | 2 +-
 11 files changed, 11 insertions(+), 11 deletions(-)
 rename src/org/andengine/util/adt/{ => data/constants}/DataConstants.java (97%)

diff --git a/src/org/andengine/entity/text/Text.java b/src/org/andengine/entity/text/Text.java
index 877275760..a9d2349e3 100644
--- a/src/org/andengine/entity/text/Text.java
+++ b/src/org/andengine/entity/text/Text.java
@@ -17,8 +17,8 @@
 import org.andengine.opengl.vbo.VertexBufferObjectManager;
 import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes;
 import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder;
-import org.andengine.util.adt.DataConstants;
 import org.andengine.util.adt.align.HorizontalAlign;
+import org.andengine.util.adt.data.constants.DataConstants;
 import org.andengine.util.adt.list.FloatArrayList;
 import org.andengine.util.adt.list.IFloatList;
 
diff --git a/src/org/andengine/opengl/texture/Texture.java b/src/org/andengine/opengl/texture/Texture.java
index 5adfa6979..24f349f68 100644
--- a/src/org/andengine/opengl/texture/Texture.java
+++ b/src/org/andengine/opengl/texture/Texture.java
@@ -4,7 +4,7 @@
 
 import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource;
 import org.andengine.opengl.util.GLState;
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 
 /**
  * (c) 2010 Nicolas Gramlich
diff --git a/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java b/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java
index 1b597858a..851f708de 100644
--- a/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java
+++ b/src/org/andengine/opengl/texture/compressed/pvr/PVRTexture.java
@@ -16,8 +16,8 @@
 import org.andengine.opengl.texture.compressed.pvr.pixelbufferstrategy.IPVRTexturePixelBufferStrategy.IPVRTexturePixelBufferStrategyBufferManager;
 import org.andengine.opengl.util.GLState;
 import org.andengine.util.StreamUtils;
-import org.andengine.util.adt.DataConstants;
 import org.andengine.util.adt.array.ArrayUtils;
+import org.andengine.util.adt.data.constants.DataConstants;
 import org.andengine.util.adt.io.out.ByteBufferOutputStream;
 import org.andengine.util.debug.Debug;
 import org.andengine.util.math.MathUtils;
diff --git a/src/org/andengine/opengl/vbo/VertexBufferObject.java b/src/org/andengine/opengl/vbo/VertexBufferObject.java
index 019bc364f..8309240f3 100644
--- a/src/org/andengine/opengl/vbo/VertexBufferObject.java
+++ b/src/org/andengine/opengl/vbo/VertexBufferObject.java
@@ -7,7 +7,7 @@
 import org.andengine.opengl.util.BufferUtils;
 import org.andengine.opengl.util.GLState;
 import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes;
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 
 import android.opengl.GLES20;
 
diff --git a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java
index ac910c294..57e7e5c3b 100644
--- a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java
+++ b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java
@@ -7,7 +7,7 @@
 import org.andengine.opengl.util.BufferUtils;
 import org.andengine.opengl.util.GLState;
 import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes;
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 
 import android.opengl.GLES20;
 
diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java
index d42f17508..dc7fdfdc0 100644
--- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java
+++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java
@@ -1,6 +1,6 @@
 package org.andengine.opengl.vbo.attribute;
 
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 import org.andengine.util.exception.AndEngineRuntimeException;
 import org.andengine.util.system.SystemUtils;
 
diff --git a/src/org/andengine/util/adt/bit/ByteBackedBitVector.java b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
index fc629c8ab..ece8deaf3 100644
--- a/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
+++ b/src/org/andengine/util/adt/bit/ByteBackedBitVector.java
@@ -5,7 +5,7 @@
 import java.io.IOException;
 import java.util.Arrays;
 
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 import org.andengine.util.exception.MethodNotYetImplementedException;
 
 
diff --git a/src/org/andengine/util/adt/bit/LongBackedBitVector.java b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
index 856b4f3c7..a677fe2d9 100644
--- a/src/org/andengine/util/adt/bit/LongBackedBitVector.java
+++ b/src/org/andengine/util/adt/bit/LongBackedBitVector.java
@@ -5,7 +5,7 @@
 import java.io.IOException;
 import java.util.Arrays;
 
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 import org.andengine.util.exception.MethodNotYetImplementedException;
 
 
diff --git a/src/org/andengine/util/adt/DataConstants.java b/src/org/andengine/util/adt/data/constants/DataConstants.java
similarity index 97%
rename from src/org/andengine/util/adt/DataConstants.java
rename to src/org/andengine/util/adt/data/constants/DataConstants.java
index ec6ecb9c7..cc44b2b12 100644
--- a/src/org/andengine/util/adt/DataConstants.java
+++ b/src/org/andengine/util/adt/data/constants/DataConstants.java
@@ -1,4 +1,4 @@
-package org.andengine.util.adt;
+package org.andengine.util.adt.data.constants;
 
 /**
  * (c) 2010 Nicolas Gramlich
diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java
index e0e621820..a8bb22f24 100644
--- a/src/org/andengine/util/system/SystemUtils.java
+++ b/src/org/andengine/util/system/SystemUtils.java
@@ -7,7 +7,7 @@
 import java.util.regex.MatchResult;
 
 import org.andengine.util.StreamUtils;
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 import org.andengine.util.exception.AndEngineException;
 import org.andengine.util.exception.MethodNotFoundException;
 
diff --git a/src/org/andengine/util/texturepack/TexturePackParser.java b/src/org/andengine/util/texturepack/TexturePackParser.java
index b4786fbd2..c544165e0 100644
--- a/src/org/andengine/util/texturepack/TexturePackParser.java
+++ b/src/org/andengine/util/texturepack/TexturePackParser.java
@@ -18,7 +18,7 @@
 import org.andengine.opengl.texture.compressed.pvr.PVRTexture.PVRTextureFormat;
 import org.andengine.opengl.texture.compressed.pvr.pixelbufferstrategy.SmartPVRTexturePixelBufferStrategy;
 import org.andengine.util.SAXUtils;
-import org.andengine.util.adt.DataConstants;
+import org.andengine.util.adt.data.constants.DataConstants;
 import org.andengine.util.adt.io.in.IInputStreamOpener;
 import org.andengine.util.texturepack.exception.TexturePackParseException;
 import org.xml.sax.Attributes;

From 1cfb825ea4ac3d1ca6a9a80f9a8b90ac18ff1d6f Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 22 Mar 2013 12:55:50 -0700
Subject: [PATCH 145/252] Fixed a few checkstyle complaints.

---
 .../opengl/vbo/ZeroMemoryVertexBufferObject.java       |  6 +++---
 src/org/andengine/util/system/SystemUtils.java         | 10 +++++++---
 .../andengine/util/texturepack/TexturePackParser.java  |  2 +-
 3 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java
index 57e7e5c3b..ce6f45751 100644
--- a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java
+++ b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java
@@ -139,7 +139,7 @@ public int getGPUMemoryByteSize() {
 	// Methods for/from SuperClass/Interfaces
 	// ===========================================================
 
-	protected abstract void onPopulateBufferData(final ByteBuffer byteBuffer);
+	protected abstract void onPopulateBufferData(final ByteBuffer pByteBuffer);
 
 	@Override
 	public void bind(final GLState pGLState) {
@@ -238,8 +238,8 @@ protected ByteBuffer aquireByteBuffer() {
 		return byteBuffer;
 	}
 
-	protected void releaseByteBuffer(final ByteBuffer byteBuffer) {
-		BufferUtils.freeDirectByteBuffer(byteBuffer);
+	protected void releaseByteBuffer(final ByteBuffer pByteBuffer) {
+		BufferUtils.freeDirectByteBuffer(pByteBuffer);
 	}
 
 	// ===========================================================
diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java
index a8bb22f24..5019f2875 100644
--- a/src/org/andengine/util/system/SystemUtils.java
+++ b/src/org/andengine/util/system/SystemUtils.java
@@ -26,7 +26,7 @@
  * @author Nicolas Gramlich
  * @since 15:50:31 - 14.07.2010
  */
-public class SystemUtils {
+public final class SystemUtils {
 	// ===========================================================
 	// Constants
 	// ===========================================================
@@ -51,6 +51,10 @@ public class SystemUtils {
 	// Constructors
 	// ===========================================================
 
+	private SystemUtils() {
+
+	}
+
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
@@ -257,7 +261,7 @@ public static long getCPUFrequencyMaxScaling() throws SystemUtilsException {
 	private static MatchResult matchSystemFile(final String pSystemFile, final String pPattern, final int pHorizon) throws SystemUtilsException {
 		InputStream in = null;
 		try {
-			final Process process = new ProcessBuilder(new String[] { "/system/bin/cat", pSystemFile }).start();
+			final Process process = new ProcessBuilder(new String[] {"/system/bin/cat", pSystemFile}).start();
 
 			in = process.getInputStream();
 			final Scanner scanner = new Scanner(in);
@@ -278,7 +282,7 @@ private static MatchResult matchSystemFile(final String pSystemFile, final Strin
 	private static long readSystemFileAsLong(final String pSystemFile) throws SystemUtilsException {
 		InputStream in = null;
 		try {
-			final Process process = new ProcessBuilder(new String[] { "/system/bin/cat", pSystemFile }).start();
+			final Process process = new ProcessBuilder(new String[] {"/system/bin/cat", pSystemFile}).start();
 
 			in = process.getInputStream();
 			final String content = StreamUtils.readFully(in);
diff --git a/src/org/andengine/util/texturepack/TexturePackParser.java b/src/org/andengine/util/texturepack/TexturePackParser.java
index c544165e0..3dd8f06cc 100644
--- a/src/org/andengine/util/texturepack/TexturePackParser.java
+++ b/src/org/andengine/util/texturepack/TexturePackParser.java
@@ -212,7 +212,7 @@ protected InputStream onGetInputStream() throws IOException {
 			} catch (final IOException e) {
 				throw new TexturePackParseException(e);
 			}
-		} else if (type	.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_ETC1)) {
+		} else if (type.equals(TexturePackParser.TAG_TEXTURE_ATTRIBUTE_TYPE_VALUE_ETC1)) {
 			try {
 				return new ETC1Texture(this.mTextureManager, textureOptions) {
 					@Override

From 7b1a1e9c6fa67f35de360c3b5f31ecfbdcf217ef Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 22 Mar 2013 14:00:27 -0700
Subject: [PATCH 146/252] Fixed DataConstants.

---
 src/org/andengine/util/adt/data/constants/DataConstants.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/org/andengine/util/adt/data/constants/DataConstants.java b/src/org/andengine/util/adt/data/constants/DataConstants.java
index cc44b2b12..69f8e5c1a 100644
--- a/src/org/andengine/util/adt/data/constants/DataConstants.java
+++ b/src/org/andengine/util/adt/data/constants/DataConstants.java
@@ -14,7 +14,7 @@ public interface DataConstants {
 
 	public static final int BYTES_PER_BYTE = 1;
 	public static final int BYTES_PER_SHORT = Short.SIZE / Byte.SIZE;
-	public static final int BYTES_PER_CHAR = Short.SIZE / Character.SIZE;
+	public static final int BYTES_PER_CHAR = Character.SIZE / Byte.SIZE;
 	public static final int BYTES_PER_INT = Integer.SIZE / Byte.SIZE;
 	public static final int BYTES_PER_LONG = Long.SIZE / Byte.SIZE;
 	public static final int BYTES_PER_FLOAT = Float.SIZE / Byte.SIZE;

From d0f331ed3069afe10a5583d4f8cdd27ee8e66597 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 23 Mar 2013 00:43:34 -0700
Subject: [PATCH 147/252] Added HashUtils.

---
 src/org/andengine/util/HashUtils.java | 54 +++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 src/org/andengine/util/HashUtils.java

diff --git a/src/org/andengine/util/HashUtils.java b/src/org/andengine/util/HashUtils.java
new file mode 100644
index 000000000..66dccb11c
--- /dev/null
+++ b/src/org/andengine/util/HashUtils.java
@@ -0,0 +1,54 @@
+package org.andengine.util;
+
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ *
+ * @author Nicolas Gramlich
+ * @since 00:02:12 - 23.03.2013
+ */
+public final class HashUtils {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	private HashUtils() {
+
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public static int getHashCode(final Object ... pObjects) {
+		final int prime = 31;
+		int result = 1;
+
+		for (int i = 0; i < pObjects.length; i++) {
+			final Object string = pObjects[i];
+			result = prime * result + ((string == null) ? 0 : string.hashCode());
+		}
+
+		return result;
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}

From 4f88ee73fe9ca5ac5f0709d7cff5561a5b54bd7f Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 23 Mar 2013 00:44:02 -0700
Subject: [PATCH 148/252] Added Experiment and ExperimentManager classes.

---
 .../andengine/util/experiment/Experiment.java |  59 ++++
 .../util/experiment/ExperimentFactory.java    |  85 ++++++
 .../util/experiment/ExperimentManager.java    | 264 ++++++++++++++++++
 .../util/experiment/IExperimentFactory.java   |  26 ++
 .../ExperimentNotFoundException.java          |  57 ++++
 .../exception/ExperimentTypeException.java    |  57 ++++
 6 files changed, 548 insertions(+)
 create mode 100644 src/org/andengine/util/experiment/Experiment.java
 create mode 100644 src/org/andengine/util/experiment/ExperimentFactory.java
 create mode 100644 src/org/andengine/util/experiment/ExperimentManager.java
 create mode 100644 src/org/andengine/util/experiment/IExperimentFactory.java
 create mode 100644 src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
 create mode 100644 src/org/andengine/util/experiment/exception/ExperimentTypeException.java

diff --git a/src/org/andengine/util/experiment/Experiment.java b/src/org/andengine/util/experiment/Experiment.java
new file mode 100644
index 000000000..a81470654
--- /dev/null
+++ b/src/org/andengine/util/experiment/Experiment.java
@@ -0,0 +1,59 @@
+package org.andengine.util.experiment;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ *
+ * @author Nicolas Gramlich
+ * @since 01:22:34 - 22.03.2013
+ */
+public class Experiment {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	private final String mName;
+	private final Class mType;
+	private final T mValue;
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public Experiment(final String pName, final Class pType, final T pValue) {
+		this.mName = pName;
+		this.mType = pType;
+		this.mValue = pValue;
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	public String getName() {
+		return this.mName;
+	}
+
+	public Class getType() {
+		return this.mType;
+	}
+
+	public T getValue() {
+		return this.mValue;
+	}
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/experiment/ExperimentFactory.java b/src/org/andengine/util/experiment/ExperimentFactory.java
new file mode 100644
index 000000000..02e4a15e6
--- /dev/null
+++ b/src/org/andengine/util/experiment/ExperimentFactory.java
@@ -0,0 +1,85 @@
+package org.andengine.util.experiment;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ * 
+ * @author Nicolas Gramlich
+ * @since 08:22:34 - 22.03.2013
+ */
+public class ExperimentFactory implements IExperimentFactory {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	@Override
+	public Experiment parseExperiment(final JSONObject pExperimentJSONObject) throws JSONException {
+		final String name = pExperimentJSONObject.getString("name");
+		final String type = pExperimentJSONObject.getString("type");
+
+		if (type.equals(Boolean.class.getSimpleName())) {
+			final boolean value = pExperimentJSONObject.getBoolean("value");
+			return new Experiment(name, Boolean.class, value);
+		} else if (type.equals(Byte.class.getSimpleName())) {
+			final byte value = (byte) pExperimentJSONObject.getInt("value");
+			return new Experiment(name, Byte.class, value);
+		} else if (type.equals(Character.class.getSimpleName())) {
+			final char value = (char) pExperimentJSONObject.getInt("value");
+			return new Experiment(name, Character.class, value);
+		} else if (type.equals(Short.class.getSimpleName())) {
+			final short value = (short) pExperimentJSONObject.getInt("value");
+			return new Experiment(name, Short.class, value);
+		} else if (type.equals(Integer.class.getSimpleName())) {
+			final int value = pExperimentJSONObject.getInt("value");
+			return new Experiment(name, Integer.class, value);
+		} else if (type.equals(Long.class.getSimpleName())) {
+			final long value = pExperimentJSONObject.getLong("value");
+			return new Experiment(name, Long.class, value);
+		} else if (type.equals(Float.class.getSimpleName())) {
+			final float value = (float) pExperimentJSONObject.getDouble("value");
+			return new Experiment(name, Float.class, value);
+		} else if (type.equals(Double.class.getSimpleName())) {
+			final double value = pExperimentJSONObject.getDouble("value");
+			return new Experiment(name, Double.class, value);
+		} else if (type.equals(String.class.getSimpleName())) {
+			final String value = pExperimentJSONObject.getString("value");
+			return new Experiment(name, String.class, value);
+		} else if (type.equals(JSONObject.class.getSimpleName())) {
+			final JSONObject value = pExperimentJSONObject.getJSONObject("value");
+			return new Experiment(name, JSONObject.class, value);
+		} else if (type.equals(JSONArray.class.getSimpleName())) {
+			final JSONArray value = pExperimentJSONObject.getJSONArray("value");
+			return new Experiment(name, JSONArray.class, value);
+		} else {
+			final Object value = pExperimentJSONObject.get("value");
+			return new Experiment(name, Object.class, value);
+		}
+	}
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/experiment/ExperimentManager.java b/src/org/andengine/util/experiment/ExperimentManager.java
new file mode 100644
index 000000000..d0c134c75
--- /dev/null
+++ b/src/org/andengine/util/experiment/ExperimentManager.java
@@ -0,0 +1,264 @@
+package org.andengine.util.experiment;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.andengine.util.StreamUtils;
+import org.andengine.util.call.Callback;
+import org.andengine.util.debug.Debug;
+import org.andengine.util.experiment.exception.ExperimentNotFoundException;
+import org.andengine.util.experiment.exception.ExperimentTypeException;
+import org.andengine.util.system.SystemUtils;
+import org.andengine.util.system.SystemUtils.SystemUtilsException;
+import org.andengine.util.uuid.UUIDManager;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.message.BasicNameValuePair;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.content.Context;
+import android.os.AsyncTask;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ * 
+ * @author Nicolas Gramlich
+ * @since 00:25:13 - 22.03.2013
+ */
+public class ExperimentManager {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	private final Context mContext;
+	private final String mServerURL;
+	private final IExperimentFactory mExperimentFactory;
+
+	private final String mPackageName;
+	private final int mPackageVersionCode;
+	private final UUID mUUID;
+
+	private Map> mExperiments;
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public ExperimentManager(final Context pContext, final String pServerURL) throws SystemUtilsException {
+		this(pContext, pServerURL, new ExperimentFactory());
+	}
+
+	public ExperimentManager(final Context pContext, final String pServerURL, final IExperimentFactory pExperimentFactory) throws SystemUtilsException {
+		this.mContext = pContext;
+		this.mServerURL = pServerURL;
+		this.mExperimentFactory = pExperimentFactory;
+
+		this.mPackageName = SystemUtils.getPackageName(pContext);
+		this.mPackageVersionCode = SystemUtils.getPackageVersionCode(pContext);
+
+		this.mUUID = UUIDManager.getUUID(pContext);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	public Experiment getExperiment(final String pExperimentName) throws ExperimentNotFoundException {
+		final Experiment experiment = this.mExperiments.get(pExperimentName);
+		if (experiment != null) {
+			return experiment;
+		} else {
+			throw new ExperimentNotFoundException("Unexpected experiment: '" + pExperimentName + "'.");
+		}
+	}
+
+	public  T getExperimentValue(final String pExperimentName, final Class pExperimentType) throws ExperimentTypeException, ExperimentNotFoundException {
+		final Experiment experiment = this.getExperiment(pExperimentName);
+		final Object value = experiment.getValue();
+
+		final Class type = experiment.getType();
+		if (type == pExperimentType) {
+			return pExperimentType.cast(value);
+		} else {
+			throw new ExperimentTypeException("Unexpected type for experiment: '" + pExperimentName + "'. Requested: '" + pExperimentType.getSimpleName() + "' Actual: '" + type.getSimpleName() + "'.");
+		}
+	}
+
+	public boolean getExperimentBooleanValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Boolean.class);
+	}
+
+	public byte getExperimentByteValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Byte.class);
+	}
+
+	public short getExperimentShortValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Short.class);
+	}
+
+	public char getExperimentCharacterValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Character.class);
+	}
+
+	public int getExperimentIntegerValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Integer.class);
+	}
+
+	public long getExperimentLongValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Long.class);
+	}
+
+	public float getExperimentFloatValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Float.class);
+	}
+
+	public double getExperimentDoubleValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Double.class);
+	}
+
+	public String getExperimentStringValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, String.class);
+	}
+
+	public JSONObject getExperimentJSONObjectValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, JSONObject.class);
+	}
+
+	public JSONArray getExperimentJSONArrayValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, JSONArray.class);
+	}
+
+	@Deprecated
+	public Object getExperimentValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
+		return this.getExperimentValue(pExperimentName, Object.class);
+	}
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public boolean fetchExperiments() throws IOException, URISyntaxException {
+		final HttpClient httpClient = new DefaultHttpClient();
+
+		final List params = new ArrayList();
+		params.add(new BasicNameValuePair("appid", this.mPackageName));
+		params.add(new BasicNameValuePair("version", String.valueOf(this.mPackageVersionCode)));
+		params.add(new BasicNameValuePair("uuid", this.mUUID.toString()));
+
+		final URI uri = new URI(this.mServerURL + "?" + URLEncodedUtils.format(params, "utf-8"));
+		final HttpGet httpGet = new HttpGet(uri);
+
+		final HttpResponse response = httpClient.execute(httpGet);
+
+		final int statusCode = response.getStatusLine().getStatusCode();
+		if ((statusCode < HttpStatus.SC_OK) || (statusCode > HttpStatus.SC_MULTIPLE_CHOICES)) {
+			return false;
+		} else {
+			final String serverResponse = StreamUtils.readFully(response.getEntity().getContent());
+
+			try {
+				this.mExperiments = this.parseExperiments(serverResponse);
+				return true;
+			} catch (final JSONException e) {
+				Debug.e(e);
+				return false;
+			}
+		}
+	}
+
+	public void fetchExperimentsAsync(final Callback pCallback) {
+		final FetchExperimentsAsyncTask fetchExperimentsAsyncTask = new FetchExperimentsAsyncTask(pCallback);
+		fetchExperimentsAsyncTask.execute((Void[]) null);
+	}
+
+	private Map> parseExperiments(final String pServerResponse) throws JSONException {
+		final Map> experiments = new HashMap>();
+		final JSONArray experimentsJSONArray = new JSONArray(pServerResponse);
+
+		for (int i = 0; i < experimentsJSONArray.length(); i++) {
+			final JSONObject experimentJSONObject = experimentsJSONArray.getJSONObject(i);
+
+			final Experiment experiment = this.mExperimentFactory.parseExperiment(experimentJSONObject);
+
+			experiments.put(experiment.getName(), experiment);
+		}
+
+		return experiments;
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+
+	public class FetchExperimentsAsyncTask extends AsyncTask {
+		// ===========================================================
+		// Constants
+		// ===========================================================
+
+		// ===========================================================
+		// Fields
+		// ===========================================================
+
+		private final Callback mCallback;
+
+		// ===========================================================
+		// Constructors
+		// ===========================================================
+
+		public FetchExperimentsAsyncTask(final Callback pCallback) {
+			this.mCallback = pCallback;
+		}
+
+		// ===========================================================
+		// Getter & Setter
+		// ===========================================================
+
+		// ===========================================================
+		// Methods for/from SuperClass/Interfaces
+		// ===========================================================
+
+		@Override
+		protected Boolean doInBackground(final Void ... pParams) {
+			try {
+				return ExperimentManager.this.fetchExperiments();
+			} catch (final Throwable t) {
+				Debug.e(t);
+				return false;
+			}
+		}
+
+		@Override
+		protected void onPostExecute(final Boolean pResult) {
+			this.mCallback.onCallback(pResult);
+		}
+
+		// ===========================================================
+		// Methods
+		// ===========================================================
+
+		// ===========================================================
+		// Inner and Anonymous Classes
+		// ===========================================================
+	}
+}
diff --git a/src/org/andengine/util/experiment/IExperimentFactory.java b/src/org/andengine/util/experiment/IExperimentFactory.java
new file mode 100644
index 000000000..b4fbf3e84
--- /dev/null
+++ b/src/org/andengine/util/experiment/IExperimentFactory.java
@@ -0,0 +1,26 @@
+package org.andengine.util.experiment;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ *
+ * @author Nicolas Gramlich
+ * @since 08:22:34 - 22.03.2013
+ */
+public interface IExperimentFactory {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public Experiment parseExperiment(final JSONObject pExperimentJSONObject) throws JSONException;
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java b/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
new file mode 100644
index 000000000..faf2f5876
--- /dev/null
+++ b/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
@@ -0,0 +1,57 @@
+package org.andengine.util.experiment.exception;
+
+import org.andengine.util.exception.AndEngineException;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ * 
+ * @author Nicolas Gramlich
+ * @since 08:25:34 - 22.03.2013
+ */
+public class ExperimentNotFoundException extends AndEngineException {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final long serialVersionUID = 8872925957672647007L;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public ExperimentNotFoundException() {
+		super();
+	}
+
+	public ExperimentNotFoundException(final String pMessage) {
+		super(pMessage);
+	}
+
+	public ExperimentNotFoundException(final Throwable pThrowable) {
+		super(pThrowable);
+	}
+
+	public ExperimentNotFoundException(final String pMessage, final Throwable pThrowable) {
+		super(pMessage, pThrowable);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/experiment/exception/ExperimentTypeException.java b/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
new file mode 100644
index 000000000..fd50ef363
--- /dev/null
+++ b/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
@@ -0,0 +1,57 @@
+package org.andengine.util.experiment.exception;
+
+import org.andengine.util.exception.AndEngineException;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ * 
+ * @author Nicolas Gramlich
+ * @since 08:25:34 - 22.03.2013
+ */
+public class ExperimentTypeException extends AndEngineException {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final long serialVersionUID = 8937289172679121788L;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public ExperimentTypeException() {
+		super();
+	}
+
+	public ExperimentTypeException(final String pMessage) {
+		super(pMessage);
+	}
+
+	public ExperimentTypeException(final Throwable pThrowable) {
+		super(pThrowable);
+	}
+
+	public ExperimentTypeException(final String pMessage, final Throwable pThrowable) {
+		super(pMessage, pThrowable);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}

From 2b1e8620e21f84e223671648522699dcd00dc8b2 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 23 Mar 2013 00:52:39 -0700
Subject: [PATCH 149/252] Added methods to ExperimentManager returning default
 values over throwing Exceptions.

---
 .../util/experiment/ExperimentManager.java    | 98 +++++++++++++++++++
 .../exception/ExperimentException.java        | 57 +++++++++++
 .../ExperimentNotFoundException.java          |  3 +-
 .../exception/ExperimentTypeException.java    |  3 +-
 4 files changed, 157 insertions(+), 4 deletions(-)
 create mode 100644 src/org/andengine/util/experiment/exception/ExperimentException.java

diff --git a/src/org/andengine/util/experiment/ExperimentManager.java b/src/org/andengine/util/experiment/ExperimentManager.java
index d0c134c75..49aca3448 100644
--- a/src/org/andengine/util/experiment/ExperimentManager.java
+++ b/src/org/andengine/util/experiment/ExperimentManager.java
@@ -12,6 +12,7 @@
 import org.andengine.util.StreamUtils;
 import org.andengine.util.call.Callback;
 import org.andengine.util.debug.Debug;
+import org.andengine.util.experiment.exception.ExperimentException;
 import org.andengine.util.experiment.exception.ExperimentNotFoundException;
 import org.andengine.util.experiment.exception.ExperimentTypeException;
 import org.andengine.util.system.SystemUtils;
@@ -105,51 +106,148 @@ public boolean getExperimentBooleanValue(final String pExperimentName) throws Ex
 		return this.getExperimentValue(pExperimentName, Boolean.class);
 	}
 
+	public boolean getExperimentBooleanValue(final String pExperimentName, final boolean pDefaultValue) {
+		try {
+			return this.getExperimentBooleanValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public byte getExperimentByteValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Byte.class);
 	}
 
+	public byte getExperimentByteValue(final String pExperimentName, final byte pDefaultValue) {
+		try {
+			return this.getExperimentByteValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public short getExperimentShortValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Short.class);
 	}
 
+	public short getExperimentShortValue(final String pExperimentName, final short pDefaultValue) {
+		try {
+			return this.getExperimentShortValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public char getExperimentCharacterValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Character.class);
 	}
 
+	public char getExperimentCharacterValue(final String pExperimentName, final char pDefaultValue) {
+		try {
+			return this.getExperimentCharacterValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public int getExperimentIntegerValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Integer.class);
 	}
 
+	public int getExperimentIntegerValue(final String pExperimentName, final int pDefaultValue) {
+		try {
+			return this.getExperimentIntegerValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public long getExperimentLongValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Long.class);
 	}
 
+	public long getExperimentLongValue(final String pExperimentName, final long pDefaultValue) {
+		try {
+			return this.getExperimentLongValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public float getExperimentFloatValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Float.class);
 	}
 
+	public float getExperimentFloatValue(final String pExperimentName, final float pDefaultValue) {
+		try {
+			return this.getExperimentFloatValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public double getExperimentDoubleValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Double.class);
 	}
 
+	public double getExperimentDoubleValue(final String pExperimentName, final double pDefaultValue) {
+		try {
+			return this.getExperimentDoubleValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public String getExperimentStringValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, String.class);
 	}
 
+	public String getExperimentStringValue(final String pExperimentName, final String pDefaultValue) {
+		try {
+			return this.getExperimentStringValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public JSONObject getExperimentJSONObjectValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, JSONObject.class);
 	}
 
+	public JSONObject getExperimentJSONObjectValue(final String pExperimentName, final JSONObject pDefaultValue) {
+		try {
+			return this.getExperimentJSONObjectValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	public JSONArray getExperimentJSONArrayValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, JSONArray.class);
 	}
 
+	public JSONArray getExperimentJSONArrayValue(final String pExperimentName, final JSONArray pDefaultValue) {
+		try {
+			return this.getExperimentJSONArrayValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	@Deprecated
 	public Object getExperimentValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException {
 		return this.getExperimentValue(pExperimentName, Object.class);
 	}
 
+	@Deprecated
+	public Object getExperimentValue(final String pExperimentName, final Object pDefaultValue) {
+		try {
+			return this.getExperimentValue(pExperimentName);
+		} catch (final ExperimentException e) {
+			return pDefaultValue;
+		}
+	}
+
 	// ===========================================================
 	// Methods for/from SuperClass/Interfaces
 	// ===========================================================
diff --git a/src/org/andengine/util/experiment/exception/ExperimentException.java b/src/org/andengine/util/experiment/exception/ExperimentException.java
new file mode 100644
index 000000000..7ca3e03be
--- /dev/null
+++ b/src/org/andengine/util/experiment/exception/ExperimentException.java
@@ -0,0 +1,57 @@
+package org.andengine.util.experiment.exception;
+
+import org.andengine.util.exception.AndEngineException;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ * 
+ * @author Nicolas Gramlich
+ * @since 00:45:14 - 23.03.2013
+ */
+public class ExperimentException extends AndEngineException {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final long serialVersionUID = 8028018956559796977L;
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	public ExperimentException() {
+		super();
+	}
+
+	public ExperimentException(final String pMessage) {
+		super(pMessage);
+	}
+
+	public ExperimentException(final Throwable pThrowable) {
+		super(pThrowable);
+	}
+
+	public ExperimentException(final String pMessage, final Throwable pThrowable) {
+		super(pMessage, pThrowable);
+	}
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}
diff --git a/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java b/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
index faf2f5876..24db70bc4 100644
--- a/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
+++ b/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
@@ -1,6 +1,5 @@
 package org.andengine.util.experiment.exception;
 
-import org.andengine.util.exception.AndEngineException;
 
 /**
  * (c) 2013 Nicolas Gramlich
@@ -8,7 +7,7 @@
  * @author Nicolas Gramlich
  * @since 08:25:34 - 22.03.2013
  */
-public class ExperimentNotFoundException extends AndEngineException {
+public class ExperimentNotFoundException extends ExperimentException {
 	// ===========================================================
 	// Constants
 	// ===========================================================
diff --git a/src/org/andengine/util/experiment/exception/ExperimentTypeException.java b/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
index fd50ef363..85fbef378 100644
--- a/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
+++ b/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
@@ -1,6 +1,5 @@
 package org.andengine.util.experiment.exception;
 
-import org.andengine.util.exception.AndEngineException;
 
 /**
  * (c) 2013 Nicolas Gramlich
@@ -8,7 +7,7 @@
  * @author Nicolas Gramlich
  * @since 08:25:34 - 22.03.2013
  */
-public class ExperimentTypeException extends AndEngineException {
+public class ExperimentTypeException extends ExperimentException {
 	// ===========================================================
 	// Constants
 	// ===========================================================

From f5add16fc14e8004280a39d92de9e462a27abab4 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 7 Apr 2013 18:07:17 -0700
Subject: [PATCH 150/252] Added SharedPreferencesCompat.

---
 .../preferences/SharedPreferencesCompat.java  | 70 +++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100644 src/org/andengine/util/preferences/SharedPreferencesCompat.java

diff --git a/src/org/andengine/util/preferences/SharedPreferencesCompat.java b/src/org/andengine/util/preferences/SharedPreferencesCompat.java
new file mode 100644
index 000000000..bb387f134
--- /dev/null
+++ b/src/org/andengine/util/preferences/SharedPreferencesCompat.java
@@ -0,0 +1,70 @@
+package org.andengine.util.preferences;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import android.content.SharedPreferences.Editor;
+
+/**
+ * (c) 2013 Nicolas Gramlich
+ *
+ * @author Nicolas Gramlich
+ * @since 20:41:56 - 07.04.2013
+ */
+public class SharedPreferencesCompat {
+	// ===========================================================
+	// Constants
+	// ===========================================================
+
+	private static final Method WORKAROUND_APPLY_METHOD;
+
+	static {
+		Method applyMethod;
+		try {
+			final Class cls = Editor.class;
+			applyMethod = cls.getMethod("apply");
+		} catch (final NoSuchMethodException unused) {
+			applyMethod = null;
+		}
+
+		WORKAROUND_APPLY_METHOD = applyMethod;
+	}
+
+	// ===========================================================
+	// Fields
+	// ===========================================================
+
+	// ===========================================================
+	// Constructors
+	// ===========================================================
+
+	// ===========================================================
+	// Getter & Setter
+	// ===========================================================
+
+	// ===========================================================
+	// Methods for/from SuperClass/Interfaces
+	// ===========================================================
+
+	// ===========================================================
+	// Methods
+	// ===========================================================
+
+	public static void apply(final Editor pEditor) {
+		if (SharedPreferencesCompat.WORKAROUND_APPLY_METHOD != null) {
+			try {
+				SharedPreferencesCompat.WORKAROUND_APPLY_METHOD.invoke(pEditor);
+				return;
+			} catch (final InvocationTargetException e) {
+				/* Nothing. */
+			} catch (final IllegalAccessException e) {
+				/* Nothing. */
+			}
+		}
+		pEditor.commit();
+	}
+
+	// ===========================================================
+	// Inner and Anonymous Classes
+	// ===========================================================
+}

From 9982da72555e070892234e46841e71845e6fac37 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 7 Apr 2013 18:07:35 -0700
Subject: [PATCH 151/252] Minor changes.

---
 src/org/andengine/opengl/GLES20Fix.java | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/org/andengine/opengl/GLES20Fix.java b/src/org/andengine/opengl/GLES20Fix.java
index 1ad19aead..130be06d6 100644
--- a/src/org/andengine/opengl/GLES20Fix.java
+++ b/src/org/andengine/opengl/GLES20Fix.java
@@ -3,6 +3,7 @@
 import org.andengine.util.exception.AndEngineRuntimeException;
 import org.andengine.util.system.SystemUtils;
 
+import android.annotation.TargetApi;
 import android.opengl.GLES20;
 import android.os.Build;
 
@@ -12,12 +13,13 @@
  * @author Nicolas Gramlich 
  * @since 17:44:43 - 04.09.2011
  */
+@TargetApi(Build.VERSION_CODES.GINGERBREAD)
 public class GLES20Fix {
 	// ===========================================================
 	// Constants
 	// ===========================================================
 
-	private static boolean NATIVE_LIB_LOADED;
+	private static final boolean NATIVE_LIB_LOADED;
 
 	/** Android issue 8931. */
 	private static final boolean WORKAROUND_MISSING_GLES20_METHODS;

From 1c68ddba3f4fda0f1c6bf1a31b930c171b073467 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 7 Apr 2013 18:08:01 -0700
Subject: [PATCH 152/252] Added HashUtils.getHashCode(byte[]).

---
 src/org/andengine/util/HashUtils.java | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/src/org/andengine/util/HashUtils.java b/src/org/andengine/util/HashUtils.java
index 66dccb11c..fbd6687a4 100644
--- a/src/org/andengine/util/HashUtils.java
+++ b/src/org/andengine/util/HashUtils.java
@@ -36,13 +36,24 @@ private HashUtils() {
 	// Methods
 	// ===========================================================
 
+	public static int getHashCode(final byte ... pBytes) {
+		final int prime = 31;
+		int result = 1;
+
+		for (int i = 0; i < pBytes.length; i++) {
+			result = prime * result + pBytes[i];
+		}
+
+		return result;
+	}
+
 	public static int getHashCode(final Object ... pObjects) {
 		final int prime = 31;
 		int result = 1;
 
 		for (int i = 0; i < pObjects.length; i++) {
-			final Object string = pObjects[i];
-			result = prime * result + ((string == null) ? 0 : string.hashCode());
+			final Object object = pObjects[i];
+			result = prime * result + ((object == null) ? 0 : object.hashCode());
 		}
 
 		return result;

From a3abbabcdd4e9e63d411f084927690d1c71bb0aa Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 7 Apr 2013 18:13:32 -0700
Subject: [PATCH 153/252] Updated experiment framework to send more device
 information to the server and support saving/restoring of the experiment data
 to SharedPreferences.

---
 .../util/experiment/ExperimentManager.java    | 188 ++++++++++++++++--
 .../ExperimentNotFoundException.java          |   1 -
 .../exception/ExperimentTypeException.java    |   1 -
 3 files changed, 167 insertions(+), 23 deletions(-)

diff --git a/src/org/andengine/util/experiment/ExperimentManager.java b/src/org/andengine/util/experiment/ExperimentManager.java
index 49aca3448..0da754b21 100644
--- a/src/org/andengine/util/experiment/ExperimentManager.java
+++ b/src/org/andengine/util/experiment/ExperimentManager.java
@@ -6,17 +6,23 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.andengine.util.StreamUtils;
 import org.andengine.util.call.Callback;
 import org.andengine.util.debug.Debug;
+import org.andengine.util.exception.MethodNotYetImplementedException;
 import org.andengine.util.experiment.exception.ExperimentException;
 import org.andengine.util.experiment.exception.ExperimentNotFoundException;
 import org.andengine.util.experiment.exception.ExperimentTypeException;
+import org.andengine.util.preferences.SimplePreferences;
 import org.andengine.util.system.SystemUtils;
 import org.andengine.util.system.SystemUtils.SystemUtilsException;
+import org.andengine.util.time.TimeConstants;
 import org.andengine.util.uuid.UUIDManager;
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
@@ -31,7 +37,11 @@
 import org.json.JSONObject;
 
 import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
 import android.os.AsyncTask;
+import android.os.Build;
+import android.telephony.TelephonyManager;
 
 /**
  * (c) 2013 Nicolas Gramlich
@@ -44,6 +54,9 @@ public class ExperimentManager {
 	// Constants
 	// ===========================================================
 
+	private static final String PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_FETCHED_TIMESTAMP_KEY = "preferences.experimentmanager.experiments.fetched.timestamp";
+	private static final String PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_DATA_KEY = "preferences.experimentmanager.experiments.data";
+
 	// ===========================================================
 	// Fields
 	// ===========================================================
@@ -52,11 +65,21 @@ public class ExperimentManager {
 	private final String mServerURL;
 	private final IExperimentFactory mExperimentFactory;
 
+	private final UUID mUUID;
 	private final String mPackageName;
 	private final int mPackageVersionCode;
-	private final UUID mUUID;
+	private String mSimOperatorName;
+	private String mNetworkOperatorName;
 
 	private Map> mExperiments;
+	private String mExperimentsData;
+
+	private long mExperimentsFetchDirtyInterval = TimeConstants.MILLISECONDS_PER_DAY;
+	private boolean mExperimentsFetching;
+	private boolean mExperimentsFetched;
+	private long mExperimentsFetchedTimestamp;
+
+	private final Lock mExperimentsFetchLock = new ReentrantLock();
 
 	// ===========================================================
 	// Constructors
@@ -71,16 +94,35 @@ public ExperimentManager(final Context pContext, final String pServerURL, final
 		this.mServerURL = pServerURL;
 		this.mExperimentFactory = pExperimentFactory;
 
+		this.mUUID = UUIDManager.getUUID(pContext);
 		this.mPackageName = SystemUtils.getPackageName(pContext);
 		this.mPackageVersionCode = SystemUtils.getPackageVersionCode(pContext);
 
-		this.mUUID = UUIDManager.getUUID(pContext);
+		TelephonyManager manager = (TelephonyManager) pContext.getSystemService(Context.TELEPHONY_SERVICE);
+		this.mNetworkOperatorName = manager.getNetworkOperatorName();
+		this.mSimOperatorName = manager.getSimOperatorName();
 	}
 
 	// ===========================================================
 	// Getter & Setter
 	// ===========================================================
 
+	public boolean isFetchingExperiments() {
+		return this.mExperimentsFetching;
+	}
+
+	public boolean hasFetchedExperiments() {
+		return this.mExperimentsFetched;
+	}
+
+	public long getExperimentsFetchDirtyInterval() {
+		return this.mExperimentsFetchDirtyInterval;
+	}
+
+	public void setExperimentsFetchDirtyInterval(final long pExperimentsFetchDirtyInterval) {
+		this.mExperimentsFetchDirtyInterval = pExperimentsFetchDirtyInterval;
+	}
+
 	public Experiment getExperiment(final String pExperimentName) throws ExperimentNotFoundException {
 		final Experiment experiment = this.mExperiments.get(pExperimentName);
 		if (experiment != null) {
@@ -256,37 +298,137 @@ public Object getExperimentValue(final String pExperimentName, final Object pDef
 	// Methods
 	// ===========================================================
 
+	public boolean save() {
+		return this.save(SimplePreferences.getInstance(this.mContext));
+	}
+
+	public boolean save(final SharedPreferences pSharedPreferences) {
+		final Editor editor = pSharedPreferences.edit();
+
+		editor.putLong(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_FETCHED_TIMESTAMP_KEY, this.mExperimentsFetchedTimestamp);
+		editor.putString(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_DATA_KEY, this.mExperimentsData);
+
+		return editor.commit(); // TODO SharedPreferencesCompat.apply(editor); ? 
+	}
+
+	public void saveAsync(final SharedPreferences pSharedPreferences, final Callback pCallback) {
+		throw new MethodNotYetImplementedException();
+	}
+
+	public boolean restore() {
+		return this.restore(SimplePreferences.getInstance(this.mContext));
+	}
+
+	public boolean restore(final SharedPreferences pSharedPreferences) {
+		this.mExperimentsData = pSharedPreferences.getString(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_DATA_KEY, null);
+		if (this.mExperimentsData != null) {
+			try {
+				this.mExperiments = this.parseExperiments(this.mExperimentsData);
+				this.mExperimentsFetchedTimestamp = pSharedPreferences.getLong(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_FETCHED_TIMESTAMP_KEY, 0);
+				this.mExperimentsFetched = true;
+			} catch (final JSONException e) {
+				return false;
+			}
+		}
+		return true;
+	}
+
 	public boolean fetchExperiments() throws IOException, URISyntaxException {
-		final HttpClient httpClient = new DefaultHttpClient();
+		return this.fetchExperiments(false);
+	}
+
+	public boolean fetchExperiments(final boolean pForce) throws IOException, URISyntaxException {
+		this.mExperimentsFetchLock.lock();
+		try {
+			if (this.shouldFetchExperiments(pForce)) {
+				this.mExperimentsFetching = true;
+
+				final HttpClient httpClient = new DefaultHttpClient();
+
+				final List params = this.getParameters();
+
+				final URI uri = new URI(this.mServerURL + "?" + URLEncodedUtils.format(params, "utf-8"));
+				final HttpGet httpGet = new HttpGet(uri);
+
+				final HttpResponse response = httpClient.execute(httpGet);
+
+				final int statusCode = response.getStatusLine().getStatusCode();
+				if ((statusCode >= HttpStatus.SC_OK) && (statusCode < HttpStatus.SC_MULTIPLE_CHOICES)) {
+					final String serverResponse = StreamUtils.readFully(response.getEntity().getContent());
+
+					try {
+						this.mExperiments = this.parseExperiments(serverResponse);
+						this.mExperimentsFetched = true;
+						this.mExperimentsFetchedTimestamp = System.currentTimeMillis();
+						this.mExperimentsData = serverResponse;
+					} catch (final JSONException e) {
+						Debug.e(e);
+					}
+				}
+			}
+		} finally {
+			this.mExperimentsFetching = false;
+			this.mExperimentsFetchLock.unlock();
+		}
+		return this.mExperimentsFetched;
+	}
 
+	protected List getParameters() {
 		final List params = new ArrayList();
-		params.add(new BasicNameValuePair("appid", this.mPackageName));
-		params.add(new BasicNameValuePair("version", String.valueOf(this.mPackageVersionCode)));
+
 		params.add(new BasicNameValuePair("uuid", this.mUUID.toString()));
+		params.add(new BasicNameValuePair("app_id", this.mPackageName));
+		params.add(new BasicNameValuePair("app_version", String.valueOf(this.mPackageVersionCode)));
+
+		params.add(new BasicNameValuePair("os_version", String.valueOf(Build.VERSION.SDK_INT)));
 
-		final URI uri = new URI(this.mServerURL + "?" + URLEncodedUtils.format(params, "utf-8"));
-		final HttpGet httpGet = new HttpGet(uri);
+		params.add(new BasicNameValuePair("device_manufacturer", Build.MANUFACTURER));
+		params.add(new BasicNameValuePair("device_name", Build.DEVICE));
+		params.add(new BasicNameValuePair("device_brand", Build.BRAND));
+		params.add(new BasicNameValuePair("device_product", Build.PRODUCT));
+		params.add(new BasicNameValuePair("device_model", Build.MODEL));
+		params.add(new BasicNameValuePair("device_build", Build.DISPLAY));
+		final Locale locale = Locale.getDefault();
+		params.add(new BasicNameValuePair("device_locale_country", locale.getCountry()));
+		params.add(new BasicNameValuePair("device_locale_language", locale.getLanguage()));
+		params.add(new BasicNameValuePair("device_network_operator", this.mNetworkOperatorName));
+		params.add(new BasicNameValuePair("device_sim_operator", this.mSimOperatorName));
 
-		final HttpResponse response = httpClient.execute(httpGet);
+		return params;
+	}
 
-		final int statusCode = response.getStatusLine().getStatusCode();
-		if ((statusCode < HttpStatus.SC_OK) || (statusCode > HttpStatus.SC_MULTIPLE_CHOICES)) {
+	private boolean shouldFetchExperiments(final boolean pForce) {
+		if (this.mExperimentsFetching) {
 			return false;
 		} else {
-			final String serverResponse = StreamUtils.readFully(response.getEntity().getContent());
-
-			try {
-				this.mExperiments = this.parseExperiments(serverResponse);
+			if (pForce) {
 				return true;
-			} catch (final JSONException e) {
-				Debug.e(e);
-				return false;
+			} else {
+				if (this.mExperimentsFetched) {
+					final long now = System.currentTimeMillis();
+					final long experimentsFetchedDirtyTimestamp = this.mExperimentsFetchedTimestamp + this.mExperimentsFetchDirtyInterval;
+					return experimentsFetchedDirtyTimestamp > now;
+				} else {
+					return true;
+				}
 			}
 		}
 	}
 
+	public void fetchExperimentsAsync() {
+		this.fetchExperimentsAsync(false, null);
+	}
+
+	public void fetchExperimentsAsync(final boolean pForce) {
+		this.fetchExperimentsAsync(pForce, null);
+	}
+
 	public void fetchExperimentsAsync(final Callback pCallback) {
-		final FetchExperimentsAsyncTask fetchExperimentsAsyncTask = new FetchExperimentsAsyncTask(pCallback);
+		this.fetchExperimentsAsync(false, pCallback);
+	}
+
+	public void fetchExperimentsAsync(final boolean pForce, final Callback pCallback) {
+		final FetchExperimentsAsyncTask fetchExperimentsAsyncTask = new FetchExperimentsAsyncTask(pForce, pCallback);
 		fetchExperimentsAsyncTask.execute((Void[]) null);
 	}
 
@@ -318,13 +460,15 @@ public class FetchExperimentsAsyncTask extends AsyncTask {
 		// Fields
 		// ===========================================================
 
+		private final boolean mForce;
 		private final Callback mCallback;
 
 		// ===========================================================
 		// Constructors
 		// ===========================================================
 
-		public FetchExperimentsAsyncTask(final Callback pCallback) {
+		public FetchExperimentsAsyncTask(final boolean pForce, final Callback pCallback) {
+			this.mForce = pForce;
 			this.mCallback = pCallback;
 		}
 
@@ -339,7 +483,7 @@ public FetchExperimentsAsyncTask(final Callback pCallback) {
 		@Override
 		protected Boolean doInBackground(final Void ... pParams) {
 			try {
-				return ExperimentManager.this.fetchExperiments();
+				return ExperimentManager.this.fetchExperiments(this.mForce);
 			} catch (final Throwable t) {
 				Debug.e(t);
 				return false;
@@ -348,7 +492,9 @@ protected Boolean doInBackground(final Void ... pParams) {
 
 		@Override
 		protected void onPostExecute(final Boolean pResult) {
-			this.mCallback.onCallback(pResult);
+			if (this.mCallback != null) {
+				this.mCallback.onCallback(pResult);
+			}
 		}
 
 		// ===========================================================
diff --git a/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java b/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
index 24db70bc4..2e0f0e895 100644
--- a/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
+++ b/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java
@@ -1,6 +1,5 @@
 package org.andengine.util.experiment.exception;
 
-
 /**
  * (c) 2013 Nicolas Gramlich
  * 
diff --git a/src/org/andengine/util/experiment/exception/ExperimentTypeException.java b/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
index 85fbef378..9424a31db 100644
--- a/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
+++ b/src/org/andengine/util/experiment/exception/ExperimentTypeException.java
@@ -1,6 +1,5 @@
 package org.andengine.util.experiment.exception;
 
-
 /**
  * (c) 2013 Nicolas Gramlich
  * 

From fe1589af7c2579b29d2576e9a8a9ef5404527e28 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sun, 7 Apr 2013 18:15:26 -0700
Subject: [PATCH 154/252] Added possibility to ExperimentManager to save
 blocking or not blocking to SharedPreferences.

---
 .../util/experiment/ExperimentManager.java    | 23 +++++++++++++------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/org/andengine/util/experiment/ExperimentManager.java b/src/org/andengine/util/experiment/ExperimentManager.java
index 0da754b21..54e4d054c 100644
--- a/src/org/andengine/util/experiment/ExperimentManager.java
+++ b/src/org/andengine/util/experiment/ExperimentManager.java
@@ -15,10 +15,10 @@
 import org.andengine.util.StreamUtils;
 import org.andengine.util.call.Callback;
 import org.andengine.util.debug.Debug;
-import org.andengine.util.exception.MethodNotYetImplementedException;
 import org.andengine.util.experiment.exception.ExperimentException;
 import org.andengine.util.experiment.exception.ExperimentNotFoundException;
 import org.andengine.util.experiment.exception.ExperimentTypeException;
+import org.andengine.util.preferences.SharedPreferencesCompat;
 import org.andengine.util.preferences.SimplePreferences;
 import org.andengine.util.system.SystemUtils;
 import org.andengine.util.system.SystemUtils.SystemUtilsException;
@@ -299,20 +299,29 @@ public Object getExperimentValue(final String pExperimentName, final Object pDef
 	// ===========================================================
 
 	public boolean save() {
-		return this.save(SimplePreferences.getInstance(this.mContext));
+		return this.save(true);
+	}
+
+	public boolean save(final boolean pBlocking) {
+		return this.save(SimplePreferences.getInstance(this.mContext), pBlocking);
 	}
 
 	public boolean save(final SharedPreferences pSharedPreferences) {
+		return this.save(pSharedPreferences, true);
+	}
+
+	public boolean save(final SharedPreferences pSharedPreferences, final boolean pBlocking) {
 		final Editor editor = pSharedPreferences.edit();
 
 		editor.putLong(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_FETCHED_TIMESTAMP_KEY, this.mExperimentsFetchedTimestamp);
 		editor.putString(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_DATA_KEY, this.mExperimentsData);
 
-		return editor.commit(); // TODO SharedPreferencesCompat.apply(editor); ? 
-	}
-
-	public void saveAsync(final SharedPreferences pSharedPreferences, final Callback pCallback) {
-		throw new MethodNotYetImplementedException();
+		if (pBlocking) {
+			return editor.commit();
+		} else {
+			SharedPreferencesCompat.apply(editor);
+			return true;
+		}
 	}
 
 	public boolean restore() {

From 0190f2be11e5de4bbe19f4b2d5adf419fc74bd12 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Tue, 9 Apr 2013 10:25:47 -0700
Subject: [PATCH 155/252] Fixed wrong method call in
 TiledTextureRegion.setTextureX (thx to GitHubDemon).

---
 src/org/andengine/opengl/texture/region/TiledTextureRegion.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/org/andengine/opengl/texture/region/TiledTextureRegion.java b/src/org/andengine/opengl/texture/region/TiledTextureRegion.java
index 32988b66c..7c4d564c9 100644
--- a/src/org/andengine/opengl/texture/region/TiledTextureRegion.java
+++ b/src/org/andengine/opengl/texture/region/TiledTextureRegion.java
@@ -146,7 +146,7 @@ public void setTextureX(final float pTextureX) {
 
 	@Override
 	public void setTextureX(final int pTileIndex, final float pTextureX) {
-		this.mTextureRegions[pTileIndex].setTextureY(pTextureX);
+		this.mTextureRegions[pTileIndex].setTextureX(pTextureX);
 	}
 
 	@Override

From 1ce99e68d49fac9ed8a978bb49314e7c8358dece Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Fri, 12 Apr 2013 19:45:39 -0700
Subject: [PATCH 156/252] Added support for null Experiment values, when the
 'value' attribute isn't present.

---
 .../util/experiment/ExperimentFactory.java    | 64 +++++++++++++++----
 1 file changed, 52 insertions(+), 12 deletions(-)

diff --git a/src/org/andengine/util/experiment/ExperimentFactory.java b/src/org/andengine/util/experiment/ExperimentFactory.java
index 02e4a15e6..4c7e74051 100644
--- a/src/org/andengine/util/experiment/ExperimentFactory.java
+++ b/src/org/andengine/util/experiment/ExperimentFactory.java
@@ -37,40 +37,80 @@ public Experiment parseExperiment(final JSONObject pExperimentJSONObject) thr
 		final String type = pExperimentJSONObject.getString("type");
 
 		if (type.equals(Boolean.class.getSimpleName())) {
-			final boolean value = pExperimentJSONObject.getBoolean("value");
+			final Boolean value;
+			if (pExperimentJSONObject.has("value")) {
+				value = pExperimentJSONObject.getBoolean("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Boolean.class, value);
 		} else if (type.equals(Byte.class.getSimpleName())) {
-			final byte value = (byte) pExperimentJSONObject.getInt("value");
+			final Byte value;
+			if (pExperimentJSONObject.has("value")) {
+				value = (byte) pExperimentJSONObject.getInt("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Byte.class, value);
 		} else if (type.equals(Character.class.getSimpleName())) {
-			final char value = (char) pExperimentJSONObject.getInt("value");
+			final Character value;
+			if (pExperimentJSONObject.has("value")) {
+				value = (char) pExperimentJSONObject.getInt("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Character.class, value);
 		} else if (type.equals(Short.class.getSimpleName())) {
-			final short value = (short) pExperimentJSONObject.getInt("value");
+			final Short value;
+			if (pExperimentJSONObject.has("value")) {
+				value = (short) pExperimentJSONObject.getInt("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Short.class, value);
 		} else if (type.equals(Integer.class.getSimpleName())) {
-			final int value = pExperimentJSONObject.getInt("value");
+			final Integer value;
+			if (pExperimentJSONObject.has("value")) {
+				value = pExperimentJSONObject.getInt("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Integer.class, value);
 		} else if (type.equals(Long.class.getSimpleName())) {
-			final long value = pExperimentJSONObject.getLong("value");
+			final Long value;
+			if (pExperimentJSONObject.has("value")) {
+				value = pExperimentJSONObject.getLong("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Long.class, value);
 		} else if (type.equals(Float.class.getSimpleName())) {
-			final float value = (float) pExperimentJSONObject.getDouble("value");
+			final Float value;
+			if (pExperimentJSONObject.has("value")) {
+				value = (float) pExperimentJSONObject.getDouble("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Float.class, value);
 		} else if (type.equals(Double.class.getSimpleName())) {
-			final double value = pExperimentJSONObject.getDouble("value");
+			final Double value;
+			if (pExperimentJSONObject.has("value")) {
+				value = pExperimentJSONObject.getDouble("value");
+			} else {
+				value = null;
+			}
 			return new Experiment(name, Double.class, value);
 		} else if (type.equals(String.class.getSimpleName())) {
-			final String value = pExperimentJSONObject.getString("value");
+			final String value = pExperimentJSONObject.optString("value", null);
 			return new Experiment(name, String.class, value);
 		} else if (type.equals(JSONObject.class.getSimpleName())) {
-			final JSONObject value = pExperimentJSONObject.getJSONObject("value");
+			final JSONObject value = pExperimentJSONObject.optJSONObject("value");
 			return new Experiment(name, JSONObject.class, value);
 		} else if (type.equals(JSONArray.class.getSimpleName())) {
-			final JSONArray value = pExperimentJSONObject.getJSONArray("value");
+			final JSONArray value = pExperimentJSONObject.optJSONArray("value");
 			return new Experiment(name, JSONArray.class, value);
 		} else {
-			final Object value = pExperimentJSONObject.get("value");
+			final Object value = pExperimentJSONObject.opt("value");
 			return new Experiment(name, Object.class, value);
 		}
 	}

From db3e235c83a12854f8ebfa8dd96e6eeb48298903 Mon Sep 17 00:00:00 2001
From: Nicolas Gramlich 
Date: Sat, 13 Apr 2013 18:50:26 -0700
Subject: [PATCH 157/252] Removed Base64 code since that is part of Android API
 Level 8, which is the minSdkVersion.

---
 src/org/andengine/util/base64/Base64.java     | 761 ------------------
 .../util/base64/Base64InputStream.java        | 163 ----
 2 files changed, 924 deletions(-)
 delete mode 100644 src/org/andengine/util/base64/Base64.java
 delete mode 100644 src/org/andengine/util/base64/Base64InputStream.java

diff --git a/src/org/andengine/util/base64/Base64.java b/src/org/andengine/util/base64/Base64.java
deleted file mode 100644
index 9e4a40b43..000000000
--- a/src/org/andengine/util/base64/Base64.java
+++ /dev/null
@@ -1,761 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * 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 org.andengine.util.base64;
-
-import java.io.UnsupportedEncodingException;
-
-import android.util.Base64OutputStream;
-
-/**
- * Utilities for encoding and decoding the Base64 representation of
- * binary data.  See RFCs 2045 and 3548.
- */
-public class Base64 {
-	/**
-	 * Default values for encoder/decoder flags.
-	 */
-	public static final int DEFAULT = 0;
-
-	/**
-	 * Encoder flag bit to omit the padding '=' characters at the end
-	 * of the output (if any).
-	 */
-	public static final int NO_PADDING = 1;
-
-	/**
-	 * Encoder flag bit to omit all line terminators (i.e., the output
-	 * will be on one long line).
-	 */
-	public static final int NO_WRAP = 2;
-
-	/**
-	 * Encoder flag bit to indicate lines should be terminated with a
-	 * CRLF pair instead of just an LF.  Has no effect if {@code
-	 * NO_WRAP} is specified as well.
-	 */
-	public static final int CRLF = 4;
-
-	/**
-	 * Encoder/decoder flag bit to indicate using the "URL and
-	 * filename safe" variant of Base64 (see RFC 3548 section 4) where
-	 * {@code -} and {@code _} are used in place of {@code +} and
-	 * {@code /}.
-	 */
-	public static final int URL_SAFE = 8;
-
-	/**
-	 * Flag to pass to {@link Base64OutputStream} to indicate that it
-	 * should not close the output stream it is wrapping when it
-	 * itself is closed.
-	 */
-	public static final int NO_CLOSE = 16;
-
-	//  --------------------------------------------------------
-	//  shared code
-	//  --------------------------------------------------------
-
-	/* package */ static abstract class Coder {
-		public byte[] output;
-		public int op;
-
-		/**
-		 * Encode/decode another block of input data.  this.output is
-		 * provided by the caller, and must be big enough to hold all
-		 * the coded data.  On exit, this.opwill be set to the length
-		 * of the coded data.
-		 *
-		 * @param finish true if this is the final call to process for
-		 *        this object.  Will finalize the coder state and
-		 *        include any final bytes in the output.
-		 *
-		 * @return true if the input so far is good; false if some
-		 *         error has been detected in the input stream..
-		 */
-		public abstract boolean process(byte[] input, int offset, int len, boolean finish);
-
-		/**
-		 * @return the maximum number of bytes a call to process()
-		 * could produce for the given number of input bytes.  This may
-		 * be an overestimate.
-		 */
-		public abstract int maxOutputSize(int len);
-	}
-
-	//  --------------------------------------------------------
-	//  decoding
-	//  --------------------------------------------------------
-
-	/**
-	 * Decode the Base64-encoded data in input and return the data in
-	 * a new byte array.
-	 *
-	 * 

The padding '=' characters at the end are considered optional, but - * if any are present, there must be the correct number of them. - * - * @param str the input String to decode, which is converted to - * bytes using the default charset - * @param flags controls certain features of the decoded output. - * Pass {@code DEFAULT} to decode standard Base64. - * - * @throws IllegalArgumentException if the input contains - * incorrect padding - */ - public static byte[] decode(final String str, final int flags) { - return Base64.decode(str.getBytes(), flags); - } - - /** - * Decode the Base64-encoded data in input and return the data in - * a new byte array. - * - *

The padding '=' characters at the end are considered optional, but - * if any are present, there must be the correct number of them. - * - * @param input the input array to decode - * @param flags controls certain features of the decoded output. - * Pass {@code DEFAULT} to decode standard Base64. - * - * @throws IllegalArgumentException if the input contains - * incorrect padding - */ - public static byte[] decode(final byte[] input, final int flags) { - return Base64.decode(input, 0, input.length, flags); - } - - /** - * Decode the Base64-encoded data in input and return the data in - * a new byte array. - * - *

The padding '=' characters at the end are considered optional, but - * if any are present, there must be the correct number of them. - * - * @param input the data to decode - * @param offset the position within the input array at which to start - * @param len the number of bytes of input to decode - * @param flags controls certain features of the decoded output. - * Pass {@code DEFAULT} to decode standard Base64. - * - * @throws IllegalArgumentException if the input contains - * incorrect padding - */ - public static byte[] decode(final byte[] input, final int offset, final int len, final int flags) { - // Allocate space for the most data the input could represent. - // (It could contain less if it contains whitespace, etc.) - final Decoder decoder = new Decoder(flags, new byte[len*3/4]); - - if (!decoder.process(input, offset, len, true)) { - throw new IllegalArgumentException("bad base-64"); - } - - // Maybe we got lucky and allocated exactly enough output space. - if (decoder.op == decoder.output.length) { - return decoder.output; - } - - // Need to shorten the array, so allocate a new one of the - // right size and copy. - final byte[] temp = new byte[decoder.op]; - System.arraycopy(decoder.output, 0, temp, 0, decoder.op); - return temp; - } - - /* package */ static class Decoder extends Coder { - /** - * Lookup table for turning bytes into their position in the - * Base64 alphabet. - */ - private static final int DECODE[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; - - /** - * Decode lookup table for the "web safe" variant (RFC 3548 - * sec. 4) where - and _ replace + and /. - */ - private static final int DECODE_WEBSAFE[] = { - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -2, -1, -1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, - -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - }; - - /** Non-data values in the DECODE arrays. */ - private static final int SKIP = -1; - private static final int EQUALS = -2; - - /** - * States 0-3 are reading through the next input tuple. - * State 4 is having read one '=' and expecting exactly - * one more. - * State 5 is expecting no more data or padding characters - * in the input. - * State 6 is the error state; an error has been detected - * in the input and no future input can "fix" it. - */ - private int state; // state number (0 to 6) - private int value; - - final private int[] alphabet; - - public Decoder(final int flags, final byte[] output) { - this.output = output; - - this.alphabet = ((flags & URL_SAFE) == 0) ? DECODE : DECODE_WEBSAFE; - this.state = 0; - this.value = 0; - } - - /** - * @return an overestimate for the number of bytes {@code - * len} bytes could decode to. - */ - @Override - public int maxOutputSize(final int len) { - return len * 3/4 + 10; - } - - /** - * Decode another block of input data. - * - * @return true if the state machine is still healthy. false if - * bad base-64 data has been detected in the input stream. - */ - @Override - public boolean process(final byte[] input, final int offset, int len, final boolean finish) { - if (this.state == 6) { - return false; - } - - int p = offset; - len += offset; - - // Using local variables makes the decoder about 12% - // faster than if we manipulate the member variables in - // the loop. (Even alphabet makes a measurable - // difference, which is somewhat surprising to me since - // the member variable is final.) - int state = this.state; - int value = this.value; - int op = 0; - final byte[] output = this.output; - final int[] alphabet = this.alphabet; - - while (p < len) { - // Try the fast path: we're starting a new tuple and the - // next four bytes of the input stream are all data - // bytes. This corresponds to going through states - // 0-1-2-3-0. We expect to use this method for most of - // the data. - // - // If any of the next four bytes of input are non-data - // (whitespace, etc.), value will end up negative. (All - // the non-data values in decode are small negative - // numbers, so shifting any of them up and or'ing them - // together will result in a value with its top bit set.) - // - // You can remove this whole block and the output should - // be the same, just slower. - if (state == 0) { - while (p+4 <= len && - (value = ((alphabet[input[p] & 0xff] << 18) | - (alphabet[input[p+1] & 0xff] << 12) | - (alphabet[input[p+2] & 0xff] << 6) | - (alphabet[input[p+3] & 0xff]))) >= 0) { - output[op+2] = (byte) value; - output[op+1] = (byte) (value >> 8); - output[op] = (byte) (value >> 16); - op += 3; - p += 4; - } - if (p >= len) { - break; - } - } - - // The fast path isn't available -- either we've read a - // partial tuple, or the next four input bytes aren't all - // data, or whatever. Fall back to the slower state - // machine implementation. - - final int d = alphabet[input[p++] & 0xff]; - - switch (state) { - case 0: - if (d >= 0) { - value = d; - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 1: - if (d >= 0) { - value = (value << 6) | d; - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 2: - if (d >= 0) { - value = (value << 6) | d; - ++state; - } else if (d == EQUALS) { - // Emit the last (partial) output tuple; - // expect exactly one more padding character. - output[op++] = (byte) (value >> 4); - state = 4; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 3: - if (d >= 0) { - // Emit the output triple and return to state 0. - value = (value << 6) | d; - output[op+2] = (byte) value; - output[op+1] = (byte) (value >> 8); - output[op] = (byte) (value >> 16); - op += 3; - state = 0; - } else if (d == EQUALS) { - // Emit the last (partial) output tuple; - // expect no further data or padding characters. - output[op+1] = (byte) (value >> 2); - output[op] = (byte) (value >> 10); - op += 2; - state = 5; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 4: - if (d == EQUALS) { - ++state; - } else if (d != SKIP) { - this.state = 6; - return false; - } - break; - - case 5: - if (d != SKIP) { - this.state = 6; - return false; - } - break; - } - } - - if (!finish) { - // We're out of input, but a future call could provide - // more. - this.state = state; - this.value = value; - this.op = op; - return true; - } - - // Done reading input. Now figure out where we are left in - // the state machine and finish up. - - switch (state) { - case 0: - // Output length is a multiple of three. Fine. - break; - case 1: - // Read one extra input byte, which isn't enough to - // make another output byte. Illegal. - this.state = 6; - return false; - case 2: - // Read two extra input bytes, enough to emit 1 more - // output byte. Fine. - output[op++] = (byte) (value >> 4); - break; - case 3: - // Read three extra input bytes, enough to emit 2 more - // output bytes. Fine. - output[op++] = (byte) (value >> 10); - output[op++] = (byte) (value >> 2); - break; - case 4: - // Read one padding '=' when we expected 2. Illegal. - this.state = 6; - return false; - case 5: - // Read all the padding '='s we expected and no more. - // Fine. - break; - } - - this.state = state; - this.op = op; - return true; - } - } - - // -------------------------------------------------------- - // encoding - // -------------------------------------------------------- - - /** - * Base64-encode the given data and return a newly allocated - * String with the result. - * - * @param input the data to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static String encodeToString(final byte[] input, final int flags) { - try { - return new String(Base64.encode(input, flags), "US-ASCII"); - } catch (final UnsupportedEncodingException e) { - // US-ASCII is guaranteed to be available. - throw new AssertionError(e); - } - } - - /** - * Base64-encode the given data and return a newly allocated - * String with the result. - * - * @param input the data to encode - * @param offset the position within the input array at which to - * start - * @param len the number of bytes of input to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static String encodeToString(final byte[] input, final int offset, final int len, final int flags) { - try { - return new String(Base64.encode(input, offset, len, flags), "US-ASCII"); - } catch (final UnsupportedEncodingException e) { - // US-ASCII is guaranteed to be available. - throw new AssertionError(e); - } - } - - /** - * Base64-encode the given data and return a newly allocated - * byte[] with the result. - * - * @param input the data to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static byte[] encode(final byte[] input, final int flags) { - return Base64.encode(input, 0, input.length, flags); - } - - /** - * Base64-encode the given data and return a newly allocated - * byte[] with the result. - * - * @param input the data to encode - * @param offset the position within the input array at which to - * start - * @param len the number of bytes of input to encode - * @param flags controls certain features of the encoded output. - * Passing {@code DEFAULT} results in output that - * adheres to RFC 2045. - */ - public static byte[] encode(final byte[] input, final int offset, final int len, final int flags) { - final Encoder encoder = new Encoder(flags, null); - - // Compute the exact length of the array we will produce. - int output_len = len / 3 * 4; - - // Account for the tail of the data and the padding bytes, if any. - if (encoder.do_padding) { - if (len % 3 > 0) { - output_len += 4; - } - } else { - switch (len % 3) { - case 0: break; - case 1: output_len += 2; break; - case 2: output_len += 3; break; - } - } - - // Account for the newlines, if any. - if (encoder.do_newline && len > 0) { - output_len += (((len-1) / (3 * Encoder.LINE_GROUPS)) + 1) * - (encoder.do_cr ? 2 : 1); - } - - encoder.output = new byte[output_len]; - encoder.process(input, offset, len, true); - - assert encoder.op == output_len; - - return encoder.output; - } - - /* package */ static class Encoder extends Coder { - /** - * Emit a new line every this many output tuples. Corresponds to - * a 76-character line length (the maximum allowable according to - * RFC 2045). - */ - public static final int LINE_GROUPS = 19; - - /** - * Lookup table for turning Base64 alphabet positions (6 bits) - * into output bytes. - */ - private static final byte ENCODE[] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', - }; - - /** - * Lookup table for turning Base64 alphabet positions (6 bits) - * into output bytes. - */ - private static final byte ENCODE_WEBSAFE[] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', - 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', - }; - - final private byte[] tail; - /* package */ int tailLen; - private int count; - - final public boolean do_padding; - final public boolean do_newline; - final public boolean do_cr; - final private byte[] alphabet; - - public Encoder(final int flags, final byte[] output) { - this.output = output; - - this.do_padding = (flags & NO_PADDING) == 0; - this.do_newline = (flags & NO_WRAP) == 0; - this.do_cr = (flags & CRLF) != 0; - this.alphabet = ((flags & URL_SAFE) == 0) ? ENCODE : ENCODE_WEBSAFE; - - this.tail = new byte[2]; - this.tailLen = 0; - - this.count = this.do_newline ? LINE_GROUPS : -1; - } - - /** - * @return an overestimate for the number of bytes {@code - * len} bytes could encode to. - */ - @Override - public int maxOutputSize(final int len) { - return len * 8/5 + 10; - } - - @Override - public boolean process(final byte[] input, final int offset, int len, final boolean finish) { - // Using local variables makes the encoder about 9% faster. - final byte[] alphabet = this.alphabet; - final byte[] output = this.output; - int op = 0; - int count = this.count; - - int p = offset; - len += offset; - int v = -1; - - // First we need to concatenate the tail of the previous call - // with any input bytes available now and see if we can empty - // the tail. - - switch (this.tailLen) { - case 0: - // There was no tail. - break; - - case 1: - if (p+2 <= len) { - // A 1-byte tail with at least 2 bytes of - // input available now. - v = ((this.tail[0] & 0xff) << 16) | - ((input[p++] & 0xff) << 8) | - (input[p++] & 0xff); - this.tailLen = 0; - } - break; - - case 2: - if (p+1 <= len) { - // A 2-byte tail with at least 1 byte of input. - v = ((this.tail[0] & 0xff) << 16) | - ((this.tail[1] & 0xff) << 8) | - (input[p++] & 0xff); - this.tailLen = 0; - } - break; - } - - if (v != -1) { - output[op++] = alphabet[(v >> 18) & 0x3f]; - output[op++] = alphabet[(v >> 12) & 0x3f]; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (--count == 0) { - if (this.do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - count = LINE_GROUPS; - } - } - - // At this point either there is no tail, or there are fewer - // than 3 bytes of input available. - - // The main loop, turning 3 input bytes into 4 output bytes on - // each iteration. - while (p+3 <= len) { - v = ((input[p] & 0xff) << 16) | - ((input[p+1] & 0xff) << 8) | - (input[p+2] & 0xff); - output[op] = alphabet[(v >> 18) & 0x3f]; - output[op+1] = alphabet[(v >> 12) & 0x3f]; - output[op+2] = alphabet[(v >> 6) & 0x3f]; - output[op+3] = alphabet[v & 0x3f]; - p += 3; - op += 4; - if (--count == 0) { - if (this.do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - count = LINE_GROUPS; - } - } - - if (finish) { - // Finish up the tail of the input. Note that we need to - // consume any bytes in tail before any bytes - // remaining in input; there should be at most two bytes - // total. - - if (p-this.tailLen == len-1) { - int t = 0; - v = ((this.tailLen > 0 ? this.tail[t++] : input[p++]) & 0xff) << 4; - this.tailLen -= t; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (this.do_padding) { - output[op++] = '='; - output[op++] = '='; - } - if (this.do_newline) { - if (this.do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - } - } else if (p-this.tailLen == len-2) { - int t = 0; - v = (((this.tailLen > 1 ? this.tail[t++] : input[p++]) & 0xff) << 10) | - (((this.tailLen > 0 ? this.tail[t++] : input[p++]) & 0xff) << 2); - this.tailLen -= t; - output[op++] = alphabet[(v >> 12) & 0x3f]; - output[op++] = alphabet[(v >> 6) & 0x3f]; - output[op++] = alphabet[v & 0x3f]; - if (this.do_padding) { - output[op++] = '='; - } - if (this.do_newline) { - if (this.do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - } - } else if (this.do_newline && op > 0 && count != LINE_GROUPS) { - if (this.do_cr) { - output[op++] = '\r'; - } - output[op++] = '\n'; - } - - assert this.tailLen == 0; - assert p == len; - } else { - // Save the leftovers in tail to be consumed on the next - // call to encodeInternal. - - if (p == len-1) { - this.tail[this.tailLen++] = input[p]; - } else if (p == len-2) { - this.tail[this.tailLen++] = input[p]; - this.tail[this.tailLen++] = input[p+1]; - } - } - - this.op = op; - this.count = count; - - return true; - } - } - - private Base64() { } // don't instantiate -} diff --git a/src/org/andengine/util/base64/Base64InputStream.java b/src/org/andengine/util/base64/Base64InputStream.java deleted file mode 100644 index e1d58c244..000000000 --- a/src/org/andengine/util/base64/Base64InputStream.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * 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 org.andengine.util.base64; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * An InputStream that does Base64 decoding on the data read through - * it. - */ -public class Base64InputStream extends FilterInputStream { - private final Base64.Coder coder; - - private static byte[] EMPTY = new byte[0]; - - private static final int BUFFER_SIZE = 2048; - private boolean eof; - private byte[] inputBuffer; - private int outputStart; - private int outputEnd; - - /** - * An InputStream that performs Base64 decoding on the data read - * from the wrapped stream. - * - * @param in the InputStream to read the source data from - * @param flags bit flags for controlling the decoder; see the - * constants in {@link Base64} - */ - public Base64InputStream(final InputStream in, final int flags) { - this(in, flags, false); - } - - /** - * Performs Base64 encoding or decoding on the data read from the - * wrapped InputStream. - * - * @param in the InputStream to read the source data from - * @param flags bit flags for controlling the decoder; see the - * constants in {@link Base64} - * @param encode true to encode, false to decode - * - * @hide - */ - public Base64InputStream(final InputStream in, final int flags, final boolean encode) { - super(in); - this.eof = false; - this.inputBuffer = new byte[BUFFER_SIZE]; - if (encode) { - this.coder = new Base64.Encoder(flags, null); - } else { - this.coder = new Base64.Decoder(flags, null); - } - this.coder.output = new byte[this.coder.maxOutputSize(BUFFER_SIZE)]; - this.outputStart = 0; - this.outputEnd = 0; - } - - @Override - public boolean markSupported() { - return false; - } - - @Override - public void mark(final int readlimit) { - throw new UnsupportedOperationException(); - } - - @Override - public void reset() { - throw new UnsupportedOperationException(); - } - - @Override - public void close() throws IOException { - this.in.close(); - this.inputBuffer = null; - } - - @Override - public int available() { - return this.outputEnd - this.outputStart; - } - - @Override - public long skip(final long n) throws IOException { - if (this.outputStart >= this.outputEnd) { - this.refill(); - } - if (this.outputStart >= this.outputEnd) { - return 0; - } - final long bytes = Math.min(n, this.outputEnd-this.outputStart); - this.outputStart += bytes; - return bytes; - } - - @Override - public int read() throws IOException { - if (this.outputStart >= this.outputEnd) { - this.refill(); - } - if (this.outputStart >= this.outputEnd) { - return -1; - } else { - return this.coder.output[this.outputStart++]; - } - } - - @Override - public int read(final byte[] b, final int off, final int len) throws IOException { - if (this.outputStart >= this.outputEnd) { - this.refill(); - } - if (this.outputStart >= this.outputEnd) { - return -1; - } - final int bytes = Math.min(len, this.outputEnd-this.outputStart); - System.arraycopy(this.coder.output, this.outputStart, b, off, bytes); - this.outputStart += bytes; - return bytes; - } - - /** - * Read data from the input stream into inputBuffer, then - * decode/encode it into the empty coder.output, and reset the - * outputStart and outputEnd pointers. - */ - private void refill() throws IOException { - if (this.eof) { - return; - } - final int bytesRead = this.in.read(this.inputBuffer); - boolean success; - if (bytesRead == -1) { - this.eof = true; - success = this.coder.process(EMPTY, 0, 0, true); - } else { - success = this.coder.process(this.inputBuffer, 0, bytesRead, false); - } - if (!success) { - throw new IOException("bad base-64"); - } - this.outputEnd = this.coder.op; - this.outputStart = 0; - } -} From f69f0e99e6a9cde423ac4ae60246b384719f8338 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 13 Apr 2013 23:45:48 -0700 Subject: [PATCH 158/252] Added SecureSharedPreferences. --- .../preferences/SecureSharedPreferences.java | 357 ++++++++++++++++++ .../SecureSharedPreferencesException.java | 57 +++ 2 files changed, 414 insertions(+) create mode 100644 src/org/andengine/util/preferences/SecureSharedPreferences.java create mode 100644 src/org/andengine/util/preferences/exception/SecureSharedPreferencesException.java diff --git a/src/org/andengine/util/preferences/SecureSharedPreferences.java b/src/org/andengine/util/preferences/SecureSharedPreferences.java new file mode 100644 index 000000000..7625dff45 --- /dev/null +++ b/src/org/andengine/util/preferences/SecureSharedPreferences.java @@ -0,0 +1,357 @@ +package org.andengine.util.preferences; + +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; +import java.util.Set; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.andengine.util.exception.MethodNotYetImplementedException; +import org.andengine.util.preferences.exception.SecureSharedPreferencesException; + +import android.annotation.TargetApi; +import android.content.SharedPreferences; +import android.os.Build; +import android.util.Base64; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 20:09:38 - 13.04.2013 + */ +public class SecureSharedPreferences implements SharedPreferences { + // =========================================================== + // Constants + // =========================================================== + + private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding"; + private static final String KEY_HASH_TRANSFORMATION = "SHA-256"; + private static final String CHARSET = "UTF-8"; + + // =========================================================== + // Fields + // =========================================================== + + protected final SharedPreferences mDelegate; + + private final boolean mEncryptKeys; + private final boolean mEncryptValues; + + private final Cipher mEncryptCipher; + private final Cipher mDecryptCipher; + + // =========================================================== + // Constructors + // =========================================================== + + public SecureSharedPreferences(final SharedPreferences pDelegate, final String pSecureKey) throws SecureSharedPreferencesException { + this(pDelegate, pSecureKey, true, true); + } + + public SecureSharedPreferences(final SharedPreferences pDelegate, final String pSecureKey, final boolean pEncryptKeys, final boolean pEncryptValues) throws SecureSharedPreferencesException { + this.mDelegate = pDelegate; + this.mEncryptKeys = pEncryptKeys; + this.mEncryptValues = pEncryptValues; + try { + this.mEncryptCipher = Cipher.getInstance(SecureSharedPreferences.CIPHER_TRANSFORMATION); + this.mDecryptCipher = Cipher.getInstance(SecureSharedPreferences.CIPHER_TRANSFORMATION); + + final IvParameterSpec ivSpec = this.getIvParameterSpec(); + final SecretKeySpec secretKey = this.getSecretKeySpec(pSecureKey); + + this.mEncryptCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); + this.mDecryptCipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); + } catch (final GeneralSecurityException e) { + throw new SecureSharedPreferencesException(e); + } catch (final UnsupportedEncodingException e) { + throw new SecureSharedPreferencesException(e); + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public Editor edit() { + return new Editor(); + } + + @Override + public Map getAll() { + throw new MethodNotYetImplementedException(); + } + + @Override + public boolean getBoolean(final String pKey, final boolean pDefaultValue) { + final String value = this.mDelegate.getString(pKey, null); + if (value == null) { + return pDefaultValue; + } else { + return Boolean.parseBoolean(this.decryptValue(value)); + } + } + + @Override + public int getInt(final String pKey, final int pDefaultValue) { + final String value = this.mDelegate.getString(pKey, null); + if (value == null) { + return pDefaultValue; + } else { + return Integer.parseInt(this.decryptValue(value)); + } + } + + @Override + public long getLong(final String pKey, final long pDefaultValue) { + final String value = this.mDelegate.getString(pKey, null); + if (value == null) { + return pDefaultValue; + } else { + return Long.parseLong(this.decryptValue(value)); + } + } + + @Override + public float getFloat(final String pKey, final float pDefaultValue) { + final String value = this.mDelegate.getString(pKey, null); + if (value == null) { + return pDefaultValue; + } else { + return Float.parseFloat(this.decryptValue(value)); + } + } + + @Override + public String getString(final String pKey, final String pDefaultValue) { + final String value = this.mDelegate.getString(pKey, null); + if (value == null) { + return pDefaultValue; + } else { + return this.decryptValue(value); + } + } + + @Override + public boolean contains(final String pKey) { + return this.mDelegate.contains(pKey); + } + + @Override + public void registerOnSharedPreferenceChangeListener(final OnSharedPreferenceChangeListener pOnSharedPreferenceChangeListener) { + this.mDelegate.registerOnSharedPreferenceChangeListener(pOnSharedPreferenceChangeListener); + } + + @Override + public void unregisterOnSharedPreferenceChangeListener(final OnSharedPreferenceChangeListener pOnSharedPreferenceChangeListener) { + this.mDelegate.unregisterOnSharedPreferenceChangeListener(pOnSharedPreferenceChangeListener); + } + + @Override + public Set getStringSet(final String pKey, final Set pStringSet) { + throw new MethodNotYetImplementedException(); + } + + // =========================================================== + // Methods + // =========================================================== + + protected String encryptKey(final String pKey) { + if (this.mEncryptKeys) { + return this.encrypt(pKey); + } else { + return pKey; + } + } + + protected String encryptValue(final String pValue) { + if (this.mEncryptValues) { + return this.encrypt(pValue); + } else { + return pValue; + } + } + + protected String decryptKey(final String pKey) { + if (this.mEncryptKeys) { + return this.decrypt(pKey); + } else { + return pKey; + } + } + + protected String decryptValue(final String pValue) { + if (this.mEncryptValues) { + return this.decrypt(pValue); + } else { + return pValue; + } + } + + protected IvParameterSpec getIvParameterSpec() { + final int blockSize = this.mEncryptCipher.getBlockSize(); + final byte[] iv = new byte[blockSize]; + System.arraycopy("abcdefghijklmnopqrstuvwxzyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".getBytes(), 0, iv, 0, blockSize); + return new IvParameterSpec(iv); + } + + protected SecretKeySpec getSecretKeySpec(final String pKey) throws UnsupportedEncodingException, NoSuchAlgorithmException { + final byte[] keyBytes = this.createKeyBytes(pKey); + return new SecretKeySpec(keyBytes, SecureSharedPreferences.CIPHER_TRANSFORMATION); + } + + protected byte[] createKeyBytes(final String pKey) throws UnsupportedEncodingException, NoSuchAlgorithmException { + final MessageDigest md = MessageDigest.getInstance(SecureSharedPreferences.KEY_HASH_TRANSFORMATION); + md.reset(); + final byte[] keyBytes = md.digest(pKey.getBytes(SecureSharedPreferences.CHARSET)); + return keyBytes; + } + + protected String encrypt(final String pPlainText) throws SecureSharedPreferencesException { + byte[] secureValue; + try { + secureValue = SecureSharedPreferences.crypt(this.mEncryptCipher, pPlainText.getBytes(SecureSharedPreferences.CHARSET)); + } catch (final UnsupportedEncodingException e) { + throw new SecureSharedPreferencesException(e); + } + final String secureValueEncoded = Base64.encodeToString(secureValue, Base64.NO_WRAP); + return secureValueEncoded; + } + + protected String decrypt(final String pCipherText) { + final byte[] securedValue = Base64.decode(pCipherText, Base64.NO_WRAP); + final byte[] pValue = SecureSharedPreferences.crypt(this.mDecryptCipher, securedValue); + try { + return new String(pValue, SecureSharedPreferences.CHARSET); + } catch (final UnsupportedEncodingException e) { + throw new SecureSharedPreferencesException(e); + } + } + + protected static byte[] crypt(final Cipher pCipher, final byte[] pBytes) throws SecureSharedPreferencesException { + try { + return pCipher.doFinal(pBytes); + } catch (final Exception e) { + throw new SecureSharedPreferencesException(e); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public class Editor implements SharedPreferences.Editor { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + protected SharedPreferences.Editor mDelegate; + + // =========================================================== + // Constructors + // =========================================================== + + public Editor() { + this.mDelegate = SecureSharedPreferences.this.mDelegate.edit(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public Editor putBoolean(final String pKey, final boolean pValue) { + final String encryptedKey = SecureSharedPreferences.this.encryptKey(pKey); + final String encryptedValue = SecureSharedPreferences.this.encryptValue(Boolean.toString(pValue)); + this.mDelegate.putString(encryptedKey, encryptedValue); + return this; + } + + @Override + public Editor putInt(final String pKey, final int pValue) { + final String encryptedKey = SecureSharedPreferences.this.encrypt(pKey); + final String encryptValue = SecureSharedPreferences.this.encryptValue(Integer.toString(pValue)); + this.mDelegate.putString(encryptedKey, encryptValue); + return this; + } + + @Override + public Editor putLong(final String pKey, final long pValue) { + final String encryptedKey = SecureSharedPreferences.this.encrypt(pKey); + final String encryptValue = SecureSharedPreferences.this.encryptValue(Long.toString(pValue)); + this.mDelegate.putString(encryptedKey, encryptValue); + return this; + } + + @Override + public Editor putFloat(final String pKey, final float pValue) { + final String encryptedKey = SecureSharedPreferences.this.encrypt(pKey); + final String encryptedVaue = SecureSharedPreferences.this.encryptValue(Float.toString(pValue)); + this.mDelegate.putString(encryptedKey, encryptedVaue); + return this; + } + + @Override + public Editor putString(final String pKey, final String pValue) { + final String encryptedKey = SecureSharedPreferences.this.encrypt(pKey); + final String encryptValue = SecureSharedPreferences.this.encryptValue(pValue); + this.mDelegate.putString(encryptedKey, encryptValue); + return this; + } + + @Override + public Editor putStringSet(final String pKey, final Set pStringSet) { + throw new MethodNotYetImplementedException(); + } + + @Override + public Editor remove(final String pKey) { + final String encryptedKey = SecureSharedPreferences.this.encrypt(pKey); + this.mDelegate.remove(encryptedKey); + return this; + } + + @Override + public Editor clear() { + this.mDelegate.clear(); + return this; + } + + @Override + public boolean commit() { + return this.mDelegate.commit(); + } + + @TargetApi(Build.VERSION_CODES.GINGERBREAD) + @Override + public void apply() { + this.mDelegate.apply(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} \ No newline at end of file diff --git a/src/org/andengine/util/preferences/exception/SecureSharedPreferencesException.java b/src/org/andengine/util/preferences/exception/SecureSharedPreferencesException.java new file mode 100644 index 000000000..7aa792176 --- /dev/null +++ b/src/org/andengine/util/preferences/exception/SecureSharedPreferencesException.java @@ -0,0 +1,57 @@ +package org.andengine.util.preferences.exception; + +import org.andengine.util.exception.AndEngineRuntimeException; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 20:09:38 - 13.04.2013 + */ +public class SecureSharedPreferencesException extends AndEngineRuntimeException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 5683854473467471982L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public SecureSharedPreferencesException() { + + } + + public SecureSharedPreferencesException(final String pMessage) { + super(pMessage); + } + + public SecureSharedPreferencesException(final Throwable pThrowable) { + super(pThrowable); + } + + public SecureSharedPreferencesException(final String pMessage, final Throwable pThrowable) { + super(pMessage, pThrowable); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 0ec5c18c5c291ecc1ad9957a771fe806d2f7be1c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 00:28:21 -0700 Subject: [PATCH 159/252] Made SecureSharedPreferences easier to extend. --- .../util/preferences/SecureSharedPreferences.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/org/andengine/util/preferences/SecureSharedPreferences.java b/src/org/andengine/util/preferences/SecureSharedPreferences.java index 7625dff45..2d8ad3745 100644 --- a/src/org/andengine/util/preferences/SecureSharedPreferences.java +++ b/src/org/andengine/util/preferences/SecureSharedPreferences.java @@ -30,9 +30,9 @@ public class SecureSharedPreferences implements SharedPreferences { // Constants // =========================================================== - private static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding"; - private static final String KEY_HASH_TRANSFORMATION = "SHA-256"; - private static final String CHARSET = "UTF-8"; + protected static final String CIPHER_TRANSFORMATION = "AES/CBC/PKCS5Padding"; + protected static final String KEY_HASH_TRANSFORMATION = "SHA-256"; + protected static final String CHARSET = "UTF-8"; // =========================================================== // Fields @@ -40,11 +40,11 @@ public class SecureSharedPreferences implements SharedPreferences { protected final SharedPreferences mDelegate; - private final boolean mEncryptKeys; - private final boolean mEncryptValues; + protected final boolean mEncryptKeys; + protected final boolean mEncryptValues; - private final Cipher mEncryptCipher; - private final Cipher mDecryptCipher; + protected final Cipher mEncryptCipher; + protected final Cipher mDecryptCipher; // =========================================================== // Constructors From d8cb05204422f5a0391bd207d220cf269e7f2fc9 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 00:28:55 -0700 Subject: [PATCH 160/252] Minor change. --- src/org/andengine/util/preferences/SecureSharedPreferences.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/preferences/SecureSharedPreferences.java b/src/org/andengine/util/preferences/SecureSharedPreferences.java index 2d8ad3745..a0a25805c 100644 --- a/src/org/andengine/util/preferences/SecureSharedPreferences.java +++ b/src/org/andengine/util/preferences/SecureSharedPreferences.java @@ -259,7 +259,7 @@ public class Editor implements SharedPreferences.Editor { // Fields // =========================================================== - protected SharedPreferences.Editor mDelegate; + protected final SharedPreferences.Editor mDelegate; // =========================================================== // Constructors From 12cb5362cdf6d8bed7139b30c7825089db9e721a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 01:09:40 -0700 Subject: [PATCH 161/252] Removed some spaces. --- .../camera/hud/controls/BaseOnScreenControl.java | 4 ++-- src/org/andengine/entity/Entity.java | 8 ++++---- src/org/andengine/entity/scene/Scene.java | 8 ++++---- src/org/andengine/entity/sprite/batch/SpriteBatch.java | 4 ++-- .../input/sensor/acceleration/AccelerationData.java | 2 +- .../input/touch/controller/BaseTouchController.java | 2 +- .../andengine/input/touch/detector/HoldDetector.java | 4 ++-- .../input/touch/detector/PinchZoomDetector.java | 2 +- .../atlas/bitmap/BuildableBitmapTextureAtlas.java | 8 ++++---- ...lGradientFillBitmapTextureAtlasSourceDecorator.java | 2 +- src/org/andengine/opengl/util/GLState.java | 2 +- src/org/andengine/ui/activity/BaseGameActivity.java | 2 +- .../andengine/util/adt/data/operator/ByteOperator.java | 10 +++++----- .../andengine/util/adt/data/operator/CharOperator.java | 10 +++++----- .../util/adt/data/operator/DoubleOperator.java | 10 +++++----- .../util/adt/data/operator/FloatOperator.java | 10 +++++----- .../andengine/util/adt/data/operator/IntOperator.java | 10 +++++----- .../andengine/util/adt/data/operator/LongOperator.java | 10 +++++----- .../util/adt/data/operator/ShortOperator.java | 10 +++++----- .../util/adt/data/operator/StringOperator.java | 4 ++-- .../util/adt/spatial/quadtree/IntQuadTree.java | 4 ++-- src/org/andengine/util/algorithm/path/IPathFinder.java | 6 +++--- 22 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java index baf5b4c96..715242edf 100644 --- a/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java +++ b/src/org/andengine/engine/camera/hud/controls/BaseOnScreenControl.java @@ -122,8 +122,8 @@ public void refreshControlKnobPosition() { } /** - * When the touch happened outside of the bounds of this OnScreenControl. - * */ + * When the touch happened outside of the bounds of this OnScreenControl. + */ protected void onHandleControlBaseLeft() { this.onUpdateControlKnob(0, 0); } diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index de6eeb50e..91e56a532 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -789,10 +789,10 @@ public IEntity getChildByTag(final int pTag) { @Override public IEntity getChildByIndex(final int pIndex) { - if (this.mChildren == null) { - return null; - } - return this.mChildren.get(pIndex); + if (this.mChildren == null) { + return null; + } + return this.mChildren.get(pIndex); } @Override diff --git a/src/org/andengine/entity/scene/Scene.java b/src/org/andengine/entity/scene/Scene.java index 70f2b2240..df8594c69 100644 --- a/src/org/andengine/entity/scene/Scene.java +++ b/src/org/andengine/entity/scene/Scene.java @@ -97,7 +97,7 @@ public boolean isBackgroundEnabled() { } public void setBackgroundEnabled(final boolean pEnabled) { - this.mBackgroundEnabled = pEnabled; + this.mBackgroundEnabled = pEnabled; } public void setOnSceneTouchListener(final IOnSceneTouchListener pOnSceneTouchListener) { @@ -356,7 +356,7 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, touchArea); if (handled != null && handled) { /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, - * bind this ITouchArea to the PointerID. */ + * bind this ITouchArea to the PointerID. */ if ((this.mTouchAreaBindingOnActionDownEnabled && isActionDown) || (this.mTouchAreaBindingOnActionMoveEnabled && isActionMove)) { this.mTouchAreaBindings.put(pSceneTouchEvent.getPointerID(), touchArea); } @@ -371,7 +371,7 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { final Boolean handled = this.onAreaTouchEvent(pSceneTouchEvent, sceneTouchEventX, sceneTouchEventY, touchArea); if (handled != null && handled) { /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, - * bind this ITouchArea to the PointerID. */ + * bind this ITouchArea to the PointerID. */ if ((this.mTouchAreaBindingOnActionDownEnabled && isActionDown) || (this.mTouchAreaBindingOnActionMoveEnabled && isActionMove)) { this.mTouchAreaBindings.put(pSceneTouchEvent.getPointerID(), touchArea); } @@ -387,7 +387,7 @@ public boolean onSceneTouchEvent(final TouchEvent pSceneTouchEvent) { final Boolean handled = this.mOnSceneTouchListener.onSceneTouchEvent(this, pSceneTouchEvent); if (handled != null && handled) { /* If binding of ITouchAreas is enabled and this is an ACTION_DOWN event, - * bind the active OnSceneTouchListener to the PointerID. */ + * bind the active OnSceneTouchListener to the PointerID. */ if (this.mOnSceneTouchListenerBindingOnActionDownEnabled && isActionDown) { this.mOnSceneTouchListenerBindings.put(pSceneTouchEvent.getPointerID(), this.mOnSceneTouchListener); } diff --git a/src/org/andengine/entity/sprite/batch/SpriteBatch.java b/src/org/andengine/entity/sprite/batch/SpriteBatch.java index dbc758c1a..c3599725b 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/SpriteBatch.java @@ -665,7 +665,7 @@ protected void add(final ITextureRegion pTextureRegion, final float pWidth, fina pTransformation.transform(SpriteBatch.VERTICES_TMP); - this.addInner(pTextureRegion, SpriteBatch.VERTICES_TMP[0], SpriteBatch.VERTICES_TMP[1], SpriteBatch.VERTICES_TMP[2], SpriteBatch.VERTICES_TMP[3], SpriteBatch.VERTICES_TMP[4], SpriteBatch.VERTICES_TMP[5], SpriteBatch.VERTICES_TMP[6], SpriteBatch.VERTICES_TMP[7], pRed, pGreen, pBlue, pAlpha); + this.addInner(pTextureRegion, SpriteBatch.VERTICES_TMP[0], SpriteBatch.VERTICES_TMP[1], SpriteBatch.VERTICES_TMP[2], SpriteBatch.VERTICES_TMP[3], SpriteBatch.VERTICES_TMP[4], SpriteBatch.VERTICES_TMP[5], SpriteBatch.VERTICES_TMP[6], SpriteBatch.VERTICES_TMP[7], pRed, pGreen, pBlue, pAlpha); } /** @@ -690,7 +690,7 @@ protected void addWithPackedColor(final ITextureRegion pTextureRegion, final flo pTransformation.transform(SpriteBatch.VERTICES_TMP); - this.mSpriteBatchVertexBufferObject.addWithPackedColor(pTextureRegion, SpriteBatch.VERTICES_TMP[0], SpriteBatch.VERTICES_TMP[1], SpriteBatch.VERTICES_TMP[2], SpriteBatch.VERTICES_TMP[3], SpriteBatch.VERTICES_TMP[4], SpriteBatch.VERTICES_TMP[5], SpriteBatch.VERTICES_TMP[6], SpriteBatch.VERTICES_TMP[7], pColorABGRPackedInt); + this.mSpriteBatchVertexBufferObject.addWithPackedColor(pTextureRegion, SpriteBatch.VERTICES_TMP[0], SpriteBatch.VERTICES_TMP[1], SpriteBatch.VERTICES_TMP[2], SpriteBatch.VERTICES_TMP[3], SpriteBatch.VERTICES_TMP[4], SpriteBatch.VERTICES_TMP[5], SpriteBatch.VERTICES_TMP[6], SpriteBatch.VERTICES_TMP[7], pColorABGRPackedInt); } /** diff --git a/src/org/andengine/input/sensor/acceleration/AccelerationData.java b/src/org/andengine/input/sensor/acceleration/AccelerationData.java index 88d0d2b6c..47fc7e784 100644 --- a/src/org/andengine/input/sensor/acceleration/AccelerationData.java +++ b/src/org/andengine/input/sensor/acceleration/AccelerationData.java @@ -100,7 +100,7 @@ public void setY(final float pY) { } public void setZ(final float pZ) { - this.mValues[SensorManager.DATA_Z] = pZ; + this.mValues[SensorManager.DATA_Z] = pZ; } @Override diff --git a/src/org/andengine/input/touch/controller/BaseTouchController.java b/src/org/andengine/input/touch/controller/BaseTouchController.java index 628086ce1..0fdbbf441 100644 --- a/src/org/andengine/input/touch/controller/BaseTouchController.java +++ b/src/org/andengine/input/touch/controller/BaseTouchController.java @@ -13,7 +13,7 @@ * @author Nicolas Gramlich * @since 21:06:40 - 13.07.2010 */ -public abstract class BaseTouchController implements ITouchController { +public abstract class BaseTouchController implements ITouchController { // =========================================================== // Constants // =========================================================== diff --git a/src/org/andengine/input/touch/detector/HoldDetector.java b/src/org/andengine/input/touch/detector/HoldDetector.java index 46787d572..b8b8add13 100644 --- a/src/org/andengine/input/touch/detector/HoldDetector.java +++ b/src/org/andengine/input/touch/detector/HoldDetector.java @@ -129,7 +129,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { this.triggerOnHold(holdTimeMilliseconds); } else { final float triggerHoldMaximumDistance = this.mTriggerHoldMaximumDistance; - this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; + this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; if (!this.mMaximumDistanceExceeded) { if (!this.mTriggering) { @@ -158,7 +158,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { this.triggerOnHoldFinished(holdTimeMilliseconds); } else { final float triggerHoldMaximumDistance = this.mTriggerHoldMaximumDistance; - this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; + this.mMaximumDistanceExceeded = this.mMaximumDistanceExceeded || Math.abs(this.mDownX - motionEvent.getX()) > triggerHoldMaximumDistance || Math.abs(this.mDownY - motionEvent.getY()) > triggerHoldMaximumDistance; if (!this.mMaximumDistanceExceeded) { this.triggerOnHoldFinished(holdTimeMilliseconds); diff --git a/src/org/andengine/input/touch/detector/PinchZoomDetector.java b/src/org/andengine/input/touch/detector/PinchZoomDetector.java index 9a1065dba..14e9214c2 100644 --- a/src/org/andengine/input/touch/detector/PinchZoomDetector.java +++ b/src/org/andengine/input/touch/detector/PinchZoomDetector.java @@ -72,7 +72,7 @@ public boolean onManagedTouchEvent(final TouchEvent pSceneTouchEvent) { switch (action) { case MotionEvent.ACTION_POINTER_DOWN: - if (!this.mPinchZooming && PinchZoomDetector.hasTwoOrMorePointers(motionEvent)) { + if (!this.mPinchZooming && PinchZoomDetector.hasTwoOrMorePointers(motionEvent)) { this.mInitialDistance = PinchZoomDetector.calculatePointerDistance(motionEvent); this.mCurrentDistance = this.mInitialDistance; if (this.mInitialDistance > PinchZoomDetector.TRIGGER_PINCHZOOM_MINIMUM_DISTANCE_DEFAULT) { diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java index caa67ad49..225b30b19 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BuildableBitmapTextureAtlas.java @@ -35,7 +35,7 @@ public BuildableBitmapTextureAtlas(final TextureManager pTextureManager, final i } /** - * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. + * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. */ public BuildableBitmapTextureAtlas(final TextureManager pTextureManager, final int pWidth, final int pHeight, final BitmapTextureFormat pBitmapTextureFormat) { this(pTextureManager, pWidth, pHeight, pBitmapTextureFormat, TextureOptions.DEFAULT, null); @@ -51,7 +51,7 @@ public BuildableBitmapTextureAtlas(final TextureManager pTextureManager, final i } /** - * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. + * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. * @param pTextureStateListener to be informed when this {@link BitmapTextureAtlas} is loaded, unloaded or a {@link ITextureAtlasSource} failed to load. */ public BuildableBitmapTextureAtlas(final TextureManager pTextureManager, final int pWidth, final int pHeight, final BitmapTextureFormat pBitmapTextureFormat, final ITextureAtlasStateListener pTextureStateListener) { @@ -68,7 +68,7 @@ public BuildableBitmapTextureAtlas(final TextureManager pTextureManager, final i } /** - * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. + * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. * @param pTextureOptions the (quality) settings of the BitmapTexture. */ public BuildableBitmapTextureAtlas(final TextureManager pTextureManager, final int pWidth, final int pHeight, final BitmapTextureFormat pBitmapTextureFormat, final TextureOptions pTextureOptions) throws IllegalArgumentException { @@ -86,7 +86,7 @@ public BuildableBitmapTextureAtlas(final TextureManager pTextureManager, final i } /** - * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. + * @param pBitmapTextureFormat use {@link BitmapTextureFormat#RGBA_8888} or {@link BitmapTextureFormat#RGBA_4444} for a {@link BitmapTextureAtlas} with transparency and {@link BitmapTextureFormat#RGB_565} for a {@link BitmapTextureAtlas} without transparency. * @param pTextureOptions the (quality) settings of the BitmapTexture. * @param pTextureStateListener to be informed when this {@link BitmapTextureAtlas} is loaded, unloaded or a {@link ITextureAtlasSource} failed to load. */ diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java index 79930b743..cf7aaabf6 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/source/decorator/RadialGradientFillBitmapTextureAtlasSourceDecorator.java @@ -42,7 +42,7 @@ public RadialGradientFillBitmapTextureAtlasSourceDecorator(final IBitmapTextureA this(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, new int[] { pFromColor, pToColor }, POSITIONS_DEFAULT, pRadialGradientDirection, pTextureAtlasSourceDecoratorOptions); } - public RadialGradientFillBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final int[] pColors, final float[] pPositions, final RadialGradientDirection pRadialGradientDirection) { + public RadialGradientFillBitmapTextureAtlasSourceDecorator(final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final IBitmapTextureAtlasSourceDecoratorShape pBitmapTextureAtlasSourceDecoratorShape, final int[] pColors, final float[] pPositions, final RadialGradientDirection pRadialGradientDirection) { this(pBitmapTextureAtlasSource, pBitmapTextureAtlasSourceDecoratorShape, pColors, pPositions, pRadialGradientDirection, null); } diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index c0d38e44e..84324b5b7 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -532,7 +532,7 @@ public void blendFunction(final int pSourceBlendMode, final int pDestinationBlen } public void lineWidth(final float pLineWidth) { - if (this.mLineWidth != pLineWidth) { + if (this.mLineWidth != pLineWidth) { this.mLineWidth = pLineWidth; GLES20.glLineWidth(pLineWidth); } diff --git a/src/org/andengine/ui/activity/BaseGameActivity.java b/src/org/andengine/ui/activity/BaseGameActivity.java index 55f0b33a0..480dd9f7a 100644 --- a/src/org/andengine/ui/activity/BaseGameActivity.java +++ b/src/org/andengine/ui/activity/BaseGameActivity.java @@ -117,7 +117,7 @@ public synchronized void onSurfaceCreated(final GLState pGLState) { @Override public synchronized void onSurfaceChanged(final GLState pGLState, final int pWidth, final int pHeight) { if (BuildConfig.DEBUG) { - Debug.d(this.getClass().getSimpleName() + ".onSurfaceChanged(Width=" + pWidth + ", Height=" + pHeight + ")" + " @(Thread: '" + Thread.currentThread().getName() + "')"); + Debug.d(this.getClass().getSimpleName() + ".onSurfaceChanged(Width=" + pWidth + ", Height=" + pHeight + ")" + " @(Thread: '" + Thread.currentThread().getName() + "')"); } } diff --git a/src/org/andengine/util/adt/data/operator/ByteOperator.java b/src/org/andengine/util/adt/data/operator/ByteOperator.java index ff5649844..c6c50a290 100644 --- a/src/org/andengine/util/adt/data/operator/ByteOperator.java +++ b/src/org/andengine/util/adt/data/operator/ByteOperator.java @@ -17,31 +17,31 @@ public boolean check(final byte pByteA, final byte pByteB) { return pByteA == pByteB; } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final byte pByteA, final byte pByteB) { return pByteA != pByteB; } }, - LESS_THAN() { + LESS_THAN() { @Override public boolean check(final byte pByteA, final byte pByteB) { return pByteA < pByteB; } }, - LESS_OR_EQUAL_THAN() { + LESS_OR_EQUAL_THAN() { @Override public boolean check(final byte pByteA, final byte pByteB) { return pByteA <= pByteB; } }, - MORE_THAN() { + MORE_THAN() { @Override public boolean check(final byte pByteA, final byte pByteB) { return pByteA > pByteB; } }, - MORE_OR_EQUAL_THAN() { + MORE_OR_EQUAL_THAN() { @Override public boolean check(final byte pByteA, final byte pByteB) { return pByteA >= pByteB; diff --git a/src/org/andengine/util/adt/data/operator/CharOperator.java b/src/org/andengine/util/adt/data/operator/CharOperator.java index 9d301ceb6..3eb9041c6 100644 --- a/src/org/andengine/util/adt/data/operator/CharOperator.java +++ b/src/org/andengine/util/adt/data/operator/CharOperator.java @@ -17,31 +17,31 @@ public boolean check(final char pCharA, final char pCharB) { return pCharA == pCharB; } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final char pCharA, final char pCharB) { return pCharA != pCharB; } }, - LESS_THAN() { + LESS_THAN() { @Override public boolean check(final char pCharA, final char pCharB) { return pCharA < pCharB; } }, - LESS_OR_EQUAL_THAN() { + LESS_OR_EQUAL_THAN() { @Override public boolean check(final char pCharA, final char pCharB) { return pCharA <= pCharB; } }, - MORE_THAN() { + MORE_THAN() { @Override public boolean check(final char pCharA, final char pCharB) { return pCharA > pCharB; } }, - MORE_OR_EQUAL_THAN() { + MORE_OR_EQUAL_THAN() { @Override public boolean check(final char pCharA, final char pCharB) { return pCharA >= pCharB; diff --git a/src/org/andengine/util/adt/data/operator/DoubleOperator.java b/src/org/andengine/util/adt/data/operator/DoubleOperator.java index a566fec97..7ef30bf2a 100644 --- a/src/org/andengine/util/adt/data/operator/DoubleOperator.java +++ b/src/org/andengine/util/adt/data/operator/DoubleOperator.java @@ -17,31 +17,31 @@ public boolean check(final double pDoubleA, final double pDoubleB) { return pDoubleA == pDoubleB; } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final double pDoubleA, final double pDoubleB) { return pDoubleA != pDoubleB; } }, - LESS_THAN() { + LESS_THAN() { @Override public boolean check(final double pDoubleA, final double pDoubleB) { return pDoubleA < pDoubleB; } }, - LESS_OR_EQUAL_THAN() { + LESS_OR_EQUAL_THAN() { @Override public boolean check(final double pDoubleA, final double pDoubleB) { return pDoubleA <= pDoubleB; } }, - MORE_THAN() { + MORE_THAN() { @Override public boolean check(final double pDoubleA, final double pDoubleB) { return pDoubleA > pDoubleB; } }, - MORE_OR_EQUAL_THAN() { + MORE_OR_EQUAL_THAN() { @Override public boolean check(final double pDoubleA, final double pDoubleB) { return pDoubleA >= pDoubleB; diff --git a/src/org/andengine/util/adt/data/operator/FloatOperator.java b/src/org/andengine/util/adt/data/operator/FloatOperator.java index 0f5504405..449c41135 100644 --- a/src/org/andengine/util/adt/data/operator/FloatOperator.java +++ b/src/org/andengine/util/adt/data/operator/FloatOperator.java @@ -17,31 +17,31 @@ public boolean check(final float pFloatA, final float pFloatB) { return pFloatA == pFloatB; } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final float pFloatA, final float pFloatB) { return pFloatA != pFloatB; } }, - LESS_THAN() { + LESS_THAN() { @Override public boolean check(final float pFloatA, final float pFloatB) { return pFloatA < pFloatB; } }, - LESS_OR_EQUAL_THAN() { + LESS_OR_EQUAL_THAN() { @Override public boolean check(final float pFloatA, final float pFloatB) { return pFloatA <= pFloatB; } }, - MORE_THAN() { + MORE_THAN() { @Override public boolean check(final float pFloatA, final float pFloatB) { return pFloatA > pFloatB; } }, - MORE_OR_EQUAL_THAN() { + MORE_OR_EQUAL_THAN() { @Override public boolean check(final float pFloatA, final float pFloatB) { return pFloatA >= pFloatB; diff --git a/src/org/andengine/util/adt/data/operator/IntOperator.java b/src/org/andengine/util/adt/data/operator/IntOperator.java index d37d3ec81..182673d96 100644 --- a/src/org/andengine/util/adt/data/operator/IntOperator.java +++ b/src/org/andengine/util/adt/data/operator/IntOperator.java @@ -17,31 +17,31 @@ public boolean check(final int pIntA, final int pIntB) { return pIntA == pIntB; } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final int pIntA, final int pIntB) { return pIntA != pIntB; } }, - LESS_THAN() { + LESS_THAN() { @Override public boolean check(final int pIntA, final int pIntB) { return pIntA < pIntB; } }, - LESS_OR_EQUAL_THAN() { + LESS_OR_EQUAL_THAN() { @Override public boolean check(final int pIntA, final int pIntB) { return pIntA <= pIntB; } }, - MORE_THAN() { + MORE_THAN() { @Override public boolean check(final int pIntA, final int pIntB) { return pIntA > pIntB; } }, - MORE_OR_EQUAL_THAN() { + MORE_OR_EQUAL_THAN() { @Override public boolean check(final int pIntA, final int pIntB) { return pIntA >= pIntB; diff --git a/src/org/andengine/util/adt/data/operator/LongOperator.java b/src/org/andengine/util/adt/data/operator/LongOperator.java index d85ec127d..159309481 100644 --- a/src/org/andengine/util/adt/data/operator/LongOperator.java +++ b/src/org/andengine/util/adt/data/operator/LongOperator.java @@ -17,31 +17,31 @@ public boolean check(final long pLongA, final long pLongB) { return pLongA == pLongB; } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final long pLongA, final long pLongB) { return pLongA != pLongB; } }, - LESS_THAN() { + LESS_THAN() { @Override public boolean check(final long pLongA, final long pLongB) { return pLongA < pLongB; } }, - LESS_OR_EQUAL_THAN() { + LESS_OR_EQUAL_THAN() { @Override public boolean check(final long pLongA, final long pLongB) { return pLongA <= pLongB; } }, - MORE_THAN() { + MORE_THAN() { @Override public boolean check(final long pLongA, final long pLongB) { return pLongA > pLongB; } }, - MORE_OR_EQUAL_THAN() { + MORE_OR_EQUAL_THAN() { @Override public boolean check(final long pLongA, final long pLongB) { return pLongA >= pLongB; diff --git a/src/org/andengine/util/adt/data/operator/ShortOperator.java b/src/org/andengine/util/adt/data/operator/ShortOperator.java index 401a2036a..630f23ff1 100644 --- a/src/org/andengine/util/adt/data/operator/ShortOperator.java +++ b/src/org/andengine/util/adt/data/operator/ShortOperator.java @@ -17,31 +17,31 @@ public boolean check(final short pShortA, final short pShortB) { return pShortA == pShortB; } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final short pShortA, final short pShortB) { return pShortA != pShortB; } }, - LESS_THAN() { + LESS_THAN() { @Override public boolean check(final short pShortA, final short pShortB) { return pShortA < pShortB; } }, - LESS_OR_EQUAL_THAN() { + LESS_OR_EQUAL_THAN() { @Override public boolean check(final short pShortA, final short pShortB) { return pShortA <= pShortB; } }, - MORE_THAN() { + MORE_THAN() { @Override public boolean check(final short pShortA, final short pShortB) { return pShortA > pShortB; } }, - MORE_OR_EQUAL_THAN() { + MORE_OR_EQUAL_THAN() { @Override public boolean check(final short pShortA, final short pShortB) { return pShortA >= pShortB; diff --git a/src/org/andengine/util/adt/data/operator/StringOperator.java b/src/org/andengine/util/adt/data/operator/StringOperator.java index f618d937b..9134ab08b 100644 --- a/src/org/andengine/util/adt/data/operator/StringOperator.java +++ b/src/org/andengine/util/adt/data/operator/StringOperator.java @@ -23,13 +23,13 @@ public boolean check(final String pStringA, final String pStringB) { return pStringA.equalsIgnoreCase(pStringB); } }, - NOT_EQUALS() { + NOT_EQUALS() { @Override public boolean check(final String pStringA, final String pStringB) { return !pStringA.equals(pStringB); } }, - NOT_EQUALS_IGNORE_CASE() { + NOT_EQUALS_IGNORE_CASE() { @Override public boolean check(final String pStringA, final String pStringB) { return !pStringA.equalsIgnoreCase(pStringB); diff --git a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java index 139f584a7..c75b4fc83 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java @@ -339,7 +339,7 @@ private int getYMin(final BoundsSplit pBoundsSplit) { switch (pBoundsSplit) { case TOP_LEFT: case TOP_RIGHT: - return this.mYMin; + return this.mYMin; case BOTTOM_LEFT: case BOTTOM_RIGHT: throw new BoundsSplitException(); @@ -349,7 +349,7 @@ private int getYMin(final BoundsSplit pBoundsSplit) { } else { switch (pBoundsSplit) { case TOP_LEFT: - return this.mYMin; + return this.mYMin; case TOP_RIGHT: return this.mYMin; case BOTTOM_LEFT: diff --git a/src/org/andengine/util/algorithm/path/IPathFinder.java b/src/org/andengine/util/algorithm/path/IPathFinder.java index 8333ab2c5..c55ca11c2 100644 --- a/src/org/andengine/util/algorithm/path/IPathFinder.java +++ b/src/org/andengine/util/algorithm/path/IPathFinder.java @@ -22,9 +22,9 @@ public interface IPathFinder { public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, final int pYMin, final int pXMax, final int pYMax, final T pEntity, final int pFromX, final int pFromY, final int pToX, final int pToY, final boolean pAllowDiagonal, final IAStarHeuristic pAStarHeuristic, final ICostFunction pCostFunction, final float pMaxCost); public Path findPath(final IPathFinderMap pPathFinderMap, final int pXMin, final int pYMin, final int pXMax, final int pYMax, final T pEntity, final int pFromX, final int pFromY, final int pToX, final int pToY, final boolean pAllowDiagonal, final IAStarHeuristic pAStarHeuristic, final ICostFunction pCostFunction, final float pMaxCost, final IPathFinderListener pPathFinderListener); - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== public interface IPathFinderListener { // =========================================================== From 84bd9eced8373e92871a377429691217e8aee2ab Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 01:14:52 -0700 Subject: [PATCH 162/252] Added methods to get meta-data from the AndroidManifest to SystemUtils. --- .../andengine/util/system/SystemUtils.java | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index 5019f2875..4479fe68a 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -12,10 +12,13 @@ import org.andengine.util.exception.MethodNotFoundException; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.graphics.Color; import android.os.Build; +import android.os.Bundle; import android.os.Debug; import android.os.Debug.MemoryInfo; @@ -103,17 +106,28 @@ public static String getPackageName(final Context pContext) { } public static String getApkFilePath(final Context pContext) throws SystemUtilsException { - final PackageManager packMgmr = pContext.getPackageManager(); + return SystemUtils.getApplicationInfo(pContext, 0).sourceDir; + } + + public static ApplicationInfo getApplicationInfo(final Context pContext) throws SystemUtilsException { + return SystemUtils.getApplicationInfo(pContext, 0); + } + + public static ApplicationInfo getApplicationInfo(final Context pContext, final int pFlags) throws SystemUtilsException { try { - return packMgmr.getApplicationInfo(SystemUtils.getPackageName(pContext), 0).sourceDir; + return pContext.getPackageManager().getApplicationInfo(pContext.getPackageName(), pFlags); } catch (final NameNotFoundException e) { throw new SystemUtilsException(e); } } - private static PackageInfo getPackageInfo(final Context pContext) throws SystemUtilsException { + public static PackageInfo getPackageInfo(final Context pContext) throws SystemUtilsException { + return SystemUtils.getPackageInfo(pContext, 0); + } + + public static PackageInfo getPackageInfo(final Context pContext, final int pFlags) throws SystemUtilsException { try { - return pContext.getPackageManager().getPackageInfo(pContext.getPackageName(), 0); + return pContext.getPackageManager().getPackageInfo(pContext.getPackageName(), pFlags); } catch (final NameNotFoundException e) { throw new SystemUtilsException(e); } @@ -141,11 +155,45 @@ public static boolean hasSystemFeature(final Context pContext, final String pFea public static boolean hasSystemFeature(final Context pContext, final String pFeature, final boolean pDefault) { try { return SystemUtils.hasSystemFeature(pContext, pFeature); - } catch (SystemUtilsException e) { + } catch (final SystemUtilsException e) { return pDefault; } } + public static boolean getMetaDataBoolean(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return bundle.getBoolean(pKey); + } + + public static int getMetaDataInt(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return bundle.getInt(pKey); + } + + public static String getMetaDataFloat(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return bundle.getString(pKey); + } + + public static String getMetaDataString(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return bundle.getString(pKey); + } + + public static int getMetaDataColor(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return Color.parseColor(bundle.getString(pKey)); + } + + public static Bundle getMetaData(final Context pContext) throws SystemUtilsException { + try { + final ApplicationInfo applicationInfo = SystemUtils.getApplicationInfo(pContext, PackageManager.GET_META_DATA); + return applicationInfo.metaData; + } catch (final Throwable t) { + throw new SystemUtilsException(t); + } + } + /** * @param pBuildVersionCode taken from {@link Build.VERSION_CODES}. */ From 5a93990a72bc462f6fb3d7657d35757e6592f969 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 01:26:10 -0700 Subject: [PATCH 163/252] Fixed SystemUtils.getMetaDataFloat not actually returning a float. --- src/org/andengine/util/system/SystemUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index 4479fe68a..5c3c7f1c7 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -170,9 +170,9 @@ public static int getMetaDataInt(final Context pContext, final String pKey) thro return bundle.getInt(pKey); } - public static String getMetaDataFloat(final Context pContext, final String pKey) throws SystemUtilsException { + public static float getMetaDataFloat(final Context pContext, final String pKey) throws SystemUtilsException { final Bundle bundle = SystemUtils.getMetaData(pContext); - return bundle.getString(pKey); + return bundle.getFloat(pKey); } public static String getMetaDataString(final Context pContext, final String pKey) throws SystemUtilsException { From 0c01ef8af29b45cd73bb6f46f5dc34e81c8c4eae Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 14:59:30 -0700 Subject: [PATCH 164/252] Added ArrayUtils.isEmpty(Object[]). --- src/org/andengine/util/adt/array/ArrayUtils.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java index af45a8f81..6ab6d4d0c 100644 --- a/src/org/andengine/util/adt/array/ArrayUtils.java +++ b/src/org/andengine/util/adt/array/ArrayUtils.java @@ -507,6 +507,19 @@ public static T[] filter(final T[] pArray, final Class pClass, final IM return filteredArray; } + public static boolean isEmpty(final Object[] pRecipients) { + if (pRecipients == null) { + return true; + } else { + for (int i = pRecipients.length - 1; i >= 0; i--) { + if (pRecipients[i] != null) { + return false; + } + } + return true; + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From afb62ad1a4f5c209dd797678f4fed862f1e66b00 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 15:02:03 -0700 Subject: [PATCH 165/252] Aded TextUtils.isEmpty(CharSequence[]). --- src/org/andengine/util/TextUtils.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java index 1a6882d5d..a6fc8b403 100644 --- a/src/org/andengine/util/TextUtils.java +++ b/src/org/andengine/util/TextUtils.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.regex.Pattern; +import org.andengine.util.adt.array.ArrayUtils; + /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. @@ -172,6 +174,22 @@ public static int countCharacters(final List pTexts, final boolean return characters; } + /** + * As opposed to {@link ArrayUtils#isEmpty(Object[])}, this method performs a {@link android.text.TextUtils#isEmpty(String)} check on all elements of the array. + */ + public static boolean isEmpty(final CharSequence[] pTexts) { + if (pTexts == null) { + return true; + } else { + for (int i = pTexts.length - 1; i >= 0; i--) { + if (!android.text.TextUtils.isEmpty(pTexts[i])) { + return false; + } + } + return true; + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From d746636773d9ea97576daf0a526c2aef1d51668c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 15:02:19 -0700 Subject: [PATCH 166/252] Minor change. --- src/org/andengine/util/adt/array/ArrayUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/util/adt/array/ArrayUtils.java b/src/org/andengine/util/adt/array/ArrayUtils.java index 6ab6d4d0c..4f62cd5a8 100644 --- a/src/org/andengine/util/adt/array/ArrayUtils.java +++ b/src/org/andengine/util/adt/array/ArrayUtils.java @@ -507,12 +507,12 @@ public static T[] filter(final T[] pArray, final Class pClass, final IM return filteredArray; } - public static boolean isEmpty(final Object[] pRecipients) { - if (pRecipients == null) { + public static boolean isEmpty(final Object[] pArray) { + if (pArray == null) { return true; } else { - for (int i = pRecipients.length - 1; i >= 0; i--) { - if (pRecipients[i] != null) { + for (int i = pArray.length - 1; i >= 0; i--) { + if (pArray[i] != null) { return false; } } From 522cad7a836a68a931d685edce2d7398a2c434d6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 15:02:55 -0700 Subject: [PATCH 167/252] Added IntentUtils. --- src/org/andengine/util/IntentUtils.java | 52 +++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/org/andengine/util/IntentUtils.java diff --git a/src/org/andengine/util/IntentUtils.java b/src/org/andengine/util/IntentUtils.java new file mode 100644 index 000000000..056303d41 --- /dev/null +++ b/src/org/andengine/util/IntentUtils.java @@ -0,0 +1,52 @@ +package org.andengine.util; + +import java.util.List; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.ResolveInfo; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 12:30:32 - 14.04.2013 + */ +public final class IntentUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private IntentUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static boolean isIntentResolvable(final Context pContext, final Intent pIntent) { + final List resolveInfo = pContext.getPackageManager().queryIntentActivities(pIntent, 0); + return (resolveInfo != null) && !resolveInfo.isEmpty(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 7a6aa49bb86e4682735e3233cc3fd021bb96c65c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 16:23:06 -0700 Subject: [PATCH 168/252] Added MailUtils. --- src/org/andengine/util/MailUtils.java | 106 ++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/org/andengine/util/MailUtils.java diff --git a/src/org/andengine/util/MailUtils.java b/src/org/andengine/util/MailUtils.java new file mode 100644 index 000000000..a07724518 --- /dev/null +++ b/src/org/andengine/util/MailUtils.java @@ -0,0 +1,106 @@ +package org.andengine.util; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.text.TextUtils; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 14:34:09 - 14.04.2013 + */ +public final class MailUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private MailUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static void sendMail(final Context pContext, final int pIntentChooserTitleResID, final String [] pRecipients, final int pSubjectResID, final int pBodyResID) { + final String intentChooserTitle = pContext.getString(pIntentChooserTitleResID); + final String subject = pContext.getString(pSubjectResID); + final String body = pContext.getString(pBodyResID); + MailUtils.sendMail(pContext, intentChooserTitle, pRecipients, subject, body); + } + + public static void sendMail(final Context pContext, final String pIntentChooserTitle, final String [] pRecipients, final String pSubject, final String pBody) { + final Intent sendMailIntent = MailUtils.getSendMailIntent(pContext, pRecipients, pSubject, pBody); + + pContext.startActivity(Intent.createChooser(sendMailIntent, pIntentChooserTitle)); + } + + public static Intent getSendMailIntent(final Context pContext, final String [] pRecipients, final String pSubject, final String pBody) { + /* Attempt using ACTION_SENDTO: */ + final Intent sendToIntent = new Intent(Intent.ACTION_SENDTO); + + final StringBuilder sendToUriStringBuilder = new StringBuilder(); + sendToUriStringBuilder.append("mailto:"); + if (!org.andengine.util.TextUtils.isEmpty(pRecipients)) { + final String recipientsString = TextUtils.join(",", pRecipients); + sendToUriStringBuilder.append(Uri.encode(recipientsString)); + } + if (!TextUtils.isEmpty(pSubject)) { + sendToUriStringBuilder.append("?subject=").append(Uri.encode(pSubject)); + } + if (!TextUtils.isEmpty(pBody)) { + if (TextUtils.isEmpty(pSubject)) { + sendToUriStringBuilder.append("?body="); + } else { + sendToUriStringBuilder.append("&body="); + } + sendToUriStringBuilder.append(Uri.encode(pBody)); + } + + final String sendToUriString = sendToUriStringBuilder.toString(); + final Uri sendToUri = Uri.parse(sendToUriString); + sendToIntent.setData(sendToUri); + + if (IntentUtils.isIntentResolvable(pContext, sendToIntent)) { + return sendToIntent; + } else { + /* Fallback using ACTION_SEND: */ + final Intent sendIntent = new Intent(Intent.ACTION_SEND); + + sendIntent.setType("text/plain"); + if (!org.andengine.util.TextUtils.isEmpty(pRecipients)) { + sendIntent.putExtra(Intent.EXTRA_EMAIL, pRecipients); + } + if (!TextUtils.isEmpty(pSubject)) { + sendIntent.putExtra(Intent.EXTRA_SUBJECT, pSubject); + } + if (!TextUtils.isEmpty(pBody)) { + sendIntent.putExtra(Intent.EXTRA_TEXT, pBody); + } + + return sendIntent; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 1acf95247cace88a6571af9057df3c8b557391b2 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Apr 2013 18:36:46 -0700 Subject: [PATCH 169/252] Fixed SecureSharedPreferences not encrypting the keys when being read from. --- .../preferences/SecureSharedPreferences.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/org/andengine/util/preferences/SecureSharedPreferences.java b/src/org/andengine/util/preferences/SecureSharedPreferences.java index a0a25805c..44d2f363b 100644 --- a/src/org/andengine/util/preferences/SecureSharedPreferences.java +++ b/src/org/andengine/util/preferences/SecureSharedPreferences.java @@ -94,51 +94,61 @@ public Editor edit() { @Override public boolean getBoolean(final String pKey, final boolean pDefaultValue) { - final String value = this.mDelegate.getString(pKey, null); + final String encryptedKey = this.encryptKey(pKey); + final String value = this.mDelegate.getString(encryptedKey, null); if (value == null) { return pDefaultValue; } else { - return Boolean.parseBoolean(this.decryptValue(value)); + final String decryptedValue = this.decryptValue(value); + return Boolean.parseBoolean(decryptedValue); } } @Override public int getInt(final String pKey, final int pDefaultValue) { - final String value = this.mDelegate.getString(pKey, null); + final String encryptedKey = this.encryptKey(pKey); + final String value = this.mDelegate.getString(encryptedKey, null); if (value == null) { return pDefaultValue; } else { - return Integer.parseInt(this.decryptValue(value)); + final String decryptedValue = this.decryptValue(value); + return Integer.parseInt(decryptedValue); } } @Override public long getLong(final String pKey, final long pDefaultValue) { - final String value = this.mDelegate.getString(pKey, null); + final String encryptedKey = this.encryptKey(pKey); + final String value = this.mDelegate.getString(encryptedKey, null); if (value == null) { return pDefaultValue; } else { - return Long.parseLong(this.decryptValue(value)); + final String decryptedValue = this.decryptValue(value); + return Long.parseLong(decryptedValue); } } @Override public float getFloat(final String pKey, final float pDefaultValue) { - final String value = this.mDelegate.getString(pKey, null); + final String encryptedKey = this.encryptKey(pKey); + final String value = this.mDelegate.getString(encryptedKey, null); if (value == null) { return pDefaultValue; } else { - return Float.parseFloat(this.decryptValue(value)); + final String decryptedValue = this.decryptValue(value); + return Float.parseFloat(decryptedValue); } } @Override public String getString(final String pKey, final String pDefaultValue) { - final String value = this.mDelegate.getString(pKey, null); + final String encryptedKey = this.encryptKey(pKey); + final String value = this.mDelegate.getString(encryptedKey, null); if (value == null) { return pDefaultValue; } else { - return this.decryptValue(value); + final String decryptedValue = this.decryptValue(value); + return decryptedValue; } } From 6517d0aad6d50d32373c28f1ca40281b89c63f30 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 15 Apr 2013 17:07:41 -0700 Subject: [PATCH 170/252] Added WifiUtils.getWifiHotspotConfiguration(..). --- src/org/andengine/util/WifiUtils.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 8a31ad936..380dee3a6 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -160,6 +160,21 @@ public static boolean setWifiHostpotEnabled(final Context pContext, final WifiCo } } + public static WifiConfiguration getWifiHotspotConfiguration(final Context pContext) throws WifiUtilsException { + final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); + + try { + final Method WifiManager_getWifiApState = wifiManager.getClass().getMethod("getWifiApConfiguration"); + if (WifiManager_getWifiApState == null) { + throw new WifiUtilsException(new MethodNotFoundException(WifiManager.class.getSimpleName() + ".getWifiApConfiguration()")); + } else { + return (WifiConfiguration)WifiManager_getWifiApState.invoke(wifiManager); + } + } catch (final Throwable t) { + throw new WifiUtilsException(t); + } + } + public static WifiHotspotState getWifiHotspotState(final Context pContext) throws WifiUtilsException { final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); From e9d6504c3618c9a9b0313dbe56fb225c48d6ed14 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 15 Apr 2013 17:13:35 -0700 Subject: [PATCH 171/252] Added WifiUtils.getWifiSSID overloaded method that strips the quotes around the SSID. --- src/org/andengine/util/WifiUtils.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 380dee3a6..273900862 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -78,6 +78,25 @@ public static String getWifiSSID(final Context pContext) { return WifiUtils.getWifiManager(pContext).getConnectionInfo().getSSID(); } + public static String getWifiSSID(final Context pContext, final boolean pStripQuotes) { + final String wifiSSID = WifiUtils.getWifiSSID(pContext); + + if (pStripQuotes) { + final int wifiSSIDLength = wifiSSID.length(); + if (wifiSSIDLength >= 2) { + if (wifiSSID.charAt(0) == '\"' && wifiSSID.charAt(wifiSSIDLength - 1) == '\"') { + return wifiSSID.substring(1, wifiSSIDLength - 1); + } else { + return wifiSSID; + } + } else { + return wifiSSID; + } + } else { + return wifiSSID; + } + } + public static byte[] getWifiIPv4AddressRaw(final Context pContext) { return IPUtils.ipv4AddressToIPAddress(WifiUtils.getWifiManager(pContext).getConnectionInfo().getIpAddress()); } From 282ced631f4c6500b0fa1dcfceaeda99dce4e67a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 15 Apr 2013 17:25:31 -0700 Subject: [PATCH 172/252] Added WifiUtils.getWifiHotspotSSID(). --- src/org/andengine/util/WifiUtils.java | 39 +++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 273900862..9e5ea7940 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -82,16 +82,7 @@ public static String getWifiSSID(final Context pContext, final boolean pStripQuo final String wifiSSID = WifiUtils.getWifiSSID(pContext); if (pStripQuotes) { - final int wifiSSIDLength = wifiSSID.length(); - if (wifiSSIDLength >= 2) { - if (wifiSSID.charAt(0) == '\"' && wifiSSID.charAt(wifiSSIDLength - 1) == '\"') { - return wifiSSID.substring(1, wifiSSIDLength - 1); - } else { - return wifiSSID; - } - } else { - return wifiSSID; - } + return WifiUtils.stripQuotes(wifiSSID); } else { return wifiSSID; } @@ -194,6 +185,20 @@ public static WifiConfiguration getWifiHotspotConfiguration(final Context pConte } } + public static String getWifiHotspotSSID(final Context pContext) throws WifiUtilsException { + return WifiUtils.getWifiHotspotConfiguration(pContext).SSID; + } + + public static String getWifiHotspotSSID(final Context pContext, final boolean pStripQuotes) throws WifiUtilsException { + final String wifiHotspotSSID = WifiUtils.getWifiHotspotSSID(pContext); + + if (pStripQuotes) { + return WifiUtils.stripQuotes(wifiHotspotSSID); + } else { + return wifiHotspotSSID; + } + } + public static WifiHotspotState getWifiHotspotState(final Context pContext) throws WifiUtilsException { final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); @@ -318,7 +323,6 @@ public static void releaseMulticastLock(final MulticastLock pMulticastLock) { } } - public static byte[] getBroadcastIPAddressRaw(final Context pContext) throws WifiException { final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); final DhcpInfo dhcp = wifiManager.getDhcpInfo(); @@ -332,6 +336,19 @@ public static byte[] getBroadcastIPAddressRaw(final Context pContext) throws Wif return broadcastIP; } + private static String stripQuotes(final String pString) { + final int stringLength = pString.length(); + if (stringLength >= 2) { + if (pString.charAt(0) == '\"' && pString.charAt(stringLength - 1) == '\"') { + return pString.substring(1, stringLength - 1); + } else { + return pString; + } + } else { + return pString; + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From ffee11b26785dab982f5576056ff8c83d39ccb6e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 15 Apr 2013 18:38:58 -0700 Subject: [PATCH 173/252] Fixed detection if Wifi hotspot is running. --- src/org/andengine/util/WifiUtils.java | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 9e5ea7940..3d140d1bf 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -216,21 +216,8 @@ public static WifiHotspotState getWifiHotspotState(final Context pContext) throw } } - public static boolean isWifiHotspotRunning() throws WifiException { - try { - final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces(); - while (networkInterfaceEnumeration.hasMoreElements()) { - final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); - final String networkInterfaceName = networkInterface.getName(); - - if (ArrayUtils.contains(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES, networkInterfaceName)) { - return true; - } - } - return false; - } catch (final SocketException e) { - throw new WifiException("Unexpected error!", e); - } + public static boolean isWifiHotspotRunning(final Context pContext) throws WifiUtilsException { + return WifiUtils.getWifiHotspotState(pContext) == WifiHotspotState.ENABLED; } /** @@ -379,15 +366,15 @@ public enum WifiHotspotState { public static WifiHotspotState fromWifiApState(final int pWifiApState) throws WifiException { if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.ICE_CREAM_SANDWICH)) { switch (pWifiApState) { - case 0: + case 10: return DISABLING; - case 1: + case 11: return DISABLED; - case 2: + case 12: return ENABLING; - case 3: + case 13: return ENABLED; - case 4: + case 14: return FAILED; default: throw new WifiException("TODO..."); From 011a22a457d2d5d9119b4b205b3e10e40b43b7c6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 15 Apr 2013 21:49:28 -0700 Subject: [PATCH 174/252] Added SystemUtils.isEmulator(). --- src/org/andengine/util/system/SystemUtils.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index 5c3c7f1c7..590ae2cfc 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -70,6 +70,20 @@ private SystemUtils() { // Methods // =========================================================== + public static boolean isEmulator() { + if (Build.PRODUCT != null && Build.PRODUCT.equals("google_sdk")) { + return true; + } else if (Build.MODEL != null && Build.MODEL.equals("google_sdk")) { + return true; + } else if (Build.BRAND != null && Build.BRAND.startsWith("generic")){ + return true; + } else if (Build.DEVICE != null && Build.DEVICE.startsWith("generic")) { + return true; + } else { + return false; + } + } + public static MemoryInfo getMemoryInfo() { /* Lazy allocation. */ if (SystemUtils.sMemoryInfo == null) { From b8a7ec77905ecb5e77ad7acb75482c55ec178c08 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 15 Apr 2013 21:50:07 -0700 Subject: [PATCH 175/252] Added WifiUtils.getEmulatorIPAddres and WifiUtils.getEmulatorIPAddress. --- src/org/andengine/util/WifiUtils.java | 54 +++++++++++++++++++++++---- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 3d140d1bf..a16e25f21 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -226,13 +226,14 @@ public static boolean isWifiHotspotRunning(final Context pContext) throws WifiUt */ public static byte[] getWifiHotspotIPAddressRaw() throws WifiException { try { + byte[] ipv6Address = null; + final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces(); while (networkInterfaceEnumeration.hasMoreElements()) { final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); final String networkInterfaceName = networkInterface.getName(); if (ArrayUtils.contains(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES, networkInterfaceName)) { - byte[] ipv6Address = null; final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses(); while (inetAddressEnumeration.hasMoreElements()) { final byte[] ipAddress = inetAddressEnumeration.nextElement().getAddress(); @@ -242,14 +243,14 @@ public static byte[] getWifiHotspotIPAddressRaw() throws WifiException { ipv6Address = ipAddress; } } - if (ipv6Address != null) { - return ipv6Address; - } else { - throw new WifiException("No IP bound to '" + Arrays.toString(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES) + "'!"); - } } } - throw new WifiException("No NetworInterface '" + Arrays.toString(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES) + "' found!"); + + if (ipv6Address != null) { + return ipv6Address; + } else { + throw new WifiException("No IP bound to '" + Arrays.toString(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES) + "'!"); + } } catch (final SocketException e) { throw new WifiException("Unexpected error!", e); } @@ -267,6 +268,45 @@ public static boolean isWifiHotspotIPAddressValid() throws WifiException { // TO return !WifiUtils.IP_DEFAULT.equals(WifiUtils.getWifiHotspotIPAddress()); } + public static byte[] getEmulatorIPAddressRaw() throws WifiException { + try { + byte[] ipv6Address = null; + + final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaceEnumeration.hasMoreElements()) { + final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); + final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses(); + while (inetAddressEnumeration.hasMoreElements()) { + final InetAddress inetAddress = inetAddressEnumeration.nextElement(); + if (!inetAddress.isLoopbackAddress()) { + final byte[] ipAddress = inetAddress.getAddress(); + if (ipAddress.length == 4) { // TODO Constant! + return ipAddress; + } else { + ipv6Address = ipAddress; + } + } + } + } + + if (ipv6Address != null) { + return ipv6Address; + } else { + throw new WifiException("No IP found that is not bound to localhost!"); + } + } catch (final SocketException e) { + throw new WifiException("Unexpected error!", e); + } + } + + public static String getEmulatorIPAddress() throws WifiException { + try { + return IPUtils.ipAddressToString(WifiUtils.getEmulatorIPAddressRaw()); + } catch (final UnknownHostException e) { + throw new WifiException("Unexpected error!", e); + } + } + public static boolean isMulticastEnabled(final Context pContext) throws WifiUtilsException { final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); From 76c00ba5166807b5ed83acdfeb2a6d8d042f80e8 Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Thu, 18 Apr 2013 22:37:13 +0200 Subject: [PATCH 176/252] Added onPause() and onResume() to SoundManager This fixes some of the issues where AE-based games are playing sound after leaving the game. --- src/org/andengine/audio/sound/SoundManager.java | 8 ++++++++ src/org/andengine/engine/Engine.java | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/org/andengine/audio/sound/SoundManager.java b/src/org/andengine/audio/sound/SoundManager.java index 1be77d35d..357084447 100644 --- a/src/org/andengine/audio/sound/SoundManager.java +++ b/src/org/andengine/audio/sound/SoundManager.java @@ -96,6 +96,14 @@ public synchronized void onLoadComplete(final SoundPool pSoundPool, final int pS // Methods // =========================================================== + public void onPause() { + this.mSoundPool.autoPause(); + } + + public void onResume() { + this.mSoundPool.autoResume(); + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index 2281bc71f..568fbfad9 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -192,12 +192,18 @@ public synchronized boolean isRunning() { public synchronized void start() { if (!this.mRunning) { this.mLastTick = System.nanoTime(); + if (this.mSoundManager != null) { + this.mSoundManager.onResume(); + } this.mRunning = true; } } public synchronized void stop() { if (this.mRunning) { + if (this.mSoundManager != null) { + this.mSoundManager.onPause(); + } this.mRunning = false; } } From d7088dd51ea1da4f7ead414597da1ace9bbd0ecb Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 21 Apr 2013 19:21:38 -0700 Subject: [PATCH 177/252] Extracted ActivityUtils.showDialogOnUiThread to static DialogUtils.showDialogOnUiThread. --- .../andengine/ui/activity/BaseActivity.java | 14 +++-------- src/org/andengine/util/DialogUtils.java | 23 ++++++++++++++++++- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/org/andengine/ui/activity/BaseActivity.java b/src/org/andengine/ui/activity/BaseActivity.java index 3d0845dad..9a2ed1bdc 100644 --- a/src/org/andengine/ui/activity/BaseActivity.java +++ b/src/org/andengine/ui/activity/BaseActivity.java @@ -1,6 +1,7 @@ package org.andengine.ui.activity; import org.andengine.util.ActivityUtils; +import org.andengine.util.DialogUtils; import org.andengine.util.call.AsyncCallable; import org.andengine.util.call.Callable; import org.andengine.util.call.Callback; @@ -62,21 +63,12 @@ public void run() { @Deprecated public void showDialogOnUiThread(final int pDialogID) { - this.showDialogOnUiThread(pDialogID, null); + DialogUtils.showDialogOnUiThread(this, pDialogID); } @Deprecated public void showDialogOnUiThread(final int pDialogID, final Bundle pBundle) { - if (ActivityUtils.isOnUiThread()) { - this.showDialog(pDialogID, pBundle); - } else { - this.runOnUiThread(new Runnable() { - @Override - public void run() { - BaseActivity.this.showDialog(pDialogID, pBundle); - } - }); - } + DialogUtils.showDialogOnUiThread(this, pDialogID, pBundle); } /** diff --git a/src/org/andengine/util/DialogUtils.java b/src/org/andengine/util/DialogUtils.java index 1a0842eb8..3f00e6630 100644 --- a/src/org/andengine/util/DialogUtils.java +++ b/src/org/andengine/util/DialogUtils.java @@ -1,12 +1,14 @@ package org.andengine.util; +import android.app.Activity; import android.app.Dialog; +import android.os.Bundle; import android.view.WindowManager; /** * (c) 2010 Nicolas Gramlich * (c) 2011 Zynga Inc. - * + * * @author Nicolas Gramlich * @since 13:04:09 - 12.05.2011 */ @@ -43,6 +45,25 @@ public static void keepScreenOn(final Dialog pDialog) { pDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } + @Deprecated + public static void showDialogOnUiThread(final Activity pActivity, final int pDialogID) { + DialogUtils.showDialogOnUiThread(pActivity, pDialogID, null); + } + + @Deprecated + public static void showDialogOnUiThread(final Activity pActivity, final int pDialogID, final Bundle pBundle) { + if (ActivityUtils.isOnUiThread()) { + pActivity.showDialog(pDialogID, pBundle); + } else { + pActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + pActivity.showDialog(pDialogID, pBundle); + } + }); + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From 88f6d4bd020b9820e5d19f3a4b59d403417eb644 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 21 Apr 2013 23:49:59 -0700 Subject: [PATCH 178/252] Making use of MIMEType enum in MailUtils. --- src/org/andengine/util/MailUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/util/MailUtils.java b/src/org/andengine/util/MailUtils.java index a07724518..31a8dbfa4 100644 --- a/src/org/andengine/util/MailUtils.java +++ b/src/org/andengine/util/MailUtils.java @@ -1,5 +1,7 @@ package org.andengine.util; +import org.andengine.util.mime.MIMEType; + import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -85,7 +87,7 @@ public static Intent getSendMailIntent(final Context pContext, final String [] p /* Fallback using ACTION_SEND: */ final Intent sendIntent = new Intent(Intent.ACTION_SEND); - sendIntent.setType("text/plain"); + sendIntent.setType(MIMEType.TEXT.getTypeString()); if (!org.andengine.util.TextUtils.isEmpty(pRecipients)) { sendIntent.putExtra(Intent.EXTRA_EMAIL, pRecipients); } From 404e6798001807be04d4429c3278f01ef8c7fab7 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 23 Apr 2013 00:27:53 -0700 Subject: [PATCH 179/252] Fixed @see javadoc not properly linking URLs. --- .../entity/modifier/CardinalSplineMoveModifier.java | 5 +++-- .../buildable/builder/BlackPawnTextureAtlasBuilder.java | 3 ++- src/org/andengine/opengl/util/BufferUtils.java | 5 +++-- .../util/algorithm/collision/BaseCollisionChecker.java | 2 +- src/org/andengine/util/algorithm/hull/JarvisMarch.java | 3 ++- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java b/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java index 4ea81a4a8..f3e2ccdb2 100644 --- a/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java +++ b/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java @@ -11,8 +11,9 @@ * * @author Nicolas Gramlich * @since 11:47:24 - 20.03.2012 - * @see {@link http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline} - * @see {@link http://algorithmist.wordpress.com/2009/10/06/cardinal-splines-part-4/} + * + * @see en.wikipedia.org/wiki/Cubic_Hermite_spline#Cardinal_spline + * @see algorithmist.wordpress.com/2009/10/06/cardinal-splines-part-4/ */ public class CardinalSplineMoveModifier extends DurationEntityModifier { // =========================================================== diff --git a/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java b/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java index 06533876e..ce9c76cb4 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/builder/BlackPawnTextureAtlasBuilder.java @@ -15,7 +15,8 @@ * @author Nicolas Gramlich * @author Jim Scott (BlackPawn) * @since 16:03:01 - 12.08.2010 - * @see http://www.blackpawn.com/texts/lightmaps/default.html + * + * @see blackpawn.com/texts/lightmaps/default.html */ public class BlackPawnTextureAtlasBuilder> implements ITextureAtlasBuilder { // =========================================================== diff --git a/src/org/andengine/opengl/util/BufferUtils.java b/src/org/andengine/opengl/util/BufferUtils.java index c506b9e0f..64fa68180 100644 --- a/src/org/andengine/opengl/util/BufferUtils.java +++ b/src/org/andengine/opengl/util/BufferUtils.java @@ -12,8 +12,9 @@ * * @author Nicolas Gramlich * @since 23:06:51 - 11.08.2011 - * @see http://code.google.com/p/android/issues/detail?id=11078 - * @see http://code.google.com/p/android/issues/detail?id=16941 + * + * @see Issue 11078 + * @see Issue 16941 */ public class BufferUtils { // =========================================================== diff --git a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java index 87fd9833f..c7c08797f 100644 --- a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java +++ b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java @@ -231,7 +231,7 @@ public static boolean checkContains(final float[] pVertices, final int pVertexCo /** * Works with complex polygons! * - * @see http://alienryderflex.com/polygon/ + * @see alienryderflex.com/polygon/ * * @param pVertices * @param pVertexCount the number of vertices in pVertices diff --git a/src/org/andengine/util/algorithm/hull/JarvisMarch.java b/src/org/andengine/util/algorithm/hull/JarvisMarch.java index 5919beb74..ba0e3ddf7 100644 --- a/src/org/andengine/util/algorithm/hull/JarvisMarch.java +++ b/src/org/andengine/util/algorithm/hull/JarvisMarch.java @@ -16,7 +16,8 @@ * * @author Nicolas Gramlich * @since 14:01:18 - 14.09.2010 - * @see http://www.iti.fh-flensburg.de/lang/algorithmen/geo/ + * + * @see iti.fh-flensburg.de/lang/algorithmen/geo/ */ public class JarvisMarch implements IHullAlgorithm { // =========================================================== From ba050f26262ad7c3816c4d66b82f2a1acfc89a2d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 23 Apr 2013 00:46:50 -0700 Subject: [PATCH 180/252] Added Apache v2 LICENSE.md file. --- LICENSE.md | 176 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..35cfa48aa --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file From a47327bb42f577df15d18eace8290a1d21cdd5aa Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 24 Apr 2013 20:58:11 -0700 Subject: [PATCH 181/252] Added GooglePlayUtils. --- src/org/andengine/util/GooglePlayUtils.java | 82 +++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/org/andengine/util/GooglePlayUtils.java diff --git a/src/org/andengine/util/GooglePlayUtils.java b/src/org/andengine/util/GooglePlayUtils.java new file mode 100644 index 000000000..f0e4d566c --- /dev/null +++ b/src/org/andengine/util/GooglePlayUtils.java @@ -0,0 +1,82 @@ +package org.andengine.util; + +import org.andengine.util.system.SystemUtils; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 20:49:32 - 24.04.2013 + */ +public final class GooglePlayUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private GooglePlayUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static void startGooglePlayActivity(final Context pContext) { + GooglePlayUtils.startGooglePlayActivity(pContext, SystemUtils.getPackageName(pContext)); + } + + public static void startGooglePlayActivity(final Context pContext, final String pPackageName) { + final Intent googlePlayAppIntent = getGooglePlayAppIntent(pPackageName); + if (IntentUtils.isIntentResolvable(pContext, googlePlayAppIntent)) { + pContext.startActivity(googlePlayAppIntent); + } else { + pContext.startActivity(getGooglePlayWebsiteIntent(pPackageName)); + } + } + + public static void startGooglePlayActivityForResult(final Activity pActivity, final int pRequestCode) { + GooglePlayUtils.startGooglePlayActivityForResult(pActivity, SystemUtils.getPackageName(pActivity), pRequestCode); + } + + public static void startGooglePlayActivityForResult(final Activity pActivity, final String pPackageName, final int pRequestCode) { + final Intent googlePlayAppIntent = getGooglePlayAppIntent(pPackageName); + if (IntentUtils.isIntentResolvable(pActivity, googlePlayAppIntent)) { + pActivity.startActivityForResult(googlePlayAppIntent, pRequestCode); + } else { + pActivity.startActivityForResult(getGooglePlayWebsiteIntent(pPackageName), pRequestCode); + } + } + + public static Intent getGooglePlayAppIntent(final String pPackageName) { + return new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + pPackageName)); + } + + public static Intent getGooglePlayWebsiteIntent(final String pPackageName) { + return new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + pPackageName)); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 024238306e8c304f1c586b42166a5b6754ea51ec Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 28 Apr 2013 19:43:03 -0700 Subject: [PATCH 182/252] Made WifiHotspotState inner class static. --- src/org/andengine/util/WifiUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index a16e25f21..458c4b041 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -380,7 +380,7 @@ private static String stripQuotes(final String pString) { // Inner and Anonymous Classes // =========================================================== - public enum WifiHotspotState { + public static enum WifiHotspotState { // =========================================================== // Elements // =========================================================== From b51af1b688780f874219ad6a558b71effa0ce7cb Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 28 Apr 2013 19:44:08 -0700 Subject: [PATCH 183/252] Fix for pre ICS devices also having wifi AP states of > 10. (Note: Not changing the initial condition yet, since it's so far only an assumption.) --- src/org/andengine/util/WifiUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 458c4b041..0ec7127dd 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -432,7 +432,11 @@ public static WifiHotspotState fromWifiApState(final int pWifiApState) throws Wi case 4: return FAILED; default: - throw new WifiException("TODO..."); + if (pWifiApState >= 10) { + return WifiHotspotState.fromWifiApState(pWifiApState - 10); + } else { + throw new WifiException("TODO..."); + } } } } From 5aa7f50e2ab851f1ee4bdb696113f6e878f6775c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 1 May 2013 20:51:20 -0700 Subject: [PATCH 184/252] Added MathUtils.random(int pMax). --- src/org/andengine/util/math/MathUtils.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index caafe45a9..002d02a8c 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -219,6 +219,8 @@ public static final float random(final float pMin, final float pMax) { } /** + * Interval: [pMin, pMax] + * * @param pMin inclusive! * @param pMax inclusive! * @return @@ -227,6 +229,16 @@ public static final int random(final int pMin, final int pMax) { return pMin + MathUtils.RANDOM.nextInt((pMax - pMin) + 1); } + /** + * Interval: [0, pMax) + * + * @param pMax exclusive! + * @return + */ + public static final int random(final int pMax) { + return MathUtils.RANDOM.nextInt(pMax); + } + public static final boolean isPowerOfTwo(final int n) { return ((n != 0) && ((n & (n - 1)) == 0)); } From 31ddc43abd6c71ac62463c61aa2d83d8bf652915 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 1 May 2013 21:40:11 -0700 Subject: [PATCH 185/252] Added IllegalClassNameException. --- .../exception/IllegalClassNameException.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/org/andengine/util/exception/IllegalClassNameException.java diff --git a/src/org/andengine/util/exception/IllegalClassNameException.java b/src/org/andengine/util/exception/IllegalClassNameException.java new file mode 100644 index 000000000..84bf4589a --- /dev/null +++ b/src/org/andengine/util/exception/IllegalClassNameException.java @@ -0,0 +1,57 @@ +package org.andengine.util.exception; + +import org.andengine.util.exception.AndEngineRuntimeException; + +/** + * (c) Nicolas Gramlich 2013 + * + * @author Nicolas Gramlich + * @since 21:33:53 - 01.05.2013 + */ +public class IllegalClassNameException extends AndEngineRuntimeException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 5615299668631505188L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public IllegalClassNameException() { + super(); + } + + public IllegalClassNameException(final String pMessage) { + super(pMessage); + } + + public IllegalClassNameException(final Throwable pThrowable) { + super(pThrowable); + } + + public IllegalClassNameException(final String pMessage, final Throwable pThrowable) { + super(pMessage, pThrowable); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From fac5dfb98b2be0f926be772b6af87118fdc5bbd3 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 1 May 2013 21:40:33 -0700 Subject: [PATCH 186/252] Moved Experiment stuff to AndEngineServerExtension. --- .../andengine/util/experiment/Experiment.java | 59 -- .../util/experiment/ExperimentFactory.java | 125 ----- .../util/experiment/ExperimentManager.java | 517 ------------------ .../util/experiment/IExperimentFactory.java | 26 - .../exception/ExperimentException.java | 57 -- .../ExperimentNotFoundException.java | 55 -- .../exception/ExperimentTypeException.java | 55 -- 7 files changed, 894 deletions(-) delete mode 100644 src/org/andengine/util/experiment/Experiment.java delete mode 100644 src/org/andengine/util/experiment/ExperimentFactory.java delete mode 100644 src/org/andengine/util/experiment/ExperimentManager.java delete mode 100644 src/org/andengine/util/experiment/IExperimentFactory.java delete mode 100644 src/org/andengine/util/experiment/exception/ExperimentException.java delete mode 100644 src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java delete mode 100644 src/org/andengine/util/experiment/exception/ExperimentTypeException.java diff --git a/src/org/andengine/util/experiment/Experiment.java b/src/org/andengine/util/experiment/Experiment.java deleted file mode 100644 index a81470654..000000000 --- a/src/org/andengine/util/experiment/Experiment.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.andengine.util.experiment; - -/** - * (c) 2013 Nicolas Gramlich - * - * @author Nicolas Gramlich - * @since 01:22:34 - 22.03.2013 - */ -public class Experiment { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - private final String mName; - private final Class mType; - private final T mValue; - - // =========================================================== - // Constructors - // =========================================================== - - public Experiment(final String pName, final Class pType, final T pValue) { - this.mName = pName; - this.mType = pType; - this.mValue = pValue; - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - public String getName() { - return this.mName; - } - - public Class getType() { - return this.mType; - } - - public T getValue() { - return this.mValue; - } - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/util/experiment/ExperimentFactory.java b/src/org/andengine/util/experiment/ExperimentFactory.java deleted file mode 100644 index 4c7e74051..000000000 --- a/src/org/andengine/util/experiment/ExperimentFactory.java +++ /dev/null @@ -1,125 +0,0 @@ -package org.andengine.util.experiment; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -/** - * (c) 2013 Nicolas Gramlich - * - * @author Nicolas Gramlich - * @since 08:22:34 - 22.03.2013 - */ -public class ExperimentFactory implements IExperimentFactory { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - @Override - public Experiment parseExperiment(final JSONObject pExperimentJSONObject) throws JSONException { - final String name = pExperimentJSONObject.getString("name"); - final String type = pExperimentJSONObject.getString("type"); - - if (type.equals(Boolean.class.getSimpleName())) { - final Boolean value; - if (pExperimentJSONObject.has("value")) { - value = pExperimentJSONObject.getBoolean("value"); - } else { - value = null; - } - return new Experiment(name, Boolean.class, value); - } else if (type.equals(Byte.class.getSimpleName())) { - final Byte value; - if (pExperimentJSONObject.has("value")) { - value = (byte) pExperimentJSONObject.getInt("value"); - } else { - value = null; - } - return new Experiment(name, Byte.class, value); - } else if (type.equals(Character.class.getSimpleName())) { - final Character value; - if (pExperimentJSONObject.has("value")) { - value = (char) pExperimentJSONObject.getInt("value"); - } else { - value = null; - } - return new Experiment(name, Character.class, value); - } else if (type.equals(Short.class.getSimpleName())) { - final Short value; - if (pExperimentJSONObject.has("value")) { - value = (short) pExperimentJSONObject.getInt("value"); - } else { - value = null; - } - return new Experiment(name, Short.class, value); - } else if (type.equals(Integer.class.getSimpleName())) { - final Integer value; - if (pExperimentJSONObject.has("value")) { - value = pExperimentJSONObject.getInt("value"); - } else { - value = null; - } - return new Experiment(name, Integer.class, value); - } else if (type.equals(Long.class.getSimpleName())) { - final Long value; - if (pExperimentJSONObject.has("value")) { - value = pExperimentJSONObject.getLong("value"); - } else { - value = null; - } - return new Experiment(name, Long.class, value); - } else if (type.equals(Float.class.getSimpleName())) { - final Float value; - if (pExperimentJSONObject.has("value")) { - value = (float) pExperimentJSONObject.getDouble("value"); - } else { - value = null; - } - return new Experiment(name, Float.class, value); - } else if (type.equals(Double.class.getSimpleName())) { - final Double value; - if (pExperimentJSONObject.has("value")) { - value = pExperimentJSONObject.getDouble("value"); - } else { - value = null; - } - return new Experiment(name, Double.class, value); - } else if (type.equals(String.class.getSimpleName())) { - final String value = pExperimentJSONObject.optString("value", null); - return new Experiment(name, String.class, value); - } else if (type.equals(JSONObject.class.getSimpleName())) { - final JSONObject value = pExperimentJSONObject.optJSONObject("value"); - return new Experiment(name, JSONObject.class, value); - } else if (type.equals(JSONArray.class.getSimpleName())) { - final JSONArray value = pExperimentJSONObject.optJSONArray("value"); - return new Experiment(name, JSONArray.class, value); - } else { - final Object value = pExperimentJSONObject.opt("value"); - return new Experiment(name, Object.class, value); - } - } - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/util/experiment/ExperimentManager.java b/src/org/andengine/util/experiment/ExperimentManager.java deleted file mode 100644 index 54e4d054c..000000000 --- a/src/org/andengine/util/experiment/ExperimentManager.java +++ /dev/null @@ -1,517 +0,0 @@ -package org.andengine.util.experiment; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import org.andengine.util.StreamUtils; -import org.andengine.util.call.Callback; -import org.andengine.util.debug.Debug; -import org.andengine.util.experiment.exception.ExperimentException; -import org.andengine.util.experiment.exception.ExperimentNotFoundException; -import org.andengine.util.experiment.exception.ExperimentTypeException; -import org.andengine.util.preferences.SharedPreferencesCompat; -import org.andengine.util.preferences.SimplePreferences; -import org.andengine.util.system.SystemUtils; -import org.andengine.util.system.SystemUtils.SystemUtilsException; -import org.andengine.util.time.TimeConstants; -import org.andengine.util.uuid.UUIDManager; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.NameValuePair; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.utils.URLEncodedUtils; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.message.BasicNameValuePair; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.Editor; -import android.os.AsyncTask; -import android.os.Build; -import android.telephony.TelephonyManager; - -/** - * (c) 2013 Nicolas Gramlich - * - * @author Nicolas Gramlich - * @since 00:25:13 - 22.03.2013 - */ -public class ExperimentManager { - // =========================================================== - // Constants - // =========================================================== - - private static final String PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_FETCHED_TIMESTAMP_KEY = "preferences.experimentmanager.experiments.fetched.timestamp"; - private static final String PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_DATA_KEY = "preferences.experimentmanager.experiments.data"; - - // =========================================================== - // Fields - // =========================================================== - - private final Context mContext; - private final String mServerURL; - private final IExperimentFactory mExperimentFactory; - - private final UUID mUUID; - private final String mPackageName; - private final int mPackageVersionCode; - private String mSimOperatorName; - private String mNetworkOperatorName; - - private Map> mExperiments; - private String mExperimentsData; - - private long mExperimentsFetchDirtyInterval = TimeConstants.MILLISECONDS_PER_DAY; - private boolean mExperimentsFetching; - private boolean mExperimentsFetched; - private long mExperimentsFetchedTimestamp; - - private final Lock mExperimentsFetchLock = new ReentrantLock(); - - // =========================================================== - // Constructors - // =========================================================== - - public ExperimentManager(final Context pContext, final String pServerURL) throws SystemUtilsException { - this(pContext, pServerURL, new ExperimentFactory()); - } - - public ExperimentManager(final Context pContext, final String pServerURL, final IExperimentFactory pExperimentFactory) throws SystemUtilsException { - this.mContext = pContext; - this.mServerURL = pServerURL; - this.mExperimentFactory = pExperimentFactory; - - this.mUUID = UUIDManager.getUUID(pContext); - this.mPackageName = SystemUtils.getPackageName(pContext); - this.mPackageVersionCode = SystemUtils.getPackageVersionCode(pContext); - - TelephonyManager manager = (TelephonyManager) pContext.getSystemService(Context.TELEPHONY_SERVICE); - this.mNetworkOperatorName = manager.getNetworkOperatorName(); - this.mSimOperatorName = manager.getSimOperatorName(); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - public boolean isFetchingExperiments() { - return this.mExperimentsFetching; - } - - public boolean hasFetchedExperiments() { - return this.mExperimentsFetched; - } - - public long getExperimentsFetchDirtyInterval() { - return this.mExperimentsFetchDirtyInterval; - } - - public void setExperimentsFetchDirtyInterval(final long pExperimentsFetchDirtyInterval) { - this.mExperimentsFetchDirtyInterval = pExperimentsFetchDirtyInterval; - } - - public Experiment getExperiment(final String pExperimentName) throws ExperimentNotFoundException { - final Experiment experiment = this.mExperiments.get(pExperimentName); - if (experiment != null) { - return experiment; - } else { - throw new ExperimentNotFoundException("Unexpected experiment: '" + pExperimentName + "'."); - } - } - - public T getExperimentValue(final String pExperimentName, final Class pExperimentType) throws ExperimentTypeException, ExperimentNotFoundException { - final Experiment experiment = this.getExperiment(pExperimentName); - final Object value = experiment.getValue(); - - final Class type = experiment.getType(); - if (type == pExperimentType) { - return pExperimentType.cast(value); - } else { - throw new ExperimentTypeException("Unexpected type for experiment: '" + pExperimentName + "'. Requested: '" + pExperimentType.getSimpleName() + "' Actual: '" + type.getSimpleName() + "'."); - } - } - - public boolean getExperimentBooleanValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Boolean.class); - } - - public boolean getExperimentBooleanValue(final String pExperimentName, final boolean pDefaultValue) { - try { - return this.getExperimentBooleanValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public byte getExperimentByteValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Byte.class); - } - - public byte getExperimentByteValue(final String pExperimentName, final byte pDefaultValue) { - try { - return this.getExperimentByteValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public short getExperimentShortValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Short.class); - } - - public short getExperimentShortValue(final String pExperimentName, final short pDefaultValue) { - try { - return this.getExperimentShortValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public char getExperimentCharacterValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Character.class); - } - - public char getExperimentCharacterValue(final String pExperimentName, final char pDefaultValue) { - try { - return this.getExperimentCharacterValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public int getExperimentIntegerValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Integer.class); - } - - public int getExperimentIntegerValue(final String pExperimentName, final int pDefaultValue) { - try { - return this.getExperimentIntegerValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public long getExperimentLongValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Long.class); - } - - public long getExperimentLongValue(final String pExperimentName, final long pDefaultValue) { - try { - return this.getExperimentLongValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public float getExperimentFloatValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Float.class); - } - - public float getExperimentFloatValue(final String pExperimentName, final float pDefaultValue) { - try { - return this.getExperimentFloatValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public double getExperimentDoubleValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Double.class); - } - - public double getExperimentDoubleValue(final String pExperimentName, final double pDefaultValue) { - try { - return this.getExperimentDoubleValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public String getExperimentStringValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, String.class); - } - - public String getExperimentStringValue(final String pExperimentName, final String pDefaultValue) { - try { - return this.getExperimentStringValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public JSONObject getExperimentJSONObjectValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, JSONObject.class); - } - - public JSONObject getExperimentJSONObjectValue(final String pExperimentName, final JSONObject pDefaultValue) { - try { - return this.getExperimentJSONObjectValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - public JSONArray getExperimentJSONArrayValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, JSONArray.class); - } - - public JSONArray getExperimentJSONArrayValue(final String pExperimentName, final JSONArray pDefaultValue) { - try { - return this.getExperimentJSONArrayValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - @Deprecated - public Object getExperimentValue(final String pExperimentName) throws ExperimentTypeException, ExperimentNotFoundException { - return this.getExperimentValue(pExperimentName, Object.class); - } - - @Deprecated - public Object getExperimentValue(final String pExperimentName, final Object pDefaultValue) { - try { - return this.getExperimentValue(pExperimentName); - } catch (final ExperimentException e) { - return pDefaultValue; - } - } - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - public boolean save() { - return this.save(true); - } - - public boolean save(final boolean pBlocking) { - return this.save(SimplePreferences.getInstance(this.mContext), pBlocking); - } - - public boolean save(final SharedPreferences pSharedPreferences) { - return this.save(pSharedPreferences, true); - } - - public boolean save(final SharedPreferences pSharedPreferences, final boolean pBlocking) { - final Editor editor = pSharedPreferences.edit(); - - editor.putLong(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_FETCHED_TIMESTAMP_KEY, this.mExperimentsFetchedTimestamp); - editor.putString(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_DATA_KEY, this.mExperimentsData); - - if (pBlocking) { - return editor.commit(); - } else { - SharedPreferencesCompat.apply(editor); - return true; - } - } - - public boolean restore() { - return this.restore(SimplePreferences.getInstance(this.mContext)); - } - - public boolean restore(final SharedPreferences pSharedPreferences) { - this.mExperimentsData = pSharedPreferences.getString(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_DATA_KEY, null); - if (this.mExperimentsData != null) { - try { - this.mExperiments = this.parseExperiments(this.mExperimentsData); - this.mExperimentsFetchedTimestamp = pSharedPreferences.getLong(PREFERENCES_EXPERIMENTMANAGER_EXPERIMENTS_FETCHED_TIMESTAMP_KEY, 0); - this.mExperimentsFetched = true; - } catch (final JSONException e) { - return false; - } - } - return true; - } - - public boolean fetchExperiments() throws IOException, URISyntaxException { - return this.fetchExperiments(false); - } - - public boolean fetchExperiments(final boolean pForce) throws IOException, URISyntaxException { - this.mExperimentsFetchLock.lock(); - try { - if (this.shouldFetchExperiments(pForce)) { - this.mExperimentsFetching = true; - - final HttpClient httpClient = new DefaultHttpClient(); - - final List params = this.getParameters(); - - final URI uri = new URI(this.mServerURL + "?" + URLEncodedUtils.format(params, "utf-8")); - final HttpGet httpGet = new HttpGet(uri); - - final HttpResponse response = httpClient.execute(httpGet); - - final int statusCode = response.getStatusLine().getStatusCode(); - if ((statusCode >= HttpStatus.SC_OK) && (statusCode < HttpStatus.SC_MULTIPLE_CHOICES)) { - final String serverResponse = StreamUtils.readFully(response.getEntity().getContent()); - - try { - this.mExperiments = this.parseExperiments(serverResponse); - this.mExperimentsFetched = true; - this.mExperimentsFetchedTimestamp = System.currentTimeMillis(); - this.mExperimentsData = serverResponse; - } catch (final JSONException e) { - Debug.e(e); - } - } - } - } finally { - this.mExperimentsFetching = false; - this.mExperimentsFetchLock.unlock(); - } - return this.mExperimentsFetched; - } - - protected List getParameters() { - final List params = new ArrayList(); - - params.add(new BasicNameValuePair("uuid", this.mUUID.toString())); - params.add(new BasicNameValuePair("app_id", this.mPackageName)); - params.add(new BasicNameValuePair("app_version", String.valueOf(this.mPackageVersionCode))); - - params.add(new BasicNameValuePair("os_version", String.valueOf(Build.VERSION.SDK_INT))); - - params.add(new BasicNameValuePair("device_manufacturer", Build.MANUFACTURER)); - params.add(new BasicNameValuePair("device_name", Build.DEVICE)); - params.add(new BasicNameValuePair("device_brand", Build.BRAND)); - params.add(new BasicNameValuePair("device_product", Build.PRODUCT)); - params.add(new BasicNameValuePair("device_model", Build.MODEL)); - params.add(new BasicNameValuePair("device_build", Build.DISPLAY)); - final Locale locale = Locale.getDefault(); - params.add(new BasicNameValuePair("device_locale_country", locale.getCountry())); - params.add(new BasicNameValuePair("device_locale_language", locale.getLanguage())); - params.add(new BasicNameValuePair("device_network_operator", this.mNetworkOperatorName)); - params.add(new BasicNameValuePair("device_sim_operator", this.mSimOperatorName)); - - return params; - } - - private boolean shouldFetchExperiments(final boolean pForce) { - if (this.mExperimentsFetching) { - return false; - } else { - if (pForce) { - return true; - } else { - if (this.mExperimentsFetched) { - final long now = System.currentTimeMillis(); - final long experimentsFetchedDirtyTimestamp = this.mExperimentsFetchedTimestamp + this.mExperimentsFetchDirtyInterval; - return experimentsFetchedDirtyTimestamp > now; - } else { - return true; - } - } - } - } - - public void fetchExperimentsAsync() { - this.fetchExperimentsAsync(false, null); - } - - public void fetchExperimentsAsync(final boolean pForce) { - this.fetchExperimentsAsync(pForce, null); - } - - public void fetchExperimentsAsync(final Callback pCallback) { - this.fetchExperimentsAsync(false, pCallback); - } - - public void fetchExperimentsAsync(final boolean pForce, final Callback pCallback) { - final FetchExperimentsAsyncTask fetchExperimentsAsyncTask = new FetchExperimentsAsyncTask(pForce, pCallback); - fetchExperimentsAsyncTask.execute((Void[]) null); - } - - private Map> parseExperiments(final String pServerResponse) throws JSONException { - final Map> experiments = new HashMap>(); - final JSONArray experimentsJSONArray = new JSONArray(pServerResponse); - - for (int i = 0; i < experimentsJSONArray.length(); i++) { - final JSONObject experimentJSONObject = experimentsJSONArray.getJSONObject(i); - - final Experiment experiment = this.mExperimentFactory.parseExperiment(experimentJSONObject); - - experiments.put(experiment.getName(), experiment); - } - - return experiments; - } - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== - - public class FetchExperimentsAsyncTask extends AsyncTask { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Fields - // =========================================================== - - private final boolean mForce; - private final Callback mCallback; - - // =========================================================== - // Constructors - // =========================================================== - - public FetchExperimentsAsyncTask(final boolean pForce, final Callback pCallback) { - this.mForce = pForce; - this.mCallback = pCallback; - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - @Override - protected Boolean doInBackground(final Void ... pParams) { - try { - return ExperimentManager.this.fetchExperiments(this.mForce); - } catch (final Throwable t) { - Debug.e(t); - return false; - } - } - - @Override - protected void onPostExecute(final Boolean pResult) { - if (this.mCallback != null) { - this.mCallback.onCallback(pResult); - } - } - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== - } -} diff --git a/src/org/andengine/util/experiment/IExperimentFactory.java b/src/org/andengine/util/experiment/IExperimentFactory.java deleted file mode 100644 index b4fbf3e84..000000000 --- a/src/org/andengine/util/experiment/IExperimentFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.andengine.util.experiment; - -import org.json.JSONException; -import org.json.JSONObject; - -/** - * (c) 2013 Nicolas Gramlich - * - * @author Nicolas Gramlich - * @since 08:22:34 - 22.03.2013 - */ -public interface IExperimentFactory { - // =========================================================== - // Constants - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - public Experiment parseExperiment(final JSONObject pExperimentJSONObject) throws JSONException; - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/util/experiment/exception/ExperimentException.java b/src/org/andengine/util/experiment/exception/ExperimentException.java deleted file mode 100644 index 7ca3e03be..000000000 --- a/src/org/andengine/util/experiment/exception/ExperimentException.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.andengine.util.experiment.exception; - -import org.andengine.util.exception.AndEngineException; - -/** - * (c) 2013 Nicolas Gramlich - * - * @author Nicolas Gramlich - * @since 00:45:14 - 23.03.2013 - */ -public class ExperimentException extends AndEngineException { - // =========================================================== - // Constants - // =========================================================== - - private static final long serialVersionUID = 8028018956559796977L; - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - public ExperimentException() { - super(); - } - - public ExperimentException(final String pMessage) { - super(pMessage); - } - - public ExperimentException(final Throwable pThrowable) { - super(pThrowable); - } - - public ExperimentException(final String pMessage, final Throwable pThrowable) { - super(pMessage, pThrowable); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java b/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java deleted file mode 100644 index 2e0f0e895..000000000 --- a/src/org/andengine/util/experiment/exception/ExperimentNotFoundException.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.andengine.util.experiment.exception; - -/** - * (c) 2013 Nicolas Gramlich - * - * @author Nicolas Gramlich - * @since 08:25:34 - 22.03.2013 - */ -public class ExperimentNotFoundException extends ExperimentException { - // =========================================================== - // Constants - // =========================================================== - - private static final long serialVersionUID = 8872925957672647007L; - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - public ExperimentNotFoundException() { - super(); - } - - public ExperimentNotFoundException(final String pMessage) { - super(pMessage); - } - - public ExperimentNotFoundException(final Throwable pThrowable) { - super(pThrowable); - } - - public ExperimentNotFoundException(final String pMessage, final Throwable pThrowable) { - super(pMessage, pThrowable); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} diff --git a/src/org/andengine/util/experiment/exception/ExperimentTypeException.java b/src/org/andengine/util/experiment/exception/ExperimentTypeException.java deleted file mode 100644 index 9424a31db..000000000 --- a/src/org/andengine/util/experiment/exception/ExperimentTypeException.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.andengine.util.experiment.exception; - -/** - * (c) 2013 Nicolas Gramlich - * - * @author Nicolas Gramlich - * @since 08:25:34 - 22.03.2013 - */ -public class ExperimentTypeException extends ExperimentException { - // =========================================================== - // Constants - // =========================================================== - - private static final long serialVersionUID = 8937289172679121788L; - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - public ExperimentTypeException() { - super(); - } - - public ExperimentTypeException(final String pMessage) { - super(pMessage); - } - - public ExperimentTypeException(final Throwable pThrowable) { - super(pThrowable); - } - - public ExperimentTypeException(final String pMessage, final Throwable pThrowable) { - super(pMessage, pThrowable); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} From 124b9b50f43c27f7a251920adaca39594c55a4b5 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 1 May 2013 21:45:13 -0700 Subject: [PATCH 187/252] Unified copyright. --- src/org/andengine/AndEngine.java | 2 +- src/org/andengine/audio/exception/AudioException.java | 2 +- src/org/andengine/audio/music/MusicLibrary.java | 2 +- src/org/andengine/audio/music/exception/MusicException.java | 2 +- .../audio/music/exception/MusicReleasedException.java | 2 +- src/org/andengine/audio/sound/exception/SoundException.java | 2 +- .../audio/sound/exception/SoundReleasedException.java | 2 +- src/org/andengine/engine/handler/DrawHandlerList.java | 2 +- src/org/andengine/engine/options/AudioOptions.java | 2 +- src/org/andengine/engine/options/ConfigChooserOptions.java | 2 +- src/org/andengine/engine/options/MusicOptions.java | 2 +- src/org/andengine/engine/options/ScreenOrientation.java | 2 +- src/org/andengine/engine/options/SoundOptions.java | 2 +- src/org/andengine/engine/options/TouchOptions.java | 2 +- src/org/andengine/entity/IEntityComparator.java | 2 +- src/org/andengine/entity/IEntityFactory.java | 2 +- src/org/andengine/entity/IEntityMatcher.java | 2 +- src/org/andengine/entity/IEntityParameterCallable.java | 2 +- src/org/andengine/entity/TagEntityMatcher.java | 2 +- src/org/andengine/entity/ZIndexSorter.java | 4 ++-- src/org/andengine/entity/clip/ClipEntity.java | 2 +- .../andengine/entity/modifier/CardinalSplineMoveModifier.java | 2 +- .../entity/modifier/CatmullRomSplineMoveModifier.java | 2 +- .../entity/modifier/DoubleValueChangeEntityModifier.java | 2 +- src/org/andengine/entity/modifier/JumpModifier.java | 2 +- src/org/andengine/entity/modifier/SkewModifier.java | 2 +- src/org/andengine/entity/modifier/SkewXModifier.java | 2 +- src/org/andengine/entity/modifier/SkewYModifier.java | 2 +- .../entity/particle/BatchedPseudoSpriteParticleSystem.java | 2 +- .../entity/particle/BatchedSpriteParticleSystem.java | 2 +- .../entity/particle/BlendFunctionParticleSystem.java | 2 +- src/org/andengine/entity/particle/SpriteParticleSystem.java | 2 +- .../entity/particle/initializer/ScaleParticleInitializer.java | 2 +- src/org/andengine/entity/primitive/DrawMode.java | 2 +- src/org/andengine/entity/primitive/Gradient.java | 2 +- src/org/andengine/entity/primitive/Mesh.java | 2 +- .../vbo/HighPerformanceGradientVertexBufferObject.java | 2 +- .../primitive/vbo/HighPerformanceLineVertexBufferObject.java | 2 +- .../primitive/vbo/HighPerformanceMeshVertexBufferObject.java | 2 +- .../vbo/HighPerformanceRectangleVertexBufferObject.java | 2 +- .../entity/primitive/vbo/IGradientVertexBufferObject.java | 2 +- .../entity/primitive/vbo/ILineVertexBufferObject.java | 2 +- .../entity/primitive/vbo/IMeshVertexBufferObject.java | 2 +- .../entity/primitive/vbo/IRectangleVertexBufferObject.java | 2 +- .../primitive/vbo/LowMemoryGradientVertexBufferObject.java | 2 +- .../entity/primitive/vbo/LowMemoryLineVertexBufferObject.java | 2 +- .../primitive/vbo/LowMemoryRectangleVertexBufferObject.java | 2 +- src/org/andengine/entity/scene/IOnAreaTouchListener.java | 2 +- src/org/andengine/entity/scene/IOnSceneTouchListener.java | 2 +- src/org/andengine/entity/scene/ITouchArea.java | 2 +- src/org/andengine/entity/sprite/AnimationData.java | 2 +- src/org/andengine/entity/sprite/ButtonSprite.java | 2 +- src/org/andengine/entity/sprite/DiamondSprite.java | 2 +- src/org/andengine/entity/sprite/IAnimationData.java | 2 +- src/org/andengine/entity/sprite/NineSliceSprite.java | 2 +- src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java | 2 +- .../vbo/HighPerformanceSpriteBatchVertexBufferObject.java | 2 +- .../sprite/batch/vbo/ISpriteBatchVertexBufferObject.java | 2 +- .../batch/vbo/LowMemorySpriteBatchVertexBufferObject.java | 2 +- .../vbo/HighPerformanceDiamondSpriteVertexBufferObject.java | 2 +- .../sprite/vbo/HighPerformanceSpriteVertexBufferObject.java | 2 +- .../vbo/HighPerformanceTiledSpriteVertexBufferObject.java | 2 +- .../vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java | 2 +- .../HighPerformanceUniformColorSpriteVertexBufferObject.java | 2 +- .../entity/sprite/vbo/IDiamondSpriteVertexBufferObject.java | 2 +- .../entity/sprite/vbo/ISpriteVertexBufferObject.java | 2 +- .../entity/sprite/vbo/ITiledSpriteVertexBufferObject.java | 2 +- .../entity/sprite/vbo/IUncoloredSpriteVertexBufferObject.java | 2 +- .../sprite/vbo/IUniformColorSpriteVertexBufferObject.java | 2 +- .../sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java | 2 +- .../entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java | 2 +- .../sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java | 2 +- .../vbo/LowMemoryUncoloredSpriteVertexBufferObject.java | 2 +- .../vbo/LowMemoryUniformColorSpriteVertexBufferObject.java | 2 +- src/org/andengine/entity/text/AutoWrap.java | 2 +- src/org/andengine/entity/text/TextOptions.java | 2 +- .../entity/text/exception/OutOfCharactersException.java | 2 +- src/org/andengine/entity/text/exception/TextException.java | 2 +- .../text/vbo/HighPerformanceTextVertexBufferObject.java | 2 +- .../andengine/entity/text/vbo/ITextVertexBufferObject.java | 2 +- .../entity/text/vbo/LowMemoryTextVertexBufferObject.java | 2 +- src/org/andengine/entity/util/MemoryLogger.java | 2 +- .../andengine/input/touch/controller/ITouchEventCallback.java | 2 +- .../input/touch/detector/SurfaceGestureDetectorAdapter.java | 2 +- src/org/andengine/opengl/GLES20Fix.java | 2 +- src/org/andengine/opengl/exception/GLException.java | 2 +- .../andengine/opengl/exception/GLFrameBufferException.java | 2 +- .../exception/RenderTextureInitializationException.java | 2 +- src/org/andengine/opengl/font/BitmapFont.java | 2 +- src/org/andengine/opengl/font/FontUtils.java | 2 +- src/org/andengine/opengl/font/IFont.java | 2 +- src/org/andengine/opengl/font/exception/FontException.java | 2 +- .../opengl/font/exception/LetterNotFoundException.java | 2 +- .../andengine/opengl/shader/PositionColorShaderProgram.java | 2 +- .../shader/PositionColorTextureCoordinatesShaderProgram.java | 2 +- ...inatesPositionInterpolationTextureSelectShaderProgram.java | 2 +- .../shader/PositionTextureCoordinatesShaderProgram.java | 2 +- .../PositionTextureCoordinatesTextureSelectShaderProgram.java | 2 +- .../PositionTextureCoordinatesUniformColorShaderProgram.java | 2 +- src/org/andengine/opengl/shader/ShaderProgram.java | 2 +- .../opengl/shader/constants/ShaderProgramConstants.java | 2 +- .../shader/exception/ShaderProgramCompileException.java | 2 +- .../opengl/shader/exception/ShaderProgramException.java | 2 +- .../opengl/shader/exception/ShaderProgramLinkException.java | 2 +- .../andengine/opengl/shader/source/CriteriaShaderSource.java | 2 +- src/org/andengine/opengl/shader/source/IShaderSource.java | 2 +- .../andengine/opengl/shader/source/StringShaderSource.java | 2 +- .../andengine/opengl/texture/DebugTextureStateListener.java | 2 +- src/org/andengine/opengl/texture/EmptyTexture.java | 2 +- src/org/andengine/opengl/texture/ITextureStateListener.java | 2 +- src/org/andengine/opengl/texture/TextureStateAdapter.java | 2 +- .../opengl/texture/TextureWarmUpVertexBufferObject.java | 2 +- .../texture/atlas/buildable/IBuildableTextureAtlas.java | 2 +- .../andengine/opengl/texture/bitmap/AssetBitmapTexture.java | 2 +- src/org/andengine/opengl/texture/bitmap/BitmapTexture.java | 2 +- .../andengine/opengl/texture/bitmap/BitmapTextureFormat.java | 2 +- .../opengl/texture/bitmap/ResourceBitmapTexture.java | 2 +- .../GreedyPVRTexturePixelBufferStrategy.java | 2 +- .../pixelbufferstrategy/IPVRTexturePixelBufferStrategy.java | 2 +- .../SmartPVRTexturePixelBufferStrategy.java | 2 +- src/org/andengine/opengl/texture/region/ITextureRegion.java | 2 +- .../andengine/opengl/texture/region/ITiledTextureRegion.java | 2 +- src/org/andengine/opengl/texture/render/RenderTexture.java | 2 +- src/org/andengine/opengl/util/BufferUtils.java | 2 +- src/org/andengine/opengl/util/GLMatrixStack.java | 2 +- src/org/andengine/opengl/util/VertexUtils.java | 2 +- .../opengl/util/criteria/AndroidVersionCodeGLCriteria.java | 2 +- .../andengine/opengl/util/criteria/BuildModelGLCriteria.java | 2 +- .../opengl/util/criteria/GLExtensionsGLCriteria.java | 2 +- .../andengine/opengl/util/criteria/GLRendererGLCriteria.java | 2 +- .../andengine/opengl/util/criteria/GLVersionGLCriteria.java | 2 +- src/org/andengine/opengl/util/criteria/IGLCriteria.java | 2 +- src/org/andengine/opengl/util/criteria/IntGLCriteria.java | 2 +- .../andengine/opengl/util/criteria/LogicalAndGLCriteria.java | 2 +- .../andengine/opengl/util/criteria/LogicalOrGLCriteria.java | 2 +- src/org/andengine/opengl/util/criteria/StringGLCriteria.java | 2 +- src/org/andengine/opengl/vbo/DrawType.java | 2 +- .../opengl/vbo/HighPerformanceVertexBufferObject.java | 2 +- src/org/andengine/opengl/vbo/IVertexBufferObject.java | 2 +- src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java | 2 +- .../andengine/opengl/vbo/SharedMemoryVertexBufferObject.java | 2 +- .../andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java | 2 +- .../opengl/vbo/attribute/VertexBufferObjectAttribute.java | 2 +- .../opengl/vbo/attribute/VertexBufferObjectAttributeFix.java | 2 +- .../opengl/vbo/attribute/VertexBufferObjectAttributes.java | 2 +- .../vbo/attribute/VertexBufferObjectAttributesBuilder.java | 2 +- src/org/andengine/opengl/view/ConfigChooser.java | 2 +- src/org/andengine/opengl/view/ConfigChooserMatcher.java | 2 +- src/org/andengine/ui/activity/SimpleAsyncGameActivity.java | 2 +- src/org/andengine/ui/activity/SimpleBaseGameActivity.java | 2 +- src/org/andengine/ui/activity/SimpleLayoutGameActivity.java | 2 +- src/org/andengine/util/IDisposable.java | 2 +- src/org/andengine/util/ThreadUtils.java | 2 +- src/org/andengine/util/adt/bit/IBitVector.java | 2 +- src/org/andengine/util/adt/bit/LongBackedBitVector.java | 2 +- src/org/andengine/util/adt/bounds/BoundsSplit.java | 2 +- src/org/andengine/util/adt/bounds/FloatBounds.java | 2 +- src/org/andengine/util/adt/bounds/IBounds.java | 2 +- src/org/andengine/util/adt/bounds/IFloatBounds.java | 2 +- src/org/andengine/util/adt/bounds/IIntBounds.java | 2 +- src/org/andengine/util/adt/bounds/IntBounds.java | 2 +- src/org/andengine/util/adt/cache/IntLRUCache.java | 2 +- src/org/andengine/util/adt/cache/LRUCache.java | 2 +- .../util/adt/cache/concurrent/SynchronizedIntLRUCache.java | 2 +- .../util/adt/cache/concurrent/SynchronizedLRUCache.java | 2 +- src/org/andengine/util/adt/color/Color.java | 2 +- src/org/andengine/util/adt/color/ColorPool.java | 2 +- src/org/andengine/util/adt/data/operator/ByteOperator.java | 2 +- src/org/andengine/util/adt/data/operator/CharOperator.java | 2 +- src/org/andengine/util/adt/data/operator/DoubleOperator.java | 2 +- src/org/andengine/util/adt/data/operator/FloatOperator.java | 2 +- src/org/andengine/util/adt/data/operator/IntOperator.java | 2 +- src/org/andengine/util/adt/data/operator/LongOperator.java | 2 +- src/org/andengine/util/adt/data/operator/ShortOperator.java | 2 +- src/org/andengine/util/adt/data/operator/StringOperator.java | 2 +- src/org/andengine/util/adt/io/in/AssetInputStreamOpener.java | 2 +- .../andengine/util/adt/io/in/ByteArrayInputStreamOpener.java | 2 +- src/org/andengine/util/adt/io/in/IInputStreamOpener.java | 2 +- .../andengine/util/adt/io/in/ResourceInputStreamOpener.java | 2 +- src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java | 2 +- src/org/andengine/util/adt/list/BooleanArrayList.java | 2 +- src/org/andengine/util/adt/list/ByteArrayList.java | 2 +- src/org/andengine/util/adt/list/CharArrayList.java | 2 +- src/org/andengine/util/adt/list/CircularList.java | 2 +- src/org/andengine/util/adt/list/DoubleArrayList.java | 2 +- src/org/andengine/util/adt/list/FloatArrayList.java | 2 +- src/org/andengine/util/adt/list/IBooleanList.java | 2 +- src/org/andengine/util/adt/list/IByteList.java | 2 +- src/org/andengine/util/adt/list/ICharList.java | 2 +- src/org/andengine/util/adt/list/IDoubleList.java | 2 +- src/org/andengine/util/adt/list/IFloatList.java | 2 +- src/org/andengine/util/adt/list/IIntList.java | 2 +- src/org/andengine/util/adt/list/IList.java | 2 +- src/org/andengine/util/adt/list/ILongList.java | 2 +- src/org/andengine/util/adt/list/ISortedList.java | 2 +- src/org/andengine/util/adt/list/IUniqueList.java | 2 +- src/org/andengine/util/adt/list/IntArrayList.java | 2 +- src/org/andengine/util/adt/list/LongArrayList.java | 2 +- src/org/andengine/util/adt/list/ShiftList.java | 2 +- src/org/andengine/util/adt/list/SortedList.java | 2 +- src/org/andengine/util/adt/list/UniqueList.java | 2 +- .../andengine/util/adt/list/concurrent/SynchronizedList.java | 2 +- src/org/andengine/util/adt/map/IIntLookupMap.java | 2 +- src/org/andengine/util/adt/map/IntLookupMap.java | 2 +- src/org/andengine/util/adt/map/SparseArrayUtils.java | 2 +- src/org/andengine/util/adt/queue/CircularQueue.java | 2 +- src/org/andengine/util/adt/queue/IQueue.java | 2 +- src/org/andengine/util/adt/queue/ISortedQueue.java | 2 +- src/org/andengine/util/adt/queue/IUniqueQueue.java | 2 +- src/org/andengine/util/adt/queue/ShiftQueue.java | 2 +- src/org/andengine/util/adt/queue/SortedQueue.java | 2 +- src/org/andengine/util/adt/queue/UniqueQueue.java | 2 +- .../util/adt/queue/concurrent/SynchronizedQueue.java | 2 +- src/org/andengine/util/adt/spatial/ISpatialItem.java | 2 +- .../util/adt/spatial/bounds/util/FloatBoundsUtils.java | 2 +- .../util/adt/spatial/bounds/util/IntBoundsUtils.java | 2 +- .../andengine/util/adt/spatial/quadtree/FloatQuadTree.java | 2 +- src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java | 2 +- src/org/andengine/util/adt/spatial/quadtree/QuadTree.java | 2 +- src/org/andengine/util/adt/trie/ITrie.java | 2 +- src/org/andengine/util/adt/trie/Trie.java | 2 +- src/org/andengine/util/algorithm/Spiral.java | 2 +- .../util/algorithm/collision/TriangleCollisionChecker.java | 2 +- src/org/andengine/util/algorithm/hull/HullUtils.java | 2 +- src/org/andengine/util/animationpack/AnimationPack.java | 2 +- src/org/andengine/util/animationpack/AnimationPackLoader.java | 2 +- src/org/andengine/util/animationpack/AnimationPackParser.java | 2 +- .../util/animationpack/AnimationPackTiledTextureRegion.java | 2 +- .../animationpack/AnimationPackTiledTextureRegionLibrary.java | 2 +- .../animationpack/exception/AnimationPackParseException.java | 2 +- src/org/andengine/util/debug/DebugTimer.java | 2 +- src/org/andengine/util/escape/Unescaper.java | 2 +- src/org/andengine/util/escape/UnescaperEntityMap.java | 2 +- src/org/andengine/util/escape/XMLUnescaper.java | 2 +- src/org/andengine/util/exception/AndEngineException.java | 2 +- .../andengine/util/exception/AndEngineRuntimeException.java | 2 +- src/org/andengine/util/exception/CancelledException.java | 2 +- .../andengine/util/exception/DeviceNotSupportedException.java | 2 +- .../andengine/util/exception/IllegalClassNameException.java | 2 +- src/org/andengine/util/exception/MethodNotFoundException.java | 2 +- .../andengine/util/exception/MethodNotSupportedException.java | 2 +- .../util/exception/MethodNotYetImplementedException.java | 2 +- src/org/andengine/util/exception/NullBitmapException.java | 2 +- src/org/andengine/util/level/EntityLoader.java | 2 +- src/org/andengine/util/level/IEntityLoader.java | 2 +- src/org/andengine/util/level/IEntityLoaderData.java | 2 +- src/org/andengine/util/level/IEntityLoaderListener.java | 2 +- src/org/andengine/util/level/ILevelLoaderResult.java | 2 +- .../andengine/util/level/exception/LevelLoaderException.java | 2 +- .../util/level/simple/SimpleLevelEntityLoaderData.java | 2 +- src/org/andengine/util/level/simple/SimpleLevelLoader.java | 2 +- .../util/level/simple/SimpleLevelLoaderContentHandler.java | 2 +- .../andengine/util/level/simple/SimpleLevelLoaderResult.java | 2 +- .../util/modifier/BaseDoubleValueChangeModifier.java | 2 +- src/org/andengine/util/system/CPUUsage.java | 2 +- src/org/andengine/util/texturepack/TexturePack.java | 2 +- src/org/andengine/util/texturepack/TexturePackLibrary.java | 2 +- src/org/andengine/util/texturepack/TexturePackLoader.java | 2 +- src/org/andengine/util/texturepack/TexturePackParser.java | 2 +- .../andengine/util/texturepack/TexturePackTextureRegion.java | 2 +- .../util/texturepack/TexturePackTextureRegionLibrary.java | 2 +- .../util/texturepack/exception/TexturePackParseException.java | 2 +- 262 files changed, 263 insertions(+), 263 deletions(-) diff --git a/src/org/andengine/AndEngine.java b/src/org/andengine/AndEngine.java index 6ef4f2d93..487a28dea 100644 --- a/src/org/andengine/AndEngine.java +++ b/src/org/andengine/AndEngine.java @@ -16,7 +16,7 @@ import android.os.Build; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:03:59 - 19.03.2012 diff --git a/src/org/andengine/audio/exception/AudioException.java b/src/org/andengine/audio/exception/AudioException.java index 563295d8f..d7b6b0697 100644 --- a/src/org/andengine/audio/exception/AudioException.java +++ b/src/org/andengine/audio/exception/AudioException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:44:53 - 09.11.2011 diff --git a/src/org/andengine/audio/music/MusicLibrary.java b/src/org/andengine/audio/music/MusicLibrary.java index 1fa730dd9..b4cb17ee4 100644 --- a/src/org/andengine/audio/music/MusicLibrary.java +++ b/src/org/andengine/audio/music/MusicLibrary.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.map.Library; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:30:34 - 09.11.2011 diff --git a/src/org/andengine/audio/music/exception/MusicException.java b/src/org/andengine/audio/music/exception/MusicException.java index ffe2617c7..751bb8fd6 100644 --- a/src/org/andengine/audio/music/exception/MusicException.java +++ b/src/org/andengine/audio/music/exception/MusicException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:37:53 - 09.11.2011 diff --git a/src/org/andengine/audio/music/exception/MusicReleasedException.java b/src/org/andengine/audio/music/exception/MusicReleasedException.java index 5ab6b2443..9ddb3f773 100644 --- a/src/org/andengine/audio/music/exception/MusicReleasedException.java +++ b/src/org/andengine/audio/music/exception/MusicReleasedException.java @@ -1,7 +1,7 @@ package org.andengine.audio.music.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:44:27 - 09.11.2011 diff --git a/src/org/andengine/audio/sound/exception/SoundException.java b/src/org/andengine/audio/sound/exception/SoundException.java index a2c7c5f29..e1158ba7a 100644 --- a/src/org/andengine/audio/sound/exception/SoundException.java +++ b/src/org/andengine/audio/sound/exception/SoundException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:37:53 - 09.11.2011 diff --git a/src/org/andengine/audio/sound/exception/SoundReleasedException.java b/src/org/andengine/audio/sound/exception/SoundReleasedException.java index 4e35dc579..26fb7be9f 100644 --- a/src/org/andengine/audio/sound/exception/SoundReleasedException.java +++ b/src/org/andengine/audio/sound/exception/SoundReleasedException.java @@ -1,7 +1,7 @@ package org.andengine.audio.sound.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:44:27 - 09.11.2011 diff --git a/src/org/andengine/engine/handler/DrawHandlerList.java b/src/org/andengine/engine/handler/DrawHandlerList.java index 3808ce193..cd1161376 100644 --- a/src/org/andengine/engine/handler/DrawHandlerList.java +++ b/src/org/andengine/engine/handler/DrawHandlerList.java @@ -5,7 +5,7 @@ import org.andengine.util.adt.list.SmartList; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:42:49 - 22.11.2011 diff --git a/src/org/andengine/engine/options/AudioOptions.java b/src/org/andengine/engine/options/AudioOptions.java index b8c73c2fc..53338c808 100644 --- a/src/org/andengine/engine/options/AudioOptions.java +++ b/src/org/andengine/engine/options/AudioOptions.java @@ -1,7 +1,7 @@ package org.andengine.engine.options; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:13:07 - 22.11.2011 diff --git a/src/org/andengine/engine/options/ConfigChooserOptions.java b/src/org/andengine/engine/options/ConfigChooserOptions.java index 7eadfd079..289c63c86 100644 --- a/src/org/andengine/engine/options/ConfigChooserOptions.java +++ b/src/org/andengine/engine/options/ConfigChooserOptions.java @@ -1,7 +1,7 @@ package org.andengine.engine.options; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:01:53 - 12.05.2012 diff --git a/src/org/andengine/engine/options/MusicOptions.java b/src/org/andengine/engine/options/MusicOptions.java index bf12cfbf1..a2faf2eb1 100644 --- a/src/org/andengine/engine/options/MusicOptions.java +++ b/src/org/andengine/engine/options/MusicOptions.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:13:07 - 22.11.2011 diff --git a/src/org/andengine/engine/options/ScreenOrientation.java b/src/org/andengine/engine/options/ScreenOrientation.java index 6a6d218bf..2521e0311 100644 --- a/src/org/andengine/engine/options/ScreenOrientation.java +++ b/src/org/andengine/engine/options/ScreenOrientation.java @@ -1,7 +1,7 @@ package org.andengine.engine.options; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:48:03 - 04.04.2012 diff --git a/src/org/andengine/engine/options/SoundOptions.java b/src/org/andengine/engine/options/SoundOptions.java index a58ac3b0e..397fdb128 100644 --- a/src/org/andengine/engine/options/SoundOptions.java +++ b/src/org/andengine/engine/options/SoundOptions.java @@ -3,7 +3,7 @@ import org.andengine.audio.sound.SoundManager; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:13:07 - 22.11.2011 diff --git a/src/org/andengine/engine/options/TouchOptions.java b/src/org/andengine/engine/options/TouchOptions.java index 4b031e547..4c26eac42 100644 --- a/src/org/andengine/engine/options/TouchOptions.java +++ b/src/org/andengine/engine/options/TouchOptions.java @@ -1,7 +1,7 @@ package org.andengine.engine.options; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:18:06 - 22.11.2011 diff --git a/src/org/andengine/entity/IEntityComparator.java b/src/org/andengine/entity/IEntityComparator.java index ee8b5b444..6982da43b 100644 --- a/src/org/andengine/entity/IEntityComparator.java +++ b/src/org/andengine/entity/IEntityComparator.java @@ -3,7 +3,7 @@ import java.util.Comparator; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:02:56 - 10.04.2012 diff --git a/src/org/andengine/entity/IEntityFactory.java b/src/org/andengine/entity/IEntityFactory.java index b930cf7a0..538081715 100644 --- a/src/org/andengine/entity/IEntityFactory.java +++ b/src/org/andengine/entity/IEntityFactory.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:04:41 - 19.11.2011 diff --git a/src/org/andengine/entity/IEntityMatcher.java b/src/org/andengine/entity/IEntityMatcher.java index 11cf25865..41477c68e 100644 --- a/src/org/andengine/entity/IEntityMatcher.java +++ b/src/org/andengine/entity/IEntityMatcher.java @@ -3,7 +3,7 @@ import org.andengine.util.IMatcher; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 20:06:28 - 26.03.2012 diff --git a/src/org/andengine/entity/IEntityParameterCallable.java b/src/org/andengine/entity/IEntityParameterCallable.java index 7a5d08808..325fe32dc 100644 --- a/src/org/andengine/entity/IEntityParameterCallable.java +++ b/src/org/andengine/entity/IEntityParameterCallable.java @@ -3,7 +3,7 @@ import org.andengine.util.call.ParameterCallable; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 20:06:53 - 26.03.2012 diff --git a/src/org/andengine/entity/TagEntityMatcher.java b/src/org/andengine/entity/TagEntityMatcher.java index 7d516a5ef..c18ad601a 100644 --- a/src/org/andengine/entity/TagEntityMatcher.java +++ b/src/org/andengine/entity/TagEntityMatcher.java @@ -1,7 +1,7 @@ package org.andengine.entity; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:49:11 - 01.05.2012 diff --git a/src/org/andengine/entity/ZIndexSorter.java b/src/org/andengine/entity/ZIndexSorter.java index 4b45ab7a4..031ac78f9 100644 --- a/src/org/andengine/entity/ZIndexSorter.java +++ b/src/org/andengine/entity/ZIndexSorter.java @@ -7,8 +7,8 @@ import org.andengine.util.algorithm.sort.InsertionSorter; /** - * (c) Nicolas Gramlich 2010 - * (c) Zynga 2011 + * (c) 2010 Nicolas Gramlich + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 12:08:56 - 06.08.2010 diff --git a/src/org/andengine/entity/clip/ClipEntity.java b/src/org/andengine/entity/clip/ClipEntity.java index e16bb76fe..7f708f1d1 100644 --- a/src/org/andengine/entity/clip/ClipEntity.java +++ b/src/org/andengine/entity/clip/ClipEntity.java @@ -12,7 +12,7 @@ * A {@link ClipEntity} clips drawing of all its children in a rectangle, which is defined as the axis aligned bounding box around itself. * It can be attached anywhere in the scene graph, which means that it inherits transformations from its parents, which have a direct effect on the clipping area. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 13:53:29 - 10.05.2012 diff --git a/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java b/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java index f3e2ccdb2..09fd5f2f5 100644 --- a/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java +++ b/src/org/andengine/entity/modifier/CardinalSplineMoveModifier.java @@ -7,7 +7,7 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:47:24 - 20.03.2012 diff --git a/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java b/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java index f9234c955..f7c4da57c 100644 --- a/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java +++ b/src/org/andengine/entity/modifier/CatmullRomSplineMoveModifier.java @@ -3,7 +3,7 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:51:22 - 21.03.2012 diff --git a/src/org/andengine/entity/modifier/DoubleValueChangeEntityModifier.java b/src/org/andengine/entity/modifier/DoubleValueChangeEntityModifier.java index 45225ce83..b17ff5656 100644 --- a/src/org/andengine/entity/modifier/DoubleValueChangeEntityModifier.java +++ b/src/org/andengine/entity/modifier/DoubleValueChangeEntityModifier.java @@ -4,7 +4,7 @@ import org.andengine.util.modifier.BaseDoubleValueChangeModifier; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:27:48 - 10.08.2011 diff --git a/src/org/andengine/entity/modifier/JumpModifier.java b/src/org/andengine/entity/modifier/JumpModifier.java index 36d9a2c49..96d732bd7 100644 --- a/src/org/andengine/entity/modifier/JumpModifier.java +++ b/src/org/andengine/entity/modifier/JumpModifier.java @@ -5,7 +5,7 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:12:55 - 11.01.2012 diff --git a/src/org/andengine/entity/modifier/SkewModifier.java b/src/org/andengine/entity/modifier/SkewModifier.java index ac103c75c..e26603530 100644 --- a/src/org/andengine/entity/modifier/SkewModifier.java +++ b/src/org/andengine/entity/modifier/SkewModifier.java @@ -5,7 +5,7 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 10:46:10 - 05.10.2011 diff --git a/src/org/andengine/entity/modifier/SkewXModifier.java b/src/org/andengine/entity/modifier/SkewXModifier.java index 41aa1a006..9011f6f51 100644 --- a/src/org/andengine/entity/modifier/SkewXModifier.java +++ b/src/org/andengine/entity/modifier/SkewXModifier.java @@ -5,7 +5,7 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 10:46:10 - 05.10.2011 diff --git a/src/org/andengine/entity/modifier/SkewYModifier.java b/src/org/andengine/entity/modifier/SkewYModifier.java index 0704028d8..716cc9869 100644 --- a/src/org/andengine/entity/modifier/SkewYModifier.java +++ b/src/org/andengine/entity/modifier/SkewYModifier.java @@ -5,7 +5,7 @@ import org.andengine.util.modifier.ease.IEaseFunction; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 10:48:45 - 05.10.2011 diff --git a/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java index f45540f80..97acf9245 100644 --- a/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/BatchedPseudoSpriteParticleSystem.java @@ -11,7 +11,7 @@ import org.andengine.util.adt.color.ColorUtils; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:39:46 - 10.05.2012 diff --git a/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java index cae06572e..33c60749b 100644 --- a/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/BatchedSpriteParticleSystem.java @@ -12,7 +12,7 @@ import org.andengine.util.adt.color.ColorUtils; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:32:29 - 09.05.2012 diff --git a/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java index b3c7c27ad..4fe4c4278 100644 --- a/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java +++ b/src/org/andengine/entity/particle/BlendFunctionParticleSystem.java @@ -8,7 +8,7 @@ import org.andengine.opengl.util.GLState; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:34:32 - 10.05.2012 diff --git a/src/org/andengine/entity/particle/SpriteParticleSystem.java b/src/org/andengine/entity/particle/SpriteParticleSystem.java index 24a853204..aef2b20e2 100644 --- a/src/org/andengine/entity/particle/SpriteParticleSystem.java +++ b/src/org/andengine/entity/particle/SpriteParticleSystem.java @@ -7,7 +7,7 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 21:00:23 - 04.12.2011 diff --git a/src/org/andengine/entity/particle/initializer/ScaleParticleInitializer.java b/src/org/andengine/entity/particle/initializer/ScaleParticleInitializer.java index 6a94826c7..626318877 100644 --- a/src/org/andengine/entity/particle/initializer/ScaleParticleInitializer.java +++ b/src/org/andengine/entity/particle/initializer/ScaleParticleInitializer.java @@ -5,7 +5,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 10:03:29 - 19.11.2011 diff --git a/src/org/andengine/entity/primitive/DrawMode.java b/src/org/andengine/entity/primitive/DrawMode.java index b2ec80c2f..3471c591f 100644 --- a/src/org/andengine/entity/primitive/DrawMode.java +++ b/src/org/andengine/entity/primitive/DrawMode.java @@ -3,7 +3,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:46:51 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/Gradient.java b/src/org/andengine/entity/primitive/Gradient.java index e5de4c40b..88b996a58 100644 --- a/src/org/andengine/entity/primitive/Gradient.java +++ b/src/org/andengine/entity/primitive/Gradient.java @@ -18,7 +18,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:23:56 - 23.04.2012 diff --git a/src/org/andengine/entity/primitive/Mesh.java b/src/org/andengine/entity/primitive/Mesh.java index 4c7cc59d7..840968e91 100644 --- a/src/org/andengine/entity/primitive/Mesh.java +++ b/src/org/andengine/entity/primitive/Mesh.java @@ -18,7 +18,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:44:50 - 09.02.2012 diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java index 207b324a8..0ead93196 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceGradientVertexBufferObject.java @@ -10,7 +10,7 @@ import org.andengine.util.math.MathUtils; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:27:09 - 23.04.2012 diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java index 869315cde..7c5282499 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceLineVertexBufferObject.java @@ -7,7 +7,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:45:00 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java index 8608b2d75..183f88842 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceMeshVertexBufferObject.java @@ -7,7 +7,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:46:51 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java index 8b6fdda60..a8836f492 100644 --- a/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceRectangleVertexBufferObject.java @@ -7,7 +7,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:48:14 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java index 678e0f3ef..9af59158d 100644 --- a/src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/IGradientVertexBufferObject.java @@ -4,7 +4,7 @@ import org.andengine.opengl.vbo.IVertexBufferObject; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:27:22 - 23.04.2012 diff --git a/src/org/andengine/entity/primitive/vbo/ILineVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/ILineVertexBufferObject.java index 07c572285..e179c8ecf 100644 --- a/src/org/andengine/entity/primitive/vbo/ILineVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/ILineVertexBufferObject.java @@ -4,7 +4,7 @@ import org.andengine.opengl.vbo.IVertexBufferObject; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:45:00 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/vbo/IMeshVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/IMeshVertexBufferObject.java index 0e0ec2fe9..fa6223316 100644 --- a/src/org/andengine/entity/primitive/vbo/IMeshVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/IMeshVertexBufferObject.java @@ -4,7 +4,7 @@ import org.andengine.opengl.vbo.IVertexBufferObject; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:46:51 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/vbo/IRectangleVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/IRectangleVertexBufferObject.java index 017a845ef..dde390ec1 100644 --- a/src/org/andengine/entity/primitive/vbo/IRectangleVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/IRectangleVertexBufferObject.java @@ -4,7 +4,7 @@ import org.andengine.opengl.vbo.IVertexBufferObject; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:48:14 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java index 8916cfeb4..4fcd6cc5c 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryGradientVertexBufferObject.java @@ -12,7 +12,7 @@ import org.andengine.util.math.MathUtils; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:27:33 - 23.04.2012 diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java index 922c6d9b5..8b7c4db36 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryLineVertexBufferObject.java @@ -9,7 +9,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:45:00 - 28.03.2012 diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java index 04ca9b85e..0226c8a2a 100644 --- a/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryRectangleVertexBufferObject.java @@ -9,7 +9,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:48:14 - 28.03.2012 diff --git a/src/org/andengine/entity/scene/IOnAreaTouchListener.java b/src/org/andengine/entity/scene/IOnAreaTouchListener.java index 9446191ea..c9c6e99b8 100644 --- a/src/org/andengine/entity/scene/IOnAreaTouchListener.java +++ b/src/org/andengine/entity/scene/IOnAreaTouchListener.java @@ -7,7 +7,7 @@ * dispatched to an {@link ITouchArea} area. The callback will be invoked * before the {@link TouchEvent} is passed to the {@link ITouchArea}. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:01:48 PM - 27.03.2012 diff --git a/src/org/andengine/entity/scene/IOnSceneTouchListener.java b/src/org/andengine/entity/scene/IOnSceneTouchListener.java index 1fcaa1938..8e1a10702 100644 --- a/src/org/andengine/entity/scene/IOnSceneTouchListener.java +++ b/src/org/andengine/entity/scene/IOnSceneTouchListener.java @@ -7,7 +7,7 @@ * dispatched to a {@link Scene}. The callback will be invoked * after all {@link ITouchArea}s have been checked and none consumed the {@link TouchEvent}. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:02:20 - 27.03.2012 diff --git a/src/org/andengine/entity/scene/ITouchArea.java b/src/org/andengine/entity/scene/ITouchArea.java index 67342f4ac..474b7cb8a 100644 --- a/src/org/andengine/entity/scene/ITouchArea.java +++ b/src/org/andengine/entity/scene/ITouchArea.java @@ -4,7 +4,7 @@ import org.andengine.util.IMatcher; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:01:18 - 27.03.2012 diff --git a/src/org/andengine/entity/sprite/AnimationData.java b/src/org/andengine/entity/sprite/AnimationData.java index 49930c430..0c9ab47c9 100644 --- a/src/org/andengine/entity/sprite/AnimationData.java +++ b/src/org/andengine/entity/sprite/AnimationData.java @@ -7,7 +7,7 @@ import org.andengine.util.time.TimeConstants; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:43:01 - 04.05.2012 diff --git a/src/org/andengine/entity/sprite/ButtonSprite.java b/src/org/andengine/entity/sprite/ButtonSprite.java index 00fe2fc20..fc6fbb9fd 100644 --- a/src/org/andengine/entity/sprite/ButtonSprite.java +++ b/src/org/andengine/entity/sprite/ButtonSprite.java @@ -13,7 +13,7 @@ * Note: {@link ButtonSprite} needs to be registered as a {@link ITouchArea} to the {@link Scene} via {@link Scene#registerTouchArea(ITouchArea)}, otherwise it won't be clickable. * To make {@link ButtonSprite} function properly, you should consider setting {@link Scene#setTouchAreaBindingOnActionDownEnabled(boolean)} to true. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Scott Kennedy * @author Nicolas Gramlich diff --git a/src/org/andengine/entity/sprite/DiamondSprite.java b/src/org/andengine/entity/sprite/DiamondSprite.java index 2047c516f..2d6eaaa1b 100644 --- a/src/org/andengine/entity/sprite/DiamondSprite.java +++ b/src/org/andengine/entity/sprite/DiamondSprite.java @@ -22,7 +22,7 @@ * +--------+ * * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:26:32 - 24.10.2011 diff --git a/src/org/andengine/entity/sprite/IAnimationData.java b/src/org/andengine/entity/sprite/IAnimationData.java index c4e53b2c6..952a4f685 100644 --- a/src/org/andengine/entity/sprite/IAnimationData.java +++ b/src/org/andengine/entity/sprite/IAnimationData.java @@ -3,7 +3,7 @@ import org.andengine.util.modifier.IModifier.DeepCopyNotSupportedException; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:59:57 - 03.05.2012 diff --git a/src/org/andengine/entity/sprite/NineSliceSprite.java b/src/org/andengine/entity/sprite/NineSliceSprite.java index 55dde6f11..a6ac414ef 100644 --- a/src/org/andengine/entity/sprite/NineSliceSprite.java +++ b/src/org/andengine/entity/sprite/NineSliceSprite.java @@ -10,7 +10,7 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:50:42 - 25.04.2012 diff --git a/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java b/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java index cc114c66b..a0ccf03fd 100644 --- a/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/DynamicSpriteBatch.java @@ -7,7 +7,7 @@ import org.andengine.opengl.vbo.VertexBufferObjectManager; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 21:48:21 - 27.07.2011 diff --git a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java index 00b370fc2..38d67a88a 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/HighPerformanceSpriteBatchVertexBufferObject.java @@ -8,7 +8,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:35:28 - 29.03.2012 diff --git a/src/org/andengine/entity/sprite/batch/vbo/ISpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/ISpriteBatchVertexBufferObject.java index 8e85de1e7..b59d6c97e 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/ISpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/ISpriteBatchVertexBufferObject.java @@ -4,7 +4,7 @@ import org.andengine.opengl.vbo.IVertexBufferObject; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:35:06 - 29.03.2012 diff --git a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java index 8d4282be8..cf3b755d7 100644 --- a/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/batch/vbo/LowMemorySpriteBatchVertexBufferObject.java @@ -10,7 +10,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:34:46 - 29.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java index 21546ff56..a3efc4c7c 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceDiamondSpriteVertexBufferObject.java @@ -7,7 +7,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:43:22 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java index 6b2ca5de4..300054da3 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceSpriteVertexBufferObject.java @@ -8,7 +8,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:40:47 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java index 7bd375f54..9cc8dfc7a 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceTiledSpriteVertexBufferObject.java @@ -9,7 +9,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:39:06 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java index 3edf40172..b16a34438 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUncoloredSpriteVertexBufferObject.java @@ -8,7 +8,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:37:49 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java index 0764a3f54..993da081f 100644 --- a/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/HighPerformanceUniformColorSpriteVertexBufferObject.java @@ -9,7 +9,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:37:01 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/IDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/IDiamondSpriteVertexBufferObject.java index c29e23511..c2e1f0686 100644 --- a/src/org/andengine/entity/sprite/vbo/IDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/IDiamondSpriteVertexBufferObject.java @@ -1,7 +1,7 @@ package org.andengine.entity.sprite.vbo; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:43:22 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/ISpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/ISpriteVertexBufferObject.java index 92e678b4e..79565bddb 100644 --- a/src/org/andengine/entity/sprite/vbo/ISpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/ISpriteVertexBufferObject.java @@ -4,7 +4,7 @@ import org.andengine.opengl.vbo.IVertexBufferObject; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:40:47 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/ITiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/ITiledSpriteVertexBufferObject.java index e06337bf3..7bd8fdc7a 100644 --- a/src/org/andengine/entity/sprite/vbo/ITiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/ITiledSpriteVertexBufferObject.java @@ -3,7 +3,7 @@ import org.andengine.entity.sprite.TiledSprite; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:39:06 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/IUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/IUncoloredSpriteVertexBufferObject.java index f692aec0b..63682dc17 100644 --- a/src/org/andengine/entity/sprite/vbo/IUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/IUncoloredSpriteVertexBufferObject.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:37:49 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/IUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/IUniformColorSpriteVertexBufferObject.java index 04db6f88c..aebdd6ab7 100644 --- a/src/org/andengine/entity/sprite/vbo/IUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/IUniformColorSpriteVertexBufferObject.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:35:57 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java index f25d91224..53ad6070c 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryDiamondSpriteVertexBufferObject.java @@ -9,7 +9,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:43:22 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java index 57f6f36c6..7ecd1116e 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemorySpriteVertexBufferObject.java @@ -10,7 +10,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:40:47 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java index ede6c5297..ffc21da1d 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryTiledSpriteVertexBufferObject.java @@ -11,7 +11,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:39:06 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java index 0341d4bb5..7b278c9bf 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUncoloredSpriteVertexBufferObject.java @@ -10,7 +10,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:37:49 - 28.03.2012 diff --git a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java index 0fbf2e411..15dc83797 100644 --- a/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java +++ b/src/org/andengine/entity/sprite/vbo/LowMemoryUniformColorSpriteVertexBufferObject.java @@ -11,7 +11,7 @@ import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:36:31 - 28.03.2012 diff --git a/src/org/andengine/entity/text/AutoWrap.java b/src/org/andengine/entity/text/AutoWrap.java index ebc6141cc..faf5e4e1a 100644 --- a/src/org/andengine/entity/text/AutoWrap.java +++ b/src/org/andengine/entity/text/AutoWrap.java @@ -1,7 +1,7 @@ package org.andengine.entity.text; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:36:44 - 29.03.2012 diff --git a/src/org/andengine/entity/text/TextOptions.java b/src/org/andengine/entity/text/TextOptions.java index c57b8ddad..a07906822 100644 --- a/src/org/andengine/entity/text/TextOptions.java +++ b/src/org/andengine/entity/text/TextOptions.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.align.HorizontalAlign; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:37:02 - 29.03.2012 diff --git a/src/org/andengine/entity/text/exception/OutOfCharactersException.java b/src/org/andengine/entity/text/exception/OutOfCharactersException.java index 526e1ce4e..c60cb3d6f 100644 --- a/src/org/andengine/entity/text/exception/OutOfCharactersException.java +++ b/src/org/andengine/entity/text/exception/OutOfCharactersException.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:53:31 - 01.11.2011 diff --git a/src/org/andengine/entity/text/exception/TextException.java b/src/org/andengine/entity/text/exception/TextException.java index b9acb023a..b7e8693af 100644 --- a/src/org/andengine/entity/text/exception/TextException.java +++ b/src/org/andengine/entity/text/exception/TextException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:53:31 - 01.11.2011 diff --git a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java index 88bb984dd..411ed79cf 100644 --- a/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/HighPerformanceTextVertexBufferObject.java @@ -13,7 +13,7 @@ import org.andengine.util.adt.list.IFloatList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:38:43 - 29.03.2012 diff --git a/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java index 934aaa305..a4e49ccef 100644 --- a/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/ITextVertexBufferObject.java @@ -5,7 +5,7 @@ /** * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:38:05 - 29.03.2012 diff --git a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java index 2deafc346..510bd6d74 100644 --- a/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java +++ b/src/org/andengine/entity/text/vbo/LowMemoryTextVertexBufferObject.java @@ -14,7 +14,7 @@ import org.andengine.util.adt.list.IFloatList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:38:22 - 29.03.2012 diff --git a/src/org/andengine/entity/util/MemoryLogger.java b/src/org/andengine/entity/util/MemoryLogger.java index c4e263a2f..7ac265a13 100644 --- a/src/org/andengine/entity/util/MemoryLogger.java +++ b/src/org/andengine/entity/util/MemoryLogger.java @@ -11,7 +11,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:50:15 - 14.05.2012 diff --git a/src/org/andengine/input/touch/controller/ITouchEventCallback.java b/src/org/andengine/input/touch/controller/ITouchEventCallback.java index a79a2a46c..6e1003252 100644 --- a/src/org/andengine/input/touch/controller/ITouchEventCallback.java +++ b/src/org/andengine/input/touch/controller/ITouchEventCallback.java @@ -3,7 +3,7 @@ import org.andengine.input.touch.TouchEvent; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:44:26 - 04.04.2012 diff --git a/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java b/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java index c2ed96b79..f27fbf1f7 100644 --- a/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java +++ b/src/org/andengine/input/touch/detector/SurfaceGestureDetectorAdapter.java @@ -3,7 +3,7 @@ import android.content.Context; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:53:40 - 04.04.2012 diff --git a/src/org/andengine/opengl/GLES20Fix.java b/src/org/andengine/opengl/GLES20Fix.java index 130be06d6..6f4a14c42 100644 --- a/src/org/andengine/opengl/GLES20Fix.java +++ b/src/org/andengine/opengl/GLES20Fix.java @@ -8,7 +8,7 @@ import android.os.Build; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:44:43 - 04.09.2011 diff --git a/src/org/andengine/opengl/exception/GLException.java b/src/org/andengine/opengl/exception/GLException.java index 2f54ea6f0..9d38587a9 100644 --- a/src/org/andengine/opengl/exception/GLException.java +++ b/src/org/andengine/opengl/exception/GLException.java @@ -3,7 +3,7 @@ import android.opengl.GLU; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 10:44:27 - 13.02.2012 diff --git a/src/org/andengine/opengl/exception/GLFrameBufferException.java b/src/org/andengine/opengl/exception/GLFrameBufferException.java index fc050dac6..71133b4ef 100644 --- a/src/org/andengine/opengl/exception/GLFrameBufferException.java +++ b/src/org/andengine/opengl/exception/GLFrameBufferException.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 10:47:22 - 13.02.2012 diff --git a/src/org/andengine/opengl/exception/RenderTextureInitializationException.java b/src/org/andengine/opengl/exception/RenderTextureInitializationException.java index d3339d9cf..a6bbd8f05 100644 --- a/src/org/andengine/opengl/exception/RenderTextureInitializationException.java +++ b/src/org/andengine/opengl/exception/RenderTextureInitializationException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:59:45 AM - Feb 13, 2012 diff --git a/src/org/andengine/opengl/font/BitmapFont.java b/src/org/andengine/opengl/font/BitmapFont.java index 52c494ed6..4c56735d9 100644 --- a/src/org/andengine/opengl/font/BitmapFont.java +++ b/src/org/andengine/opengl/font/BitmapFont.java @@ -33,7 +33,7 @@ *
  • http://www.angelcode.com/products/bmfont/ (Free, Windows only)
  • * * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:54:59 - 01.11.2011 diff --git a/src/org/andengine/opengl/font/FontUtils.java b/src/org/andengine/opengl/font/FontUtils.java index 2232cde0a..68be92a65 100644 --- a/src/org/andengine/opengl/font/FontUtils.java +++ b/src/org/andengine/opengl/font/FontUtils.java @@ -8,7 +8,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:06:32 - 25.01.2012 diff --git a/src/org/andengine/opengl/font/IFont.java b/src/org/andengine/opengl/font/IFont.java index 946238e4f..8e25f0bd7 100644 --- a/src/org/andengine/opengl/font/IFont.java +++ b/src/org/andengine/opengl/font/IFont.java @@ -4,7 +4,7 @@ import org.andengine.opengl.texture.ITexture; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 12:15:25 - 03.11.2011 diff --git a/src/org/andengine/opengl/font/exception/FontException.java b/src/org/andengine/opengl/font/exception/FontException.java index 93370adaa..8819096d6 100644 --- a/src/org/andengine/opengl/font/exception/FontException.java +++ b/src/org/andengine/opengl/font/exception/FontException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:53:31 - 01.11.2011 diff --git a/src/org/andengine/opengl/font/exception/LetterNotFoundException.java b/src/org/andengine/opengl/font/exception/LetterNotFoundException.java index 49ce1f6db..d32332a37 100644 --- a/src/org/andengine/opengl/font/exception/LetterNotFoundException.java +++ b/src/org/andengine/opengl/font/exception/LetterNotFoundException.java @@ -1,7 +1,7 @@ package org.andengine.opengl.font.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 12:19:24 - 03.11.2011 diff --git a/src/org/andengine/opengl/shader/PositionColorShaderProgram.java b/src/org/andengine/opengl/shader/PositionColorShaderProgram.java index 60f2724cc..1d7e77c3e 100644 --- a/src/org/andengine/opengl/shader/PositionColorShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionColorShaderProgram.java @@ -8,7 +8,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:56:44 - 25.08.2011 diff --git a/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java b/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java index 3e692c27a..de9d4ee92 100644 --- a/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionColorTextureCoordinatesShaderProgram.java @@ -8,7 +8,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:56:44 - 25.08.2011 diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java index 6c51c352b..039172c80 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesPositionInterpolationTextureSelectShaderProgram.java @@ -8,7 +8,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:56:44 - 25.08.2011 diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java index 34e68279f..47f60e501 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesShaderProgram.java @@ -8,7 +8,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:56:44 - 25.08.2011 diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java index 34628c862..b0c11c1e1 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesTextureSelectShaderProgram.java @@ -8,7 +8,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:56:44 - 25.08.2011 diff --git a/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java b/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java index 3bec5ca2b..b81131085 100644 --- a/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java +++ b/src/org/andengine/opengl/shader/PositionTextureCoordinatesUniformColorShaderProgram.java @@ -8,7 +8,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:00:46 - 13.02.2012 diff --git a/src/org/andengine/opengl/shader/ShaderProgram.java b/src/org/andengine/opengl/shader/ShaderProgram.java index adaecfdeb..944c2a8d1 100644 --- a/src/org/andengine/opengl/shader/ShaderProgram.java +++ b/src/org/andengine/opengl/shader/ShaderProgram.java @@ -16,7 +16,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 19:56:34 - 05.08.2011 diff --git a/src/org/andengine/opengl/shader/constants/ShaderProgramConstants.java b/src/org/andengine/opengl/shader/constants/ShaderProgramConstants.java index c36f04c1e..e007f18a8 100644 --- a/src/org/andengine/opengl/shader/constants/ShaderProgramConstants.java +++ b/src/org/andengine/opengl/shader/constants/ShaderProgramConstants.java @@ -1,7 +1,7 @@ package org.andengine.opengl.shader.constants; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 01:03:16 - 07.08.2011 diff --git a/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java b/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java index 8651b7013..bc5f0945d 100644 --- a/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java +++ b/src/org/andengine/opengl/shader/exception/ShaderProgramCompileException.java @@ -1,6 +1,6 @@ package org.andengine.opengl.shader.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 02:31:53 - 07.08.2011 diff --git a/src/org/andengine/opengl/shader/exception/ShaderProgramException.java b/src/org/andengine/opengl/shader/exception/ShaderProgramException.java index d507e91dc..c8d08f4a4 100644 --- a/src/org/andengine/opengl/shader/exception/ShaderProgramException.java +++ b/src/org/andengine/opengl/shader/exception/ShaderProgramException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 02:33:27 - 07.08.2011 diff --git a/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java b/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java index d7fe66094..0cf63f0e5 100644 --- a/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java +++ b/src/org/andengine/opengl/shader/exception/ShaderProgramLinkException.java @@ -1,6 +1,6 @@ package org.andengine.opengl.shader.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 02:31:54 - 07.08.2011 diff --git a/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java b/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java index 77fdb2007..1f1b48d65 100644 --- a/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java +++ b/src/org/andengine/opengl/shader/source/CriteriaShaderSource.java @@ -5,7 +5,7 @@ import org.andengine.opengl.util.criteria.IGLCriteria; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:30:12 - 10.10.2011 diff --git a/src/org/andengine/opengl/shader/source/IShaderSource.java b/src/org/andengine/opengl/shader/source/IShaderSource.java index 3d98f8a38..063fc5be2 100644 --- a/src/org/andengine/opengl/shader/source/IShaderSource.java +++ b/src/org/andengine/opengl/shader/source/IShaderSource.java @@ -3,7 +3,7 @@ import org.andengine.opengl.util.GLState; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:24:57 - 10.10.2011 diff --git a/src/org/andengine/opengl/shader/source/StringShaderSource.java b/src/org/andengine/opengl/shader/source/StringShaderSource.java index 73aec8752..7ef30d402 100644 --- a/src/org/andengine/opengl/shader/source/StringShaderSource.java +++ b/src/org/andengine/opengl/shader/source/StringShaderSource.java @@ -3,7 +3,7 @@ import org.andengine.opengl.util.GLState; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:26:08 - 10.10.2011 diff --git a/src/org/andengine/opengl/texture/DebugTextureStateListener.java b/src/org/andengine/opengl/texture/DebugTextureStateListener.java index d80f12700..e5f70d22a 100644 --- a/src/org/andengine/opengl/texture/DebugTextureStateListener.java +++ b/src/org/andengine/opengl/texture/DebugTextureStateListener.java @@ -5,7 +5,7 @@ import org.andengine.util.debug.Debug; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:26:41 - 05.04.2012 diff --git a/src/org/andengine/opengl/texture/EmptyTexture.java b/src/org/andengine/opengl/texture/EmptyTexture.java index 7615f8b9e..ee240dc69 100644 --- a/src/org/andengine/opengl/texture/EmptyTexture.java +++ b/src/org/andengine/opengl/texture/EmptyTexture.java @@ -7,7 +7,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 3:07:48 PM - Apr 24, 2012 diff --git a/src/org/andengine/opengl/texture/ITextureStateListener.java b/src/org/andengine/opengl/texture/ITextureStateListener.java index 9df32f739..3f77bb2f5 100644 --- a/src/org/andengine/opengl/texture/ITextureStateListener.java +++ b/src/org/andengine/opengl/texture/ITextureStateListener.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:25:58 - 05.04.2012 diff --git a/src/org/andengine/opengl/texture/TextureStateAdapter.java b/src/org/andengine/opengl/texture/TextureStateAdapter.java index 2aabbc993..cc67369a1 100644 --- a/src/org/andengine/opengl/texture/TextureStateAdapter.java +++ b/src/org/andengine/opengl/texture/TextureStateAdapter.java @@ -3,7 +3,7 @@ import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:28:20 - 05.04.2012 diff --git a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java index 8a0856903..087a753fe 100644 --- a/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java +++ b/src/org/andengine/opengl/texture/TextureWarmUpVertexBufferObject.java @@ -14,7 +14,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:11:05 - 15.05.2012 diff --git a/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java index bfba68606..d5d798a3a 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java @@ -8,7 +8,7 @@ import org.andengine.util.call.Callback; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:17:47 - 23.01.2012 diff --git a/src/org/andengine/opengl/texture/bitmap/AssetBitmapTexture.java b/src/org/andengine/opengl/texture/bitmap/AssetBitmapTexture.java index 34096bd55..309a477a2 100644 --- a/src/org/andengine/opengl/texture/bitmap/AssetBitmapTexture.java +++ b/src/org/andengine/opengl/texture/bitmap/AssetBitmapTexture.java @@ -10,7 +10,7 @@ import android.content.res.AssetManager; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 10:45:48 - 02.03.2012 diff --git a/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java b/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java index 03a9cbccc..588c49334 100644 --- a/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java +++ b/src/org/andengine/opengl/texture/bitmap/BitmapTexture.java @@ -21,7 +21,7 @@ import android.opengl.GLUtils; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:16:25 - 30.07.2011 diff --git a/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java b/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java index 4b4e50450..dd9e88797 100644 --- a/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java +++ b/src/org/andengine/opengl/texture/bitmap/BitmapTextureFormat.java @@ -5,7 +5,7 @@ import android.graphics.Bitmap.Config; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:36:45 - 05.04.2012 diff --git a/src/org/andengine/opengl/texture/bitmap/ResourceBitmapTexture.java b/src/org/andengine/opengl/texture/bitmap/ResourceBitmapTexture.java index af2e6424e..1a639f3bd 100644 --- a/src/org/andengine/opengl/texture/bitmap/ResourceBitmapTexture.java +++ b/src/org/andengine/opengl/texture/bitmap/ResourceBitmapTexture.java @@ -10,7 +10,7 @@ import android.content.res.Resources; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:10:08 - 02.03.2012 diff --git a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/GreedyPVRTexturePixelBufferStrategy.java b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/GreedyPVRTexturePixelBufferStrategy.java index 8162694ce..deee6100c 100644 --- a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/GreedyPVRTexturePixelBufferStrategy.java +++ b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/GreedyPVRTexturePixelBufferStrategy.java @@ -11,7 +11,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 11:26:07 - 27.09.2011 diff --git a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/IPVRTexturePixelBufferStrategy.java b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/IPVRTexturePixelBufferStrategy.java index ca6375e3f..564974b02 100644 --- a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/IPVRTexturePixelBufferStrategy.java +++ b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/IPVRTexturePixelBufferStrategy.java @@ -7,7 +7,7 @@ import org.andengine.opengl.texture.compressed.pvr.PVRTexture; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 11:26:07 - 27.09.2011 diff --git a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java index 1f7053279..476b3a132 100644 --- a/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java +++ b/src/org/andengine/opengl/texture/compressed/pvr/pixelbufferstrategy/SmartPVRTexturePixelBufferStrategy.java @@ -14,7 +14,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 11:26:07 - 27.09.2011 diff --git a/src/org/andengine/opengl/texture/region/ITextureRegion.java b/src/org/andengine/opengl/texture/region/ITextureRegion.java index fd236d259..daf8dadd0 100644 --- a/src/org/andengine/opengl/texture/region/ITextureRegion.java +++ b/src/org/andengine/opengl/texture/region/ITextureRegion.java @@ -4,7 +4,7 @@ import org.andengine.util.modifier.IModifier.DeepCopyNotSupportedException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:07:17 - 07.08.2011 diff --git a/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java b/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java index f7577da37..acdcf7382 100644 --- a/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java +++ b/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java @@ -1,7 +1,7 @@ package org.andengine.opengl.texture.region; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:31:52 - 08.08.2011 diff --git a/src/org/andengine/opengl/texture/render/RenderTexture.java b/src/org/andengine/opengl/texture/render/RenderTexture.java index 67a0e523e..ec5d13fcd 100644 --- a/src/org/andengine/opengl/texture/render/RenderTexture.java +++ b/src/org/andengine/opengl/texture/render/RenderTexture.java @@ -22,7 +22,7 @@ /** * The general workflow with a {@link RenderTexture} is: {@link RenderTexture#init(GLState)} -> {@link RenderTexture#begin(GLState)} -> {@link RenderTexture#end(GLState)} -> {@link RenderTexture#destroy(GLState)}. * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 07:13:05 - 24.08.2011 diff --git a/src/org/andengine/opengl/util/BufferUtils.java b/src/org/andengine/opengl/util/BufferUtils.java index 64fa68180..ece1e9038 100644 --- a/src/org/andengine/opengl/util/BufferUtils.java +++ b/src/org/andengine/opengl/util/BufferUtils.java @@ -8,7 +8,7 @@ import android.os.Build; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:06:51 - 11.08.2011 diff --git a/src/org/andengine/opengl/util/GLMatrixStack.java b/src/org/andengine/opengl/util/GLMatrixStack.java index 306428b3d..03b796401 100644 --- a/src/org/andengine/opengl/util/GLMatrixStack.java +++ b/src/org/andengine/opengl/util/GLMatrixStack.java @@ -8,7 +8,7 @@ /** * TODO Measure performance with inlined or native Matrix implementations. * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:49:23 - 04.08.2011 diff --git a/src/org/andengine/opengl/util/VertexUtils.java b/src/org/andengine/opengl/util/VertexUtils.java index 6aa852add..4066da277 100644 --- a/src/org/andengine/opengl/util/VertexUtils.java +++ b/src/org/andengine/opengl/util/VertexUtils.java @@ -1,7 +1,7 @@ package org.andengine.opengl.util; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:18:30 - 10.02.2012 diff --git a/src/org/andengine/opengl/util/criteria/AndroidVersionCodeGLCriteria.java b/src/org/andengine/opengl/util/criteria/AndroidVersionCodeGLCriteria.java index 720ad91dd..10bc2bca7 100644 --- a/src/org/andengine/opengl/util/criteria/AndroidVersionCodeGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/AndroidVersionCodeGLCriteria.java @@ -6,7 +6,7 @@ import android.os.Build; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:21:13 - 10.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/BuildModelGLCriteria.java b/src/org/andengine/opengl/util/criteria/BuildModelGLCriteria.java index a95a582b9..9e4274398 100644 --- a/src/org/andengine/opengl/util/criteria/BuildModelGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/BuildModelGLCriteria.java @@ -6,7 +6,7 @@ import android.os.Build; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:25:47 - 10.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/GLExtensionsGLCriteria.java b/src/org/andengine/opengl/util/criteria/GLExtensionsGLCriteria.java index d66a4f901..4f8cb2a64 100644 --- a/src/org/andengine/opengl/util/criteria/GLExtensionsGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/GLExtensionsGLCriteria.java @@ -4,7 +4,7 @@ import org.andengine.util.adt.data.operator.StringOperator; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 21:02:01 - 10.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/GLRendererGLCriteria.java b/src/org/andengine/opengl/util/criteria/GLRendererGLCriteria.java index 09d68f58f..4cf5161bd 100644 --- a/src/org/andengine/opengl/util/criteria/GLRendererGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/GLRendererGLCriteria.java @@ -4,7 +4,7 @@ import org.andengine.util.adt.data.operator.StringOperator; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:04:27 - 10.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/GLVersionGLCriteria.java b/src/org/andengine/opengl/util/criteria/GLVersionGLCriteria.java index 0ba3a0a2d..35bd17a99 100644 --- a/src/org/andengine/opengl/util/criteria/GLVersionGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/GLVersionGLCriteria.java @@ -4,7 +4,7 @@ import org.andengine.util.adt.data.operator.StringOperator; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:52:33 - 10.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/IGLCriteria.java b/src/org/andengine/opengl/util/criteria/IGLCriteria.java index 9d5dea5ec..5034c9ebf 100644 --- a/src/org/andengine/opengl/util/criteria/IGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/IGLCriteria.java @@ -3,7 +3,7 @@ import org.andengine.opengl.util.GLState; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:43:34 - 10.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/IntGLCriteria.java b/src/org/andengine/opengl/util/criteria/IntGLCriteria.java index 84ec11bb8..62029d473 100644 --- a/src/org/andengine/opengl/util/criteria/IntGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/IntGLCriteria.java @@ -4,7 +4,7 @@ import org.andengine.util.adt.data.operator.IntOperator; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:59:32 - 10.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java b/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java index 85d7e0f61..2bfd55a3b 100644 --- a/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/LogicalAndGLCriteria.java @@ -3,7 +3,7 @@ import org.andengine.opengl.util.GLState; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 18:15:55 - 12.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java b/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java index fad76787d..2db011646 100644 --- a/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/LogicalOrGLCriteria.java @@ -3,7 +3,7 @@ import org.andengine.opengl.util.GLState; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 18:10:26 - 12.10.2011 diff --git a/src/org/andengine/opengl/util/criteria/StringGLCriteria.java b/src/org/andengine/opengl/util/criteria/StringGLCriteria.java index 12bd2599a..400bd3664 100644 --- a/src/org/andengine/opengl/util/criteria/StringGLCriteria.java +++ b/src/org/andengine/opengl/util/criteria/StringGLCriteria.java @@ -4,7 +4,7 @@ import org.andengine.util.adt.data.operator.StringOperator; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:59:32 - 10.10.2011 diff --git a/src/org/andengine/opengl/vbo/DrawType.java b/src/org/andengine/opengl/vbo/DrawType.java index d932fe311..ae166bc4f 100644 --- a/src/org/andengine/opengl/vbo/DrawType.java +++ b/src/org/andengine/opengl/vbo/DrawType.java @@ -3,7 +3,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:41:14 - 27.03.2012 diff --git a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java index 6833bcd61..72f8aa9fb 100644 --- a/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/HighPerformanceVertexBufferObject.java @@ -14,7 +14,7 @@ * * @see {@link LowMemoryVertexBufferObject} when to prefer a {@link LowMemoryVertexBufferObject} instead of a {@link HighPerformanceVertexBufferObject} * - *

    (c) Zynga 2011

    + *

    (c) 2011 Zynga Inc.

    * * @author Nicolas Gramlich * @since 14:42:18 - 15.11.2011 diff --git a/src/org/andengine/opengl/vbo/IVertexBufferObject.java b/src/org/andengine/opengl/vbo/IVertexBufferObject.java index aa7023c7b..67560efca 100644 --- a/src/org/andengine/opengl/vbo/IVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/IVertexBufferObject.java @@ -7,7 +7,7 @@ import org.andengine.util.IDisposable; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:32:10 - 15.11.2011 diff --git a/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java index 7966e7dfe..0b0fc4dc1 100644 --- a/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/LowMemoryVertexBufferObject.java @@ -17,7 +17,7 @@ *
  • The content (color, vertices, texturecoordinates) of the {@link LowMemoryVertexBufferObject} is changed not often, or even better: never.
  • * * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:42:18 - 15.11.2011 diff --git a/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java index 396f065a5..87306405b 100644 --- a/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/SharedMemoryVertexBufferObject.java @@ -16,7 +16,7 @@ *
  • Minimum amount of runtime GarbageCollector activity.
  • * *

    - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @author Greg Haynes diff --git a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java index ce6f45751..9f3ad76f1 100644 --- a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java @@ -22,7 +22,7 @@ *

  • The content (color, vertices, texturecoordinates) of the {@link ZeroMemoryVertexBufferObject} is changed not often, or even better: never.
  • * *

    - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @author Greg Haynes diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttribute.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttribute.java index 0c2bad7e2..d1d525544 100644 --- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttribute.java +++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttribute.java @@ -3,7 +3,7 @@ import android.opengl.GLES20; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:57:13 - 15.08.2011 diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java index 5282337f1..719db1d03 100644 --- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java +++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributeFix.java @@ -4,7 +4,7 @@ /** * The {@link VertexBufferObjectAttributeFix} is a special - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:52:33 - 08.03.2012 diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java index 5a1fb121d..0496763e5 100644 --- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java +++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributes.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:22:06 - 15.08.2011 diff --git a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java index dc7fdfdc0..c2bb6e780 100644 --- a/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java +++ b/src/org/andengine/opengl/vbo/attribute/VertexBufferObjectAttributesBuilder.java @@ -8,7 +8,7 @@ import android.os.Build; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:58:05 - 15.08.2011 diff --git a/src/org/andengine/opengl/view/ConfigChooser.java b/src/org/andengine/opengl/view/ConfigChooser.java index 1c24857f3..680ec38c1 100644 --- a/src/org/andengine/opengl/view/ConfigChooser.java +++ b/src/org/andengine/opengl/view/ConfigChooser.java @@ -9,7 +9,7 @@ import android.opengl.GLSurfaceView; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 15:31:48 - 04.08.2011 diff --git a/src/org/andengine/opengl/view/ConfigChooserMatcher.java b/src/org/andengine/opengl/view/ConfigChooserMatcher.java index 4d74c78a3..0d0035249 100644 --- a/src/org/andengine/opengl/view/ConfigChooserMatcher.java +++ b/src/org/andengine/opengl/view/ConfigChooserMatcher.java @@ -1,7 +1,7 @@ package org.andengine.opengl.view; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:34:13 - 12.05.2012 diff --git a/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java b/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java index 3c66090de..51485affa 100644 --- a/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleAsyncGameActivity.java @@ -7,7 +7,7 @@ import org.andengine.util.progress.ProgressCallable; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 01:24:18 - 03.12.2011 diff --git a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java index 6cf4508db..935be3ad1 100644 --- a/src/org/andengine/ui/activity/SimpleBaseGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleBaseGameActivity.java @@ -9,7 +9,7 @@ /** * This class exists so that the callback parameters of the methods in {@link IGameInterface} get called automatically. * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 19:05:42 - 23.12.2011 diff --git a/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java b/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java index 6dbc7259b..8ead0146d 100644 --- a/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java +++ b/src/org/andengine/ui/activity/SimpleLayoutGameActivity.java @@ -9,7 +9,7 @@ /** * This class exists so that the callback parameters of the methods in {@link IGameInterface} get called automatically. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 3:11:05 PM - Jan 12, 2012 diff --git a/src/org/andengine/util/IDisposable.java b/src/org/andengine/util/IDisposable.java index cc16d46d1..a776f4651 100644 --- a/src/org/andengine/util/IDisposable.java +++ b/src/org/andengine/util/IDisposable.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 00:45:48 - 17.01.2012 diff --git a/src/org/andengine/util/ThreadUtils.java b/src/org/andengine/util/ThreadUtils.java index c9aa0504a..4e79d344b 100644 --- a/src/org/andengine/util/ThreadUtils.java +++ b/src/org/andengine/util/ThreadUtils.java @@ -4,7 +4,7 @@ import org.andengine.util.debug.Debug.DebugLevel; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:23:06 - 19.01.2012 diff --git a/src/org/andengine/util/adt/bit/IBitVector.java b/src/org/andengine/util/adt/bit/IBitVector.java index 9f8832014..0c9a36f7d 100644 --- a/src/org/andengine/util/adt/bit/IBitVector.java +++ b/src/org/andengine/util/adt/bit/IBitVector.java @@ -4,7 +4,7 @@ import java.io.IOException; /** - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 18:14:12 - 02.03.2013 diff --git a/src/org/andengine/util/adt/bit/LongBackedBitVector.java b/src/org/andengine/util/adt/bit/LongBackedBitVector.java index a677fe2d9..249836a0f 100644 --- a/src/org/andengine/util/adt/bit/LongBackedBitVector.java +++ b/src/org/andengine/util/adt/bit/LongBackedBitVector.java @@ -10,7 +10,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 15:56:32 - 30.10.2011 diff --git a/src/org/andengine/util/adt/bounds/BoundsSplit.java b/src/org/andengine/util/adt/bounds/BoundsSplit.java index f8641bc31..67607e641 100644 --- a/src/org/andengine/util/adt/bounds/BoundsSplit.java +++ b/src/org/andengine/util/adt/bounds/BoundsSplit.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 21:13:32 - 11.10.2011 diff --git a/src/org/andengine/util/adt/bounds/FloatBounds.java b/src/org/andengine/util/adt/bounds/FloatBounds.java index 35737814c..ed29a18b3 100644 --- a/src/org/andengine/util/adt/bounds/FloatBounds.java +++ b/src/org/andengine/util/adt/bounds/FloatBounds.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.spatial.bounds.util.FloatBoundsUtils; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 21:48:53 - 11.10.2011 diff --git a/src/org/andengine/util/adt/bounds/IBounds.java b/src/org/andengine/util/adt/bounds/IBounds.java index b0f10a36b..c5a0cbd82 100644 --- a/src/org/andengine/util/adt/bounds/IBounds.java +++ b/src/org/andengine/util/adt/bounds/IBounds.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.bounds; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 7:45:19 AM - Oct 10, 2011 diff --git a/src/org/andengine/util/adt/bounds/IFloatBounds.java b/src/org/andengine/util/adt/bounds/IFloatBounds.java index a6d022be7..3b3d85a19 100644 --- a/src/org/andengine/util/adt/bounds/IFloatBounds.java +++ b/src/org/andengine/util/adt/bounds/IFloatBounds.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.bounds; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 7:42:02 AM - Oct 10, 2011 diff --git a/src/org/andengine/util/adt/bounds/IIntBounds.java b/src/org/andengine/util/adt/bounds/IIntBounds.java index c416f8aae..2711cbd9c 100644 --- a/src/org/andengine/util/adt/bounds/IIntBounds.java +++ b/src/org/andengine/util/adt/bounds/IIntBounds.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.bounds; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 7:42:02 AM - Oct 10, 2011 diff --git a/src/org/andengine/util/adt/bounds/IntBounds.java b/src/org/andengine/util/adt/bounds/IntBounds.java index ea2111f94..52ea14062 100644 --- a/src/org/andengine/util/adt/bounds/IntBounds.java +++ b/src/org/andengine/util/adt/bounds/IntBounds.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.spatial.bounds.util.IntBoundsUtils; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 21:45:04 - 11.11.2011 diff --git a/src/org/andengine/util/adt/cache/IntLRUCache.java b/src/org/andengine/util/adt/cache/IntLRUCache.java index 9e23e8c7d..22d523fe8 100644 --- a/src/org/andengine/util/adt/cache/IntLRUCache.java +++ b/src/org/andengine/util/adt/cache/IntLRUCache.java @@ -5,7 +5,7 @@ import android.util.SparseArray; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 12:19:22 - 08.12.2011 diff --git a/src/org/andengine/util/adt/cache/LRUCache.java b/src/org/andengine/util/adt/cache/LRUCache.java index 7b3b919c1..0c378a99e 100644 --- a/src/org/andengine/util/adt/cache/LRUCache.java +++ b/src/org/andengine/util/adt/cache/LRUCache.java @@ -5,7 +5,7 @@ import org.andengine.util.adt.pool.GenericPool; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 00:24:52 - 02.11.2011 diff --git a/src/org/andengine/util/adt/cache/concurrent/SynchronizedIntLRUCache.java b/src/org/andengine/util/adt/cache/concurrent/SynchronizedIntLRUCache.java index 91d854b51..1d1c4a667 100644 --- a/src/org/andengine/util/adt/cache/concurrent/SynchronizedIntLRUCache.java +++ b/src/org/andengine/util/adt/cache/concurrent/SynchronizedIntLRUCache.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.cache.IntLRUCache; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:26:47 - 16.01.2012 diff --git a/src/org/andengine/util/adt/cache/concurrent/SynchronizedLRUCache.java b/src/org/andengine/util/adt/cache/concurrent/SynchronizedLRUCache.java index e56b7d178..084333adb 100644 --- a/src/org/andengine/util/adt/cache/concurrent/SynchronizedLRUCache.java +++ b/src/org/andengine/util/adt/cache/concurrent/SynchronizedLRUCache.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.cache.LRUCache; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:26:47 - 16.01.2012 diff --git a/src/org/andengine/util/adt/color/Color.java b/src/org/andengine/util/adt/color/Color.java index aa8f1db86..1f8d4c622 100644 --- a/src/org/andengine/util/adt/color/Color.java +++ b/src/org/andengine/util/adt/color/Color.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.color; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 02:23:08 - 12.08.2011 diff --git a/src/org/andengine/util/adt/color/ColorPool.java b/src/org/andengine/util/adt/color/ColorPool.java index bf17deb02..036fd3a13 100644 --- a/src/org/andengine/util/adt/color/ColorPool.java +++ b/src/org/andengine/util/adt/color/ColorPool.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.pool.GenericPool; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 2:25:20 - 12.08.2011 diff --git a/src/org/andengine/util/adt/data/operator/ByteOperator.java b/src/org/andengine/util/adt/data/operator/ByteOperator.java index c6c50a290..9c4749a1f 100644 --- a/src/org/andengine/util/adt/data/operator/ByteOperator.java +++ b/src/org/andengine/util/adt/data/operator/ByteOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:24:15 - 02.02.2012 diff --git a/src/org/andengine/util/adt/data/operator/CharOperator.java b/src/org/andengine/util/adt/data/operator/CharOperator.java index 3eb9041c6..dbb77646f 100644 --- a/src/org/andengine/util/adt/data/operator/CharOperator.java +++ b/src/org/andengine/util/adt/data/operator/CharOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:24:15 - 02.02.2012 diff --git a/src/org/andengine/util/adt/data/operator/DoubleOperator.java b/src/org/andengine/util/adt/data/operator/DoubleOperator.java index 7ef30bf2a..48835735c 100644 --- a/src/org/andengine/util/adt/data/operator/DoubleOperator.java +++ b/src/org/andengine/util/adt/data/operator/DoubleOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:24:15 - 02.02.2012 diff --git a/src/org/andengine/util/adt/data/operator/FloatOperator.java b/src/org/andengine/util/adt/data/operator/FloatOperator.java index 449c41135..1346f6286 100644 --- a/src/org/andengine/util/adt/data/operator/FloatOperator.java +++ b/src/org/andengine/util/adt/data/operator/FloatOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:24:15 - 02.02.2012 diff --git a/src/org/andengine/util/adt/data/operator/IntOperator.java b/src/org/andengine/util/adt/data/operator/IntOperator.java index 182673d96..ca6e67ad0 100644 --- a/src/org/andengine/util/adt/data/operator/IntOperator.java +++ b/src/org/andengine/util/adt/data/operator/IntOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:21:27 - 10.10.2011 diff --git a/src/org/andengine/util/adt/data/operator/LongOperator.java b/src/org/andengine/util/adt/data/operator/LongOperator.java index 159309481..97cfc1844 100644 --- a/src/org/andengine/util/adt/data/operator/LongOperator.java +++ b/src/org/andengine/util/adt/data/operator/LongOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:24:15 - 02.02.2012 diff --git a/src/org/andengine/util/adt/data/operator/ShortOperator.java b/src/org/andengine/util/adt/data/operator/ShortOperator.java index 630f23ff1..29c73e5b8 100644 --- a/src/org/andengine/util/adt/data/operator/ShortOperator.java +++ b/src/org/andengine/util/adt/data/operator/ShortOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:24:15 - 02.02.2012 diff --git a/src/org/andengine/util/adt/data/operator/StringOperator.java b/src/org/andengine/util/adt/data/operator/StringOperator.java index 9134ab08b..745f995bd 100644 --- a/src/org/andengine/util/adt/data/operator/StringOperator.java +++ b/src/org/andengine/util/adt/data/operator/StringOperator.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.data.operator; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:57:05 - 10.10.2011 diff --git a/src/org/andengine/util/adt/io/in/AssetInputStreamOpener.java b/src/org/andengine/util/adt/io/in/AssetInputStreamOpener.java index e33b7388c..acef4a24e 100644 --- a/src/org/andengine/util/adt/io/in/AssetInputStreamOpener.java +++ b/src/org/andengine/util/adt/io/in/AssetInputStreamOpener.java @@ -6,7 +6,7 @@ import android.content.res.AssetManager; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:05:38 - 02.03.2012 diff --git a/src/org/andengine/util/adt/io/in/ByteArrayInputStreamOpener.java b/src/org/andengine/util/adt/io/in/ByteArrayInputStreamOpener.java index 460eb8763..bc88e9bd7 100644 --- a/src/org/andengine/util/adt/io/in/ByteArrayInputStreamOpener.java +++ b/src/org/andengine/util/adt/io/in/ByteArrayInputStreamOpener.java @@ -5,7 +5,7 @@ import java.io.InputStream; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:51:10 - 16.03.2012 diff --git a/src/org/andengine/util/adt/io/in/IInputStreamOpener.java b/src/org/andengine/util/adt/io/in/IInputStreamOpener.java index 40827855a..aa79879ef 100644 --- a/src/org/andengine/util/adt/io/in/IInputStreamOpener.java +++ b/src/org/andengine/util/adt/io/in/IInputStreamOpener.java @@ -4,7 +4,7 @@ import java.io.InputStream; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:54:25 - 02.03.2012 diff --git a/src/org/andengine/util/adt/io/in/ResourceInputStreamOpener.java b/src/org/andengine/util/adt/io/in/ResourceInputStreamOpener.java index a9ac64b71..a8973f1ae 100644 --- a/src/org/andengine/util/adt/io/in/ResourceInputStreamOpener.java +++ b/src/org/andengine/util/adt/io/in/ResourceInputStreamOpener.java @@ -6,7 +6,7 @@ import android.content.res.Resources; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:07:14 - 02.03.2012 diff --git a/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java b/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java index 0056e712d..af3c93333 100644 --- a/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java +++ b/src/org/andengine/util/adt/io/out/ByteBufferOutputStream.java @@ -7,7 +7,7 @@ /** * TODO Instead of having mMaximumGrow there could be some kind of AllocationStrategy object. * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 02:19:02 - 14.08.2011 diff --git a/src/org/andengine/util/adt/list/BooleanArrayList.java b/src/org/andengine/util/adt/list/BooleanArrayList.java index 8e0336a10..f3e877737 100644 --- a/src/org/andengine/util/adt/list/BooleanArrayList.java +++ b/src/org/andengine/util/adt/list/BooleanArrayList.java @@ -3,7 +3,7 @@ /** * TODO This class could take some kind of AllocationStrategy object. * - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:10:25 - 19.01.2013 diff --git a/src/org/andengine/util/adt/list/ByteArrayList.java b/src/org/andengine/util/adt/list/ByteArrayList.java index 3955a2b31..5cf6f4052 100644 --- a/src/org/andengine/util/adt/list/ByteArrayList.java +++ b/src/org/andengine/util/adt/list/ByteArrayList.java @@ -3,7 +3,7 @@ /** * TODO This class could take some kind of AllocationStrategy object. * - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:17:43 - 19.01.2013 diff --git a/src/org/andengine/util/adt/list/CharArrayList.java b/src/org/andengine/util/adt/list/CharArrayList.java index 24eee3a76..1feebe02d 100644 --- a/src/org/andengine/util/adt/list/CharArrayList.java +++ b/src/org/andengine/util/adt/list/CharArrayList.java @@ -3,7 +3,7 @@ /** * TODO This class could take some kind of AllocationStrategy object. * - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:13:55 - 19.01.2013 diff --git a/src/org/andengine/util/adt/list/CircularList.java b/src/org/andengine/util/adt/list/CircularList.java index 8863cc25a..271a5debd 100644 --- a/src/org/andengine/util/adt/list/CircularList.java +++ b/src/org/andengine/util/adt/list/CircularList.java @@ -9,7 +9,7 @@ * Its {@link java.util.Queue} like behavior performs better than a plain {@link java.util.ArrayList}, since it automatically shift the contents of its internal Array only when really necessary. * Besides sparse allocations to increase the size of the internal Array, {@link CircularList} is allocation free (unlike the {@link java.util.LinkedList} family). * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Greg Haynes * @author Nicolas Gramlich diff --git a/src/org/andengine/util/adt/list/DoubleArrayList.java b/src/org/andengine/util/adt/list/DoubleArrayList.java index 37786b4fe..e53c85cf3 100644 --- a/src/org/andengine/util/adt/list/DoubleArrayList.java +++ b/src/org/andengine/util/adt/list/DoubleArrayList.java @@ -3,7 +3,7 @@ /** * TODO This class could take some kind of AllocationStrategy object. * - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:18:43 - 19.01.2013 diff --git a/src/org/andengine/util/adt/list/FloatArrayList.java b/src/org/andengine/util/adt/list/FloatArrayList.java index 0aabda4b6..ad4588dd6 100644 --- a/src/org/andengine/util/adt/list/FloatArrayList.java +++ b/src/org/andengine/util/adt/list/FloatArrayList.java @@ -3,7 +3,7 @@ /** * TODO This class could take some kind of AllocationStrategy object. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:07:43 - 26.01.2012 diff --git a/src/org/andengine/util/adt/list/IBooleanList.java b/src/org/andengine/util/adt/list/IBooleanList.java index d8f084b6b..74cf488d7 100644 --- a/src/org/andengine/util/adt/list/IBooleanList.java +++ b/src/org/andengine/util/adt/list/IBooleanList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:05:14 - 19.01.2013 diff --git a/src/org/andengine/util/adt/list/IByteList.java b/src/org/andengine/util/adt/list/IByteList.java index fc9ba7ad2..d1b4e0074 100644 --- a/src/org/andengine/util/adt/list/IByteList.java +++ b/src/org/andengine/util/adt/list/IByteList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:18:45 - 19.01.2013 diff --git a/src/org/andengine/util/adt/list/ICharList.java b/src/org/andengine/util/adt/list/ICharList.java index 00d50fdd8..495db2eec 100644 --- a/src/org/andengine/util/adt/list/ICharList.java +++ b/src/org/andengine/util/adt/list/ICharList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:13:13 - 10.01.2013 diff --git a/src/org/andengine/util/adt/list/IDoubleList.java b/src/org/andengine/util/adt/list/IDoubleList.java index 4676dfd24..40e85d05a 100644 --- a/src/org/andengine/util/adt/list/IDoubleList.java +++ b/src/org/andengine/util/adt/list/IDoubleList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2013 + * (c) 2013 Zynga Inc. * * @author Nicolas Gramlich * @since 13:18:46 - 19.01.2013 diff --git a/src/org/andengine/util/adt/list/IFloatList.java b/src/org/andengine/util/adt/list/IFloatList.java index 1a9785bcc..5df4ca2e6 100644 --- a/src/org/andengine/util/adt/list/IFloatList.java +++ b/src/org/andengine/util/adt/list/IFloatList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 11:14:45 - 27.01.2012 diff --git a/src/org/andengine/util/adt/list/IIntList.java b/src/org/andengine/util/adt/list/IIntList.java index 59fbbbc60..a405f8e6a 100644 --- a/src/org/andengine/util/adt/list/IIntList.java +++ b/src/org/andengine/util/adt/list/IIntList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 19:21:53 - 03.05.2012 diff --git a/src/org/andengine/util/adt/list/IList.java b/src/org/andengine/util/adt/list/IList.java index 8749557b7..43c511e1c 100644 --- a/src/org/andengine/util/adt/list/IList.java +++ b/src/org/andengine/util/adt/list/IList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:27:16 - 01.02.2012 diff --git a/src/org/andengine/util/adt/list/ILongList.java b/src/org/andengine/util/adt/list/ILongList.java index 2c9732fe9..17eb608fd 100644 --- a/src/org/andengine/util/adt/list/ILongList.java +++ b/src/org/andengine/util/adt/list/ILongList.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.list; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 19:36:57 - 03.05.2012 diff --git a/src/org/andengine/util/adt/list/ISortedList.java b/src/org/andengine/util/adt/list/ISortedList.java index f8c846449..c4d48b0e9 100644 --- a/src/org/andengine/util/adt/list/ISortedList.java +++ b/src/org/andengine/util/adt/list/ISortedList.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:37:19 - 01.02.2012 diff --git a/src/org/andengine/util/adt/list/IUniqueList.java b/src/org/andengine/util/adt/list/IUniqueList.java index 5afcd59f2..a194a4b16 100644 --- a/src/org/andengine/util/adt/list/IUniqueList.java +++ b/src/org/andengine/util/adt/list/IUniqueList.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:37:19 - 01.02.2012 diff --git a/src/org/andengine/util/adt/list/IntArrayList.java b/src/org/andengine/util/adt/list/IntArrayList.java index 375de24d2..232491d43 100644 --- a/src/org/andengine/util/adt/list/IntArrayList.java +++ b/src/org/andengine/util/adt/list/IntArrayList.java @@ -3,7 +3,7 @@ /** * TODO This class could take some kind of AllocationStrategy object. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 19:22:29 - 03.05.2012 diff --git a/src/org/andengine/util/adt/list/LongArrayList.java b/src/org/andengine/util/adt/list/LongArrayList.java index 1d1ce9ecf..95df007fa 100644 --- a/src/org/andengine/util/adt/list/LongArrayList.java +++ b/src/org/andengine/util/adt/list/LongArrayList.java @@ -3,7 +3,7 @@ /** * TODO This class could take some kind of AllocationStrategy object. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 19:35:59 - 03.05.2012 diff --git a/src/org/andengine/util/adt/list/ShiftList.java b/src/org/andengine/util/adt/list/ShiftList.java index 6ae48c3c8..124f9bc63 100644 --- a/src/org/andengine/util/adt/list/ShiftList.java +++ b/src/org/andengine/util/adt/list/ShiftList.java @@ -13,7 +13,7 @@ * * Supports null items. * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @author Greg Haynes diff --git a/src/org/andengine/util/adt/list/SortedList.java b/src/org/andengine/util/adt/list/SortedList.java index e0d844359..1e603a3f8 100644 --- a/src/org/andengine/util/adt/list/SortedList.java +++ b/src/org/andengine/util/adt/list/SortedList.java @@ -7,7 +7,7 @@ * Its {@link java.util.List} like behavior performs better than a plain {@link java.util.ArrayList}, since it automatically shift the contents of its internal Array only when really necessary. * Besides sparse allocations to increase the size of the internal Array, {@link com.zynga.mobileville.path.SortedList} is allocation free (unlike the {@link java.util.LinkedList} family). * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @author Greg Haynes diff --git a/src/org/andengine/util/adt/list/UniqueList.java b/src/org/andengine/util/adt/list/UniqueList.java index 290c27a71..68b83dfc9 100644 --- a/src/org/andengine/util/adt/list/UniqueList.java +++ b/src/org/andengine/util/adt/list/UniqueList.java @@ -7,7 +7,7 @@ * Its {@link java.util.List} like behavior performs better than a plain {@link java.util.ArrayList}, since it automatically shift the contents of its internal Array only when really necessary. * Besides sparse allocations to increase the size of the internal Array, {@link com.zynga.mobileville.path.SortedList} is allocation free (unlike the {@link java.util.LinkedList} family). * - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @author Greg Haynes diff --git a/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java b/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java index 55e21ac5a..bbc0e85c1 100644 --- a/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java +++ b/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.list.IList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:23:50 - 01.02.2012 diff --git a/src/org/andengine/util/adt/map/IIntLookupMap.java b/src/org/andengine/util/adt/map/IIntLookupMap.java index b3322ac55..626488c36 100644 --- a/src/org/andengine/util/adt/map/IIntLookupMap.java +++ b/src/org/andengine/util/adt/map/IIntLookupMap.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.map; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:31:34 - 26.04.2012 diff --git a/src/org/andengine/util/adt/map/IntLookupMap.java b/src/org/andengine/util/adt/map/IntLookupMap.java index 302cba8a6..fc1d841df 100644 --- a/src/org/andengine/util/adt/map/IntLookupMap.java +++ b/src/org/andengine/util/adt/map/IntLookupMap.java @@ -5,7 +5,7 @@ import android.util.SparseArray; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:30:35 - 26.04.2012 diff --git a/src/org/andengine/util/adt/map/SparseArrayUtils.java b/src/org/andengine/util/adt/map/SparseArrayUtils.java index 78914efd3..05afddfd8 100644 --- a/src/org/andengine/util/adt/map/SparseArrayUtils.java +++ b/src/org/andengine/util/adt/map/SparseArrayUtils.java @@ -15,7 +15,7 @@ import android.util.SparseIntArray; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:16:35 - 12.04.2012 diff --git a/src/org/andengine/util/adt/queue/CircularQueue.java b/src/org/andengine/util/adt/queue/CircularQueue.java index 7c8ce92cb..6410c995b 100644 --- a/src/org/andengine/util/adt/queue/CircularQueue.java +++ b/src/org/andengine/util/adt/queue/CircularQueue.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.list.CircularList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 17:06:49 - 03.01.2012 diff --git a/src/org/andengine/util/adt/queue/IQueue.java b/src/org/andengine/util/adt/queue/IQueue.java index d9f8923c1..5d44b94c2 100644 --- a/src/org/andengine/util/adt/queue/IQueue.java +++ b/src/org/andengine/util/adt/queue/IQueue.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.list.IList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:00:30 - 24.01.2012 diff --git a/src/org/andengine/util/adt/queue/ISortedQueue.java b/src/org/andengine/util/adt/queue/ISortedQueue.java index b0ae3c355..b51ced792 100644 --- a/src/org/andengine/util/adt/queue/ISortedQueue.java +++ b/src/org/andengine/util/adt/queue/ISortedQueue.java @@ -4,7 +4,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:37:19 - 01.02.2012 diff --git a/src/org/andengine/util/adt/queue/IUniqueQueue.java b/src/org/andengine/util/adt/queue/IUniqueQueue.java index a0aaba91a..b7716545f 100644 --- a/src/org/andengine/util/adt/queue/IUniqueQueue.java +++ b/src/org/andengine/util/adt/queue/IUniqueQueue.java @@ -4,7 +4,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:37:19 - 01.02.2012 diff --git a/src/org/andengine/util/adt/queue/ShiftQueue.java b/src/org/andengine/util/adt/queue/ShiftQueue.java index 9f1abbea5..cebc0f2d6 100644 --- a/src/org/andengine/util/adt/queue/ShiftQueue.java +++ b/src/org/andengine/util/adt/queue/ShiftQueue.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.list.ShiftList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 17:06:49 - 03.01.2012 diff --git a/src/org/andengine/util/adt/queue/SortedQueue.java b/src/org/andengine/util/adt/queue/SortedQueue.java index ec6ff26ac..f3450c807 100644 --- a/src/org/andengine/util/adt/queue/SortedQueue.java +++ b/src/org/andengine/util/adt/queue/SortedQueue.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.list.SortedList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 17:17:33 PM - 03.022012 diff --git a/src/org/andengine/util/adt/queue/UniqueQueue.java b/src/org/andengine/util/adt/queue/UniqueQueue.java index bd024063a..0a5613efb 100644 --- a/src/org/andengine/util/adt/queue/UniqueQueue.java +++ b/src/org/andengine/util/adt/queue/UniqueQueue.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.list.UniqueList; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 17:17:33 PM - 03.022012 diff --git a/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java b/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java index 3827d6a91..d446efff6 100644 --- a/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java +++ b/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.queue.IQueue; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:23:50 - 01.02.2012 diff --git a/src/org/andengine/util/adt/spatial/ISpatialItem.java b/src/org/andengine/util/adt/spatial/ISpatialItem.java index 79be2f9d8..8f7441dcc 100644 --- a/src/org/andengine/util/adt/spatial/ISpatialItem.java +++ b/src/org/andengine/util/adt/spatial/ISpatialItem.java @@ -4,7 +4,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:23:12 - 07.10.2011 diff --git a/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java b/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java index 4e570b124..a553aef1e 100644 --- a/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java +++ b/src/org/andengine/util/adt/spatial/bounds/util/FloatBoundsUtils.java @@ -4,7 +4,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:12:02 - 07.10.2011 diff --git a/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java b/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java index f7833e783..e5299f0d8 100644 --- a/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java +++ b/src/org/andengine/util/adt/spatial/bounds/util/IntBoundsUtils.java @@ -4,7 +4,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:05:32 - 08.10.2011 diff --git a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java index 973c3abf7..546eb9c71 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/FloatQuadTree.java @@ -12,7 +12,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:15:21 - 10.10.2011 diff --git a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java index c75b4fc83..d6316050c 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/IntQuadTree.java @@ -13,7 +13,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:22:18 - 10.10.2011 diff --git a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java index 8bf3f89c8..1acd9de35 100644 --- a/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java +++ b/src/org/andengine/util/adt/spatial/quadtree/QuadTree.java @@ -17,7 +17,7 @@ /** * TODO Make all methods non-synchronized and add a SynchronizedXZYQuadTree subclasses. * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 20:16:01 - 07.10.2011 diff --git a/src/org/andengine/util/adt/trie/ITrie.java b/src/org/andengine/util/adt/trie/ITrie.java index bc30f94f6..2b7538242 100644 --- a/src/org/andengine/util/adt/trie/ITrie.java +++ b/src/org/andengine/util/adt/trie/ITrie.java @@ -1,7 +1,7 @@ package org.andengine.util.adt.trie; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:18:44 - 30.01.2012 diff --git a/src/org/andengine/util/adt/trie/Trie.java b/src/org/andengine/util/adt/trie/Trie.java index d115c90b1..acc4d117e 100644 --- a/src/org/andengine/util/adt/trie/Trie.java +++ b/src/org/andengine/util/adt/trie/Trie.java @@ -3,7 +3,7 @@ import android.util.SparseArray; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 12:25:47 - 30.01.2012 diff --git a/src/org/andengine/util/algorithm/Spiral.java b/src/org/andengine/util/algorithm/Spiral.java index 4e43d7aca..708248d09 100644 --- a/src/org/andengine/util/algorithm/Spiral.java +++ b/src/org/andengine/util/algorithm/Spiral.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.spatial.Direction; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 22:40:53 - 10.11.2011 diff --git a/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java b/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java index 6d0203f96..303b33d1d 100644 --- a/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java +++ b/src/org/andengine/util/algorithm/collision/TriangleCollisionChecker.java @@ -4,7 +4,7 @@ import org.andengine.util.adt.transformation.Transformation; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:47:42 - 30.08.2011 diff --git a/src/org/andengine/util/algorithm/hull/HullUtils.java b/src/org/andengine/util/algorithm/hull/HullUtils.java index 1f2059d0d..1d8880131 100644 --- a/src/org/andengine/util/algorithm/hull/HullUtils.java +++ b/src/org/andengine/util/algorithm/hull/HullUtils.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:52:48 - 08.02.2012 diff --git a/src/org/andengine/util/animationpack/AnimationPack.java b/src/org/andengine/util/animationpack/AnimationPack.java index de98b176b..4b61bd42e 100644 --- a/src/org/andengine/util/animationpack/AnimationPack.java +++ b/src/org/andengine/util/animationpack/AnimationPack.java @@ -4,7 +4,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:58:15 - 03.05.2012 diff --git a/src/org/andengine/util/animationpack/AnimationPackLoader.java b/src/org/andengine/util/animationpack/AnimationPackLoader.java index bd73a8d06..f04b0627b 100644 --- a/src/org/andengine/util/animationpack/AnimationPackLoader.java +++ b/src/org/andengine/util/animationpack/AnimationPackLoader.java @@ -18,7 +18,7 @@ import android.content.res.AssetManager; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:05:15 - 29.07.2011 diff --git a/src/org/andengine/util/animationpack/AnimationPackParser.java b/src/org/andengine/util/animationpack/AnimationPackParser.java index bcd1126a6..48c826146 100644 --- a/src/org/andengine/util/animationpack/AnimationPackParser.java +++ b/src/org/andengine/util/animationpack/AnimationPackParser.java @@ -18,7 +18,7 @@ import android.content.res.AssetManager; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:19:26 - 29.07.2011 diff --git a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java index 8b00d4380..f3d1fad6c 100644 --- a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java +++ b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegion.java @@ -6,7 +6,7 @@ import org.andengine.opengl.texture.region.TiledTextureRegion; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 17:17:17 - 03.05.2012 diff --git a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegionLibrary.java b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegionLibrary.java index dc536126f..4b44cb0fb 100644 --- a/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegionLibrary.java +++ b/src/org/andengine/util/animationpack/AnimationPackTiledTextureRegionLibrary.java @@ -3,7 +3,7 @@ import java.util.HashMap; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 17:17:37 - 03.05.2012 diff --git a/src/org/andengine/util/animationpack/exception/AnimationPackParseException.java b/src/org/andengine/util/animationpack/exception/AnimationPackParseException.java index d69ef60e9..6d2cc174d 100644 --- a/src/org/andengine/util/animationpack/exception/AnimationPackParseException.java +++ b/src/org/andengine/util/animationpack/exception/AnimationPackParseException.java @@ -3,7 +3,7 @@ import org.xml.sax.SAXException; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:03:45 - 03.06.2012 diff --git a/src/org/andengine/util/debug/DebugTimer.java b/src/org/andengine/util/debug/DebugTimer.java index 832e9b85e..b16103e9d 100644 --- a/src/org/andengine/util/debug/DebugTimer.java +++ b/src/org/andengine/util/debug/DebugTimer.java @@ -7,7 +7,7 @@ import org.andengine.util.debug.Debug.DebugLevel; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 13:52:42 - 02.11.2011 diff --git a/src/org/andengine/util/escape/Unescaper.java b/src/org/andengine/util/escape/Unescaper.java index 40fee6cdc..ddcb406c7 100644 --- a/src/org/andengine/util/escape/Unescaper.java +++ b/src/org/andengine/util/escape/Unescaper.java @@ -5,7 +5,7 @@ import android.text.TextUtils; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:20:25 - 26.04.2012 diff --git a/src/org/andengine/util/escape/UnescaperEntityMap.java b/src/org/andengine/util/escape/UnescaperEntityMap.java index 25a92acce..13fe895b7 100644 --- a/src/org/andengine/util/escape/UnescaperEntityMap.java +++ b/src/org/andengine/util/escape/UnescaperEntityMap.java @@ -3,7 +3,7 @@ import org.andengine.util.adt.map.IntLookupMap; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:31:08 - 26.04.2012 diff --git a/src/org/andengine/util/escape/XMLUnescaper.java b/src/org/andengine/util/escape/XMLUnescaper.java index 3a009adbe..13521ff82 100644 --- a/src/org/andengine/util/escape/XMLUnescaper.java +++ b/src/org/andengine/util/escape/XMLUnescaper.java @@ -1,7 +1,7 @@ package org.andengine.util.escape; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 3:27:44 PM - Apr 26, 2012 diff --git a/src/org/andengine/util/exception/AndEngineException.java b/src/org/andengine/util/exception/AndEngineException.java index ea79cce46..d099b4cb7 100644 --- a/src/org/andengine/util/exception/AndEngineException.java +++ b/src/org/andengine/util/exception/AndEngineException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 02:40:26 - 07.08.2011 diff --git a/src/org/andengine/util/exception/AndEngineRuntimeException.java b/src/org/andengine/util/exception/AndEngineRuntimeException.java index 70f4dbd18..22c5d135f 100644 --- a/src/org/andengine/util/exception/AndEngineRuntimeException.java +++ b/src/org/andengine/util/exception/AndEngineRuntimeException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 02:40:26 - 07.08.2011 diff --git a/src/org/andengine/util/exception/CancelledException.java b/src/org/andengine/util/exception/CancelledException.java index 0668c6c0a..d3471771a 100644 --- a/src/org/andengine/util/exception/CancelledException.java +++ b/src/org/andengine/util/exception/CancelledException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:33:53 - 23.04.2012 diff --git a/src/org/andengine/util/exception/DeviceNotSupportedException.java b/src/org/andengine/util/exception/DeviceNotSupportedException.java index f352a88b0..e6175e5a8 100644 --- a/src/org/andengine/util/exception/DeviceNotSupportedException.java +++ b/src/org/andengine/util/exception/DeviceNotSupportedException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:05:09 - 19.03.2012 diff --git a/src/org/andengine/util/exception/IllegalClassNameException.java b/src/org/andengine/util/exception/IllegalClassNameException.java index 84bf4589a..95921aa32 100644 --- a/src/org/andengine/util/exception/IllegalClassNameException.java +++ b/src/org/andengine/util/exception/IllegalClassNameException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Nicolas Gramlich 2013 + * (c) 2013 Nicolas Gramlich * * @author Nicolas Gramlich * @since 21:33:53 - 01.05.2013 diff --git a/src/org/andengine/util/exception/MethodNotFoundException.java b/src/org/andengine/util/exception/MethodNotFoundException.java index aabde4dc2..e9410477f 100644 --- a/src/org/andengine/util/exception/MethodNotFoundException.java +++ b/src/org/andengine/util/exception/MethodNotFoundException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Nicolas Gramlich 2013 + * (c) 2013 Nicolas Gramlich * * @author Nicolas Gramlich * @since 18:13:32 - 26.12.2011 diff --git a/src/org/andengine/util/exception/MethodNotSupportedException.java b/src/org/andengine/util/exception/MethodNotSupportedException.java index 4bece8cb8..3e4d95e1d 100644 --- a/src/org/andengine/util/exception/MethodNotSupportedException.java +++ b/src/org/andengine/util/exception/MethodNotSupportedException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 18:13:32 - 26.12.2011 diff --git a/src/org/andengine/util/exception/MethodNotYetImplementedException.java b/src/org/andengine/util/exception/MethodNotYetImplementedException.java index 2f2ce48c4..23c222fc1 100644 --- a/src/org/andengine/util/exception/MethodNotYetImplementedException.java +++ b/src/org/andengine/util/exception/MethodNotYetImplementedException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 12:25:52 - 03.11.2011 diff --git a/src/org/andengine/util/exception/NullBitmapException.java b/src/org/andengine/util/exception/NullBitmapException.java index becbd0734..a3c85b53a 100644 --- a/src/org/andengine/util/exception/NullBitmapException.java +++ b/src/org/andengine/util/exception/NullBitmapException.java @@ -1,7 +1,7 @@ package org.andengine.util.exception; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:52:38 - 16.09.2011 diff --git a/src/org/andengine/util/level/EntityLoader.java b/src/org/andengine/util/level/EntityLoader.java index 43bb0b208..2771e5e9b 100644 --- a/src/org/andengine/util/level/EntityLoader.java +++ b/src/org/andengine/util/level/EntityLoader.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:05:31 - 19.04.2012 diff --git a/src/org/andengine/util/level/IEntityLoader.java b/src/org/andengine/util/level/IEntityLoader.java index a7926585e..3188baac4 100644 --- a/src/org/andengine/util/level/IEntityLoader.java +++ b/src/org/andengine/util/level/IEntityLoader.java @@ -6,7 +6,7 @@ import org.xml.sax.Attributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 18:38:40 - 18.04.2012 diff --git a/src/org/andengine/util/level/IEntityLoaderData.java b/src/org/andengine/util/level/IEntityLoaderData.java index 3dbc8fc26..5a7c2c1c2 100644 --- a/src/org/andengine/util/level/IEntityLoaderData.java +++ b/src/org/andengine/util/level/IEntityLoaderData.java @@ -1,7 +1,7 @@ package org.andengine.util.level; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 2:21:46 PM - Apr 19, 2012 diff --git a/src/org/andengine/util/level/IEntityLoaderListener.java b/src/org/andengine/util/level/IEntityLoaderListener.java index 9d84e2bfb..950d56162 100644 --- a/src/org/andengine/util/level/IEntityLoaderListener.java +++ b/src/org/andengine/util/level/IEntityLoaderListener.java @@ -4,7 +4,7 @@ import org.xml.sax.Attributes; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:52:39 - 02.05.2012 diff --git a/src/org/andengine/util/level/ILevelLoaderResult.java b/src/org/andengine/util/level/ILevelLoaderResult.java index 89688d27c..80970d699 100644 --- a/src/org/andengine/util/level/ILevelLoaderResult.java +++ b/src/org/andengine/util/level/ILevelLoaderResult.java @@ -1,7 +1,7 @@ package org.andengine.util.level; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 15:08:08 - 19.04.2012 diff --git a/src/org/andengine/util/level/exception/LevelLoaderException.java b/src/org/andengine/util/level/exception/LevelLoaderException.java index 8ed6ada93..135da9bbe 100644 --- a/src/org/andengine/util/level/exception/LevelLoaderException.java +++ b/src/org/andengine/util/level/exception/LevelLoaderException.java @@ -3,7 +3,7 @@ import org.andengine.util.exception.AndEngineRuntimeException; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 14:59:01 - 19.04.2012 diff --git a/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderData.java b/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderData.java index 4adc54527..14cb50d17 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderData.java +++ b/src/org/andengine/util/level/simple/SimpleLevelEntityLoaderData.java @@ -4,7 +4,7 @@ import org.andengine.util.level.IEntityLoaderData; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:13:09 - 19.04.2012 diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoader.java b/src/org/andengine/util/level/simple/SimpleLevelLoader.java index 9203430b0..a15ec58c1 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoader.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoader.java @@ -8,7 +8,7 @@ import org.andengine.util.level.LevelLoader; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 4:11:17 - 19.04.2012 diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java index d0b715cfa..60cf5e2c0 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderContentHandler.java @@ -8,7 +8,7 @@ import org.andengine.util.level.LevelLoaderContentHandler; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:12:23 - 19.04.2012 diff --git a/src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java b/src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java index 3b31077c7..07249f2e2 100644 --- a/src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java +++ b/src/org/andengine/util/level/simple/SimpleLevelLoaderResult.java @@ -4,7 +4,7 @@ import org.andengine.util.level.ILevelLoaderResult; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 16:13:38 - 19.04.2012 diff --git a/src/org/andengine/util/modifier/BaseDoubleValueChangeModifier.java b/src/org/andengine/util/modifier/BaseDoubleValueChangeModifier.java index 5604f821b..28783e809 100644 --- a/src/org/andengine/util/modifier/BaseDoubleValueChangeModifier.java +++ b/src/org/andengine/util/modifier/BaseDoubleValueChangeModifier.java @@ -2,7 +2,7 @@ /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 14:17:30 - 10.08.2011 diff --git a/src/org/andengine/util/system/CPUUsage.java b/src/org/andengine/util/system/CPUUsage.java index d153f51da..d8c826862 100644 --- a/src/org/andengine/util/system/CPUUsage.java +++ b/src/org/andengine/util/system/CPUUsage.java @@ -10,7 +10,7 @@ import org.andengine.util.debug.Debug; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 21:48:14 - 22.10.2011 diff --git a/src/org/andengine/util/texturepack/TexturePack.java b/src/org/andengine/util/texturepack/TexturePack.java index 42a27cdfd..3be18961f 100644 --- a/src/org/andengine/util/texturepack/TexturePack.java +++ b/src/org/andengine/util/texturepack/TexturePack.java @@ -3,7 +3,7 @@ import org.andengine.opengl.texture.ITexture; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 23:23:47 - 30.07.2011 diff --git a/src/org/andengine/util/texturepack/TexturePackLibrary.java b/src/org/andengine/util/texturepack/TexturePackLibrary.java index 70ed7003c..249b09709 100644 --- a/src/org/andengine/util/texturepack/TexturePackLibrary.java +++ b/src/org/andengine/util/texturepack/TexturePackLibrary.java @@ -3,7 +3,7 @@ import java.util.HashMap; /** - * (c) Zynga 2012 + * (c) 2012 Zynga Inc. * * @author Nicolas Gramlich * @since 17:29:37 - 03.05.2012 diff --git a/src/org/andengine/util/texturepack/TexturePackLoader.java b/src/org/andengine/util/texturepack/TexturePackLoader.java index a1b17447b..bdeae70c4 100644 --- a/src/org/andengine/util/texturepack/TexturePackLoader.java +++ b/src/org/andengine/util/texturepack/TexturePackLoader.java @@ -18,7 +18,7 @@ import android.content.res.AssetManager; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:05:15 - 29.07.2011 diff --git a/src/org/andengine/util/texturepack/TexturePackParser.java b/src/org/andengine/util/texturepack/TexturePackParser.java index 3dd8f06cc..a8e53c4f5 100644 --- a/src/org/andengine/util/texturepack/TexturePackParser.java +++ b/src/org/andengine/util/texturepack/TexturePackParser.java @@ -28,7 +28,7 @@ import android.content.res.AssetManager; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:19:26 - 29.07.2011 diff --git a/src/org/andengine/util/texturepack/TexturePackTextureRegion.java b/src/org/andengine/util/texturepack/TexturePackTextureRegion.java index 0818df2a8..0d3276f10 100644 --- a/src/org/andengine/util/texturepack/TexturePackTextureRegion.java +++ b/src/org/andengine/util/texturepack/TexturePackTextureRegion.java @@ -5,7 +5,7 @@ /** * - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:28:48 - 15.08.2011 diff --git a/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java b/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java index f556bf21e..bc1a84cde 100644 --- a/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java +++ b/src/org/andengine/util/texturepack/TexturePackTextureRegionLibrary.java @@ -5,7 +5,7 @@ import android.util.SparseArray; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 16:34:23 - 15.08.2011 diff --git a/src/org/andengine/util/texturepack/exception/TexturePackParseException.java b/src/org/andengine/util/texturepack/exception/TexturePackParseException.java index 2f387af37..fb0df5bcf 100644 --- a/src/org/andengine/util/texturepack/exception/TexturePackParseException.java +++ b/src/org/andengine/util/texturepack/exception/TexturePackParseException.java @@ -3,7 +3,7 @@ import org.xml.sax.SAXException; /** - * (c) Zynga 2011 + * (c) 2011 Zynga Inc. * * @author Nicolas Gramlich * @since 17:29:20 - 29.07.2011 From f878887c42adcb55157e41a61922e0969ff9a591 Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Thu, 2 May 2013 17:55:47 +0200 Subject: [PATCH 188/252] glScissor state can now be saved on a stack This gets usefull when ClipEntities are nested --- src/org/andengine/entity/clip/ClipEntity.java | 5 +- .../andengine/opengl/util/GLScissorStack.java | 220 ++++++++++++++++++ src/org/andengine/opengl/util/GLState.java | 14 ++ 3 files changed, 236 insertions(+), 3 deletions(-) create mode 100644 src/org/andengine/opengl/util/GLScissorStack.java diff --git a/src/org/andengine/entity/clip/ClipEntity.java b/src/org/andengine/entity/clip/ClipEntity.java index e16bb76fe..2da02203b 100644 --- a/src/org/andengine/entity/clip/ClipEntity.java +++ b/src/org/andengine/entity/clip/ClipEntity.java @@ -6,8 +6,6 @@ import org.andengine.util.Constants; import org.andengine.util.math.MathUtils; -import android.opengl.GLES20; - /** * A {@link ClipEntity} clips drawing of all its children in a rectangle, which is defined as the axis aligned bounding box around itself. * It can be attached anywhere in the scene graph, which means that it inherits transformations from its parents, which have a direct effect on the clipping area. @@ -100,12 +98,13 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { final int clippingHeight = maxClippingY - minClippingY; /* Finally apply the clipping. */ - GLES20.glScissor(minClippingX, minClippingY, clippingWidth, clippingHeight); + pGLState.glScissorPush(minClippingX, minClippingY, clippingWidth, clippingHeight); /* Draw children, etc... */ super.onManagedDraw(pGLState, pCamera); /* Revert scissor test to previous state. */ + pGLState.glScissorPop(); pGLState.setScissorTestEnabled(wasScissorTestEnabled); } else { super.onManagedDraw(pGLState, pCamera); diff --git a/src/org/andengine/opengl/util/GLScissorStack.java b/src/org/andengine/opengl/util/GLScissorStack.java new file mode 100644 index 000000000..add7e2c7a --- /dev/null +++ b/src/org/andengine/opengl/util/GLScissorStack.java @@ -0,0 +1,220 @@ +package org.andengine.opengl.util; + +import org.andengine.util.exception.AndEngineRuntimeException; + +import android.opengl.GLES20; + +/** + * TODO Measure performance against regular Java Stack + * + * (c) 2013 Zynga Inc. + * + * @author Nicolas Gramlich + * @author Michal Stawinski + * @since 14:49:23 - 02.05.2013 + */ +public class GLScissorStack { + // =========================================================== + // Constants + // =========================================================== + + public static final int GLSCISSOR_X_POS = 0; + public static final int GLSCISSOR_Y_POS = 1; + public static final int GLSCISSOR_WIDTH_POS = 2; + public static final int GLSCISSOR_HEIGHT_POS = 3; + + public static final int GLSCISSORSTACK_DEPTH_MAX = 32; + public static final int GLSCISSOR_SIZE = 4; + + private static final int GLSCISSORSTACKOFFSET_UNDERFLOW = -1 * GLScissorStack.GLSCISSOR_SIZE; + private static final int GLSCISSORSTACKOFFSET_OVERFLOW = GLScissorStack.GLSCISSORSTACK_DEPTH_MAX * GLScissorStack.GLSCISSOR_SIZE; + + // =========================================================== + // Fields + // =========================================================== + + private final int[] mTemp = new int[GLScissorStack.GLSCISSOR_SIZE]; + private final int[] mScissorStack = new int[GLScissorStack.GLSCISSORSTACK_DEPTH_MAX * GLScissorStack.GLSCISSOR_SIZE]; + private int mScissorStackOffset; + + // =========================================================== + // Constructors + // =========================================================== + + public GLScissorStack() { + } + + // =========================================================== + // Constructors + // =========================================================== + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int[] getScissor(final int[] pScissors) { + assertNoUnderflow(); + + System.arraycopy(this.mScissorStack, this.mScissorStackOffset, pScissors, 0, GLScissorStack.GLSCISSOR_SIZE); + return pScissors; + } + + public int[] getScissorTmp() { + getScissor(this.mTemp); + return this.mTemp; + } + + protected int getStackDepth() { + return mScissorStackOffset / GLSCISSOR_SIZE; + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void glScissors(final int[] pScissors) { + GLES20.glScissor(pScissors[GLSCISSOR_X_POS], pScissors[GLSCISSOR_Y_POS], pScissors[GLSCISSOR_WIDTH_POS], pScissors[GLSCISSOR_HEIGHT_POS]); + } + + public void glScissors(final int pX, final int pY, final int pWidth, final int pHeight) { + GLES20.glScissor(pX, pY, pWidth, pHeight); + } + + public void glScissorPush(final int[] pScissors) { + glScissors(pScissors); + pushScissor(pScissors); + } + + public void glScissorPush(final int pX, final int pY, final int pWidth, final int pHeight) { + glScissors(pX, pY, pWidth, pHeight); + pushScissor(pX, pY, pWidth, pHeight); + } + + public void glScissorPop() { + popScissor(); + if (getStackDepth() > 0) { + getScissor(this.mTemp); + glScissors(this.mTemp); + } + } + + protected void pushScissor(final int pX, final int pY, final int pWidth, final int pHeight) throws GLScissorStackOverflowException { + this.mTemp[GLSCISSOR_X_POS] = pX; + this.mTemp[GLSCISSOR_Y_POS] = pY; + this.mTemp[GLSCISSOR_WIDTH_POS] = pWidth; + this.mTemp[GLSCISSOR_HEIGHT_POS] = pHeight; + + pushScissor(this.mTemp); + } + + protected void pushScissor(final int[] pScissors) throws GLScissorStackOverflowException { + assertNoOverflow(); + + System.arraycopy(pScissors, 0, this.mScissorStack, this.mScissorStackOffset + GLScissorStack.GLSCISSOR_SIZE, GLScissorStack.GLSCISSOR_SIZE); + this.mScissorStackOffset += GLScissorStack.GLSCISSOR_SIZE; + } + + protected void popScissor() { + assertNoUnderflow(); + + this.mScissorStackOffset -= GLScissorStack.GLSCISSOR_SIZE; + } + + private void assertNoUnderflow() { + if (this.mScissorStackOffset - GLScissorStack.GLSCISSOR_SIZE <= GLScissorStack.GLSCISSORSTACKOFFSET_UNDERFLOW) { + throw new GLScissorStackUnderflowException(); + } + } + + private void assertNoOverflow() { + if (this.mScissorStackOffset + GLScissorStack.GLSCISSOR_SIZE >= GLScissorStack.GLSCISSORSTACKOFFSET_OVERFLOW) { + throw new GLScissorStackOverflowException(); + } + } + + public void reset() { + this.mScissorStackOffset = 0; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class GLScissorStackOverflowException extends AndEngineRuntimeException { + + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 8253962794945142016L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public GLScissorStackOverflowException() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } + + public static class GLScissorStackUnderflowException extends AndEngineRuntimeException { + + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = -2962655760038324091L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public GLScissorStackUnderflowException() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } +} diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index 84324b5b7..0307114c8 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -74,6 +74,7 @@ public class GLState { private final GLMatrixStack mModelViewGLMatrixStack = new GLMatrixStack(); private final GLMatrixStack mProjectionGLMatrixStack = new GLMatrixStack(); + private final GLScissorStack mScissorStack = new GLScissorStack(); private final float[] mModelViewGLMatrix = new float[GLMatrixStack.GLMATRIX_SIZE]; private final float[] mProjectionGLMatrix = new float[GLMatrixStack.GLMATRIX_SIZE]; @@ -144,6 +145,7 @@ public void reset(final RenderOptions pRenderOptions, final ConfigChooser pConfi this.mModelViewGLMatrixStack.reset(); this.mProjectionGLMatrixStack.reset(); + this.mScissorStack.reset(); this.mCurrentArrayBufferID = -1; this.mCurrentIndexBufferID = -1; @@ -630,6 +632,18 @@ public void resetGLMatrixStacks() { this.mProjectionGLMatrixStack.reset(); } + public void glScissorPush(final int[] pScissor) { + this.mScissorStack.glScissorPush(pScissor); + } + + public void glScissorPush(final int pX, final int pY, final int pWidth, final int pHeight) { + this.mScissorStack.glScissorPush(pX, pY, pWidth, pHeight); + } + + public void glScissorPop() { + this.mScissorStack.glScissorPop(); + } + /** * Note: does not pre-multiply the alpha channel!
    * Except that difference, same as: {@link GLUtils#texSubImage2D(int, int, int, int, Bitmap, int, int)}
    From 209b472e18b1477fe8155d07c3599d8c16765669 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 3 May 2013 20:26:10 -0700 Subject: [PATCH 189/252] Added HttpClientUtils and HttpUtils. --- .../andengine/util/net/HttpClientUtils.java | 61 +++++++++++++++++ src/org/andengine/util/net/HttpUtils.java | 66 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/org/andengine/util/net/HttpClientUtils.java create mode 100644 src/org/andengine/util/net/HttpUtils.java diff --git a/src/org/andengine/util/net/HttpClientUtils.java b/src/org/andengine/util/net/HttpClientUtils.java new file mode 100644 index 000000000..bac352524 --- /dev/null +++ b/src/org/andengine/util/net/HttpClientUtils.java @@ -0,0 +1,61 @@ +package org.andengine.util.net; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.http.NameValuePair; +import org.apache.http.message.BasicNameValuePair; + + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 19:20:32 - 03.05.2013 + */ +public final class HttpClientUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private HttpClientUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static List convertParametersToNameValuePairs(final Map pParameters) { + final List result = new ArrayList(); + + for (final Entry entry : pParameters.entrySet()) { + result.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + + return result; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + +} diff --git a/src/org/andengine/util/net/HttpUtils.java b/src/org/andengine/util/net/HttpUtils.java new file mode 100644 index 000000000..aea8cc87f --- /dev/null +++ b/src/org/andengine/util/net/HttpUtils.java @@ -0,0 +1,66 @@ +package org.andengine.util.net; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.http.HttpStatus; +import org.apache.http.NameValuePair; +import org.apache.http.message.BasicNameValuePair; + + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 19:20:32 - 03.05.2013 + */ +public final class HttpUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private HttpUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static List convertParametersToNameValuePairs(final Map pParameters) { + final List result = new ArrayList(); + + for (final Entry entry : pParameters.entrySet()) { + result.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + + return result; + } + + public static boolean isHttpStatusCodeSuccess(final int pHttpStatusCode) { + return pHttpStatusCode >= HttpStatus.SC_OK && pHttpStatusCode < HttpStatus.SC_MULTIPLE_CHOICES; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + +} From c78afc397c383e7e3e4d88ea10b567c39b858d63 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 4 May 2013 00:35:20 -0700 Subject: [PATCH 190/252] Added SystemUtils.getApplicationLabel. --- src/org/andengine/util/system/SystemUtils.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index 590ae2cfc..d7248f357 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -107,6 +107,11 @@ public static boolean isGoogleTV(final Context pContext, final boolean pDefault) } } + public static String getApplicationLabel(final Context pContext) throws SystemUtilsException { + final int labelResID = SystemUtils.getApplicationInfo(pContext).labelRes; + return pContext.getString(labelResID); + } + public static int getPackageVersionCode(final Context pContext) throws SystemUtilsException { return SystemUtils.getPackageInfo(pContext).versionCode; } From 1b741aa7a063e7722130995d8448d154b0dcef3f Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 8 May 2013 23:45:00 -0700 Subject: [PATCH 191/252] Removed weird @link javadoc. --- src/org/andengine/util/adt/list/SortedList.java | 2 +- src/org/andengine/util/adt/list/UniqueList.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/util/adt/list/SortedList.java b/src/org/andengine/util/adt/list/SortedList.java index 1e603a3f8..1cfb21849 100644 --- a/src/org/andengine/util/adt/list/SortedList.java +++ b/src/org/andengine/util/adt/list/SortedList.java @@ -5,7 +5,7 @@ /** * This implementation is particular useful/efficient for enter/poll operations of elements that need to be sorted by natural order instead of the order they are queue. * Its {@link java.util.List} like behavior performs better than a plain {@link java.util.ArrayList}, since it automatically shift the contents of its internal Array only when really necessary. - * Besides sparse allocations to increase the size of the internal Array, {@link com.zynga.mobileville.path.SortedList} is allocation free (unlike the {@link java.util.LinkedList} family). + * Besides sparse allocations to increase the size of the internal Array, {@link SortedList} is allocation free (unlike the {@link java.util.LinkedList} family). * * (c) 2012 Zynga Inc. * diff --git a/src/org/andengine/util/adt/list/UniqueList.java b/src/org/andengine/util/adt/list/UniqueList.java index 68b83dfc9..0d84e8c8a 100644 --- a/src/org/andengine/util/adt/list/UniqueList.java +++ b/src/org/andengine/util/adt/list/UniqueList.java @@ -5,7 +5,7 @@ /** * This implementation is particular useful/efficient for enter/poll operations of elements that need to be sorted by natural order instead of the order they are queue. * Its {@link java.util.List} like behavior performs better than a plain {@link java.util.ArrayList}, since it automatically shift the contents of its internal Array only when really necessary. - * Besides sparse allocations to increase the size of the internal Array, {@link com.zynga.mobileville.path.SortedList} is allocation free (unlike the {@link java.util.LinkedList} family). + * Besides sparse allocations to increase the size of the internal Array, {@link SortedList} is allocation free (unlike the {@link java.util.LinkedList} family). * * (c) 2012 Zynga Inc. * From 2f8c15296b6a3ffcf225bb4b44ac784724eba063 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 9 May 2013 19:27:23 -0700 Subject: [PATCH 192/252] Made class-owned javadoc @links shorter. --- src/org/andengine/engine/Engine.java | 10 ++-- src/org/andengine/entity/IEntity.java | 4 +- src/org/andengine/entity/primitive/Line.java | 16 +++--- .../andengine/entity/scene/CameraScene.java | 2 +- .../entity/sprite/batch/SpriteGroup.java | 2 +- src/org/andengine/entity/text/Text.java | 2 +- .../location/LocationSensorOptions.java | 10 +--- .../detector/ContinuousHoldDetector.java | 2 +- .../input/touch/detector/HoldDetector.java | 2 +- .../touch/detector/PinchZoomDetector.java | 2 +- src/org/andengine/opengl/font/FontUtils.java | 2 +- .../buildable/IBuildableTextureAtlas.java | 13 +++-- .../opengl/texture/region/ITextureRegion.java | 4 +- .../texture/region/ITiledTextureRegion.java | 4 +- .../opengl/texture/render/RenderTexture.java | 52 +++++++++---------- src/org/andengine/opengl/util/GLState.java | 6 +-- .../opengl/vbo/VertexBufferObject.java | 2 +- .../vbo/ZeroMemoryVertexBufferObject.java | 4 +- src/org/andengine/util/StreamUtils.java | 4 +- .../collision/BaseCollisionChecker.java | 4 +- 20 files changed, 69 insertions(+), 78 deletions(-) diff --git a/src/org/andengine/engine/Engine.java b/src/org/andengine/engine/Engine.java index 568fbfad9..6b3f385bf 100644 --- a/src/org/andengine/engine/Engine.java +++ b/src/org/andengine/engine/Engine.java @@ -485,8 +485,8 @@ public void runOnUpdateThread(final Runnable pRunnable) { * This method is useful when you want to execute code on the {@link UpdateThread}, even though the Engine is paused. * * @param pRunnable the {@link Runnable} to be run on the {@link UpdateThread}. - * @param pOnlyWhenEngineRunning if true, the execution of the {@link Runnable} will be delayed until the next time {@link Engine#onUpdateUpdateHandlers(float)} is picked up, which is when {@link Engine#isRunning()} is true. - * if false, the execution of the {@link Runnable} will happen as soon as possible on the {@link UpdateThread}, no matter what {@link Engine#isRunning()} is. + * @param pOnlyWhenEngineRunning if true, the execution of the {@link Runnable} will be delayed until the next time {@link #onUpdateUpdateHandlers(float)} is picked up, which is when {@link Engine#isRunning()} is true. + * if false, the execution of the {@link Runnable} will happen as soon as possible on the {@link UpdateThread}, no matter what {@link #isRunning()} is. */ public void runOnUpdateThread(final Runnable pRunnable, final boolean pOnlyWhenEngineRunning) { if (pOnlyWhenEngineRunning) { @@ -499,7 +499,7 @@ public void runOnUpdateThread(final Runnable pRunnable, final boolean pOnlyWhenE /** * @param pRunnable the {@link Runnable} to run mutually exclusive to the {@link UpdateThread} and the GL-{@link Thread}. * When the caller already is on the {@link UpdateThread} or the GL-{@link Thread}, the {@link Runnable} is executed immediately. - * @see {@link Engine#getEngineLock()} to manually {@link EngineLock#lock()}/{@link EngineLock#unlock()} on, while avoiding creating a {@link Runnable}. + * @see {@link #getEngineLock()} to manually {@link EngineLock#lock()}/{@link EngineLock#unlock()} on, while avoiding creating a {@link Runnable}. */ public void runSafely(final Runnable pRunnable) { this.mEngineLock.lock(); @@ -694,7 +694,7 @@ public void disableLocationSensor(final Context pContext) { } /** - * @see {@link Engine#enableAccelerationSensor(Context, IAccelerationListener, AccelerationSensorOptions)} + * @see {@link #enableAccelerationSensor(Context, IAccelerationListener, AccelerationSensorOptions)} */ public boolean enableAccelerationSensor(final Context pContext, final IAccelerationListener pAccelerationListener) { return this.enableAccelerationSensor(pContext, pAccelerationListener, new AccelerationSensorOptions(Engine.SENSORDELAY_DEFAULT)); @@ -736,7 +736,7 @@ public boolean disableAccelerationSensor(final Context pContext) { } /** - * @see {@link Engine#enableOrientationSensor(Context, IOrientationListener, OrientationSensorOptions)} + * @see {@link #enableOrientationSensor(Context, IOrientationListener, OrientationSensorOptions)} */ public boolean enableOrientationSensor(final Context pContext, final IOrientationListener pOrientationListener) { return this.enableOrientationSensor(pContext, pOrientationListener, new OrientationSensorOptions(Engine.SENSORDELAY_DEFAULT)); diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index d4ebfbd99..af3f8b720 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -293,7 +293,7 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou public void sortChildren(); /** * Sorts the {@link IEntity}s based on their ZIndex. Sort is stable. - * In contrast to {@link IEntity#sortChildren()} this method is particularly useful to avoid multiple sorts per frame. + * In contrast to {@link #sortChildren()} this method is particularly useful to avoid multiple sorts per frame. * @param pImmediate if true, the sorting is executed immediately. * If false the sorting is executed before the next (visible) drawing of the children of this {@link IEntity}. */ @@ -360,7 +360,7 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou public boolean isCullingEnabled(); public void setCullingEnabled(final boolean pCullingEnabled); /** - * Will only be performed if {@link IEntity#isCullingEnabled()} is true. + * Will only be performed if {@link #isCullingEnabled()} is true. * * @param pCamera the currently active camera to perform culling checks against. * @return true when this object is visible by the {@link Camera}, false otherwise. diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java index 9c5a85c4c..64b15510c 100644 --- a/src/org/andengine/entity/primitive/Line.java +++ b/src/org/andengine/entity/primitive/Line.java @@ -61,21 +61,21 @@ public class Line extends Shape { // =========================================================== /** - * Uses a default {@link HighPerformanceLineVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link Line#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + * Uses a default {@link HighPerformanceLineVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link #VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. */ public Line(final float pX1, final float pY1, final float pX2, final float pY2, final VertexBufferObjectManager pVertexBufferObjectManager) { this(pX1, pY1, pX2, pY2, Line.LINE_WIDTH_DEFAULT, pVertexBufferObjectManager, DrawType.STATIC); } /** - * Uses a default {@link HighPerformanceLineVertexBufferObject} with the {@link VertexBufferObjectAttribute}s: {@link Line#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + * Uses a default {@link HighPerformanceLineVertexBufferObject} with the {@link VertexBufferObjectAttribute}s: {@link #VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. */ public Line(final float pX1, final float pY1, final float pX2, final float pY2, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { this(pX1, pY1, pX2, pY2, Line.LINE_WIDTH_DEFAULT, pVertexBufferObjectManager, pDrawType); } /** - * Uses a default {@link HighPerformanceLineVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link Line#VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + * Uses a default {@link HighPerformanceLineVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link #VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. */ public Line(final float pX1, final float pY1, final float pX2, final float pY2, final float pLineWidth, final VertexBufferObjectManager pVertexBufferObjectManager) { this(pX1, pY1, pX2, pY2, pLineWidth, pVertexBufferObjectManager, DrawType.STATIC); @@ -108,7 +108,7 @@ public Line(final float pX1, final float pY1, final float pX2, final float pY2, // =========================================================== /** - * @deprecated Instead use {@link Line#getX1()} or {@link Line#getX2()}. + * @deprecated Instead use {@link #getX1()} or {@link #getX2()}. */ @Deprecated @Override @@ -117,7 +117,7 @@ public float getX() { } /** - * @deprecatedInstead use {@link Line#getY1()} or {@link Line#getY2()}. + * @deprecatedInstead use {@link #getY1()} or {@link #getY2()}. */ @Deprecated @Override @@ -150,7 +150,7 @@ public void setLineWidth(final float pLineWidth) { } /** - * Instead use {@link Line#setPosition(float, float, float, float)}. + * Instead use {@link #setPosition(float, float, float, float)}. */ @Deprecated @Override @@ -165,7 +165,7 @@ public void setX(final float pX) { } /** - * Instead use {@link Line#setPosition(float, float, float, float)}. + * Instead use {@link #setPosition(float, float, float, float)}. */ @Deprecated @Override @@ -180,7 +180,7 @@ public void setY(final float pY) { } /** - * Instead use {@link Line#setPosition(float, float, float, float)}. + * Instead use {@link #setPosition(float, float, float, float)}. */ @Deprecated @Override diff --git a/src/org/andengine/entity/scene/CameraScene.java b/src/org/andengine/entity/scene/CameraScene.java index c9210677a..64ff3b38c 100644 --- a/src/org/andengine/entity/scene/CameraScene.java +++ b/src/org/andengine/entity/scene/CameraScene.java @@ -29,7 +29,7 @@ public class CameraScene extends Scene { // =========================================================== /** - * {@link CameraScene#setCamera(Camera)} needs to be called manually. Otherwise nothing will be drawn. + * {@link #setCamera(Camera)} needs to be called manually. Otherwise nothing will be drawn. */ public CameraScene() { this(null); diff --git a/src/org/andengine/entity/sprite/batch/SpriteGroup.java b/src/org/andengine/entity/sprite/batch/SpriteGroup.java index 859eea85c..85264c622 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteGroup.java +++ b/src/org/andengine/entity/sprite/batch/SpriteGroup.java @@ -124,7 +124,7 @@ public SpriteGroup(final float pX, final float pY, final ITexture pTexture, fina // =========================================================== /** - * Instead use {@link SpriteGroup#attachChild(BaseSprite)}. + * Instead use {@link #attachChild(BaseSprite)}. */ @Override @Deprecated diff --git a/src/org/andengine/entity/text/Text.java b/src/org/andengine/entity/text/Text.java index a9d2349e3..94c5b832b 100644 --- a/src/org/andengine/entity/text/Text.java +++ b/src/org/andengine/entity/text/Text.java @@ -184,7 +184,7 @@ public CharSequence getText() { /** * @param pText - * @throws OutOfCharactersException leaves this {@link Text} object in an undefined state, until {@link Text#setText(CharSequence)} is called again and no {@link OutOfCharactersException} is thrown. + * @throws OutOfCharactersException leaves this {@link Text} object in an undefined state, until {@link #setText(CharSequence)} is called again and no {@link OutOfCharactersException} is thrown. */ public void setText(final CharSequence pText) throws OutOfCharactersException { this.mText = pText; diff --git a/src/org/andengine/input/sensor/location/LocationSensorOptions.java b/src/org/andengine/input/sensor/location/LocationSensorOptions.java index 457297f06..74cdc3a60 100644 --- a/src/org/andengine/input/sensor/location/LocationSensorOptions.java +++ b/src/org/andengine/input/sensor/location/LocationSensorOptions.java @@ -33,15 +33,7 @@ public class LocationSensorOptions extends Criteria { // =========================================================== /** - * @see {@link LocationSensorOptions#setAccuracy(int)}, - * {@link LocationSensorOptions#setAltitudeRequired(boolean)}, - * {@link LocationSensorOptions#setBearingRequired(boolean)}, - * {@link LocationSensorOptions#setCostAllowed(boolean)}, - * {@link LocationSensorOptions#setEnabledOnly(boolean)}, - * {@link LocationSensorOptions#setMinimumTriggerDistance(long)}, - * {@link LocationSensorOptions#setMinimumTriggerTime(long)}, - * {@link LocationSensorOptions#setPowerRequirement(int)}, - * {@link LocationSensorOptions#setSpeedRequired(boolean)}. + * @see {@link #setAccuracy(int)}, {@link #setAltitudeRequired(boolean)}, {@link #setBearingRequired(boolean)}, {@link #setCostAllowed(boolean)}, {@link #setEnabledOnly(boolean)}, {@link #setMinimumTriggerDistance(long)}, {@link #setMinimumTriggerTime(long)}, {@link #setPowerRequirement(int)}, {@link #setSpeedRequired(boolean)}. */ public LocationSensorOptions() { diff --git a/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java b/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java index 3abedb0f0..513c2bfbb 100644 --- a/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java +++ b/src/org/andengine/input/touch/detector/ContinuousHoldDetector.java @@ -65,7 +65,7 @@ public void onUpdate(final float pSecondsElapsed) { } /** - * When {@link ContinuousHoldDetector#isHolding()} this method will call through to {@link IHoldDetectorListener#onHoldFinished(HoldDetector, long, int, float, float)}. + * When {@link #isHolding()} this method will call through to {@link IHoldDetectorListener#onHoldFinished(HoldDetector, long, int, float, float)}. */ @Override public void reset() { diff --git a/src/org/andengine/input/touch/detector/HoldDetector.java b/src/org/andengine/input/touch/detector/HoldDetector.java index b8b8add13..bb9bfcd8f 100644 --- a/src/org/andengine/input/touch/detector/HoldDetector.java +++ b/src/org/andengine/input/touch/detector/HoldDetector.java @@ -91,7 +91,7 @@ public boolean isHolding() { // =========================================================== /** - * When {@link HoldDetector#isHolding()} this method will call through to {@link IHoldDetectorListener#onHoldFinished(HoldDetector, long, int, float, float). + * When {@link #isHolding()} this method will call through to {@link IHoldDetectorListener#onHoldFinished(HoldDetector, long, int, float, float). */ @Override public void reset() { diff --git a/src/org/andengine/input/touch/detector/PinchZoomDetector.java b/src/org/andengine/input/touch/detector/PinchZoomDetector.java index 14e9214c2..69852a38a 100644 --- a/src/org/andengine/input/touch/detector/PinchZoomDetector.java +++ b/src/org/andengine/input/touch/detector/PinchZoomDetector.java @@ -51,7 +51,7 @@ public boolean isZooming() { // =========================================================== /** - * When {@link PinchZoomDetector#isZooming()} this method will call through to {@link IPinchZoomDetectorListener#onPinchZoomFinished(PinchZoomDetector, TouchEvent, float)}. + * When {@link #isZooming()} this method will call through to {@link IPinchZoomDetectorListener#onPinchZoomFinished(PinchZoomDetector, TouchEvent, float)}. */ @Override public void reset() { diff --git a/src/org/andengine/opengl/font/FontUtils.java b/src/org/andengine/opengl/font/FontUtils.java index 68be92a65..fe68e12ae 100644 --- a/src/org/andengine/opengl/font/FontUtils.java +++ b/src/org/andengine/opengl/font/FontUtils.java @@ -141,7 +141,7 @@ public static > L splitLines(final CharSequence pTe */ public static > L splitLines(final IFont pFont, final CharSequence pText, final L pResult, final AutoWrap pAutoWrap, final float pAutoWrapWidth) { /** - * TODO In order to respect already existing linebreaks, {@link FontUtils#split(CharSequence, List)} could be leveraged and than the following methods could be called for each line. + * TODO In order to respect already existing linebreaks, {@link #split(CharSequence, List)} could be leveraged and than the following methods could be called for each line. */ switch (pAutoWrap) { case LETTERS: diff --git a/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java b/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java index d5d798a3a..6c0385299 100644 --- a/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java +++ b/src/org/andengine/opengl/texture/atlas/buildable/IBuildableTextureAtlas.java @@ -1,7 +1,6 @@ package org.andengine.opengl.texture.atlas.buildable; import org.andengine.opengl.texture.atlas.ITextureAtlas; -import org.andengine.opengl.texture.atlas.bitmap.BuildableBitmapTextureAtlas; import org.andengine.opengl.texture.atlas.buildable.builder.ITextureAtlasBuilder; import org.andengine.opengl.texture.atlas.buildable.builder.ITextureAtlasBuilder.TextureAtlasBuilderException; import org.andengine.opengl.texture.atlas.source.ITextureAtlasSource; @@ -24,20 +23,20 @@ public interface IBuildableTextureAtlas pCallback); /** - * Removes a {@link ITextureAtlasSource} before {@link BuildableBitmapTextureAtlas#build(ITextureAtlasBuilder)} is called. + * Removes a {@link ITextureAtlasSource} before {@link #build(ITextureAtlasBuilder)} is called. * @param pBitmapTextureAtlasSource to be removed. */ public void removeTextureAtlasSource(final ITextureAtlasSource pTextureAtlasSource); @@ -53,9 +52,9 @@ public interface IBuildableTextureAtlas build(final ITextureAtlasBuilder pTextureAtlasBuilder) throws TextureAtlasBuilderException; } \ No newline at end of file diff --git a/src/org/andengine/opengl/texture/region/ITextureRegion.java b/src/org/andengine/opengl/texture/region/ITextureRegion.java index daf8dadd0..2e0775f92 100644 --- a/src/org/andengine/opengl/texture/region/ITextureRegion.java +++ b/src/org/andengine/opengl/texture/region/ITextureRegion.java @@ -26,11 +26,11 @@ public interface ITextureRegion { public void setTexturePosition(final float pTextureX, final float pTextureY); /** - * Note: Takes {@link ITextureRegion#getScale()} into account! + * Note: Takes {@link #getScale()} into account! */ public float getWidth(); /** - * Note: Takes {@link ITextureRegion#getScale()} into account! + * Note: Takes {@link #getScale()} into account! */ public float getHeight(); diff --git a/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java b/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java index acdcf7382..15e39e50f 100644 --- a/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java +++ b/src/org/andengine/opengl/texture/region/ITiledTextureRegion.java @@ -29,11 +29,11 @@ public interface ITiledTextureRegion extends ITextureRegion { public void setTexturePosition(final int pTileIndex, final float pTextureX, final float pTextureY); /** - * Note: Takes {@link ITiledTextureRegion#getScale(int)} into account! + * Note: Takes {@link #getScale(int)} into account! */ public float getWidth(final int pTileIndex); /** - * Note: Takes {@link ITiledTextureRegion#getScale(int)} into account! + * Note: Takes {@link #getScale(int)} into account! */ public float getHeight(final int pTileIndex); diff --git a/src/org/andengine/opengl/texture/render/RenderTexture.java b/src/org/andengine/opengl/texture/render/RenderTexture.java index ec5d13fcd..f7dd8fd4e 100644 --- a/src/org/andengine/opengl/texture/render/RenderTexture.java +++ b/src/org/andengine/opengl/texture/render/RenderTexture.java @@ -20,7 +20,7 @@ import android.opengl.GLES20; /** - * The general workflow with a {@link RenderTexture} is: {@link RenderTexture#init(GLState)} -> {@link RenderTexture#begin(GLState)} -> {@link RenderTexture#end(GLState)} -> {@link RenderTexture#destroy(GLState)}. + * The general workflow with a {@link RenderTexture} is: {@link #init(GLState)} -> {@link #begin(GLState)} -> {@link #end(GLState)} -> {@link #destroy(GLState)}. * * (c) 2011 Zynga Inc. * @@ -124,7 +124,7 @@ protected void writeTextureToHardware(final GLState pGLState) { /** * @param pGLState - * @throws RenderTextureInitializationException when this {@link RenderTexture} could not be initialized. The {@link GLException} contains the error code. When this exception is throw, all cleanup will be automatically performed through {@link RenderTexture#destroy(GLState)}. + * @throws RenderTextureInitializationException when this {@link RenderTexture} could not be initialized. The {@link GLException} contains the error code. When this exception is throw, all cleanup will be automatically performed through {@link #destroy(GLState)}. */ public void init(final GLState pGLState) throws GLFrameBufferException, GLException { this.savePreviousFramebufferObjectID(pGLState); @@ -159,16 +159,16 @@ public void init(final GLState pGLState) throws GLFrameBufferException, GLExcept } /** - * @see {@link RenderTexture#end(GLState)}, - * {@link RenderTexture#end(GLState, boolean, boolean}}. + * @see {@link #end(GLState)}, + * {@link #end(GLState, boolean, boolean}}. */ public void begin(final GLState pGLState) { this.begin(pGLState, false, false); } /** - * @see {@link RenderTexture#end(GLState)}, - * {@link RenderTexture#end(GLState, boolean, boolean}}. + * @see {@link #end(GLState)}, + * {@link #end(GLState, boolean, boolean}}. * * @param pColor the {@link Color} to clear this {@link RenderTexture}. */ @@ -177,8 +177,8 @@ public void begin(final GLState pGLState, final Color pColor) { } /** - * @see {@link RenderTexture#end(GLState)}, - * {@link RenderTexture#end(GLState, boolean, boolean}}. + * @see {@link #end(GLState)}, + * {@link #end(GLState, boolean, boolean}}. * * @param pRed the red portion of the color to clear this {@link RenderTexture}. * @param pGreen the green portion of the color to clear this {@link RenderTexture}. @@ -190,8 +190,8 @@ public void begin(final GLState pGLState, final float pRed, final float pGreen, } /** - * @see {@link RenderTexture#end(GLState)}, - * {@link RenderTexture#end(GLState, boolean, boolean}}. + * @see {@link #end(GLState)}, + * {@link #end(GLState, boolean, boolean}}. * * @param pColor the {@link Color} to clear this {@link RenderTexture}. */ @@ -200,8 +200,8 @@ public void begin(final GLState pGLState, final boolean pFlipX, final boolean pF } /** - * @see {@link RenderTexture#end(GLState)}, - * {@link RenderTexture#end(GLState, boolean, boolean}}. + * @see {@link #end(GLState)}, + * {@link #end(GLState, boolean, boolean}}. * * @param pRed the red portion of the color to clear this {@link RenderTexture}. * @param pGreen the green portion of the color to clear this {@link RenderTexture}. @@ -222,8 +222,8 @@ public void begin(final GLState pGLState, final boolean pFlipX, final boolean pF } /** - * @see {@link RenderTexture#end(GLState)}, - * {@link RenderTexture#end(GLState, boolean, boolean}}. + * @see {@link #end(GLState)}, + * {@link #end(GLState, boolean, boolean}}. */ public void begin(final GLState pGLState, final boolean pFlipX, final boolean pFlipY) { this.savePreviousViewport(); @@ -273,12 +273,12 @@ public void finish(final GLState pGLState) { } /** - * @see {@link RenderTexture#begin(GLState)}, - * {@link RenderTexture#begin(GLState, boolean, boolean)}, - * {@link RenderTexture#begin(GLState, Color)}, - * {@link RenderTexture#begin(GLState, float, float, float, float)}, - * {@link RenderTexture#begin(GLState, boolean, boolean, Color)}. - * {@link RenderTexture#begin(GLState, boolean, boolean, float, float, float, float)}. + * @see {@link #begin(GLState)}, + * {@link #begin(GLState, boolean, boolean)}, + * {@link #begin(GLState, Color)}, + * {@link #begin(GLState, float, float, float, float)}, + * {@link #begin(GLState, boolean, boolean, Color)}. + * {@link #begin(GLState, boolean, boolean, float, float, float, float)}. */ public void end(final GLState pGLState) { this.end(pGLState, false, false); @@ -289,12 +289,12 @@ public void end(final GLState pGLState) { * @param pFlush {@link GLState#flush()} has lower preference than pFinish. * @param pFinish {@link GLState#finish()} had higher preference than pFlush. * - * @see {@link RenderTexture#begin(GLState)}, - * {@link RenderTexture#begin(GLState, boolean, boolean)}, - * {@link RenderTexture#begin(GLState, Color)}, - * {@link RenderTexture#begin(GLState, float, float, float, float)}, - * {@link RenderTexture#begin(GLState, boolean, boolean, Color)}. - * {@link RenderTexture#begin(GLState, boolean, boolean, float, float, float, float)}. + * @see {@link #begin(GLState)}, + * {@link #begin(GLState, boolean, boolean)}, + * {@link #begin(GLState, Color)}, + * {@link #begin(GLState, float, float, float, float)}, + * {@link #begin(GLState, boolean, boolean, Color)}. + * {@link #begin(GLState, boolean, boolean, float, float, float, float)}. */ public void end(final GLState pGLState, final boolean pFlush, final boolean pFinish) { if (pFinish) { diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index 84324b5b7..6645a9594 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -504,7 +504,7 @@ public void activeTexture(final int pGLActiveTexture) { } /** - * @see {@link GLState#forceBindTexture(GLES20, int)} + * @see {@link #forceBindTexture(GLES20, int)} * @param GLES20 * @param pHardwareTextureID */ @@ -658,7 +658,7 @@ public void glTexSubImage2D(final int pTarget, final int pLevel, final int pX, f /** * Tells the OpenGL driver to send all pending commands to the GPU immediately. * - * @see {@link GLState#finish()}, + * @see {@link #finish()}, * {@link RenderTexture#end(GLState, boolean, boolean)}. */ public void flush() { @@ -670,7 +670,7 @@ public void flush() { * and then blocks until the effects of those commands have been completed on the GPU. * Since this is a costly method it should be only called when really needed. * - * @see {@link GLState#flush()}, + * @see {@link #flush()}, * {@link RenderTexture#end(GLState, boolean, boolean)}. */ public void finish() { diff --git a/src/org/andengine/opengl/vbo/VertexBufferObject.java b/src/org/andengine/opengl/vbo/VertexBufferObject.java index 8309240f3..da576770a 100644 --- a/src/org/andengine/opengl/vbo/VertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/VertexBufferObject.java @@ -52,7 +52,7 @@ public abstract class VertexBufferObject implements IVertexBufferObject { * @param pCapacity * @param pDrawType * @param pAutoDispose when passing true this {@link VertexBufferObject} loads itself to the active {@link VertexBufferObjectManager}. WARNING: When passing false one needs to take care of that by oneself! - * @param pVertexBufferObjectAttributes to be automatically enabled on the {@link ShaderProgram} used in {@link VertexBufferObject#bind(ShaderProgram)}. + * @param pVertexBufferObjectAttributes to be automatically enabled on the {@link ShaderProgram} used in {@link #bind(ShaderProgram)}. */ public VertexBufferObject(final VertexBufferObjectManager pVertexBufferObjectManager, final int pCapacity, final DrawType pDrawType, final boolean pAutoDispose, final VertexBufferObjectAttributes pVertexBufferObjectAttributes) { this.mVertexBufferObjectManager = pVertexBufferObjectManager; diff --git a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java index 9f3ad76f1..0a72376f9 100644 --- a/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java +++ b/src/org/andengine/opengl/vbo/ZeroMemoryVertexBufferObject.java @@ -229,8 +229,8 @@ private void loadToHardware(final GLState pGLState) { } /** - * When a non null {@link ByteBuffer} is returned by this function, it is guaranteed that {@link ZeroMemoryVertexBufferObject#releaseByteBuffer(ByteBuffer)} is called. - * @return a {@link ByteBuffer} to be passed to {@link ZeroMemoryVertexBufferObject#onPopulateBufferData(ByteBuffer)}. + * When a non null {@link ByteBuffer} is returned by this function, it is guaranteed that {@link #releaseByteBuffer(ByteBuffer)} is called. + * @return a {@link ByteBuffer} to be passed to {@link #onPopulateBufferData(ByteBuffer)}. */ protected ByteBuffer aquireByteBuffer() { final ByteBuffer byteBuffer = BufferUtils.allocateDirectByteBuffer(this.getByteCapacity()); diff --git a/src/org/andengine/util/StreamUtils.java b/src/org/andengine/util/StreamUtils.java index aebebc3cd..473a686f4 100644 --- a/src/org/andengine/util/StreamUtils.java +++ b/src/org/andengine/util/StreamUtils.java @@ -98,7 +98,7 @@ public static final byte[] streamToBytes(final InputStream pInputStream, final i } /** - * @see {@link StreamUtils#streamToBytes(InputStream, int, byte[], int)} + * @see {@link #streamToBytes(InputStream, int, byte[], int)} */ public static final void streamToBytes(final InputStream pInputStream, final int pByteLimit, final byte[] pData) throws IOException { StreamUtils.streamToBytes(pInputStream, pByteLimit, pData, 0); @@ -161,7 +161,7 @@ public static final void copy(final InputStream pInputStream, final ByteBuffer p * * @param pInputStream The input stream to copy from. * @param pOutputStream The output stream to copy to. - * @param pByteLimit not more than so much bytes to read, or unlimited if {@link StreamUtils#END_OF_STREAM}. + * @param pByteLimit not more than so much bytes to read, or unlimited if {@link #END_OF_STREAM}. * * @throws IOException If any error occurs during the copy. */ diff --git a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java index c7c08797f..4220a2f41 100644 --- a/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java +++ b/src/org/andengine/util/algorithm/collision/BaseCollisionChecker.java @@ -124,7 +124,7 @@ public static int relativeCCW(final float pX1, final float pY1, float pX2, float } /** - * Calls through to {@link BaseCollisionChecker#checkCollisionSub(float[], int, int, int, int, int, float[], int, int, int, int)} with the default parameters internally used by different AndEngine primitives. + * Calls through to {@link #checkCollisionSub(float[], int, int, int, int, int, float[], int, int, int, int)} with the default parameters internally used by different AndEngine primitives. * @param pVerticesA * @param pVertexCountA the number of vertices in pVerticesA * @param pVerticesB @@ -216,7 +216,7 @@ static boolean checkCollisionSub(final float[] pVerticesA, final int pVertexOffs } /** - * Calls through to {@link BaseCollisionChecker#checkContains(float[], int, int, int, int, float, float)} with the default parameters internally used by different AndEngine primitives. + * Calls through to {@link #checkContains(float[], int, int, int, int, float, float)} with the default parameters internally used by different AndEngine primitives. * * @param pVertices * @param pVertexCount the number of vertices in pVertices From 6b1751561a6be526aee7aa3b799f0fc39d373dc6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 9 May 2013 19:28:19 -0700 Subject: [PATCH 193/252] Added PriorityAggregatorQueue. --- .../adt/list/PriorityAggregatorQueue.java | 273 ++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 src/org/andengine/util/adt/list/PriorityAggregatorQueue.java diff --git a/src/org/andengine/util/adt/list/PriorityAggregatorQueue.java b/src/org/andengine/util/adt/list/PriorityAggregatorQueue.java new file mode 100644 index 000000000..9a3c4a80b --- /dev/null +++ b/src/org/andengine/util/adt/list/PriorityAggregatorQueue.java @@ -0,0 +1,273 @@ +package org.andengine.util.adt.list; + +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +import org.andengine.util.exception.MethodNotYetImplementedException; + +import android.util.SparseArray; +import android.util.SparseIntArray; + +/** + * The {@link PriorityAggregatorQueue} is a thread-safe queue that internally holds multiple queues each having their own priority. + * {@link #peek()}, {@link #poll()} and {@link #take()} always return the head of the highest priority internal queue. + * The {@link PriorityAggregatorQueue} is i.e. useful in networking situations where different {@link Thread}s (producers) put different messages of different priority and the network {@link Thread} (consumer) should always send the highest priority message first. + * + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:55:23 - 08.05.2013 + */ +public class PriorityAggregatorQueue { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + private final ReentrantLock mLock; + + private final SparseArray> mQueues = new SparseArray>(); + private final SparseIntArray mQueueCapacities = new SparseIntArray(); + private final SparseArray mNotFullConditions = new SparseArray(); + + private final Condition mNotEmptyCondition; + + private int mSize; + + // =========================================================== + // Constructors + // =========================================================== + + public PriorityAggregatorQueue(final boolean pFair) { + this.mLock = new ReentrantLock(pFair); + this.mNotEmptyCondition = this.mLock.newCondition(); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int size() { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + return this.mSize; + } finally { + lock.unlock(); + } + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + private void insert(final int pPrority, final T pItem) { // TODO Causes another (potentially unnecessary) lookup for the queue + final IList queue = this.mQueues.get(pPrority); + queue.add(pItem); + this.mSize++; + + this.mNotEmptyCondition.signal(); + } + + private T extract() { + final SparseArray> queues = this.mQueues; + final int queueCount = queues.size(); + for (int i = 0; i < queueCount; i++) { + final IList queue = this.mQueues.valueAt(i); + if (queue.size() > 0) { + final int priority = this.mQueues.keyAt(i); + return this.extract(priority); + } + } + return null; + } + + private T extract(final int pPriority) { // TODO Causes another (potentially unnecessary) lookup for the queue and the condition + final Condition notFullCondition = this.mNotFullConditions.get(pPriority); + + final IList queue = this.mQueues.get(pPriority); + final T item = queue.remove(0); + this.mSize--; + + notFullCondition.signal(); + + return item; + } + + public void addQueue(final int pPriority) { + this.addQueue(pPriority, Integer.MAX_VALUE); + } + + public void addQueue(final int pPriority, final int pCapacity) { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + if (this.mQueues.get(pPriority) == null) { + this.mQueues.put(pPriority, new CircularList()); + this.mQueueCapacities.put(pPriority, pCapacity); + this.mNotFullConditions.put(pPriority, this.mLock.newCondition()); + } else { + throw new IllegalArgumentException("Queue with priority: '" + pPriority + "' already exists."); + } + } finally { + lock.unlock(); + } + } + + public void addQueue(final int pPriority, final int pCapacity, final int pInitialCapacity) { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + this.mQueues.put(pPriority, new CircularList(pInitialCapacity)); + this.mQueueCapacities.put(pPriority, pCapacity); + this.mNotFullConditions.put(pPriority, this.mLock.newCondition()); + } finally { + lock.unlock(); + } + } + + public T peek() { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + if (this.mSize == 0) { + return null; + } else { + final SparseArray> queues = this.mQueues; + final int queueCount = queues.size(); + for (int i = 0; i < queueCount; i++) { + final IList queue = this.mQueues.valueAt(i); + if (queue.size() > 0) { + return queue.get(0); + } + } + return null; + } + } finally { + lock.unlock(); + } + } + + public T poll() { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + if (this.mSize == 0) { + return null; + } else { + return extract(); + } + } finally { + lock.unlock(); + } + } + + public T take() throws InterruptedException { + final ReentrantLock lock = this.mLock; + lock.lockInterruptibly(); + + try { + try { + while (this.mSize == 0) { + this.mNotEmptyCondition.await(); + } + } catch (final InterruptedException e) { + /* Propagate to non-interrupted thread. */ + this.mNotEmptyCondition.signal(); + throw e; + } + return this.extract(); + } finally { + lock.unlock(); + } + } + + /** + * Inserts the specified element at the tail of this queue with the given priority, waiting for space to become available if the queue is full. + * + * @throws IllegalArgumentException if pItem is null + * @throws InterruptedException + */ + public void put(final int pPriority, final T pItem) throws IllegalArgumentException, InterruptedException { + if (pItem == null) { + throw new IllegalArgumentException("pItem must not be null."); + } + + final ReentrantLock lock = this.mLock; + final Condition notFullCondition = this.mNotFullConditions.get(pPriority); + lock.lockInterruptibly(); + + try { + final IList queue = this.mQueues.get(pPriority); + if (queue == null) { + throw new IllegalArgumentException("No queue found for pPriority: '" + pPriority + "'."); + } + + final int queueCapacity = this.mQueueCapacities.get(pPriority); + try { + while (queue.size() == queueCapacity) { + notFullCondition.await(); + } + } catch (final InterruptedException e) { + /* Propagate to non-interrupted thread. */ + notFullCondition.signal(); + throw e; + } + insert(pPriority, pItem); + } finally { + lock.unlock(); + } + } + + /** + * Inserts the specified element at the tail of this queue with the given priority, if it is possible without exceeding the capacity of the queue with the given priority. + * + * @throws IllegalArgumentException if pItem is null + * @return true if the + */ + public boolean offer(final int pPriority, final T pItem) throws IllegalArgumentException { + if (pItem == null) { + throw new IllegalArgumentException("pItem must not be null."); + } + + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + final IList queue = this.mQueues.get(pPriority); + if (queue == null) { + throw new IllegalArgumentException("No queue found for pPriority: '" + pPriority + "'."); + } + + final int queueCapacity = this.mQueueCapacities.get(pPriority); + if (queue.size() == queueCapacity) { + return false; + } else { + insert(pPriority, pItem); + return true; + } + } finally { + lock.unlock(); + } + } + + public void set(final int pPriority, final T pItem) { // TODO Same as put but replaces the first + throw new MethodNotYetImplementedException(); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From 2ceb53ff851bc09655605925c888812cf0bc864a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 11:46:43 -0700 Subject: [PATCH 194/252] Minor javadoc improvements and fixes for @Deprecated methods. --- .../engine/splitscreen/DoubleSceneSplitScreenEngine.java | 9 +++++++++ .../engine/splitscreen/SingleSceneSplitScreenEngine.java | 3 +++ src/org/andengine/entity/primitive/Line.java | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java index 8bb8beb0e..151bf6808 100644 --- a/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/DoubleSceneSplitScreenEngine.java @@ -41,6 +41,9 @@ public DoubleSceneSplitScreenEngine(final EngineOptions pEngineOptions, final Ca // Getter & Setter // =========================================================== + /** + * @deprecated Instead use {@link #getFirstCamera()} or {@link #getSecondCamera()}. + */ @Deprecated @Override public Camera getCamera() { @@ -55,6 +58,9 @@ public Camera getSecondCamera() { return this.mSecondCamera; } + /** + * @deprecated Instead use {@link #getFirstCamera()} or {@link #getSecondScene()}. + */ @Deprecated @Override public Scene getScene() { @@ -69,6 +75,9 @@ public Scene getSecondScene() { return this.mSecondScene; } + /** + * @deprecated Instead use {@link #setFirstScene(Scene)} or {@link #setSecondScene(Scene)}. + */ @Deprecated @Override public void setScene(final Scene pScene) { diff --git a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java index f001f7e2c..c10e2da83 100644 --- a/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java +++ b/src/org/andengine/engine/splitscreen/SingleSceneSplitScreenEngine.java @@ -39,6 +39,9 @@ public SingleSceneSplitScreenEngine(final EngineOptions pEngineOptions, final Ca // Getter & Setter // =========================================================== + /** + * @deprecated Instead use {@link #getFirstCamera()} or {@link #getSecondCamera()}. + */ @Deprecated @Override public Camera getCamera() { diff --git a/src/org/andengine/entity/primitive/Line.java b/src/org/andengine/entity/primitive/Line.java index 64b15510c..57e3b47eb 100644 --- a/src/org/andengine/entity/primitive/Line.java +++ b/src/org/andengine/entity/primitive/Line.java @@ -117,7 +117,7 @@ public float getX() { } /** - * @deprecatedInstead use {@link #getY1()} or {@link #getY2()}. + * @deprecated Instead use {@link #getY1()} or {@link #getY2()}. */ @Deprecated @Override From 265c1b9e183bc406d0b4041065eaefd2519d08dd Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 12:57:17 -0700 Subject: [PATCH 195/252] Added toString implementation for all ILists implementations. --- .../andengine/util/adt/list/CircularList.java | 5 ++++ .../andengine/util/adt/list/ListUtils.java | 24 +++++++++++++++++++ .../andengine/util/adt/list/ShiftList.java | 5 ++++ .../andengine/util/adt/list/SortedList.java | 5 ++++ .../andengine/util/adt/list/UniqueList.java | 5 ++++ .../adt/list/concurrent/SynchronizedList.java | 6 +++++ .../queue/concurrent/SynchronizedQueue.java | 6 +++++ 7 files changed, 56 insertions(+) diff --git a/src/org/andengine/util/adt/list/CircularList.java b/src/org/andengine/util/adt/list/CircularList.java index 271a5debd..60435245d 100644 --- a/src/org/andengine/util/adt/list/CircularList.java +++ b/src/org/andengine/util/adt/list/CircularList.java @@ -226,6 +226,11 @@ public void clear() { this.mSize = 0; } + @Override + public String toString() { + return ListUtils.toString(this); + } + // =========================================================== // Methods // =========================================================== diff --git a/src/org/andengine/util/adt/list/ListUtils.java b/src/org/andengine/util/adt/list/ListUtils.java index 5dd61f91a..7c1ec9fbd 100644 --- a/src/org/andengine/util/adt/list/ListUtils.java +++ b/src/org/andengine/util/adt/list/ListUtils.java @@ -95,6 +95,30 @@ public static final int encodeInsertionIndex(final int pIndex) { return (-pIndex) - 1; } + public static String toString(final IList pItems) { + final int size = pItems.size(); + if (size == 0) { + return "[]"; + } else { + final StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append('['); + for (int i = 0; i < size; i++) { + final T item = pItems.get(i); + + stringBuilder.append(item.toString()); + + if (i < size - 1) { + stringBuilder.append(", "); + } else { + break; + } + } + stringBuilder.append(']'); + + return stringBuilder.toString(); + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== diff --git a/src/org/andengine/util/adt/list/ShiftList.java b/src/org/andengine/util/adt/list/ShiftList.java index 124f9bc63..e2af85c0d 100644 --- a/src/org/andengine/util/adt/list/ShiftList.java +++ b/src/org/andengine/util/adt/list/ShiftList.java @@ -244,6 +244,11 @@ public void clear() { this.mTail = 0; } + @Override + public String toString() { + return ListUtils.toString(this); + } + // =========================================================== // Methods // =========================================================== diff --git a/src/org/andengine/util/adt/list/SortedList.java b/src/org/andengine/util/adt/list/SortedList.java index 1cfb21849..51db59caa 100644 --- a/src/org/andengine/util/adt/list/SortedList.java +++ b/src/org/andengine/util/adt/list/SortedList.java @@ -119,6 +119,11 @@ public void clear() { this.mList.clear(); } + @Override + public String toString() { + return ListUtils.toString(this); + } + // =========================================================== // Methods // =========================================================== diff --git a/src/org/andengine/util/adt/list/UniqueList.java b/src/org/andengine/util/adt/list/UniqueList.java index 0d84e8c8a..ead379ee1 100644 --- a/src/org/andengine/util/adt/list/UniqueList.java +++ b/src/org/andengine/util/adt/list/UniqueList.java @@ -108,6 +108,11 @@ public void clear() { this.mList.clear(); } + @Override + public String toString() { + return ListUtils.toString(this); + } + // =========================================================== // Methods // =========================================================== diff --git a/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java b/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java index bbc0e85c1..932276708 100644 --- a/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java +++ b/src/org/andengine/util/adt/list/concurrent/SynchronizedList.java @@ -1,6 +1,7 @@ package org.andengine.util.adt.list.concurrent; import org.andengine.util.adt.list.IList; +import org.andengine.util.adt.list.ListUtils; /** * (c) 2012 Zynga Inc. @@ -95,6 +96,11 @@ public synchronized void clear() { this.mList.clear(); } + @Override + public synchronized String toString() { + return ListUtils.toString(this); + } + // =========================================================== // Methods // =========================================================== diff --git a/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java b/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java index d446efff6..66ce918b5 100644 --- a/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java +++ b/src/org/andengine/util/adt/queue/concurrent/SynchronizedQueue.java @@ -1,5 +1,6 @@ package org.andengine.util.adt.queue.concurrent; +import org.andengine.util.adt.list.ListUtils; import org.andengine.util.adt.queue.IQueue; /** @@ -115,6 +116,11 @@ public synchronized void clear() { this.mQueue.clear(); } + @Override + public synchronized String toString() { + return ListUtils.toString(this); + } + // =========================================================== // Methods // =========================================================== From b991974cf1c25988c1fdecb48fc91099a69f7ed6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 12:59:47 -0700 Subject: [PATCH 196/252] Renamed PriorityAggregatorQueue to PriorityBlockingAggregatorQueue and moved it to the proper package. Added clear() and clear(int), clearAndPut(int, T) and clearAndOffer(int, T) methods. --- .../PriorityBlockingAggregatorQueue.java} | 148 +++++++++++++++--- 1 file changed, 126 insertions(+), 22 deletions(-) rename src/org/andengine/util/adt/{list/PriorityAggregatorQueue.java => queue/concurrent/PriorityBlockingAggregatorQueue.java} (65%) diff --git a/src/org/andengine/util/adt/list/PriorityAggregatorQueue.java b/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java similarity index 65% rename from src/org/andengine/util/adt/list/PriorityAggregatorQueue.java rename to src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java index 9a3c4a80b..cbd5cdb4d 100644 --- a/src/org/andengine/util/adt/list/PriorityAggregatorQueue.java +++ b/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java @@ -1,28 +1,31 @@ -package org.andengine.util.adt.list; +package org.andengine.util.adt.queue.concurrent; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; -import org.andengine.util.exception.MethodNotYetImplementedException; +import org.andengine.util.adt.list.CircularList; +import org.andengine.util.adt.list.IList; import android.util.SparseArray; import android.util.SparseIntArray; /** - * The {@link PriorityAggregatorQueue} is a thread-safe queue that internally holds multiple queues each having their own priority. + * The {@link PriorityBlockingAggregatorQueue} is a thread-safe queue that internally holds multiple queues each having their own priority. * {@link #peek()}, {@link #poll()} and {@link #take()} always return the head of the highest priority internal queue. - * The {@link PriorityAggregatorQueue} is i.e. useful in networking situations where different {@link Thread}s (producers) put different messages of different priority and the network {@link Thread} (consumer) should always send the highest priority message first. + * The {@link PriorityBlockingAggregatorQueue} is i.e. useful in networking situations where different {@link Thread}s (producers) put different messages of different priority and the network {@link Thread} (consumer) should always send the highest priority message first. * * (c) 2013 Nicolas Gramlich * * @author Nicolas Gramlich * @since 21:55:23 - 08.05.2013 */ -public class PriorityAggregatorQueue { +public class PriorityBlockingAggregatorQueue { // =========================================================== // Constants // =========================================================== + private static final int QUEUE_INITIAL_CAPACITY_DEFAULT = 10; + // =========================================================== // Fields // =========================================================== @@ -41,7 +44,7 @@ public class PriorityAggregatorQueue { // Constructors // =========================================================== - public PriorityAggregatorQueue(final boolean pFair) { + public PriorityBlockingAggregatorQueue(final boolean pFair) { this.mLock = new ReentrantLock(pFair); this.mNotEmptyCondition = this.mLock.newCondition(); } @@ -65,6 +68,46 @@ public int size() { // Methods for/from SuperClass/Interfaces // =========================================================== + @Override + public String toString() { + final ReentrantLock lock = this.mLock; + lock.lock(); + try { + final StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append(this.getClass().getSimpleName()); + + if (this.mQueues.size() > 0) { + final SparseArray> queues = this.mQueues; + final SparseIntArray queueCapacities = this.mQueueCapacities; + + stringBuilder.append(" ["); + + final int queueCount = queues.size(); + for (int i = 0; i < queueCount; i++) { + final int priority = queues.keyAt(i); + final IList queue = queues.valueAt(i); + final int queueCapacity = queueCapacities.valueAt(i); + final int queueSize = queue.size(); + + stringBuilder.append("\tPriority: ").append(priority).append(" (Capacity: ").append(queueSize).append('/').append(queueCapacity).append("): "); + stringBuilder.append(queue.toString()); + + if (i < (queueCount - 1)) { + stringBuilder.append(','); + } + stringBuilder.append('\n'); + } + + stringBuilder.append(']'); + } + + return stringBuilder.toString(); + } finally { + lock.unlock(); + } + } + + // =========================================================== // Methods // =========================================================== @@ -107,23 +150,18 @@ public void addQueue(final int pPriority) { } public void addQueue(final int pPriority, final int pCapacity) { - final ReentrantLock lock = this.mLock; - lock.lock(); - - try { - if (this.mQueues.get(pPriority) == null) { - this.mQueues.put(pPriority, new CircularList()); - this.mQueueCapacities.put(pPriority, pCapacity); - this.mNotFullConditions.put(pPriority, this.mLock.newCondition()); - } else { - throw new IllegalArgumentException("Queue with priority: '" + pPriority + "' already exists."); - } - } finally { - lock.unlock(); - } + this.addQueue(pPriority, pCapacity, QUEUE_INITIAL_CAPACITY_DEFAULT); } public void addQueue(final int pPriority, final int pCapacity, final int pInitialCapacity) { + if (pCapacity <= 0) { + throw new IllegalArgumentException("pCapacity must be greater than 0."); + } + + if (pInitialCapacity <= 0) { + throw new IllegalArgumentException("pInitialCapacity must be greater than 0."); + } + final ReentrantLock lock = this.mLock; lock.lock(); @@ -263,8 +301,74 @@ public boolean offer(final int pPriority, final T pItem) throws IllegalArgumentE } } - public void set(final int pPriority, final T pItem) { // TODO Same as put but replaces the first - throw new MethodNotYetImplementedException(); + public void clear() { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + if (this.mSize > 0) { + final SparseArray> queues = this.mQueues; + final int queueCount = queues.size(); + for (int i = 0; i < queueCount; i++) { + final int priority = this.mQueues.keyAt(i); + + final IList queue = this.mQueues.valueAt(i); + queue.clear(); + + final Condition notFullCondition = this.mNotFullConditions.get(priority); + notFullCondition.signal(); + } + this.mSize = 0; + } + } finally { + lock.unlock(); + } + } + + public void clear(final int pPriority) { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + final IList queue = this.mQueues.get(pPriority); + if (queue == null) { + throw new IllegalArgumentException("No queue found for pPriority: '" + pPriority + "'."); + } + final int queueSize = queue.size(); + + queue.clear(); + + final Condition notFullCondition = this.mNotFullConditions.get(pPriority); + notFullCondition.signal(); + + this.mSize -= queueSize; + } finally { + lock.unlock(); + } + } + + public void clearAndPut(final int pPriority, final T pItem) throws IllegalArgumentException, InterruptedException { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + this.clear(pPriority); + this.put(pPriority, pItem); + } finally { + lock.unlock(); + } + } + + public boolean clearAndOffer(final int pPriority, final T pItem) { + final ReentrantLock lock = this.mLock; + lock.lock(); + + try { + this.clear(pPriority); + return this.offer(pPriority, pItem); + } finally { + lock.unlock(); + } } // =========================================================== From eccd56a04a782e8611d5eff6a49e954cae0fe11a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 13:00:43 -0700 Subject: [PATCH 197/252] Added method SystemUtils.getTargetSDKVersion. --- src/org/andengine/util/system/SystemUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index d7248f357..5f96579f8 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -152,6 +152,10 @@ public static PackageInfo getPackageInfo(final Context pContext, final int pFlag } } + public static int getTargetSDKVersion(final Context pContext) throws SystemUtilsException { + return SystemUtils.getApplicationInfo(pContext).targetSdkVersion; + } + public static boolean hasSystemFeature(final Context pContext, final String pFeature) throws SystemUtilsException { final PackageManager packageManager = pContext.getPackageManager(); try { From 41fba3901598ca1b1adcf653f575c8e5b746cfc6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 13:01:59 -0700 Subject: [PATCH 198/252] Added AsyncTaskUtils. --- src/org/andengine/util/AsyncTaskUtils.java | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/org/andengine/util/AsyncTaskUtils.java diff --git a/src/org/andengine/util/AsyncTaskUtils.java b/src/org/andengine/util/AsyncTaskUtils.java new file mode 100644 index 000000000..065d2443f --- /dev/null +++ b/src/org/andengine/util/AsyncTaskUtils.java @@ -0,0 +1,55 @@ +package org.andengine.util; + +import android.annotation.TargetApi; +import android.os.AsyncTask; +import android.os.Build; + + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 12:42:12 - 11.05.2013 + */ +public final class AsyncTaskUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private AsyncTaskUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public static void executeParallel(final AsyncTask pAsyncTask, final T ... pParameters) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + pAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pParameters); + } else { + pAsyncTask.execute(pParameters); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From d454ffd394a9d414c14b934beb6c67a4ac4fdc5f Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 13:02:51 -0700 Subject: [PATCH 199/252] Made ActivityUtils use AsyncTaskUtils.executeParallel. --- src/org/andengine/util/ActivityUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/util/ActivityUtils.java b/src/org/andengine/util/ActivityUtils.java index 482f2c4f3..69b89aeef 100644 --- a/src/org/andengine/util/ActivityUtils.java +++ b/src/org/andengine/util/ActivityUtils.java @@ -109,7 +109,7 @@ public static final void doAsync(final Context pContext, final int pTitleRes } public static final void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { - new AsyncTask() { + AsyncTaskUtils.executeParallel(new AsyncTask() { private ProgressDialog mPD; private Exception mException; @@ -162,7 +162,7 @@ public void onPostExecute(final T pResult) { super.onPostExecute(pResult); } - }.execute((Void[]) null); + }); } public static final void doProgressAsync(final Context pContext, final int pTitleResourceID, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback) { @@ -178,7 +178,7 @@ public static final void doProgressAsync(final Context pContext, final int p } public static final void doProgressAsync(final Context pContext, final CharSequence pTitle, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { - new AsyncTask() { + AsyncTaskUtils.executeParallel(new AsyncTask() { private ProgressDialog mPD; private Exception mException; @@ -238,7 +238,7 @@ public void onPostExecute(final T pResult) { super.onPostExecute(pResult); } - }.execute((Void[]) null); + }); } public static final void doAsync(final Context pContext, final int pTitleResourceID, final int pMessageResourceID, final AsyncCallable pAsyncCallable, final Callback pCallback, final Callback pExceptionCallback) { From 63559047af1ace82c92a4a9dca838a3296ba8a6e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 13:07:01 -0700 Subject: [PATCH 200/252] Fixed wrong version in AsyncTaskUtils.executeParallel. --- src/org/andengine/util/AsyncTaskUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/AsyncTaskUtils.java b/src/org/andengine/util/AsyncTaskUtils.java index 065d2443f..964e84251 100644 --- a/src/org/andengine/util/AsyncTaskUtils.java +++ b/src/org/andengine/util/AsyncTaskUtils.java @@ -42,7 +42,7 @@ private AsyncTaskUtils() { @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static void executeParallel(final AsyncTask pAsyncTask, final T ... pParameters) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB_MR1) { pAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pParameters); } else { pAsyncTask.execute(pParameters); From d90507e4f3fb6787cc1107d82e5f44c7ac7f1e4b Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 11 May 2013 13:54:35 -0700 Subject: [PATCH 201/252] Minor changes. --- src/org/andengine/util/ActivityUtils.java | 4 ++-- src/org/andengine/util/AsyncTaskUtils.java | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/util/ActivityUtils.java b/src/org/andengine/util/ActivityUtils.java index 69b89aeef..75e76a69b 100644 --- a/src/org/andengine/util/ActivityUtils.java +++ b/src/org/andengine/util/ActivityUtils.java @@ -109,7 +109,7 @@ public static final void doAsync(final Context pContext, final int pTitleRes } public static final void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable pCallable, final Callback pCallback, final Callback pExceptionCallback, final boolean pCancelable) { - AsyncTaskUtils.executeParallel(new AsyncTask() { + AsyncTaskUtils.execute(new AsyncTask() { private ProgressDialog mPD; private Exception mException; @@ -178,7 +178,7 @@ public static final void doProgressAsync(final Context pContext, final int p } public static final void doProgressAsync(final Context pContext, final CharSequence pTitle, final int pIconResourceID, final ProgressCallable pCallable, final Callback pCallback, final Callback pExceptionCallback) { - AsyncTaskUtils.executeParallel(new AsyncTask() { + AsyncTaskUtils.execute(new AsyncTask() { private ProgressDialog mPD; private Exception mException; diff --git a/src/org/andengine/util/AsyncTaskUtils.java b/src/org/andengine/util/AsyncTaskUtils.java index 964e84251..83c9eb263 100644 --- a/src/org/andengine/util/AsyncTaskUtils.java +++ b/src/org/andengine/util/AsyncTaskUtils.java @@ -1,5 +1,7 @@ package org.andengine.util; +import org.andengine.util.system.SystemUtils; + import android.annotation.TargetApi; import android.os.AsyncTask; import android.os.Build; @@ -40,9 +42,12 @@ private AsyncTaskUtils() { // Methods // =========================================================== + /** + * @see groups.google.com/forum/?fromgroups=#!topic/android-developers/8M0RTFfO7-M + */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) - public static void executeParallel(final AsyncTask pAsyncTask, final T ... pParameters) { - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB_MR1) { + public static void execute(final AsyncTask pAsyncTask, final T ... pParameters) { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB)) { pAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, pParameters); } else { pAsyncTask.execute(pParameters); From 73276bd8818e15d14f29980d689d511ec97bee85 Mon Sep 17 00:00:00 2001 From: Michal Stawinski Date: Sun, 5 May 2013 01:35:10 +0200 Subject: [PATCH 202/252] Take a union of new and old clip settings when applying glScissor --- .../andengine/opengl/util/GLScissorStack.java | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/opengl/util/GLScissorStack.java b/src/org/andengine/opengl/util/GLScissorStack.java index add7e2c7a..0d63cc6d4 100644 --- a/src/org/andengine/opengl/util/GLScissorStack.java +++ b/src/org/andengine/opengl/util/GLScissorStack.java @@ -85,12 +85,38 @@ public void glScissors(final int pX, final int pY, final int pWidth, final int p } public void glScissorPush(final int[] pScissors) { - glScissors(pScissors); + if (getStackDepth() == 0) { + glScissors(pScissors); + } else { + /* take a union between old and new clip rect */ + getScissor(mTemp); + final int x1 = Math.max(pScissors[GLSCISSOR_X_POS], mTemp[GLSCISSOR_X_POS]); + final int y1 = Math.max(pScissors[GLSCISSOR_Y_POS], mTemp[GLSCISSOR_Y_POS]); + final int x2 = Math.min(pScissors[GLSCISSOR_X_POS] + pScissors[GLSCISSOR_WIDTH_POS], mTemp[GLSCISSOR_X_POS] + mTemp[GLSCISSOR_WIDTH_POS]); + final int y2 = Math.min(pScissors[GLSCISSOR_Y_POS] + pScissors[GLSCISSOR_HEIGHT_POS], mTemp[GLSCISSOR_Y_POS] + mTemp[GLSCISSOR_HEIGHT_POS]); + + final int w = Math.max(0, x2 - x1); + final int h = Math.max(0, y2 - y1); + glScissors(x1, y1, w, h); + } pushScissor(pScissors); } public void glScissorPush(final int pX, final int pY, final int pWidth, final int pHeight) { - glScissors(pX, pY, pWidth, pHeight); + if (getStackDepth() == 0) { + glScissors(pX, pY, pWidth, pHeight); + } else { + /* take a union between old and new clip rect */ + getScissor(mTemp); + final int x1 = Math.max(pX, mTemp[GLSCISSOR_X_POS]); + final int y1 = Math.max(pY, mTemp[GLSCISSOR_Y_POS]); + final int x2 = Math.min(pX + pWidth, mTemp[GLSCISSOR_X_POS] + mTemp[GLSCISSOR_WIDTH_POS]); + final int y2 = Math.min(pY + pHeight, mTemp[GLSCISSOR_Y_POS] + mTemp[GLSCISSOR_HEIGHT_POS]); + + final int w = Math.max(0, x2 - x1); + final int h = Math.max(0, y2 - y1); + glScissors(x1, y1, w, h); + } pushScissor(pX, pY, pWidth, pHeight); } From 7130362cef4e734fc5c33ebe178ebec21762be0a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 13 May 2013 00:20:07 -0700 Subject: [PATCH 203/252] Minor changes in PriorityBlockingAggregatorQueue.toString(). --- .../adt/queue/concurrent/PriorityBlockingAggregatorQueue.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java b/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java index cbd5cdb4d..e419d0588 100644 --- a/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java +++ b/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java @@ -72,15 +72,15 @@ public int size() { public String toString() { final ReentrantLock lock = this.mLock; lock.lock(); + try { final StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(this.getClass().getSimpleName()); if (this.mQueues.size() > 0) { final SparseArray> queues = this.mQueues; final SparseIntArray queueCapacities = this.mQueueCapacities; - stringBuilder.append(" ["); + stringBuilder.append(" [\n"); final int queueCount = queues.size(); for (int i = 0; i < queueCount; i++) { From cb594b2a8be144271804510b7fb73b2f3abf323a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 14 May 2013 22:38:05 -0700 Subject: [PATCH 204/252] Split up SystemUtils meta data methods (which where all optional) into required and optional methods (JSONObject) style. --- .../andengine/util/system/SystemUtils.java | 88 +++++++++++++++++-- 1 file changed, 83 insertions(+), 5 deletions(-) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index 5f96579f8..561cf8f8b 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -183,31 +183,109 @@ public static boolean hasSystemFeature(final Context pContext, final String pFea } } - public static boolean getMetaDataBoolean(final Context pContext, final String pKey) throws SystemUtilsException { + public static boolean optMetaDataBoolean(final Context pContext, final String pKey) throws SystemUtilsException { final Bundle bundle = SystemUtils.getMetaData(pContext); return bundle.getBoolean(pKey); } - public static int getMetaDataInt(final Context pContext, final String pKey) throws SystemUtilsException { + public static boolean optMetaDataBoolean(final Context pContext, final String pKey, final boolean pDefaultValue) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return bundle.getBoolean(pKey, pDefaultValue); + } + + public static int optMetaDataInt(final Context pContext, final String pKey) throws SystemUtilsException { final Bundle bundle = SystemUtils.getMetaData(pContext); return bundle.getInt(pKey); } - public static float getMetaDataFloat(final Context pContext, final String pKey) throws SystemUtilsException { + public static int optMetaDataInt(final Context pContext, final String pKey, final int pDefaultValue) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return bundle.getInt(pKey, pDefaultValue); + } + + public static float optMetaDataFloat(final Context pContext, final String pKey) throws SystemUtilsException { final Bundle bundle = SystemUtils.getMetaData(pContext); return bundle.getFloat(pKey); } - public static String getMetaDataString(final Context pContext, final String pKey) throws SystemUtilsException { + public static float optMetaDataFloat(final Context pContext, final String pKey, final float pDefaultValue) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + return bundle.getFloat(pKey, pDefaultValue); + } + + public static String optMetaDataString(final Context pContext, final String pKey) throws SystemUtilsException { final Bundle bundle = SystemUtils.getMetaData(pContext); return bundle.getString(pKey); } - public static int getMetaDataColor(final Context pContext, final String pKey) throws SystemUtilsException { + public static String optMetaDataString(final Context pContext, final String pKey, final String pDefaultValue) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + if (bundle.containsKey(pKey)) { + return bundle.getString(pKey); + } else { + return pDefaultValue; + } + } + + public static int optMetaDataColor(final Context pContext, final String pKey) throws SystemUtilsException { final Bundle bundle = SystemUtils.getMetaData(pContext); return Color.parseColor(bundle.getString(pKey)); } + public static int optMetaDataColor(final Context pContext, final String pKey, final int pDefaultValue) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + if (bundle.containsKey(pKey)) { + return Color.parseColor(bundle.getString(pKey)); + } else { + return pDefaultValue; + } + } + + public static boolean getMetaDataBoolean(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + if (bundle.containsKey(pKey)) { + return bundle.getBoolean(pKey); + } else { + throw new SystemUtilsException(new IllegalArgumentException("Could not find meta data with key: '" + pKey + "'.")); + } + } + + public static int getMetaDataInt(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + if (bundle.containsKey(pKey)) { + return bundle.getInt(pKey); + } else { + throw new SystemUtilsException(new IllegalArgumentException("Could not find meta data with key: '" + pKey + "'.")); + } + } + + public static float getMetaDataFloat(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + if (bundle.containsKey(pKey)) { + return bundle.getFloat(pKey); + } else { + throw new SystemUtilsException(new IllegalArgumentException("Could not find meta data with key: '" + pKey + "'.")); + } + } + + public static String getMetaDataString(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + if (bundle.containsKey(pKey)) { + return bundle.getString(pKey); + } else { + throw new SystemUtilsException(new IllegalArgumentException("Could not find meta data with key: '" + pKey + "'.")); + } + } + + public static int getMetaDataColor(final Context pContext, final String pKey) throws SystemUtilsException { + final Bundle bundle = SystemUtils.getMetaData(pContext); + if (bundle.containsKey(pKey)) { + return Color.parseColor(bundle.getString(pKey)); + } else { + throw new SystemUtilsException(new IllegalArgumentException("Could not find meta data with key: '" + pKey + "'.")); + } + } + public static Bundle getMetaData(final Context pContext) throws SystemUtilsException { try { final ApplicationInfo applicationInfo = SystemUtils.getApplicationInfo(pContext, PackageManager.GET_META_DATA); From a75f0f2b0a2100b132fb00eec0ad8876ca156702 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 15 May 2013 20:54:10 -0700 Subject: [PATCH 205/252] Updated to ADT 22. --- .classpath | 1 + 1 file changed, 1 insertion(+) diff --git a/.classpath b/.classpath index d3bb07b44..f7b8a1f99 100644 --- a/.classpath +++ b/.classpath @@ -4,5 +4,6 @@ + From ebb1050c43c91ec0ca44a3f2ecdb4621a74fdf93 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 16 May 2013 19:06:01 -0700 Subject: [PATCH 206/252] Updated .gitignore for future Android Studio support. --- .gitignore | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 193211df4..1a11476e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,30 @@ +# System: +Thumbs.db +.DS_Store +*.swp +*~ +Desktop.ini + +# Version Control Systems: +.svn +CVS +.hg +.bzr + +# Android: +local.properties +proguard/** target/** bin/** +obj/** doc/** gen/** -.DS_Store -Thumbs.db gdb.setup gdbserver -.svn -.hg -local.properties + +# Eclipse: .settings -AndEngine.iml \ No newline at end of file + +# IntelliJ / Android Studio: +idea/workspace.xml +idea/tasks.xml \ No newline at end of file From 48a441a00898111f9dbf73e438f034e84b44e886 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 18 May 2013 19:42:45 -0700 Subject: [PATCH 207/252] Minor change. --- src/org/andengine/util/IMatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/IMatcher.java b/src/org/andengine/util/IMatcher.java index 0b8965236..d9c097644 100644 --- a/src/org/andengine/util/IMatcher.java +++ b/src/org/andengine/util/IMatcher.java @@ -16,5 +16,5 @@ public interface IMatcher { // Methods // =========================================================== - public boolean matches(final T pObject); + public boolean matches(final T pItem); } From a9d1798927d4db524bd64f88be444546516b08a6 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 18 May 2013 19:45:16 -0700 Subject: [PATCH 208/252] Added TextUtils.join. --- src/org/andengine/util/TextUtils.java | 28 +++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java index a6fc8b403..191542593 100644 --- a/src/org/andengine/util/TextUtils.java +++ b/src/org/andengine/util/TextUtils.java @@ -190,6 +190,34 @@ public static boolean isEmpty(final CharSequence[] pTexts) { } } + public static final String join(final char pSeparator, final Object ... pStrings) { + final StringBuilder stringBuilder = new StringBuilder(); + + final int count = pStrings.length; + for (int i = 0; i < count; i++) { + stringBuilder.append(pStrings[i]); + if (i < count - 1) { + stringBuilder.append(pSeparator); + } + } + + return stringBuilder.toString(); + } + + public static final String join(final String pSeparator, final Object ... pStrings) { + final StringBuilder stringBuilder = new StringBuilder(); + + final int count = pStrings.length; + for (int i = 0; i < count; i++) { + stringBuilder.append(pStrings[i]); + if (i < count - 1) { + stringBuilder.append(pSeparator); + } + } + + return stringBuilder.toString(); + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From 896582c7bc20876d5f1239b8438c0a799c7a8da1 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 19 May 2013 19:45:35 -0700 Subject: [PATCH 209/252] Added SystemUtils.isNDKSupported with special case for GoogleTV. --- src/org/andengine/util/system/SystemUtils.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index 561cf8f8b..7fac765a4 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -107,6 +107,22 @@ public static boolean isGoogleTV(final Context pContext, final boolean pDefault) } } + public static boolean isNDKSupported(final Context pContext, final boolean pDefault) { + try { + if (SystemUtils.isGoogleTV(pContext)) { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.JELLY_BEAN_MR1)) { + return true; + } else { + return false; + } + } else { + return true; + } + } catch (final SystemUtilsException e) { + return pDefault; + } + } + public static String getApplicationLabel(final Context pContext) throws SystemUtilsException { final int labelResID = SystemUtils.getApplicationInfo(pContext).labelRes; return pContext.getString(labelResID); From 5ac0a926cf08c2c16e7451fc71727885d1ece589 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 19 May 2013 19:53:55 -0700 Subject: [PATCH 210/252] Added ant-contrib-1.0b3.jar. --- ext/libs/ant-contrib-1.0b3.jar | Bin 0 -> 224277 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ext/libs/ant-contrib-1.0b3.jar diff --git a/ext/libs/ant-contrib-1.0b3.jar b/ext/libs/ant-contrib-1.0b3.jar new file mode 100644 index 0000000000000000000000000000000000000000..062537661a514c2ce97d18948f4f25f7226cc1a0 GIT binary patch literal 224277 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 z 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%0DDNlc$iKGo<(eUp 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

    0zGh%HPCY&11) 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 Date: Sun, 19 May 2013 20:48:25 -0700 Subject: [PATCH 211/252] Added build.xml that allows to remove native code when -Dndk=false is supplied. This is necessary for GoogleTV without NDK support (< 4.2.2). --- build.xml | 130 +++++++++++++++++++++++++----------------------------- 1 file changed, 59 insertions(+), 71 deletions(-) diff --git a/build.xml b/build.xml index c9a28a730..0cfb697f8 100644 --- a/build.xml +++ b/build.xml @@ -1,85 +1,73 @@ - - + + + + + + + + - - - - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - /* This is typically used for code obfuscation. - Compiled code location: ${out.classes.absolute.dir} - If this is not done in place, override ${out.dex.input.absolute.dir} */ - + + ---> - - + - From 0ab8d93cf9e70f2b53c56e661367318fd651d238 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 19 May 2013 20:49:05 -0700 Subject: [PATCH 212/252] Updated native libraries (built with ndk r8b). --- libs/armeabi-v7a/libandengine.so | Bin 11388 -> 37844 bytes libs/armeabi/libandengine.so | Bin 11412 -> 37840 bytes libs/mips/libandengine.so | Bin 5944 -> 5508 bytes libs/x86/libandengine.so | Bin 4348 -> 5008 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/libs/armeabi-v7a/libandengine.so b/libs/armeabi-v7a/libandengine.so index d3f775a313c0b4c2c13136e58ea09ac443eb5881..8852316d4221e526daff2cb013cb7a10b0c1c515 100755 GIT binary patch literal 37844 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 m>ro+BFR*oh*PoqS^Yn>0H{j< literal 11388 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 gJN`Xj*F*N$yCGLIM~~S{#52)XyzyJUM literal 11412 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 diff --git a/libs/mips/libandengine.so b/libs/mips/libandengine.so index bebf60b02c4445bb126e92b96329368b6bafa913..dd199fb291d971279a2f5417064898a4c262f16b 100755 GIT binary patch literal 5508 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 VDdiN|Xm9r!*>=LOaho5-{{dk?F}wf( literal 4348 zcmb7HTWlQF89r-of=ic;of_&k+p?`jbPMj*b+^KSJb3YL?7+%eVuzaplkx7@GiEQ= z?AWm*SBdBruOk02iq{~szvqF9=>JdHFT=hMZTe@F5f}yk3;Yc7^#d6n2P%r9 z!ScB-NIjS(%WKLf^FPA;h){D5SHu>vIM*S?h|B-TTdgiTAx~*rMGY z_mkb@=HZm>m^t^ZW!JoGVP?j3(%HqOcBjEX)Z;rzhh#qQn3YO8JEYH*r{@s-C2zdo z+6CQ9d;ragK3B4{3$7@d#oYYzH3lXNg>nw_{0{l(HKQeqNsAi{kj1A5bszvGUc%l$Q??9B$#4hxmHBi`8t~ z3U_Z&@e@scg;pEiMR4=fe_O3JpXw2+HMq=ub1~T?Fey5jaKbqQ16-Whn#rdMQogpwU(fYOQyw8<9qv?~3Q!51-Ig zV)|hpf?pqS50L#0pub}$yc~TfGy;7Wies(>+U$3rhJN3!ZuGbJd(w;fVr>|JSn~wN zW3}-dzWs=2pDIuD4;UKAvWCs+Z?k`jNZ481@arFR)ZRcNg+?cI9CbfeA8Km;7K;+* zJ;=j7CuIFwKCHX>ww#&R6elLuyo}*qZR}8W!TxjP@cSF8z47{`n<1zH;9zVPe&&iq zr)8qE_<*8-D_-#3trv)}fE9F5-9Q0YZ-HH%cVpO%s&G2KrAvzfg}4xV5KXtD-;a&bOmsGMNTsE^DZEg;jUyj zG!h=}>Fn&;-qCSSIFxKacQzc1!pvfFKmi8} z7U~}Z7obo0`gvdf4CG_br#$^Y$8b1E|ChwyD{|sJ-p5wuKN5TWBq2t%8 zh$z$_gA*7F-pAT}M%sOPF)k0nXX{;xduI4*d2nwEdNwDRy$l8D@rcW0^6C)B z%|XO-Q%3boDa?w=YjJ^e$kf!oBwC(Ux$92Px2a=a{-WkoL8<7>gdP$Cv)Bv z(UH^;iR(@O;WUd$bp(*>NAOA;~o4QFn$b1h)%tyxjZTfL9 zkmp&jPkaZ`ZZPw)pZ0%Nh?1C#GzwOJ=dj4hLsa;r{O*O!y~M7#f8@Wk??X_252MY0 zTl#Td^ Date: Sun, 19 May 2013 20:57:54 -0700 Subject: [PATCH 213/252] Made ndk build through ant multi-threaded. --- build.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 0cfb697f8..f16e1c80b 100644 --- a/build.xml +++ b/build.xml @@ -55,7 +55,10 @@ - + + + + From d9c9838f8b178d563eb39be44350591b4a50659e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 20 May 2013 13:24:56 -0700 Subject: [PATCH 214/252] Updated .classpath for ADT 22. --- .classpath | 1 + 1 file changed, 1 insertion(+) diff --git a/.classpath b/.classpath index d3bb07b44..f7b8a1f99 100644 --- a/.classpath +++ b/.classpath @@ -4,5 +4,6 @@ + From edd4215c173e6ae05b4e6f9b32ddfa965227bdd5 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 21 May 2013 20:24:43 -0700 Subject: [PATCH 215/252] Added ConnectivityUtils. --- src/org/andengine/util/ConnectivityUtils.java | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 src/org/andengine/util/ConnectivityUtils.java diff --git a/src/org/andengine/util/ConnectivityUtils.java b/src/org/andengine/util/ConnectivityUtils.java new file mode 100644 index 000000000..1d6efd119 --- /dev/null +++ b/src/org/andengine/util/ConnectivityUtils.java @@ -0,0 +1,176 @@ +package org.andengine.util; + +import org.andengine.util.exception.AndEngineException; +import org.andengine.util.system.SystemUtils; + +import android.annotation.TargetApi; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Build; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 19:33:01 - 21.05.2013 + */ +public final class ConnectivityUtils { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private ConnectivityUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public static ConnectivityManager getConnectivityManager(final Context pContext) { + return (ConnectivityManager) pContext.getSystemService(Context.CONNECTIVITY_SERVICE); + } + + /** + * @param pContext + * @param pNetworkType {@link ConnectivityManager#TYPE_WIFI}, etc... + * @return + */ + public static NetworkInfo getNetworkInfo(final Context pContext, final int pNetworkType) { + return ConnectivityUtils.getConnectivityManager(pContext).getNetworkInfo(pNetworkType); + } + + /** + * @param pContext + * @param pNetworkType {@link ConnectivityManager#TYPE_WIFI}, etc... + * @return + */ + public static boolean isNetworkAvailable(final Context pContext, final int pNetworkType) { + return ConnectivityUtils.getNetworkInfo(pContext, pNetworkType).isAvailable(); + } + + /** + * @param pContext + * @param pNetworkType {@link ConnectivityManager#TYPE_WIFI}, etc... + * @return + */ + public static boolean isNetworkConnected(final Context pContext, final int pNetworkType) { + return ConnectivityUtils.getNetworkInfo(pContext, pNetworkType).isConnected(); + } + + /** + * @param pContext + * @param pNetworkType {@link ConnectivityManager#TYPE_WIFI}, etc... + * @return + */ + public static boolean isNetworkConnectedOrConnecting(final Context pContext, final int pNetworkType) { + return ConnectivityUtils.getNetworkInfo(pContext, pNetworkType).isConnectedOrConnecting(); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static boolean isEthernetAvailable(final Context pContext) throws ConnectivityUtilsException { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB_MR2)) { + return ConnectivityUtils.isNetworkAvailable(pContext, ConnectivityManager.TYPE_ETHERNET); + } else { + throw new ConnectivityUtilsException(); + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static boolean isEthernetAvailable(final Context pContext, final boolean pDefault) { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB_MR2)) { + return ConnectivityUtils.isNetworkAvailable(pContext, ConnectivityManager.TYPE_ETHERNET); + } else { + return pDefault; + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static boolean isEthernetConnected(final Context pContext) throws ConnectivityUtilsException { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB_MR2)) { + return ConnectivityUtils.isNetworkConnected(pContext, ConnectivityManager.TYPE_ETHERNET); + } else { + throw new ConnectivityUtilsException(); + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static boolean isEthernetConnected(final Context pContext, final boolean pDefault) { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB_MR2)) { + return ConnectivityUtils.isNetworkConnected(pContext, ConnectivityManager.TYPE_ETHERNET); + } else { + return pDefault; + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static boolean isEthernetConnectedOrConnecting(final Context pContext) throws ConnectivityUtilsException { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB_MR2)) { + return ConnectivityUtils.isNetworkConnectedOrConnecting(pContext, ConnectivityManager.TYPE_ETHERNET); + } else { + throw new ConnectivityUtilsException(); + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + public static boolean isEthernetConnectedOrConnecting(final Context pContext, final boolean pDefault) { + if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.HONEYCOMB_MR2)) { + return ConnectivityUtils.isNetworkConnectedOrConnecting(pContext, ConnectivityManager.TYPE_ETHERNET); + } else { + return pDefault; + } + } + + public static boolean isWifiAvailable(final Context pContext) throws ConnectivityUtilsException { + return ConnectivityUtils.isNetworkAvailable(pContext, ConnectivityManager.TYPE_WIFI); + } + + public static boolean isWifiConnected(final Context pContext) { + return ConnectivityUtils.isNetworkConnected(pContext, ConnectivityManager.TYPE_WIFI); + } + + public static boolean isWifiConnectedOrConnecting(final Context pContext) { + return ConnectivityUtils.isNetworkConnectedOrConnecting(pContext, ConnectivityManager.TYPE_WIFI); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class ConnectivityUtilsException extends AndEngineException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 4955967914807211384L; + + // =========================================================== + // COnstructors + // =========================================================== + + public ConnectivityUtilsException() { + + } + + public ConnectivityUtilsException(final Throwable pThrowable) { + super(pThrowable); + } + } +} From c8b04f16d46aa7c2acc88339c04c797168e71794 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 22 May 2013 23:19:20 -0700 Subject: [PATCH 216/252] Added EthernetUtils, removed WifiException (using WifiUtilsException). Minor other changes. --- src/org/andengine/util/ConnectivityUtils.java | 2 +- src/org/andengine/util/EthernetUtils.java | 130 ++++++++++++++++++ src/org/andengine/util/WifiUtils.java | 109 +++++++++------ .../util/exception/WifiException.java | 53 ------- 4 files changed, 198 insertions(+), 96 deletions(-) create mode 100644 src/org/andengine/util/EthernetUtils.java delete mode 100644 src/org/andengine/util/exception/WifiException.java diff --git a/src/org/andengine/util/ConnectivityUtils.java b/src/org/andengine/util/ConnectivityUtils.java index 1d6efd119..e12a219b3 100644 --- a/src/org/andengine/util/ConnectivityUtils.java +++ b/src/org/andengine/util/ConnectivityUtils.java @@ -162,7 +162,7 @@ public static class ConnectivityUtilsException extends AndEngineException { private static final long serialVersionUID = 4955967914807211384L; // =========================================================== - // COnstructors + // Constructors // =========================================================== public ConnectivityUtilsException() { diff --git a/src/org/andengine/util/EthernetUtils.java b/src/org/andengine/util/EthernetUtils.java new file mode 100644 index 000000000..67d648615 --- /dev/null +++ b/src/org/andengine/util/EthernetUtils.java @@ -0,0 +1,130 @@ +package org.andengine.util; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.Enumeration; + +import org.andengine.util.exception.AndEngineException; +import org.andengine.util.system.SystemUtils; + +import android.annotation.TargetApi; +import android.os.Build; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 16:54:01 - 20.03.2013 + */ +public final class EthernetUtils { + // =========================================================== + // Constants + // =========================================================== + + private static final String IP_DEFAULT = "0.0.0.0"; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private EthernetUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @TargetApi(Build.VERSION_CODES.GINGERBREAD) + public static byte[] getEthernetIPAddressRaw() throws EthernetUtilsException { + try { + byte[] ipv6Address = null; + + final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaceEnumeration.hasMoreElements()) { + final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); + if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO) || !networkInterface.isLoopback()) { + final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses(); + while (inetAddressEnumeration.hasMoreElements()) { + final InetAddress inetAddress = inetAddressEnumeration.nextElement(); + + if (!inetAddress.isLoopbackAddress()) { + final byte[] ipAddress = inetAddress.getAddress(); + if (ipAddress.length == IPUtils.IPV4_LENGTH) { + return ipAddress; + } else { + ipv6Address = ipAddress; + } + } + } + } + } + + if (ipv6Address != null) { + return ipv6Address; + } else { + throw new EthernetUtilsException("No ethernet IP found that is not bound to localhost!"); + } + } catch (final SocketException e) { + throw new EthernetUtilsException("Unexpected error!", e); + } + } + + public static String getEthernetIPAddress() throws EthernetUtilsException { + try { + return IPUtils.ipAddressToString(EthernetUtils.getEthernetIPAddressRaw()); + } catch (final UnknownHostException e) { + throw new EthernetUtilsException("Unexpected error!", e); + } + } + + public static boolean getEthernetIPAddressValid() throws EthernetUtilsException { // TODO! + return !EthernetUtils.IP_DEFAULT.equals(EthernetUtils.getEthernetIPAddress()); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + + public static class EthernetUtilsException extends AndEngineException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 795214345441314983L; + + // =========================================================== + // Constructors + // =========================================================== + + public EthernetUtilsException() { + + } + + public EthernetUtilsException(final Throwable pThrowable) { + super(pThrowable); + } + + private EthernetUtilsException(final String pMessage) { + super(pMessage); + } + + private EthernetUtilsException(final String pMessage, final Throwable pThrowable) { + super(pMessage, pThrowable); + } + } +} diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 0ec7127dd..71dcebee4 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -12,9 +12,9 @@ import org.andengine.util.debug.Debug; import org.andengine.util.exception.AndEngineException; import org.andengine.util.exception.MethodNotFoundException; -import org.andengine.util.exception.WifiException; import org.andengine.util.system.SystemUtils; +import android.annotation.TargetApi; import android.content.Context; import android.net.DhcpInfo; import android.net.wifi.WifiConfiguration; @@ -92,8 +92,12 @@ public static byte[] getWifiIPv4AddressRaw(final Context pContext) { return IPUtils.ipv4AddressToIPAddress(WifiUtils.getWifiManager(pContext).getConnectionInfo().getIpAddress()); } - public static String getWifiIPv4Address(final Context pContext) throws UnknownHostException { - return IPUtils.ipAddressToString(WifiUtils.getWifiIPv4AddressRaw(pContext)); + public static String getWifiIPv4Address(final Context pContext) throws WifiUtilsException { + try { + return IPUtils.ipAddressToString(WifiUtils.getWifiIPv4AddressRaw(pContext)); + } catch (final UnknownHostException e) { + throw new WifiUtilsException("Unexpected error!", e); + } } public static boolean isWifiIPAddressValid(final Context pContext) { @@ -222,25 +226,31 @@ public static boolean isWifiHotspotRunning(final Context pContext) throws WifiUt /** * @return prefers to return an IPv4 address if found, otherwise an IPv6 address. - * @throws WifiException + * @throws WifiUtilsException */ - public static byte[] getWifiHotspotIPAddressRaw() throws WifiException { + @TargetApi(Build.VERSION_CODES.GINGERBREAD) + public static byte[] getWifiHotspotIPAddressRaw() throws WifiUtilsException { try { byte[] ipv6Address = null; final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces(); while (networkInterfaceEnumeration.hasMoreElements()) { final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); - final String networkInterfaceName = networkInterface.getName(); - - if (ArrayUtils.contains(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES, networkInterfaceName)) { - final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses(); - while (inetAddressEnumeration.hasMoreElements()) { - final byte[] ipAddress = inetAddressEnumeration.nextElement().getAddress(); - if (ipAddress.length == 4) { // TODO Constant! - return ipAddress; - } else { - ipv6Address = ipAddress; + if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO) || !networkInterface.isLoopback()) { + final String networkInterfaceName = networkInterface.getName(); + + if (ArrayUtils.contains(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES, networkInterfaceName)) { + final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses(); + while (inetAddressEnumeration.hasMoreElements()) { + final InetAddress inetAddress = inetAddressEnumeration.nextElement(); + if (!inetAddress.isLoopbackAddress()) { + final byte[] ipAddress = inetAddress.getAddress(); + if (ipAddress.length == IPUtils.IPV4_LENGTH) { + return ipAddress; + } else { + ipv6Address = ipAddress; + } + } } } } @@ -249,41 +259,44 @@ public static byte[] getWifiHotspotIPAddressRaw() throws WifiException { if (ipv6Address != null) { return ipv6Address; } else { - throw new WifiException("No IP bound to '" + Arrays.toString(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES) + "'!"); + throw new WifiUtilsException("No IP bound to '" + Arrays.toString(WifiUtils.HOTSPOT_NETWORKINTERFACE_NAMES) + "'!"); } } catch (final SocketException e) { - throw new WifiException("Unexpected error!", e); + throw new WifiUtilsException("Unexpected error!", e); } } - public static String getWifiHotspotIPAddress() throws WifiException { + public static String getWifiHotspotIPAddress() throws WifiUtilsException { try { return IPUtils.ipAddressToString(WifiUtils.getWifiHotspotIPAddressRaw()); } catch (final UnknownHostException e) { - throw new WifiException("Unexpected error!", e); + throw new WifiUtilsException("Unexpected error!", e); } } - public static boolean isWifiHotspotIPAddressValid() throws WifiException { // TODO! + public static boolean isWifiHotspotIPAddressValid() throws WifiUtilsException { // TODO! return !WifiUtils.IP_DEFAULT.equals(WifiUtils.getWifiHotspotIPAddress()); } - public static byte[] getEmulatorIPAddressRaw() throws WifiException { + @TargetApi(Build.VERSION_CODES.GINGERBREAD) + public static byte[] getEmulatorIPAddressRaw() throws WifiUtilsException { try { byte[] ipv6Address = null; final Enumeration networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces(); while (networkInterfaceEnumeration.hasMoreElements()) { final NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); - final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses(); - while (inetAddressEnumeration.hasMoreElements()) { - final InetAddress inetAddress = inetAddressEnumeration.nextElement(); - if (!inetAddress.isLoopbackAddress()) { - final byte[] ipAddress = inetAddress.getAddress(); - if (ipAddress.length == 4) { // TODO Constant! - return ipAddress; - } else { - ipv6Address = ipAddress; + if (SystemUtils.isAndroidVersionOrLower(Build.VERSION_CODES.FROYO) || !networkInterface.isLoopback()) { + final Enumeration inetAddressEnumeration = networkInterface.getInetAddresses(); + while (inetAddressEnumeration.hasMoreElements()) { + final InetAddress inetAddress = inetAddressEnumeration.nextElement(); + if (!inetAddress.isLoopbackAddress()) { + final byte[] ipAddress = inetAddress.getAddress(); + if (ipAddress.length == IPUtils.IPV4_LENGTH) { + return ipAddress; + } else { + ipv6Address = ipAddress; + } } } } @@ -292,21 +305,25 @@ public static byte[] getEmulatorIPAddressRaw() throws WifiException { if (ipv6Address != null) { return ipv6Address; } else { - throw new WifiException("No IP found that is not bound to localhost!"); + throw new WifiUtilsException("No IP found that is not bound to localhost!"); } } catch (final SocketException e) { - throw new WifiException("Unexpected error!", e); + throw new WifiUtilsException("Unexpected error!", e); } } - public static String getEmulatorIPAddress() throws WifiException { + public static String getEmulatorIPAddress() throws WifiUtilsException { try { return IPUtils.ipAddressToString(WifiUtils.getEmulatorIPAddressRaw()); } catch (final UnknownHostException e) { - throw new WifiException("Unexpected error!", e); + throw new WifiUtilsException("Unexpected error!", e); } } + public static boolean getEmulatorIPAddressValid() throws WifiUtilsException { // TODO! + return !WifiUtils.IP_DEFAULT.equals(WifiUtils.getEmulatorIPAddress()); + } + public static boolean isMulticastEnabled(final Context pContext) throws WifiUtilsException { final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); @@ -350,14 +367,14 @@ public static void releaseMulticastLock(final MulticastLock pMulticastLock) { } } - public static byte[] getBroadcastIPAddressRaw(final Context pContext) throws WifiException { + public static byte[] getBroadcastIPAddressRaw(final Context pContext) throws WifiUtilsException { final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); final DhcpInfo dhcp = wifiManager.getDhcpInfo(); // TODO handle null somehow... final int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask; - final byte[] broadcastIP = new byte[4]; - for (int k = 0; k < 4; k++) { + final byte[] broadcastIP = new byte[IPUtils.IPV4_LENGTH]; + for (int k = 0; k < IPUtils.IPV4_LENGTH; k++) { broadcastIP[k] = (byte) ((broadcast >> (k * 8)) & 0xFF); } return broadcastIP; @@ -366,7 +383,7 @@ public static byte[] getBroadcastIPAddressRaw(final Context pContext) throws Wif private static String stripQuotes(final String pString) { final int stringLength = pString.length(); if (stringLength >= 2) { - if (pString.charAt(0) == '\"' && pString.charAt(stringLength - 1) == '\"') { + if (pString.startsWith("\"") && pString.endsWith("\"") ) { return pString.substring(1, stringLength - 1); } else { return pString; @@ -403,7 +420,7 @@ public static enum WifiHotspotState { // Constructors // =========================================================== - public static WifiHotspotState fromWifiApState(final int pWifiApState) throws WifiException { + public static WifiHotspotState fromWifiApState(final int pWifiApState) throws WifiUtilsException { if (SystemUtils.isAndroidVersionOrHigher(Build.VERSION_CODES.ICE_CREAM_SANDWICH)) { switch (pWifiApState) { case 10: @@ -417,7 +434,7 @@ public static WifiHotspotState fromWifiApState(final int pWifiApState) throws Wi case 14: return FAILED; default: - throw new WifiException("TODO..."); + throw new WifiUtilsException("TODO..."); } } else { switch (pWifiApState) { @@ -435,7 +452,7 @@ public static WifiHotspotState fromWifiApState(final int pWifiApState) throws Wi if (pWifiApState >= 10) { return WifiHotspotState.fromWifiApState(pWifiApState - 10); } else { - throw new WifiException("TODO..."); + throw new WifiUtilsException("TODO..."); } } } @@ -466,7 +483,7 @@ public static class WifiUtilsException extends AndEngineException { private static final long serialVersionUID = 1108697754015225179L; // =========================================================== - // COnstructors + // Constructors // =========================================================== public WifiUtilsException() { @@ -476,5 +493,13 @@ public WifiUtilsException() { public WifiUtilsException(final Throwable pThrowable) { super(pThrowable); } + + private WifiUtilsException(final String pMessage) { + super(pMessage); + } + + private WifiUtilsException(final String pMessage, final Throwable pThrowable) { + super(pMessage, pThrowable); + } } } diff --git a/src/org/andengine/util/exception/WifiException.java b/src/org/andengine/util/exception/WifiException.java deleted file mode 100644 index 8a9b725b2..000000000 --- a/src/org/andengine/util/exception/WifiException.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.andengine.util.exception; - - -/** - * (c) 2010 Nicolas Gramlich - * (c) 2011 Zynga Inc. - * - * @author Nicolas Gramlich - * @since 16:58:37 - 20.03.2011 - */ -public class WifiException extends AndEngineException { - // =========================================================== - // Constants - // =========================================================== - - private static final long serialVersionUID = -8647288255044498718L; - - // =========================================================== - // Fields - // =========================================================== - - // =========================================================== - // Constructors - // =========================================================== - - public WifiException() { - - } - - public WifiException(final String pMessage) { - super(pMessage); - } - - public WifiException(final String pMessage, final Throwable pThrowable) { - super(pMessage, pThrowable); - } - - // =========================================================== - // Getter & Setter - // =========================================================== - - // =========================================================== - // Methods for/from SuperClass/Interfaces - // =========================================================== - - // =========================================================== - // Methods - // =========================================================== - - // =========================================================== - // Inner and Anonymous Classes - // =========================================================== -} From f13fee6e4a0073a38d723b5ba0b013549b8435fe Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 23 May 2013 10:34:28 -0700 Subject: [PATCH 217/252] Fixed a NullPointerException in WifiUtils. --- src/org/andengine/util/WifiUtils.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index 71dcebee4..b749c484b 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -381,15 +381,19 @@ public static byte[] getBroadcastIPAddressRaw(final Context pContext) throws Wif } private static String stripQuotes(final String pString) { - final int stringLength = pString.length(); - if (stringLength >= 2) { - if (pString.startsWith("\"") && pString.endsWith("\"") ) { - return pString.substring(1, stringLength - 1); + if (pString == null) { + return pString; + } else { + final int stringLength = pString.length(); + if (stringLength >= 2) { + if (pString.startsWith("\"") && pString.endsWith("\"") ) { + return pString.substring(1, stringLength - 1); + } else { + return pString; + } } else { return pString; } - } else { - return pString; } } From 4fbfb5b2a5a679db6c6a01132fc855fdb4f570db Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 25 May 2013 17:07:15 -0700 Subject: [PATCH 218/252] Added SystemUtils.hasCamera. --- src/org/andengine/util/system/SystemUtils.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/org/andengine/util/system/SystemUtils.java b/src/org/andengine/util/system/SystemUtils.java index 7fac765a4..b35ef99c0 100644 --- a/src/org/andengine/util/system/SystemUtils.java +++ b/src/org/andengine/util/system/SystemUtils.java @@ -107,6 +107,18 @@ public static boolean isGoogleTV(final Context pContext, final boolean pDefault) } } + public static boolean hasCamera(final Context pContext) throws SystemUtilsException { + return SystemUtils.hasSystemFeature(pContext, PackageManager.FEATURE_CAMERA); + } + + public static boolean hasCamera(final Context pContext, final boolean pDefault) { + try { + return SystemUtils.hasCamera(pContext); + } catch (final SystemUtilsException e) { + return pDefault; + } + } + public static boolean isNDKSupported(final Context pContext, final boolean pDefault) { try { if (SystemUtils.isGoogleTV(pContext)) { From a17272f877be826689f1530979b120e4988107a5 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 30 May 2013 21:14:42 -0700 Subject: [PATCH 219/252] Minor changes in GLScissorStack. --- src/org/andengine/entity/clip/ClipEntity.java | 4 +- .../andengine/opengl/util/GLScissorStack.java | 135 +++++++----------- src/org/andengine/opengl/util/GLState.java | 12 +- 3 files changed, 56 insertions(+), 95 deletions(-) diff --git a/src/org/andengine/entity/clip/ClipEntity.java b/src/org/andengine/entity/clip/ClipEntity.java index 6a4d356d2..d8aa4d50f 100644 --- a/src/org/andengine/entity/clip/ClipEntity.java +++ b/src/org/andengine/entity/clip/ClipEntity.java @@ -98,13 +98,13 @@ protected void onManagedDraw(final GLState pGLState, final Camera pCamera) { final int clippingHeight = maxClippingY - minClippingY; /* Finally apply the clipping. */ - pGLState.glScissorPush(minClippingX, minClippingY, clippingWidth, clippingHeight); + pGLState.glPushScissor(minClippingX, minClippingY, clippingWidth, clippingHeight); /* Draw children, etc... */ super.onManagedDraw(pGLState, pCamera); /* Revert scissor test to previous state. */ - pGLState.glScissorPop(); + pGLState.glPopScissor(); pGLState.setScissorTestEnabled(wasScissorTestEnabled); } else { super.onManagedDraw(pGLState, pCamera); diff --git a/src/org/andengine/opengl/util/GLScissorStack.java b/src/org/andengine/opengl/util/GLScissorStack.java index 0d63cc6d4..6dae8f197 100644 --- a/src/org/andengine/opengl/util/GLScissorStack.java +++ b/src/org/andengine/opengl/util/GLScissorStack.java @@ -18,10 +18,10 @@ public class GLScissorStack { // Constants // =========================================================== - public static final int GLSCISSOR_X_POS = 0; - public static final int GLSCISSOR_Y_POS = 1; - public static final int GLSCISSOR_WIDTH_POS = 2; - public static final int GLSCISSOR_HEIGHT_POS = 3; + public static final int GLSCISSOR_X_INDEX = 0; + public static final int GLSCISSOR_Y_INDEX = 1; + public static final int GLSCISSOR_WIDTH_INDEX = 2; + public static final int GLSCISSOR_HEIGHT_INDEX = 3; public static final int GLSCISSORSTACK_DEPTH_MAX = 32; public static final int GLSCISSOR_SIZE = 4; @@ -33,7 +33,6 @@ public class GLScissorStack { // Fields // =========================================================== - private final int[] mTemp = new int[GLScissorStack.GLSCISSOR_SIZE]; private final int[] mScissorStack = new int[GLScissorStack.GLSCISSORSTACK_DEPTH_MAX * GLScissorStack.GLSCISSOR_SIZE]; private int mScissorStackOffset; @@ -42,6 +41,7 @@ public class GLScissorStack { // =========================================================== public GLScissorStack() { + } // =========================================================== @@ -53,21 +53,14 @@ public GLScissorStack() { // =========================================================== public int[] getScissor(final int[] pScissors) { - assertNoUnderflow(); + if (this.mScissorStackOffset - GLScissorStack.GLSCISSOR_SIZE <= GLScissorStack.GLSCISSORSTACKOFFSET_UNDERFLOW) { + throw new GLScissorStackUnderflowException(); + } System.arraycopy(this.mScissorStack, this.mScissorStackOffset, pScissors, 0, GLScissorStack.GLSCISSOR_SIZE); return pScissors; } - public int[] getScissorTmp() { - getScissor(this.mTemp); - return this.mTemp; - } - - protected int getStackDepth() { - return mScissorStackOffset / GLSCISSOR_SIZE; - } - // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== @@ -76,90 +69,62 @@ protected int getStackDepth() { // Methods // =========================================================== - public void glScissors(final int[] pScissors) { - GLES20.glScissor(pScissors[GLSCISSOR_X_POS], pScissors[GLSCISSOR_Y_POS], pScissors[GLSCISSOR_WIDTH_POS], pScissors[GLSCISSOR_HEIGHT_POS]); - } - - public void glScissors(final int pX, final int pY, final int pWidth, final int pHeight) { - GLES20.glScissor(pX, pY, pWidth, pHeight); - } - - public void glScissorPush(final int[] pScissors) { - if (getStackDepth() == 0) { - glScissors(pScissors); - } else { - /* take a union between old and new clip rect */ - getScissor(mTemp); - final int x1 = Math.max(pScissors[GLSCISSOR_X_POS], mTemp[GLSCISSOR_X_POS]); - final int y1 = Math.max(pScissors[GLSCISSOR_Y_POS], mTemp[GLSCISSOR_Y_POS]); - final int x2 = Math.min(pScissors[GLSCISSOR_X_POS] + pScissors[GLSCISSOR_WIDTH_POS], mTemp[GLSCISSOR_X_POS] + mTemp[GLSCISSOR_WIDTH_POS]); - final int y2 = Math.min(pScissors[GLSCISSOR_Y_POS] + pScissors[GLSCISSOR_HEIGHT_POS], mTemp[GLSCISSOR_Y_POS] + mTemp[GLSCISSOR_HEIGHT_POS]); - - final int w = Math.max(0, x2 - x1); - final int h = Math.max(0, y2 - y1); - glScissors(x1, y1, w, h); + public void glPushScissor(final int pX, final int pY, final int pWidth, final int pHeight) { + if (this.mScissorStackOffset + GLScissorStack.GLSCISSOR_SIZE >= GLScissorStack.GLSCISSORSTACKOFFSET_OVERFLOW) { + throw new GLScissorStackOverflowException(); } - pushScissor(pScissors); - } - public void glScissorPush(final int pX, final int pY, final int pWidth, final int pHeight) { - if (getStackDepth() == 0) { - glScissors(pX, pY, pWidth, pHeight); + final int x; + final int y; + final int width; + final int height; + if (this.mScissorStackOffset == 0) { + x = pX; + y = pY; + width = pWidth; + height = pHeight; } else { - /* take a union between old and new clip rect */ - getScissor(mTemp); - final int x1 = Math.max(pX, mTemp[GLSCISSOR_X_POS]); - final int y1 = Math.max(pY, mTemp[GLSCISSOR_Y_POS]); - final int x2 = Math.min(pX + pWidth, mTemp[GLSCISSOR_X_POS] + mTemp[GLSCISSOR_WIDTH_POS]); - final int y2 = Math.min(pY + pHeight, mTemp[GLSCISSOR_Y_POS] + mTemp[GLSCISSOR_HEIGHT_POS]); - - final int w = Math.max(0, x2 - x1); - final int h = Math.max(0, y2 - y1); - glScissors(x1, y1, w, h); + /* Take the intersection between the current and the new scissor: */ + final int currentX = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_X_INDEX)]; + final int currentY = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_Y_INDEX)]; + final int currentWidth = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_WIDTH_INDEX)]; + final int currentHeight = this.mScissorStack[this.mScissorStackOffset - (GLSCISSOR_SIZE - GLSCISSOR_HEIGHT_INDEX)]; + + final float xMin = Math.max(currentX, pX); + final float xMax = Math.min(currentX + currentWidth, pX + pWidth); + + final float yMin = Math.max(currentY, pY); + final float yMax = Math.min(currentY + currentHeight, pY + pHeight); + + x = (int) xMin; + y = (int) yMin; + width = (int) (xMax - xMin); + height = (int) (yMax - yMin); } - pushScissor(pX, pY, pWidth, pHeight); - } - public void glScissorPop() { - popScissor(); - if (getStackDepth() > 0) { - getScissor(this.mTemp); - glScissors(this.mTemp); - } - } - - protected void pushScissor(final int pX, final int pY, final int pWidth, final int pHeight) throws GLScissorStackOverflowException { - this.mTemp[GLSCISSOR_X_POS] = pX; - this.mTemp[GLSCISSOR_Y_POS] = pY; - this.mTemp[GLSCISSOR_WIDTH_POS] = pWidth; - this.mTemp[GLSCISSOR_HEIGHT_POS] = pHeight; - - pushScissor(this.mTemp); - } + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_X_INDEX] = pX; + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_Y_INDEX] = pY; + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_WIDTH_INDEX] = pWidth; + this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_HEIGHT_INDEX] = pHeight; - protected void pushScissor(final int[] pScissors) throws GLScissorStackOverflowException { - assertNoOverflow(); + GLES20.glScissor(x, y, width, height); - System.arraycopy(pScissors, 0, this.mScissorStack, this.mScissorStackOffset + GLScissorStack.GLSCISSOR_SIZE, GLScissorStack.GLSCISSOR_SIZE); this.mScissorStackOffset += GLScissorStack.GLSCISSOR_SIZE; } - protected void popScissor() { - assertNoUnderflow(); - - this.mScissorStackOffset -= GLScissorStack.GLSCISSOR_SIZE; - } - - private void assertNoUnderflow() { + public void glPopScissor() { if (this.mScissorStackOffset - GLScissorStack.GLSCISSOR_SIZE <= GLScissorStack.GLSCISSORSTACKOFFSET_UNDERFLOW) { throw new GLScissorStackUnderflowException(); } - } - private void assertNoOverflow() { - if (this.mScissorStackOffset + GLScissorStack.GLSCISSOR_SIZE >= GLScissorStack.GLSCISSORSTACKOFFSET_OVERFLOW) { - throw new GLScissorStackOverflowException(); - } + this.mScissorStackOffset -= GLScissorStack.GLSCISSOR_SIZE; + + final int x = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_X_INDEX]; + final int y = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_Y_INDEX]; + final int width = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_WIDTH_INDEX]; + final int height = this.mScissorStack[this.mScissorStackOffset + GLSCISSOR_HEIGHT_INDEX]; + + GLES20.glScissor(x, y, width, height); } public void reset() { diff --git a/src/org/andengine/opengl/util/GLState.java b/src/org/andengine/opengl/util/GLState.java index e15a9ebe7..eb0fc5067 100644 --- a/src/org/andengine/opengl/util/GLState.java +++ b/src/org/andengine/opengl/util/GLState.java @@ -632,16 +632,12 @@ public void resetGLMatrixStacks() { this.mProjectionGLMatrixStack.reset(); } - public void glScissorPush(final int[] pScissor) { - this.mScissorStack.glScissorPush(pScissor); + public void glPushScissor(final int pX, final int pY, final int pWidth, final int pHeight) { + this.mScissorStack.glPushScissor(pX, pY, pWidth, pHeight); } - public void glScissorPush(final int pX, final int pY, final int pWidth, final int pHeight) { - this.mScissorStack.glScissorPush(pX, pY, pWidth, pHeight); - } - - public void glScissorPop() { - this.mScissorStack.glScissorPop(); + public void glPopScissor() { + this.mScissorStack.glPopScissor(); } /** From 556ff01fcee4cadbc3c7ad7b92cbd03081fb7d0c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 30 May 2013 21:15:17 -0700 Subject: [PATCH 220/252] Minor change. --- src/org/andengine/opengl/util/GLMatrixStack.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/org/andengine/opengl/util/GLMatrixStack.java b/src/org/andengine/opengl/util/GLMatrixStack.java index 03b796401..d159ebdc8 100644 --- a/src/org/andengine/opengl/util/GLMatrixStack.java +++ b/src/org/andengine/opengl/util/GLMatrixStack.java @@ -50,6 +50,10 @@ public GLMatrixStack() { // =========================================================== public void getMatrix(final float[] pMatrix) { + if (this.mMatrixStackOffset - GLMatrixStack.GLMATRIX_SIZE <= GLMatrixStack.GLMATRIXSTACKOFFSET_UNDERFLOW) { + throw new GLMatrixStackUnderflowException(); + } + System.arraycopy(this.mMatrixStack, this.mMatrixStackOffset, pMatrix, 0, GLMatrixStack.GLMATRIX_SIZE); } From 3f2721a87389ab232c55644ac317db0055f26543 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 30 May 2013 21:16:33 -0700 Subject: [PATCH 221/252] Added methods to easily convert from/to parent Entity coordinates. --- src/org/andengine/entity/Entity.java | 66 +++++++++++++++++++ src/org/andengine/entity/IEntity.java | 50 ++++++++++++++ .../item/decorator/BaseMenuItemDecorator.java | 40 +++++++++++ 3 files changed, 156 insertions(+) diff --git a/src/org/andengine/entity/Entity.java b/src/org/andengine/entity/Entity.java index 91e56a532..dbfc92b69 100644 --- a/src/org/andengine/entity/Entity.java +++ b/src/org/andengine/entity/Entity.java @@ -39,6 +39,8 @@ public class Entity implements IEntity { private static final float[] VERTICES_SCENE_TO_LOCAL_TMP = new float[2]; private static final float[] VERTICES_LOCAL_TO_SCENE_TMP = new float[2]; + private static final float[] VERTICES_PARENT_TO_LOCAL_TMP = new float[2]; + private static final float[] VERTICES_LOCAL_TO_PARENT_TMP = new float[2]; private static final ParameterCallable PARAMETERCALLABLE_DETACHCHILD = new ParameterCallable() { @Override @@ -1242,6 +1244,70 @@ public Transformation getSceneToLocalTransformation() { return sceneToLocalTransformation; } + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float pX, final float pY) { + return this.convertLocalCoordinatesToParentCoordinates(pX, pY, Entity.VERTICES_LOCAL_TO_PARENT_TMP); + } + + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float pX, final float pY, final float[] pReuse) { + final Transformation localToParentTransformation = this.getLocalToParentTransformation(); + + pReuse[Constants.VERTEX_INDEX_X] = pX; + pReuse[Constants.VERTEX_INDEX_Y] = pY; + + localToParentTransformation.transform(pReuse); + + return pReuse; + } + + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float[] pCoordinates) { + return this.convertLocalCoordinatesToParentCoordinates(pCoordinates, Entity.VERTICES_LOCAL_TO_PARENT_TMP); + } + + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float[] pCoordinates, final float[] pReuse) { + final Transformation localToParentTransformation = this.getLocalToParentTransformation(); + + pReuse[Constants.VERTEX_INDEX_X] = pCoordinates[Constants.VERTEX_INDEX_X]; + pReuse[Constants.VERTEX_INDEX_Y] = pCoordinates[Constants.VERTEX_INDEX_Y]; + + localToParentTransformation.transform(pReuse); + + return pReuse; + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float pX, final float pY) { + return this.convertParentCoordinatesToLocalCoordinates(pX, pY, Entity.VERTICES_PARENT_TO_LOCAL_TMP); + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float pX, final float pY, final float[] pReuse) { + pReuse[Constants.VERTEX_INDEX_X] = pX; + pReuse[Constants.VERTEX_INDEX_Y] = pY; + + this.getParentToLocalTransformation().transform(pReuse); + + return pReuse; + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float[] pCoordinates) { + return this.convertParentCoordinatesToLocalCoordinates(pCoordinates, Entity.VERTICES_PARENT_TO_LOCAL_TMP); + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float[] pCoordinates, final float[] pReuse) { + pReuse[Constants.VERTEX_INDEX_X] = pCoordinates[Constants.VERTEX_INDEX_X]; + pReuse[Constants.VERTEX_INDEX_Y] = pCoordinates[Constants.VERTEX_INDEX_Y]; + + this.getParentToLocalTransformation().transform(pReuse); + + return pReuse; + } + @Override public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY) { return this.convertLocalCoordinatesToSceneCoordinates(pX, pY, Entity.VERTICES_LOCAL_TO_SCENE_TMP); diff --git a/src/org/andengine/entity/IEntity.java b/src/org/andengine/entity/IEntity.java index af3f8b720..ab8b2779c 100644 --- a/src/org/andengine/entity/IEntity.java +++ b/src/org/andengine/entity/IEntity.java @@ -182,6 +182,56 @@ public interface IEntity extends IDrawHandler, IUpdateHandler, IDisposable, ITou */ public float[] getSceneCenterCoordinates(final float[] pReuse); + /** + * @param pX + * @param pY + * @return a shared(!) float[] of length 2. + */ + public float[] convertLocalCoordinatesToParentCoordinates(final float pX, final float pY); + /** + * @param pX + * @param pY + * @param pReuse must be of length 2. + * @return pReuse as a convenience. + */ + public float[] convertLocalCoordinatesToParentCoordinates(final float pX, final float pY, final float[] pReuse); + /** + * @param pCoordinates must be of length 2. + * @return a shared(!) float[] of length 2. + */ + public float[] convertLocalCoordinatesToParentCoordinates(final float[] pCoordinates); + /** + * @param pCoordinates must be of length 2. + * @param pReuse must be of length 2. + * @return pReuse as a convenience. + */ + public float[] convertLocalCoordinatesToParentCoordinates(final float[] pCoordinates, final float[] pReuse); + + /** + * @param pX + * @param pY + * @return a shared(!) float[] of length 2. + */ + public float[] convertParentCoordinatesToLocalCoordinates(final float pX, final float pY); + /** + * @param pX + * @param pY + * @param pReuse must be of length 2. + * @return pReuse as a convenience. + */ + public float[] convertParentCoordinatesToLocalCoordinates(final float pX, final float pY, final float[] pReuse); + /** + * @param pCoordinates must be of length 2. + * @return a shared(!) float[] of length 2. + */ + public float[] convertParentCoordinatesToLocalCoordinates(final float[] pCoordinates); + /** + * @param pCoordinates must be of length 2. + * @param pReuse must be of length 2. + * @return pReuse as a convenience. + */ + public float[] convertParentCoordinatesToLocalCoordinates(final float[] pCoordinates, final float[] pReuse); + /** * @param pX * @param pY diff --git a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java index 72989bb90..55361136d 100644 --- a/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java +++ b/src/org/andengine/entity/scene/menu/item/decorator/BaseMenuItemDecorator.java @@ -575,6 +575,46 @@ public boolean contains(final float pX, final float pY) { return this.mMenuItem.contains(pX, pY); } + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float pX, final float pY) { + return this.mMenuItem.convertLocalCoordinatesToParentCoordinates(pX, pY); + } + + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float pX, final float pY, final float[] pReuse) { + return this.mMenuItem.convertLocalCoordinatesToParentCoordinates(pX, pY, pReuse); + } + + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float[] pCoordinates) { + return this.mMenuItem.convertLocalCoordinatesToParentCoordinates(pCoordinates); + } + + @Override + public float[] convertLocalCoordinatesToParentCoordinates(final float[] pCoordinates, final float[] pReuse) { + return this.mMenuItem.convertLocalCoordinatesToParentCoordinates(pCoordinates, pReuse); + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float pX, final float pY) { + return this.mMenuItem.convertParentCoordinatesToLocalCoordinates(pX, pY); + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float pX, final float pY, final float[] pReuse) { + return this.mMenuItem.convertParentCoordinatesToLocalCoordinates(pX, pY, pReuse); + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float[] pCoordinates) { + return this.mMenuItem.convertParentCoordinatesToLocalCoordinates(pCoordinates); + } + + @Override + public float[] convertParentCoordinatesToLocalCoordinates(final float[] pCoordinates, final float[] pReuse) { + return this.mMenuItem.convertParentCoordinatesToLocalCoordinates(pCoordinates, pReuse); + } + @Override public float[] convertLocalCoordinatesToSceneCoordinates(final float pX, final float pY) { return this.mMenuItem.convertLocalCoordinatesToSceneCoordinates(pX, pY); From ce7eafee48575b7ea2a201be09fec6bef53aa637 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 2 Jun 2013 01:09:15 -0700 Subject: [PATCH 222/252] Added preliminary versions of LineLoop and LineStrip. --- .../andengine/entity/primitive/LineChain.java | 311 ++++++++++++++++++ .../andengine/entity/primitive/LineLoop.java | 70 ++++ .../andengine/entity/primitive/LineStrip.java | 70 ++++ ...erformanceLineChainVertexBufferObject.java | 78 +++++ .../vbo/ILineChainVertexBufferObject.java | 23 ++ .../LowMemoryLineChainVertexBufferObject.java | 80 +++++ 6 files changed, 632 insertions(+) create mode 100644 src/org/andengine/entity/primitive/LineChain.java create mode 100644 src/org/andengine/entity/primitive/LineLoop.java create mode 100644 src/org/andengine/entity/primitive/LineStrip.java create mode 100644 src/org/andengine/entity/primitive/vbo/HighPerformanceLineChainVertexBufferObject.java create mode 100644 src/org/andengine/entity/primitive/vbo/ILineChainVertexBufferObject.java create mode 100644 src/org/andengine/entity/primitive/vbo/LowMemoryLineChainVertexBufferObject.java diff --git a/src/org/andengine/entity/primitive/LineChain.java b/src/org/andengine/entity/primitive/LineChain.java new file mode 100644 index 000000000..27db8f6c5 --- /dev/null +++ b/src/org/andengine/entity/primitive/LineChain.java @@ -0,0 +1,311 @@ +package org.andengine.entity.primitive; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.primitive.vbo.HighPerformanceLineChainVertexBufferObject; +import org.andengine.entity.primitive.vbo.ILineChainVertexBufferObject; +import org.andengine.entity.shape.Shape; +import org.andengine.opengl.shader.PositionColorShaderProgram; +import org.andengine.opengl.shader.constants.ShaderProgramConstants; +import org.andengine.opengl.util.GLState; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttribute; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributesBuilder; +import org.andengine.util.exception.MethodNotSupportedException; + +import android.opengl.GLES20; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 20:26:36 - 30.05.2013 + */ +public abstract class LineChain extends Shape { + // =========================================================== + // Constants + // =========================================================== + + public static final float LINE_WIDTH_DEFAULT = GLState.LINE_WIDTH_DEFAULT; + + public static final int VERTEX_INDEX_X = 0; + public static final int VERTEX_INDEX_Y = LineChain.VERTEX_INDEX_X + 1; + public static final int COLOR_INDEX = LineChain.VERTEX_INDEX_Y + 1; + + public static final int VERTEX_SIZE = 2 + 1; + + public static final VertexBufferObjectAttributes VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT = new VertexBufferObjectAttributesBuilder(2) + .add(ShaderProgramConstants.ATTRIBUTE_POSITION_LOCATION, ShaderProgramConstants.ATTRIBUTE_POSITION, 2, GLES20.GL_FLOAT, false) + .add(ShaderProgramConstants.ATTRIBUTE_COLOR_LOCATION, ShaderProgramConstants.ATTRIBUTE_COLOR, 4, GLES20.GL_UNSIGNED_BYTE, true) + .build(); + + // =========================================================== + // Fields + // =========================================================== + + protected int mCapacity; + protected final ILineChainVertexBufferObject mLineChainVertexBufferObject; + + protected final float[] mXs; + protected final float[] mYs; + + protected float mLineWidth; + + protected int mIndex; + + // =========================================================== + // Constructors + // =========================================================== + + /** + * Uses a default {@link HighPerformanceLineChainVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link #VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + */ + public LineChain(final float pX, final float pY, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(pX, pY, LineChain.LINE_WIDTH_DEFAULT, pCapacity, pVertexBufferObjectManager, DrawType.STATIC); + } + + /** + * Uses a default {@link HighPerformanceLineChainVertexBufferObject} with the {@link VertexBufferObjectAttribute}s: {@link #VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + */ + public LineChain(final float pX, final float pY, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + this(pX, pY, LineChain.LINE_WIDTH_DEFAULT, pCapacity, pVertexBufferObjectManager, pDrawType); + } + + /** + * Uses a default {@link HighPerformanceLineChainVertexBufferObject} in {@link DrawType#STATIC} with the {@link VertexBufferObjectAttribute}s: {@link #VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT}. + */ + public LineChain(final float pX, final float pY, final float pLineWidth, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) { + this(pX, pY, pLineWidth, pCapacity, pVertexBufferObjectManager, DrawType.STATIC); + } + + public LineChain(final float pX, final float pY, final float pLineWidth, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + this(pX, pY, pLineWidth, pCapacity, new HighPerformanceLineChainVertexBufferObject(pVertexBufferObjectManager, pCapacity * LineChain.VERTEX_SIZE, pDrawType, true, LineChain.VERTEXBUFFEROBJECTATTRIBUTES_DEFAULT)); + } + + public LineChain(final float pX, final float pY, final float pLineWidth, final int pCapacity, final ILineChainVertexBufferObject pLineChainVertexBufferObject) { + super(pX, pY, 0, 0, PositionColorShaderProgram.getInstance()); + + this.mXs = new float[pCapacity]; + this.mYs = new float[pCapacity]; + this.mCapacity = pCapacity; + + this.mLineWidth = pLineWidth; + + this.mLineChainVertexBufferObject = pLineChainVertexBufferObject; + + this.onUpdateVertices(); + this.onUpdateColor(); + + this.setBlendingEnabled(true); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + public int getCapacity() { + return this.mCapacity; + } + + public int getIndex() { + return this.mIndex; + } + + public void setIndex(final int pIndex) { + this.assertCapacity(pIndex); + + this.mIndex = pIndex; + } + + public float getLineWidth() { + return this.mLineWidth; + } + + public void setLineWidth(final float pLineWidth) { + this.mLineWidth = pLineWidth; + } + + @Override + public void setX(final float pX) { + final float dX = this.mX - pX; + + for (int i = this.mIndex - 1; i >= 0; i++) { + this.mXs[i] += dX; + } + + super.setX(pX); + + this.onUpdateVertices(); + } + + @Override + public void setY(final float pY) { + final float dY = this.mY - pY; + + for (int i = this.mIndex - 1; i >= 0; i++) { + this.mYs[i] += dY; + } + + super.setY(pY); + + this.onUpdateVertices(); + } + + @Override + public void setPosition(final float pX, final float pY) { + final float dX = this.mX - pX; + final float dY = this.mY - pY; + + for (int i = this.mIndex - 1; i >= 0; i++) { + this.mXs[i] += dX; + this.mYs[i] += dY; + } + + super.setPosition(pX, pY); + + this.onUpdateVertices(); + } + + public float getX(final int pIndex) { + this.assertCapacity(pIndex); + + return this.mX + this.mXs[pIndex]; + } + + public float getY(final int pIndex) { + this.assertCapacity(pIndex); + + return this.mY + this.mYs[pIndex]; + } + + public void setX(final int pIndex, final float pX) { + this.assertCapacity(pIndex); + this.assertIndex(pIndex); + + this.mXs[pIndex] = pX; + + this.onUpdateVertices(); + } + + public void setY(final int pIndex, final float pY) { + this.assertCapacity(pIndex); + this.assertIndex(pIndex); + + this.mYs[pIndex] = pY; + + this.onUpdateVertices(); + } + + public void add(final float pX, final float pY) { + this.assertCapacity(); + + this.mXs[this.mIndex] = pX; + this.mYs[this.mIndex] = pY; + + this.mIndex++; + + this.onUpdateVertices(); + } + + public void shift() { + final int length = this.mCapacity - 1; + System.arraycopy(this.mXs, 0, this.mXs, 1, length); + System.arraycopy(this.mYs, 0, this.mYs, 1, length); + } + + @Deprecated + @Override + public void setWidth(final float pWidth) { + super.setWidth(pWidth); + } + + @Deprecated + @Override + public void setHeight(final float pHeight) { + super.setHeight(pHeight); + } + + @Deprecated + @Override + public void setSize(final float pWidth, final float pHeight) { + super.setSize(pWidth, pHeight); + } + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public ILineChainVertexBufferObject getVertexBufferObject() { + return this.mLineChainVertexBufferObject; + } + + @Override + protected void preDraw(final GLState pGLState, final Camera pCamera) { + super.preDraw(pGLState, pCamera); + + pGLState.lineWidth(this.mLineWidth); + + this.mLineChainVertexBufferObject.bind(pGLState, this.mShaderProgram); + } + + @Override + protected void postDraw(final GLState pGLState, final Camera pCamera) { + this.mLineChainVertexBufferObject.unbind(pGLState, this.mShaderProgram); + + super.postDraw(pGLState, pCamera); + } + + @Override + protected void onUpdateColor() { + this.mLineChainVertexBufferObject.onUpdateColor(this); + } + + @Override + protected void onUpdateVertices() { + this.mLineChainVertexBufferObject.onUpdateVertices(this); + } + + @Override + public float[] getSceneCenterCoordinates() { + throw new MethodNotSupportedException(); + } + + @Override + public float[] getSceneCenterCoordinates(final float[] pReuse) { + throw new MethodNotSupportedException(); + } + + @Override + @Deprecated + public boolean contains(final float pX, final float pY) { + throw new MethodNotSupportedException(); + } + + // =========================================================== + // Methods + // =========================================================== + + private void assertIndex(final int pIndex) { + if (pIndex >= this.mIndex - 1) { + throw new IllegalStateException("This supplied pIndex: '" + pIndex + "' is exceeding the current index: '" + this.mIndex + "' of this " + this.getClass().getSimpleName() + "!"); + } + } + + private void assertCapacity(final int pIndex) { + if (pIndex >= this.mCapacity) { + throw new IllegalStateException("This supplied pIndex: '" + pIndex + "' is exceeding the capacity: '" + this.mCapacity + "' of this " + this.getClass().getSimpleName() + "!"); + } + } + + private void assertCapacity() { + if (this.mIndex == this.mCapacity) { + throw new IllegalStateException("This " + this.getClass().getSimpleName() + " has already reached its capacity (" + this.mCapacity + ") !"); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/entity/primitive/LineLoop.java b/src/org/andengine/entity/primitive/LineLoop.java new file mode 100644 index 000000000..b1a8ea454 --- /dev/null +++ b/src/org/andengine/entity/primitive/LineLoop.java @@ -0,0 +1,70 @@ +package org.andengine.entity.primitive; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.primitive.vbo.ILineChainVertexBufferObject; +import org.andengine.opengl.util.GLState; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.VertexBufferObjectManager; + +import android.opengl.GLES20; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 13:51:36 - 01.06.2013 + */ +public class LineLoop extends LineChain { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LineLoop(final float pX, final float pY, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) { + super(pX, pY, pCapacity, pVertexBufferObjectManager); + } + + public LineLoop(final float pX, final float pY, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + super(pX, pY, pCapacity, pVertexBufferObjectManager, pDrawType); + } + + public LineLoop(final float pX, final float pY, final float pLineWidth, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) { + super(pX, pY, pLineWidth, pCapacity, pVertexBufferObjectManager); + } + + public LineLoop(final float pX, final float pY, final float pLineWidth, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + super(pX, pY, pLineWidth, pCapacity, pVertexBufferObjectManager, pDrawType); + } + + public LineLoop(final float pX, final float pY, final float pLineWidth, final int pCapacity, final ILineChainVertexBufferObject pLineChainVertexBufferObject) { + super(pX, pY, pLineWidth, pCapacity, pLineChainVertexBufferObject); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void draw(final GLState pGLState, final Camera pCamera) { + this.mLineChainVertexBufferObject.draw(GLES20.GL_LINE_LOOP, this.mIndex); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/primitive/LineStrip.java b/src/org/andengine/entity/primitive/LineStrip.java new file mode 100644 index 000000000..c9b5959b1 --- /dev/null +++ b/src/org/andengine/entity/primitive/LineStrip.java @@ -0,0 +1,70 @@ +package org.andengine.entity.primitive; + +import org.andengine.engine.camera.Camera; +import org.andengine.entity.primitive.vbo.ILineChainVertexBufferObject; +import org.andengine.opengl.util.GLState; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.VertexBufferObjectManager; + +import android.opengl.GLES20; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 13:51:36 - 01.06.2013 + */ +public class LineStrip extends LineChain { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LineStrip(final float pX, final float pY, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) { + super(pX, pY, pCapacity, pVertexBufferObjectManager); + } + + public LineStrip(final float pX, final float pY, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + super(pX, pY, pCapacity, pVertexBufferObjectManager, pDrawType); + } + + public LineStrip(final float pX, final float pY, final float pLineWidth, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager) { + super(pX, pY, pLineWidth, pCapacity, pVertexBufferObjectManager); + } + + public LineStrip(final float pX, final float pY, final float pLineWidth, final int pCapacity, final VertexBufferObjectManager pVertexBufferObjectManager, final DrawType pDrawType) { + super(pX, pY, pLineWidth, pCapacity, pVertexBufferObjectManager, pDrawType); + } + + public LineStrip(final float pX, final float pY, final float pLineWidth, final int pCapacity, final ILineChainVertexBufferObject pLineChainVertexBufferObject) { + super(pX, pY, pLineWidth, pCapacity, pLineChainVertexBufferObject); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + protected void draw(final GLState pGLState, final Camera pCamera) { + this.mLineChainVertexBufferObject.draw(GLES20.GL_LINE_STRIP, this.mIndex); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/entity/primitive/vbo/HighPerformanceLineChainVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/HighPerformanceLineChainVertexBufferObject.java new file mode 100644 index 000000000..c95700ff8 --- /dev/null +++ b/src/org/andengine/entity/primitive/vbo/HighPerformanceLineChainVertexBufferObject.java @@ -0,0 +1,78 @@ +package org.andengine.entity.primitive.vbo; + +import org.andengine.entity.primitive.LineChain; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.HighPerformanceVertexBufferObject; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:50:00 - 30.05.2013 + */ +public class HighPerformanceLineChainVertexBufferObject extends HighPerformanceVertexBufferObject implements ILineChainVertexBufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public HighPerformanceLineChainVertexBufferObject(final VertexBufferObjectManager pVertexBufferObjectManager, final int pCapacity, final DrawType pDrawType, final boolean pAutoDispose, final VertexBufferObjectAttributes pVertexBufferObjectAttributes) { + super(pVertexBufferObjectManager, pCapacity, pDrawType, pAutoDispose, pVertexBufferObjectAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdateColor(final LineChain pLineChain) { + final float[] bufferData = this.mBufferData; + + final float packedColor = pLineChain.getColor().getABGRPackedFloat(); + + for (int i = pLineChain.getCapacity() - 1; i >= 0; i--) { + bufferData[(i * LineChain.VERTEX_SIZE) + LineChain.COLOR_INDEX] = packedColor; + } + + this.setDirtyOnHardware(); + } + + @Override + public void onUpdateVertices(final LineChain pLineChain) { + final float[] bufferData = this.mBufferData; + + bufferData[(0 * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_X] = 0; + bufferData[(0 * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_Y] = 0; + + final float x = pLineChain.getX(); + final float y = pLineChain.getY(); + + for (int i = pLineChain.getCapacity() - 1; i >= 0; i--) { + bufferData[(i * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_X] = pLineChain.getX(i) - x; + bufferData[(i * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_Y] = pLineChain.getY(i) - y; + } + + this.setDirtyOnHardware(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/entity/primitive/vbo/ILineChainVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/ILineChainVertexBufferObject.java new file mode 100644 index 000000000..e517b20e5 --- /dev/null +++ b/src/org/andengine/entity/primitive/vbo/ILineChainVertexBufferObject.java @@ -0,0 +1,23 @@ +package org.andengine.entity.primitive.vbo; + +import org.andengine.entity.primitive.LineChain; +import org.andengine.opengl.vbo.IVertexBufferObject; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:49:01 - 30.05.2013 + */ +public interface ILineChainVertexBufferObject extends IVertexBufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public void onUpdateColor(final LineChain pLineChain); + public void onUpdateVertices(final LineChain pLineChain); +} \ No newline at end of file diff --git a/src/org/andengine/entity/primitive/vbo/LowMemoryLineChainVertexBufferObject.java b/src/org/andengine/entity/primitive/vbo/LowMemoryLineChainVertexBufferObject.java new file mode 100644 index 000000000..0c93882a3 --- /dev/null +++ b/src/org/andengine/entity/primitive/vbo/LowMemoryLineChainVertexBufferObject.java @@ -0,0 +1,80 @@ +package org.andengine.entity.primitive.vbo; + +import java.nio.FloatBuffer; + +import org.andengine.entity.primitive.LineChain; +import org.andengine.opengl.vbo.DrawType; +import org.andengine.opengl.vbo.LowMemoryVertexBufferObject; +import org.andengine.opengl.vbo.VertexBufferObjectManager; +import org.andengine.opengl.vbo.attribute.VertexBufferObjectAttributes; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:50:00 - 30.05.2013 + */ +public class LowMemoryLineChainVertexBufferObject extends LowMemoryVertexBufferObject implements ILineChainVertexBufferObject { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public LowMemoryLineChainVertexBufferObject(final VertexBufferObjectManager pVertexBufferObjectManager, final int pCapacity, final DrawType pDrawType, final boolean pAutoDispose, final VertexBufferObjectAttributes pVertexBufferObjectAttributes) { + super(pVertexBufferObjectManager, pCapacity, pDrawType, pAutoDispose, pVertexBufferObjectAttributes); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + @Override + public void onUpdateColor(final LineChain pLineChain) { + final FloatBuffer bufferData = this.mFloatBuffer; + + final float packedColor = pLineChain.getColor().getABGRPackedFloat(); + + for (int i = pLineChain.getCapacity() - 1; i >= 0; i--) { + bufferData.put((i * LineChain.VERTEX_SIZE) + LineChain.COLOR_INDEX, packedColor); + } + + this.setDirtyOnHardware(); + } + + @Override + public void onUpdateVertices(final LineChain pLineChain) { + final FloatBuffer bufferData = this.mFloatBuffer; + + bufferData.put((0 * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_X, 0); + bufferData.put((0 * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_Y, 0); + + final float x = pLineChain.getX(); + final float y = pLineChain.getY(); + + for (int i = pLineChain.getCapacity() - 1; i >= 0; i--) { + bufferData.put((i * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_X, pLineChain.getX(i) - x); + bufferData.put((i * LineChain.VERTEX_SIZE) + LineChain.VERTEX_INDEX_Y, pLineChain.getY(i) - y); + } + + this.setDirtyOnHardware(); + } + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file From 7a936eefcfcd078e05a8f10eef7e992403bb6e27 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 2 Jun 2013 01:09:31 -0700 Subject: [PATCH 223/252] Added MathUtils.factorial. --- src/org/andengine/util/math/MathUtils.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index 002d02a8c..1ef73ea74 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -397,6 +397,14 @@ public static float cross(final float pXA, final float pYA, final float pXB, fin return (pXA * pYB) - (pXB * pYA); } + public static final int factorial(final int n) { + if (n == 0 || n == 1) { + return 1; + } else { + return n * MathUtils.factorial(n - 1); + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From 2d72052300a4ca2c98c419192e2aeb1e9b02013b Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 2 Jun 2013 01:14:23 -0700 Subject: [PATCH 224/252] Added BezierCurveUtils. --- src/org/andengine/util/BezierCurveUtils.java | 103 +++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 src/org/andengine/util/BezierCurveUtils.java diff --git a/src/org/andengine/util/BezierCurveUtils.java b/src/org/andengine/util/BezierCurveUtils.java new file mode 100644 index 000000000..fe6d65e93 --- /dev/null +++ b/src/org/andengine/util/BezierCurveUtils.java @@ -0,0 +1,103 @@ +package org.andengine.util; + +import org.andengine.util.math.MathUtils; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 23:09:15 - 01.06.2013 + */ +public final class BezierCurveUtils { + // =========================================================== + // Constants + // =========================================================== + + private static final int LENGTH_SAMPLES = 10; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private BezierCurveUtils() { + + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + /** + * Calculates the (x|y|z|...)-coordinate for the given control point (x|y|z|...)-coordinates. + * + * @param t in the interval [0, 1]. + * @param pControlPointCoordinates (x|y|z|...)-coordinates of the bezier curve. + * @return + */ + public static final float getBezierCurveCoordinate(final float t, final float[] pControlPointCoordinates) { + float result = 0; + final int n = pControlPointCoordinates.length - 1; + for (int i = 0; i <= n; i++) { + result += pControlPointCoordinates[i] * BezierCurveUtils.bernstein(t, i, n); + } + return result; + } + + /** + * Calculates the length of a bezier curve by taking {@link #LENGTH_SAMPLES} samples. + */ + public static final float getBezierCurveLength(final float[] pXs, final float[] pYs) { + return BezierCurveUtils.getBezierCurveLength(pXs, pYs, LENGTH_SAMPLES); + } + + /** + * Calculates the length of a bezier curve by taking pSamples samples. + */ + public static final float getBezierCurveLength(final float[] pXs, final float[] pYs, final int pSamples) { + float length = 0; + final int n = pXs.length - 1; + + float lastX = pXs[0]; + float lastY = pYs[0]; + for (int k = 1; k <= LENGTH_SAMPLES; k++) { + final float t = (1f * k) / LENGTH_SAMPLES; + + float x = 0; + float y = 0; + for (int i = 0; i <= n; i++) { + x += pXs[i] * BezierCurveUtils.bernstein(t, i, n); + y += pYs[i] * BezierCurveUtils.bernstein(t, i, n); + } + + length += MathUtils.distance(lastX, lastY, x, y); + + lastX = x; + lastY = y; + } + + return length; + } + + /** + * @see wikipedia.org/wiki/Bernstein_polynomial + */ + private static final float bernstein(final float t, final int i, final int n) { + return ((float) MathUtils.factorial(n) / (float) (MathUtils.factorial(i) * MathUtils.factorial(n - i))) * (float) Math.pow(t, i) * (float) Math.pow(1 - t, n - i); + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} From bd9df217422416b293e86abda6060e1831c8a3e7 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 2 Jun 2013 01:15:47 -0700 Subject: [PATCH 225/252] Added SpriteBatch.getCapacity(). Minor changes. --- src/org/andengine/entity/sprite/batch/SpriteBatch.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/org/andengine/entity/sprite/batch/SpriteBatch.java b/src/org/andengine/entity/sprite/batch/SpriteBatch.java index c3599725b..e5b2e93d8 100644 --- a/src/org/andengine/entity/sprite/batch/SpriteBatch.java +++ b/src/org/andengine/entity/sprite/batch/SpriteBatch.java @@ -130,6 +130,10 @@ public SpriteBatch(final float pX, final float pY, final ITexture pTexture, fina // Getter & Setter // =========================================================== + public int getCapacity() { + return this.mCapacity; + } + public int getIndex() { return this.mIndex; } @@ -467,19 +471,19 @@ protected void onSubmit() { private void assertCapacity(final int pIndex) { if (pIndex >= this.mCapacity) { - throw new IllegalStateException("This supplied pIndex: '" + pIndex + "' is exceeding the capacity: '" + this.mCapacity + "' of this SpriteBatch!"); + throw new IllegalStateException("This supplied pIndex: '" + pIndex + "' is exceeding the capacity: '" + this.mCapacity + "' of this " + this.getClass().getSimpleName() + "!"); } } private void assertCapacity() { if (this.mIndex == this.mCapacity) { - throw new IllegalStateException("This SpriteBatch has already reached its capacity (" + this.mCapacity + ") !"); + throw new IllegalStateException("This " + this.getClass().getSimpleName() + " has already reached its capacity (" + this.mCapacity + ") !"); } } protected void assertTexture(final ITextureRegion pTextureRegion) { if (pTextureRegion.getTexture() != this.mTexture) { - throw new IllegalArgumentException("The supplied Texture does match the Texture of this SpriteBatch!"); + throw new IllegalArgumentException("The supplied Texture does match the Texture of this " + this.getClass().getSimpleName() + "!"); } } From 43c3fef204d4a28ced1e323a28a42094563efd91 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 2 Jun 2013 01:16:16 -0700 Subject: [PATCH 226/252] Minor changes. --- src/org/andengine/engine/FixedStepEngine.java | 1 + src/org/andengine/engine/LimitedFPSEngine.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/org/andengine/engine/FixedStepEngine.java b/src/org/andengine/engine/FixedStepEngine.java index 63c9a12ac..1c1b04919 100644 --- a/src/org/andengine/engine/FixedStepEngine.java +++ b/src/org/andengine/engine/FixedStepEngine.java @@ -32,6 +32,7 @@ public class FixedStepEngine extends Engine { public FixedStepEngine(final EngineOptions pEngineOptions, final int pStepsPerSecond) { super(pEngineOptions); + this.mStepLength = TimeConstants.NANOSECONDS_PER_SECOND / pStepsPerSecond; } diff --git a/src/org/andengine/engine/LimitedFPSEngine.java b/src/org/andengine/engine/LimitedFPSEngine.java index e09c27f2c..ee7b77aa7 100644 --- a/src/org/andengine/engine/LimitedFPSEngine.java +++ b/src/org/andengine/engine/LimitedFPSEngine.java @@ -31,6 +31,7 @@ public class LimitedFPSEngine extends Engine { public LimitedFPSEngine(final EngineOptions pEngineOptions, final int pFramesPerSecond) { super(pEngineOptions); + this.mPreferredFrameLengthNanoseconds = TimeConstants.NANOSECONDS_PER_SECOND / pFramesPerSecond; } From df88f3dfa2852e6b5e6dd4f847ac6dbae68ae093 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 2 Jun 2013 22:27:57 -0700 Subject: [PATCH 227/252] Optimization in BezierCurveUtils. --- src/org/andengine/util/BezierCurveUtils.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/util/BezierCurveUtils.java b/src/org/andengine/util/BezierCurveUtils.java index fe6d65e93..0952d5f46 100644 --- a/src/org/andengine/util/BezierCurveUtils.java +++ b/src/org/andengine/util/BezierCurveUtils.java @@ -77,8 +77,9 @@ public static final float getBezierCurveLength(final float[] pXs, final float[] float x = 0; float y = 0; for (int i = 0; i <= n; i++) { - x += pXs[i] * BezierCurveUtils.bernstein(t, i, n); - y += pYs[i] * BezierCurveUtils.bernstein(t, i, n); + final float bernstein = BezierCurveUtils.bernstein(t, i, n); + x += pXs[i] * bernstein; + y += pYs[i] * bernstein; } length += MathUtils.distance(lastX, lastY, x, y); From 3958f5bc786d6acf9b8e07441a4d7a2e7a8523a8 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 3 Jun 2013 10:47:50 -0700 Subject: [PATCH 228/252] BezierCurveUtils can now also calculate the curvature of a bezier curve at any point. --- src/org/andengine/util/BezierCurveUtils.java | 94 +++++++++++++++++--- 1 file changed, 81 insertions(+), 13 deletions(-) diff --git a/src/org/andengine/util/BezierCurveUtils.java b/src/org/andengine/util/BezierCurveUtils.java index 0952d5f46..e6d3a8924 100644 --- a/src/org/andengine/util/BezierCurveUtils.java +++ b/src/org/andengine/util/BezierCurveUtils.java @@ -7,13 +7,20 @@ * * @author Nicolas Gramlich * @since 23:09:15 - 01.06.2013 + * + * @see Bézier curve (Wikipedia) + * @see Derivatives of a Bézier Curve (Michigan Tech University) + * @see Continuous Curvature Path Generation Based on Bezier Curves for Autonomous Vehicles (Choi, Curry, Elkaim) + * @see Bézier Curves (Stanislav) + * @see Curvature of singular Bézier curves and surfaces (Zhejiang University) + * @see Bernstein polynomial (Wikipedia) */ public final class BezierCurveUtils { // =========================================================== // Constants // =========================================================== - private static final int LENGTH_SAMPLES = 10; + private static final int LENGTH_SAMPLES_DEFAULT = 10; // =========================================================== // Fields @@ -40,30 +47,38 @@ private BezierCurveUtils() { // =========================================================== /** - * Calculates the (x|y|z|...)-coordinate for the given control point (x|y|z|...)-coordinates. + * Calculates the (x|y|z|...)-coordinate for the given control point (x|y|z|...)-coordinates at value t. * * @param t in the interval [0, 1]. - * @param pControlPointCoordinates (x|y|z|...)-coordinates of the bezier curve. + * @param pControlPointCoordinates (x|y|z|...)-coordinates of the Bézier curve. * @return */ public static final float getBezierCurveCoordinate(final float t, final float[] pControlPointCoordinates) { float result = 0; final int n = pControlPointCoordinates.length - 1; for (int i = 0; i <= n; i++) { - result += pControlPointCoordinates[i] * BezierCurveUtils.bernstein(t, i, n); + result += pControlPointCoordinates[i] * BezierCurveUtils.getBernsteinPolynomial(t, i, n); } return result; } /** - * Calculates the length of a bezier curve by taking {@link #LENGTH_SAMPLES} samples. + * Calculates the length of a Bézier curve by taking {@link #LENGTH_SAMPLES_DEFAULT} samples. + * + * @param pXs x-coordinates of the control points of the Bézier curve. + * @param pYs y-coordinates of the control points of the Bézier curve. */ public static final float getBezierCurveLength(final float[] pXs, final float[] pYs) { - return BezierCurveUtils.getBezierCurveLength(pXs, pYs, LENGTH_SAMPLES); + return BezierCurveUtils.getBezierCurveLength(pXs, pYs, LENGTH_SAMPLES_DEFAULT); } /** - * Calculates the length of a bezier curve by taking pSamples samples. + * Calculates the length of a Bézier curve by taking pSamples samples. + * + * @param pXs x-coordinates of the control points of the Bézier curve. + * @param pYs y-coordinates of the control points of the Bézier curve. + * @param pSamples the number of samples to take. The higher the more accurate. + * @return */ public static final float getBezierCurveLength(final float[] pXs, final float[] pYs, final int pSamples) { float length = 0; @@ -71,13 +86,13 @@ public static final float getBezierCurveLength(final float[] pXs, final float[] float lastX = pXs[0]; float lastY = pYs[0]; - for (int k = 1; k <= LENGTH_SAMPLES; k++) { - final float t = (1f * k) / LENGTH_SAMPLES; + for (int k = 1; k <= LENGTH_SAMPLES_DEFAULT; k++) { + final float t = (1f * k) / LENGTH_SAMPLES_DEFAULT; float x = 0; float y = 0; for (int i = 0; i <= n; i++) { - final float bernstein = BezierCurveUtils.bernstein(t, i, n); + final float bernstein = BezierCurveUtils.getBernsteinPolynomial(t, i, n); x += pXs[i] * bernstein; y += pYs[i] * bernstein; } @@ -92,10 +107,63 @@ public static final float getBezierCurveLength(final float[] pXs, final float[] } /** - * @see wikipedia.org/wiki/Bernstein_polynomial + * Calculates the curvature for the given control points of a Bézier curve at value t. + * + * @param t in the interval [0, 1]. + * @param pXs x-coordinates of the control points of the Bézier curve. + * @param pYs y-coordinates of the control points of the Bézier curve. */ - private static final float bernstein(final float t, final int i, final int n) { - return ((float) MathUtils.factorial(n) / (float) (MathUtils.factorial(i) * MathUtils.factorial(n - i))) * (float) Math.pow(t, i) * (float) Math.pow(1 - t, n - i); + public static final float getBezierCurveCurvature(final float t, final float[] pXs, final float[] pYs) { + final float dxt = BezierCurveUtils.getBezierCurveDerivativeValue(t, 1, pXs); + final float dyt = BezierCurveUtils.getBezierCurveDerivativeValue(t, 1, pYs); + final float ddxt = BezierCurveUtils.getBezierCurveDerivativeValue(t, 2, pXs); + final float ddyt = BezierCurveUtils.getBezierCurveDerivativeValue(t, 2, pYs); + + return BezierCurveUtils.getCurvature(dxt, dyt, ddxt, ddyt); + } + + /** + * Calculates the value of the kth derivative of given control point (x|y|z|...)-coordinates of a Bézier curve at value t. + * + * @param t in the interval [0, 1]. + * @param k the kth derivative. + * @param pControlPointCoordinates (x|y|z|...)-coordinates of the Bézier curve. + * @return + */ + public static final float getBezierCurveDerivativeValue(final float t, final int k, final float[] pControlPointCoordinates) { + final int n = pControlPointCoordinates.length - 1; + float result = 1; + for (int i = n; i > n - k; i--) { + result *= i; + } + + float sum = 0; + for (int i = 0; i <= n - k; i++) { + final float bernstein = BezierCurveUtils.getBernsteinPolynomial(t, i, n - k); + final float d = BezierCurveUtils.getLevelDifference(i, k, pControlPointCoordinates); + sum += bernstein * d; + } + + result *= sum; + + return result; + } + + + private static float getCurvature(final float dxt, final float dyt, final float ddxt, final float ddyt) { + return Math.abs(dxt * ddyt - dyt * ddxt) / (float) Math.pow(dxt * dxt + dyt * dyt, 3f / 2f); + } + + private static final float getBernsteinPolynomial(final float x, final int i, final int n) { + return ((float) MathUtils.factorial(n) / (float) (MathUtils.factorial(i) * MathUtils.factorial(n - i))) * (float) Math.pow(x, i) * (float) Math.pow(1 - x, n - i); + } + + private static float getLevelDifference(final int i, final int level, final float[] pControlPointCoordinates) { + if (level == 0) { + return pControlPointCoordinates[i]; + } else { + return BezierCurveUtils.getLevelDifference(i + 1, level - 1, pControlPointCoordinates) - BezierCurveUtils.getLevelDifference(i, level - 1, pControlPointCoordinates); + } } // =========================================================== From a4363f5d57120439584751b2febcb4c0f6bf2e8b Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Thu, 6 Jun 2013 15:44:27 -0700 Subject: [PATCH 229/252] Minor change. --- build.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.xml b/build.xml index f16e1c80b..d5f276687 100644 --- a/build.xml +++ b/build.xml @@ -17,7 +17,7 @@ - + From cbadb8caf267ca5d66009955f5f050a628b4f34b Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 7 Jun 2013 13:20:13 -0700 Subject: [PATCH 230/252] Added crashlytics file to .gitignore. --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1a11476e3..04b103fc1 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,7 @@ gdbserver # IntelliJ / Android Studio: idea/workspace.xml -idea/tasks.xml \ No newline at end of file +idea/tasks.xml + +# Crashlytics +res/values/com_crashlytics_export_strings.xml \ No newline at end of file From 75c2ce5fbf759f45759f22460f4eb51f82a844d2 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 9 Jun 2013 12:07:29 -0700 Subject: [PATCH 231/252] Added ReadWriteLock to SecureSharedPreferences. --- .../util/preferences/SecureSharedPreferences.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/org/andengine/util/preferences/SecureSharedPreferences.java b/src/org/andengine/util/preferences/SecureSharedPreferences.java index 44d2f363b..6bf60dc23 100644 --- a/src/org/andengine/util/preferences/SecureSharedPreferences.java +++ b/src/org/andengine/util/preferences/SecureSharedPreferences.java @@ -6,6 +6,9 @@ import java.security.NoSuchAlgorithmException; import java.util.Map; import java.util.Set; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -46,6 +49,8 @@ public class SecureSharedPreferences implements SharedPreferences { protected final Cipher mEncryptCipher; protected final Cipher mDecryptCipher; + protected final ReadWriteLock mReadWriteLock = new ReentrantReadWriteLock(true); + // =========================================================== // Constructors // =========================================================== @@ -78,6 +83,14 @@ public SecureSharedPreferences(final SharedPreferences pDelegate, final String p // Getter & Setter // =========================================================== + public Lock getReadLock() { + return this.mReadWriteLock.readLock(); + } + + public Lock getWriteLock() { + return this.mReadWriteLock.writeLock(); + } + // =========================================================== // Methods for/from SuperClass/Interfaces // =========================================================== From cadf048e81864d4aff6b6e91c4af9f2edd911e6c Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 9 Jun 2013 16:47:12 -0700 Subject: [PATCH 232/252] Removed useless debug statement in WifiUtils. --- src/org/andengine/util/WifiUtils.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/org/andengine/util/WifiUtils.java b/src/org/andengine/util/WifiUtils.java index b749c484b..8dcdc8dc2 100644 --- a/src/org/andengine/util/WifiUtils.java +++ b/src/org/andengine/util/WifiUtils.java @@ -9,7 +9,6 @@ import java.util.Enumeration; import org.andengine.util.adt.array.ArrayUtils; -import org.andengine.util.debug.Debug; import org.andengine.util.exception.AndEngineException; import org.andengine.util.exception.MethodNotFoundException; import org.andengine.util.system.SystemUtils; @@ -113,10 +112,6 @@ public static boolean isWifiHotspotSupported(final Context pContext) { return false; } else { final WifiManager wifiManager = WifiUtils.getWifiManager(pContext); - for (Method m : wifiManager.getClass().getMethods()) { - Debug.d("WifiManager." + m.getName()); - } - try { final Method WifiManager_isWifiApEnabled = wifiManager.getClass().getMethod("isWifiApEnabled"); return WifiManager_isWifiApEnabled != null; From 7927298033c7f6e685e17016b22ef9f37a8d21a0 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 9 Jun 2013 21:44:40 -0700 Subject: [PATCH 233/252] Added various factorial providers and caches. --- .../math/factorioal/DenseFactorialCache.java | 70 +++++++++++++++++++ .../math/factorioal/IFactorialProvider.java | 23 ++++++ .../IterativeFactorialProvider.java | 60 ++++++++++++++++ .../RecursiveFactorialProvider.java | 60 ++++++++++++++++ .../math/factorioal/SparseFactorialCache.java | 66 +++++++++++++++++ 5 files changed, 279 insertions(+) create mode 100644 src/org/andengine/util/math/factorioal/DenseFactorialCache.java create mode 100644 src/org/andengine/util/math/factorioal/IFactorialProvider.java create mode 100644 src/org/andengine/util/math/factorioal/IterativeFactorialProvider.java create mode 100644 src/org/andengine/util/math/factorioal/RecursiveFactorialProvider.java create mode 100644 src/org/andengine/util/math/factorioal/SparseFactorialCache.java diff --git a/src/org/andengine/util/math/factorioal/DenseFactorialCache.java b/src/org/andengine/util/math/factorioal/DenseFactorialCache.java new file mode 100644 index 000000000..ca2c2ce2e --- /dev/null +++ b/src/org/andengine/util/math/factorioal/DenseFactorialCache.java @@ -0,0 +1,70 @@ +package org.andengine.util.math.factorioal; + +import android.util.SparseIntArray; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:37:15 - 09.06.2013 + */ +public class DenseFactorialCache implements IFactorialProvider { + // =========================================================== + // Constants + // =========================================================== + + private static DenseFactorialCache INSTANCE; + + private final SparseIntArray mCache = new SparseIntArray(); + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private DenseFactorialCache() { + + } + + public static DenseFactorialCache getInstance() { + if (INSTANCE == null) { + INSTANCE = new DenseFactorialCache(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @Override + public int factorial(final int n) { + if (n == 0 || n == 1) { + return 1; + } else { + int result = this.mCache.get(n); + if (result != 0) { + return result; + } else { + result = n * this.factorial(n - 1); + this.mCache.put(n, result); + return result; + } + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/util/math/factorioal/IFactorialProvider.java b/src/org/andengine/util/math/factorioal/IFactorialProvider.java new file mode 100644 index 000000000..7c03e4c44 --- /dev/null +++ b/src/org/andengine/util/math/factorioal/IFactorialProvider.java @@ -0,0 +1,23 @@ +package org.andengine.util.math.factorioal; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:37:15 - 09.06.2013 + */ +public interface IFactorialProvider { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + public int factorial(final int n); + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} diff --git a/src/org/andengine/util/math/factorioal/IterativeFactorialProvider.java b/src/org/andengine/util/math/factorioal/IterativeFactorialProvider.java new file mode 100644 index 000000000..ac0777e25 --- /dev/null +++ b/src/org/andengine/util/math/factorioal/IterativeFactorialProvider.java @@ -0,0 +1,60 @@ +package org.andengine.util.math.factorioal; + + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:37:15 - 09.06.2013 + */ +public class IterativeFactorialProvider implements IFactorialProvider { + // =========================================================== + // Constants + // =========================================================== + + private static IterativeFactorialProvider INSTANCE; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private IterativeFactorialProvider() { + + } + + public static IterativeFactorialProvider getInstance() { + if (INSTANCE == null) { + INSTANCE = new IterativeFactorialProvider(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @Override + public int factorial(final int n) { + int result = 1; + for (int i = 1; i <= n; i++) { + result *= i; + } + return result; + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/util/math/factorioal/RecursiveFactorialProvider.java b/src/org/andengine/util/math/factorioal/RecursiveFactorialProvider.java new file mode 100644 index 000000000..7656a6cb2 --- /dev/null +++ b/src/org/andengine/util/math/factorioal/RecursiveFactorialProvider.java @@ -0,0 +1,60 @@ +package org.andengine.util.math.factorioal; + + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:37:15 - 09.06.2013 + */ +public class RecursiveFactorialProvider implements IFactorialProvider { + // =========================================================== + // Constants + // =========================================================== + + private static RecursiveFactorialProvider INSTANCE; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private RecursiveFactorialProvider() { + + } + + public static RecursiveFactorialProvider getInstance() { + if (INSTANCE == null) { + INSTANCE = new RecursiveFactorialProvider(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @Override + public int factorial(final int n) { + if (n == 0 || n == 1) { + return 1; + } else { + return n * this.factorial(n - 1); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file diff --git a/src/org/andengine/util/math/factorioal/SparseFactorialCache.java b/src/org/andengine/util/math/factorioal/SparseFactorialCache.java new file mode 100644 index 000000000..f57a5f5ae --- /dev/null +++ b/src/org/andengine/util/math/factorioal/SparseFactorialCache.java @@ -0,0 +1,66 @@ +package org.andengine.util.math.factorioal; + +import android.util.SparseIntArray; + +/** + * (c) 2013 Nicolas Gramlich + * + * @author Nicolas Gramlich + * @since 21:37:15 - 09.06.2013 + */ +public class SparseFactorialCache implements IFactorialProvider { + // =========================================================== + // Constants + // =========================================================== + + private static SparseFactorialCache INSTANCE; + + private final SparseIntArray mCache = new SparseIntArray(); + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + private SparseFactorialCache() { + + } + + public static SparseFactorialCache getInstance() { + if (INSTANCE == null) { + INSTANCE = new SparseFactorialCache(); + } + return INSTANCE; + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + @Override + public int factorial(final int n) { + int result = this.mCache.get(n); + if (result != 0) { + return result; + } else { + result = IterativeFactorialProvider.getInstance().factorial(n); + this.mCache.put(n, result); + return result; + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file From e05559d013229b445dc4937ec30c755494d62335 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 9 Jun 2013 23:39:32 -0700 Subject: [PATCH 234/252] Switch to iterative factorial calculation over recursive, for performance reasons. --- src/org/andengine/util/math/MathUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/util/math/MathUtils.java b/src/org/andengine/util/math/MathUtils.java index 1ef73ea74..fe7cf4818 100644 --- a/src/org/andengine/util/math/MathUtils.java +++ b/src/org/andengine/util/math/MathUtils.java @@ -398,11 +398,11 @@ public static float cross(final float pXA, final float pYA, final float pXB, fin } public static final int factorial(final int n) { - if (n == 0 || n == 1) { - return 1; - } else { - return n * MathUtils.factorial(n - 1); + int result = 1; + for (int i = 1; i <= n; i++) { + result *= i; } + return result; } // =========================================================== From cb185bbebfcbe992001f659d70d78fd0acc4c92d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 9 Jun 2013 23:40:59 -0700 Subject: [PATCH 235/252] Added method to BezierCurveUtils to calculate x and y in one method, as opposed to two. --- src/org/andengine/util/BezierCurveUtils.java | 37 +++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/util/BezierCurveUtils.java b/src/org/andengine/util/BezierCurveUtils.java index e6d3a8924..c911283d3 100644 --- a/src/org/andengine/util/BezierCurveUtils.java +++ b/src/org/andengine/util/BezierCurveUtils.java @@ -22,6 +22,8 @@ public final class BezierCurveUtils { private static final int LENGTH_SAMPLES_DEFAULT = 10; + private static final float[] COORDINATES_TMP = new float[2]; + // =========================================================== // Fields // =========================================================== @@ -50,7 +52,7 @@ private BezierCurveUtils() { * Calculates the (x|y|z|...)-coordinate for the given control point (x|y|z|...)-coordinates at value t. * * @param t in the interval [0, 1]. - * @param pControlPointCoordinates (x|y|z|...)-coordinates of the Bézier curve. + * @param pControlPointCoordinates (x|y|z|...)-coordinates of control points of the Bézier curve. * @return */ public static final float getBezierCurveCoordinate(final float t, final float[] pControlPointCoordinates) { @@ -62,6 +64,39 @@ public static final float getBezierCurveCoordinate(final float t, final float[] return result; } + /** + * Calculates the x/y-coordinate for the given control point x/y-coordinates at value t. + * + * @param t in the interval [0, 1]. + * @param pXs x-coordinates of the control points of the Bézier curve. + * @param pYs y-coordinates of the control points of the Bézier curve. + * @return a shared(!) float[] of length 2. + */ + public static final float[] getBezierCurveCoordinates(final float t, final float[] pXs, final float[] pYs) { + return BezierCurveUtils.getBezierCurveCoordinates(t, pXs, pYs, COORDINATES_TMP); + } + + /** + * Calculates the x/y-coordinate for the given control point x/y-coordinates at value t. + * + * @param t in the interval [0, 1]. + * @param pXs x-coordinates of the control points of the Bézier curve. + * @param pYs y-coordinates of the control points of the Bézier curve. + * @param pReuse must be of length 2. + * @return pReuse as a convenience. + */ + public static final float[] getBezierCurveCoordinates(final float t, final float[] pXs, final float[] pYs, final float[] pReuse) { + final int n = pXs.length - 1; + pReuse[Constants.VERTEX_INDEX_X] = 0; + pReuse[Constants.VERTEX_INDEX_Y] = 0; + for (int i = 0; i <= n; i++) { + final float bernsteinPolynomial = BezierCurveUtils.getBernsteinPolynomial(t, i, n); + pReuse[Constants.VERTEX_INDEX_X] += pXs[i] * bernsteinPolynomial; + pReuse[Constants.VERTEX_INDEX_Y] += pYs[i] * bernsteinPolynomial; + } + return pReuse; + } + /** * Calculates the length of a Bézier curve by taking {@link #LENGTH_SAMPLES_DEFAULT} samples. * From 7238c59fd301e27378127827348a2fabb972a2a2 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sat, 29 Jun 2013 21:15:52 -0700 Subject: [PATCH 236/252] Minor change. --- jni/Application.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jni/Application.mk b/jni/Application.mk index 3622268cf..1716886f7 100644 --- a/jni/Application.mk +++ b/jni/Application.mk @@ -1,3 +1,3 @@ -# Build both ARMv5TE, ARMv7-A, x86 and MIPS machine code. +# Build ARMv5TE, ARMv7-A, x86 and MIPS machine code. APP_ABI := armeabi armeabi-v7a x86 mips # APP_STL := gnustl_shared \ No newline at end of file From c6073f8cb715ce1be0ca6a9e0b99b09abd6c5c9b Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 30 Jun 2013 18:32:58 -0700 Subject: [PATCH 237/252] Made build.sh directory agnostic. --- jni/build.sh | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/jni/build.sh b/jni/build.sh index 858f77fff..f371ec5f2 100755 --- a/jni/build.sh +++ b/jni/build.sh @@ -1,15 +1,18 @@ #!/bin/bash -NDK_DIRECTORY="/Users/ngramlich/SDKs/Android/ndk/r8/" -PROJECT_DIRECTORY="/Users/ngramlich/Workspace/gdk/graphic_engines/AndEngine/AndEngine/" +NDK_DIRECTORY="/Users/ngramlich/Applications/android/ndk/r8e/" + +SCRIPT_DIR="$( cd "$( dirname "${0}" )" && pwd )" + +PROJECT_DIRECTORY=${SCRIPT_DIR}/../ # Run build: -pushd ${PROJECT_DIRECTORY} -${NDK_DIRECTORY}ndk-build +pushd ${PROJECT_DIRECTORY} > /dev/null +${NDK_DIRECTORY}ndk-build -j8 # Clean temporary files: rm -rf ${PROJECT_DIRECTORY}obj find . -name gdbserver -print0 | xargs -0 rm -rf find . -name gdb.setup -print0 | xargs -0 rm -rf -popd \ No newline at end of file +popd > /dev/null \ No newline at end of file From 1052983f8c2ed2ab7dd8cf9adcae6dfdf947c058 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 30 Jun 2013 19:24:53 -0700 Subject: [PATCH 238/252] Only call onResumeGame when activity isn't finishing yet. --- src/org/andengine/ui/activity/BaseGameActivity.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/ui/activity/BaseGameActivity.java b/src/org/andengine/ui/activity/BaseGameActivity.java index 480dd9f7a..0a928b783 100644 --- a/src/org/andengine/ui/activity/BaseGameActivity.java +++ b/src/org/andengine/ui/activity/BaseGameActivity.java @@ -372,7 +372,9 @@ private void callGameResumedOnUIThread() { BaseGameActivity.this.runOnUiThread(new Runnable() { @Override public void run() { - BaseGameActivity.this.onResumeGame(); + if (!BaseGameActivity.this.isFinishing()) { + BaseGameActivity.this.onResumeGame(); + } } }); } From 7516bc36bcea9c5c47c392b99be025e1db319187 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Jul 2013 17:23:17 -0700 Subject: [PATCH 239/252] Added IntentNotResolveableException. --- src/org/andengine/util/IntentUtils.java | 50 +++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/org/andengine/util/IntentUtils.java b/src/org/andengine/util/IntentUtils.java index 056303d41..924678973 100644 --- a/src/org/andengine/util/IntentUtils.java +++ b/src/org/andengine/util/IntentUtils.java @@ -2,6 +2,8 @@ import java.util.List; +import org.andengine.util.exception.AndEngineException; + import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; @@ -49,4 +51,52 @@ public static boolean isIntentResolvable(final Context pContext, final Intent pI // =========================================================== // Inner and Anonymous Classes // =========================================================== + + public class IntentNotResolveableException extends AndEngineException { + // =========================================================== + // Constants + // =========================================================== + + private static final long serialVersionUID = 249698759677552332L; + + // =========================================================== + // Fields + // =========================================================== + + // =========================================================== + // Constructors + // =========================================================== + + public IntentNotResolveableException() { + + } + + public IntentNotResolveableException(final String pMessage) { + super(pMessage); + } + + public IntentNotResolveableException(final Throwable pThrowable) { + super(pThrowable); + } + + public IntentNotResolveableException(final String pMessage, final Throwable pThrowable) { + super(pMessage, pThrowable); + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== + } } From 877e9d25cb4467270036f6558d88f88ffa735ca7 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Jul 2013 17:23:36 -0700 Subject: [PATCH 240/252] Minor changes. --- .../exception/AndEngineRuntimeException.java | 1 - .../util/exception/BluetoothException.java | 4 ++++ .../util/exception/CancelledException.java | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/org/andengine/util/exception/AndEngineRuntimeException.java b/src/org/andengine/util/exception/AndEngineRuntimeException.java index 22c5d135f..35b149384 100644 --- a/src/org/andengine/util/exception/AndEngineRuntimeException.java +++ b/src/org/andengine/util/exception/AndEngineRuntimeException.java @@ -21,7 +21,6 @@ public class AndEngineRuntimeException extends RuntimeException { // Constructors // =========================================================== - public AndEngineRuntimeException() { super(); } diff --git a/src/org/andengine/util/exception/BluetoothException.java b/src/org/andengine/util/exception/BluetoothException.java index 4815c9ed8..1697449e4 100644 --- a/src/org/andengine/util/exception/BluetoothException.java +++ b/src/org/andengine/util/exception/BluetoothException.java @@ -30,6 +30,10 @@ public BluetoothException(final String pMessage) { super(pMessage); } + public BluetoothException(final Throwable pThrowable) { + super(pThrowable); + } + public BluetoothException(final String pMessage, final Throwable pThrowable) { super(pMessage, pThrowable); } diff --git a/src/org/andengine/util/exception/CancelledException.java b/src/org/andengine/util/exception/CancelledException.java index d3471771a..6f0652f3c 100644 --- a/src/org/andengine/util/exception/CancelledException.java +++ b/src/org/andengine/util/exception/CancelledException.java @@ -21,6 +21,22 @@ public class CancelledException extends AndEngineException { // Constructors // =========================================================== + public CancelledException() { + super(); + } + + public CancelledException(String pMessage) { + super(pMessage); + } + + public CancelledException(Throwable pThrowable) { + super(pThrowable); + } + + public CancelledException(String pMessage, Throwable pThrowable) { + super(pMessage, pThrowable); + } + // =========================================================== // Getter & Setter // =========================================================== From c79408656a3a9404ccd532a9ba7adaef7d1ae34a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Jul 2013 17:24:45 -0700 Subject: [PATCH 241/252] Minor change. --- src/org/andengine/util/IntentUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/IntentUtils.java b/src/org/andengine/util/IntentUtils.java index 924678973..64a95d4d6 100644 --- a/src/org/andengine/util/IntentUtils.java +++ b/src/org/andengine/util/IntentUtils.java @@ -52,7 +52,7 @@ public static boolean isIntentResolvable(final Context pContext, final Intent pI // Inner and Anonymous Classes // =========================================================== - public class IntentNotResolveableException extends AndEngineException { + public static class IntentNotResolveableException extends AndEngineException { // =========================================================== // Constants // =========================================================== From af2547ba788279bded52a52000c63fba703618b9 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Jul 2013 17:31:25 -0700 Subject: [PATCH 242/252] Fixed two race conditions in BaseGameActivity causing a crash when the BaseGameActivity is finishing during a resume. --- src/org/andengine/ui/activity/BaseGameActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/ui/activity/BaseGameActivity.java b/src/org/andengine/ui/activity/BaseGameActivity.java index 0a928b783..05b8b5bb2 100644 --- a/src/org/andengine/ui/activity/BaseGameActivity.java +++ b/src/org/andengine/ui/activity/BaseGameActivity.java @@ -101,7 +101,7 @@ public synchronized void onSurfaceCreated(final GLState pGLState) { if (this.mGameCreated) { this.onReloadResources(); - if (this.mGamePaused && this.mGameCreated) { + if (this.mGamePaused && this.mGameCreated && !this.isFinishing()) { this.onResumeGame(); } } else { @@ -230,7 +230,7 @@ public synchronized void onResumeGame() { public synchronized void onWindowFocusChanged(final boolean pHasWindowFocus) { super.onWindowFocusChanged(pHasWindowFocus); - if (pHasWindowFocus && this.mGamePaused && this.mGameCreated) { + if (pHasWindowFocus && this.mGamePaused && this.mGameCreated && !this.isFinishing()) { this.onResumeGame(); } } From 4b5133b6c4d9c53ee6c5f9fd930e865dec013817 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 14 Jul 2013 19:32:32 -0700 Subject: [PATCH 243/252] Fixed some typos. --- src/org/andengine/audio/music/MusicFactory.java | 2 +- src/org/andengine/audio/sound/SoundFactory.java | 2 +- src/org/andengine/opengl/font/FontFactory.java | 2 +- .../BitmapTextureAtlasTextureRegionFactory.java | 2 +- src/org/andengine/util/TextUtils.java | 17 +++++++++++++++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/org/andengine/audio/music/MusicFactory.java b/src/org/andengine/audio/music/MusicFactory.java index 121012af2..19d419d94 100644 --- a/src/org/andengine/audio/music/MusicFactory.java +++ b/src/org/andengine/audio/music/MusicFactory.java @@ -48,7 +48,7 @@ public static void setAssetBasePath(final String pAssetBasePath) { if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { MusicFactory.sAssetBasePath = pAssetBasePath; } else { - throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + throw new IllegalStateException("pAssetBasePath must end with '/' or be length zero."); } } diff --git a/src/org/andengine/audio/sound/SoundFactory.java b/src/org/andengine/audio/sound/SoundFactory.java index 376684e7b..2943813e2 100644 --- a/src/org/andengine/audio/sound/SoundFactory.java +++ b/src/org/andengine/audio/sound/SoundFactory.java @@ -44,7 +44,7 @@ public static void setAssetBasePath(final String pAssetBasePath) { if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { SoundFactory.sAssetBasePath = pAssetBasePath; } else { - throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + throw new IllegalStateException("pAssetBasePath must end with '/' or be length zero."); } } diff --git a/src/org/andengine/opengl/font/FontFactory.java b/src/org/andengine/opengl/font/FontFactory.java index 892743442..2f3e9bafd 100644 --- a/src/org/andengine/opengl/font/FontFactory.java +++ b/src/org/andengine/opengl/font/FontFactory.java @@ -50,7 +50,7 @@ public static void setAssetBasePath(final String pAssetBasePath) { if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { FontFactory.sAssetBasePath = pAssetBasePath; } else { - throw new IllegalStateException("pAssetBasePath must end with '/' or be lenght zero."); + throw new IllegalStateException("pAssetBasePath must end with '/' or be length zero."); } } diff --git a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java index 7ca1c24cb..752853d32 100644 --- a/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java +++ b/src/org/andengine/opengl/texture/atlas/bitmap/BitmapTextureAtlasTextureRegionFactory.java @@ -54,7 +54,7 @@ public static void setAssetBasePath(final String pAssetBasePath) { if (pAssetBasePath.endsWith("/") || pAssetBasePath.length() == 0) { BitmapTextureAtlasTextureRegionFactory.sAssetBasePath = pAssetBasePath; } else { - throw new IllegalArgumentException("pAssetBasePath must end with '/' or be lenght zero."); + throw new IllegalArgumentException("pAssetBasePath must end with '/' or be length zero."); } } diff --git a/src/org/andengine/util/TextUtils.java b/src/org/andengine/util/TextUtils.java index 191542593..62f4ec378 100644 --- a/src/org/andengine/util/TextUtils.java +++ b/src/org/andengine/util/TextUtils.java @@ -218,6 +218,23 @@ public static final String join(final String pSeparator, final Object ... pStrin return stringBuilder.toString(); } + public static final String ellipsize(final String pText, final String pEllipsis, final int pMaxLength) throws IllegalArgumentException { + final int textLength = pText.length(); + if (textLength > pMaxLength) { + final int ellipsisLength = pEllipsis.length(); + if (ellipsisLength > pMaxLength) { + throw new IllegalArgumentException("pMaxLength: '" + pMaxLength + "' isn't long enough for pEllipsis: '" + pEllipsis + "'."); + } else { + final StringBuilder result = new StringBuilder(); + result.append(pText.substring(0, pMaxLength - ellipsisLength)); + result.append(pEllipsis); + return result.toString(); + } + } else { + return pText; + } + } + // =========================================================== // Inner and Anonymous Classes // =========================================================== From 6d0d5ceb4e156cb96ac203120be9fba139c9aca7 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 15 Nov 2013 00:33:06 -0800 Subject: [PATCH 244/252] Fixed a bug in ManhattanHeuristic. --- .../andengine/util/algorithm/path/astar/ManhattanHeuristic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java b/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java index 6151d346f..dc35a857b 100644 --- a/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java +++ b/src/org/andengine/util/algorithm/path/astar/ManhattanHeuristic.java @@ -32,7 +32,7 @@ public class ManhattanHeuristic implements IAStarHeuristic { @Override public float getExpectedRestCost(final IPathFinderMap pPathFinderMap, final T pEntity, final int pFromX, final int pFromY, final int pToX, final int pToY) { - return Math.abs(pFromX - pToX) + Math.abs(pToX - pToY); + return Math.abs(pFromX - pToX) + Math.abs(pFromY - pToY); } // =========================================================== From 21e7b0f53c57d96ee8a535ed8de5eaf848f67428 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 15 Nov 2013 00:43:48 -0800 Subject: [PATCH 245/252] Fixed wrong calculation in Texture.getTextureMemorySize(). Was massively overreporting (64x). =/ Thanks to @yukuku . --- src/org/andengine/opengl/texture/Texture.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/andengine/opengl/texture/Texture.java b/src/org/andengine/opengl/texture/Texture.java index 24f349f68..52cbdff27 100644 --- a/src/org/andengine/opengl/texture/Texture.java +++ b/src/org/andengine/opengl/texture/Texture.java @@ -91,7 +91,7 @@ public TextureOptions getTextureOptions() { @Override public int getTextureMemorySize() { final int pixelCount = this.getWidth() * this.getHeight(); - final int bytesPerPixel = this.mPixelFormat.getBitsPerPixel() * DataConstants.BITS_PER_BYTE; + final int bytesPerPixel = this.mPixelFormat.getBitsPerPixel() / DataConstants.BITS_PER_BYTE; return pixelCount * bytesPerPixel / DataConstants.BYTES_PER_KILOBYTE; } @@ -188,4 +188,4 @@ public void bind(final GLState pGLState, final int pGLActiveTexture) { // =========================================================== // Inner and Anonymous Classes // =========================================================== -} \ No newline at end of file +} From 002b4e73e71344beca005c933b29663d302bb36a Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Fri, 15 Nov 2013 00:51:23 -0800 Subject: [PATCH 246/252] Fixed typo. --- src/org/andengine/audio/sound/Sound.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/andengine/audio/sound/Sound.java b/src/org/andengine/audio/sound/Sound.java index 0ae2900d8..1abeedbcd 100644 --- a/src/org/andengine/audio/sound/Sound.java +++ b/src/org/andengine/audio/sound/Sound.java @@ -86,7 +86,7 @@ public int getPriority() { return this.mPriority; } - public void setPrioriyt(final int pPriority) throws SoundReleasedException { + public void setPriority(final int pPriority) throws SoundReleasedException { this.assertNotReleased(); this.mPriority = pPriority; From 99fe0ed383e42aabebda96d90b7b240b0d44d9f0 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Mon, 2 Dec 2013 23:47:37 -0800 Subject: [PATCH 247/252] Added donation section in README.md. --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bc2f874d5..f1720fa2e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,20 @@ # AndEngine +## Donations +While developing AndEngine was a lot of fun, it also also consumed many(!) months of my life. It actually continues to cost me a significant amount of money to host the AndEngine forums. + +If you made profit using your game and can afford to spare a fraction of it to the developer of the game engine you used, I would be very grateful! =) + +### Bitcoin +The easiest way of donating is via Bitcoin to the AndEngine funds wallet address: + +![Bitcoin](http://www.andengine.org/donate/bitcoin_16x16.png "Donate via Bitcoin") +Bitcoin Wallet Address: ``1run6zViD16j2rP9evpayu8FqQ6mcRDqi`` ![Bitcoin Wallet](http://www.andengine.org/donate/bitcoin_wallet.png "Bitcoin Wallet") + +Thank you, + +Nicolas Gramlich + ## Building ### Eclipse @@ -66,4 +81,4 @@ public final class BuildConfig { [URI_AndEngineScriptingExtensionGenerator]: https://github.com/nicolasgramlich/AndEngineScriptingExtensionGenerator [URI_AndEngineSVGTextureRegionExtension]: https://github.com/nicolasgramlich/AndEngineSVGTextureRegionExtension [URI_AndEngineTexturePackerExtension]: https://github.com/nicolasgramlich/AndEngineTexturePackerExtension -[URI_AndEngineTMXTiledMapExtension]: https://github.com/nicolasgramlich/AndEngineTMXTiledMapExtension \ No newline at end of file +[URI_AndEngineTMXTiledMapExtension]: https://github.com/nicolasgramlich/AndEngineTMXTiledMapExtension From 2e69d91425c6f551946cb33c645ef198c096da29 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 3 Dec 2013 10:45:46 -0800 Subject: [PATCH 248/252] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f1720fa2e..169dbffaa 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,13 @@ The easiest way of donating is via Bitcoin to the AndEngine funds wallet address ![Bitcoin](http://www.andengine.org/donate/bitcoin_16x16.png "Donate via Bitcoin") Bitcoin Wallet Address: ``1run6zViD16j2rP9evpayu8FqQ6mcRDqi`` ![Bitcoin Wallet](http://www.andengine.org/donate/bitcoin_wallet.png "Bitcoin Wallet") -Thank you, +### PayPal +Donation Email: donate@andengine.org -Nicolas Gramlich + +Thank you! + +/Nicolas Gramlich ## Building From 200a1930ee1d71964b9403517227ce17a18b5b20 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Wed, 11 Dec 2013 00:26:51 -0800 Subject: [PATCH 249/252] Added tip4commit to README. --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 169dbffaa..f886e7e46 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,11 @@ The easiest way of donating is via Bitcoin to the AndEngine funds wallet address ![Bitcoin](http://www.andengine.org/donate/bitcoin_16x16.png "Donate via Bitcoin") Bitcoin Wallet Address: ``1run6zViD16j2rP9evpayu8FqQ6mcRDqi`` ![Bitcoin Wallet](http://www.andengine.org/donate/bitcoin_wallet.png "Bitcoin Wallet") +### Tip4Commit (Bitcoin) +Tip the author (not the project itself) of the next commit to AndEngine: + +[![Bitcoin top for next commit](http://tip4commit.com/projects/192.svg)](http://tip4commit.com/projects/192) + ### PayPal Donation Email: donate@andengine.org From 6d1d9b89c95db8c3273194dc859a23c10eed7a7d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 16 Mar 2014 14:02:51 -0700 Subject: [PATCH 250/252] Added experimental methods to PriorityBlockingAggregatorQueue. --- .../PriorityBlockingAggregatorQueue.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java b/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java index e419d0588..6ad0d773b 100644 --- a/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java +++ b/src/org/andengine/util/adt/queue/concurrent/PriorityBlockingAggregatorQueue.java @@ -197,6 +197,27 @@ public T peek() { } } +// public T peek(final int pPriority) { +// final ReentrantLock lock = this.mLock; +// lock.lock(); +// +// try { +// final IList queue = this.mQueues.get(pPriority); +// if (queue == null) { +// throw new IllegalArgumentException("No queue found for pPriority: '" + pPriority + "'."); +// } +// final int queueCapacity = this.mQueueCapacities.get(pPriority); +// +// if (queueCapacity == 0) { +// return null; +// } else { +// return queue.get(0); +// } +// } finally { +// lock.unlock(); +// } +// } + public T poll() { final ReentrantLock lock = this.mLock; lock.lock(); @@ -212,6 +233,22 @@ public T poll() { } } +// public T poll(final int pPriority) { +// final ReentrantLock lock = this.mLock; +// lock.lock(); +// +// try { +// final int queueCapacity = this.mQueueCapacities.get(pPriority, -1); +// if (queueCapacity == 0) { +// return null; +// } else { +// return this.extract(pPriority); +// } +// } finally { +// lock.unlock(); +// } +// } + public T take() throws InterruptedException { final ReentrantLock lock = this.mLock; lock.lockInterruptibly(); @@ -232,6 +269,31 @@ public T take() throws InterruptedException { } } +// public T take(final int pPriority) throws InterruptedException { +// final ReentrantLock lock = this.mLock; +// lock.lockInterruptibly(); +// +// try { +// final IList queue = this.mQueues.get(pPriority); +// if (queue == null) { +// throw new IllegalArgumentException("No queue found for pPriority: '" + pPriority + "'."); +// } +// +// try { +// while (queue.size() == 0) { +// this.mNotEmptyCondition.await(); +// } +// } catch (final InterruptedException e) { +// /* Propagate to non-interrupted thread. */ +// this.mNotEmptyCondition.signal(); +// throw e; +// } +// return this.extract(pPriority); +// } finally { +// lock.unlock(); +// } +// } + /** * Inserts the specified element at the tail of this queue with the given priority, waiting for space to become available if the queue is full. * From b39343f571bab2cedef5093bf3b7a0e45c24d966 Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 16 Mar 2014 14:02:59 -0700 Subject: [PATCH 251/252] Updated classpath to latest ADT. --- .classpath | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.classpath b/.classpath index f7b8a1f99..d57ec0251 100644 --- a/.classpath +++ b/.classpath @@ -4,6 +4,6 @@ - + From ccb2a54adeee7377de5984e747266208d3dda39e Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Sun, 16 Mar 2014 14:03:12 -0700 Subject: [PATCH 252/252] Updated native library. --- libs/armeabi-v7a/libandengine.so | Bin 37844 -> 13388 bytes libs/armeabi/libandengine.so | Bin 37840 -> 13384 bytes libs/mips/libandengine.so | Bin 5508 -> 5408 bytes libs/x86/libandengine.so | Bin 5008 -> 5180 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/libs/armeabi-v7a/libandengine.so b/libs/armeabi-v7a/libandengine.so index 8852316d4221e526daff2cb013cb7a10b0c1c515..a49438c178669c1d47a0279cc517b00963037fca 100755 GIT binary patch delta 5589 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 delta 5765 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 diff --git a/libs/armeabi/libandengine.so b/libs/armeabi/libandengine.so index 1d45b72e3903e1d4d5902d9416767cb1337f4433..0892d3bfb0df3408d0108f0cfc95a4a5a32dca11 100755 GIT binary patch delta 3386 zcma)8e{5S<6+X{(W~WKo{AiMPd8}@d4Yy6aq${NhS)0;HVKBB*Hfn~D=fscLlH(Zr z1sV!CNJX@;DQRvc!iqFAO)2LE&DFE zi4YZVNUewll@9^?N{GQhumQ$BP&0_nAU?D2)H9(244^>zN~?&2CHM%hjl+v(%-!na zs6en)uhKjXIgmA}hlQ@zg#07Gn>8Z0L)T+kN7ka`BE!IiCK10KKMuW&@@$9Ye*x_X z%fAAgv&*-NFDGxoQACALL$kt0*N9l53H*T#A^|)8`Lg(9;0eSx*>P1CpLTJql+1$9 zt_>jPlUL#Rrj7`N1GomBbny?tpK$T5*oq&!cn^3xm&vaGD0mogXFx;Xj#w)O-Us7; zmd~NXZ^1F+IKZEDRS2NaPs;euz{7WloL*NN@T+CE2_8T~ID38!JP7_QXN2~C2>u&zHbMR(_!4;1=D!Aiq{Z6O zoK@gD93~u0TUK}v{Aj6w#cL3l2ESm(+riySychgI46xmff3A$j!PBnz*c#83Iy?c# zX;*<~%lOOS=UnkO%lHlOE3Wu|%Xlr0`OR(EcYA8nhz=woqp7baQnAQjIvq)8y3|(xZgs!^s(QF`p)O-&&5?`|8RTEa z7|PC7t-qK;ZSP$F-d<@_c^#BxJv30;M;1j^T z0GG4_ptJ!yfnER!DL6%fOVyHUR&EDATH(oeL(>Ix z0=#IEZI*cOzegk|n_&b2oFl=xvA!xC_AC~W`scPjXY2E}zF_Ma=tlH@ks5Qo4Bdp* ze@~5BT%ks<1!|wjb!u$N5_NSB$xZ{e@(MK?dY2kKuTo>>|4ogNc?+G3-on$18wwKz z|H{jYdG6dR6W7+g_QbXPKhG~Z_O#2MblE3d_PApwQ2D4sV5ePn++{!RvcoR>5NvP{PCO2%#%`7)8_~&c&ExPBab!UpVo?rGa ztj=rkJM_P_osrkWb$W$9-M=ILC$Kld-MUwo)*w8-AKmtpPd_OKHcv@FFWx%6yd(Z+ zl(`%Z>fL&eE^Yb#)rItYgIaiuwfHC`BGF7HIwm2Qrh0u+zX#W| zga${3hmDjeq11?JgoaY1A@TtEXBjtPN4xRD%k5yp8;rut_G^EVheSQJqs;EAy?$44_xlc^XuFs=C|#*v8#w z35USEc^KfW&8b;Wd3;^`tl9V_c$jUBFtg4g;#I$$3RHveWzYUS>isF*j{`DuH=amV zz0p#{s%K3I7r&Pg;}|0BlP!At07Ts4EYUcew4E@^-Q_CC7;zGC=EHCY%IWOsP#z4u dr0J!63X#r|Y5hArQFAnojH2AEL!g~<{{t_ENJanv delta 3665 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 Kxhin+6#5?^S`9Y< diff --git a/libs/x86/libandengine.so b/libs/x86/libandengine.so index a21f3b5e286c36495ca6595f2a144a1622580071..ae62dc3510d6ff2593638387a20e8c3476b4a364 100755 GIT binary patch literal 5180 zcmeHLU1%It6uwEe?W%E2>#EU49c8Gijl;IC617NUw{6s*X_9KCmFZ-6k{#Xb#@R`2 zBw)kZ>as+FR1kbA^hK~pKoLQO>T2tgh>8^PAxbM78l?U__&VaM`7lM)Sm%l ze8~HuZ|uJlv5C|(#$td<=1Tc;bcz(k9Pt+2yOb`yGXwU{DG(t+d}V;|EbN@YqW_N#o_rsGN&DyR#;*>nwHHTem)Ha>MaM2vHN_Gj_bLkk!^6cG?2g8zQWgas#xyQ_5 z%gKv-tzDK`bVp39khKdVPQf;dV`${f&Al53)+RSOyUmgOgSHF*ZqIX_p}wM1Koa82 z(tj2&?OIQ4%-f@O!7Cxq-`KN9826mKdH4A6ulWQygVKjwlXD!b{k%vkp7TQI@?Lt=Mogr3p*IJ`gBvbOT znboU9W;CRkkY@8?=bjScG9b4&*E5%2b1WS?VDN-JGkS{}L5mLybq>#6g zqT@DF1do#s{H)|V$ZO;eNS@7Hg8Yo+b@EB_dn8X)u8aJb#x9KCWLB-UPCtn z^^?eMs`ec8(^>skHLdp|!#HRUXxk-kr1dl!tq`mSje@QNjevGl(CY|d!ZESEHZzTG z2kI}$cy|Ty>M%=%?#a--GjvbTy(@5U-;UbRAEDl_?9e+ao}R38lBQ}uT!F!Q`ugf1 zQkq1#yxvuv)O)K-D}#EZlG6Q|7qN;f??Esr1(0{B!um72sr&$m3|4#fK1Atw_p9bg zT(9)%(dqPFIU)7KzhjD*B6Kv20e`tq{h3MlSCJBONTT0V75yX4b+s_xj@7WhA zFERHvKhx5@Cl>kO=#iQ{TEx>(&%th6V5jx$Ybi$_dZyWnMWhY;dKuV(Y36VF>Ao^S zUlcX1Y`HT9J&&uM7$BF#EGYN)DbN{Emiw!L=S%>3r{v|~7vC?^mto>KmXh1zz z7&)ty69xiN6Ew#1o-ptr!`IFQufe}sW-bdar{H*|<+|2{Fz|?UR2wm@Q70peks`eD zF=R0LZZYs|5k{ss%6FMC3PsO0MhfGw%4cuhWxFM(SYWdM47eVMm`b@mxJLSbP_Xk2Q>gVm3H!fO$?4i)KD0Y zb#Vi6V2AT#0l_I(p!$6R0*-_6c+UI?yEBbrPlH`T!v-?9n@&k|3KLD`ML?iIy=Qcw63+Xz7i literal 5008 zcmeHLU1%KF6~2cNpl{ASzxUjqxwBV)*`3?d(a|9kb%`!Psk&Z>LGY!X&@w1Av0fy_MzKNK zl|Om*z7Xpuz@PE&C4em<#-VTkq?GnfunVwXfStGwnV>xej9>K%*?W;Q0_z}XBc6gC z>^r35_rt!n{~Y=z7z>6G2+;>1z4#e`Qp8UIQa3;!Qdh_X$Hi&*1<(s@0`8PpQ#^8J z|B5&Vita}PQz(7{Yy?=}&w+b@+v&<01%1Ckv6>btd&Iwkhg9)U(Y{8Mvb{z@JIA$z zH6U$31zW?WeA2!|ppaeQ8&T2Q;EHG;K)y2=;L~W+o>oS14Y&cj#s-M><-(?XYIwc? zaG#JiU>0V>rhGDg3-K{6R5E@YCT?xMD(pR2$VcJA{=dA<{~F}A{>R~0#d!8c{$DXQ z>gTu^{}%iev43G0`5DugvdgApzidI=vv=QKV|f4m;b#m3V$C!2FBGvWVrP1fJ!4EePg^eBhds}=C&w#x8AaS-WY#rb+U-~+tL)W&Amp%TJH{Um zPfc0wK{RW|3uSx!uqR4ZDPNuak%7aGQ^{j|S=+Vp$YE0ckvaCbmWrQ3Q#ke{C*;V^ zRINgx<`weWw?{%L;`xXd95xKAV0tFjX0le}V!9qw+wSWha88?MeuvDw>~Au!E%Wl2g2v%IAAW5V_#k&$9`^+BYu?}@&6*n zL2->72T|}ho+iO5b+!bjcybj1v2r;8o#LBaq%DSR$}|;uEUZ+eJU}@^`FSbRwKzt395T41gY~NutrnW|%_n{- zgumK*^!*Gihj%pmA@F)kZ#{{ChR@u`mb}D*|K3UvP=5mYbAAT;4u84#*+b2#MVaq) zXy%(YF&N})`21ENP+#z~Xw|cNEK2d5-hDo+$Dx$nB#|!6vv5Q#eDE;!G9Rm+Z@v@e zLjhrEJoDm*PCcg_^ZiAR?oGrAbP$z z3O5wk3)L8S&;5VT>RB|pp~!&8!H2+O;JfPRw1AZUa`IW`A|YQNY=f=WWWKMlHKOoz z6h07zCmH_Pe;MA_4qx{iw00^#(Ifd_iqX!9M zn8DyxIe1Lv1MR8o*xdDd?soo87(fWWadY5R@DIQj!5z%$S?~+spM&#lBz3&JUv$jH zJ2rR6Vz1zQ(4ga+cnR70jS|C&xZgRFNCWZVM64OvGvG1g-UY6FG&gkNoBBMU!!Ezq zBZ>ebdDYGswHA@k+qzL zsRbW?W7~a|+T~Dtm+sEM-5Iz$1OJy9z!4fO@nQvHn|D!y2t5GsPQ-JVGC%*<0G{s}z8>uEB=Xz`{ww6+7oWLc63h5~ z29+2Gc*gTChmVvfBAD$AIPVonfOk*+7{PAQ=@K4}d zAc11H04d-Pz&_wlK$|onMn^_|rzJ=C9o(i3rXEYp?3k`prX5S$nSKO+>BqEW)y2id zv2csohE%m;&2v3-QlyGztte83*>Y{R6mriMDY#M>HmZ&%Qn;4jX%(Y8QLz9oC5e<> zwmrjiU2|5XaM7|=8#&C9ofoO;3ZmuD^b~%ji&VZ+;#H+RhC66*jW8W@ZMc>MziV78 z64#jE8qt?}t}$^G;CgUv=)<+q{J#hN_^vH|kDm=Y$4Wo>|04KZk7Tg+ zytrtyKKk(;Tt;$UCls+?;w3=&2@L`!Le&JR-TpJ$To>kxX#o6q9w<^Ve}#hi(vg9F VDdiN|Xm9r!*>=LOaho5-{{dk?F}wf(

    Math taken from senocular.com.