/*******************************************************************************
* This is part of SketchChair, an open-source tool for designing your own furniture.
* www.sketchchair.cc
*
* Copyright (C) 2012, Diatom Studio ltd. Contact: hello@diatom.cc
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package cc.sketchchair.core;
//TODO: Add all buttons to GUI
//TODO: Add GUI panels?
//TODO: Add Ragdoll class
//TODO: Render ragdoll correctly
//TODO: sitting controle for ragdoll
import java.awt.Dimension;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.IntBuffer;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLCapabilities;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.vecmath.Vector3f;
import com.apple.eawt.Application;
import com.apple.eawt.ApplicationAdapter;
import com.apple.eawt.ApplicationEvent;
import processing.core.PApplet;
import processing.core.PConstants;
import processing.core.PFont;
import processing.core.PGraphics;
import processing.core.PImage;
import processing.opengl.PGL;
import processing.opengl.PGraphicsOpenGL;
import ModalGUI.ModalGUI;
import cc.sketchchair.functions.functions;
import cc.sketchchair.ragdoll.ergoDoll;
import cc.sketchchair.sketch.Sketch;
import cc.sketchchair.sketch.SketchSpline;
import cc.sketchchair.sketch.SketchTools;
/**
* Main program class. Used to start SketchChair.
* @author gregsaul
*
*/
public class main extends PApplet {
public static void main(String args[]) {
//send log to a file
File file=new File("debug.log");
try {
if(!file.exists()){
file.createNewFile();
}
System.setOut(new PrintStream(new FileOutputStream(file)));
System.setErr(new PrintStream(new FileOutputStream(file)));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PApplet.main(new String[] { main.class.getName() });
}
ExceptionHandler exception = new ExceptionHandler();
private static final long serialVersionUID = 1L;
UI UI;
// Static global components
GLOBAL GLOBAL;
SETTINGS SETTINGS;
static LOGGER LOGGER = new LOGGER();
static String openChair = null;
SketchSpline curSpline;
boolean mouseDown = false;
SketchChair curChair = null;
float rotateModelsX = 0;
float rotateModelsY = 0;
int w = 0;
int h = 0;
PImage img;
int framerateLastMillis = 0;
int framerate = 0;
PFont font;
private int autoSaveCounter = 0;
private boolean useOPENGL;
//private MovieMaker mm;
private PImage vidFrame;
private boolean setupCompleted = false;
private int sec0;
private boolean firstLoop = false;
private boolean startingApp = true; //set this to true until the user ineracts.
private boolean useGLGRAPHICS;
PGraphics previewBuffer;
private boolean generateGUIStencil;
private boolean debugPickBuffer = false;
private boolean mouseSingleClick = false;
private boolean mouseDoubleClick = false;
private int lastMouseMove;
private int initiatingFrames;
void applyWorldTranslation(PGraphics renderer) {
if (GLOBAL.autoRotate)
GLOBAL.rotateModelsY -= 0.017f;
renderer.translate(GLOBAL.windowWidth / 2, GLOBAL.windowHeight / 2, 0);
renderer.rotateX(GLOBAL.rotateModelsX);
renderer.rotateY(GLOBAL.rotateModelsY);
renderer.scale((float) GLOBAL.getZOOM());
//System.out.println(GLOBAL.rotateModelsY);
renderer.translate((-width / 2) + (int)GLOBAL.CAM_OFFSET_X, (-height / 2)
+ (int)GLOBAL.CAM_OFFSET_Y);
}
@Override
public void draw() {
if(UI.menuListen.quedAction != null)
UI.menuListen.processAction();
//HACKy stuff
if(GLOBAL.loadChairLocation != null){
GLOBAL.uiTools.load(GLOBAL.loadChairLocation);
GLOBAL.loadChairLocation = null;
}
if(GLOBAL.saveChairLocation != null){
GLOBAL.uiTools.save(GLOBAL.saveChairLocation);
GLOBAL.saveChairLocation = null;
}
if(GLOBAL.savePatternLocation != null){
GLOBAL.uiTools.savePattern(GLOBAL.savePatternLocation);
GLOBAL.savePatternLocation = null;
}
if(GLOBAL.importSVGLocation != null){
GLOBAL.sketchChairs.getCurChair().importSVG( GLOBAL.importSVGLocation);
GLOBAL.importSVGLocation = null;
}
//GLGraphics renderer = (GLGraphics)g;
PGraphics renderer = (PGraphics)g;
//if(useGLGRAPHICS)
//renderer.beginGL();
//if not in focus don't worry about running the draw loop
if(!focused && !GLOBAL.skchAutomatic.hasChairToProcess() && !firstLoop && !startingApp){
frameRate(1);
// return;
}else{
frameRate(120);
}
if(SETTINGS.autoReset && millis() - lastMouseMove > (SETTINGS.autoResetSeconds*1000)){
GLOBAL.uiTools.reset(null);
lastMouseMove = millis();
}
if(mouseX != pmouseX || mouseY != pmouseY)
lastMouseMove = millis();
GLOBAL.gui.update();
//SKetchGlobals
if ((GLOBAL.rotateModelsX != 0 || GLOBAL.rotateModelsY != 0))
GLOBAL.SketchGlobals.renderVolume = true;
else
GLOBAL.SketchGlobals.renderVolume = false;
GLOBAL.SketchGlobals.physicsEngineScale = GLOBAL.jBullet.scale;
GLOBAL.SketchGlobals.mousePressed = mousePressed;
if(width != GLOBAL.windowWidth || height != GLOBAL.windowHeight)
resize();
//renderer.noSmooth();
//make sure we always have a chair to edit
if (GLOBAL.sketchChairs.getCurChair() == null) {
SketchChair curChair = new SketchChair();
GLOBAL.sketchChairs.add(curChair);
}
//tittle images
if (GLOBAL.tittleImg != null || GLOBAL.myMovie != null) {
background(250, 250, 250);
renderer.imageMode(CENTER);
if (GLOBAL.myMovie != null) {
renderer.pushMatrix();
renderer.scale(1.6f);
// image(GLOBAL.myMovie,width/3.2f,height/3.2f);
renderer.popMatrix();
renderer.image(GLOBAL.clickToStart, width / 2, height - 25);
} else {
renderer.image(GLOBAL.tittleImg, width / 2, height / 2);
}
renderer.imageMode(CORNER);
renderer.image(UITools.SELECT_TOOL_CURSOR, mouseX - 10, mouseY - 8);
//mouse clicked
//if(mousePressed && !this.mouseDown && millis() > 1000){
if (pmouseX != mouseX && millis() - GLOBAL.inativeCounter > 3000) {
GLOBAL.tittleImageNum++;
if (GLOBAL.myMovie != null) {
//if(functions.fileExists("./introVideos/" + GLOBAL.tittleImageNum + ".mov"))
// GLOBAL.myMovie = new FasterMovie(this,"./introVideos/"+GLOBAL.tittleImageNum+".mov");
//else
// GLOBAL.myMovie = null;
} else {
if (functions.fileExists("./tittleImage/"
+ GLOBAL.tittleImageNum + ".jpg"))
GLOBAL.tittleImg = loadImage("./tittleImage/"
+ GLOBAL.tittleImageNum + ".jpg");
else
GLOBAL.tittleImg = null;
}
//reset the timeout counter
GLOBAL.inativeCounter = millis();
}
if (mousePressed)
this.mouseDown = true;
else
this.mouseDown = false;
return;
}
if (mouseY != pmouseY || mouseX != pmouseX)
GLOBAL.inativeCounter = millis();
//if (millis() - GLOBAL.inativeCounter > GLOBAL.timeoutCounter) {
/*
setup();
GLOBAL.tittleImageNum = 0;
GLOBAL.inativeCounter = millis();
GLOBAL.myMovie = new FasterMovie(this,"./introVideos/"+GLOBAL.tittleImageNum+".mov");
GLOBAL.myMovie.loop();
//GLOBAL.tittleImg = loadImage("./tittleImage/" + GLOBAL.tittleImageNum + ".jpg");
*/
//}
GLOBAL.windowWidth = width;
GLOBAL.windowHeight = height;
if (!GLOBAL.performanceMode) {
}
UI.toggleButtons();
float cameraY = (float) (height/2.0);
float fov = (width) * PI/2;
float cameraZ = 0;
float aspect = (width)/(height);
if (mousePressed) {
aspect = (float) (aspect / 2.0);
}
//LOGGER.info(width + "width");
//renderer.ortho();
/*
if(useGLGRAPHICS){
ortho(-(int)(width / 2), (int)(width / 2), -(int)(height / 2), (int)(height / 2),
-1000, 1000);
//renderer.translate((width /2), (height / 2));
//renderer.ortho();
}else{
renderer.ortho(-(int)(width / 2), (int)(width / 2), -(int)(height / 2), (int)(height / 2),
-1000, 10000);
}
*/
renderer.ortho(-(int)(width / 2), (int)(width / 2), -(int)(height / 2), (int)(height / 2),
-10000, 10000);
//renderer.hint(PApplet.DISABLE_STROKE_PERSPECTIVE);
//frustum();
//camera();
//perspective();
//GLOBAL.uiTools.pickBuffer.background(255);
renderer.noFill();
renderer.strokeWeight(2);
//GLOBAL.uiTools.update();
UI.updateMouse(mouseX, mouseY, pmouseX, pmouseY, mousePressed,
mouseButton);
//MOUSE STUFF
GLOBAL.uiTools.updateMouse(mouseX, mouseY, pmouseX, pmouseY, mouseDown,
mouseButton);
if(GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT)
GLOBAL.uiTools.SketchTools.updateMouse(mouseX, mouseY, pmouseX,
pmouseY, mouseDown, mouseButton);
GLOBAL.uiTools.updateMouseWorld();
if(mouseDoubleClick){GLOBAL.uiTools.mouseDoubleClick();}
GLOBAL.uiTools.keyPressed = keyPressed;
GLOBAL.uiTools.key = key;
GLOBAL.uiTools.keyCode = keyCode;
GLOBAL.uiTools.SketchTools.keyPressed = keyPressed;
GLOBAL.uiTools.SketchTools.key = key;
GLOBAL.uiTools.SketchTools.keyCode = keyCode;
//update zoom
GLOBAL.uiTools.SketchTools.zoom = (float) GLOBAL.getZOOM();
if (mousePressed && !this.mouseDown)
UI.mouseClicked = true;
else
UI.mouseClicked = false;
GLOBAL.uiTools.mousePressed = false;
// add a new chair when clicked
if (mousePressed && !this.mouseDown) {
GLOBAL.uiTools.mousePressed();
GLOBAL.uiTools.SketchTools.mousePressed();
GLOBAL.uiTools.mousePressed = true;
}
if (mousePressed) {
GLOBAL.uiTools.mouseDown();
GLOBAL.uiTools.SketchTools.mouseDown();
}
if (mousePressed && (mouseX != pmouseX || mouseY != pmouseY)
&& !GLOBAL.gui.overComponent()) {
GLOBAL.uiTools.mouseDragged();
GLOBAL.uiTools.SketchTools.mouseDragged();
}
if (!mousePressed && this.mouseDown && !mouseDoubleClick) {
GLOBAL.uiTools.mouseReleased();
if(GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT)
GLOBAL.uiTools.SketchTools.mouseReleased();
GLOBAL.jBullet.mouseReleased(mouseX, mouseY);
}
mouseDoubleClick = false;
if (mousePressed)
this.mouseDown = true;
else
this.mouseDown = false;
if (SETTINGS.autoSave) {
this.autoSaveCounter++;
if (this.autoSaveCounter > SETTINGS.autoSaveInterval) {
GLOBAL.uiTools.autoSave();
this.autoSaveCounter = 0;
}
}
//uggly hack set the physics togge
//UI.physicsToggle.setState(SETTINGS.physics_on);
if (GLOBAL.savePDF) {
this.makePDF();
GLOBAL.savePDF = false;
}
if (GLOBAL.saveDXF) {
this.makeDXF();
GLOBAL.saveDXF = false;
}
if (GLOBAL.sketchChairs.getCurChair() != null)
GLOBAL.planesWidget.planes = GLOBAL.sketchChairs.getCurChair()
.getSlicePlanesY();
//Updates
GLOBAL.sketchChairs.update();
GLOBAL.uiTools.update();
GLOBAL.widgetMaterials.update();
render(renderer);
//renderer.camera();
if(GLOBAL.applet.millis()%3000 == 1 && SETTINGS.autoRefreshTextures)
GLOBAL.forceResize = true;
GLOBAL.tick++;
if (GLOBAL.tick > 1000000)
GLOBAL.tick = 0l;
if(GLOBAL.forceReset){
GLOBAL.forceReset = false;
this.setup();
}
//if(useGLGRAPHICS)
//renderer.endGL();
//not the first loop
if(firstLoop){
this.initiatingFrames++;
if(this.initiatingFrames > 100)
firstLoop = false;
}
}
public void keyPressed() {
if (keyCode == PApplet.ESC || key == PApplet.ESC) {
key = 0;
keyCode = 0;
}
if (key == 'm') {
this.switchResolution();
}
if(key == '4'){
//GLOBAL.gui.reBuildStencilBuffer();
}
//if(key == '=')
//renderSunflow();
UI.keyPressed(key, keyCode);
}
public void keyReleased() {
if (keyCode == PApplet.ESC || key == PApplet.ESC) {
key = 0;
keyCode = 0;
}
UI.keyReleased(key, keyCode);
}
public void keyTyped() {
if (keyCode == PApplet.ESC || key == PApplet.ESC) {
key = 0;
keyCode = 0;
}
}
public void makeDXF() {
if (GLOBAL.dxfSaveLocation != null) {
GLOBAL.shapePack.makeDXF(this, GLOBAL.dxfSaveLocation);
}
}
private void makePNGPreview() {
int previewWidth = width;
int previewHeight = height;
PImage img = GLOBAL.sketchChairs.getCurChair().renderDiagram(SETTINGS.renderWidth,SETTINGS.renderHeight,GLOBAL.cropExportToScreen);
img.save(GLOBAL.pngPreviewSaveLocation);
//img.delete();
img = null;
System.gc();
}
public void makePDF() {
if (GLOBAL.pdfSaveLocation != null) {
GLOBAL.shapePack.makePDF(this, GLOBAL.pdfSaveLocation);
if (GLOBAL.autoOpenPDF)
GLOBAL.uiTools.printOpen(GLOBAL.pdfSaveLocation);
GLOBAL.autoOpenPDF = false;
GLOBAL.pdfSaveLocation =null;
GLOBAL.savePDF = false;
} else
GLOBAL.shapePack.makePDF(this);
/*PGraphics pdf = createGraphics(this.width, this.height, PApplet.PDF,
"output.pdf");
pdf.beginDraw();
this.curChair.saveToPDF(pdf);
pdf.dispose();
pdf.endDraw();
*/
}
void movieImageAvailable(PImage _video) {
vidFrame = _video;
}
public void OSXFileHandler(String path) {
GLOBAL.uiTools.load(path);
}
public boolean OSXQuit() {
GLOBAL.applet.exit();
return true;
}
/**
* Main render loop
* @param renderer
*/
void render(PGraphics renderer) {
//
renderer.background(SETTINGS.background_colour);
/*
renderer.fill(SETTINGS.background_colour);
renderer.hint(DISABLE_DEPTH_TEST); // disable depth testing so that we
renderer.rect(0,0,cc.sketchchair.core.GLOBAL.windowWidth, GLOBAL.windowHeight);
renderer.hint(ENABLE_DEPTH_TEST); // disable depth testing so that we
*/
//this.g.smooth();
//
if (GLOBAL.getZOOM() < .01f)
GLOBAL.setZOOM(.01f);
if (GLOBAL.getZOOM() > 10)
GLOBAL.setZOOM(10);
// reference image
renderer.pushMatrix();
applyWorldTranslation(renderer);
if(!useGLGRAPHICS){
/*
//render settings
PGraphicsOpenGL pgl = (PGraphicsOpenGL)g;
GL gl = pgl.beginGL();
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_BLEND);
;
//gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
//gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
// gl.setSwapInterval(1);
//gl.glEnable (GL.GL_LINE_SMOOTH);
//gl.glEnable(GL.GL_POLYGON_SMOOTH);
pgl.endGL();
*/
}
renderer.ambientLight(200, 200, 200);
renderer.directionalLight(69, 69, 69, 0, 0, -1);
renderer.lightFalloff(1, 0, 0);
//renderer.specular(0, 0, 0);
if (GLOBAL.rotateModelsX == 0 && GLOBAL.rotateModelsY == 0)
renderer.noLights();
if (GLOBAL.dxfCapture) {
beginRaw(DXF, GLOBAL.dxfLocation);
LOGGER.info("exporting dxf now " + GLOBAL.dxfLocation);
}
//Automated actions
if(GLOBAL.skchAutomatic.hasChairToProcess())
GLOBAL.skchAutomatic.processNext();
if (GLOBAL.exportPreviewPNG) {
this.makePNGPreview();
GLOBAL.exportPreviewPNG = false;
}
if(GLOBAL.saveChairToFile){
GLOBAL.uiTools.saveChairToFile();
GLOBAL.saveChairToFile = false;
}
if(GLOBAL.saveChairToFile){
GLOBAL.uiTools.saveChairToFile();
GLOBAL.saveChairToFile = false;
}
if(GLOBAL.saveChairToFileAuto){
GLOBAL.uiTools.saveChairToFileAuto();
GLOBAL.saveChairToFileAuto = false;
}
if (SETTINGS.render_chairs && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT)
GLOBAL.sketchChairs.render(renderer);
if (GLOBAL.dxfCapture) {
endRaw();
GLOBAL.dxfCapture = false;
}
renderer.noLights();
//pick buffer rendering
if(PickBuffer.getInstance().usePickBuffer && GLOBAL.uiTools.mousePressed && SETTINGS.ENABLE_SELECT_MODEL_PLANES){
PickBuffer.getInstance().pickBuffer.beginDraw();
PickBuffer.getInstance().pickBuffer.ortho(-(width / 2), (width / 2), -(height / 2), (height / 2),
-1000, 10000);
PickBuffer.getInstance().reset();
PickBuffer.getInstance().pickBuffer.resetMatrix();
PickBuffer.getInstance().pickBuffer.background(255);
PickBuffer.getInstance().pickBuffer.setMatrix(renderer.getMatrix());
if ( GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT)
GLOBAL.sketchChairs.renderPickBuffer(PickBuffer.getInstance().pickBuffer);
PickBuffer.getInstance().pickBuffer.endDraw();
}
// Physics updates
if (GLOBAL.jBullet.physics_on) {
//GLOBAL.jBullet.update();
//functions.boundAllParticles(GLOBAL.physics);
}
//constrain ZOOm
// GLOBAL.gui.update();
//if (SETTINGS.draw_springs)
// functions.drawAllSprings(GLOBAL.physics, this.g);
if (GLOBAL.jBullet.physics_on)
GLOBAL.jBullet.step();
if (GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) {
GLOBAL.jBullet.render(renderer);
float GROUND_WIDTH = 10000;
float GROUND_LENGTH = 10000;
float GROUND_DEPTH = 1000;
renderer.pushMatrix();
renderer.noStroke();
renderer.fill(SETTINGS.world_ground_side_colour);
if (GLOBAL.rotateModelsX > 0)
renderer.fill(SETTINGS.world_ground_under_colour);
renderer.translate((int)(GLOBAL.windowWidth / 2), 1670 + (GROUND_DEPTH / 2.5f), 0);
if(GLOBAL.floorOn){
renderer.box(GROUND_WIDTH, GROUND_DEPTH, GROUND_LENGTH);
if(GLOBAL.rotateModelsX < 0){
renderer.fill(SETTINGS.world_ground_colour);
renderer.translate(0, -501,0);
renderer.rotateX(PApplet.PI/2);
renderer.rect(-GROUND_WIDTH/2,-GROUND_WIDTH/2, GROUND_WIDTH, GROUND_LENGTH);
}
}
renderer.popMatrix();
}
// debug
if (GLOBAL.debugRayIntersection != null) {
renderer.pushMatrix();
renderer.fill(255, 0, 0);
renderer.translate(GLOBAL.debugRayIntersection.x,
GLOBAL.debugRayIntersection.y,
GLOBAL.debugRayIntersection.z);
renderer.sphere(10);
renderer.popMatrix();
}
if (GLOBAL.debugRay != null) {
renderer.pushMatrix();
renderer.fill(255, 255, 0);
renderer.translate(GLOBAL.debugRay.x, GLOBAL.debugRay.y, GLOBAL.debugRay.z);
renderer.sphere(5);
renderer.popMatrix();
renderer.stroke(0, 255, 0);
renderer.line(GLOBAL.debugRay.x, GLOBAL.debugRay.y, GLOBAL.debugRay.z,
GLOBAL.debugRay.x
+ (GLOBAL.debugRay.getDirection().x * 300),
GLOBAL.debugRay.y
+ (GLOBAL.debugRay.getDirection().y * 300),
GLOBAL.debugRay.z
+ (GLOBAL.debugRay.getDirection().z * 300));
}
renderer.textFont(GLOBAL.font);
if (GLOBAL.uiTools.currentView == GLOBAL.uiTools.VIEW_CHAIR_EDIT) {
if (GLOBAL.rotateModelsX != 0 || GLOBAL.rotateModelsY != 0)
renderer.noLights();
if (GLOBAL.person != null)
GLOBAL.person.render((1f / GLOBAL.jBullet.getScale()), renderer);
renderer.noLights();
}
if (SETTINGS.EXPERT_MODE) {
GLOBAL.environments.render(renderer);
}
// draw the GUI
//this.renderer.fill(255, 255, 255);
//this.renderer.hint(DISABLE_DEPTH_TEST); // disable depth testing so that we
renderer.noLights();
renderer.hint(DISABLE_DEPTH_TEST); // disable depth testing so that we
renderer.popMatrix(); // end of camera
if (GLOBAL.uiTools.currentView == GLOBAL.uiTools.VIEW_SHAPE_PACK){
GLOBAL.shapePack.render(renderer);
if(PickBuffer.getInstance().usePickBuffer && GLOBAL.uiTools.mousePressed && SETTINGS.ENABLE_SELECT_MODEL_PLANES){
PickBuffer.getInstance().pickBuffer.beginDraw();
PickBuffer.getInstance().pickBuffer.resetMatrix();
PickBuffer.getInstance().pickBuffer.setMatrix(g.getMatrix());
GLOBAL.shapePack.renderPickBuffer(PickBuffer.getInstance().pickBuffer);
PickBuffer.getInstance().pickBuffer.endDraw();
}
}
GLOBAL.measuretTool.render(renderer);
//render chair preview
renderSelectorThumbnail(renderer);
// draw the pattern to the front of
// the screen
//if(!SETTINGS.EXPERT_MODE){
//fill(255);
//rect(width-100,0,width,height);
//}
//renderer.hint(ENABLE_NATIVE_FONTS); // disable depth testing so that we
//renderer.resetMatrix();
//renderer.popMatrix();
GLOBAL.uiTools.renderGrid(renderer);
GLOBAL.uiTools.render(renderer);
if (SETTINGS.show_framerate) {
renderer.fill(0);
renderer.textSize(12);
renderer.text((int) GLOBAL.applet.frameRate + " fps", 10, 80);
}
//glLoadIdentity();
//g.resetMatrix();
//g.printCamera();
//g.printMatrix();
//g.printProjection();
// renderer.ortho();
renderer.perspective();
GLOBAL.gui.render(renderer);
//renderer.hint(DISABLE_ACCURATE_2D); // disable depth testing so that we
renderer.hint(ENABLE_DEPTH_TEST); // disable depth testing so that we
// if(SETTINGS.EXPERT_MODE){
//GLOBAL.planesWidget.render(this.g);
//GLOBAL.planesWidget.render(g);
//}
//this.renderer.hint(ENABLE_DEPTH_TEST); // disable depth testing so that we draw
// the patern to the front of the screen
if (GLOBAL.captureScreen) {
screenCapture();
GLOBAL.captureScreen = false;
}
if (SETTINGS.REC) {
// GLOBAL.mm.addFrame(); // Add window's pixels to movie
}
if(GLOBAL.forceResize){
this.resize(true);
GLOBAL.forceResize = false;
}
if(GLOBAL.deleteAllChairsFlag){
GLOBAL.uiTools.deleteAllChairs(null);
GLOBAL.deleteAllChairsFlag = false;
}
// int sec = second();
// if (sec != sec0) println("FPS: " + frameRate);
// sec0 = sec;
//render debug pick buffer
if(PickBuffer.getInstance().usePickBuffer && GLOBAL.debugPickBuffer){
PickBuffer.getInstance().pickBuffer.beginDraw();
renderer.pushMatrix();
renderer.scale(1.0f/PickBuffer.getInstance().pickBufferRes);
renderer.image(PickBuffer.getInstance().pickBuffer,0,0);
renderer.popMatrix();
PickBuffer.getInstance().pickBuffer.endDraw();
}
}
void renderSunflow() {
PGraphics gSun = createGraphics(width, height, "hipstersinc.P5Sunflow");
//P5Sunflow sunflow = new P5Sunflow();
//sunflow.setParent(this);
// sunflow.width = width;
//sunflow.height = height;
// sunflow.allocate();
// gSun.camera();
gSun.loadPixels();
gSun.beginDraw();
gSun.ortho(-(width / 2), (width / 2), -(height / 2), (height / 2),
-1000, 10000);
applyWorldTranslation(gSun);
GLOBAL.sketchChairs.render(gSun);
gSun.updatePixels();
gSun.endDraw();
gSun.save("render.png");
//P5Sunflow sunflow = (P5Sunflow) g;
}
public void resize() {
resize(false);
if (GLOBAL.modeChanged) {
GLOBAL.modeChanged = false;
resize(true);
}
}
public void resize(boolean force) {
LOGGER.debug("resizing");
GLOBAL.windowWidth = width;
GLOBAL.windowHeight = height;
GLOBAL.previewWidget.setPos(GLOBAL.windowWidth-GLOBAL.previewWidget.getWidth(), 0);
if(GLOBAL.designToolbarAdvanced != null)
GLOBAL.designToolbarAdvanced.getBasePanel().setPos((GLOBAL.windowWidth - GLOBAL.designToolbarAdvanced.getWidth())/2.0f, GLOBAL.windowHeight -GLOBAL.designToolbarAdvanced.getHeight());
//resize our pick buffer
PickBuffer.getInstance().pickBuffer = createGraphics((int)(GLOBAL.windowWidth*PickBuffer.getInstance().pickBufferRes),(int)(GLOBAL.windowHeight*PickBuffer.getInstance().pickBufferRes),P3D);
/*
if (GLOBAL.windowWidth != width || GLOBAL.windowHeight != height
|| force == true) {
float deltaHeight = GLOBAL.windowHeight - height;
float deltaWidth = GLOBAL.windowWidth - width;
GLOBAL.windowWidth = width;
GLOBAL.windowHeight = height;
if(useOPENGL){
( g).beginGL();
GL gl = (GL)( g);
gl.glFlush();
//gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
gl.glViewport(0, 0, width, height);
//System.out.println("screen resized");
}
GLOBAL.gui.reload();
GLOBAL.gui.reset();
GLOBAL.font = loadFont("SegoeUI-12.vlw");
//this.font = applet.createFont("Helvetica", 12);
GLOBAL.gui.myFontMedium = GLOBAL.font;
if(GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) {
if (SETTINGS.EXPERT_MODE)
UI.setupGUITabsExpert(this, GLOBAL.gui);
if (!SETTINGS.EXPERT_MODE)
UI.setupGUITabsBasic(this, GLOBAL.gui);
}else{
UI.setupGUIPattern(this, GLOBAL.gui);
}
GLOBAL.uiTools.build(this);
GLOBAL.uiTools.SketchTools.build(this);
//GLOBAL.font = loadFont("TrebuchetMS-12.vlw");
GLOBAL.gui.myFontMedium = GLOBAL.font;
GLOBAL.CAM_OFFSET_Y -= (deltaHeight);
//GLOBAL.CAM_OFFSET_X += deltaWidth;
}
*/
}
public void screenCapture() {
String currentDir = new File(".").getAbsolutePath();
saveFrame(currentDir + "\\screenCaptures\\" + "capture-####.png");
LOGGER.info("Screen captured to: " + currentDir + "\\screenCaptures\\"
+ "capture-####.png");
}
@Override
public void setup() {
LOGGER.info("Operating System: " + System.getProperty("os.name"));
LOGGER.info("Operating System architecture: "
+ System.getProperty("os.arch"));
/* Total number of processors or cores available to the JVM */
LOGGER.info("Available processors (cores): "
+ Runtime.getRuntime().availableProcessors());
/* Total amount of free memory available to the JVM */
LOGGER.info("Free memory (MB): " + Runtime.getRuntime().freeMemory()
/ (1024 * 1024));
/* This will return Long.MAX_VALUE if there is no preset limit */
long maxMemory = Runtime.getRuntime().maxMemory() / (1024 * 1024);
/* Maximum amount of memory the JVM will attempt to use */
LOGGER.info("Maximum memory (MB): "
+ (maxMemory == Long.MAX_VALUE ? "no limit" : maxMemory));
/* Total memory currently in use by the JVM */
LOGGER.info("Total memory (MB): " + Runtime.getRuntime().totalMemory()
/ (1024 * 1024));
LOGGER.info(System.getProperty("java.vm.name"));
LOGGER.info("Java version : " + System.getProperty("java.vm.version"));
LOGGER.info("Starting SketchChair");
LOGGER.info("DataPath set at :" + dataPath("TrebuchetMS-12.vlw"));
LOGGER.info("After exit");
//set staic link to applet
if(GLOBAL.frame == null)
GLOBAL.frame = this.frame;
//Static global components
GLOBAL = new GLOBAL(this);
SETTINGS = new SETTINGS();
GLOBAL.sketchProperties.loadDefaults();
// smooth(8);
UI = new UI();
LOGGER.info("SketchChair v " + GLOBAL.version);
GLOBAL.windowWidth = (displayWidth - 5);
GLOBAL.windowHeight = (displayHeight - 65);
Thread.currentThread().setDefaultUncaughtExceptionHandler(exception);
useOPENGL = false;
useGLGRAPHICS = true;
if(useGLGRAPHICS){
if (GLOBAL.resetting == false) {
//if (this.frame != null)
//size(GLOBAL.windowWidth, GLOBAL.windowHeight,GLConstants.GLGRAPHICS);
//else
//size(GLOBAL.windowWidth, GLOBAL.windowHeight, GLConstants.GLGRAPHICS);
//size(GLOBAL.windowWidth, GLOBAL.windowHeight, OldP3D.NOSTALGIA);
size(GLOBAL.windowWidth, GLOBAL.windowHeight, OPENGL);
}
}else{
//GLConstants.GLGRAPHICS
if (GLOBAL.resetting == false) {
//size(GLOBAL.windowWidth, GLOBAL.windowHeight,"cc.sketchchair.core.GLGraphics");
// size(GLOBAL.windowWidth, GLOBAL.windowHeight, OPENGL);
}
}
/*
// Detect current openGL version and warn if necessary
PGL pgl = ((PGraphicsOpenGL) this.g).beginPGL();
GL2 gl = pgl.gl.getGL().getGL2();
String version = gl.glGetString(GL.GL_VERSION).trim();
LOGGER.info("This system uses OpenGL:"+version);
String[] parts = version.split(" ");
if(parts.length > 0 )
parts = parts[0].split(".");
if(parts.length > 0){
float versionFloat;
try{
versionFloat = Float.parseFloat(parts[0]);
}
catch(NumberFormatException e) {
versionFloat = 2;
}
if(versionFloat < 2){
JOptionPane.showMessageDialog(frame,
"SketchChair requires OpenGL v 2.0 or higher to run. Your system currently supports up to OpenGL V "+versionFloat+". Please try SketchChair on a different system or make sure that any dedicated graphics cards are enabled. ",
"OpenGL Version Not Supported",
JOptionPane.ERROR_MESSAGE);
}
}
*/
//g.printProjection();
if (GLOBAL.frame != null ){
//causing crash?
/*
GLOBAL.frame.setPreferredSize(new Dimension(width,
height));
GLOBAL.frame.setSize(width, height); // setup and OPENGL window
*/
GLOBAL.frame.setLocation(0, 0);
ImageIcon titlebaricon = new ImageIcon(
loadBytes("program_icon_02_b_48x48x32.png"));
GLOBAL.frame.setIconImage(titlebaricon.getImage());
GLOBAL.frame.setName("SketchChair");
GLOBAL.frame.setResizable(true);
}
//if(useOPENGL)
//hint(ENABLE_OPENGL_4X_SMOOTH);
//hint(ENABLE_NATIVE_FONTS);
//textMode(SCREEN);
GLOBAL.jBullet.physics_on = false;
GLOBAL.g = this.g;
GLOBAL.applet = this;
GLOBAL.gui.setup(this);
GLOBAL.gui.renderOnUpdate = GLOBAL.useMaskedUpdating;
frameRate(120);
//GLOBAL.font = createFont("Helvetica", 30);
// String[] fontList = PFont.list();
// println(fontList);
GLOBAL.gui.performanceMode = GLOBAL.performanceMode;
if (GLOBAL.gui.performanceMode) {
SETTINGS.cylinder_res = 4;
SETTINGS.sphere_res = 9;
}
//if(!SETTINGS.EXPERT_MODE)
//GLOBAL.clickToStart = loadImage("clickToStart.png");
if (SETTINGS.EXPERT_MODE)
UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui);
else
UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui);
LOGGER.info("AFTER GUI AGAIN");
GLOBAL.uiTools.build(this);
//noCursor();
GLOBAL.setZOOM(.5f);
GLOBAL.CAM_OFFSET_Y = (float) -((700 - GLOBAL.windowHeight) + 900);
// button = new GUI.Button(new Vec2D(60,0),
// loadImage("delete_out.png"));
// this.GLOBAL.ui.buttons.add(button);
//GLOBAL.shapePack.pdf_pixels_per_mm = SETTINGS.pixels_per_mm;
// GLOBAL.shapePack.CAM_OFFSET_X += 100;
// GLOBAL.shapePack.CAM_OFFSET_Y += 100;
// GLOBAL.shapePack.ZOOM = 1.5f;
addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
int notches = e.getWheelRotation();
if(!GLOBAL.gui.hasFocus()){
if (GLOBAL.uiTools.currentView == GLOBAL.uiTools.VIEW_CHAIR_EDIT)
GLOBAL.uiTools.zoomView((notches / 10f));
if (GLOBAL.uiTools.currentView == GLOBAL.uiTools.VIEW_SHAPE_PACK)
GLOBAL.shapePack.zoomView(notches / 10f,GLOBAL.uiTools.mouseX,GLOBAL.uiTools.mouseY);
}}
});
GLOBAL.person = new ergoDoll(GLOBAL.jBullet.myWorld, new Vector3f(-80,
-10, 0), 1f);
//GLOBAL.person.translate(-90, -10, 0);
//GLOBAL.person.scale(60f);
// just to load everything in
GLOBAL.jBullet.update();
/*
GLOBAL.environments.l.add(new Environment(loadImage("table.png")));
//GLOBAL.environments.l.add(new Environment(loadImage("lamp.png")));
//GLOBAL.environments.l.add(new Environment(loadImage("fan.png")));
GLOBAL.environments.l.add(new Environment(loadImage("cd.png")));
//GLOBAL.environments.l.add(new Environment(loadImage("officeChair.png")));
//GLOBAL.environments.l.add(new Environment(loadImage("chair.png")));
GLOBAL.environments.l.add(new Environment(loadImage("lamps.png")));
GLOBAL.environments.l.add(new Environment(loadImage("teapot.png")));
//GLOBAL.environments.l.add(new Environment(loadImage("bookCase.png")));
*/
/*
GLOBAL.environments.panel.hide();
GLOBAL.planesWidget.panel.hide();
GLOBAL.slicesWidget.panel.hide();
GLOBAL.loadWidget.panel.hide();
GLOBAL.widgetMaterials.panel.hide();
*/
// GLOBAL.gui.myFont = createFont("MS FMincho", 12);
LOGGER.info("load " + openChair);
if (openChair != null)
GLOBAL.uiTools.load(openChair);
if (SETTINGS.autoSave) {
GLOBAL.uiTools.autoLoad();
}
// turn off just resizing controls
//this.frame.setResizable( true );
//this.resize(true);
mouseDown = false;
mousePressed = false;
//contains the title img
GLOBAL.tittleImageNum = 0;
//System.out.print(file);
if (SETTINGS.EXHIBITION_MODE) {
// System.out.print("loaded Movie");
//GLOBAL.myMovie = new FasterMovie(this,"./introVideos/"+GLOBAL.tittleImageNum+".mov");
//GLOBAL.myMovie.loop();
//GLOBAL.myMovie.read();
}
//if(GLOBAL.myMovie == null)
//GLOBAL.tittleImg = loadImage("./tittleImage/" + GLOBAL.tittleImageNum + ".jpg");
LOGGER.info("SketchChair finished setup");
LOGGER.info("Total memory used (MB): "
+ Runtime.getRuntime().totalMemory() / (1024 * 1024));
if (GLOBAL.isMacOSX()) {
//open with stuff
//http://www.devdaily.com/blog/post/jfc-swing/java-handle-drag-drop-events-mac-osx-dock-application-icon
try {
OSXAdapter.setFileHandler(
this,
getClass().getDeclaredMethod("OSXFileHandler",
new Class[] { String.class }));
OSXAdapter
.setQuitHandler(
this,
getClass().getDeclaredMethod("OSXQuit",
(Class[]) null));
} catch (SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (NoSuchMethodException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
this.firstLoop = true;
this.initiatingFrames = 0;
//previewBuffer = createGraphics((int)previewW,(int)previewH,P3D);
PickBuffer.getInstance().pickBuffer = createGraphics((int)(GLOBAL.windowWidth*PickBuffer.getInstance().pickBufferRes),(int)(GLOBAL.windowHeight*PickBuffer.getInstance().pickBufferRes),P3D);
PickBuffer.getInstance().pickBuffer.hint(PApplet.DISABLE_TRANSFORM_CACHE);
PickBuffer.getInstance().pickBuffer.hint(PApplet.ENABLE_ACCURATE_2D);
//FlurryAgent.onStartApp(null, "SVAM3TIHA2YVU7KEHHC7") ;
GLOBAL.uiTools.SketchTools.selectTool(SketchTools.DRAW_TOOL);
//Hints
//g.hint(ENABLE_ACCURATE_2D); // slow but less memory maybe?
g.hint(PApplet.DISABLE_STROKE_PERSPECTIVE);
}
private void switchResolution() {
LOGGER.debug("switchResolution");
try {
GraphicsDevice myGraphicsDevice = GraphicsEnvironment
.getLocalGraphicsEnvironment().getDefaultScreenDevice();
this.frame.setResizable(false);
this.frame.setUndecorated(true);
myGraphicsDevice.setFullScreenWindow(this.frame);
this.frame.setVisible(true);
DisplayMode myDisplayMode = new DisplayMode(width, height, 32,
DisplayMode.REFRESH_RATE_UNKNOWN);
myGraphicsDevice.setDisplayMode(myDisplayMode);
} catch (Exception e) {
}
}
void renderSelectorThumbnail(PGraphics g){
}
public void mousePressed() {
startingApp = false; //there was user interaction
if (mouseEvent.getClickCount()==1)mouseSingleClick=true;
if (mouseEvent.getClickCount()==2)mouseDoubleClick=true;
}
}