mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-09-08 03:29:48 -04:00
Re-added block selection
This commit is contained in:
parent
e395ab7bdd
commit
5e129fd28e
@ -25,7 +25,6 @@ import org.jungle.game.Game;
|
|||||||
import org.jungle.game.IGameLogic;
|
import org.jungle.game.IGameLogic;
|
||||||
import org.jungle.util.DirectionalLight;
|
import org.jungle.util.DirectionalLight;
|
||||||
import org.jungle.util.Material;
|
import org.jungle.util.Material;
|
||||||
import org.jungle.util.MeshSelectionDetector;
|
|
||||||
import org.jungle.util.OBJLoader;
|
import org.jungle.util.OBJLoader;
|
||||||
import org.lwjgl.Version;
|
import org.lwjgl.Version;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
@ -66,12 +65,9 @@ public class Cubyz implements IGameLogic {
|
|||||||
private Vector3f playerInc;
|
private Vector3f playerInc;
|
||||||
public static MouseInput mouse;
|
public static MouseInput mouse;
|
||||||
public static UISystem gameUI;
|
public static UISystem gameUI;
|
||||||
private static long lastFPSCheck = 0;
|
|
||||||
private static int currentFrames = 0;
|
|
||||||
private static int currentFPS = 0;
|
|
||||||
public static World world;
|
public static World world;
|
||||||
|
|
||||||
private MeshSelectionDetector msd;
|
private CubyzMeshSelectionDetector msd;
|
||||||
|
|
||||||
private int breakCooldown = 10;
|
private int breakCooldown = 10;
|
||||||
|
|
||||||
@ -158,7 +154,7 @@ public class Cubyz implements IGameLogic {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
msd = new MeshSelectionDetector(renderer);
|
msd = new CubyzMeshSelectionDetector(renderer);
|
||||||
window.setClearColor(new Vector4f(0.1F, 0.7F, 0.7F, 1.0F)); //NOTE: Normal > 0.1F || 0.7F || 0.7F || 1.0F
|
window.setClearColor(new Vector4f(0.1F, 0.7F, 0.7F, 1.0F)); //NOTE: Normal > 0.1F || 0.7F || 0.7F || 1.0F
|
||||||
log.info("Renderer: OK!");
|
log.info("Renderer: OK!");
|
||||||
|
|
||||||
@ -226,7 +222,7 @@ public class Cubyz implements IGameLogic {
|
|||||||
window.setFullscreen(!window.isFullscreen());
|
window.setFullscreen(!window.isFullscreen());
|
||||||
Keyboard.setKeyPressed(GLFW.GLFW_KEY_F11, false);
|
Keyboard.setKeyPressed(GLFW.GLFW_KEY_F11, false);
|
||||||
}
|
}
|
||||||
if (!gameUI.isGUIFullscreen()) {
|
if (!gameUI.isGUIFullscreen() && world != null) {
|
||||||
if (window.isKeyPressed(GLFW.GLFW_KEY_W)) {
|
if (window.isKeyPressed(GLFW.GLFW_KEY_W)) {
|
||||||
playerInc.z = -1;
|
playerInc.z = -1;
|
||||||
}
|
}
|
||||||
@ -270,7 +266,9 @@ public class Cubyz implements IGameLogic {
|
|||||||
mouse.clearPos(window.getWidth() / 2, window.getHeight() / 2);
|
mouse.clearPos(window.getWidth() / 2, window.getHeight() / 2);
|
||||||
breakCooldown = 10;
|
breakCooldown = 10;
|
||||||
}
|
}
|
||||||
msd.selectSpatial(ctx.getSpatials(), ctx.getCamera());
|
synchronized (world.visibleBlocks()) {
|
||||||
|
msd.selectSpatial(world.visibleBlocks(), ctx.getCamera());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mouse.input(window);
|
mouse.input(window);
|
||||||
}
|
}
|
||||||
@ -291,7 +289,7 @@ public class Cubyz implements IGameLogic {
|
|||||||
if (playerInc.x != 0) {
|
if (playerInc.x != 0) {
|
||||||
world.getLocalPlayer().vx = playerInc.x;
|
world.getLocalPlayer().vx = playerInc.x;
|
||||||
}
|
}
|
||||||
ctx.getCamera().setPosition(world.getLocalPlayer().getPosition().x, world.getLocalPlayer().getPosition().y + 1.76f, world.getLocalPlayer().getPosition().z);
|
ctx.getCamera().setPosition(world.getLocalPlayer().getPosition().x, world.getLocalPlayer().getPosition().y + 1.5f, world.getLocalPlayer().getPosition().z);
|
||||||
|
|
||||||
if (world.isEdited()) {
|
if (world.isEdited()) {
|
||||||
lastVisibleBlocks = world.visibleBlocks();
|
lastVisibleBlocks = world.visibleBlocks();
|
||||||
@ -304,7 +302,6 @@ public class Cubyz implements IGameLogic {
|
|||||||
} else {
|
} else {
|
||||||
renderer.render(window, ctx, new Vector3f(0.3F, 0.3F, 0.3F), light, EMPTY_BLOCK_LIST);
|
renderer.render(window, ctx, new Vector3f(0.3F, 0.3F, 0.3F), light, EMPTY_BLOCK_LIST);
|
||||||
}
|
}
|
||||||
countFPS();
|
|
||||||
gameUI.updateUI();
|
gameUI.updateUI();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,25 +309,23 @@ public class Cubyz implements IGameLogic {
|
|||||||
public void update(float interval) {
|
public void update(float interval) {
|
||||||
if (!gameUI.isGUIFullscreen() && world != null) {
|
if (!gameUI.isGUIFullscreen() && world != null) {
|
||||||
Player lp = world.getLocalPlayer();
|
Player lp = world.getLocalPlayer();
|
||||||
lp.move(playerInc.mul(0.11F), ctx.getCamera().getRotation()); //NOTE: Normal > 0.11F
|
lp.move(playerInc.mul(0.11F), ctx.getCamera().getRotation());
|
||||||
if (breakCooldown > 0) { //NOTE: Normal > 0
|
if (breakCooldown > 0) {
|
||||||
breakCooldown--;
|
breakCooldown--;
|
||||||
}
|
}
|
||||||
if (mouse.isLeftButtonPressed() && mouse.isGrabbed()) {
|
if (mouse.isLeftButtonPressed() && mouse.isGrabbed()) {
|
||||||
//Breaking Blocks
|
//Breaking Blocks
|
||||||
if (breakCooldown == 0) {
|
if (breakCooldown == 0) {
|
||||||
breakCooldown = 10;
|
breakCooldown = 10;
|
||||||
if (msd.getSelectedSpatial() instanceof BlockSpatial) {
|
BlockInstance bi = msd.getSelectedBlockInstance();
|
||||||
BlockInstance bi = ((BlockSpatial) msd.getSelectedSpatial()).getBlock();
|
world.removeBlock(bi.getX(), bi.getY(), bi.getZ());
|
||||||
world.removeBlock(bi.getX(), bi.getY(), bi.getZ());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mouse.isGrabbed()) {
|
if (mouse.isGrabbed()) {
|
||||||
ctx.getCamera().moveRotation(mouse.getDisplVec().x() * 0.51F, mouse.getDisplVec().y() * 0.51F, 0.0F);
|
ctx.getCamera().moveRotation(mouse.getDisplVec().x() * 0.51F, mouse.getDisplVec().y() * 0.51F, 0.0F);
|
||||||
mouse.clearPos(win.getWidth() / 2, win.getHeight() / 2);
|
mouse.clearPos(win.getWidth() / 2, win.getHeight() / 2);
|
||||||
}
|
}
|
||||||
playerInc.x = playerInc.y = playerInc.z = 0.0F; // Reset positions || NOTE: Normal > 0.0F
|
playerInc.x = playerInc.y = playerInc.z = 0.0F; // Reset positions
|
||||||
for (Entity en : world.getEntities()) {
|
for (Entity en : world.getEntities()) {
|
||||||
en.update();
|
en.update();
|
||||||
}
|
}
|
||||||
@ -344,17 +339,8 @@ public class Cubyz implements IGameLogic {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void countFPS() {
|
|
||||||
currentFrames++;
|
|
||||||
if (System.nanoTime() > lastFPSCheck + 1000000000) { //NOTE: Normal > 1B ( 1000000000 )
|
|
||||||
lastFPSCheck = System.nanoTime();
|
|
||||||
currentFPS = currentFrames;
|
|
||||||
currentFrames = 0; //NOTE: Normal > 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getFPS() {
|
public static int getFPS() {
|
||||||
return currentFPS;
|
return Cubyz.instance.game.getFPS();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -0,0 +1,63 @@
|
|||||||
|
package io.cubyz.client;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.joml.Intersectionf;
|
||||||
|
import org.joml.Vector2f;
|
||||||
|
import org.joml.Vector3f;
|
||||||
|
import org.jungle.Camera;
|
||||||
|
import org.jungle.Spatial;
|
||||||
|
import org.jungle.renderers.IRenderer;
|
||||||
|
import org.jungle.renderers.jungle.JungleRender;
|
||||||
|
|
||||||
|
import io.cubyz.blocks.Block;
|
||||||
|
import io.cubyz.blocks.BlockInstance;
|
||||||
|
import io.cubyz.world.BlockSpatial;
|
||||||
|
|
||||||
|
public class CubyzMeshSelectionDetector {
|
||||||
|
|
||||||
|
protected IRenderer render;
|
||||||
|
protected Vector3f dir = new Vector3f();
|
||||||
|
protected Vector3f min = new Vector3f(), max = new Vector3f();
|
||||||
|
protected Vector2f nearFar = new Vector2f();
|
||||||
|
protected BlockInstance selectedSpatial;
|
||||||
|
|
||||||
|
public CubyzMeshSelectionDetector(IRenderer render) {
|
||||||
|
this.render = render;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return selected spatial
|
||||||
|
* @return selected spatial, or null if none.
|
||||||
|
*/
|
||||||
|
public BlockInstance getSelectedBlockInstance() {
|
||||||
|
return selectedSpatial;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectSpatial(Map<Block, ArrayList<BlockInstance>> blockList, Camera camera) {
|
||||||
|
dir = render.getTransformation().getViewMatrix(camera).positiveZ(dir).negate();
|
||||||
|
selectSpatial(blockList, camera.getPosition(), dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectSpatial(Map<Block, ArrayList<BlockInstance>> blockList, Vector3f position, Vector3f dir) {
|
||||||
|
float closestDistance = Float.POSITIVE_INFINITY;
|
||||||
|
for (Block block : blockList.keySet()) {
|
||||||
|
for (BlockInstance bi : blockList.get(block)) {
|
||||||
|
((BlockSpatial) bi.getSpatial()).setSelected(false);
|
||||||
|
min.set(bi.getPosition());
|
||||||
|
max.set(bi.getPosition());
|
||||||
|
min.add(-0.5f, -0.5f, -0.5f); // -scale, -scale, -scale
|
||||||
|
max.add(0.5f, 0.5f, 0.5f); // scale, scale, scale
|
||||||
|
if (Intersectionf.intersectRayAab(position, dir, min, max, nearFar) && nearFar.x < closestDistance) {
|
||||||
|
closestDistance = nearFar.x;
|
||||||
|
selectedSpatial = bi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selectedSpatial != null) {
|
||||||
|
((BlockSpatial) selectedSpatial.getSpatial()).setSelected(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -182,8 +182,6 @@ public class Chunk {
|
|||||||
bi = new BlockInstance(bedrock);
|
bi = new BlockInstance(bedrock);
|
||||||
}
|
}
|
||||||
bi.setPosition(new Vector3i(wx + px, j, wy + py));
|
bi.setPosition(new Vector3i(wx + px, j, wy + py));
|
||||||
//bi.getSpatial().setPosition(new Vector3i(wx + px, j, wy + py));
|
|
||||||
//bi.getSpatial().setScale(0.5F);
|
|
||||||
bi.setWorld(world);
|
bi.setWorld(world);
|
||||||
//world.blocks().add(bi);
|
//world.blocks().add(bi);
|
||||||
list.add(bi);
|
list.add(bi);
|
||||||
|
@ -37,7 +37,7 @@ public class LocalWorld extends World {
|
|||||||
|
|
||||||
private class ChunkGenerationThread extends Thread {
|
private class ChunkGenerationThread extends Thread {
|
||||||
Deque<ChunkAction> loadList = new ArrayDeque<>(); // FIFO order (First In, First Out)
|
Deque<ChunkAction> loadList = new ArrayDeque<>(); // FIFO order (First In, First Out)
|
||||||
private static final int MAX_QUEUE_SIZE = 12;
|
private static final int MAX_QUEUE_SIZE = 16;
|
||||||
|
|
||||||
public void queue(ChunkAction ca) {
|
public void queue(ChunkAction ca) {
|
||||||
if (!isQueued(ca)) {
|
if (!isQueued(ca)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user