ofxImGui icon indicating copy to clipboard operation
ofxImGui copied to clipboard

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

Open Geistyp opened this issue 9 years ago • 7 comments

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; 

Geistyp avatar Jan 04 '16 09:01 Geistyp

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

jvcleave avatar Jan 04 '16 09:01 jvcleave

setup() AddFont()

comment io->Fonts->ClearTexData();

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

bool ImGui_ImplGlfwGL3_CreateFontsTexture()

Geistyp avatar Jan 04 '16 09:01 Geistyp

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 avatar May 08 '17 10:05 rjx-ray

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);

rjx-ray avatar May 10 '17 06:05 rjx-ray

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.

armadillu avatar Mar 12 '18 22:03 armadillu