package gdxstudio.panel;
import gdxstudio.Content;
import gdxstudio.Frame;
import gdxstudio.GdxStudio;
import gdxstudio.Style;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDropEvent;
import java.io.File;
import java.nio.ByteBuffer;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.GLContext;
import scene2d.Asset;
import scene2d.Effect;
import scene2d.EffectType;
import scene2d.ImageJson;
import scene2d.InterpolationType;
import scene2d.Map;
import scene2d.Scene;
import scene2d.Sprite;
import web.laf.lite.layout.HorizontalFlowLayout;
import web.laf.lite.layout.VerticalFlowLayout;
import web.laf.lite.utils.UIUtils;
import web.laf.lite.widget.CenterPanel;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglAWTCanvas;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.backends.lwjgl.LwjglCanvas;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.PixmapIO;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle;
import com.badlogic.gdx.scenes.scene2d.ui.List;
import com.badlogic.gdx.scenes.scene2d.ui.SelectBox;
import com.badlogic.gdx.scenes.scene2d.ui.Slider;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.ui.Touchpad;
import com.badlogic.gdx.tools.hiero.HieroPanel;
import com.badlogic.gdx.tools.particleeditor.ParticlePanel;
import com.badlogic.gdx.tools.particleeditor.ParticleRenderer;
import com.badlogic.gdx.utils.Timer.Task;
final public class StudioPanel extends JPanel {
private static final long serialVersionUID = 1L;
LwjglCanvas can;
public LwjglAWTCanvas canvas;
JPanel hbox;
CenterPanel centerPanel;
JScrollPane scrollPane;
LwjglApplicationConfiguration config2 = new LwjglApplicationConfiguration();
Image img;
public StudioPanel(){
super(new VerticalFlowLayout());
hbox = new JPanel(new HorizontalFlowLayout());
hbox.add(new HeaderLabel("Screen Size"));
hbox.add(new HeaderLabel("Target Size"));
UIUtils.setMargin(this, new Insets(15,15,15,15));
config2.width = 640;
config2.height = 320;
config2.fullscreen = false;
config2.useGL20 = false;
}
@Override
public void paint(Graphics g){
if(!isOpaque())
Style.drawScreen(g, getWidth(), getHeight());
super.paint(g);
}
String config = "{"
+"title: GdxStudio,"
+"keepAspectRatio: false,"
+"showFPS: false,"
+"loggingEnabled: true,"
+"}";
public void createHieroCanvas(){
setOpaque(true);
removeAll();
HieroPanel panel = new HieroPanel();
canvas = new LwjglAWTCanvas(new HieroPanel.FontRenderer() , false);
HieroPanel.gamePanel.add(canvas.getCanvas());
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setPreferredSize(new Dimension(860, 650));
UIUtils.setDrawBorder(scrollPane, false);
add(scrollPane);
}
public void createParticleCanvas(){
setOpaque(true);
removeAll();
ParticlePanel panel = new ParticlePanel();
canvas = new LwjglAWTCanvas(new ParticleRenderer(panel) , false);
panel.initializeComponents(canvas);
JScrollPane scrollPane = new JScrollPane(panel);
scrollPane.setPreferredSize(new Dimension(860, 650));
UIUtils.setDrawBorder(scrollPane, false);
add(scrollPane);
}
public void createStudioCanvas(){
removeAll();
GdxStudio.log("Creating Studio Canvas");
try{
Scene.configJson = Scene.jsonReader.parse(config);
Scene.debug = true;
Scene.scenesMap.clear();
Scene.scenesMap.put("gdxstudio.SceneEditor", "");
setOpaque(false);
canvas = new LwjglAWTCanvas(Scene.app , false);
scrollPane = new JScrollPane(canvas.getCanvas());
scrollPane.setPreferredSize(new Dimension(800, 480));
UIUtils.setDrawBorder(scrollPane, false);
Style.setScreenSize(scrollPane.getPreferredSize().width, scrollPane.getPreferredSize().height);
centerPanel = new CenterPanel(scrollPane, true, false);
centerPanel.setBackground(Color.black);
UIUtils.setUndecorated(centerPanel, true);
UIUtils.setMargin(centerPanel, new Insets(0,0,0,0));
add(centerPanel);
validate();
Style.setScreenPosition(scrollPane.getLocation().x, scrollPane.getLocation().y);
canvas.getCanvas().setDropTarget(new DropTarget() {
private static final long serialVersionUID = 1L;
public synchronized void drop(DropTargetDropEvent event) {
try{
Transferable transferable = event.getTransferable();
if( transferable.isDataFlavorSupported(DataFlavor.stringFlavor )){
event.acceptDrop( DnDConstants.ACTION_MOVE );
String s = (String)transferable.getTransferData(DataFlavor.stringFlavor);
createActor(s);
event.getDropTargetContext().dropComplete(true);
}
else{
event.rejectDrop();
}
}
catch( Exception exception ){
System.err.println( "Exception" + exception.getMessage() );
event.rejectDrop();
}
}
});
Asset.save();
}catch(Exception ex){
ex.printStackTrace();
}
}
public void setGdxScreenSize(int width, int height){
removeAll();
canvas.getCanvas().setSize(width, height);
scrollPane = new JScrollPane(canvas.getCanvas());
scrollPane.setPreferredSize(new Dimension(width, height));
UIUtils.setDrawBorder(scrollPane, false);
Style.setScreenSize(scrollPane.getPreferredSize().width, scrollPane.getPreferredSize().height);
scrollPane.setPreferredSize(new Dimension(width, height));
centerPanel = new CenterPanel(scrollPane, true, false);
centerPanel.setBackground(Color.black);
UIUtils.setUndecorated(centerPanel, true);
UIUtils.setMargin(centerPanel, new Insets(0,0,0,0));
add(centerPanel);
validate();
Style.setScreenPosition(scrollPane.getLocation().x, scrollPane.getLocation().y);
canvas.makeCurrent();
try {
GLContext.useContext(canvas);
} catch (LWJGLException e) {
e.printStackTrace();
}
}
public void revalidateScreenPosition(){
if(scrollPane != null){
validate();
Style.setScreenPosition(canvas.getCanvas().getLocation().x, canvas.getCanvas().getLocation().y);
}
}
public void destroyCanvas(){
GdxStudio.log("Destroying Scene Canvas");
if(canvas != null){
remove(canvas.getCanvas());
canvas.stop();
canvas = null;
}
}
private int getNameCount(Actor actor){
int count = 1;
for(Actor child: Scene.getCurrentScene().getChildren())
if(actor.getClass().equals(child.getClass())) count++;
return count;
}
public void setName(final Actor actor){
com.badlogic.gdx.utils.Timer.schedule(new Task(){
@Override
public void run() {
String name = actor.getClass().getSimpleName()+getNameCount(actor);
if(Scene.getCurrentScene().findActor(name) == null)
actor.setName(name);
else
actor.setName(name+"_1");
actor.setX(Scene.mouse.x-actor.getWidth()/2);
actor.setY(Scene.mouse.y-actor.getHeight()/2);
Scene.getCurrentScene().addActor(actor);
Frame.actorPanel.addActor(actor.getName());
Scene.isDirty = true;
Effect.createEffect(actor, EffectType.ScaleInOut, 1.5f, 0.5f, InterpolationType.Linear);
}
}, 0.1f);
}
public void createActor(String type){
switch(type){
case "Label":
if(Asset.fontMap.size != 0){
LabelStyle ls = new LabelStyle();
ls.font = Asset.fontMap.firstValue();
Label label = new Label("Text", ls);
setName(label);
}
break;
case "Image":
if(Asset.texMap.size != 0){
setName(new ImageJson(Asset.texMap.firstKey()));
}
break;
case "Texture":setName(new ImageJson(Content.assetPanel.list.getSelectedValue()));break;
case "Sprite":setName(new Sprite(1f, Asset.texMap.firstKey()));break;
case "Particle":
//ParticleEffect pe = new ParticleEffect();
//pe.load(effectFile, imagesDir);
break;
case "Button":setName(new Button(Asset.skin));break;
case "TextButton":setName(new TextButton("Text", Asset.skin));break;
case "TextField":setName(new TextField("", Asset.skin));break;
case "Table":setName(new Table(Asset.skin));break;
case "CheckBox":setName(new CheckBox("Check", Asset.skin));break;
case "SelectBox":setName(new SelectBox(new String[]{"First","Second","Third"}, Asset.skin));break;
case "List":setName(new List(new String[]{"First","Second","Third"}, Asset.skin));break;
case "Slider":setName(new Slider(0, 10, 1, false, Asset.skin));break;
case "Dialog":setName(new Dialog("Title", Asset.skin));break;
case "Touchpad":setName(new Touchpad(5, Asset.skin));break;
case "Map":setName(new Map(1, 24));break;
case "None":break;
default:break;
}
}
public static void updateAssets(){
StringBuilder sb = new StringBuilder();
for(String filename: new File(Asset.basePath+"font").list()){
if(filename.endsWith(".fnt")){
GdxStudio.log("Loading :"+filename);
sb.append(filename);
sb.append(",");
}
}
Asset.assetMap.put("font", sb.toString());
sb = new StringBuilder();
for(String filename: new File(Asset.basePath+"atlas").list()){
if(filename.endsWith(".atlas")){
GdxStudio.log("Loading :"+filename);
sb.append(filename);
sb.append(",");
}
}
Asset.assetMap.put("atlas", sb.toString());
sb = new StringBuilder();
for(String filename: new File(Asset.basePath+"sound").list()){
if(filename.endsWith(".mp3")){
GdxStudio.log("Loading :"+filename);
sb.append(filename);
sb.append(",");
}
}
Asset.assetMap.put("sound", sb.toString());
sb = new StringBuilder();
for(String filename: new File(Asset.basePath+"music").list()){
if(filename.endsWith(".mp3")){
GdxStudio.log("Loading :"+filename);
sb.append(filename);
sb.append(",");
}
}
Asset.assetMap.put("music", sb.toString());
sb = new StringBuilder();
for(String filename: new File(Asset.basePath+"model").list()){
if(filename.endsWith(".obj") || filename.endsWith(".g3db")){
GdxStudio.log("Loading :"+filename);
Asset.modelMap.add(filename);
}
}
}
private static int counter = 1;
public static void saveScreenshot(){
try{
FileHandle fh;
do{
fh = new FileHandle("shots/shot" + counter++ + ".png");
}while (fh.exists());
Pixmap pixmap = getScreenshot(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
PixmapIO.writePNG(fh, pixmap);
pixmap.dispose();
}catch (Exception e){
}
}
private static Pixmap getScreenshot(int x, int y, int w, int h, boolean flipY){
Gdx.gl.glPixelStorei(GL20.GL_PACK_ALIGNMENT, 1);
final Pixmap pixmap = new Pixmap(w, h, Format.RGBA8888);
ByteBuffer pixels = pixmap.getPixels();
Gdx.gl.glReadPixels(x, y, w, h, GL20.GL_RGBA, GL20.GL_UNSIGNED_BYTE, pixels);
final int numBytes = w * h * 4;
byte[] lines = new byte[numBytes];
if (flipY){
pixels.clear();
pixels.get(lines);
}else{
final int numBytesPerLine = w * 4;
for (int i = 0; i < h; i++){
pixels.position((h - i - 1) * numBytesPerLine);
pixels.get(lines, i * numBytesPerLine, numBytesPerLine);
}
pixels.clear();
pixels.put(lines);
}
return pixmap;
}
}