diff --git a/.idea/libraries/Maven__com_github_sarxos_webcam_capture_0_3_12.xml b/.idea/libraries/Maven__com_github_sarxos_webcam_capture_0_3_12.xml
new file mode 100644
index 0000000..bf31b20
--- /dev/null
+++ b/.idea/libraries/Maven__com_github_sarxos_webcam_capture_0_3_12.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.github.sarxos:webcam-capture:0.3.12">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/github/sarxos/webcam-capture/0.3.12/webcam-capture-0.3.12.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/github/sarxos/webcam-capture/0.3.12/webcam-capture-0.3.12-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/github/sarxos/webcam-capture/0.3.12/webcam-capture-0.3.12-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__com_nativelibs4java_bridj_0_7_0.xml b/.idea/libraries/Maven__com_nativelibs4java_bridj_0_7_0.xml
new file mode 100644
index 0000000..4943dee
--- /dev/null
+++ b/.idea/libraries/Maven__com_nativelibs4java_bridj_0_7_0.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.nativelibs4java:bridj:0.7.0">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/nativelibs4java/bridj/0.7.0/bridj-0.7.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/nativelibs4java/bridj/0.7.0/bridj-0.7.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/nativelibs4java/bridj/0.7.0/bridj-0.7.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_2.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_2.xml
new file mode 100644
index 0000000..7d29533
--- /dev/null
+++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_2.xml
@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.slf4j:slf4j-api:1.7.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.2/slf4j-api-1.7.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.2/slf4j-api-1.7.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.2/slf4j-api-1.7.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>
\ No newline at end of file
diff --git a/EPQ 3D renderer.iml b/EPQ 3D renderer.iml
index 50eaffd..178f8b2 100644
--- a/EPQ 3D renderer.iml
+++ b/EPQ 3D renderer.iml
@@ -13,6 +13,8 @@
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="library" name="opencsv-5.7.1" level="project" />
     <orderEntry type="library" name="Maven: com.googlecode.json-simple:json-simple:1.1" level="project" />
-    <orderEntry type="library" name="Maven: org.spigotmc:minecraft-server:1.14.4-SNAPSHOT" level="project" />
+    <orderEntry type="library" name="Maven: com.github.sarxos:webcam-capture:0.3.12" level="project" />
+    <orderEntry type="library" name="Maven: com.nativelibs4java:bridj:0.7.0" level="project" />
+    <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.2" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/jsonTextures.json b/jsonTextures.json
index ca60de7..679afc7 100644
--- a/jsonTextures.json
+++ b/jsonTextures.json
@@ -1,3 +1,3 @@
 {"textures": [{"name": "Dots Stroke", "type": "solid", "color": "cccccc", "imgPath": "/"}, {"name": "Material", "type": "solid", "color": "cccccc", "imgPath": "/"}, 
-{"name": "Material.002", "type": "image", "color": "cccccc", "imgPath": "Grass block.png"},
+{"name": "Material.002", "type": "camera", "color": "cccccc", "imgPath": "Grass block.png"},
 {"name": "Material.001", "type": "image", "color": "cccccc", "imgPath": "Grass block.png"}]}
diff --git a/pom.xml b/pom.xml
index f144601..96ba067 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,5 +24,10 @@
       <artifactId>json-simple</artifactId>
       <version>1.1</version>
     </dependency>
+    <dependency>
+      <groupId>com.github.sarxos</groupId>
+      <artifactId>webcam-capture</artifactId>
+      <version>0.3.12</version>
+    </dependency>
   </dependencies>
 </project>
diff --git a/src/main/java/uk/org/floop/epq3d/JsonReader.java b/src/main/java/uk/org/floop/epq3d/JsonReader.java
index 8ef4d7c..49566e8 100644
--- a/src/main/java/uk/org/floop/epq3d/JsonReader.java
+++ b/src/main/java/uk/org/floop/epq3d/JsonReader.java
@@ -111,6 +111,8 @@
                 result[i] = new Texture(JsonTexture.get("name").toString(), Color.decode('#' + (String) JsonTexture.get("color")));
             } else if(Objects.equals(JsonTexture.get("type"), "image")){
                 result[i] = new Texture(JsonTexture.get("name").toString(), Color.decode('#' + (String) JsonTexture.get("color")), (String) JsonTexture.get("imgPath"));
+            } else if(Objects.equals(JsonTexture.get("type"), "camera")){
+                result[i] = new Texture(JsonTexture.get("name").toString());
             }
         }
         return result;
diff --git a/src/main/java/uk/org/floop/epq3d/Object3d.java b/src/main/java/uk/org/floop/epq3d/Object3d.java
index 0d8b1c2..417aecd 100644
--- a/src/main/java/uk/org/floop/epq3d/Object3d.java
+++ b/src/main/java/uk/org/floop/epq3d/Object3d.java
@@ -31,6 +31,10 @@
                 faces) {
             face.invalidate();
         }
+        for (Texture texture:
+        textures){
+            texture.invalidate();
+        }
     }
 
     public void draw(drawData drawData, ArrayList<Integer> frustumInfo) {
diff --git a/src/main/java/uk/org/floop/epq3d/ObjectCollection.java b/src/main/java/uk/org/floop/epq3d/ObjectCollection.java
index 21b8e7c..67c24c2 100644
--- a/src/main/java/uk/org/floop/epq3d/ObjectCollection.java
+++ b/src/main/java/uk/org/floop/epq3d/ObjectCollection.java
@@ -160,4 +160,4 @@
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/uk/org/floop/epq3d/Screen.java b/src/main/java/uk/org/floop/epq3d/Screen.java
index 87b6ec3..9b581df 100644
--- a/src/main/java/uk/org/floop/epq3d/Screen.java
+++ b/src/main/java/uk/org/floop/epq3d/Screen.java
@@ -141,13 +141,14 @@
         drawData.lastFrameTime = System.currentTimeMillis()- lastTime;
         lastTime = System.currentTimeMillis();
         mainCollection.invalidate(true);
+
         ArrayList<Integer> FrustumInfo = new ArrayList<>();
         for(int i = 0; i<6; i += 1){FrustumInfo.add(i);}
         mainCollection.draw(drawData, FrustumInfo);
         // DEBUG DRAWING
         {
             //debugImg.getGraphics().drawString(Math.round(1000 / (float) (System.currentTimeMillis() - lastTime)) + " fps", 10, 10);
-            drawData.debugImg.getGraphics().drawString("FrameTime: " + (System.currentTimeMillis() - lastTime) + " millis", 10, 10);
+            drawData.debugImg.getGraphics().drawString("FrameTime: " + (drawData.lastFrameTime) + " millis", 10, 10);
             if(drawData.debugHud) {
                 drawData.debugImg.getGraphics().drawString("fpPos: " +
                         String.format("%.2f", player.FPWorldPos.x) + " " +
@@ -182,6 +183,7 @@
                             String.format("%.2f", drawData.frustumPlanes[i].normalVector.z), 10, 170 + 20 * i);
                 }
             }
+            long lastTime1 = System.currentTimeMillis();
             // write debug overlay
             for(int x = 0; x < drawData.scrX; x +=1){
                 for(int y = 0; y < drawData.scrY; y += 1){
@@ -193,33 +195,17 @@
                 }
             }
             g.drawImage(drawData.bufImg, 0, 0, this);
-            g.drawImage(drawData.debugImg, 0, 0, this);
-            for(int x = 0; x < drawData.scrX; x +=1){
-                for(int y = 0; y < drawData.scrY; y += 1){
-                    drawData.debugImg.setRGB(x, y, 0);
-                }
-            }
+//            g.drawImage(drawData.debugImg, 0, 0, this);
+//            for(int x = 0; x < drawData.scrX; x +=1){
+//                for(int y = 0; y < drawData.scrY; y += 1){
+//                    drawData.debugImg.setRGB(x, y, 0);
+//                }
+//            }
+            System.out.println(System.currentTimeMillis() - lastTime1);
         }
         //System.out.println(drawData.timeSpentChoppingFaces + ", " + drawData.timeSpentDrawingNormalFaces);
         drawData.timeSpentChoppingFaces = 0;
         drawData.timeSpentDrawingNormalFaces = 0;
-
-//        HTTPPost post = new HTTPPost();
-//        // json WRITING
-//        json = new JsonWriter();
-//        Point3D[] vertexList;
-//        int[][] faceList;
-//
-//        // camera object
-//        vertexList = new Point3D[5];
-//        faceList = new int[][]{{0, 1, 2, 3}};
-//        for (int i = 0; i < 4; i += 1) {
-//            vertexList[i] = player.ScreenCornerPosS[i].getRotatedPoint();
-//        }
-//        vertexList[4] = player.FPWorldPos;
-//        json.addBlenderObject(vertexList, faceList);
-//
-//        post.invokePost(json);
     }
 
     @Override
diff --git a/src/main/java/uk/org/floop/epq3d/Texture.java b/src/main/java/uk/org/floop/epq3d/Texture.java
index 5d256f9..62ceadd 100644
--- a/src/main/java/uk/org/floop/epq3d/Texture.java
+++ b/src/main/java/uk/org/floop/epq3d/Texture.java
@@ -1,5 +1,7 @@
 package uk.org.floop.epq3d;
 
+import com.github.sarxos.webcam.Webcam;
+
 import javax.imageio.ImageIO;
 import java.awt.*;
 import java.awt.image.BufferedImage;
