private void createComposedContents() { if (mImage != null) { mImage.removeFromParent(true); mImage = null; } if (mQuadBatch == null) { mQuadBatch = new AsQuadBatch(); mQuadBatch.setTouchable(false); addChild(mQuadBatch); } else { mQuadBatch.reset(); } AsBitmapFont bitmapFont = (AsBitmapFont)(getBitmapFonts()[mFontName]); if (bitmapFont == null) { throw new AsError("Bitmap font not registered: " + mFontName); } bitmapFont.fillQuadBatch(mQuadBatch, mHitArea.getWidth(), mHitArea.getHeight(), mText, mFontSize, mColor, mHAlign, mVAlign, mAutoScale, mKerning); mTextBounds = null; }
public virtual void render(AsDisplayObject _object, AsRenderSupport support, float parentAlpha) { if (getMode() == AsFragmentFilterMode.ABOVE) { _object.render(support, parentAlpha); } if (mCacheRequested) { mCacheRequested = false; mCache = renderPasses(_object, support, 1.0f, true); disposePassTextures(); } if (mCache != null) { mCache.render(support, _object.getAlpha() * parentAlpha); } else { renderPasses(_object, support, parentAlpha, false); } if (getMode() == AsFragmentFilterMode.BELOW) { _object.render(support, parentAlpha); } }
private void disposeCache() { if (mCache != null) { mCache.getTexture().dispose(); mCache.dispose(); mCache = null; } }
public virtual void finishQuadBatch() { AsQuadBatch currentBatch = mQuadBatches[mCurrentQuadBatchID]; if (currentBatch.getNumQuads() != 0) { currentBatch.renderCustom(mProjectionMatrix); currentBatch.reset(); ++mCurrentQuadBatchID; ++mDrawCount; if (mQuadBatches.getLength() <= mCurrentQuadBatchID) { mQuadBatches.push(new AsQuadBatch()); } } }
public virtual void fillQuadBatch(AsQuadBatch quadBatch, float width, float height, String text, float fontSize, uint color, String hAlign, String vAlign, bool autoScale, bool kerning) { AsVector <AsCharLocation> charLocations = arrangeChars(width, height, text, fontSize, hAlign, vAlign, autoScale, kerning); int numChars = (int)(charLocations.getLength()); mHelperImage.setColor(color); if (numChars > 8192) { throw new AsArgumentError("Bitmap Font text is limited to 8192 characters."); } int i = 0; for (; i < numChars; ++i) { AsCharLocation charLocation = charLocations[i]; mHelperImage.setTexture(charLocation._char.getTexture()); mHelperImage.readjustSize(); mHelperImage.setX(charLocation.x); mHelperImage.setY(charLocation.y); mHelperImage.setScaleX(mHelperImage.setScaleY(charLocation.scale)); quadBatch.addImage(mHelperImage); } }
private void createRenderedContents() { if (mQuadBatch != null) { mQuadBatch.removeFromParent(true); mQuadBatch = null; } float scale = AsStarling.getContentScaleFactor(); float width = mHitArea.getWidth() * scale; float height = mHitArea.getHeight() * scale; AsTextFormat textFormat = new AsTextFormat(mFontName, mFontSize * scale, mColor, mBold, mItalic, mUnderline, null, null, mHAlign); textFormat.setKerning(mKerning); sNativeTextField.setDefaultTextFormat(textFormat); sNativeTextField.setWidth(width); sNativeTextField.setHeight(height); sNativeTextField.setAntiAliasType(AsAntiAliasType.ADVANCED); sNativeTextField.setSelectable(false); sNativeTextField.setMultiline(true); sNativeTextField.setWordWrap(true); sNativeTextField.setText(mText); sNativeTextField.setEmbedFonts(true); sNativeTextField.setOwnProperty("filters", mNativeFilters); if (sNativeTextField.getTextWidth() == 0.0f || sNativeTextField.getTextHeight() == 0.0f) { sNativeTextField.setEmbedFonts(false); } if (mAutoScale) { autoScaleNativeTextField(sNativeTextField); } float textWidth = sNativeTextField.getTextWidth(); float textHeight = sNativeTextField.getTextHeight(); float xOffset = 0.0f; if (mHAlign == AsHAlign.LEFT) { xOffset = 2; } else { if (mHAlign == AsHAlign.CENTER) { xOffset = (width - textWidth) / 2.0f; } else { if (mHAlign == AsHAlign.RIGHT) { xOffset = width - textWidth - 2; } } } float yOffset = 0.0f; if (mVAlign == AsVAlign.TOP) { yOffset = 2; } else { if (mVAlign == AsVAlign.CENTER) { yOffset = (height - textHeight) / 2.0f; } else { if (mVAlign == AsVAlign.BOTTOM) { yOffset = height - textHeight - 2; } } } AsBitmapData bitmapData = new AsBitmapData(width, height, true, 0x0); bitmapData.draw(sNativeTextField, new AsMatrix(1, 0, 0, 1, 0, ((int)(yOffset)) - 2)); sNativeTextField.setText(""); if (mTextBounds == null) { mTextBounds = new AsRectangle(); } mTextBounds.setTo(xOffset / scale, yOffset / scale, textWidth / scale, textHeight / scale); AsTexture texture = AsTexture.fromBitmapData(bitmapData, false, false, scale); if (mImage == null) { mImage = new AsImage(texture); mImage.setTouchable(false); addChild(mImage); } else { mImage.getTexture().dispose(); mImage.setTexture(texture); mImage.readjustSize(); } }
private AsQuadBatch renderPasses(AsDisplayObject _object, AsRenderSupport support, float parentAlpha, bool intoCache) { AsTexture cacheTexture = null; AsStage stage = _object.getStage(); AsContext3D context = AsStarling.getContext(); float scale = AsStarling.getCurrent().getContentScaleFactor(); if (stage == null) { throw new AsError("Filtered object must be on the stage."); } if (context == null) { throw new AsMissingContextError(); } support.finishQuadBatch(); support.raiseDrawCount((uint)(mNumPasses)); support.pushMatrix(); support.setBlendMode(AsBlendMode.NORMAL); AsRenderSupport.setBlendFactors(PMA); mProjMatrix.copyFrom(support.getProjectionMatrix()); AsTexture previousRenderTarget = support.getRenderTarget(); if (previousRenderTarget != null) { throw new AsIllegalOperationError("It's currently not possible to stack filters! " + "This limitation will be removed in a future Stage3D version."); } calculateBounds(_object, stage, sBounds); updateBuffers(context, sBounds); updatePassTextures((int)(sBounds.width), (int)(sBounds.height), mResolution * scale); if (intoCache) { cacheTexture = AsTexture.empty((int)(sBounds.width), (int)(sBounds.height), PMA, true, mResolution * scale); } support.setRenderTarget(mPassTextures[0]); support.clear(); support.setOrthographicProjection(sBounds.x, sBounds.y, sBounds.width, sBounds.height); _object.render(support, parentAlpha); support.finishQuadBatch(); AsRenderSupport.setBlendFactors(PMA); support.loadIdentity(); context.setVertexBufferAt(0, mVertexBuffer, AsVertexData.POSITION_OFFSET, AsContext3DVertexBufferFormat.FLOAT_2); context.setVertexBufferAt(1, mVertexBuffer, AsVertexData.TEXCOORD_OFFSET, AsContext3DVertexBufferFormat.FLOAT_2); int i = 0; for (; i < mNumPasses; ++i) { if (i < mNumPasses - 1) { support.setRenderTarget(getPassTexture(i + 1)); support.clear(); } else { if (intoCache) { support.setRenderTarget(cacheTexture); support.clear(); } else { support.setRenderTarget(previousRenderTarget); support.getProjectionMatrix().copyFrom(mProjMatrix); support.translateMatrix(mOffsetX, mOffsetY); support.setBlendMode(_object.getBlendMode()); support.applyBlendMode(PMA); } } AsTexture passTexture = getPassTexture(i); context.setProgramConstantsFromMatrix(AsContext3DProgramType.VERTEX, 0, support.getMvpMatrix3D(), true); context.setTextureAt(0, passTexture.get_base()); activate(i, context, passTexture); context.drawTriangles(mIndexBuffer, 0, 2); deactivate(i, context, passTexture); } context.setVertexBufferAt(0, null); context.setVertexBufferAt(1, null); context.setTextureAt(0, null); support.popMatrix(); if (intoCache) { support.setRenderTarget(previousRenderTarget); support.getProjectionMatrix().copyFrom(mProjMatrix); AsQuadBatch quadBatch = new AsQuadBatch(); AsImage image = new AsImage(cacheTexture); stage.getTransformationMatrix(_object, sTransformationMatrix); AsMatrixUtil.prependTranslation(sTransformationMatrix, sBounds.x + mOffsetX, sBounds.y + mOffsetY); quadBatch.addImage(image, 1.0f, sTransformationMatrix); return(quadBatch); } else { return(null); } }
public virtual void fillQuadBatch(AsQuadBatch quadBatch, float width, float height, String text) { fillQuadBatch(quadBatch, width, height, text, -1, (uint)(0xffffff), "center", "center", true, true); }
public virtual void fillQuadBatch(AsQuadBatch quadBatch, float width, float height, String text, float fontSize, uint color) { fillQuadBatch(quadBatch, width, height, text, fontSize, color, "center", "center", true, true); }
public virtual void fillQuadBatch(AsQuadBatch quadBatch, float width, float height, String text, float fontSize, uint color, String hAlign, String vAlign) { fillQuadBatch(quadBatch, width, height, text, fontSize, color, hAlign, vAlign, true, true); }