From b7e570dd5f33c2ef13cb2bc68e0de61a95ab4750 Mon Sep 17 00:00:00 2001 From: "sigonasr2, Sig, Sigo" Date: Mon, 1 Nov 2021 20:46:38 +0000 Subject: [PATCH] Move 3D raytracing engine to new project. --- .gitignore | 2 + .gitpod.yml | 9 +++ .vscode/settings.json | 3 + coauthors.sh | 41 +++++++++++ pom.xml | 96 ++++++++++++++++++++++++++ run | 2 + src/sig/Panel.java | 126 ++++++++++++++++++++++++++++++++++ src/sig/Pixel.java | 13 ++++ src/sig/SigRenderer.java | 142 +++++++++++++++++++++++++++++++++++++++ src/sig/Triangle.java | 70 +++++++++++++++++++ 10 files changed, 504 insertions(+) create mode 100644 .gitignore create mode 100644 .gitpod.yml create mode 100644 .vscode/settings.json create mode 100755 coauthors.sh create mode 100644 pom.xml create mode 100755 run create mode 100644 src/sig/Panel.java create mode 100644 src/sig/Pixel.java create mode 100644 src/sig/SigRenderer.java create mode 100644 src/sig/Triangle.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..92145bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ \ No newline at end of file diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 0000000..7309f7e --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,9 @@ +--- +# List the start up tasks. Learn more https://www.gitpod.io/docs/config-start-tasks/ +tasks: + - init: sh coauthors.sh +vscode: + extensions: + - redhat.java + - mhutchie.git-graph + - vscjava.vscode-maven \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e0f15db --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic" +} \ No newline at end of file diff --git a/coauthors.sh b/coauthors.sh new file mode 100755 index 0000000..1a77cd8 --- /dev/null +++ b/coauthors.sh @@ -0,0 +1,41 @@ +npm i -g git-mob +cat <<-EOF > ~/.git-coauthors +{ + "coauthors": { + "sig": { + "name": "sigonasr2", + "email": "sigonasr2@gmail.com" + } + } +} +EOF +git mob sig +cat <<-EOF > .git/hooks/prepare-commit-msg +#!/usr/bin/env node +let exec = require('child_process').exec, + fs = require('fs'); +const commitMessage = process.argv[2]; +// expect .git/COMMIT_EDITMSG +if(/COMMIT_EDITMSG/g.test(commitMessage)){ + let contents = ""; + exec("git mob-print", + function (err, stdout) { + if(err) { + process.exit(0); + } + // opens .git/COMMIT_EDITMSG + contents = fs.readFileSync(commitMessage); + if(contents.indexOf(stdout.trim()) !== -1) { + process.exit(0); + } + const commentPos = contents.indexOf('# '); + const gitMessage = contents.slice(0, commentPos); + const gitComments = contents.slice(commentPos) + fs.writeFileSync(commitMessage, gitMessage + stdout + gitComments); + process.exit(0); + }); +} +EOF +chmod +x .git/hooks/prepare-commit-msg +cd /workspace/SigRenderer +echo "Environment is setup!" \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2b0b35a --- /dev/null +++ b/pom.xml @@ -0,0 +1,96 @@ + + + + 4.0.0 + + SigRenderer + SigRenderer + 0 + + SigRenderer + + + UTF-8 + 1.8 + 1.8 + + + + + + javax.vecmath + vecmath + 1.5.2 + + + + + src + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + maven-assembly-plugin + + + + sig.SigRenderer + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/run b/run new file mode 100755 index 0000000..8f3f586 --- /dev/null +++ b/run @@ -0,0 +1,2 @@ +mvn compile assembly:single +java -jar target/SigRenderer-0-jar-with-dependencies.jar \ No newline at end of file diff --git a/src/sig/Panel.java b/src/sig/Panel.java new file mode 100644 index 0000000..76df47a --- /dev/null +++ b/src/sig/Panel.java @@ -0,0 +1,126 @@ +package sig; +import javax.swing.JPanel; +import javax.vecmath.Vector3f; + +import java.awt.Graphics; +import java.awt.Color; + +import java.awt.Image; +import java.awt.image.MemoryImageSource; +import java.awt.image.ColorModel; +import java.awt.GraphicsEnvironment; +import java.awt.GraphicsConfiguration; +import java.awt.Toolkit; + +public class Panel extends JPanel implements Runnable { + long startTime = System.nanoTime(); + long endTime = System.nanoTime(); + public int pixel[]; + public int width=SigRenderer.SCREEN_WIDTH; + public int height=SigRenderer.SCREEN_HEIGHT; + private Image imageBuffer; + private MemoryImageSource mImageProducer; + private ColorModel cm; + private Thread thread; + + public Panel() { + super(true); + thread = new Thread(this, "MyPanel Thread"); + } + + /** + * Get Best Color model available for current screen. + * @return color model + */ + protected static ColorModel getCompatibleColorModel(){ + GraphicsConfiguration gfx_config = GraphicsEnvironment. + getLocalGraphicsEnvironment().getDefaultScreenDevice(). + getDefaultConfiguration(); + return gfx_config.getColorModel(); + } + + /** + * Call it after been visible and after resizes. + */ + public void init(){ + cm = getCompatibleColorModel(); + width = getWidth(); + height = getHeight(); + int screenSize = width * height; + if(pixel == null || pixel.length < screenSize){ + pixel = new int[screenSize]; + } + mImageProducer = new MemoryImageSource(width, height, cm, pixel,0, width); + mImageProducer.setAnimated(true); + mImageProducer.setFullBufferUpdates(true); + imageBuffer = Toolkit.getDefaultToolkit().createImage(mImageProducer); + if(thread.isInterrupted() || !thread.isAlive()){ + thread.start(); + } + } + /** + * Do your draws in here !! + * pixel is your canvas! + */ + public /* abstract */ void render(){ + int[] p = pixel; // this avoid crash when resizing + + final int h=SigRenderer.SCREEN_HEIGHT; + if(p.length != width * height) return; + for (int x=0;x pixels; + + public void runGameLoop() { + rot+=Math.PI/480d; + } + + SigRenderer(JFrame f) { + + tri = new Triangle(new Vector3f(-1,-1,0),new Vector3f(0,-1,0),new Vector3f(-1,0,0)); + tri2 = new Triangle(new Vector3f(-1,0,0),new Vector3f(0,-1,0),new Vector3f(0,0,0)); + tri3 = new Triangle(new Vector3f(0,0,0),new Vector3f(0,-1,0),new Vector3f(0,-1,-1)); + tri4 = new Triangle(new Vector3f(0,-1,-1),new Vector3f(0,0,-1),new Vector3f(0,-1,0)); + /*tri5 = new Triangle(new Vector3f(0,-1,0),new Vector3f(0,-1,-1),new Vector3f(0,0,0)); + tri6 = new Triangle(new Vector3f(0,0,0),new Vector3f(0,-1,-1),new Vector3f(0,0,-1));*/ + + Panel p = new Panel(); + + new Thread() { + public void run(){ + while (true) { + long startTime = System.nanoTime(); + runGameLoop(); + p.repaint(); + Toolkit.getDefaultToolkit().sync(); + long endTime = System.nanoTime(); + long diff = endTime-startTime; + try { + long sleepTime = TIMEPERTICK - diff; + long millis = (sleepTime)/1000000; + int nanos = (int)(sleepTime-(((sleepTime)/1000000)*1000000)); + //System.out.println("FRAME DRAWING: Sleeping for ("+millis+"ms,"+nanos+"ns) - "+(diff)+"ns"); + DRAWTIME = (float)diff/1000000; + f.setTitle("Game Loop: "+DRAWTIME+"ms, Draw Loop: "+DRAWLOOPTIME+"ms"); + if (sleepTime>0) { + Thread.sleep(millis,nanos); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + }.start(); + + f.getContentPane().addMouseListener(this); + f.getContentPane().addMouseMotionListener(this); + f.addKeyListener(this); + f.add(p); + f.setSize(SCREEN_WIDTH,SCREEN_HEIGHT); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.setVisible(true); + p.init(); + } + public static void main(String[] args) { + JFrame f = new JFrame("SigRenderer"); + new SigRenderer(f); + } + + @Override + public void mouseClicked(MouseEvent e) { + } + + @Override + public void mousePressed(MouseEvent e) { + } + + @Override + public void mouseReleased(MouseEvent e) { + } + + @Override + public void mouseEntered(MouseEvent e) { + } + + @Override + public void mouseExited(MouseEvent e) { + } + + @Override + public void mouseDragged(MouseEvent e) { + } + + @Override + public void mouseMoved(MouseEvent e) { + } + + @Override + public void keyTyped(KeyEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void keyPressed(KeyEvent e) { + switch (e.getKeyCode()) { + case KeyEvent.VK_UP:{ + origin.add(new Vector3f(0,0,-1)); + }break; + case KeyEvent.VK_RIGHT:{ + origin.add(new Vector3f(1,0,0)); + }break; + case KeyEvent.VK_LEFT:{ + origin.add(new Vector3f(-1,0,0)); + }break; + case KeyEvent.VK_DOWN:{ + origin.add(new Vector3f(0,0,1)); + }break; + } + } + + @Override + public void keyReleased(KeyEvent e) { + // TODO Auto-generated method stub + + } +} diff --git a/src/sig/Triangle.java b/src/sig/Triangle.java new file mode 100644 index 0000000..199b01e --- /dev/null +++ b/src/sig/Triangle.java @@ -0,0 +1,70 @@ +package sig; +import javax.vecmath.Vector3f; + +public class Triangle { + Vector3f A,B,C; + Triangle(Vector3f A,Vector3f B,Vector3f C) { + this.A=A; + this.B=B; + this.C=C; + } + @Override + public String toString() { + return "Triangle [A=" + A + ", B=" + B + ", C=" + C + "]"; + } + + public Vector3f getNormal() { + Vector3f AB = (Vector3f)A.clone(); + AB.sub(B); + Vector3f BC = (Vector3f)B.clone(); + BC.sub(C); + Vector3f crossP = new Vector3f(); + crossP.cross(AB,BC); + //crossP.normalize(); + return crossP; + } + public float distanceFromOrigin() { + return getNormal().dot(A); + } + + public boolean rayTriangleIntersect(Vector3f origin,Vector3f dir) { + Vector3f N = getNormal(); + + float NrayDir = N.dot(dir); + if (NrayDir<=0.001) { //Very small, so it's parallel. + return false; + } + + float d = distanceFromOrigin(); + + float T=(getNormal().dot(origin)+d)/(NrayDir); + + if (T<0) {return false;} //Triangle is behind the ray. + + //System.out.println("Not behind."); + + Vector3f scaleMult = (Vector3f)dir.clone(); + scaleMult.scale(T); + Vector3f P = (Vector3f)origin.clone(); + P.add(scaleMult); + + Vector3f C; + + Vector3f edge0 = (Vector3f)B.clone(); edge0.sub(A); + Vector3f vp0 = (Vector3f)P.clone(); vp0.sub(A); + C = new Vector3f(); C.cross(edge0,vp0); + if (N.dot(C)<0) {return false;} + + Vector3f edge1 = (Vector3f)this.C.clone(); edge1.sub(B); + Vector3f vp1 = (Vector3f)P.clone(); vp1.sub(B); + C = new Vector3f(); C.cross(edge1,vp1); + if (N.dot(C)<0) {return false;} + + Vector3f edge2 = (Vector3f)A.clone(); edge2.sub(this.C); + Vector3f vp2 = (Vector3f)P.clone(); vp2.sub(this.C); + C = new Vector3f(); C.cross(edge2,vp2); + if (N.dot(C)<0) {return false;} + + return true; + } +}