@@ -252,104 +252,101 @@ void GameMapHelpers::PutBlockFace(GameMapManager& cityScape, MapMeshData& meshDa
252252 meshData.mBlocksIndices [baseIndex + 5 ] = baseVertexIndex + 1 ;
253253}
254254
255- int GameMapHelpers::GetSlopeHeight (int slopeType, int pxcoord_x, int pxcoord_y )
255+ float GameMapHelpers::GetSlopeHeight (int slopeType, float coord_x, float coord_y )
256256{
257- return 0 .0f ; // todo: redo
257+ debug_assert (coord_x >= 0 .0f && coord_x <= 1 .0f );
258+ debug_assert (coord_y >= 0 .0f && coord_y <= 1 .0f );
258259
259- debug_assert (pxcoord_x >= 0 && pxcoord_x < PIXELS_PER_MAP_UNIT);
260- debug_assert (pxcoord_y >= 0 && pxcoord_y < PIXELS_PER_MAP_UNIT);
260+ // all values and calculations are in map units
261261
262- int pixmin = 0 ;
263- int pixmax = 0 ;
264- int pixcoord = 0 ;
262+ float min_evelation = 0 . 0f ;
263+ float max_evelation = 0 . 0f ;
264+ float lerp_factor = 0 . 0f ;
265265
266266 switch (slopeType)
267267 {
268- case 0 : return 0 ;
268+ case 0 : return 0 .0f ;
269+
269270 // N, 26 low, high
270271 case 1 : case 2 :
271- pixmin = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 1 + 1 );
272- pixmax = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 1 + 0 );
273- pixcoord = pxcoord_y ;
272+ min_evelation = (1 . 0f / 2 ) * (slopeType - 1 + 1 );
273+ max_evelation = (1 . 0f / 2 ) * (slopeType - 1 + 0 );
274+ lerp_factor = coord_y ;
274275 break ;
275276 // S, 26 low, high
276277 case 3 : case 4 :
277- pixmin = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 3 + 0 );
278- pixmax = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 3 + 1 );
279- pixcoord = pxcoord_y ;
278+ min_evelation = (1 . 0f / 2 ) * (slopeType - 3 + 0 );
279+ max_evelation = (1 . 0f / 2 ) * (slopeType - 3 + 1 );
280+ lerp_factor = coord_y ;
280281 break ;
281282 // W, 26 low, high
282283 case 5 : case 6 :
283- pixmin = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 5 + 1 );
284- pixmax = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 5 + 0 );
285- pixcoord = pxcoord_x ;
284+ min_evelation = (1 . 0f / 2 ) * (slopeType - 5 + 1 );
285+ max_evelation = (1 . 0f / 2 ) * (slopeType - 5 + 0 );
286+ lerp_factor = coord_x ;
286287 break ;
287288 // E, 26 low, high
288289 case 7 : case 8 :
289- pixmin = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 7 + 0 );
290- pixmax = (PIXELS_PER_MAP_UNIT / 2 ) * (slopeType - 7 + 1 );
291- pixcoord = pxcoord_x ;
290+ min_evelation = (1 . 0f / 2 ) * (slopeType - 7 + 0 );
291+ max_evelation = (1 . 0f / 2 ) * (slopeType - 7 + 1 );
292+ lerp_factor = coord_x ;
292293 break ;
293294 // N, 7 low - high
294295 case 9 : case 10 : case 11 : case 12 :
295296 case 13 : case 14 : case 15 : case 16 :
296- pixmin = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 9 + 1 );
297- pixmax = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 9 + 0 );
298- pixcoord = pxcoord_y ;
297+ min_evelation = (1 . 0f / 8 ) * (slopeType - 9 + 1 );
298+ max_evelation = (1 . 0f / 8 ) * (slopeType - 9 + 0 );
299+ lerp_factor = coord_y ;
299300 break ;
300301 // S, 7 low - high
301302 case 17 : case 18 : case 19 : case 20 :
302303 case 21 : case 22 : case 23 : case 24 :
303- pixmin = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 17 + 0 );
304- pixmax = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 17 + 1 );
305- pixcoord = pxcoord_y ;
304+ min_evelation = (1 . 0f / 8 ) * (slopeType - 17 + 0 );
305+ max_evelation = (1 . 0f / 8 ) * (slopeType - 17 + 1 );
306+ lerp_factor = coord_y ;
306307 break ;
307308 // W, 7 low - high
308309 case 25 : case 26 : case 27 : case 28 :
309310 case 29 : case 30 : case 31 : case 32 :
310- pixmin = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 25 + 1 );
311- pixmax = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 25 + 0 );
312- pixcoord = pxcoord_x ;
311+ min_evelation = (1 . 0f / 8 ) * (slopeType - 25 + 1 );
312+ max_evelation = (1 . 0f / 8 ) * (slopeType - 25 + 0 );
313+ lerp_factor = coord_x ;
313314 break ;
314315 // E, 7 low - high
315316 case 33 : case 34 : case 35 : case 36 :
316317 case 37 : case 38 : case 39 : case 40 :
317- pixmin = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 33 + 0 );
318- pixmax = (PIXELS_PER_MAP_UNIT / 8 ) * (slopeType - 33 + 1 );
319- pixcoord = pxcoord_x ;
318+ min_evelation = (1 . 0f / 8 ) * (slopeType - 33 + 0 );
319+ max_evelation = (1 . 0f / 8 ) * (slopeType - 33 + 1 );
320+ lerp_factor = coord_x ;
320321 break ;
321322 // 41 - 44 = 45 N,S,W,E
322323 case 41 :
323- pixmin = PIXELS_PER_MAP_UNIT ;
324- pixmax = 0 ;
325- pixcoord = pxcoord_y ;
324+ min_evelation = 1 . 0f ;
325+ max_evelation = 0 ;
326+ lerp_factor = coord_y ;
326327 break ;
327328 case 42 :
328- pixmin = 0 ;
329- pixmax = PIXELS_PER_MAP_UNIT ;
330- pixcoord = pxcoord_y ;
329+ min_evelation = 0 ;
330+ max_evelation = 1 . 0f ;
331+ lerp_factor = coord_y ;
331332 break ;
332333 case 43 :
333- pixmin = PIXELS_PER_MAP_UNIT ;
334- pixmax = 0 ;
335- pixcoord = pxcoord_x ;
334+ min_evelation = 1 . 0f ;
335+ max_evelation = 0 ;
336+ lerp_factor = coord_x ;
336337 break ;
337338 case 44 :
338- pixmin = 0 ;
339- pixmax = PIXELS_PER_MAP_UNIT ;
340- pixcoord = pxcoord_x ;
339+ min_evelation = 0 ;
340+ max_evelation = 1 . 0f ;
341+ lerp_factor = coord_x ;
341342 break ;
342343
343344 default :
344345 {
345346 debug_assert (false );
346- return 0 ;
347+ return 0 . 0f ;
347348 }
348349 }
349-
350- float t = (pixcoord * 1 .0f ) / (PIXELS_PER_MAP_UNIT - 1 );
351-
352- // linear interpolate point
353- int pixheight = static_cast <int >(glm::lerp (pixmin * 1 .0f , pixmax * 1 .0f , t));
354- return pixheight;
350+ // linear interpolate elevation
351+ return glm::lerp (min_evelation, max_evelation, lerp_factor);
355352}
0 commit comments