void SpriteRenderer::RenderText(const SpriteFont& font, const wchar* text, const Float4x4& transform, const Float4& color) { D3DPERF_BeginEvent(0xFFFFFFFF, L"SpriteRenderer RenderText"); size_t length = wcslen(text); Float4x4 textTransform; uint64 numCharsToDraw = std::min(length, MaxBatchSize); uint64 currentDraw = 0; for(uint64 i = 0; i < numCharsToDraw; ++i) { wchar character = text[i]; if(character == ' ') textTransform._41 += font.SpaceWidth(); else if(character == '\n') { textTransform._42 += font.CharHeight(); textTransform._41 = 0; } else { SpriteFont::CharDesc desc = font.GetCharDescriptor(character); textDrawData[currentDraw].Transform = textTransform * transform; textDrawData[currentDraw].Color = color; textDrawData[currentDraw].DrawRect.x = desc.X; textDrawData[currentDraw].DrawRect.y = desc.Y; textDrawData[currentDraw].DrawRect.z = desc.Width; textDrawData[currentDraw].DrawRect.w = desc.Height; currentDraw++; textTransform._41 += desc.Width + 1; } } // Submit a batch RenderBatch(font.SRView(), textDrawData, currentDraw); D3DPERF_EndEvent(); if(length > numCharsToDraw) RenderText(font, text + numCharsToDraw, textTransform, color); }
void SpriteRenderer::RenderText(const SpriteFont& font, const WCHAR* text, const XMMATRIX& transform, const XMFLOAT4& color) { D3DPERF_BeginEvent(0xFFFFFFFF, L"SpriteRenderer RenderText"); size_t length = wcslen(text); XMMATRIX textTransform = XMMatrixIdentity(); UINT64 numCharsToDraw = min(length, MaxBatchSize); UINT64 currentDraw = 0; for (UINT64 i = 0; i < numCharsToDraw; ++i) { WCHAR character = text[i]; if(character == ' ') textTransform._41 += font.SpaceWidth(); else if(character == '\n') { textTransform._42 += font.CharHeight(); textTransform._41 = 0; } else { SpriteFont::CharDesc desc = font.GetCharDescriptor(character); textDrawData[currentDraw].Transform = XMMatrixMultiply(textTransform, transform); textDrawData[currentDraw].Color = color; textDrawData[currentDraw].DrawRect.x = desc.X; textDrawData[currentDraw].DrawRect.y = desc.Y; textDrawData[currentDraw].DrawRect.z = desc.Width; textDrawData[currentDraw].DrawRect.w = desc.Height; currentDraw++; textTransform._41 += desc.Width + 1; } } // Submit a batch RenderBatch(font.SRView(), textDrawData, currentDraw); D3DPERF_EndEvent(); if(length > numCharsToDraw) RenderText(font, text + numCharsToDraw, textTransform, color); }