gdx-studio

#libgdx#java#desktop

git clone https://git.pyrossh.dev/gdx-studio

An IDE for creating Games using libgdx and Java supported on all platforms Android, iOS, Desktop


src_libs/com/badlogic/gdx/tools/particleeditor/ParticleRenderer.java
package com.badlogic.gdx.tools.particleeditor;

import java.awt.EventQueue;
import java.io.File;

import javax.swing.JOptionPane;

import org.lwjgl.opengl.GL11;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Files.FileType;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.ParticleEmitter;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.ParticleEmitter.NumericValue;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.GdxRuntimeException;

public class ParticleRenderer implements ApplicationListener, InputProcessor {
	/**
	 * 
	 */
	private ParticlePanel particlePanel;

	/**
	 * @param particlePanel
	 */
	public ParticleRenderer(ParticlePanel particlePanel) {
		this.particlePanel = particlePanel;
	}

	private float maxActiveTimer;
	private int maxActive, lastMaxActive;
	private boolean mouseDown;
	private int activeCount;
	private int mouseX, mouseY;
	private BitmapFont font;
	private SpriteBatch spriteBatch;
	private Sprite bgImage; // BOZO - Add setting background image to UI.

	@Override
	public void create () {
		if (spriteBatch != null) return;

		Texture.setEnforcePotImages(false);

		spriteBatch = new SpriteBatch();

		this.particlePanel.worldCamera = new OrthographicCamera();
		this.particlePanel.textCamera = new OrthographicCamera();

		this.particlePanel.pixelsPerMeter = new NumericValue();
		this.particlePanel.pixelsPerMeter.setValue(1.0f);
		this.particlePanel.pixelsPerMeter.setAlwaysActive(true);

		this.particlePanel.zoomLevel = new NumericValue();
		this.particlePanel.zoomLevel.setValue(1.0f);
		this.particlePanel.zoomLevel.setAlwaysActive(true);
		
		this.particlePanel.deltaMultiplier = new NumericValue();
		this.particlePanel.deltaMultiplier.setValue(1.0f);
		this.particlePanel.deltaMultiplier.setAlwaysActive(true);

		font = new BitmapFont(Gdx.files.getFileHandle("default.fnt", FileType.Internal), Gdx.files.getFileHandle("default.png",
			FileType.Internal), true);
		this.particlePanel.effectPanel.newExampleEmitter("Untitled", true);
		// if (resources.openFile("/editor-bg.png") != null) bgImage = new Image(gl, "/editor-bg.png");
		//Gdx.input.setInputProcessor(this);
	}

	@Override
	public void resize (int width, int height) {
		Gdx.gl.glViewport(0, 0, width, height);

		if (this.particlePanel.pixelsPerMeter.getValue() <= 0) {
			this.particlePanel.pixelsPerMeter.setValue(1);
		}
		this.particlePanel.worldCamera.setToOrtho(false, width / this.particlePanel.pixelsPerMeter.getValue(), height / this.particlePanel.pixelsPerMeter.getValue());
		this.particlePanel.worldCamera.update();

		this.particlePanel.textCamera.setToOrtho(true, width, height);
		this.particlePanel.textCamera.update();

		this.particlePanel.effect.setPosition(this.particlePanel.worldCamera.viewportWidth / 2, this.particlePanel.worldCamera.viewportHeight / 2);
	}

	@Override
	public void render () {
		int viewWidth = Gdx.graphics.getWidth();
		int viewHeight = Gdx.graphics.getHeight();

		float delta = Math.max(0, Gdx.graphics.getDeltaTime() * this.particlePanel.deltaMultiplier.getValue());

		Gdx.gl.glClear(GL11.GL_COLOR_BUFFER_BIT);

		if ((this.particlePanel.pixelsPerMeter.getValue() != this.particlePanel.pixelsPerMeterPrev) || (this.particlePanel.zoomLevel.getValue() != this.particlePanel.zoomLevelPrev)) {
			if (this.particlePanel.pixelsPerMeter.getValue() <= 0) {
				this.particlePanel.pixelsPerMeter.setValue(1);
			}

			this.particlePanel.worldCamera.setToOrtho(false, viewWidth / this.particlePanel.pixelsPerMeter.getValue(), viewHeight / this.particlePanel.pixelsPerMeter.getValue());
			this.particlePanel.worldCamera.zoom = this.particlePanel.zoomLevel.getValue();
			this.particlePanel.worldCamera.update();
			this.particlePanel.effect.setPosition(this.particlePanel.worldCamera.viewportWidth / 2, this.particlePanel.worldCamera.viewportHeight / 2);
			this.particlePanel.zoomLevelPrev = this.particlePanel.zoomLevel.getValue();
			this.particlePanel.pixelsPerMeterPrev = this.particlePanel.pixelsPerMeter.getValue();
		}
		
		spriteBatch.setProjectionMatrix(this.particlePanel.worldCamera.combined);

		spriteBatch.begin();
		spriteBatch.enableBlending();
		spriteBatch.setBlendFunction(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

		if (bgImage != null) {
			bgImage.setPosition(viewWidth / 2 - bgImage.getWidth() / 2, viewHeight / 2 - bgImage.getHeight() / 2);
			bgImage.draw(spriteBatch);
		}

		activeCount = 0;
		boolean complete = true;
		for (ParticleEmitter emitter : this.particlePanel.effect.getEmitters()) {
			if (emitter.getSprite() == null && emitter.getImagePath() != null) loadImage(emitter);
			boolean enabled = this.particlePanel.isEnabled(emitter);
			if (enabled) {
				if (emitter.getSprite() != null) emitter.draw(spriteBatch, delta);
				activeCount += emitter.getActiveCount();
				if (!emitter.isComplete()) complete = false;
			}
		}
		if (complete) this.particlePanel.effect.start();

		maxActive = Math.max(maxActive, activeCount);
		maxActiveTimer += delta;
		if (maxActiveTimer > 3) {
			maxActiveTimer = 0;
			lastMaxActive = maxActive;
			maxActive = 0;
		}

		if (mouseDown) {
			// gl.drawLine(mouseX - 6, mouseY, mouseX + 5, mouseY);
			// gl.drawLine(mouseX, mouseY - 5, mouseX, mouseY + 6);
		}

		spriteBatch.setProjectionMatrix(this.particlePanel.textCamera.combined);

		font.draw(spriteBatch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 5, 15);
		font.draw(spriteBatch, "Count: " + activeCount, 5, 35);
		font.draw(spriteBatch, "Max: " + lastMaxActive, 5, 55);
		font.draw(spriteBatch, (int)(this.particlePanel.getEmitter().getPercentComplete() * 100) + "%", 5, 75);

		spriteBatch.end();

		// gl.drawLine((int)(viewWidth * getCurrentParticles().getPercentComplete()), viewHeight - 1, viewWidth, viewHeight -
		// 1);
	}

	private void loadImage (ParticleEmitter emitter) {
		final String imagePath = emitter.getImagePath();
		String imageName = new File(imagePath.replace('\\', '/')).getName();
		try {
			FileHandle file;
			if (imagePath.equals("particle.png"))
				file = Gdx.files.classpath(imagePath);
			else
				file = Gdx.files.absolute(imagePath);
			emitter.setSprite(new Sprite(new Texture(file)));
		} catch (GdxRuntimeException ex) {
			ex.printStackTrace();
			EventQueue.invokeLater(new Runnable() {
				public void run () {
					JOptionPane.showMessageDialog(ParticleRenderer.this.particlePanel, "Error loading image:\n" + imagePath);
				}
			});
			emitter.setImagePath(null);
		}
	}

	public boolean keyDown (int keycode) {
		return false;
	}

	public boolean keyUp (int keycode) {
		return false;
	}

	public boolean keyTyped (char character) {
		return false;
	}

	public boolean touchDown (int x, int y, int pointer, int newParam) {
		Vector3 touchPoint = new Vector3(x, y, 0);
		this.particlePanel.worldCamera.unproject(touchPoint);
		this.particlePanel.effect.setPosition(touchPoint.x, touchPoint.y);
		return false;
	}

	public boolean touchUp (int x, int y, int pointer, int button) {
		//ParticleEditor.this.dispatchEvent(new WindowEvent(ParticleEditor.this, WindowEvent.WINDOW_LOST_FOCUS));
		//ParticleEditor.this.dispatchEvent(new WindowEvent(ParticleEditor.this, WindowEvent.WINDOW_GAINED_FOCUS));
		this.particlePanel.requestFocusInWindow();
		return false;
	}

	public boolean touchDragged (int x, int y, int pointer) {
		Vector3 touchPoint = new Vector3(x, y, 0);
		this.particlePanel.worldCamera.unproject(touchPoint);
		this.particlePanel.effect.setPosition(touchPoint.x, touchPoint.y);
		return false;
	}

	@Override
	public void dispose () {
	}

	@Override
	public void pause () {
	}

	@Override
	public void resume () {
	}

	@Override
	public boolean mouseMoved (int x, int y) {
		return false;
	}

	@Override
	public boolean scrolled (int amount) {
		return false;
	}
}