All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.badlogic.gdx.tests.g3d.BaseG3dHudTest Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.tests.g3d;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputMultiplexer;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Matrix4;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.List;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Window;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Scaling;
import com.badlogic.gdx.utils.StringBuilder;
import com.badlogic.gdx.utils.viewport.ScalingViewport;

public abstract class BaseG3dHudTest extends BaseG3dTest {
	public final static int PREF_HUDWIDTH = 640;
	public final static int PREF_HUDHEIGHT = 480;
	public final static float rotationSpeed = 0.02f * 360f; // degrees per second
	public final static float moveSpeed = 0.25f; // cycles per second

	protected Stage hud;
	protected float hudWidth, hudHeight;
	protected Skin skin;
	protected Label fpsLabel;
	protected CollapsableWindow modelsWindow;
	protected CheckBox gridCheckBox, rotateCheckBox, moveCheckBox;
	protected final StringBuilder stringBuilder = new StringBuilder();
	protected final Matrix4 transform = new Matrix4();
	protected float moveRadius = 2f;

	protected String models[] = new String[] {"car.obj", "cube.obj", "scene.obj", "scene2.obj", "wheel.obj", "g3d/invaders.g3dj",
		"g3d/head.g3db", "g3d/knight.g3dj", "g3d/knight.g3db", "g3d/monkey.g3db", "g3d/ship.obj", "g3d/shapes/cube_1.0x1.0.g3dj",
		"g3d/shapes/cube_1.5x1.5.g3dj", "g3d/shapes/sphere.g3dj", "g3d/shapes/teapot.g3dj", "g3d/shapes/torus.g3dj"};

	@Override
	public void create () {
		super.create();

		createHUD();

		Gdx.input.setInputProcessor(new InputMultiplexer(hud, this, inputController));
	}

	protected void createHUD () {
		hud = new Stage(new ScalingViewport(Scaling.fit, PREF_HUDWIDTH, PREF_HUDHEIGHT));
		hudWidth = hud.getWidth();
		hudHeight = hud.getHeight();
		skin = new Skin(Gdx.files.internal("data/uiskin.json"));

		final List modelsList = new List(skin);
		modelsList.setItems(models);
		modelsList.addListener(new ClickListener() {
			@Override
			public void clicked (InputEvent event, float x, float y) {
				if (!modelsWindow.isCollapsed() && getTapCount() == 2) {
					onModelClicked(modelsList.getSelected());
					modelsWindow.collapse();
				}
			}
		});
		modelsWindow = addListWindow("Models", modelsList, 0, -1);

		fpsLabel = new Label("FPS: 999", skin);
		hud.addActor(fpsLabel);
		gridCheckBox = new CheckBox("Show grid", skin);
		gridCheckBox.setChecked(showAxes);
		gridCheckBox.addListener(new ChangeListener() {
			@Override
			public void changed (ChangeEvent event, Actor actor) {
				showAxes = gridCheckBox.isChecked();
			}
		});
		gridCheckBox.setPosition(hudWidth - gridCheckBox.getWidth(), 0);
		hud.addActor(gridCheckBox);

		rotateCheckBox = new CheckBox("Rotate", skin);
		rotateCheckBox.setChecked(true);
		rotateCheckBox.setPosition(hudWidth - rotateCheckBox.getWidth(), gridCheckBox.getHeight());
		hud.addActor(rotateCheckBox);

		moveCheckBox = new CheckBox("Move", skin);
		moveCheckBox.setChecked(false);
		moveCheckBox.setPosition(hudWidth - moveCheckBox.getWidth(), rotateCheckBox.getTop());
		hud.addActor(moveCheckBox);
	}

	protected CollapsableWindow addListWindow (String title, List list, float x, float y) {
		CollapsableWindow window = new CollapsableWindow(title, skin);
		window.row();
		ScrollPane pane = new ScrollPane(list, skin);
		pane.setFadeScrollBars(false);
		window.add(pane);
		window.pack();
		window.pack();
		if (window.getHeight() > hudHeight) {
			window.setHeight(hudHeight);
		}
		window.setX(x < 0 ? hudWidth - (window.getWidth() - (x + 1)) : x);
		window.setY(y < 0 ? hudHeight - (window.getHeight() - (y + 1)) : y);
		window.layout();
		window.collapse();
		hud.addActor(window);
		pane.setScrollX(0);
		pane.setScrollY(0);
		return window;
	}

	protected abstract void onModelClicked (final String name);

	protected void getStatus (final StringBuilder stringBuilder) {
		stringBuilder.append("FPS: ").append(Gdx.graphics.getFramesPerSecond());
		if (loading) stringBuilder.append(" loading...");
	}

	protected float rotation, movement;

	@Override
	public void render () {
		transform.idt();
		if (rotateCheckBox.isChecked())
			transform.rotate(Vector3.Y, rotation = (rotation + rotationSpeed * Gdx.graphics.getDeltaTime()) % 360);
		if (moveCheckBox.isChecked()) {
			movement = (movement + moveSpeed * Gdx.graphics.getDeltaTime()) % 1f;
			final float sm = MathUtils.sin(movement * MathUtils.PI2);
			final float cm = MathUtils.cos(movement * MathUtils.PI2);
			transform.trn(0, moveRadius * cm, moveRadius * sm);
		}

		super.render();

		stringBuilder.setLength(0);
		getStatus(stringBuilder);
		fpsLabel.setText(stringBuilder);
		hud.act(Gdx.graphics.getDeltaTime());
		hud.draw();
	}

	@Override
	public void resize (int width, int height) {
		super.resize(width, height);
		hud.getViewport().update(width, height, true);
		hudWidth = hud.getWidth();
		hudHeight = hud.getHeight();
	}

	@Override
	public void dispose () {
		super.dispose();
		skin.dispose();
		skin = null;
	}

	/** Double click title to expand/collapse */
	public static class CollapsableWindow extends Window {
		private boolean collapsed;
		private float collapseHeight = 20f;
		private float expandHeight;

		public CollapsableWindow (String title, Skin skin) {
			super(title, skin);
			addListener(new ClickListener() {
				@Override
				public void clicked (InputEvent event, float x, float y) {
					if (getTapCount() == 2 && getHeight() - y <= getPadTop() && y < getHeight() && x > 0 && x < getWidth())
						toggleCollapsed();
				}
			});
		}

		public void expand () {
			if (!collapsed) return;
			setHeight(expandHeight);
			setY(getY() - expandHeight + collapseHeight);
			collapsed = false;
		}

		public void collapse () {
			if (collapsed) return;
			expandHeight = getHeight();
			setHeight(collapseHeight);
			setY(getY() + expandHeight - collapseHeight);
			collapsed = true;
			if (getStage() != null) getStage().setScrollFocus(null);
		}

		public void toggleCollapsed () {
			if (collapsed)
				expand();
			else
				collapse();
		}

		public boolean isCollapsed () {
			return collapsed;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy