@@ -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 {
0 commit comments