void TinyGameLibrary::mainLoop() { m_run = true; while (m_run) { SDL_RenderClear(m_renderer); readKeys(); moveObjects(); renderLevel(); SDL_RenderPresent(m_renderer); SDL_Delay(1000 / 30); } }
//----------------------------------------------------------------------- // Loop over every edge tile. Determine which the lowest lod on each edge // and use that to adjust the extents. // TODO: This routine is expensive, and is only needed when LOD is involved. // Optimize? Ironic since LOD is supposed to make things faster. void AdjustEdgesForLod( LodTracker& lodTracker, int minPageX, int minPageZ, int maxPageX, int maxPageZ, int& localPageMinX, int& localPageMinZ, int& localPageMaxX, int& localPageMaxZ ) { int minTileZ = PageToTile( localPageMinZ, lodTracker.GetInvTileSize(), lodTracker.GetMaxNumTiles() ); int maxTileZ = PageToTile( localPageMaxZ, lodTracker.GetInvTileSize(), lodTracker.GetMaxNumTiles() ); int minTileX = PageToTile( localPageMinX, lodTracker.GetInvTileSize(), lodTracker.GetMaxNumTiles() ); int maxTileX = PageToTile( localPageMaxX, lodTracker.GetInvTileSize(), lodTracker.GetMaxNumTiles() ); int westRenderLevel = 0; int eastRenderLevel = 0; for( int pageZ = minPageZ; pageZ <= maxPageZ; ++pageZ ) { int endTileZ = ( pageZ == maxPageZ ) ? maxTileZ : lodTracker.GetMaxNumTiles() - 1; for( int tileZ = ( pageZ == minPageZ ) ? minTileZ : 0; tileZ <= endTileZ; ++tileZ ) { // West edge lodTracker.SetPage( minPageX, pageZ ); lodTracker.UpdateTile( minTileX, tileZ ); int renderLevel = lodTracker.GetRenderLevel().GetRenderLevel(); if( renderLevel > westRenderLevel ) westRenderLevel = renderLevel; // East edge lodTracker.SetPage( maxPageX, pageZ ); lodTracker.UpdateTile( maxTileX, tileZ ); renderLevel = lodTracker.GetRenderLevel().GetRenderLevel(); if( renderLevel > eastRenderLevel ) eastRenderLevel = renderLevel; } } int northRenderLevel = 0; int southRenderLevel = 0; for( int pageX = minPageX; pageX <= maxPageX; ++pageX ) { int endTileX = ( pageX == maxPageX ) ? maxTileX : lodTracker.GetMaxNumTiles() - 1; for( int tileX = ( pageX == minPageX ) ? minTileX : 0; tileX <= endTileX; ++tileX ) { // North edge lodTracker.SetPage( pageX, minPageZ ); lodTracker.UpdateTile( tileX, minTileZ ); int renderLevel = lodTracker.GetRenderLevel().GetRenderLevel(); if( renderLevel > northRenderLevel ) northRenderLevel = renderLevel; // South edge lodTracker.SetPage( pageX, maxPageZ ); lodTracker.UpdateTile( tileX, maxTileZ ); renderLevel = lodTracker.GetRenderLevel().GetRenderLevel(); if( renderLevel > southRenderLevel ) southRenderLevel = renderLevel; } } // Use the lods we found to adjust the min and max local coords. RenderLevel renderLevel( westRenderLevel ); localPageMinX = renderLevel.Floor( localPageMinX ); renderLevel.SetRenderLevel( eastRenderLevel ); localPageMaxX = renderLevel.Ceil( localPageMaxX ); renderLevel.SetRenderLevel( northRenderLevel ); localPageMinZ = renderLevel.Floor( localPageMinZ ); renderLevel.SetRenderLevel( southRenderLevel ); localPageMaxZ = renderLevel.Ceil( localPageMaxZ ); }