diff --git a/prismarine-viewer/examples/playground.ts b/prismarine-viewer/examples/playground.ts index 8839affb..f5a32d04 100644 --- a/prismarine-viewer/examples/playground.ts +++ b/prismarine-viewer/examples/playground.ts @@ -184,9 +184,9 @@ async function main () { const cameraPos = targetPos.offset(2, 2, 2) const pitch = THREE.MathUtils.degToRad(-45) const yaw = THREE.MathUtils.degToRad(45) - // viewer.camera.rotation.set(pitch, yaw, 0, 'ZYX') - // viewer.camera.lookAt(targetPos.x + 0.5, targetPos.y + 0.5, targetPos.z + 0.5) - // viewer.camera.position.set(cameraPos.x + 0.5, cameraPos.y + 0.5, cameraPos.z + 0.5) + viewer.camera.rotation.set(pitch, yaw, 0, 'ZYX') + viewer.camera.lookAt(targetPos.x + 0.5, targetPos.y + 0.5, targetPos.z + 0.5) + viewer.camera.position.set(cameraPos.x + 0.5, cameraPos.y + 0.5, cameraPos.z + 0.5) // controls.update() let blockProps = {} diff --git a/prismarine-viewer/examples/webglRenderer.ts b/prismarine-viewer/examples/webglRenderer.ts index 0b0e2c47..b55bed41 100644 --- a/prismarine-viewer/examples/webglRenderer.ts +++ b/prismarine-viewer/examples/webglRenderer.ts @@ -21,10 +21,10 @@ export const makeRender = () => { renderLoop() } -let CubePositions = [] as [number, number, number][] +export const cubePositions = [] as [number, number, number, string][] export const addCubes = (positions: [number, number, number][]) => { - CubePositions.push(...positions) + // CubePositions.push(...positions) } export const initWeblRenderer = async (version) => { @@ -80,12 +80,12 @@ export const initWeblRenderer = async (version) => { ]) // write random coordinates to cube positions xyz ten cubes; - for (let i = 0; i < 100_000; i++) { - let x = Math.random() * 100 - 50; - let y = Math.random() * 100 - 50; - let z = Math.random() * 100 - 100; - CubePositions.push([x, y, z]); - } + // for (let i = 0; i < 100_000; i++) { + // let x = Math.random() * 100 - 50; + // let y = Math.random() * 100 - 50; + // let z = Math.random() * 100 - 100; + // CubePositions.push([x, y, z]); + // } let VBO, VAO = gl.createVertexArray(); VBO = gl.createBuffer(); @@ -142,6 +142,12 @@ export const initWeblRenderer = async (version) => { if (code === 'KeyD') { viewer.camera.position.x += 1 } + if (code === 'ShiftLeft') { + viewer.camera.position.y += 0.5 + } + if (code === 'Space') { + viewer.camera.position.y -= 0.5 + } } } window.addEventListener('keydown', keys) @@ -234,11 +240,12 @@ export const initWeblRenderer = async (version) => { gl.viewport(0, 0, gl.canvas.width, gl.canvas.height) view = m4.identity(); + // view = viewer.camera.matrix.elements const yaw = viewer.camera.rotation.y const pitch = viewer.camera.rotation.x m4.rotateX(view, yaw * Math.PI / 180, view) m4.rotateY(view, pitch * Math.PI / 180, view) - m4.translate(view, [viewer.camera.position.x, viewer.camera.position.y, viewer.camera.position.z], view) + m4.translate(view, [-viewer.camera.position.x, -viewer.camera.position.y, -viewer.camera.position.z], view) gl.clearColor(0.1, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT) @@ -255,25 +262,35 @@ export const initWeblRenderer = async (version) => { let i = 0 - CubePositions.forEach((cubePosition) => { - const model = m4.identity() + // CubePositions = [[ + // 2, 90, 2 + // ]] + const cubePositions = Object.values(viewer.world.newChunks).map((chunk: any) => { + return Object.entries(chunk.blocks).map(([pos, block]) => { + return [...pos.split(',').map(Number), block] as [number, number, number, string] + }) + }).flat() + cubePositions.forEach(([x, y, z, name]) => { + const result = findTextureInBlockStates(name)?.north.texture! + if (result) { + const model = m4.identity() - m4.translate(model, [cubePosition[0], cubePosition[1], cubePosition[2]], model); - //m4.rotateX(model, performance / 1000*i/800 + Math.random() / 100, model); - //m4.rotateY(model, performance / 2500*i/800 + Math.random() / 100, model) - //m4.rotateZ(model, Math.random() / 1010, model) - const result = findTextureInBlockStates(i % 2 ? 'dirt' : 'cobblestone')?.north.texture! - gl.uniformMatrix4fv(ModelUniform, false, model); - // const u = 4 * 1 / 64; - // const v = 0 * 1 / 64; - const u = result.u + result.su - const v = result.v - gl.uniform2fv(uvUniform, [u, v]) + //m4.rotateX(model, performance / 1000*i/800 + Math.random() / 100, model); + //m4.rotateY(model, performance / 2500*i/800 + Math.random() / 100, model) + //m4.rotateZ(model, Math.random() / 1010, model) + m4.translate(model, [x, y, z], model); + gl.uniformMatrix4fv(ModelUniform, false, model); + // const u = 4 * 1 / 64; + // const v = 0 * 1 / 64; + const u = result.u + result.su + const v = result.v + gl.uniform2fv(uvUniform, [u, v]) - i++ - // i %= 800; + i++ + // i %= 800; - gl.drawArrays(gl.TRIANGLES, 0, 36); + gl.drawArrays(gl.TRIANGLES, 0, 36); + } }) ///model.translate([0, 0, 0], model) diff --git a/prismarine-viewer/viewer/lib/worldrenderer.ts b/prismarine-viewer/viewer/lib/worldrenderer.ts index 9c811205..1847a032 100644 --- a/prismarine-viewer/viewer/lib/worldrenderer.ts +++ b/prismarine-viewer/viewer/lib/worldrenderer.ts @@ -10,7 +10,7 @@ import { toMajor } from './version.js' import PrismarineChatLoader from 'prismarine-chat' import { renderSign } from '../sign-renderer/' import { chunkPos, sectionPos } from './simpleUtils' -import { addCubes } from '../../examples/webglRenderer' +import { addCubes, cubePositions } from '../../examples/webglRenderer' function mod (x, n) { return ((x % n) + n) % n @@ -57,6 +57,7 @@ export class WorldRenderer { droppedFpsPercentage = 0 initialChunksLoad = true enableChunksLoadDelay = false + newChunks = {} texturesVersion?: string @@ -88,9 +89,10 @@ export class WorldRenderer { const chunkCoords = data.key.split(',') if (/* !this.loadedChunks[chunkCoords[0] + ',' + chunkCoords[2]] || */ !this.active) return - addCubes(Object.entries(data.geometry.blocks).map(([pos, block]) => { - return pos.split(',').map(Number) as [number, number, number] - })) + this.newChunks[data.key] = data.geometry + // cubePositions.push(...Object.entries(data.geometry.blocks).map(([pos, block]) => { + // return [...pos.split(',').map(Number), block] as [number, number, number, string] + // })) // if (!this.initialChunksLoad && this.enableChunksLoadDelay) {