/// <summary> /// /// </summary> /// <param name="parent"></param> /// <param name="pcolor"></param> /// <param name="movieClip"></param> private void renderDisplayObjectContainer(DisplayObjectContainer parent, Color pcolor, bool movieClip) { if (phaseId == 0) { if (parent.updateCounter != updateCounter) { sameUpdateCounter = false; } } else if (phaseId == 1) { parent.updateCounter = Time.frameCount; } for (int i = 0; i < parent.numChildren; i++) { if (movieClip) { MovieClip obj2 = parent.getChildAt(i) as MovieClip; if (obj2.visible) { BitmapAssetInfo info = obj2.bmpInfo; renderGraphics(info, obj2, obj2.colorTransform); renderDisplayObjectContainer(obj2, obj2.colorTransform, false); } } else { DisplayObjectContainer obj2 = parent.getChildAt(i) as DisplayObjectContainer; BitmapAssetInfo info = obj2.bmpInfo; renderGraphics(info, obj2, pcolor); renderDisplayObjectContainer(obj2, pcolor, false); } } }
/// <summary> /// /// </summary> /// <param name="frameNum"></param> /// <param name="isFrameUpdate"></param> protected void _setFrame(int frameNum, bool isFrameUpdate) { if (m_FrameNum == frameNum) { return; } if (frameNum < 0) { frameNum = 0; } else if (frameNum >= totalFrames) { frameNum = totalFrames - 1; } m_FrameNum = frameNum; base.m_Children.Clear(); if ((m_FrameNum < 0) || (m_FrameNum >= m_MovieClipInfo.frames.Count)) { return; } DisplayObjectInfo[] displayList = m_MovieClipInfo.frames[m_FrameNum]; int len = displayList.Length; for (int i = 0; i < len; i++) { DisplayObjectInfo dispInfo = displayList[i]; if (m_InstanceCache == null) { m_InstanceCache = new Dictionary <short, DisplayObjectContainer>(); } if (dispInfo.isBitmap) { DisplayObjectContainer displayObject = !m_InstanceCache.ContainsKey(dispInfo.instanceId) ? null : m_InstanceCache[dispInfo.instanceId]; if ((displayObject != null) && (displayObject.cachedCid != dispInfo.cid)) { displayObject = null; } if (displayObject == null) { BitmapAssetInfo bmpInfo = assetContext.bitmaps[dispInfo.cid]; displayObject = new DisplayObjectContainer(); bmpInfo.material = assetContext.material; displayObject.bmpInfo = bmpInfo; displayObject.cachedCid = dispInfo.cid; m_InstanceCache[dispInfo.instanceId] = displayObject; } base.addChild(displayObject); dispInfo.tranform.applyToSprite(displayObject); } else { MovieClipAssetInfo info3 = assetContext.exports[dispInfo.cid]; MovieClipPlayer player = !m_InstanceCache.ContainsKey(dispInfo.instanceId) ? null : (m_InstanceCache[dispInfo.instanceId] is MovieClipPlayer ? (MovieClipPlayer)m_InstanceCache[dispInfo.instanceId] : null); if ((player != null) && (player.cachedCid != dispInfo.cid)) { player = null; } if (player == null) { player = new MovieClipPlayer(null, null); player.setSymbolByCid(assetContext, dispInfo.cid); player.cachedCid = dispInfo.cid; if (isFrameUpdate) { player.m_FrameNum = -1; } else { player.setFrame(1, isFrameUpdate); } m_InstanceCache[dispInfo.instanceId] = player; } base.addChild(player); dispInfo.tranform.applyToSprite(player); } } if (frameCallbacks != null && frameCallbacks.ContainsKey(m_FrameNum)) { frameCallbacks[m_FrameNum](); } if (!string.IsNullOrEmpty(m_NextSymbolName) && frameNum >= totalFrames - 1) { setSymbolName(m_NextSymbolName); } }
/// <summary> /// /// </summary> /// <param name="info"></param> /// <param name="parent"></param> /// <param name="pcolor"></param> /// <param name="renderQueue"></param> private void renderGraphics(BitmapAssetInfo info, DisplayObjectContainer parent, Color pcolor, int renderQueue) { Submesh submesh = null; if (info != null) { Material material = info.material; if (material != null) { material.renderQueue = renderQueue; if (phaseId == 0) { if (currentMaterial != material) { if (currentMaterial != null) { AppSubMesh(); triId = 0; numIndex = 0; } currentMaterial = material; } numVerts += 4; numIndex += 6; quadCount++; zDrawOffset += zSpace; } else if (phaseId == 1) { if (currentMaterial != material) { subMeshId++; currentMaterial = material; triId = 0; submesh = submeshIndices[subMeshId]; } float x = 0f; float y = 0f; float drawWidth = info.srcRect.width; float drawHeight = info.srcRect.height; Rect drawSrcRect = info.uvRect; float zDrawOffset = this.zDrawOffset; Matrix matrix = parent._fastGetFullMatrixRef(); lowerLeftUV.x = drawSrcRect.x; lowerLeftUV.y = 1f - drawSrcRect.y; UVDimensions.x = drawSrcRect.width; UVDimensions.y = drawSrcRect.height; tmpUv.x = lowerLeftUV.x + UVDimensions.x; tmpUv.y = lowerLeftUV.y; UVs[UVId++] = tmpUv; tmpUv.x = lowerLeftUV.x + UVDimensions.x; tmpUv.y = lowerLeftUV.y - UVDimensions.y; UVs[UVId++] = tmpUv; tmpUv.x = lowerLeftUV.x; tmpUv.y = lowerLeftUV.y - UVDimensions.y; UVs[UVId++] = tmpUv; tmpUv.x = lowerLeftUV.x; tmpUv.y = lowerLeftUV.y; UVs[UVId++] = tmpUv; if (!simpleGeneration) { colors[ColourId++] = white; colors[ColourId++] = white; colors[ColourId++] = white; colors[ColourId++] = white; } else { float alpha = parent.getInheritedAlpha(); Color color = pcolor; if (alpha <= 0.95f || alpha >= 0.05f) { Color tem = Color.white; tem.a = alpha; color = pcolor * tem; } colors[ColourId++] = color; colors[ColourId++] = color; colors[ColourId++] = color; colors[ColourId++] = color; } vertices[VertId++] = matrix.transformVector3Static(x + drawWidth, y, zDrawOffset); vertices[VertId++] = matrix.transformVector3Static(x + drawWidth, y + drawHeight, zDrawOffset); vertices[VertId++] = matrix.transformVector3Static(x, y + drawHeight, zDrawOffset); vertices[VertId++] = matrix.transformVector3Static(x, y, zDrawOffset); if (submesh == null) { submesh = submeshIndices[subMeshId]; } int[] triangles = submesh.triangles; int num11 = quadCount * 4; triangles[triId++] = num11; triangles[triId++] = num11 + 1; triangles[triId++] = num11 + 3; triangles[triId++] = num11 + 3; triangles[triId++] = num11 + 1; triangles[triId++] = num11 + 2; quadCount++; zDrawOffset += zSpace; } } } }
void HandleCharsTag( XmlNode pParent ) { fontInfo.cursorMinY = float.MaxValue; fontInfo.cursorMaxY = 0; foreach (XmlNode node in pParent) { if( node.Name == "char" ) { // Get BMFont char attributes int page = (int)int.Parse( node.Attributes[ "page" ].InnerText ); char charCode = (char)int.Parse( node.Attributes[ "id" ].InnerText ); float x = float.Parse( node.Attributes[ "x" ].InnerText ); float y = float.Parse( node.Attributes[ "y" ].InnerText ); float width = float.Parse( node.Attributes[ "width" ].InnerText ); float height = float.Parse( node.Attributes[ "height" ].InnerText ); //float xoffset = float.Parse( node.Attributes[ "xoffset" ].InnerText ); float yoffset = float.Parse( node.Attributes[ "yoffset" ].InnerText ); float xadvance = float.Parse( node.Attributes[ "xadvance" ].InnerText ); // Create asset for char BitmapAssetInfo bmpInfo = new BitmapAssetInfo(); bmpInfo.textureUri = pages[ page ]; bmpInfo.srcRect = new Rect( x,y,width,height ); bmpInfo.shapeRect = new Rect( x,y,width,height ); int cid = ctx.genUniqueCid(); ctx.exports[ cid ] = bmpInfo; bmpInfo.bitmapData = ctx.textureManager.getBitmapDataFromSceneTexture( bmpInfo.textureUri, fontAsset.textures[0] ); // Create char info BitmapFontCharInfo bmpChar = new BitmapFontCharInfo(); bmpChar.c = charCode; bmpChar.charHeight = width; bmpChar.charWidth = xadvance; bmpChar.charStartX = 0; bmpChar.charStartY = yoffset; bmpChar.topLine = yoffset; bmpChar.cid = cid; fontInfo.characters[ charCode ] = bmpChar; if( yoffset < fontInfo.cursorMinY || fontInfo.cursorMinY == float.MaxValue ) { fontInfo.cursorMinY = yoffset; } if( yoffset + height > fontInfo.cursorMaxY ) { fontInfo.cursorMaxY = yoffset + height; } } } }