Example #1
0
int main(int argc, char **argv)
{
	printf("GamuiTest started.\n");

	// SDL initialization steps.
	if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE | SDL_INIT_TIMER | SDL_INIT_AUDIO) < 0)
	{
		printf("SDL initialization failed: %s\n", SDL_GetError());
		exit(1);
	}

	SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
	SDL_Window *screen = SDL_CreateWindow("Gamui",
										  50, 50,
										  screenX, screenY,
										  SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
	SDL_GL_CreateContext(screen);
	glewInit();
	Screenport screenport(screenX, screenY);
	screenport.SetUI(GPUDevice::Instance());
	printf("Window created.\n");

	// Load text texture
	Texture* textTexture = new Texture();
	{
#if BRIDGE == 0
		SDL_Surface* textSurface = SDL_LoadBMP("./gamui/stdfont2.bmp");
		textTexture->Set("text", textSurface->w, textSurface->h, TextureType::TEX_RGBA16, Texture::PARAM_NEAREST);
		textTexture->UploadAlphaToRGBA16((const uint8_t*)textSurface->pixels, textSurface->pitch * textSurface->h);
		SDL_FreeSurface(textSurface);
#else
		textTexture->Set("text", TEXT_TEXTURE_SIZE, TEXT_TEXTURE_SIZE, TextureType::TEX_RGBA16, Texture::PARAM_NEAREST);
#endif
	}
	CHECK_GL_ERROR;

	Texture* imageTexture = new Texture();
	{
		// Load a bitmap, and flip the R-B byte order.
		SDL_Surface* surface = SDL_LoadBMP("./gamui/buttons.bmp");
		SDL_Surface* imageSurface = SDL_CreateRGBSurface(0, surface->w, surface->h, 24, 0xff, 0xff00, 0xff0000, 0);
		SDL_BlitSurface(surface, 0, imageSurface, 0);

		imageTexture->Set("image", imageSurface->w, imageSurface->h, TextureType::TEX_RGB24, 0);
		imageTexture->Upload((const uint8_t*)imageSurface->pixels, imageSurface->pitch * imageSurface->h);

		SDL_FreeSurface(surface);
		SDL_FreeSurface(imageSurface);
	}

	RenderAtom nullAtom;

	// 256, 128
	RenderAtom textAtom(UIRenderer::RENDERSTATE_UI_TEXT, textTexture, 0, 0, 0, 0);
	RenderAtom textAtomD = textAtom;
	textAtomD.renderState = (const void*)UIRenderer::RENDERSTATE_UI_TEXT_DISABLED;

	RenderAtom whiteAtom(UIRenderer::RENDERSTATE_UI_NORMAL, imageTexture, 0.1f, 0.4f, 0.2f, 0.45f);

	// 100x100
	RenderAtom imageAtom(UIRenderer::RENDERSTATE_UI_NORMAL, imageTexture, 0.5f, 0.5f, 228.f / 256.f, 28.f / 256.f);

	// 50x50
	//RenderAtom decoAtom( RENDERSTATE_NORMAL, imageTextureID, 0, 0.25f, 0.25f, 0.f );
	RenderAtom decoAtom = nullAtom;
	RenderAtom decoAtomD = decoAtom;
	decoAtomD.renderState = (const void*)UIRenderer::RENDERSTATE_UI_DISABLED;

	TextMetrics textMetrics;
	UIRenderer renderer(0);

	CHECK_GL_ERROR;
	Gamui gamui;
	gamui.Init(&renderer);
#if BRIDGE == 0
	gamui.SetText(textAtom, textAtomD, &textMetrics);
#endif
	gamui.SetScale(screenX, screenY, VIRTUAL_Y);

#if BRIDGE == 1
	GamuiFreetypeBridge* bridge = new GamuiFreetypeBridge();
	//bridge->Init("./gamui/OpenSans-Regular.ttf");
	bridge->Init("./gamui/DidactGothic.ttf");
	int textHeightInPixels = (int)gamui.TransformVirtualToPhysical(16);
	GenerateTextTexture(textHeightInPixels, bridge, textTexture);

	textAtom.textureHandle  = textTexture;
	textAtomD.textureHandle = textTexture;
	gamui.SetText(textAtom, textAtomD, bridge);
#endif

	TextLabel textLabel[2];
	textLabel[0].Init(&gamui);
	textLabel[1].Init(&gamui);

	textLabel[0].SetText("Hello Gamui. This is text\n"
						 "with line breaks, that is\n"
						 "positioned at the origin.");
	textLabel[1].SetText("Very long text to test the string allocator.\nAnd some classic kerns: VA AV.");
	textLabel[1].SetPos(10, 200);

	Image image0;
	image0.Init(&gamui, imageAtom, true);
	image0.SetPos(50, 50);
	image0.SetSize(100, 100);

	Image image1;
	image1.Init(&gamui, imageAtom, true);
	image1.SetPos(50, 200);
	image1.SetSize(125, 125);

	Image image2;
	image2.Init(&gamui, imageAtom, true);
	image2.SetPos(200, 50);
	image2.SetSize(50, 50);

	Image image2b;
	image2b.Init(&gamui, imageAtom, true);
	image2b.SetPos(270, 50);
	image2b.SetSize(50, 50);

	Image image2c;
	image2c.Init(&gamui, imageAtom, true);
	image2c.SetPos(200, 120);
	image2c.SetSize(50, 50);

	Image image2d;
	image2d.Init(&gamui, imageAtom, true);
	image2d.SetPos(270, 120);
	image2d.SetSize(50, 50);

	Image image3;
	image3.Init(&gamui, imageAtom, true);
	image3.SetPos(200, 200);
	image3.SetSize(125, 125);
	image3.SetSlice(true);

	Canvas canvas;
	canvas.Init(&gamui, whiteAtom);
	canvas.SetPos(500, 0);
	canvas.DrawRectangleOutline(10, 10, 80, 80, 4, 10);

	// 50x50
	RenderAtom up(UIRenderer::RENDERSTATE_UI_NORMAL, imageTexture, 0, 1, (52.f / 256.f), (204.f / 256.f));
	RenderAtom upD = up;
	upD.renderState = (const void*)UIRenderer::RENDERSTATE_UI_DISABLED;

	// 50x50
	RenderAtom down(UIRenderer::RENDERSTATE_UI_NORMAL, imageTexture, 0, 0.75f, (52.f / 256.f), (140.f / 256.f));
	RenderAtom downD(down, UIRenderer::RENDERSTATE_UI_DISABLED);

	PushButton button0(&gamui, up, upD, down, downD, decoAtom, decoAtomD);
	button0.SetPos(350, 50);
	button0.SetSize(150, 75);
	button0.SetText("Button");

	PushButton button1(&gamui, up, upD, down, downD, decoAtom, decoAtomD);
	button1.SetPos(350, 150);
	button1.SetSize(150, 75);
	button1.SetText("Button");
	button1.SetEnabled(false);

	ToggleButton toggle(&gamui, up, upD, down, downD, decoAtom, decoAtomD);
	toggle.SetPos(350, 250);
	toggle.SetSize(150, 50);
	toggle.SetText("Toggle\nLine 2");

	ToggleButton toggle0(&gamui, up, upD, down, downD, decoAtom, decoAtomD);
	toggle0.SetPos(350, 325);
	toggle0.SetSize(75, 50);
	toggle0.SetText("group");

	ToggleButton toggle1(&gamui, up, upD, down, downD, decoAtom, decoAtomD);
	toggle1.SetPos(430, 325);
	toggle1.SetSize(75, 50);
	toggle1.SetText("group");

	ToggleButton toggle2(&gamui, up, upD, down, downD, decoAtom, decoAtomD);
	toggle2.SetPos(510, 325);
	toggle2.SetSize(75, 50);
	toggle2.SetText("group");

	toggle0.AddToToggleGroup(&toggle1);
	toggle0.AddToToggleGroup(&toggle2);

	// 15x30
	RenderAtom tick0(UIRenderer::RENDERSTATE_UI_NORMAL, imageTexture, 0, 0, 0, 0);
	RenderAtom tick1 = tick0, tick2 = tick0;
	tick0.SetCoord(190.f / 256.f, 225.f / 256.f, 205.f / 256.f, 1);
	tick2.SetCoord(190.f / 256.f, 180.f / 256.f, 205.f / 256.f, 210.f / 256.f);
	tick1.SetCoord(230.f / 256.f, 225.f / 256.f, 245.f / 256.f, 1);

	DigitalBar bar;
	bar.Init(&gamui, tick0, tick1);
	bar.SetPos(20, 350);
	bar.SetSize(100, 20);

	TiledImage<2, 2> tiled(&gamui);
	tiled.SetPos(520, 20);
	tiled.SetSize(50, 50);
	tiled.SetTile(0, 0, tick1);
	tiled.SetTile(1, 0, nullAtom);
	tiled.SetTile(0, 1, nullAtom);
	tiled.SetTile(1, 1, tick0);

	bool done = false;
	float range = 0.5f;
	while (!done) {
		SDL_Event event;
		if (SDL_PollEvent(&event)) {
			switch (event.type) {

				case SDL_WINDOWEVENT:
				if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
					screenX = event.window.data1;
					screenY = event.window.data2;
					screenport.Resize(screenX, screenY, GPUDevice::Instance());

					gamui.SetScale(screenX, screenY, VIRTUAL_Y);
#if BRIDGE == 0
					gamui.SetText(textAtom, textAtomD, &textMetrics);
#else	
					int textHeightInPixels = (int)gamui.TransformVirtualToPhysical(16);
					GenerateTextTexture(textHeightInPixels, bridge, textTexture);
					textAtom.textureHandle  = textTexture;
					textAtomD.textureHandle = textTexture;
					gamui.SetText(textAtom, textAtomD, bridge);
#endif
				}
				break;

				case SDL_KEYDOWN:
				{
					switch (event.key.keysym.sym)
					{
						case SDLK_ESCAPE:
						done = true;
						break;
					}
				}
				break;

				case SDL_MOUSEBUTTONDOWN:
				gamui.TapDown((float)event.button.x, (float)event.button.y);
				break;

				case SDL_MOUSEBUTTONUP:
				{
					const UIItem* item = gamui.TapUp((float)event.button.x, (float)event.button.y);
					if (item) {
						range += 0.1f;
						if (range > 1.0f)
							range = 0.0f;
						//							bar.SetRange( 0, range );
					}
				}
				break;

				case SDL_QUIT:
				done = true;
				break;
			}
		}
		GPUDevice::Instance()->Clear(0, 0, 0, 0);

		float rotation = (float)((double)SDL_GetTicks() * 0.05);
		image2b.SetRotationX(rotation);
		image2c.SetRotationY(rotation);
		image2d.SetRotationZ(rotation);

		screenport.SetUI(GPUDevice::Instance());
		gamui.Render();

		SDL_GL_SwapWindow(screen);
	}
	delete textTexture;
#if BRIDGE == 1
	delete bridge; bridge = 0;
#endif
	gamui.SetText(textAtom, textAtomD, 0);
	delete GPUDevice::Instance();
	SDL_Quit();
	return 0;
}