/// <summary> /// /// </summary> /// <param name="texture"></param> /// <param name="v0"></param> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="v3"></param> void PushQuad(Texture texture, SpriteVertex v0, SpriteVertex v1, SpriteVertex v2, SpriteVertex v3) { texture = texture ?? defaultTexture; if (groups.Count == 0 || groups[groups.Count - 1].Texture != texture) { groups.Add(new Group { Texture = texture, StartSprite = spriteCount }); } groups[groups.Count - 1].SpriteCount++; spriteCount++; vertices.Add(v0); vertices.Add(v1); vertices.Add(v2); vertices.Add(v0); vertices.Add(v2); vertices.Add(v3); dirty = true; }
/*Color EscColor ( char ch ) { * if (ch=='0') return Color.White; * if (ch=='1') return Color.Red; * if (ch=='2') return Color.Orange; * if (ch=='3') return Color.Yellow; * if (ch=='4') return Color.Green; * if (ch=='5') return Color.Cyan; * if (ch=='6') return Color.Blue; * if (ch=='7') return Color.Magenta; * if (ch=='8') return Color.Black; * if (ch=='9') return Color.Gray; * return Color.White; * } */ /// <summary> /// Draws the string /// </summary> /// <param name="sb"></param> /// <param name="text"></param> /// <param name="xPos"></param> /// <param name="yPos"></param> /// <param name="color"></param> public void DrawString(SpriteLayer spriteBatch, string text, float xPos, float yPos, Color color, int frameIndex = 0, float tracking = 0, bool useBaseLine = true, bool flip = false) { if (text == null) { return; } float x, y; if (!flip) { x = xPos; y = yPos; // - fontInfo.baseLine; if (useBaseLine) { y -= fontInfo.baseLine; } } else { x = yPos; y = xPos; // - fontInfo.baseLine; if (useBaseLine) { x -= fontInfo.baseLine; } } int length = text.Length; float w = fontTexture.Width; float h = fontTexture.Height; for (int i = 0; i < length; i++) { char ch0 = text[i]; if (ch0 == '\n') { y += fontInfo.lineHeight; x = xPos; } char ch1 = (i + 1) < length ? text[i + 1] : '\0'; var chi = GetInfo(ch0); var kerning = GetKerning(ch0, ch1); /*if (ch0=='^' && char.IsDigit(ch1)) { * i++; * color = EscColor(ch1); * continue; * } */ RectangleF dstRect = chi.dstRect; RectangleF srcRect = chi.srcRect; dstRect.X += x; dstRect.Y += y; /*dstRect.Right += x; * dstRect.Bottom += y;*/ if (!flip) { x += chi.xAdvance; x += kerning; x += tracking; } else { x -= chi.xAdvance; x -= kerning; x -= tracking; } //spriteBatch.Draw( fontTexture, dstRect, srcRect, color ); var c = color; // * spriteBatch.ColorMultiplier; if (!flip) { var v0 = new SpriteVertex(new Vector3(dstRect.X, dstRect.Y, 0), c, new Vector2((srcRect.X) / w, (srcRect.Y) / h), frameIndex); var v1 = new SpriteVertex(new Vector3(dstRect.X + dstRect.Width, dstRect.Y, 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y) / h), frameIndex); var v2 = new SpriteVertex(new Vector3(dstRect.X + dstRect.Width, dstRect.Y + dstRect.Height, 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y + srcRect.Height) / h), frameIndex); var v3 = new SpriteVertex(new Vector3(dstRect.X, dstRect.Y + dstRect.Height, 0), c, new Vector2((srcRect.X) / w, (srcRect.Y + srcRect.Height) / h), frameIndex); spriteBatch.DrawQuad(fontTexture, v0, v1, v2, v3); } else { var v0 = new SpriteVertex(new Vector3(dstRect.Y, dstRect.X, 0), c, new Vector2((srcRect.X) / w, (srcRect.Y) / h), frameIndex); var v1 = new SpriteVertex(new Vector3(dstRect.Y, dstRect.X - dstRect.Width, 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y) / h), frameIndex); var v2 = new SpriteVertex(new Vector3(dstRect.Y + dstRect.Height, dstRect.X - dstRect.Width, 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y + srcRect.Height) / h), frameIndex); var v3 = new SpriteVertex(new Vector3(dstRect.Y + dstRect.Height, dstRect.X, 0), c, new Vector2((srcRect.X) / w, (srcRect.Y + srcRect.Height) / h), frameIndex); spriteBatch.DrawQuad(fontTexture, v0, v1, v2, v3); } } }
/// <summary> /// Draws arbitrary quad with specified vertices. /// </summary> /// <param name="texture"></param> /// <param name="v0"></param> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="v3"></param> internal void DrawQuad(Texture texture, SpriteVertex v0, SpriteVertex v1, SpriteVertex v2, SpriteVertex v3) { PushQuad(texture, v0, v1, v2, v3); }
/*Color EscColor ( char ch ) { if (ch=='0') return Color.White; if (ch=='1') return Color.Red; if (ch=='2') return Color.Orange; if (ch=='3') return Color.Yellow; if (ch=='4') return Color.Green; if (ch=='5') return Color.Cyan; if (ch=='6') return Color.Blue; if (ch=='7') return Color.Magenta; if (ch=='8') return Color.Black; if (ch=='9') return Color.Gray; return Color.White; } */ /// <summary> /// Draws the string /// </summary> /// <param name="sb"></param> /// <param name="text"></param> /// <param name="xPos"></param> /// <param name="yPos"></param> /// <param name="color"></param> public void DrawString( SpriteLayer spriteBatch, string text, float xPos, float yPos, Color color, int frameIndex=0, float tracking = 0, bool useBaseLine = true, bool flip = false ) { if (text==null) { return; } float x, y; if (!flip) { x = xPos; y = yPos;// - fontInfo.baseLine; if (useBaseLine) { y -= fontInfo.baseLine; } } else { x = yPos; y = xPos;// - fontInfo.baseLine; if (useBaseLine) { x -= fontInfo.baseLine; } } int length = text.Length; float w = fontTexture.Width; float h = fontTexture.Height; for (int i=0; i<length; i++) { char ch0 = text[i]; if (ch0 == '\n') { y += fontInfo.lineHeight; x = xPos; } char ch1 = (i+1)<length ? text[i+1] : '\0'; var chi = GetInfo(ch0); var kerning = GetKerning( ch0, ch1 ); /*if (ch0=='^' && char.IsDigit(ch1)) { i++; color = EscColor(ch1); continue; } */ RectangleF dstRect = chi.dstRect; RectangleF srcRect = chi.srcRect; dstRect.X += x; dstRect.Y += y; /*dstRect.Right += x; dstRect.Bottom += y;*/ if (!flip) { x += chi.xAdvance; x += kerning; x += tracking; } else { x -= chi.xAdvance; x -= kerning; x -= tracking; } //spriteBatch.Draw( fontTexture, dstRect, srcRect, color ); var c = color;// * spriteBatch.ColorMultiplier; if (!flip) { var v0 = new SpriteVertex( new Vector3(dstRect.X, dstRect.Y , 0), c, new Vector2((srcRect.X ) / w, (srcRect.Y ) / h), frameIndex ); var v1 = new SpriteVertex( new Vector3(dstRect.X + dstRect.Width, dstRect.Y , 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y ) / h), frameIndex ); var v2 = new SpriteVertex( new Vector3(dstRect.X + dstRect.Width, dstRect.Y + dstRect.Height, 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y + srcRect.Height) / h), frameIndex ); var v3 = new SpriteVertex( new Vector3(dstRect.X, dstRect.Y + dstRect.Height, 0), c, new Vector2((srcRect.X ) / w, (srcRect.Y + srcRect.Height) / h), frameIndex ); spriteBatch.DrawQuad( fontTexture, v0, v1, v2, v3 ); } else { var v0 = new SpriteVertex( new Vector3(dstRect.Y , dstRect.X , 0), c, new Vector2((srcRect.X ) / w, (srcRect.Y ) / h), frameIndex ); var v1 = new SpriteVertex( new Vector3(dstRect.Y , dstRect.X - dstRect.Width, 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y ) / h), frameIndex ); var v2 = new SpriteVertex( new Vector3(dstRect.Y + dstRect.Height, dstRect.X - dstRect.Width, 0), c, new Vector2((srcRect.X + srcRect.Width) / w, (srcRect.Y + srcRect.Height) / h), frameIndex ); var v3 = new SpriteVertex( new Vector3(dstRect.Y + dstRect.Height, dstRect.X , 0), c, new Vector2((srcRect.X ) / w, (srcRect.Y + srcRect.Height) / h), frameIndex ); spriteBatch.DrawQuad( fontTexture, v0, v1, v2, v3 ); } } }
/// <summary> /// Draws arbitrary quad with specified vertices. /// </summary> /// <param name="texture"></param> /// <param name="v0"></param> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="v3"></param> internal void DrawQuad ( Texture texture, SpriteVertex v0, SpriteVertex v1, SpriteVertex v2, SpriteVertex v3 ) { PushQuad( texture, v0, v1, v2, v3 ); }
/// <summary> /// /// </summary> /// <param name="texture"></param> /// <param name="v0"></param> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="v3"></param> void PushQuad ( Texture texture, SpriteVertex v0, SpriteVertex v1, SpriteVertex v2, SpriteVertex v3 ) { texture = texture ?? defaultTexture; if ( groups.Count == 0 || groups[groups.Count-1].Texture != texture ) { groups.Add( new Group { Texture = texture, StartSprite = spriteCount } ); } groups[groups.Count-1].SpriteCount++; spriteCount++; vertices.Add( v0 ); vertices.Add( v1 ); vertices.Add( v2 ); vertices.Add( v0 ); vertices.Add( v2 ); vertices.Add( v3 ); dirty = true; }