This might or might not be the answer to your question within your parameters at all, but you can use SET_DRAW_ORIGIN/CLEAR_DRAW_ORIGIN to draw 2D stuff at 3D coords.

An example, code I use for some debugging stuff:

void showDebugInfo3D(Vector3 location, float baseSize, const std::vector<std::string> &textLines, Color backgroundColor, Color fontColor) { Vector3 cameraPos = CAM::GET_GAMEPLAY_CAM_COORD(); float distance = Distance(cameraPos, location); float totalMult = baseSize / (distance * (CAM::GET_GAMEPLAY_CAM_FOV() / 60.0f)); float height = 0.0125f * totalMult; GRAPHICS::SET_DRAW_ORIGIN(location.x, location.y, location.z, 0); int i = 0; float szX = 0.000f; for (auto line : textLines) { float currWidth = getStringWidth(line, 0.2f* totalMult, 0); showText(0.0f, 0.0f + height * i, 0.2f * totalMult, line, 0, fontColor, true); if (currWidth > szX) szX = currWidth; i++; } float szY = height * i; GRAPHICS::DRAW_RECT(0.0f + szX/2.0f, (height * i) / 2.0f, szX, szY, backgroundColor.R, backgroundColor.G, backgroundColor.B, backgroundColor.A); GRAPHICS::CLEAR_DRAW_ORIGIN(); }

Where ShowText() and the rectangle draws are simply 2D on-screen draws - but using (0,0) within the SET_DRAW_ORIGIN block draws them at the desired coordinate (if on-screen) as if they're in 3D, though you'll have to scale the thing yourself to get it appear properly at distance and zoom levels.

This can be called for many entities though you will run into the limitation of how much text can be drawn at a time.

For the scaleform answer - I don't know. You could try looking at how some other mods (garage mods?) draw multiple vehicle info.