commit
b7e570dd5f
@ -0,0 +1,2 @@ |
|||||||
|
/bin/ |
||||||
|
/target/ |
@ -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 |
@ -0,0 +1,3 @@ |
|||||||
|
{ |
||||||
|
"java.configuration.updateBuildConfiguration": "automatic" |
||||||
|
} |
@ -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!" |
@ -0,0 +1,96 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
|
||||||
|
<groupId>SigRenderer</groupId> |
||||||
|
<artifactId>SigRenderer</artifactId> |
||||||
|
<version>0</version> |
||||||
|
|
||||||
|
<name>SigRenderer</name> |
||||||
|
|
||||||
|
<properties> |
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||||
|
<maven.compiler.source>1.8</maven.compiler.source> |
||||||
|
<maven.compiler.target>1.8</maven.compiler.target> |
||||||
|
</properties> |
||||||
|
|
||||||
|
<dependencies> |
||||||
|
<!-- https://mvnrepository.com/artifact/javax.vecmath/vecmath --> |
||||||
|
<dependency> |
||||||
|
<groupId>javax.vecmath</groupId> |
||||||
|
<artifactId>vecmath</artifactId> |
||||||
|
<version>1.5.2</version> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
|
||||||
|
<build> |
||||||
|
<sourceDirectory>src</sourceDirectory> |
||||||
|
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> |
||||||
|
<plugins> |
||||||
|
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-clean-plugin</artifactId> |
||||||
|
<version>3.1.0</version> |
||||||
|
</plugin> |
||||||
|
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-resources-plugin</artifactId> |
||||||
|
<version>3.0.2</version> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-compiler-plugin</artifactId> |
||||||
|
<version>3.8.0</version> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-surefire-plugin</artifactId> |
||||||
|
<version>2.22.1</version> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-jar-plugin</artifactId> |
||||||
|
<version>3.0.2</version> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-install-plugin</artifactId> |
||||||
|
<version>2.5.2</version> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-deploy-plugin</artifactId> |
||||||
|
<version>2.8.2</version> |
||||||
|
</plugin> |
||||||
|
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-site-plugin</artifactId> |
||||||
|
<version>3.7.1</version> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-project-info-reports-plugin</artifactId> |
||||||
|
<version>3.0.0</version> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<artifactId>maven-assembly-plugin</artifactId> |
||||||
|
<configuration> |
||||||
|
<archive> |
||||||
|
<manifest> |
||||||
|
<mainClass>sig.SigRenderer</mainClass> |
||||||
|
</manifest> |
||||||
|
</archive> |
||||||
|
<descriptorRefs> |
||||||
|
<descriptorRef>jar-with-dependencies</descriptorRef> |
||||||
|
</descriptorRefs> |
||||||
|
</configuration> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<id>make-assembly</id> <!-- this is used for inheritance merges --> |
||||||
|
<phase>package</phase> <!-- bind to the packaging phase --> |
||||||
|
<goals> |
||||||
|
<goal>single</goal> |
||||||
|
</goals> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
</plugin> |
||||||
|
</plugins> |
||||||
|
</pluginManagement> |
||||||
|
</build> |
||||||
|
</project> |
@ -0,0 +1,2 @@ |
|||||||
|
mvn compile assembly:single |
||||||
|
java -jar target/SigRenderer-0-jar-with-dependencies.jar |
@ -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<SigRenderer.SCREEN_WIDTH/SigRenderer.RESOLUTION;x++) { |
||||||
|
for (int y=0;y<SigRenderer.SCREEN_HEIGHT/SigRenderer.RESOLUTION;y++) { |
||||||
|
Vector3f dir = new Vector3f((-SigRenderer.SCREEN_WIDTH/2f+x*SigRenderer.RESOLUTION),(-SigRenderer.SCREEN_HEIGHT/2f+y*SigRenderer.RESOLUTION),SigRenderer.SCREEN_WIDTH); |
||||||
|
if (SigRenderer.tri.rayTriangleIntersect(SigRenderer.origin, dir)) { |
||||||
|
p[ (int)(SigRenderer.SCREEN_WIDTH-x*SigRenderer.RESOLUTION) + (int)(SigRenderer.SCREEN_HEIGHT-y*SigRenderer.RESOLUTION) * width] = Color.WHITE.getRGB(); |
||||||
|
} |
||||||
|
if (SigRenderer.tri2.rayTriangleIntersect(SigRenderer.origin, dir)) { |
||||||
|
p[ (int)(SigRenderer.SCREEN_WIDTH-x*SigRenderer.RESOLUTION) + (int)(SigRenderer.SCREEN_HEIGHT-y*SigRenderer.RESOLUTION) * width] = Color.BLUE.getRGB(); |
||||||
|
} |
||||||
|
if (SigRenderer.tri3.rayTriangleIntersect(SigRenderer.origin, dir)) { |
||||||
|
p[ (int)(SigRenderer.SCREEN_WIDTH-x*SigRenderer.RESOLUTION) + (int)(SigRenderer.SCREEN_HEIGHT-y*SigRenderer.RESOLUTION) * width] = Color.RED.getRGB(); |
||||||
|
} |
||||||
|
if (SigRenderer.tri4.rayTriangleIntersect(SigRenderer.origin, dir)) { |
||||||
|
p[ (int)(SigRenderer.SCREEN_WIDTH-x*SigRenderer.RESOLUTION) + (int)(SigRenderer.SCREEN_HEIGHT-y*SigRenderer.RESOLUTION) * width] = Color.GREEN.getRGB(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
i += 1; |
||||||
|
j += 1; |
||||||
|
endTime=System.nanoTime(); |
||||||
|
SigRenderer.DRAWLOOPTIME=(endTime-startTime)/1000000f; |
||||||
|
} |
||||||
|
private int i=1,j=256; |
||||||
|
|
||||||
|
public void repaint() { |
||||||
|
super.repaint(); |
||||||
|
startTime = System.nanoTime(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paintComponent(Graphics g) { |
||||||
|
super.paintComponent(g); |
||||||
|
// perform draws on pixels
|
||||||
|
render(); |
||||||
|
// ask ImageProducer to update image
|
||||||
|
mImageProducer.newPixels(); |
||||||
|
// draw it on panel
|
||||||
|
g.drawImage(this.imageBuffer, 0, 0, this); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Overrides ImageObserver.imageUpdate. |
||||||
|
* Always return true, assuming that imageBuffer is ready to go when called |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public boolean imageUpdate(Image image, int a, int b, int c, int d, int e) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
while (true) { |
||||||
|
// request a JPanel re-drawing
|
||||||
|
repaint(); |
||||||
|
try {Thread.sleep(5);} catch (InterruptedException e) {} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package sig; |
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
|
||||||
|
public class Pixel { |
||||||
|
int x,y; |
||||||
|
Color col; |
||||||
|
Pixel(int x,int y,Color col) { |
||||||
|
this.x=x; |
||||||
|
this.y=y; |
||||||
|
this.col=col; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,142 @@ |
|||||||
|
package sig; |
||||||
|
import javax.swing.JFrame; |
||||||
|
import javax.vecmath.Point2d; |
||||||
|
import javax.vecmath.Tuple3d; |
||||||
|
import javax.vecmath.Vector3f; |
||||||
|
import java.awt.event.MouseEvent; |
||||||
|
import java.awt.event.MouseListener; |
||||||
|
import java.awt.event.MouseMotionListener; |
||||||
|
import java.awt.event.KeyEvent; |
||||||
|
import java.awt.event.KeyListener; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.awt.Toolkit; |
||||||
|
import java.awt.Color; |
||||||
|
|
||||||
|
public class SigRenderer implements KeyListener,MouseListener,MouseMotionListener{ |
||||||
|
public static Triangle tri,tri2,tri3,tri4,tri5,tri6; |
||||||
|
public final static int SCREEN_WIDTH=1280; |
||||||
|
public final static int SCREEN_HEIGHT=720; |
||||||
|
public final static long TIMEPERTICK = 16666667l; |
||||||
|
public static float DRAWTIME=0; |
||||||
|
public static float DRAWLOOPTIME=0; |
||||||
|
public static final float RESOLUTION=1; |
||||||
|
|
||||||
|
public static Vector3f origin = new Vector3f(0,0,10); |
||||||
|
public static float rot = (float)Math.PI/4; //In radians.
|
||||||
|
|
||||||
|
public static List<Pixel> 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
|
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -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; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue