diff --git a/src/sig/Panel.java b/src/sig/Panel.java index fc5b9ee..808b494 100644 --- a/src/sig/Panel.java +++ b/src/sig/Panel.java @@ -120,9 +120,9 @@ public class Panel extends JPanel implements Runnable { Vector vTarget = new Vector(0,(float)Math.sin(SigRenderer.pitch),(float)Math.cos(SigRenderer.pitch)); Matrix matCameraRot = Matrix.MakeRotationY(SigRenderer.yaw); SigRenderer.vLookDir = Matrix.MultiplyVector(matCameraRot,vTarget); - vTarget = Vector.add(SigRenderer.vCamera,SigRenderer.vLookDir); + vTarget = Vector.add(Vector.add(SigRenderer.vCamera,SigRenderer.vCameraOffset),SigRenderer.vLookDir); - Matrix matCamera = Matrix.PointAt(SigRenderer.vCamera, vTarget, vUp); + Matrix matCamera = Matrix.PointAt(Vector.add(SigRenderer.vCamera,SigRenderer.vCameraOffset), vTarget, vUp); Matrix matView = Matrix.QuickInverse(matCamera); if (workerThread==null||(!workerThread.isAlive()&&renderNeeded)) { @@ -406,12 +406,14 @@ public class Panel extends JPanel implements Runnable { normal = Vector.normalize(normal); Vector center = Vector.divide(Vector.add(triTransformed.A,Vector.add(triTransformed.B,triTransformed.C)),3); + + Vector newCamera = Vector.add(SigRenderer.vCamera,SigRenderer.vCameraOffset); - Vector cameraRay = Vector.subtract(center,SigRenderer.vCamera); + Vector cameraRay = Vector.subtract(center,newCamera); - float distSquared = ((triTransformed.b.pos.x-SigRenderer.vCamera.x)*(triTransformed.b.pos.x-SigRenderer.vCamera.x)+ - (triTransformed.b.pos.y-SigRenderer.vCamera.y)*(triTransformed.b.pos.y-SigRenderer.vCamera.y)+ - (triTransformed.b.pos.z-SigRenderer.vCamera.z)*(triTransformed.b.pos.z-SigRenderer.vCamera.z)); + float distSquared = ((triTransformed.b.pos.x-newCamera.x)*(triTransformed.b.pos.x-newCamera.x)+ + (triTransformed.b.pos.y-newCamera.y)*(triTransformed.b.pos.y-newCamera.y)+ + (triTransformed.b.pos.z-newCamera.z)*(triTransformed.b.pos.z-newCamera.z)); if (Vector.dotProduct(normal,cameraRay)<0&&Vector.dotProduct(cameraRay,SigRenderer.vLookDir)>-0.2f&&distSquared<4096) { Vector lightDir = Vector.multiply(SigRenderer.vLookDir, -1); @@ -420,20 +422,20 @@ public class Panel extends JPanel implements Runnable { //System.out.println(-Vector.dotProduct(normal,Vector.normalize(cameraRay))); float dp = 0.1f; if (t.b!=null) { - dp = Math.max(0.1f,Math.min(1,(1f/((triTransformed.b.pos.x-SigRenderer.vCamera.x)*(triTransformed.b.pos.x-SigRenderer.vCamera.x)+ - (triTransformed.b.pos.y-SigRenderer.vCamera.y)*(triTransformed.b.pos.y-SigRenderer.vCamera.y)+ - (triTransformed.b.pos.z-SigRenderer.vCamera.z)*(triTransformed.b.pos.z-SigRenderer.vCamera.z))*64)))*0.5f+Math.max(0.1f,Math.min(1,1-Vector.dotProduct(normal,SigRenderer.vLookDir)))*0.5f; + dp = Math.max(0.1f,Math.min(1,(1f/((triTransformed.b.pos.x-newCamera.x)*(triTransformed.b.pos.x-newCamera.x)+ + (triTransformed.b.pos.y-newCamera.y)*(triTransformed.b.pos.y-newCamera.y)+ + (triTransformed.b.pos.z-newCamera.z)*(triTransformed.b.pos.z-newCamera.z))*64)))*0.5f+Math.max(0.1f,Math.min(1,1-Vector.dotProduct(normal,SigRenderer.vLookDir)))*0.5f; } else { dp = Math.max(0.1f,Vector.dotProduct(lightDir,normal)); } /*Vector center = Vector.divide(Vector.add(triTransformed.A,Vector.add(triTransformed.B,triTransformed.C)),3); - Vector cameraRay2 = Vector.subtract(center,SigRenderer.vCamera); + Vector cameraRay2 = Vector.subtract(center,newCamera); float dp = Math.max(0.1f,Math.min(1,(1f/((cameraRay2.x-center.x)*(cameraRay2.x-center.x)+ (cameraRay2.y-center.y)*(cameraRay2.y-center.y)+ (cameraRay2.z-center.z)*(cameraRay2.z-center.z))*4)));*/ - /*float dp = Math.max(0.1f,Math.min(1,(1f/((triTransformed.b.pos.x-SigRenderer.vCamera.x)*(triTransformed.b.pos.x-SigRenderer.vCamera.x)+ - (triTransformed.b.pos.y-SigRenderer.vCamera.y)*(triTransformed.b.pos.y-SigRenderer.vCamera.y)+ - (triTransformed.b.pos.z-SigRenderer.vCamera.z)*(triTransformed.b.pos.z-SigRenderer.vCamera.z))*4)));*/ + /*float dp = Math.max(0.1f,Math.min(1,(1f/((triTransformed.b.pos.x-newCamera.x)*(triTransformed.b.pos.x-newCamera.x)+ + (triTransformed.b.pos.y-newCamera.y)*(triTransformed.b.pos.y-newCamera.y)+ + (triTransformed.b.pos.z-newCamera.z)*(triTransformed.b.pos.z-newCamera.z))*4)));*/ triViewed.A = Matrix.MultiplyVector(matView,triTransformed.A); triViewed.B = Matrix.MultiplyVector(matView,triTransformed.B); diff --git a/src/sig/SigRenderer.java b/src/sig/SigRenderer.java index aafb840..72ff5a2 100644 --- a/src/sig/SigRenderer.java +++ b/src/sig/SigRenderer.java @@ -42,6 +42,7 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene public static Matrix matProj = Matrix.MakeProjection(fFov,fAspectRatio,fNear,fFar); public static Vector vCamera = new Vector(31.5f,20f,31.5f); + public static Vector vCameraOffset = new Vector(0,1.5f,0); public static Vector vCameraSpeed = new Vector(0,0,0); public static float vCameraFriction = 0.5f; public static Vector vLookDir = new Vector(0,0,1); @@ -51,6 +52,8 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene final static float MOVESPEED = 0.2f; final static float TURNSPEED = 0.05f; + public static float gravity = 0.01f; + public static float fallSpd = 0; final public static Vector maxCameraSpeed = new Vector(MOVESPEED,1f,MOVESPEED); @@ -93,12 +96,23 @@ public class SigRenderer implements KeyListener,MouseListener,MouseMotionListene void friction(Vector v) { vCameraSpeed.x=Math.signum(vCameraSpeed.x)>0?(vCameraSpeed.x-vCameraFriction)<0?0:vCameraSpeed.x-vCameraFriction:(vCameraSpeed.x+vCameraFriction)>0?0:vCameraSpeed.x+vCameraFriction; - vCameraSpeed.y=Math.signum(vCameraSpeed.y)>0?(vCameraSpeed.y-vCameraFriction)<0?0:vCameraSpeed.y-vCameraFriction:(vCameraSpeed.y+vCameraFriction)>0?0:vCameraSpeed.y+vCameraFriction; + //vCameraSpeed.y=Math.signum(vCameraSpeed.y)>0?(vCameraSpeed.y-vCameraFriction)<0?0:vCameraSpeed.y-vCameraFriction:(vCameraSpeed.y+vCameraFriction)>0?0:vCameraSpeed.y+vCameraFriction; vCameraSpeed.z=Math.signum(vCameraSpeed.z)>0?(vCameraSpeed.z-vCameraFriction)<0?0:vCameraSpeed.z-vCameraFriction:(vCameraSpeed.z+vCameraFriction)>0?0:vCameraSpeed.z+vCameraFriction; } public void runGameLoop() { friction(vCameraSpeed); + if (!blockGrid.containsKey((float)Math.floor(vCamera.x)+"_"+(float)Math.floor(vCamera.y-gravity)+"_"+(float)Math.floor(vCamera.z))) { + fallSpd=Math.max(-maxCameraSpeed.y,fallSpd-gravity); + } else + if (fallSpd<0) { + vCamera.y=(float)Math.ceil(vCamera.y); + fallSpd=0; + } + + if (fallSpd<0) { + vCamera.y+=fallSpd; + } if (upHeld) { pitch+=TURNSPEED;