@@ -8,7 +8,6 @@ import {Stars} from '@react-three/drei'
88import { Physics } from "use-cannon"
99import Tree from "../components/Tree" ;
1010import WaterPlane from "../components/WaterPlane" ;
11- import { AmbientLight } from 'three' ;
1211
1312export default function Terrain ( { pointSizeArg,
1413 iterationsArg,
@@ -17,7 +16,8 @@ export default function Terrain({ pointSizeArg,
1716 evaporationMultiplierArg,
1817 depositionMultiplierArg,
1918 worldSizeScaleArg,
20- buttonGenerate
19+ buttonGenerate,
20+ objectDensityArg
2121} ) {
2222 var pointsSize = pointSizeArg / 2 ; //256 // wielkość mapy przed skalowaniem jej ( czyli tak jakby jakość erozji)
2323 var iterations = iterationsArg ; //300 ilość iteracji erozji
@@ -27,14 +27,17 @@ export default function Terrain({ pointSizeArg,
2727 var depositionMultiplier = depositionMultiplierArg ;
2828 var worldSizeScale = worldSizeScaleArg ; // skala wielkości terenu (wielkość skalowania np x4) (tutaj slider nie schodzący poniżej wartości 1)
2929
30+ objectDensityArg = parseInt ( objectDensityArg )
31+
3032 const [ WaterHeight , setWaterHeight ] = useState ( 0 ) ;
3133 const [ GroundHeight , setGroundHeight ] = useState ( 0 ) ;
3234 const [ MapArray , setMapArray ] = useState ( [ ] ) ;
3335 const [ trees , setTrees ] = useState ( [ 1 ] )
3436
37+
3538 useEffect ( ( ) => {
36- if ( trees . length > 51 ) setTrees ( [ 1 ] )
37- } , [ trees ] )
39+ setTrees ( [ 1 ] )
40+ } , [ worldSizeScale ] )
3841
3942 let calculateWaterCallback = ( waterLVL ) => {
4043 setWaterHeight ( waterLVL )
@@ -47,13 +50,28 @@ export default function Terrain({ pointSizeArg,
4750 let getMapArray = ( mapArray ) => {
4851 setMapArray ( mapArray )
4952 }
53+ const { promisify } = require ( 'util' )
54+ const sleep = promisify ( setTimeout )
55+
56+ const handleKeyPres = ( event ) => {
57+ if ( event . key === 'l' || event . key == 'L' ) {
58+
59+ if ( trees . length === 0 || trees . length > objectDensityArg ) {
60+ setTrees ( [ null ] )
61+ sleep ( 5000 ) . then ( ( ) => {
62+ start ( )
63+ } )
64+ } else {
65+ start ( )
66+ }
67+ }
68+ }
5069
51- console . log ( "Map array w terrain:" , MapArray )
52- console . log ( "Drzwka" , trees )
70+ console . log ( "taki jest suwak: " , objectDensityArg , 'a tyle jest treesów: ' , trees . length )
5371 return (
5472 < Canvas
5573 camera = { { position : [ 0 , 0 , 0 ] , fov : 50 } }
56- onClick = { ( ) => start ( ) }
74+ onKeyPress = { ( x ) => handleKeyPres ( x ) }
5775 >
5876 < spotLight position = { [ 0 , 2 * worldSizeScale , - 4 * worldSizeScale ] } angle = { 0.8 } penumbra = { 1 } intensity = { 0.6 } visible = { true } />
5977 < pointLight
@@ -81,6 +99,7 @@ export default function Terrain({ pointSizeArg,
8199 calculateWaterCallback = { calculateWaterCallback }
82100 calculateGroundHeightCallBack = { calculateGroundHeightCallBack }
83101 getMapArray = { getMapArray }
102+ start = { start }
84103 />
85104 < WaterPlane scale = { worldSizeScale } waterHeight = { WaterHeight } />
86105 < CameraControls />
@@ -96,40 +115,68 @@ export default function Terrain({ pointSizeArg,
96115 )
97116
98117 function start ( ) {
99- if ( trees . length === 0 ) return
100-
101- let newTrees = trees . map ( ( props ) => ( { ...props } ) )
102-
103- for ( var i = 0 ; i < 50 ; i ++ ) {
104- generateNewTree ( newTrees )
105- console . log ( "wykonano po raz" , i )
118+ if ( MapArray . length > 0 ) {
119+
120+
121+ let newTrees = trees . map ( ( props ) => ( { ...props } ) )
122+
123+
124+ for ( var i = 0 ; i < objectDensityArg ; i ++ ) {
125+ generateNewTree ( newTrees )
126+ }
127+
128+ setTrees ( [ ...newTrees ] )
129+
106130 }
107-
108- setTrees ( [ ...newTrees ] )
109131 }
110132
111133
112134
113135 function generateNewTree ( newTrees ) {
114- const randomType = getRandomInt ( 3 )
136+ const randomType = getRandomInt ( 2 )
115137 const coordinates = getRandomCoordinate ( )
116138
117- console . log ( "losowy typ" , randomType )
118-
119139 newTrees . push ( { x : coordinates . x , y : coordinates . y , z : coordinates . z , scale : worldSizeScale , type : randomType } )
120140 }
121141
122142
123143 //random generators
124144 function getRandomCoordinate ( ) {
125- let ran = getRandomInt ( 30000 )
126- let x = MapArray [ 0 + 3 * ran ]
127- let y = MapArray [ 1 + 3 * ran ]
128- let z = MapArray [ 2 + 3 * ran ]
145+ let array = nestedList ( MapArray )
146+
147+ array = getArrayGroundHeight ( array )
148+ let ran = getRandomInt ( array . length )
149+ let x = array [ ran ] [ 0 ]
150+ let y = array [ ran ] [ 1 ]
151+ let z = array [ ran ] [ 2 ]
129152
130153 return { x, y, z}
131154 }
132155 function getRandomInt ( max ) {
133156 return Math . floor ( Math . random ( ) * Math . floor ( max ) )
134157 }
158+
159+ function nestedList ( oldList ) {
160+ let i = 0
161+ let newList = [ ]
162+ while ( i < oldList . length ) {
163+ newList . push ( [ oldList [ i ] , oldList [ i + 1 ] , oldList [ i + 2 ] ] )
164+ i += 3
165+ }
166+ return newList
167+ }
168+
169+ // tylko dane z wysokoscia zieloną
170+ function getArrayGroundHeight ( oldList ) {
171+ let i = 0
172+ let newList = [ ]
173+ while ( i < oldList . length ) {
174+ if ( oldList [ i ] [ 1 ] < GroundHeight && oldList [ i ] [ 1 ] > WaterHeight ) {
175+ newList . push ( oldList [ i ] )
176+ }
177+ i += 1
178+ }
179+
180+ return newList
181+ }
135182}
0 commit comments