First Commit
This commit is contained in:
commit
5ccf998834
34 changed files with 1608 additions and 0 deletions
8
VBO/.classpath
Normal file
8
VBO/.classpath
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="res"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/LWJGL 2.9.3"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
1
VBO/.gitignore
vendored
Normal file
1
VBO/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/bin/
|
17
VBO/.project
Normal file
17
VBO/.project
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>VBO</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
11
VBO/.settings/org.eclipse.jdt.core.prefs
Normal file
11
VBO/.settings/org.eclipse.jdt.core.prefs
Normal file
|
@ -0,0 +1,11 @@
|
|||
eclipse.preferences.version=1
|
||||
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
|
||||
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
|
||||
org.eclipse.jdt.core.compiler.debug.localVariable=generate
|
||||
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
|
||||
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||
org.eclipse.jdt.core.compiler.source=1.8
|
8
VBO/res/shaders/main.frag
Normal file
8
VBO/res/shaders/main.frag
Normal file
|
@ -0,0 +1,8 @@
|
|||
#version 330
|
||||
out vec4 fragColor;
|
||||
|
||||
in vec4 color;
|
||||
|
||||
void main(void){
|
||||
fragColor = color;
|
||||
}
|
11
VBO/res/shaders/main.vert
Normal file
11
VBO/res/shaders/main.vert
Normal file
|
@ -0,0 +1,11 @@
|
|||
#version 330
|
||||
|
||||
layout (location = 0) in vec3 in_position;
|
||||
layout (location = 1) in vec4 in_color;
|
||||
|
||||
out vec4 color;
|
||||
|
||||
void main(void){
|
||||
color = in_color;
|
||||
gl_Position = ftransform();
|
||||
}
|
10
VBO/res/shaders/skybox.frag
Normal file
10
VBO/res/shaders/skybox.frag
Normal file
|
@ -0,0 +1,10 @@
|
|||
#version 330
|
||||
out vec4 fragColor;
|
||||
uniform samplerCube cubeMap;
|
||||
|
||||
in vec3 position;
|
||||
|
||||
|
||||
void main(void){
|
||||
fragColor = texture(cubeMap, position);
|
||||
}
|
10
VBO/res/shaders/skybox.vert
Normal file
10
VBO/res/shaders/skybox.vert
Normal file
|
@ -0,0 +1,10 @@
|
|||
#version 330
|
||||
|
||||
layout (location = 0) in vec3 in_position;
|
||||
|
||||
out vec3 position;
|
||||
|
||||
void main(void){
|
||||
position = gl_Vertex.xyz;
|
||||
gl_Position = ftransform();
|
||||
}
|
BIN
VBO/res/tex/cubemap/back.jpg
Normal file
BIN
VBO/res/tex/cubemap/back.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 41 KiB |
BIN
VBO/res/tex/cubemap/bottom.jpg
Normal file
BIN
VBO/res/tex/cubemap/bottom.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 62 KiB |
BIN
VBO/res/tex/cubemap/front.jpg
Normal file
BIN
VBO/res/tex/cubemap/front.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
BIN
VBO/res/tex/cubemap/left.jpg
Normal file
BIN
VBO/res/tex/cubemap/left.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 43 KiB |
BIN
VBO/res/tex/cubemap/right.jpg
Normal file
BIN
VBO/res/tex/cubemap/right.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 42 KiB |
BIN
VBO/res/tex/cubemap/top.jpg
Normal file
BIN
VBO/res/tex/cubemap/top.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
119
VBO/src/blocks/Block.java
Normal file
119
VBO/src/blocks/Block.java
Normal file
|
@ -0,0 +1,119 @@
|
|||
package blocks;
|
||||
|
||||
|
||||
|
||||
|
||||
import math.Color4f;
|
||||
import math.Vector3f;
|
||||
|
||||
|
||||
public abstract class Block {
|
||||
|
||||
public static final Block OAK_WOOD = new OakWoodBlock(),
|
||||
GRASS = new GrassBlock(),
|
||||
LEAF = new LeafBlock(),
|
||||
FIR_LEAF = new FirLeafBlock(),
|
||||
FIR_WOOD = new FirWoodBlock();
|
||||
|
||||
private float r,g,b,a;
|
||||
|
||||
private static final float size = 1f;
|
||||
|
||||
public Block(float r,float g,float b,float a){
|
||||
this.r = r;
|
||||
this.g = g;
|
||||
this.b = b;
|
||||
this.a = a;
|
||||
}
|
||||
|
||||
|
||||
public Block(Color4f c) {
|
||||
this.r = c.getR();
|
||||
this.g = c.getG();
|
||||
this.b = c.getB();
|
||||
this.a = c.getA();
|
||||
}
|
||||
|
||||
|
||||
public Block setColor(float r,float g,float b){
|
||||
|
||||
this.r = r;
|
||||
this.g = g;
|
||||
this.b = b;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Block setColor(Color4f c){
|
||||
|
||||
this.r = c.getR();
|
||||
this.g = c.getG();
|
||||
this.b = c.getB();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public float[] getDataFront(float x,float y,float z,float[] shading) {
|
||||
return new float[]{
|
||||
x,y,z, r * 0.9f * shading[0],g * 0.9f * shading[0],b * 0.9f * shading[0],a,
|
||||
x+size,y,z, r * 0.9f * shading[1],g * 0.9f * shading[1],b * 0.9f * shading[1],a,
|
||||
x+size,y+size,z, r * 0.9f * shading[2],g * 0.9f * shading[2],b * 0.9f * shading[2],a,
|
||||
x,y+size,z, r * 0.9f * shading[3],g * 0.9f * shading[3],b * 0.9f * shading[3],a
|
||||
};
|
||||
}
|
||||
|
||||
public float[] getDataBack(float x,float y,float z,float[] shading) {
|
||||
return new float[]{
|
||||
x+size,y,z+size, r * 0.9f * shading[0],g * 0.9f * shading[0],b * 0.9f * shading[0],a,
|
||||
x,y,z+size, r * 0.9f * shading[1],g * 0.9f * shading[1],b * 0.9f * shading[1],a,
|
||||
x,y+size,z+size, r * 0.9f * shading[2],g * 0.9f * shading[2],b * 0.9f * shading[2],a,
|
||||
x+size,y+size,z+size, r * 0.9f * shading[3],g * 0.9f * shading[3],b * 0.9f * shading[3],a
|
||||
};
|
||||
}
|
||||
|
||||
public float[] getDataLeft(float x,float y,float z,float[] shading) {
|
||||
return new float[]{
|
||||
x,y,z, r * 0.8f * shading[0],g * 0.8f * shading[0],b * 0.8f * shading[0],a,
|
||||
x,y+size,z, r * 0.8f * shading[1],g * 0.8f * shading[1],b * 0.8f * shading[1],a,
|
||||
x,y+size,z+size, r * 0.8f * shading[2],g * 0.8f * shading[2],b * 0.8f * shading[2],a,
|
||||
x,y,z+size, r * 0.8f * shading[3],g * 0.8f * shading[3],b * 0.8f * shading[3],a
|
||||
};
|
||||
}
|
||||
|
||||
public float[] getDataRight(float x,float y,float z,float[] shading) {
|
||||
return new float[]{
|
||||
x+size,y+size,z, r * 0.8f * shading[0],g * 0.8f * shading[0],b * 0.8f * shading[0],a,
|
||||
x+size,y,z, r * 0.8f * shading[1],g * 0.8f * shading[1],b * 0.8f * shading[1],a,
|
||||
x+size,y,z+size, r * 0.8f * shading[2],g * 0.8f * shading[2],b * 0.8f * shading[2],a,
|
||||
x+size,y+size,z+size, r * 0.8f * shading[3],g * 0.8f * shading[3],b * 0.8f * shading[3],a
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public float[] getDataDown(float x,float y,float z,float[] shading) {
|
||||
return new float[]{
|
||||
x+size,y,z, r * 0.7f * shading[0],g * 0.7f * shading[0],b * 0.7f * shading[0],a,
|
||||
x,y,z, r * 0.7f * shading[1],g * 0.7f * shading[1],b * 0.7f * shading[1],a,
|
||||
x,y,z+size, r * 0.7f * shading[2],g * 0.7f * shading[2],b * 0.7f * shading[2],a,
|
||||
x+size,y,z+size, r * 0.7f * shading[3],g * 0.7f * shading[3],b * 0.7f * shading[3],a
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
public float[] getDataUp(float x,float y,float z,float[] shading) {
|
||||
return new float[]{
|
||||
x,y+size,z, r * 1.0f * shading[0],g * 1.0f * shading[0],b * 1.0f * shading[0],a,
|
||||
x+size,y+size,z, r * 1.0f * shading[1],g * 1.0f * shading[1],b * 1.0f * shading[1],a,
|
||||
x+size,y+size,z+size, r * 1.0f * shading[2],g * 1.0f * shading[2],b * 1.0f * shading[2],a,
|
||||
x,y+size,z+size, r * 1.0f * shading[3],g * 1.0f * shading[3],b * 1.0f * shading[3],a
|
||||
};
|
||||
}
|
||||
|
||||
public static float getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
11
VBO/src/blocks/FirLeafBlock.java
Normal file
11
VBO/src/blocks/FirLeafBlock.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package blocks;
|
||||
|
||||
import math.Color4f;
|
||||
|
||||
public class FirLeafBlock extends Block{
|
||||
|
||||
public FirLeafBlock() {
|
||||
super(new Color4f(0.0f,0.4f,0f));
|
||||
}
|
||||
|
||||
}
|
11
VBO/src/blocks/FirWoodBlock.java
Normal file
11
VBO/src/blocks/FirWoodBlock.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package blocks;
|
||||
|
||||
import math.Color4f;
|
||||
|
||||
public class FirWoodBlock extends WoodBlock{
|
||||
|
||||
public FirWoodBlock() {
|
||||
super(new Color4f(0.32f,0.22f,0.04f));
|
||||
}
|
||||
|
||||
}
|
10
VBO/src/blocks/GrassBlock.java
Normal file
10
VBO/src/blocks/GrassBlock.java
Normal file
|
@ -0,0 +1,10 @@
|
|||
package blocks;
|
||||
|
||||
import math.Color4f;
|
||||
|
||||
public class GrassBlock extends Block{
|
||||
public GrassBlock() {
|
||||
super(new Color4f(0.2f,0.6f,0f));
|
||||
}
|
||||
|
||||
}
|
11
VBO/src/blocks/LeafBlock.java
Normal file
11
VBO/src/blocks/LeafBlock.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package blocks;
|
||||
|
||||
import math.Color4f;
|
||||
|
||||
public class LeafBlock extends Block{
|
||||
|
||||
public LeafBlock() {
|
||||
super(new Color4f(0,0.6f,0,1));
|
||||
}
|
||||
|
||||
}
|
11
VBO/src/blocks/OakWoodBlock.java
Normal file
11
VBO/src/blocks/OakWoodBlock.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package blocks;
|
||||
|
||||
import math.*;
|
||||
|
||||
public class OakWoodBlock extends WoodBlock{
|
||||
|
||||
public OakWoodBlock() {
|
||||
super(new Color4f(0.42f,0.32f,0.14f));
|
||||
}
|
||||
|
||||
}
|
11
VBO/src/blocks/TransparentBlock.java
Normal file
11
VBO/src/blocks/TransparentBlock.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package blocks;
|
||||
|
||||
import math.Color4f;
|
||||
|
||||
public class TransparentBlock extends Block {
|
||||
|
||||
public TransparentBlock(){
|
||||
super(new Color4f(1,1,1,0));
|
||||
}
|
||||
|
||||
}
|
11
VBO/src/blocks/WoodBlock.java
Normal file
11
VBO/src/blocks/WoodBlock.java
Normal file
|
@ -0,0 +1,11 @@
|
|||
package blocks;
|
||||
|
||||
import math.Color4f;
|
||||
|
||||
public class WoodBlock extends Block{
|
||||
|
||||
public WoodBlock(Color4f c) {
|
||||
super(c);
|
||||
}
|
||||
|
||||
}
|
71
VBO/src/main/Camera.java
Normal file
71
VBO/src/main/Camera.java
Normal file
|
@ -0,0 +1,71 @@
|
|||
package main;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
import world.*;
|
||||
import blocks.*;
|
||||
import math.*;
|
||||
|
||||
public class Camera {
|
||||
|
||||
private static Vector3f position = new Vector3f(0,4,0);
|
||||
private static Vector2f rotation = new Vector2f(0,120);
|
||||
private static final float HEIGHT = (float) (1.5f - (Block.getSize()/2.0f));
|
||||
|
||||
public static void renderCamera(){
|
||||
glLoadIdentity();
|
||||
glRotatef(rotation.getX(), 1, 0, 0);
|
||||
glRotatef(rotation.getY(), 0, 1, 0);
|
||||
glTranslatef(-position.getX(), -(position.getY()+HEIGHT), -position.getZ());
|
||||
}
|
||||
|
||||
public static void move(float xa,float ya,float za){
|
||||
// if(true){
|
||||
// gravityFactor += World.GRAVITY * 0.01f;
|
||||
// if(grounded) gravityFactor = 0;
|
||||
// ya -= gravityFactor;
|
||||
// }else{
|
||||
// gravityFactor = 0;
|
||||
// }
|
||||
int xStep = (int)Math.abs(xa * 100);
|
||||
for(int i = 0; i < xStep; i++){
|
||||
// if(!isColliding(xa/xStep, 0, 0) || noClip){
|
||||
position.x += xa/xStep;
|
||||
// }else{
|
||||
// xa = 0;
|
||||
// }
|
||||
}
|
||||
int yStep = (int)Math.abs(ya * 100);
|
||||
for(int i = 0; i < yStep; i++){
|
||||
// if(!isColliding(0, ya/yStep, 0) || noClip){
|
||||
position.y += ya/yStep;
|
||||
// }else{
|
||||
// ya = 0;
|
||||
// }
|
||||
}
|
||||
int zStep = (int)Math.abs(za * 100);
|
||||
for(int i = 0; i < zStep; i++){
|
||||
// if(!isColliding(0, 0, za/zStep) || noClip){
|
||||
position.z += za/zStep;
|
||||
// }else{
|
||||
// za = 0;
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
public static Vector3f getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public static void setPosition(Vector3f position) {
|
||||
Camera.position = position;
|
||||
}
|
||||
|
||||
public static Vector2f getRotation() {
|
||||
return rotation;
|
||||
}
|
||||
|
||||
public static void setRotation(Vector2f rotation) {
|
||||
Camera.rotation = rotation;
|
||||
}
|
||||
|
||||
}
|
88
VBO/src/main/DisplayManager.java
Normal file
88
VBO/src/main/DisplayManager.java
Normal file
|
@ -0,0 +1,88 @@
|
|||
package main;
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
import static org.lwjgl.util.glu.GLU.*;
|
||||
|
||||
import org.lwjgl.input.*;
|
||||
import org.lwjgl.opengl.*;
|
||||
import org.lwjgl.util.glu.*;
|
||||
|
||||
|
||||
public class DisplayManager {
|
||||
|
||||
private static long delta = 0;
|
||||
private static float fov = 45;
|
||||
|
||||
/**
|
||||
* @Info Nettoie l'ecran
|
||||
*/
|
||||
public static void clearScreen(){
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info Definie le mode d'affichage pour le rendu en 3d
|
||||
*/
|
||||
public static void preRender3D(){
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
gluPerspective(fov, (float)Display.getDisplayMode().getWidth()/(float)Display.getDisplayMode().getHeight(), 0.1f, 1000f);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glCullFace(GL_FRONT);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info Fait le rendu 3d
|
||||
*/
|
||||
public static void render3D(){
|
||||
Camera.renderCamera();
|
||||
Main.getGame().render();
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info Definie le mode d'affichage pour le rendu en 2d
|
||||
*/
|
||||
public static void preRender2D(){
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
GLU.gluOrtho2D(0, Display.getDisplayMode().getWidth(), Display
|
||||
.getDisplayMode().getHeight(), 0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info Fait le rendu 2d
|
||||
*/
|
||||
public static void render2D(){
|
||||
Main.getGame().renderGUI();
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info mets a jour la resolution de l'ecran
|
||||
*/
|
||||
public static void updateDisplay() {
|
||||
glViewport(0, 0, Display.getWidth(), Display.getHeight());
|
||||
}
|
||||
|
||||
public static long getDelta() {
|
||||
return delta;
|
||||
}
|
||||
|
||||
public static void setDelta(long delta) {
|
||||
DisplayManager.delta = delta;
|
||||
}
|
||||
|
||||
public static float getFov() {
|
||||
return fov;
|
||||
}
|
||||
|
||||
public static void setFov(float fov) {
|
||||
DisplayManager.fov = fov;
|
||||
}
|
||||
|
||||
|
||||
}
|
25
VBO/src/main/Game.java
Normal file
25
VBO/src/main/Game.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
package main;
|
||||
|
||||
import world.*;
|
||||
|
||||
public class Game {
|
||||
|
||||
private World world;
|
||||
|
||||
public Game(){
|
||||
world= new World(0);
|
||||
}
|
||||
|
||||
public void update(){
|
||||
world.update();
|
||||
}
|
||||
|
||||
public void render(){
|
||||
world.render();
|
||||
}
|
||||
|
||||
public void renderGUI(){
|
||||
|
||||
}
|
||||
|
||||
}
|
152
VBO/src/main/Main.java
Normal file
152
VBO/src/main/Main.java
Normal file
|
@ -0,0 +1,152 @@
|
|||
package main;
|
||||
|
||||
import org.lwjgl.input.*;
|
||||
import org.lwjgl.opengl.*;
|
||||
|
||||
import rendering.*;
|
||||
|
||||
public class Main {
|
||||
|
||||
private static boolean IsRunning = true;
|
||||
private static long current = System.currentTimeMillis(), elapsedInfo = 0,
|
||||
elapsed = 0, previous = 0;
|
||||
private static long timeTicks = 0, timeFps = 0;
|
||||
private static int FPS = 0, TICKS = 0, LAST_TICKS = 60, LAST_FPS = 60;
|
||||
|
||||
private static final String TITLE = "Test VBO";
|
||||
private static final int width = 1280, height = 720;
|
||||
|
||||
private static Game game;
|
||||
|
||||
/**
|
||||
* @param args
|
||||
* @Info Fonction principal
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
Display.setTitle(TITLE);
|
||||
Display.setDisplayMode(new DisplayMode(width, height));
|
||||
Display.setResizable(true);
|
||||
Mouse.setGrabbed(true);
|
||||
Display.create();
|
||||
game = new Game();
|
||||
loop();
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info Boucle principal avec Timer
|
||||
*/
|
||||
public static void loop() {
|
||||
while (IsRunning) {
|
||||
previous = current;
|
||||
current = System.currentTimeMillis();
|
||||
elapsed += current - previous;
|
||||
elapsedInfo += current - previous;
|
||||
DisplayManager.setDelta(current - previous);
|
||||
|
||||
if (Display.wasResized()) {
|
||||
DisplayManager.updateDisplay();
|
||||
}
|
||||
|
||||
if (elapsed >= 1000 / 60) {
|
||||
Update.updateMouse();
|
||||
Update.updateKeyboard();
|
||||
Update.update();
|
||||
TICKS++;
|
||||
elapsed = 0;
|
||||
timeTicks = System.currentTimeMillis() - current;
|
||||
} else {
|
||||
DisplayManager.clearScreen();
|
||||
Shader.MAIN.bind();
|
||||
DisplayManager.preRender3D();
|
||||
DisplayManager.render3D();
|
||||
DisplayManager.preRender2D();
|
||||
DisplayManager.render2D();
|
||||
FPS++;
|
||||
timeFps = System.currentTimeMillis() - current;
|
||||
}
|
||||
|
||||
if (elapsedInfo >= 1000) {
|
||||
LAST_FPS = FPS;
|
||||
LAST_TICKS = TICKS;
|
||||
Display.setTitle(TITLE + " | FPS:" + LAST_FPS + " TICKS:"
|
||||
+ LAST_TICKS + " timeFps:" + timeFps + "ms timeTicks:"
|
||||
+ timeTicks + "ms" + " | PX:"
|
||||
+ Camera.getPosition().getX() + " PY:"
|
||||
+ Camera.getPosition().getY() + " PZ:"
|
||||
+ Camera.getPosition().getZ());
|
||||
FPS = 0;
|
||||
TICKS = 0;
|
||||
elapsedInfo = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isRunning() {
|
||||
return IsRunning;
|
||||
}
|
||||
|
||||
public static void setRunning(boolean isRunning) {
|
||||
IsRunning = isRunning;
|
||||
}
|
||||
|
||||
public static long getCurrent() {
|
||||
return current;
|
||||
}
|
||||
|
||||
public static long getElapsedInfo() {
|
||||
return elapsedInfo;
|
||||
}
|
||||
|
||||
public static long getElapsed() {
|
||||
return elapsed;
|
||||
}
|
||||
|
||||
public static long getPrevious() {
|
||||
return previous;
|
||||
}
|
||||
|
||||
public static long getTimeTicks() {
|
||||
return timeTicks;
|
||||
}
|
||||
|
||||
public static long getTimeFps() {
|
||||
return timeFps;
|
||||
}
|
||||
|
||||
public static int getFPS() {
|
||||
return FPS;
|
||||
}
|
||||
|
||||
public static int getTICKS() {
|
||||
return TICKS;
|
||||
}
|
||||
|
||||
public static int getLAST_TICKS() {
|
||||
return LAST_TICKS;
|
||||
}
|
||||
|
||||
public static int getLAST_FPS() {
|
||||
return LAST_FPS;
|
||||
}
|
||||
|
||||
public static String getTitle() {
|
||||
return TITLE;
|
||||
}
|
||||
|
||||
public static int getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
||||
public static int getHeight() {
|
||||
return height;
|
||||
}
|
||||
|
||||
public static Game getGame() {
|
||||
return game;
|
||||
}
|
||||
|
||||
}
|
111
VBO/src/main/Update.java
Normal file
111
VBO/src/main/Update.java
Normal file
|
@ -0,0 +1,111 @@
|
|||
package main;
|
||||
import org.lwjgl.input.*;
|
||||
import org.lwjgl.opengl.*;
|
||||
|
||||
|
||||
public class Update {
|
||||
|
||||
private static float xDir,yDir,zDir;
|
||||
private static float speed = 0.01f;
|
||||
private static float xa = 0,ya = 0,za = 0;
|
||||
|
||||
|
||||
/**
|
||||
* @Info Fonction permettant de gerer les action de la souris
|
||||
*/
|
||||
public static void updateMouse(){
|
||||
|
||||
Camera.getRotation().x -= Mouse.getDY() * 0.5;
|
||||
Camera.getRotation().y += Mouse.getDX() * 0.5;
|
||||
|
||||
while(Mouse.next()){
|
||||
if(Mouse.getEventButtonState()){
|
||||
|
||||
}else{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info Fonction permettant de gerer les action du clavier
|
||||
*/
|
||||
public static void updateKeyboard(){
|
||||
xDir = 0;
|
||||
yDir = 0;
|
||||
zDir = 0;
|
||||
while(Keyboard.next()){
|
||||
if(Keyboard.getEventKeyState()){
|
||||
if(Keyboard.getEventKey() == Keyboard.KEY_ESCAPE){
|
||||
Main.setRunning(false);
|
||||
}
|
||||
if(Keyboard.getEventKey() == Keyboard.KEY_F2){
|
||||
Mouse.setGrabbed(!Mouse.isGrabbed());
|
||||
}
|
||||
}else{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(Camera.getRotation().x < -90) Camera.getRotation().x = -90;
|
||||
if(Camera.getRotation().x > 90) Camera.getRotation().x = 90;
|
||||
|
||||
|
||||
if(Keyboard.isKeyDown(Keyboard.KEY_Z)){
|
||||
zDir = -speed;
|
||||
}
|
||||
|
||||
if(Keyboard.isKeyDown(Keyboard.KEY_S)){
|
||||
zDir = speed;
|
||||
}
|
||||
|
||||
if(Keyboard.isKeyDown(Keyboard.KEY_Q)){
|
||||
xDir = -speed;
|
||||
}
|
||||
|
||||
if(Keyboard.isKeyDown(Keyboard.KEY_D)){
|
||||
xDir = speed;
|
||||
}
|
||||
|
||||
if(Keyboard.isKeyDown(Keyboard.KEY_SPACE)){
|
||||
// if(grounded)yDir = 0.3f;
|
||||
// if(!gravity)yDir = speed;
|
||||
yDir = speed;
|
||||
}
|
||||
|
||||
if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)){
|
||||
speed = 0.05f;
|
||||
}else{
|
||||
speed = 0.01f;
|
||||
}
|
||||
|
||||
if(Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)){
|
||||
// if(!gravity)yDir = -speed;
|
||||
yDir = -speed;
|
||||
}
|
||||
|
||||
xa += xDir * Math.cos(Math.toRadians(Camera.getRotation().y)) - zDir * Math.sin(Math.toRadians(Camera.getRotation().y));
|
||||
ya += yDir;
|
||||
za += zDir * Math.cos(Math.toRadians(Camera.getRotation().y)) + xDir * Math.sin(Math.toRadians(Camera.getRotation().y));
|
||||
|
||||
Camera.move(xa,ya,za);
|
||||
|
||||
xa *= 0.9f;
|
||||
ya *= 0.9f;
|
||||
za *= 0.9f;
|
||||
|
||||
if(Display.isCloseRequested()){
|
||||
Main.setRunning(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info Fonction de mettre a jour le display et d'autre choses predefinie
|
||||
*/
|
||||
public static void update(){
|
||||
Main.getGame().update();
|
||||
Display.update();
|
||||
}
|
||||
|
||||
}
|
119
VBO/src/main/VBO.java
Normal file
119
VBO/src/main/VBO.java
Normal file
|
@ -0,0 +1,119 @@
|
|||
package main;
|
||||
import static org.lwjgl.opengl.GL15.*;
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
import static org.lwjgl.opengl.GL13.*;
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
||||
import java.nio.*;
|
||||
|
||||
import org.lwjgl.*;
|
||||
|
||||
public class VBO {
|
||||
|
||||
|
||||
private int bufferSize = 0;
|
||||
private int vboID = 0;
|
||||
private FloatBuffer buffer;
|
||||
|
||||
public VBO(){
|
||||
this.vboID = createVBO();
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info creer le vbo
|
||||
*/
|
||||
public int createVBO(){
|
||||
return glGenBuffers();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param a
|
||||
* @Info () doit contenir par ligne au moins l'axe (x,y,z) + les couleurs (r,g,b,a)
|
||||
* Ex: getFloatBufferByFloatArray(new float[]{x,y,z,r,g,b,a})
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
public void clearBuffer(){
|
||||
buffer.clear();
|
||||
}
|
||||
|
||||
public void addDataByFloatArray(float[] a){
|
||||
if(a == null)return;
|
||||
if(buffer != null){
|
||||
int size = buffer.limit();
|
||||
float[] previousBuffer = new float[size];
|
||||
buffer.get(previousBuffer);
|
||||
buffer.clear();
|
||||
buffer = BufferUtils.createFloatBuffer(size + a.length);
|
||||
buffer.put(previousBuffer).put(a);
|
||||
buffer.flip();
|
||||
}else{
|
||||
buffer = BufferUtils.createFloatBuffer(a.length);
|
||||
buffer.put(a);
|
||||
buffer.flip();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param a
|
||||
* @Info () doit contenir par ligne au moins l'axe (x,y,z) + les couleurs (r,g,b,a)
|
||||
* Ex: getFloatBufferbyFloatList(x,y,z,r,g,b,a)
|
||||
*
|
||||
*
|
||||
*/
|
||||
public void addDataByFloatList(float... a){
|
||||
if(a == null)return;
|
||||
if(buffer != null){
|
||||
int size = buffer.limit();
|
||||
float[] previousBuffer = new float[size];
|
||||
buffer.get(previousBuffer);
|
||||
buffer.clear();
|
||||
buffer = BufferUtils.createFloatBuffer(size + a.length);
|
||||
buffer.put(previousBuffer).put(a);
|
||||
buffer.flip();
|
||||
}else{
|
||||
buffer = BufferUtils.createFloatBuffer(a.length);
|
||||
buffer.put(a);
|
||||
buffer.flip();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* @param data
|
||||
* @Info Stocke le FloatBuffer dans le GPU
|
||||
*/
|
||||
public void bufferData(){
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vboID);
|
||||
glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
bufferSize = buffer.limit() / 7;// 7 = 3 vertex(x,y,z) + 4 color (r,g,b,a)
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info fait le rendu du vbo
|
||||
*/
|
||||
public void renderVBO(){
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vboID);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glEnableVertexAttribArray(1);
|
||||
|
||||
glVertexAttribPointer(0,3,GL_FLOAT,false,7 * 4,0);
|
||||
glVertexAttribPointer(1,4,GL_FLOAT,false,7 * 4,12);
|
||||
|
||||
glDrawArrays(GL_QUADS, 0, bufferSize);
|
||||
|
||||
glDisableVertexAttribArray(0);
|
||||
glDisableVertexAttribArray(1);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @Info detruit le vbo
|
||||
*/
|
||||
public void destroyVBO(){
|
||||
glDeleteBuffers(vboID);
|
||||
}
|
||||
}
|
105
VBO/src/math/Color4f.java
Normal file
105
VBO/src/math/Color4f.java
Normal file
|
@ -0,0 +1,105 @@
|
|||
package math;
|
||||
|
||||
public class Color4f {
|
||||
|
||||
private float r,g,b,a;
|
||||
|
||||
public Color4f(float r,float g,float b,float a){
|
||||
this.r = r;
|
||||
this.b = b;
|
||||
this.g = g;
|
||||
this.a = a;
|
||||
}
|
||||
|
||||
public Color4f(float r,float g,float b){
|
||||
this.r = r;
|
||||
this.b = b;
|
||||
this.g = g;
|
||||
this.a = 1;
|
||||
}
|
||||
|
||||
public Color4f(Color4f c){
|
||||
this.r = c.getR();
|
||||
this.b = c.getG();
|
||||
this.g = c.getB();
|
||||
this.a = c.getA();
|
||||
}
|
||||
|
||||
public static Color4f interpolate(Color4f ca, Color4f cb, float t){
|
||||
float r = ca.r + (cb.r - ca.r) * t;
|
||||
float g = ca.g + (cb.g - ca.g) * t;
|
||||
float b = ca.b + (cb.b - ca.b) * t;
|
||||
float a = ca.a + (cb.a - ca.a) * t;
|
||||
return new Color4f(r,g,b,a);
|
||||
}
|
||||
|
||||
public Color4f add(Color4f c){
|
||||
r += c.getR();
|
||||
g += c.getG();
|
||||
b += c.getB();
|
||||
a += c.getA();
|
||||
return this;
|
||||
}
|
||||
|
||||
public Color4f sub(Color4f c){
|
||||
r -= c.getR();
|
||||
g -= c.getG();
|
||||
b -= c.getB();
|
||||
a -= c.getA();
|
||||
return this;
|
||||
}
|
||||
|
||||
public Color4f mul(float c){
|
||||
r *= c;
|
||||
g *= c;
|
||||
b *= c;
|
||||
a *= c;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Color4f copy(){
|
||||
return new Color4f(r,g,b,a);
|
||||
}
|
||||
|
||||
public void div(Color4f c){
|
||||
r /= c.getR();
|
||||
g /= c.getG();
|
||||
b /= c.getB();
|
||||
a /= c.getA();
|
||||
}
|
||||
|
||||
public float getR() {
|
||||
return r;
|
||||
}
|
||||
|
||||
public void setR(float r) {
|
||||
this.r = r;
|
||||
}
|
||||
|
||||
public float getG() {
|
||||
return g;
|
||||
}
|
||||
|
||||
public void setG(float g) {
|
||||
this.g = g;
|
||||
}
|
||||
|
||||
public float getB() {
|
||||
return b;
|
||||
}
|
||||
|
||||
public void setB(float b) {
|
||||
this.b = b;
|
||||
}
|
||||
|
||||
public float getA() {
|
||||
return a;
|
||||
}
|
||||
|
||||
public void setA(float a) {
|
||||
this.a = a;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
31
VBO/src/math/Vector2f.java
Normal file
31
VBO/src/math/Vector2f.java
Normal file
|
@ -0,0 +1,31 @@
|
|||
package math;
|
||||
|
||||
|
||||
public class Vector2f {
|
||||
|
||||
public float x,y;
|
||||
|
||||
public Vector2f(float x,float y){
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public float getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(float x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public float getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(float y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
196
VBO/src/math/Vector3f.java
Normal file
196
VBO/src/math/Vector3f.java
Normal file
|
@ -0,0 +1,196 @@
|
|||
package math;
|
||||
|
||||
|
||||
public class Vector3f {
|
||||
|
||||
public float x, y, z;
|
||||
|
||||
public Vector3f() {
|
||||
this(0, 0, 0);
|
||||
}
|
||||
|
||||
public Vector3f(Vector3f v) {
|
||||
this(v.x, v.y, v.z);
|
||||
}
|
||||
|
||||
public Vector3f(float x, float y, float z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public float length() {
|
||||
return (float) Math.sqrt(x * x + y * y + z * z);
|
||||
}
|
||||
|
||||
public Vector3f normalize() {
|
||||
x /= length();
|
||||
y /= length();
|
||||
z /= length();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Vector3f add(Vector3f vec) {
|
||||
x += vec.getX();
|
||||
y += vec.getY();
|
||||
z += vec.getZ();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Vector3f check(){
|
||||
float max = Math.max(Math.max(x, y),z);
|
||||
float min = Math.min(Math.min(x, y),z);
|
||||
|
||||
float absMax = Math.abs(max - 1);
|
||||
float absMin = Math.abs(min);
|
||||
|
||||
float v = 0;
|
||||
|
||||
if(absMax>absMin)v=min;
|
||||
else v=max;
|
||||
|
||||
int rv = 1;
|
||||
|
||||
if(v<0.5f)rv=-1;
|
||||
|
||||
return new Vector3f(v == x ? rv : 0,v == y ? rv : 0,v == z ? rv : 0);
|
||||
}
|
||||
|
||||
public Vector3f copy(){
|
||||
return new Vector3f(this);
|
||||
}
|
||||
|
||||
public Vector3f sub(Vector3f vec) {
|
||||
x -= vec.getX();
|
||||
y -= vec.getY();
|
||||
z -= vec.getZ();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public void set(Vector3f vec){
|
||||
this.x = vec.x;
|
||||
this.y = vec.y;
|
||||
this.z = vec.z;
|
||||
}
|
||||
|
||||
public Vector3f mul(Vector3f vec) {
|
||||
x *= vec.getX();
|
||||
y *= vec.getY();
|
||||
z *= vec.getZ();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Vector3f div(Vector3f vec) {
|
||||
x /= vec.getX();
|
||||
y /= vec.getY();
|
||||
z /= vec.getZ();
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Vector3f add(float v) {
|
||||
x += v;
|
||||
y += v;
|
||||
z += v;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Vector3f add(float x,float y, float z) {
|
||||
this.x += x;
|
||||
this.y += y;
|
||||
this.z += z;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Vector3f sub(float v) {
|
||||
x -= v;
|
||||
y -= v;
|
||||
z -= v;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Vector3f mul(float v) {
|
||||
x *= v;
|
||||
y *= v;
|
||||
z *= v;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public Vector3f div(float v) {
|
||||
x /= v;
|
||||
y /= v;
|
||||
z /= v;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
// ---- X
|
||||
public float getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public void setX(float x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public Vector3f addX(float v) {
|
||||
x += v;
|
||||
return this;
|
||||
}
|
||||
public Vector3f subX(float v) {
|
||||
x -= v;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
// ----- Y
|
||||
public float getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public void setY(float y) {
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public Vector3f addY(float v) {
|
||||
y += v;
|
||||
return this;
|
||||
}
|
||||
public Vector3f subY(float v) {
|
||||
y -= v;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
// ----- Z
|
||||
public float getZ() {
|
||||
return z;
|
||||
}
|
||||
|
||||
public void setZ(float z) {
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
public Vector3f addZ(float v) {
|
||||
z += v;
|
||||
return this;
|
||||
}
|
||||
public Vector3f subZ(float v) {
|
||||
z -= v;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static float distance(Vector3f a,Vector3f b){
|
||||
return (float)Math.sqrt((Math.pow(b.getX()-a.getX(), 2))+(Math.pow(b.getY()-a.getY(), 2))+(Math.pow(b.getZ()-a.getZ(), 2)));
|
||||
}
|
||||
|
||||
}
|
77
VBO/src/rendering/Shader.java
Normal file
77
VBO/src/rendering/Shader.java
Normal file
|
@ -0,0 +1,77 @@
|
|||
package rendering;
|
||||
|
||||
import static org.lwjgl.opengl.GL11.*;
|
||||
import static org.lwjgl.opengl.GL20.*;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
import math.Vector3f;
|
||||
|
||||
public class Shader {
|
||||
|
||||
public static final Shader MAIN = new Shader("/shaders/main.vert", "/shaders/main.frag");
|
||||
public static final Shader SKYBOX = new Shader("/shaders/skybox.vert", "/shaders/skybox.frag");
|
||||
|
||||
public int program;
|
||||
|
||||
public Shader(String vertex, String fragment) {
|
||||
program = glCreateProgram();
|
||||
|
||||
if (program == GL_FALSE) {
|
||||
System.err.println("Shader program error");
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
createShader(loadShader(vertex), GL_VERTEX_SHADER);
|
||||
createShader(loadShader(fragment), GL_FRAGMENT_SHADER);
|
||||
|
||||
glLinkProgram(program);
|
||||
glValidateProgram(program);
|
||||
}
|
||||
|
||||
private void createShader(String source, int type) {
|
||||
int shader = glCreateShader(type);
|
||||
if (shader == GL_FALSE) {
|
||||
System.err.println("Shader error: " + shader);
|
||||
System.exit(1);
|
||||
}
|
||||
glShaderSource(shader, source);
|
||||
glCompileShader(shader);
|
||||
if (glGetShaderi(shader, GL_COMPILE_STATUS) == GL_FALSE) {
|
||||
System.err.println(glGetShaderInfoLog(shader, 2048));
|
||||
System.exit(1);
|
||||
}
|
||||
glAttachShader(program, shader);
|
||||
}
|
||||
|
||||
private String loadShader(String input) {
|
||||
String r = "";
|
||||
|
||||
try {
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(Shader.class.getResourceAsStream(input)));
|
||||
String buffer = "";
|
||||
while ((buffer = reader.readLine()) != null) {
|
||||
r += buffer + "\n";
|
||||
}
|
||||
reader.close();
|
||||
}
|
||||
catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
public void setUniform(String name, float v) {
|
||||
glUniform1f(glGetUniformLocation(program, name), v);
|
||||
}
|
||||
|
||||
public void setUniform(String name, Vector3f v) {
|
||||
glUniform3f(glGetUniformLocation(program, name), v.getX(), v.getY(), v.getZ());
|
||||
}
|
||||
|
||||
public void bind() {
|
||||
glUseProgram(program);
|
||||
}
|
||||
}
|
261
VBO/src/world/Chunk.java
Normal file
261
VBO/src/world/Chunk.java
Normal file
|
@ -0,0 +1,261 @@
|
|||
package world;
|
||||
|
||||
import blocks.*;
|
||||
import main.*;
|
||||
import math.*;
|
||||
|
||||
public class Chunk {
|
||||
|
||||
public final static int SIZE = 4;
|
||||
private int x, y, z;
|
||||
private VBO vbo;
|
||||
private World world;
|
||||
Block[][][] blocks;
|
||||
private boolean IsLoad = false;
|
||||
|
||||
public Chunk(int x, int y, int z, World world) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
this.world = world;
|
||||
this.blocks = new Block[SIZE][SIZE][SIZE];
|
||||
vbo = new VBO();
|
||||
}
|
||||
|
||||
public void render() {
|
||||
vbo.renderVBO();
|
||||
}
|
||||
|
||||
public void update() {
|
||||
|
||||
}
|
||||
|
||||
public void createChunk(World world) {
|
||||
this.world = world;
|
||||
for (int i = 0; i < SIZE; i++) {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
for (int k = 0; k < SIZE; k++) {
|
||||
blocks[i][j][k] = Block.GRASS;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < SIZE; i++) {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
for (int k = 0; k < SIZE; k++) {
|
||||
loopChunk(i, j, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
vbo.bufferData();
|
||||
IsLoad = true;
|
||||
}
|
||||
|
||||
public void updateChunk() {
|
||||
vbo.clearBuffer();
|
||||
for (int i = 0; i < SIZE; i++) {
|
||||
for (int j = 0; j < 2; j++) {
|
||||
for (int k = 0; k < SIZE; k++) {
|
||||
loopChunk(i, j, k);
|
||||
}
|
||||
}
|
||||
}
|
||||
vbo.bufferData();
|
||||
}
|
||||
|
||||
public int getSIZE() {
|
||||
return SIZE;
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public int getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public int getZ() {
|
||||
return z;
|
||||
}
|
||||
|
||||
public Vector3f getPosition(){
|
||||
return new Vector3f(x,y,z);
|
||||
}
|
||||
|
||||
public Block getBlock(int x, int y, int z) {
|
||||
if (x < 0 || y < 0 || z < 0 || x >= SIZE || y >= SIZE || z >= SIZE)
|
||||
return null;
|
||||
return blocks[x][y][z];
|
||||
}
|
||||
|
||||
public void destroyChunk(){
|
||||
vbo.destroyVBO();
|
||||
}
|
||||
|
||||
public void loopChunk(int x, int y, int z) {
|
||||
int xx = this.x * SIZE + x;
|
||||
int yy = this.y * SIZE + y;
|
||||
int zz = this.z * SIZE + z;
|
||||
boolean up = world.getBlock(xx, yy + 1, zz) == null;
|
||||
boolean down = world.getBlock(xx, yy - 1, zz) == null;
|
||||
boolean left = world.getBlock(xx - 1, yy, zz) == null;
|
||||
boolean right = world.getBlock(xx + 1, yy, zz) == null;
|
||||
boolean front = world.getBlock(xx, yy, zz - 1) == null;
|
||||
boolean back = world.getBlock(xx, yy, zz + 1) == null;
|
||||
if (!up && !down && !left && !right && !front && !back)
|
||||
return;
|
||||
if (blocks[x][y][z] == null)
|
||||
return;
|
||||
Block b = blocks[x][y][z];
|
||||
|
||||
float ao = 0.7f;
|
||||
|
||||
// up + 1 = down - 1 = y
|
||||
// left - 1 = right + 1 = x
|
||||
// front - 1 = back + 1 = z
|
||||
|
||||
if (up) {
|
||||
// aa ab bb ba
|
||||
float[] a = new float[] { 1, 1, 1, 1 };
|
||||
|
||||
if (world.getBlock(xx - 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx, yy + 1, zz - 1) != null)
|
||||
a[0] = ao;
|
||||
if (world.getBlock(xx + 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx, yy + 1, zz - 1) != null)
|
||||
a[1] = ao;
|
||||
if (world.getBlock(xx + 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx, yy + 1, zz + 1) != null)
|
||||
a[2] = ao;
|
||||
if (world.getBlock(xx - 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx, yy + 1, zz + 1) != null)
|
||||
a[3] = ao;
|
||||
|
||||
vbo.addDataByFloatArray(b.getDataUp(xx, yy, zz, a));
|
||||
}
|
||||
if (down) {
|
||||
float[] a = new float[] { 1, 1, 1, 1 };
|
||||
// ambient occlusion
|
||||
|
||||
if (world.getBlock(xx - 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx, yy - 1, zz - 1) != null)
|
||||
a[1] = ao;
|
||||
if (world.getBlock(xx + 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx, yy - 1, zz - 1) != null)
|
||||
a[0] = ao;
|
||||
if (world.getBlock(xx + 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx, yy - 1, zz + 1) != null)
|
||||
a[3] = ao;
|
||||
if (world.getBlock(xx - 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx, yy - 1, zz + 1) != null)
|
||||
a[2] = ao;
|
||||
|
||||
// affiche la face si il n'y a rien en dessous
|
||||
vbo.addDataByFloatArray(b.getDataDown(xx, yy, zz, a));
|
||||
}
|
||||
if (left) {
|
||||
float[] a = new float[] { 1, 1, 1, 1 };
|
||||
|
||||
if (world.getBlock(xx - 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz - 1) != null)
|
||||
a[0] = ao;
|
||||
if (world.getBlock(xx - 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz - 1) != null)
|
||||
a[1] = ao;
|
||||
if (world.getBlock(xx - 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz + 1) != null)
|
||||
a[2] = ao;
|
||||
if (world.getBlock(xx - 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx - 1, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz + 1) != null)
|
||||
a[3] = ao;
|
||||
|
||||
vbo.addDataByFloatArray(b.getDataLeft(xx, yy, zz, a));
|
||||
}
|
||||
if (right) {
|
||||
float[] a = new float[] { 1, 1, 1, 1 };
|
||||
|
||||
if (world.getBlock(xx + 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz - 1) != null)
|
||||
a[1] = ao;
|
||||
if (world.getBlock(xx + 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz - 1) != null)
|
||||
a[0] = ao;
|
||||
if (world.getBlock(xx + 1, yy + 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz + 1) != null)
|
||||
a[3] = ao;
|
||||
if (world.getBlock(xx + 1, yy - 1, zz) != null
|
||||
|| world.getBlock(xx + 1, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz + 1) != null)
|
||||
a[2] = ao;
|
||||
|
||||
vbo.addDataByFloatArray(b.getDataRight(xx, yy, zz, a));
|
||||
}
|
||||
if (front) {
|
||||
float[] a = new float[] { 1, 1, 1, 1 };
|
||||
|
||||
if (world.getBlock(xx, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx - 1, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz - 1) != null)
|
||||
a[0] = ao;
|
||||
if (world.getBlock(xx, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx - 1, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz - 1) != null)
|
||||
a[3] = ao;
|
||||
if (world.getBlock(xx, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx + 1, yy + 1, zz - 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz - 1) != null)
|
||||
a[2] = ao;
|
||||
if (world.getBlock(xx, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx + 1, yy - 1, zz - 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz - 1) != null)
|
||||
a[1] = ao;
|
||||
|
||||
vbo.addDataByFloatArray(b.getDataFront(xx, yy, zz, a));
|
||||
}
|
||||
if (back) {
|
||||
float[] a = new float[] { 1, 1, 1, 1 };
|
||||
|
||||
if (world.getBlock(xx, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx - 1, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz + 1) != null)
|
||||
a[1] = ao;
|
||||
if (world.getBlock(xx, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx - 1, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx - 1, yy, zz + 1) != null)
|
||||
a[2] = ao;
|
||||
if (world.getBlock(xx, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx + 1, yy + 1, zz + 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz + 1) != null)
|
||||
a[3] = ao;
|
||||
if (world.getBlock(xx, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx + 1, yy - 1, zz + 1) != null
|
||||
|| world.getBlock(xx + 1, yy, zz + 1) != null)
|
||||
a[0] = ao;
|
||||
|
||||
vbo.addDataByFloatArray(b.getDataBack(xx, yy, zz, a));
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isLoaded() {
|
||||
return IsLoad;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
101
VBO/src/world/World.java
Normal file
101
VBO/src/world/World.java
Normal file
|
@ -0,0 +1,101 @@
|
|||
package world;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import main.*;
|
||||
import math.*;
|
||||
import blocks.*;
|
||||
|
||||
public class World {
|
||||
|
||||
public long seed;
|
||||
public final int SIZE = 1,HEIGHT = 1;
|
||||
public static final float GRAVITY = 1;
|
||||
public static final int VIEW_CHUNK = 2;
|
||||
|
||||
public ArrayList<Chunk> chunks = new ArrayList<Chunk>();
|
||||
|
||||
public World(long seed){
|
||||
this.seed= seed;
|
||||
for(int x = 0;x < SIZE;x++){
|
||||
for(int y = 0;y < HEIGHT;y++){
|
||||
for(int z = 0;z < SIZE;z++){
|
||||
Chunk ch = new Chunk(x,y,z,this);
|
||||
chunks.add(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
for(Chunk ch : chunks)ch.createChunk(this);
|
||||
}
|
||||
|
||||
public void update(){
|
||||
int xa = (int)((Camera.getPosition().getX()-((float)Chunk.SIZE/2.0f))/(float)Chunk.SIZE) - VIEW_CHUNK;
|
||||
int xb = (int)((Camera.getPosition().getX()-((float)Chunk.SIZE/2.0f))/(float)Chunk.SIZE) + VIEW_CHUNK;
|
||||
int za = (int)((Camera.getPosition().getZ()-((float)Chunk.SIZE/2.0f))/(float)Chunk.SIZE) - VIEW_CHUNK;
|
||||
int zb = (int)((Camera.getPosition().getZ()-((float)Chunk.SIZE/2.0f))/(float)Chunk.SIZE) + VIEW_CHUNK;
|
||||
|
||||
int delta_x = xb - xa;
|
||||
int delta_z = zb - za;
|
||||
boolean isC = false;
|
||||
for(int i = 0; i <= delta_x;i++){
|
||||
for(int k = 0;k <= delta_z;k++){
|
||||
for(int j = 0; j < HEIGHT; j++){
|
||||
if(getChunk((xa + i), 0, (za + k)) == null){
|
||||
Chunk ch = new Chunk((xa + i),j,(za + k),this);
|
||||
chunks.add(ch);
|
||||
isC = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(int i = 0; i < chunks.size();i++){
|
||||
Chunk c = chunks.get(i);
|
||||
if(c.getPosition().getX() < xa || c.getPosition().getX() > xb || c.getPosition().getZ() < za || c.getPosition().getZ() > zb){
|
||||
c.destroyChunk();
|
||||
chunks.remove(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(Chunk c : chunks){
|
||||
if(!c.isLoaded())c.createChunk(this);
|
||||
c.update();
|
||||
}
|
||||
System.gc();
|
||||
}
|
||||
|
||||
public void render(){
|
||||
for(Chunk c : chunks){
|
||||
if(c.isLoaded())
|
||||
c.render();
|
||||
}
|
||||
}
|
||||
|
||||
public Chunk getChunk(int xc, int yc, int zc) {
|
||||
Chunk c = null;
|
||||
for(Chunk ch : chunks){
|
||||
if(ch.getX() == xc && ch.getY() == yc && ch.getZ() == zc){
|
||||
c = ch;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
public Block getBlock(int x, int y, int z) {
|
||||
int xc = (x / Chunk.SIZE);
|
||||
int zc = (z / Chunk.SIZE);
|
||||
int yc = (y / Chunk.SIZE);
|
||||
|
||||
Chunk chunk = getChunk(xc, yc, zc);
|
||||
if(chunk == null)return null;
|
||||
|
||||
int xb = x % Chunk.SIZE;
|
||||
int yb = y % Chunk.SIZE;
|
||||
int zb = z % Chunk.SIZE;
|
||||
|
||||
return chunk.getBlock(xb, yb, zb);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
Reference in a new issue