jvcleave / ofxImGui

Use ImGui in openFrameworks
296 stars 124 forks source link

AddFont should before ui.setup() otherwise font wont build #19

Open Geistyp opened 8 years ago

Geistyp commented 8 years ago

README.md is like this, but not work for me

void ofApp::setup()
{
  m_ui.setup();

  ImGuiIO * io = &ImGui::GetIO();
  io->Fonts->AddFontFromFileTTF(&ofToDataPath("NotoSans.ttf")[0], 24.f);
}

Font texture create in setup()->createDeviceObjects()

bool EngineGLFW::createDeviceObjects()
{
    ......
    unsigned char * pixels;
    int width, height;
    io->Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);

    GLuint textureid = loadTextureImage2D(pixels, width, height);
    io->Fonts->TexID = (ImTextureID)(intptr_t)textureid;

    io->Fonts->ClearTexData();

    return true;
}

So after setup(), I can't add any font, below code work for me

ImGuiIO * io = &ImGui::GetIO();
ImFontConfig font_config; font_config.OversampleH = 1; font_config.OversampleV = 1; font_config.PixelSnapH = 1; 
ImFont* f = io->Fonts->AddFontFromFileTTF("data/Deng.ttf", 18.0f, NULL, io->Fonts->GetGlyphRangesChinese());

gui.setup();

By the way, this line is important to add unicode font, or you just see white grid.

ImFontConfig font_config; font_config.OversampleH = 1; font_config.OversampleV = 1; font_config.PixelSnapH = 1; 
jvcleave commented 8 years ago

Can you try after commenting out io->Fonts->ClearTexData();

Geistyp commented 8 years ago

setup() AddFont()

comment io->Fonts->ClearTexData();

font texture still not allocate, maybe separate a method to create font texture

bool ImGui_ImplGlfwGL3_CreateFontsTexture()
rjx-ray commented 7 years ago

Hi Guys,

I'm struggling to use a Unicode font (need it for arrows on buttons) I have this code in ofApp::setup()

    // Load unicode font, has to be done before gui set up - see https://github.com/jvcleave/ofxImGui/issues/19
    ImGuiIO * io = &ImGui::GetIO();
    ImFontConfig font_config; font_config.OversampleH = 1; font_config.OversampleV = 1; font_config.PixelSnapH = 1;
    // load Lucinda SansRegular Unicode font - file name L_10646.TTF
    unicodeFont = io->Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\L_10646.ttf", 16.0f, NULL, io->Fonts->GetGlyphRangesDefault());
    unsigned char * pixels;
    int width, height;
    io->Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
    gui.setup();
    ImGui::GetIO().MouseDrawCursor = false;

But I can't work out how to swap between the default font and my unicode one. I just always get the unicode one, and it doesn't look very crisp.

Then even when using the Unicode font I just get a question mark in the button from this

ImGui::Button(u8"\u2190");  // Unicode left arrow 

Any advice greatly appreciated

Thanks Richard

rjx-ray commented 7 years ago

I figured it out eventually, my code is now

// Load unicode font, has to be done before gui set up - see https://github.com/jvcleave/ofxImGui/issues/19 
    io = &ImGui::GetIO();
    //  set default font in font atlas
    ImFont* font0 = io->Fonts->AddFontDefault();
    // load Lucinda SansRegular Unicode font - file name L_10646.TTF
    ImFontConfig font_config; font_config.OversampleH = 1; font_config.OversampleV = 1; font_config.PixelSnapH = 1;
    static const ImWchar glyphRanges[] = {  0x0020, 0x266F, 0, }; // Everything
    unicodeFont = io->Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\L_10646.ttf", 18.0f, &font_config, &glyphRanges[0]);
    unsigned char* pixels;
    int width, height;
    io->Fonts->GetTexDataAsAlpha8(&pixels, &width, &height);
armadillu commented 6 years ago

For anyone trying to change the font on today's master; this currently works:

//create an actual ImGui context before setting up the addon
ImGui::CreateContext();  
//specify a font to use
&ImGui::GetIO().Fonts->AddFontFromFileTTF(&ofToDataPath("fonts/VeraMono.ttf")[0], 14.f);

gui.setup();  //finally setup the addon ofxImGui::Gui setup;

The trick is to create the native ImGui context before adding a font; otherwise ImGui complains about not being initalized... And if you add the font after setting up the addon, it's already too late.

Note that ofxImGui's setup() (gui.setup()) does internally call ImGui::CreateContext(); again, but it's not a problem as this second call is ignored.