@@ -8,11 +10,13 @@
 import java.util.Objects;
 
 public class Texture {
+    boolean valid = false;
+    int index = 0;
     protected final String name;
     private final String type;
-    public int[][] img;
+    public simpleImage image;
     public Color color;
-
+    public Webcam camera;
     public Texture(String _name, Color _color) {
         name = _name;
         type = "solid";
@@ -27,18 +31,35 @@
         String path = System.getProperty("user.dir") + "/" + _imgPath;
         File imgFile = new File(path);
         try {
-            BufferedImage _img = ImageIO.read(imgFile);
-            img = new int[_img.getWidth()][_img.getHeight()];
-            for (int x = 0; x < _img.getWidth(); x += 1) {
-                for (int y = 0; y < _img.getHeight(); y += 1) {
-                    img[x][y] = _img.getRGB(x, y);
-                }
-            }
+            image = new simpleImage(ImageIO.read(imgFile));
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     }
+    public Texture(String _name){
+        name = _name;
+        type = "camera";
+        camera = Webcam.getDefault();
+        camera.open(true);
+    }
+    public void invalidate(){
+        index += 1;
+        if(index == 10){
+            nextFrame();
+            index = 0;
+        }
+//        if(index < 0) {
+//        }
+        valid = true;
 
+    }
+    public void nextFrame(){
+        BufferedImage newImg = camera.getImage();
+        if(newImg != null){
+            image = new simpleImage(newImg);
+        }
+
+    }
     public boolean isSolid() {
         if (Objects.equals(type, "solid")) {
             return true;
@@ -59,14 +80,21 @@
                     (int) (Math.min(255, (b + 255*(multiplier-1)) * multiplier - 255*(multiplier-1))));
     }
     public Color getColor(double ang, int x, int y) {
-        double multiplier = 1.5 - ang/(Math.PI);
-        int rgb = img[x][y];
-        int r = (rgb >> 16) & 0xff;
-        int g = (rgb >> 8) & 0xff;
-        int b = rgb & 0xff;
+//        if(!valid && Objects.equals(type, "camera")){
+//            nextFrame();
+//            valid = true;
+//        }
+        double multiplier = 1.5 - ang / (Math.PI);
+        int[] rgb;
+        rgb = image.getPixel(x, y);
+        ;
+//        int r = (rgb >> 16) & 0xff;
+//        int g = (rgb >> 8) & 0xff;
+//        int b = rgb & 0xff;
         return new Color(
-                (int) (Math.min(255, (r + 255*(multiplier-1)) * multiplier - 255*(multiplier-1))),
-                (int) (Math.min(255, (g + 255*(multiplier-1)) * multiplier - 255*(multiplier-1))),
-                (int) (Math.min(255, (b + 255*(multiplier-1)) * multiplier - 255*(multiplier-1))));
+                (int) (Math.min(255, (rgb[0] + 255 * (multiplier - 1)) * multiplier - 255 * (multiplier - 1))),
+                (int) (Math.min(255, (rgb[1] + 255 * (multiplier - 1)) * multiplier - 255 * (multiplier - 1))),
+                (int) (Math.min(255, (rgb[2] + 255 * (multiplier - 1)) * multiplier - 255 * (multiplier - 1))));
     }
+
 }
diff --git a/src/main/java/uk/org/floop/epq3d/Triangle.java b/src/main/java/uk/org/floop/epq3d/Triangle.java
index f05ae28..0ede463 100644
--- a/src/main/java/uk/org/floop/epq3d/Triangle.java
+++ b/src/main/java/uk/org/floop/epq3d/Triangle.java
@@ -338,11 +338,6 @@
                 (x - startPoint.x)* xzGradient +
                 (y - startPoint.y)* yzGradient));
         int newZ = (int)(2147483647d/(zVal + 1));
