Im currently writing a 3D Lego program, which lets the user add Lego elements to the canvas when they click on a button…
ive thrown together a test window to ensure the element’s file is read and rendered to the screen, but nothing seems to want to render…
I just wondered if i’d made any glaringly obvious mistakes?
Cheers
Chris
Element .DAT File:
0 Created by: Chris Gedrim
0 Creation Date: 07/03/07
0 Used for testing Gedo
0 ------------------------
0 Main Body
0 ------------------------
4 16 -10 0 -10 -10 0 10 10 0 10 10 0 -10
4 16 -10 0 -10 -10 0 10 -10 24 10 -10 24 -10
4 16 -10 0 -10 10 0 -10 10 24 -10 -10 24 -10
4 16 -10 0 10 10 0 10 10 24 10 -10 24 10
4 16 10 0 -10 10 0 10 10 24 10 10 24 -10
4 16 10 24 -10 10 24 10 -10 24 10 -10 24 -10
0 ------------------------
0 Stud
0 ------------------------
4 16 -6 24 2 -2 24 6 -2 28 6 -6 28 2
4 16 -2 24 6 2 24 6 2 28 6 -2 28 6
4 16 2 24 6 6 24 2 6 28 2 2 28 6
4 16 6 24 2 6 24 -2 6 28 -2 6 28 2
4 16 6 24 -2 2 24 -6 2 28 -6 2 28 -2
4 16 2 24 -6 -2 24 -6 -2 28 -6 2 28 -6
4 16 -2 24 -6 -6 24 -2 -6 28 -2 -2 28 -6
4 16 -6 24 -6 -6 24 -2 -6 24 -2 -2 28 -6
0 ------------------------
0 Stud top
0 ------------------------
4 16 -2 28 2 2 28 2 2 28 -2 -2 28 -2
4 16 -2 28 2 2 28 2 2 28 6 -2 28 6
4 16 2 28 2 2 28 -2 6 28 -2 6 28 2
4 16 2 28 -2 -2 28 -2 -2 28 -6 2 28 -6
4 16 -2 28 -2 -2 28 2 -6 28 2 -6 28 -2
3 16 -2 28 2 -2 28 6 -6 28 2
3 16 2 28 2 2 28 6 6 28 2
3 16 2 28 -2 6 28 -2 2 28 -6
3 16 -2 28 -6 -2 28 -6 -6 28 -2
0 ------------------------
0 End
0 ------------------------
Canvas Window:
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;
import javax.swing.*;
import net.java.games.jogl.*;
public class DrawingFrame extends JFrame implements ActionListener{
DrawingFrameEventListener listener = new DrawingFrameEventListener();
GLCanvas glCanvas;
String[] elementDesign = null;
public static void main(String[] args) {
final DrawingFrame app = new DrawingFrame();
// show what we've done
SwingUtilities.invokeLater (
new Runnable() {
public void run() {
app.setVisible(true);
}
}
);
}
public DrawingFrame() {
//set the JFrame title
super("Gedo - Lego Design");
//kill the process when the JFrame is closed
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Setting up our southern JPanel
JPanel jp = new JPanel();
//adding the JButton
JButton jb = new JButton("Brick 1x1");
jb.addActionListener(this);
jp.add(jb);
getContentPane().add("South", jp);
//only three JOGL lines of code ... and here they are
GLCapabilities glCaps = new GLCapabilities();
glCanvas =
GLDrawableFactory.getFactory().createGLCanvas(glCaps);
glCanvas.addGLEventListener(listener);
//add the GLCanvas just like we would any Component
getContentPane().add(glCanvas, BorderLayout.CENTER);
setSize(640, 480);
//center the JFrame on the screen
centerWindow(this);
}
public void centerWindow(Component frame) {
Dimension screenSize =
Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.width > screenSize.width )
frameSize.width = screenSize.width;
if (frameSize.height > screenSize.height)
frameSize.height = screenSize.height;
frame.setLocation (
(screenSize.width - frameSize.width ) >> 1,
(screenSize.height - frameSize.height) >> 1
);
}
/**
* Implementation of our ActionListener. This allows the
* buttons to perform an action. In this case they set
* the "whatToDraw" String and ask for a repaint of the
* GLCanvas.
*/
public void actionPerformed(ActionEvent ae) {
listener.elementDesign = getDesign();
glCanvas.repaint();
}
public String[] getDesign()
{
String line = "", i = "";
File elementFile = new File("PARTS\\001.DAT");
if(elementDesign == null)
{
try
{
BufferedReader tIn = new BufferedReader(new FileReader(elementFile));
try
{
while(( i = tIn.readLine()) != null)
{
line = line + "
" + i;
}
elementDesign = line.split("
");
tIn.close();
}
catch(IOException eIOE)
{
System.out.println("Could not read from file : " + elementFile);
}
}
catch(FileNotFoundException eFNF)
{
System.out.println("File : " + elementFile + " could not be found");
}
}
else
{
System.out.println("File in memory");
}
return elementDesign;
}
}
Canvas Listener:
import net.java.games.jogl.*;
public class DrawingFrameEventListener
implements GLEventListener {
public String[] elementDesign = null;
public double[] matrix = {1,0,0,0,1,0,0,0,1};
/**
* Take care of initialization here.
*/
public void init(GLDrawable gld) {
GL gl = gld.getGL();
GLU glu = gld.getGLU();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glViewport(-320, -240, 320, 150);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, 640/480, -100.0, 100.0);
//glu.gluOrtho2D(-320.0, 320.0, -240.0, 240.0);
//glu.gluLookAt(100.0, 100.0, 100.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
}
/**
* Take care of drawing here.
*/
public void display(GLDrawable drawable) {
float red = 0.5f;
float green = 0.0f;
float blue = 0.5f;
GL gl = drawable.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glColor3f(red, green, blue);
/*gl.glBegin(gl.GL_QUADS);
gl.glVertex3d(10,10,0);
gl.glVertex3d(-10,10,0);
gl.glVertex3d(-10,-10,0);
gl.glVertex3d(10,-10,0);
gl.glEnd();*/
if(elementDesign != null)
{
for(int i=0;i<elementDesign.length;i++) // Loop through the part
{
String[] temp;
double x,y,z;
temp = elementDesign[i].split(" "); // Split the design section into component parts
//System.out.println("elementDesign[i] = " + elementDesign[i]);
if(elementDesign[i].length() > 1)
{
switch(Integer.parseInt(temp[0])) // Switch based on the first line of the element design
{
// Comment or META-TAG
case 0:
break;
// External Part
/*case 1:
temp = elementDesign[i].split(" "); // Split the design section into component parts
LegoElement tEleTemp = new LegoElement(temp[14], "P\\" + temp[14]);
x = Double.parseDouble(temp[2]);
y = Double.parseDouble(temp[3]);
z = Double.parseDouble(temp[4]);
tEleTemp.sematrix(new double[]{Double.parseDouble(temp[5]),Double.parseDouble(temp[6]),Double.parseDouble(temp[7]),Double.parseDouble(temp[8]),Double.parseDouble(temp[9]),Double.parseDouble(temp[10]),Double.parseDouble(temp[11]),Double.parseDouble(temp[12]),Double.parseDouble(temp[13])});
tEleTemp.addElement();
tEleTemp.resematrix();
gl.glTranslated(x,y,z);
gl.glCallList(Integer.parseInt(temp[14].substring(0,temp[14].indexOf("."))));
break;
*/
// Line
case 2:
System.out.println("2");
gl.glBegin(gl.GL_LINES);
x = Double.parseDouble(temp[2]);
y = Double.parseDouble(temp[3]);
z = Double.parseDouble(temp[4]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
x = Double.parseDouble(temp[5]);
y = Double.parseDouble(temp[6]);
z = Double.parseDouble(temp[7]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
gl.glEnd();
break;
// Triangle
case 3:
System.out.println("3");
gl.glBegin(gl.GL_TRIANGLES);
x = Double.parseDouble(temp[2]);
y = Double.parseDouble(temp[3]);
z = Double.parseDouble(temp[4]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
x = Double.parseDouble(temp[5]);
y = Double.parseDouble(temp[6]);
z = Double.parseDouble(temp[7]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
x = Double.parseDouble(temp[8]);
y = Double.parseDouble(temp[9]);
z = Double.parseDouble(temp[10]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
gl.glEnd();
break;
// Quad
case 4:
System.out.println("4");
gl.glBegin(gl.GL_QUADS);
x = Double.parseDouble(temp[2]);
y = Double.parseDouble(temp[3]);
z = Double.parseDouble(temp[4]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
x = Double.parseDouble(temp[5]);
y = Double.parseDouble(temp[6]);
z = Double.parseDouble(temp[7]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
x = Double.parseDouble(temp[8]);
y = Double.parseDouble(temp[9]);
z = Double.parseDouble(temp[10]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
x = Double.parseDouble(temp[11]);
y = Double.parseDouble(temp[12]);
z = Double.parseDouble(temp[13]);
x = (x*matrix[0]) + (x*matrix[3]) + (x*matrix[6]);
y = (x*matrix[1]) + (x*matrix[4]) + (x*matrix[7]);
z = (x*matrix[2]) + (x*matrix[5]) + (x*matrix[8]);
System.out.println(x + " " + y + " " + z);
gl.glVertex3d(x,y,z);
gl.glEnd();
break;
// Option Line
case 5:
break;
default:
break;
}
}
}
}
}
public void reshape(
GLDrawable drawable,
int x,
int y,
int width,
int height
) {}
public void displayChanged(
GLDrawable drawable,
boolean modeChanged,
boolean deviceChanged
) {}
}