From 13960cd6456bd3a488c81be4a6e789bc30723f58 Mon Sep 17 00:00:00 2001 From: barnold1953 Date: Mon, 14 Jul 2014 16:16:07 -0700 Subject: [PATCH] Basic falling sand script --- examples/fallingSand.js | 91 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 examples/fallingSand.js diff --git a/examples/fallingSand.js b/examples/fallingSand.js new file mode 100644 index 0000000000..015f9e23ff --- /dev/null +++ b/examples/fallingSand.js @@ -0,0 +1,91 @@ +var SAND_LIFETIME = 100.0; +var UPDATE_RATE = 1.0; +var SAND_SIZE = 0.125; + +var sandArray = []; +var numSand = 0; + + +var red = 255; +var green = 0; +var blue = 0; + +var SOURCE_POSITION = MyAvatar.position; + +function update() { + + for (var i = 0; i < numSand; i++) { + updateSand(i); + } + + var voxel = Voxels.getVoxelAt(SOURCE_POSITION.x, SOURCE_POSITION.y, SOURCE_POSITION.z, SAND_SIZE); + if (voxel.s == 0) { + sandArray[numSand] = {x: SOURCE_POSITION.x, y: SOURCE_POSITION.y, z: SOURCE_POSITION.z, s: SAND_SIZE, r: red, g: green, b: blue}; + numSand++; + Voxels.setVoxel(SOURCE_POSITION.x, SOURCE_POSITION.y, SOURCE_POSITION.z, SAND_SIZE, red, green, blue); + } +} + +function isVoxelEmpty(x, y, z) { + var adjacent = Voxels.getVoxelAt(x, y, z, SAND_SIZE); + return (adjacent.s == 0); +} + +function tryMoveVoxel(voxel, x, y, z) { + //If the adjacent voxel is empty, we will move to it. + if (isVoxelEmpty(x, y, z)) { + moveVoxel(voxel, x, y, z); + return true; + } + return false; +} + +function moveVoxel(voxel, x, y, z) { + Voxels.eraseVoxel(voxel.x, voxel.y, voxel.z, SAND_SIZE); + Voxels.setVoxel(x, y, z, SAND_SIZE, red, green, blue); + voxel.x = x; + voxel.y = y; + voxel.z = z; +} + +function updateSand(i) { + var voxel = sandArray[i]; + + //Down + if (tryMoveVoxel(voxel, voxel.x, voxel.y - SAND_SIZE, voxel.z)) return true; + //Left + if (isVoxelEmpty(voxel.x - SAND_SIZE, voxel.y, voxel.z) && + isVoxelEmpty(voxel.x - SAND_SIZE, voxel.y - SAND_SIZE, voxel.z)) { + moveVoxel(voxel, voxel.x - SAND_SIZE, voxel.y, voxel.z); + return true; + } + //Back + if (isVoxelEmpty(voxel.x, voxel.y, voxel.z - SAND_SIZE) && + isVoxelEmpty(voxel.x, voxel.y - SAND_SIZE, voxel.z - SAND_SIZE)) { + moveVoxel(voxel, voxel.x, voxel.y, voxel.z - SAND_SIZE); + return true; + } + //Right + if (isVoxelEmpty(voxel.x + SAND_SIZE, voxel.y, voxel.z) && + isVoxelEmpty(voxel.x + SAND_SIZE, voxel.y - SAND_SIZE, voxel.z)) { + moveVoxel(voxel, voxel.x + SAND_SIZE, voxel.y, voxel.z); + return true; + } + //Front + if (isVoxelEmpty(voxel.x, voxel.y, voxel.z + SAND_SIZE) && + isVoxelEmpty(voxel.x, voxel.y - SAND_SIZE, voxel.z + SAND_SIZE)) { + moveVoxel(voxel, voxel.x, voxel.y, voxel.z + SAND_SIZE); + return true; + } + return false; +} + +function scriptEnding() { + for (var i = 0; i < numSand; i++) { + var voxel = sandArray[i]; + Voxels.eraseVoxel(voxel.x, voxel.y, voxel.z, SAND_SIZE); + } +} + +Script.update.connect(update); +Script.scriptEnding.connect(scriptEnding);