-//        if (newZ == 2147483647){
-//            System.out.println((1/startPoint.z +
-//                    (x - startPoint.x)*xzGradient +
-//                    (y - startPoint.y)*yzGradient));
-//        }
         // if the new Z value is greater than the existing Z value on the buffer, the new pixel is calculated and drawn
         if(drawData.zBuf[x][y] == 0 ||
         newZ > drawData.zBuf[x][y]){ //newZ > zBuf.getRGB(x, y) ||
@@ -352,8 +347,8 @@
             if(isTextured){
                 double[] pos = textureMappingMatrix.multiplyPoint2raw(x, y);
                 pixColor = texture.getColor(ang,
-                        Math.floorMod((int)(pos[0]*texture.img.length), texture.img.length),
-                        Math.floorMod(-1-(int)(pos[1]*texture.img[0].length), texture.img[0].length)
+                        Math.floorMod((int)(pos[0]*texture.image.getWidth()), texture.image.getWidth()),
+                        Math.floorMod(-1-(int)(pos[1]*texture.image.getHeight()), texture.image.getHeight())
                 );
             } else {
                 pixColor = texture.getColor(ang);
diff --git a/src/main/java/uk/org/floop/epq3d/drawData.java b/src/main/java/uk/org/floop/epq3d/drawData.java
index f3b618c..e718921 100644
--- a/src/main/java/uk/org/floop/epq3d/drawData.java
+++ b/src/main/java/uk/org/floop/epq3d/drawData.java
@@ -31,6 +31,7 @@
     // player
     public double playerSpeed;
     public double playerSprintModifier;
+    public simpleImage simImg;
     // draw onto
     BufferedImage bufImg;
     public int[][] drawImg;
diff --git a/src/main/java/uk/org/floop/epq3d/simpleImage.java b/src/main/java/uk/org/floop/epq3d/simpleImage.java
index ec5d854..0d70f6e 100644
--- a/src/main/java/uk/org/floop/epq3d/simpleImage.java
+++ b/src/main/java/uk/org/floop/epq3d/simpleImage.java
@@ -1,20 +1,41 @@
 package uk.org.floop.epq3d;
 
 import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferByte;
 import java.awt.image.ImageObserver;
 import java.awt.image.ImageProducer;
 
 public class simpleImage extends Image {
+    private int width;
+    private int height;
+    private byte[] data;
+    public simpleImage(BufferedImage img){
+        //System.out.println(img.getType());
+        width = img.getWidth();
+        height = img.getHeight();
+        data = ((DataBufferByte)img.getRaster().getDataBuffer()).getData() ;
+    }
+    public simpleImage(int x, int y){
+        //System.out.println(img.getType());
+        width = x;
+        height = y;
+        data = new byte[x*y*3];
+    }
     @Override
     public int getWidth(ImageObserver observer) {
-        return 0;
+        return width;
     }
-
+    public int getWidth(){
+        return width;
+    }
     @Override
     public int getHeight(ImageObserver observer) {
-        return 0;
+        return height;
     }
-
+    public int getHeight(){
+        return height;
+    }
     @Override
     public ImageProducer getSource() {
         return null;
@@ -29,4 +50,44 @@
     public Object getProperty(String name, ImageObserver observer) {
         return null;
     }
+    public int[] getPixel(int x, int y){
+        return new int[]{
+                Byte.toUnsignedInt(data[3*(y*width + x)]),
+                Byte.toUnsignedInt(data[3*(y*width + x)+1]),
+                Byte.toUnsignedInt(data[3*(y*width + x)+2])};
+    }
+    public int getRGB(int x, int y){
+        int result =
+                Byte.toUnsignedInt(data[(3 * y * width + x)])|
+                Byte.toUnsignedInt(data[(3 * y * width + x)+1]) << 8|
+                Byte.toUnsignedInt(data[(3 * y * width + x)+2]) << 16;
+        if(result != 0){
+            int debug = 1;
+        }
+        return result;
+    }
+
+    public void setRGB(int x, int y, int i) {
+        data[(3 * y * width + x)] = (byte) (i & 0xff);
+        data[(3*y*width + x)+1] = (byte) ((i >> 8) & 0xff);
+        data[(3*y*width + x)+2] = (byte) ((i >> 16) & 0xff);
+    }
+    public BufferedImage getBufferedImage(){
+//        try {
+//            BufferedImage result = ImageIO.read(new ByteArrayInputStream(data));
+//            return result;
+//        } catch (IOException e) {
+//            throw new RuntimeException(e);
+//        }
+        BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for(int x = 0; x < width; x += 1){
+            for(int y = 0; y < height; y += 1){
+                result.setRGB(x, y,
+                                data[3*(y*width + x)]+
+                                data[3*(y*width + x)+1]<<8+
+                                data[3*(y*width + x)+2]<<16);
+            }
+        }
+        return result;
+    }
 }
diff --git a/src/main/java/uk/org/floop/epq3d/testing.java b/src/main/java/uk/org/floop/epq3d/testing.java
index 8066e9a..2a30ed4 100644
--- a/src/main/java/uk/org/floop/epq3d/testing.java
+++ b/src/main/java/uk/org/floop/epq3d/testing.java
@@ -1,7 +1,16 @@
 package uk.org.floop.epq3d;
 
+
+import com.github.sarxos.webcam.Webcam;
+
+import java.awt.image.BufferedImage;
+
 class testing {
     public static void main(String[] args) {
-        System.out.println(System.getProperty("user.dir"));
+        Webcam webcam = Webcam.getDefault();
+        webcam.open();
+
+        BufferedImage image = webcam.getImage();
+        int x = 0;
     }
 }