Skip to content

Commit 6874104

Browse files
committed
function updateCellsAroundPlayer now only in worker
1 parent 1548cb8 commit 6874104

File tree

6 files changed

+89
-77
lines changed

6 files changed

+89
-77
lines changed

src/client/scripts/World/World.coffee

Lines changed: 19 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@ class World
2424
#Utworzenie Workera do obliczania geometrii chunków
2525
@chunkWorker=new chunkWorker
2626
@chunkWorker.onmessage=(message)->
27-
_this.updateCell message.data
27+
if message.data.type is "cellGeo"
28+
_this.updateCell message.data.data
29+
else if message.data.type is "removeCell"
30+
if _this.cellMesh[message.data.data] isnt undefined
31+
_this.cellMesh[message.data.data].geometry.dispose()
32+
_this.game.scene.remove _this.cellMesh[message.data.data]
33+
delete _this.cellMesh[message.data.data]
34+
_this.game.renderer.renderLists.dispose()
2835
@chunkWorker.postMessage {
2936
type:'init'
3037
data:{
@@ -47,62 +54,13 @@ class World
4754
setCell: (cellX,cellY,cellZ,buffer)->
4855
@_setCell cellX,cellY,cellZ,buffer
4956
@cellTerrain.setCell cellX,cellY,cellZ,buffer
50-
@cellNeedsUpdate[@cellTerrain.vec3(cellX,cellY,cellZ)]=true
51-
for nei in @neighbours
52-
neiCellId=@cellTerrain.vec3(cellX+nei[0],cellY+nei[1],cellZ+nei[2])
53-
@cellNeedsUpdate[neiCellId]=true
5457
setBlock: (voxelX,voxelY,voxelZ,value) ->
5558
voxelX=parseInt voxelX
5659
voxelY=parseInt voxelY
5760
voxelZ=parseInt voxelZ
5861
if (@cellTerrain.getVoxel voxelX,voxelY,voxelZ) isnt value
5962
@_setVoxel voxelX,voxelY,voxelZ,value
60-
@cellTerrain.setVoxel voxelX,voxelY,voxelZ,value
61-
cellId=@cellTerrain.vec3 @cellTerrain.computeCellForVoxel(voxelX,voxelY,voxelZ)...
62-
@cellNeedsUpdate[cellId]=true
63-
for nei in @neighbours
64-
neiCellId=@cellTerrain.vec3 @cellTerrain.computeCellForVoxel(voxelX+nei[0],voxelY+nei[1],voxelZ+nei[2])...
65-
@cellNeedsUpdate[neiCellId]=true
6663
return
67-
updateCellsAroundPlayer: (pos,radius)->
68-
#Updatowanie komórek wokół gracza w danym zasięgu
69-
_this=@
70-
if @cellUpdateTime isnt null and (performance.now()-@cellUpdateTime>@renderTime)
71-
#Ustawianie z defaultu, żeby każdy Mesh był wykasowywany
72-
cellBlackList={}
73-
for k,v of @cellMesh
74-
if v isnt "disposed" and v isnt "disposedX"
75-
cellBlackList[k]=true
76-
cell=@cellTerrain.computeCellForVoxel (Math.floor pos.x),(Math.floor pos.y),(Math.floor pos.z)
77-
up=(x,y,z)->
78-
pcell=[cell[0]+x,cell[1]+y,cell[2]+z]
79-
cellId=_this.cellTerrain.vec3(pcell...)
80-
#Updatowanie mesha, jeśli był disposed lub potrzebuje updatu
81-
if _this.cellNeedsUpdate[cellId] or _this.cellMesh[cellId] is "disposed"
82-
83-
if _this.cellNeedsUpdate[cellId]
84-
delete _this.cellNeedsUpdate[cellId]
85-
if _this.cellMesh[cellId] is "disposed"
86-
_this.cellMesh[cellId]="disposedX"
87-
_this._genCellGeo pcell...
88-
cellBlackList[cellId]=false
89-
return
90-
odw={}
91-
for i in [0..radius]
92-
for x in [-i..i]
93-
for y in [-i..i]
94-
for z in [-i..i]
95-
if not odw["#{x}:#{y}:#{z}"]
96-
up(x,y,z)
97-
odw["#{x}:#{y}:#{z}"]=true
98-
#Kasowanie Meshy, które mają znacznik .todel
99-
for i of cellBlackList
100-
if cellBlackList[i] is true
101-
@cellMesh[i].geometry.dispose()
102-
# @cellMesh[i].material.dispose()
103-
@game.scene.remove @cellMesh[i]
104-
@cellMesh[i]="disposed"
105-
@game.renderer.renderLists.dispose()
10664
resetWorld: ()->
10765
for i of @cellMesh
10866
if @cellMesh[i].geometry isnt undefined
@@ -123,7 +81,7 @@ class World
12381
geometry.setAttribute 'uv',new THREE.BufferAttribute(new Float32Array(cell.uvs), 2)
12482
geometry.setAttribute 'color',new THREE.BufferAttribute(new Float32Array(cell.colors), 3)
12583
geometry.matrixAutoUpdate=false
126-
if mesh is undefined or mesh is "disposedX"
84+
if mesh is undefined
12785
@cellMesh[cellId]=new THREE.Mesh geometry,@material
12886
@cellMesh[cellId].matrixAutoUpdate=false
12987
@cellMesh[cellId].frustumCulled = false
@@ -132,7 +90,7 @@ class World
13290
_this.cellMesh[cellId].frustumCulled = true
13391
_this.cellMesh[cellId].onAfterRender = ->
13492
@game.scene.add @cellMesh[cellId]
135-
else if mesh isnt "disposed"
93+
else
13694
@cellMesh[cellId].geometry=geometry
13795
return
13896
intersectsRay: (start,end) ->
@@ -254,6 +212,15 @@ class World
254212
type:"genCellGeo"
255213
data:[cellX,cellY,cellZ]
256214
}
215+
_updateCellsAroundPlayer: (radius)->
216+
if @cellUpdateTime isnt null and (performance.now()-@cellUpdateTime>@renderTime)
217+
pos=@game.camera.position
218+
cell=@cellTerrain.computeCellForVoxel (Math.floor pos.x),(Math.floor pos.y),(Math.floor pos.z)
219+
@chunkWorker.postMessage {
220+
type:"updateCellsAroundPlayer"
221+
data:[cell,radius]
222+
}
223+
return
257224
_computeSections: (sections,x,z,biomes)->
258225
#Wysyłanie do SectionsWorkera Buffora, który ma przekształcić w łatwiejszą postać
259226
@sectionsWorker.postMessage {

src/client/scripts/World/chunk.worker.coffee

Lines changed: 67 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import {CellTerrain} from './CellTerrain.coffee'
22

3-
console.log "CHUNK WORKER STARTED!"
3+
terrain=null
44

55
class TerrainManager
66
constructor: (options)->
@@ -13,6 +13,8 @@ class TerrainManager
1313
@q=1/@toxelSize
1414
@blocksMapping=options.blocksMapping
1515
@blocksTex=options.blocksTex
16+
@cellNeedsUpdate={}
17+
@loadedMeshes={}
1618
genBlockFace: (type,block,pos)->
1719
if @blocksTex[block.name] isnt undefined or @blocksTex[String(block.stateId)] isnt undefined
1820
if @blocksTex[String(block.stateId)] isnt undefined
@@ -201,21 +203,9 @@ class TerrainManager
201203
uvs
202204
colors
203205
}
204-
addEventListener "message", (e)->
205-
fn = handlers[e.data.type]
206-
if not fn
207-
throw new Error('no handler for type: ' + e.data.type)
208-
fn(e.data.data)
209-
return
210-
State={
211-
init:null
212-
world:{}
213-
}
214-
terrain=null
215-
time=0
216-
handlers={
206+
207+
handlers=
217208
init:(data)->
218-
State.init=data
219209
terrain=new TerrainManager {
220210
models:data.models
221211
blocks:data.blocks
@@ -228,20 +218,78 @@ handlers={
228218
return
229219
setVoxel:(data)->
230220
terrain.cellTerrain.setVoxel data...
221+
#TODO: cellNeedsUpdate update
222+
cellId=terrain.cellTerrain.vec3 terrain.cellTerrain.computeCellForVoxel(data[0],data[1],data[2])...
223+
terrain.cellNeedsUpdate[cellId]=true
224+
neighbours=[[-1, 0, 0],[1, 0, 0],[0, -1, 0],[0, 1, 0],[0, 0, -1],[0, 0, 1]]
225+
for i in neighbours
226+
neiCellId=terrain.cellTerrain.vec3 terrain.cellTerrain.computeCellForVoxel(data[0]+nei[0],data[1]+nei[1],data[2]+nei[2])...
227+
terrain.cellNeedsUpdate[neiCellId]=true
228+
return
231229
genCellGeo: (data)->
232230
if ((terrain.cellTerrain.vec3 data...) of terrain.cellTerrain.cells) is true
233231
p1=performance.now()
234232
geo=terrain.genCellGeo data...
235233
p2=performance.now()
236234
postMessage {
237-
cell:geo
238-
info:data
239-
p:performance.now()
235+
type:"cellGeo"
236+
data:
237+
cell:geo
238+
info:data
239+
p:performance.now()
240240
}
241+
return
241242
setCell: (data)->
243+
neighbours=[[-1, 0, 0],[1, 0, 0],[0, -1, 0],[0, 1, 0],[0, 0, -1],[0, 0, 1]]
244+
terrain.cellNeedsUpdate[terrain.cellTerrain.vec3 data[0],data[1],data[2]]=true
242245
terrain.cellTerrain.setCell data[0],data[1],data[2],data[3]
246+
for nei in neighbours
247+
neiCellId=terrain.cellTerrain.vec3(data[0]+nei[0],data[1]+nei[1],data[2]+nei[2])
248+
terrain.cellNeedsUpdate[neiCellId]=true
249+
return
243250
resetWorld: (data)->
244251
console.log "RESET WORLD!"
245252
terrain.cellTerrain.cells={}
246253
return
247-
}
254+
updateCellsAroundPlayer:(data)->
255+
cell=data[0]
256+
radius=data[1]
257+
odw={}
258+
cellBlackList={}
259+
for k,v of terrain.loadedMeshes
260+
if v is true
261+
cellBlackList[k]=true
262+
for i in [0..radius]
263+
for x in [-i..i]
264+
for y in [-i..i]
265+
for z in [-i..i]
266+
if not odw["#{x}:#{y}:#{z}"]
267+
odw["#{x}:#{y}:#{z}"]=true
268+
pcell=[cell[0]+x,cell[1]+y,cell[2]+z]
269+
cellId=terrain.cellTerrain.vec3 pcell...
270+
cellBlackList[cellId]=false
271+
gen=false
272+
if terrain.cellNeedsUpdate[cellId]
273+
delete terrain.cellNeedsUpdate[cellId]
274+
handlers.genCellGeo pcell
275+
gen=true
276+
if terrain.loadedMeshes[cellId] is "disposed"
277+
if not gen
278+
handlers.genCellGeo pcell
279+
terrain.loadedMeshes[cellId]=true
280+
for k,v of cellBlackList
281+
if v is true
282+
terrain.loadedMeshes[k]="disposed"
283+
postMessage {
284+
type:"removeCell"
285+
data:k
286+
}
287+
return
288+
289+
addEventListener "message", (e)->
290+
fn = handlers[e.data.type]
291+
if not fn
292+
throw new Error "no handler for type: #{e.data.type}"
293+
fn e.data.data
294+
return
295+

src/client/scripts/World/sections.worker.coffee

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11

2-
console.log "SECTIONS WORKER STARTED!"
3-
42
class BitArray
53
constructor: (options)->
64
if options is null

src/client/scripts/index.coffee

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class Game
6161

6262
@stats=new Stats
6363
@drawcalls=@stats.addPanel new Stats.Panel( "calls", "#ff8", "#221" )
64-
@stats.showPanel 3
64+
@stats.showPanel 0
6565
document.body.appendChild @stats.dom
6666

6767
@pii=new PlayerInInventory @
@@ -202,7 +202,7 @@ class Game
202202
_this.bb.stopDigging()
203203
if _this.mouse and _this.bb.done
204204
_this.bb.digRequest()
205-
@world.updateCellsAroundPlayer @camera.position,@params.chunkdist
205+
@world._updateCellsAroundPlayer @params.chunkdist
206206
TWEEN.update()
207207
@drawcalls.update @renderer.info.render.calls,100
208208
if @FPC.gameState is "inventory"

src/client/webpack.common.coffee

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ webpack=require "webpack"
77
LodashModuleReplacementPlugin = require 'lodash-webpack-plugin'
88

99
module.exports=
10-
stats:"detailed"
1110
performance:
1211
hints: false
1312
entry: [

src/server.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"ip":"localhost",
33
"port":25565,
4-
"version":"1.16.1"
4+
"version":"1.16.5"
55
}

0 commit comments

Comments
 (0)