import java.awt.GridBagConstraints;\r
import java.awt.GridBagLayout;\r
import java.awt.Insets;\r
+import java.awt.event.WindowAdapter;\r
+import java.awt.event.WindowEvent;\r
import java.io.File;\r
import java.net.MalformedURLException;\r
import java.net.URL;\r
import com.badlogic.gdx.graphics.Texture.TextureWrap;\r
import com.badlogic.gdx.math.Matrix4;\r
\r
-public class ParticleEditor extends JFrame implements RenderListener, InputListener {\r
+public class ParticleEditor extends JFrame {\r
LwjglApplication app;\r
Canvas glCanvas;\r
JPanel rowsPanel;\r
\r
ParticleEffect effect = new ParticleEffect();\r
final HashMap<ParticleEmitter, ParticleData> particleData = new HashMap();\r
- private float maxActiveTimer;\r
- private int maxActive, lastMaxActive;\r
- private boolean mouseDown;\r
- private int activeCount;\r
- private BitmapFont font;\r
- private SpriteBatch spriteBatch;\r
- private Sprite bgImage; // BOZO - Add setting background image to UI.\r
- private int mouseX, mouseY;\r
\r
public ParticleEditor () {\r
super("GDX Particle Editor");\r
super.setupDisplay();\r
}\r
};\r
- app.getGraphics().setRenderListener(ParticleEditor.this);\r
+ app.getGraphics().setRenderListener(new Renderer());\r
+ addWindowListener(new WindowAdapter() {\r
+ public void windowClosed (WindowEvent event) {\r
+ app.stop();\r
+ }\r
+ });\r
}\r
\r
public Dimension getMinimumSize () {\r
splitPane.setDividerLocation(325);\r
}\r
\r
- public void surfaceCreated () {\r
- if (spriteBatch != null) return;\r
- spriteBatch = new SpriteBatch();\r
-\r
- font = new BitmapFont(Gdx.files.getFileHandle("data/default.fnt", FileType.Internal), Gdx.files.getFileHandle(\r
- "data/default.png", FileType.Internal), true);\r
- effectPanel.newEmitter("Untitled", true);\r
- // if (resources.openFile("/editor-bg.png") != null) bgImage = new Image(gl, "/editor-bg.png");\r
-\r
- Gdx.input.addInputListener(this);\r
- }\r
-\r
- public void surfaceChanged (int width, int height) {\r
- int viewWidth = Gdx.graphics.getWidth();\r
- int viewHeight = Gdx.graphics.getHeight();\r
-\r
- spriteBatch.setProjectionMatrix(new Matrix4().setToOrtho(0, viewWidth, viewHeight, 0, 0, 1));\r
-\r
- synchronized (effect) {\r
- effect.setPosition(viewWidth / 2, viewHeight / 2);\r
+ class Renderer implements RenderListener, InputListener {\r
+ private float maxActiveTimer;\r
+ private int maxActive, lastMaxActive;\r
+ private boolean mouseDown;\r
+ private int activeCount;\r
+ private int mouseX, mouseY;\r
+ private BitmapFont font;\r
+ private SpriteBatch spriteBatch;\r
+ private Sprite bgImage; // BOZO - Add setting background image to UI.\r
+\r
+ public void surfaceCreated () {\r
+ if (spriteBatch != null) return;\r
+ spriteBatch = new SpriteBatch();\r
+\r
+ font = new BitmapFont(Gdx.files.getFileHandle("data/default.fnt", FileType.Internal), Gdx.files.getFileHandle(\r
+ "data/default.png", FileType.Internal), true);\r
+ effectPanel.newEmitter("Untitled", true);\r
+ // if (resources.openFile("/editor-bg.png") != null) bgImage = new Image(gl, "/editor-bg.png");\r
+\r
+ Gdx.input.addInputListener(this);\r
}\r
- }\r
\r
- public void render () {\r
- synchronized (effect) {\r
+ public void surfaceChanged (int width, int height) {\r
int viewWidth = Gdx.graphics.getWidth();\r
int viewHeight = Gdx.graphics.getHeight();\r
- if (viewWidth != glCanvas.getWidth() || viewHeight != glCanvas.getHeight()) {\r
- viewWidth = Math.max(1, glCanvas.getWidth());\r
- viewHeight = Math.max(1, glCanvas.getHeight());\r
- app.setSize(viewWidth, viewHeight);\r
+\r
+ spriteBatch.setProjectionMatrix(new Matrix4().setToOrtho(0, viewWidth, viewHeight, 0, 0, 1));\r
+\r
+ synchronized (effect) {\r
+ effect.setPosition(viewWidth / 2, viewHeight / 2);\r
}\r
+ }\r
\r
- float delta = Gdx.graphics.getDeltaTime();\r
+ public void render () {\r
+ synchronized (effect) {\r
+ int viewWidth = Gdx.graphics.getWidth();\r
+ int viewHeight = Gdx.graphics.getHeight();\r
+ if (viewWidth != glCanvas.getWidth() || viewHeight != glCanvas.getHeight()) {\r
+ viewWidth = Math.max(1, glCanvas.getWidth());\r
+ viewHeight = Math.max(1, glCanvas.getHeight());\r
+ app.setSize(viewWidth, viewHeight);\r
+ }\r
\r
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);\r
+ float delta = Gdx.graphics.getDeltaTime();\r
\r
- spriteBatch.begin();\r
- spriteBatch.enableBlending();\r
- spriteBatch.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);\r
+ Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);\r
\r
- if (bgImage != null) {\r
- bgImage.setPosition(viewWidth / 2 - bgImage.getWidth() / 2, viewHeight / 2 - bgImage.getHeight() / 2);\r
- bgImage.draw(spriteBatch);\r
- }\r
+ spriteBatch.begin();\r
+ spriteBatch.enableBlending();\r
+ spriteBatch.setBlendFunction(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);\r
\r
- activeCount = 0;\r
- for (ParticleEmitter emitter : effect.getEmitters()) {\r
- if (emitter.getTexture() == null && emitter.getImagePath() != null) loadImage(emitter);\r
- boolean enabled = isEnabled(emitter);\r
- if (enabled) {\r
- if (emitter.getTexture() != null) emitter.draw(spriteBatch, delta);\r
- activeCount += emitter.getActiveCount();\r
+ if (bgImage != null) {\r
+ bgImage.setPosition(viewWidth / 2 - bgImage.getWidth() / 2, viewHeight / 2 - bgImage.getHeight() / 2);\r
+ bgImage.draw(spriteBatch);\r
}\r
- }\r
- if (effect.isComplete()) effect.start();\r
-\r
- maxActive = Math.max(maxActive, activeCount);\r
- maxActiveTimer += delta;\r
- if (maxActiveTimer > 3) {\r
- maxActiveTimer = 0;\r
- lastMaxActive = maxActive;\r
- maxActive = 0;\r
- }\r
\r
- if (mouseDown) {\r
- // gl.drawLine(mouseX - 6, mouseY, mouseX + 5, mouseY);\r
- // gl.drawLine(mouseX, mouseY - 5, mouseX, mouseY + 6);\r
- }\r
+ activeCount = 0;\r
+ for (ParticleEmitter emitter : effect.getEmitters()) {\r
+ if (emitter.getTexture() == null && emitter.getImagePath() != null) loadImage(emitter);\r
+ boolean enabled = isEnabled(emitter);\r
+ if (enabled) {\r
+ if (emitter.getTexture() != null) emitter.draw(spriteBatch, delta);\r
+ activeCount += emitter.getActiveCount();\r
+ }\r
+ }\r
+ if (effect.isComplete()) effect.start();\r
+\r
+ maxActive = Math.max(maxActive, activeCount);\r
+ maxActiveTimer += delta;\r
+ if (maxActiveTimer > 3) {\r
+ maxActiveTimer = 0;\r
+ lastMaxActive = maxActive;\r
+ maxActive = 0;\r
+ }\r
+\r
+ if (mouseDown) {\r
+ // gl.drawLine(mouseX - 6, mouseY, mouseX + 5, mouseY);\r
+ // gl.drawLine(mouseX, mouseY - 5, mouseX, mouseY + 6);\r
+ }\r
\r
- font.draw(spriteBatch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 10, 10, Color.WHITE);\r
- font.draw(spriteBatch, "Count: " + activeCount, 10, 30, Color.WHITE);\r
- font.draw(spriteBatch, "Max: " + lastMaxActive, 10, 50, Color.WHITE);\r
- font.draw(spriteBatch, (int)(getEmitter().getPercentComplete() * 100) + "%", 10, 70, Color.WHITE);\r
+ font.draw(spriteBatch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 10, 10, Color.WHITE);\r
+ font.draw(spriteBatch, "Count: " + activeCount, 10, 30, Color.WHITE);\r
+ font.draw(spriteBatch, "Max: " + lastMaxActive, 10, 50, Color.WHITE);\r
+ font.draw(spriteBatch, (int)(getEmitter().getPercentComplete() * 100) + "%", 10, 70, Color.WHITE);\r
\r
- spriteBatch.end();\r
+ spriteBatch.end();\r
\r
- // gl.drawLine((int)(viewWidth * getCurrentParticles().getPercentComplete()), viewHeight - 1, viewWidth, viewHeight - 1);\r
+ // gl.drawLine((int)(viewWidth * getCurrentParticles().getPercentComplete()), viewHeight - 1, viewWidth, viewHeight -\r
+// 1);\r
+ }\r
}\r
- }\r
\r
- private void loadImage (ParticleEmitter emitter) {\r
- final String imagePath = emitter.getImagePath();\r
- try {\r
- emitter.setTexture(Gdx.graphics.newTexture(Gdx.files.getFileHandle(imagePath, FileType.Absolute), TextureFilter.Linear,\r
- TextureFilter.Linear, TextureWrap.ClampToEdge, TextureWrap.ClampToEdge));\r
- } catch (GdxRuntimeException ex) {\r
- EventQueue.invokeLater(new Runnable() {\r
- public void run () {\r
- JOptionPane.showMessageDialog(ParticleEditor.this, "Error loading image:\n" + imagePath);\r
- }\r
- });\r
- emitter.setImagePath(null);\r
+ private void loadImage (ParticleEmitter emitter) {\r
+ final String imagePath = emitter.getImagePath();\r
+ try {\r
+ emitter.setTexture(Gdx.graphics.newTexture(Gdx.files.getFileHandle(imagePath, FileType.Absolute),\r
+ TextureFilter.Linear, TextureFilter.Linear, TextureWrap.ClampToEdge, TextureWrap.ClampToEdge));\r
+ } catch (GdxRuntimeException ex) {\r
+ EventQueue.invokeLater(new Runnable() {\r
+ public void run () {\r
+ JOptionPane.showMessageDialog(ParticleEditor.this, "Error loading image:\n" + imagePath);\r
+ }\r
+ });\r
+ emitter.setImagePath(null);\r
+ }\r
}\r
- }\r
\r
- public boolean keyDown (int keycode) {\r
- return false;\r
- }\r
+ public boolean keyDown (int keycode) {\r
+ return false;\r
+ }\r
\r
- public boolean keyUp (int keycode) {\r
- return false;\r
- }\r
+ public boolean keyUp (int keycode) {\r
+ return false;\r
+ }\r
\r
- public boolean keyTyped (char character) {\r
- return false;\r
- }\r
+ public boolean keyTyped (char character) {\r
+ return false;\r
+ }\r
\r
- public boolean touchDown (int x, int y, int pointer) {\r
- synchronized (effect) {\r
- effect.setPosition(x, y);\r
+ public boolean touchDown (int x, int y, int pointer) {\r
+ synchronized (effect) {\r
+ effect.setPosition(x, y);\r
+ }\r
+ return false;\r
}\r
- return false;\r
- }\r
\r
- public boolean touchUp (int x, int y, int pointer) {\r
- return false;\r
- }\r
+ public boolean touchUp (int x, int y, int pointer) {\r
+ return false;\r
+ }\r
\r
- public boolean touchDragged (int x, int y, int pointer) {\r
- synchronized (effect) {\r
- effect.setPosition(x, y);\r
+ public boolean touchDragged (int x, int y, int pointer) {\r
+ synchronized (effect) {\r
+ effect.setPosition(x, y);\r
+ }\r
+ return false;\r
+ }\r
+\r
+ public void dispose () {\r
}\r
- return false;\r
}\r
\r
static class ParticleData {\r
break;\r
}\r
}\r
+ EventQueue.invokeLater(new Runnable() {\r
+ public void run () {\r
+ }\r
+ });\r
new ParticleEditor();\r
}\r
}\r
--- /dev/null
+\r
+package com.badlogic.gdx.tests;\r
+\r
+import java.util.ArrayList;\r
+\r
+import com.badlogic.gdx.Files.FileType;\r
+import com.badlogic.gdx.Gdx;\r
+import com.badlogic.gdx.Input;\r
+import com.badlogic.gdx.InputAdapter;\r
+import com.badlogic.gdx.InputListener;\r
+import com.badlogic.gdx.graphics.BitmapFont;\r
+import com.badlogic.gdx.graphics.BitmapFont.HAlignment;\r
+import com.badlogic.gdx.graphics.BitmapFontCache;\r
+import com.badlogic.gdx.graphics.Color;\r
+import com.badlogic.gdx.graphics.GL10;\r
+import com.badlogic.gdx.graphics.Sprite;\r
+import com.badlogic.gdx.graphics.SpriteBatch;\r
+import com.badlogic.gdx.graphics.Texture.TextureFilter;\r
+import com.badlogic.gdx.graphics.Texture.TextureWrap;\r
+import com.badlogic.gdx.graphics.particles.ParticleEffect;\r
+import com.badlogic.gdx.graphics.particles.ParticleEmitter;\r
+import com.badlogic.gdx.tests.utils.GdxTest;\r
+\r
+public class ParticleEmitterTest implements GdxTest {\r
+ private SpriteBatch spriteBatch;\r
+ private BitmapFont font;\r
+ ParticleEffect effect;\r
+ int emitterIndex;\r
+ ArrayList<ParticleEmitter> emitters;\r
+ int particleCount = 10;\r
+\r
+ public void surfaceCreated () {\r
+ if (spriteBatch != null) return;\r
+ spriteBatch = new SpriteBatch();\r
+\r
+ font = new BitmapFont(Gdx.files.getFileHandle("data/verdana39.fnt", FileType.Internal), Gdx.files.getFileHandle(\r
+ "data/verdana39.png", FileType.Internal), false);\r
+\r
+ effect = new ParticleEffect();\r
+ effect.load(Gdx.files.getFileHandle("data/test.p", FileType.Internal), "data", FileType.Internal);\r
+ effect.setPosition(Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 2);\r
+ emitters = new ArrayList(effect.getEmitters());\r
+ effect.getEmitters().clear();\r
+ effect.getEmitters().add(emitters.get(0));\r
+\r
+ Gdx.input.addInputListener(new InputListener() {\r
+ public boolean touchUp (int x, int y, int pointer) {\r
+ return false;\r
+ }\r
+\r
+ public boolean touchDragged (int x, int y, int pointer) {\r
+ effect.setPosition(x, Gdx.graphics.getHeight() - y);\r
+ return false;\r
+ }\r
+\r
+ public boolean touchDown (int x, int y, int pointer) {\r
+ effect.setPosition(x, Gdx.graphics.getHeight() - y);\r
+ return false;\r
+ }\r
+\r
+ public boolean keyUp (int keycode) {\r
+ return false;\r
+ }\r
+\r
+ public boolean keyTyped (char character) {\r
+ return false;\r
+ }\r
+\r
+ public boolean keyDown (int keycode) {\r
+ ParticleEmitter emitter = emitters.get(emitterIndex);\r
+ if (keycode == Input.Keys.KEYCODE_DPAD_UP)\r
+ particleCount += 5;\r
+ else if (keycode == Input.Keys.KEYCODE_DPAD_DOWN)\r
+ particleCount -= 5;\r
+ else if (keycode == Input.Keys.KEYCODE_SPACE)\r
+ emitterIndex = (emitterIndex + 1) % emitters.size();\r
+ else\r
+ return false;\r
+ particleCount = Math.max(0, particleCount);\r
+ if (particleCount > emitter.getMaxParticleCount()) emitter.setMaxParticleCount(particleCount * 2);\r
+ emitter.getEmission().setHigh(particleCount / emitter.getLife().getHighMax());\r
+ effect.getEmitters().clear();\r
+ effect.getEmitters().add(emitters.get(emitterIndex));\r
+ return false;\r
+ }\r
+ });\r
+ }\r
+\r
+ public void surfaceChanged (int width, int height) {\r
+ }\r
+\r
+ public void render () {\r
+ GL10 gl = Gdx.graphics.getGL10();\r
+ gl.glClear(GL10.GL_COLOR_BUFFER_BIT);\r
+ spriteBatch.begin();\r
+ effect.draw(spriteBatch, Gdx.graphics.getDeltaTime());\r
+ font.draw(spriteBatch, Gdx.graphics.getFramesPerSecond() + " fps", 5, 40, Color.WHITE);\r
+ int activeCount = emitters.get(emitterIndex).getActiveCount();\r
+ font.draw(spriteBatch, activeCount + "/" + particleCount + " particles", 5, Gdx.graphics.getHeight() - 5, Color.WHITE);\r
+ spriteBatch.end();\r
+ }\r
+\r
+ public void dispose () {\r
+ }\r
+\r
+ public boolean needsGL20 () {\r
+ return false;\r
+ }\r
+}\r