diff --git a/app.js b/app.js new file mode 100644 index 0000000..8e26df6 --- /dev/null +++ b/app.js @@ -0,0 +1,143 @@ +// @ts-check + +import * as T from 'three'; +import { Scene } from './scene.js'; +import Region from "./region.js"; + +let voxels = []; +voxels[Region.I(0, 0, 0)] = true; +voxels[Region.I(1, 0, 0)] = true; +voxels[Region.I(2, 0, 0)] = true; +voxels[Region.I(0, 1, 0)] = true; +voxels[Region.I(1, 1, 0)] = true; +voxels[Region.I(0, 2, 0)] = true; + + +let surfaceCubeGeometry = new T.BufferGeometry(); +let surfaceCubeObject = new T.Mesh( + surfaceCubeGeometry, + new T.MeshPhongMaterial({color:0x666666, wireframe:false, flatShading:true, side:T.DoubleSide}) +); + +let rebuildSurface = inVoxels => +{ + let { pos, ind } = Region.Surface(inVoxels); + + surfaceCubeGeometry.setAttribute("position", new T.BufferAttribute(pos, 3)); + surfaceCubeGeometry.setIndex(ind); + surfaceCubeGeometry.computeVertexNormals(true); +}; +rebuildSurface(voxels); + + +Scene({ + DOM:"canvas", + Init(inScene) + { + let light = new T.PointLight(0xffffff, 1, 100) + light.position.set(5, 5, -5); + inScene.add(light) + inScene.add(surfaceCubeObject); + + inScene.add(new T.GridHelper(10, 10)); + inScene.add(new T.AxesHelper( 5 )); + }, + Update(inScene, inScreen, inDelta) + { + var i, hits, hit, index; + if(inScreen.Drag > 0) + { + hits = inScreen.Ray.intersectObject(surfaceCubeObject); + if(hits.length) + { + hit = hits[0]; + for(i=1; i + { + let centerX = Math.round(x); + let centerY = Math.round(y); + let centerZ = Math.round(z); + + let deltaX = ax-centerX; + let deltaY = ay-centerY; + let deltaZ = az-centerZ; + + let absDeltaX = Math.abs(deltaX); + let absDeltaY = Math.abs(deltaY); + let absDeltaZ = Math.abs(deltaZ); + + let max = absDeltaX; + if(absDeltaY > max){ max = absDeltaY; } + if(absDeltaZ > max){ max = absDeltaZ; } + + let lerp = 0.49/max; + + if(lerp <= 1) + { + return [ + centerX + deltaX*lerp, + centerY + deltaY*lerp, + centerZ + deltaZ*lerp + ]; + } + else + { + return [ax, ay, az]; + } + } + let average = (inArray, inPointInd, inOthersIndArray) => + { + let sum = [0, 0, 0]; + for(let i=0; i + { + let count = inVertsArray.length/3; + for(let t=0; t - - + + \ No newline at end of file diff --git a/region.js b/region.js index 43f1812..2fcdd60 100644 --- a/region.js +++ b/region.js @@ -1,9 +1,13 @@ -export const Region = +//@ ts-check + +const Region = { + /** @type {Region.CoordsToIndex} */ I(inX, inY, inZ) { return inX + inY*16 + inZ*256; }, + /** @type {Region.IndexToCoords} */ XYZ(inI) { let zWhole = Math.floor(inI / 256); @@ -12,10 +16,11 @@ export const Region = let yPart = zPart % 16; return [yPart, yWhole, zWhole]; }, + + /** @type {Region.BufferBuilder} */ Surface(inVoxels) { var vertices = []; // array of surface vertices - var voxPointVert = []; // vox array, contains integer pointers to vertices var triPointVert = []; // triangle array, contains integer pointers to vertices var vertPointNeighbors = []; // vertex array, contains arrays of integer pointers to vertices @@ -30,6 +35,7 @@ export const Region = Impure refs: voxPointVert, vertPointNeighbors, vertices */ + var voxPointVert = []; // vox array, contains integer pointers to vertices var vertPointer = voxPointVert[inVoxIndex] if(vertPointer === undefined) { @@ -123,6 +129,11 @@ export const Region = } } - return {vertices, triPointVert, vertPointNeighbors}; + return { + pos: new Float32Array(vertices.flat()), + ind: triPointVert + }; } }; + +export default Region; \ No newline at end of file diff --git a/scene.js b/scene.js index 6ca6239..349e1bc 100644 --- a/scene.js +++ b/scene.js @@ -1,7 +1,6 @@ -import * as T from 'http://esm.sh/three'; -import { OrbitControls } from 'http://esm.sh/three/examples/jsm/controls/OrbitControls.js'; +import * as T from 'three'; +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'; -export { T as THREE }; export function Scene(inSettings) { const renderer = new T.WebGLRenderer({canvas:document.querySelector(inSettings.DOM)}); @@ -83,7 +82,6 @@ export function Scene(inSettings) }; scene.add(light); - //scene.add(new T.GridHelper(10, 10)); light.position.set(-1, 2, 4); camera.position.set(-1, 2, -1); camera.lookAt(new T.Vector3(0,0,0)); diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 0000000..915890c --- /dev/null +++ b/types.d.ts @@ -0,0 +1,10 @@ +module Region +{ + type Voxels = Array; + type Coords = [number, number, number] + type Index = number + type IndexToCoords = (index:Index)=> Coords + type CoordsToIndex = (x:number, y:number, z:number)=> Index + type BufferParts = { pos:Array, ind:Array } + type BufferBuilder = (voxels:Voxels)=>BufferParts +} \ No newline at end of file