From e1a00e22d49db344254633c93f99a9609f36d29e Mon Sep 17 00:00:00 2001 From: mcarans Date: Thu, 16 Jul 2026 20:35:02 +1200 Subject: [PATCH 01/15] Maybe fix resize --- src/SDL/MyOpenGLView.m | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 0b4f3e8d2..51e32296b 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -1464,7 +1464,7 @@ - (void) initialiseGLWithSize:(NSSize) v_size useVideoMode:(BOOL) v_mode } viewSize = v_size; OOLog(@"display.initGL", @"Requested a new surface of %d x %d, %@.", (int)viewSize.width, (int)viewSize.height,(fullScreen ? @"fullscreen" : @"windowed")); - SDL_GL_SwapWindow(window); // clear the buffer before resize + int pixelWidth, pixelHeight; #if OOLITE_WINDOWS if (!updateContext) return; @@ -1629,9 +1629,10 @@ - (void) initialiseGLWithSize:(NSSize) v_size useVideoMode:(BOOL) v_mode SDL_SetWindowBordered(window, v_mode); SDL_SetWindowFullscreen(window, fullScreen); SDL_SetWindowSize(window, viewSize.width, viewSize.height); - SDL_Surface *surface = SDL_GetWindowSurface(window); - bounds.size.width = surface->w; - bounds.size.height = surface->h; + + SDL_GetWindowSizeInPixels(window, &pixelWidth, &pixelHeight); + bounds.size.width = pixelWidth; + bounds.size.height = pixelHeight; #endif OOLog(@"display.initGL", @"Created a new surface of %d x %d, %@.", (int)viewSize.width, (int)viewSize.height,(fullScreen ? @"fullscreen" : @"windowed")); @@ -1648,8 +1649,9 @@ - (void) initialiseGLWithSize:(NSSize) v_size useVideoMode:(BOOL) v_mode [self autoShowMouse]; - int pixelWidth, pixelHeight; +#if OOLITE_WINDOWS SDL_GetWindowSizeInPixels(window, &pixelWidth, &pixelHeight); +#endif NSSize pixelSize = NSMakeSize(pixelWidth, pixelHeight); [[self gameController] setUpBasicOpenGLStateWithSize:pixelSize]; SDL_GL_SwapWindow(window); @@ -2484,18 +2486,19 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call { [self initialiseGLWithSize: newSize]; [self saveWindowSize: newSize]; + + // certain gui screens will require an immediate redraw after + // a resize event - Nikos 20140129 + if ([PlayerEntity sharedPlayer]) + { + [[PlayerEntity sharedPlayer] doGuiScreenResizeUpdates]; + } } } #else newSize=NSMakeSize(rsevt->data1, rsevt->data2); resize_pending = true; #endif - // certain gui screens will require an immediate redraw after - // a resize event - Nikos 20140129 - if ([PlayerEntity sharedPlayer]) - { - [[PlayerEntity sharedPlayer] doGuiScreenResizeUpdates]; - } break; } @@ -2625,9 +2628,17 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call #if OOLITE_LINUX if (resize_pending) { + resize_pending = false; + [self initialiseGLWithSize: newSize]; [self saveWindowSize: newSize]; - resize_pending = false; + + // certain gui screens will require an immediate redraw after + // a resize event - Nikos 20140129 + if ([PlayerEntity sharedPlayer]) + { + [[PlayerEntity sharedPlayer] doGuiScreenResizeUpdates]; + } } #endif } From d4e5a0bf06985bc0a8306324abd3b05f440b650b Mon Sep 17 00:00:00 2001 From: mcarans Date: Sun, 19 Jul 2026 15:18:06 +1200 Subject: [PATCH 02/15] Smooth resizing --- src/SDL/MyOpenGLView.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 51e32296b..2d68cd658 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -1654,7 +1654,9 @@ - (void) initialiseGLWithSize:(NSSize) v_size useVideoMode:(BOOL) v_mode #endif NSSize pixelSize = NSMakeSize(pixelWidth, pixelHeight); [[self gameController] setUpBasicOpenGLStateWithSize:pixelSize]; +#if OOLITE_WINDOWS SDL_GL_SwapWindow(window); +#endif squareX = 0.0f; m_glContextInitialized = YES; @@ -2496,8 +2498,13 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call } } #else - newSize=NSMakeSize(rsevt->data1, rsevt->data2); - resize_pending = true; + int pixelWidth = 0; + int pixelHeight = 0; + if (SDL_GetWindowSizeInPixels(window, &pixelWidth, &pixelHeight) == 0) + { + newSize = NSMakeSize(pixelWidth, pixelHeight); + } + resize_pending = true; #endif break; } From 5dc4298a111d403331786d44bb7662156bed78b1 Mon Sep 17 00:00:00 2001 From: mcarans Date: Sun, 19 Jul 2026 15:47:14 +1200 Subject: [PATCH 03/15] See if this fixes branch where tag is created --- .github/workflows/build-all.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/build-all.yaml b/.github/workflows/build-all.yaml index 4d1d012fa..d8d0e7745 100644 --- a/.github/workflows/build-all.yaml +++ b/.github/workflows/build-all.yaml @@ -57,6 +57,8 @@ jobs: echo "/usr/local/lib" | tee -a /etc/ld.so.conf ldconfig - name: Build Oolite + env: + GitVersion_BranchName: ${{ github.head_ref || github.ref_name }} run: | ./mk.sh build ${{matrix.flavour}} --github-repository="$GITHUB_REPOSITORY" - name: Package Oolite @@ -92,6 +94,8 @@ jobs: with: fetch-depth: 0 - name: Build flatpak + env: + GitVersion_BranchName: ${{ github.head_ref || github.ref_name }} run: | echo "Installing gitversion..." source ShellScripts/Linux/install_gitversion_fn.sh @@ -148,6 +152,7 @@ jobs: env: msystem: UCRT64 PYTHONUTF8: "1" + GitVersion_BranchName: ${{ github.head_ref || github.ref_name }} run: | ./mk.sh build ${{matrix.flavour}} --github-repository="$GITHUB_REPOSITORY" - name: Package Oolite From 790b55650dfcf6fb649290c499f535e17fbca11d Mon Sep 17 00:00:00 2001 From: mcarans Date: Sun, 19 Jul 2026 15:59:56 +1200 Subject: [PATCH 04/15] See if this really fixes branch where tag is created --- .github/workflows/build-all.yaml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/build-all.yaml b/.github/workflows/build-all.yaml index d8d0e7745..3a79ac3ef 100644 --- a/.github/workflows/build-all.yaml +++ b/.github/workflows/build-all.yaml @@ -57,8 +57,6 @@ jobs: echo "/usr/local/lib" | tee -a /etc/ld.so.conf ldconfig - name: Build Oolite - env: - GitVersion_BranchName: ${{ github.head_ref || github.ref_name }} run: | ./mk.sh build ${{matrix.flavour}} --github-repository="$GITHUB_REPOSITORY" - name: Package Oolite @@ -94,8 +92,6 @@ jobs: with: fetch-depth: 0 - name: Build flatpak - env: - GitVersion_BranchName: ${{ github.head_ref || github.ref_name }} run: | echo "Installing gitversion..." source ShellScripts/Linux/install_gitversion_fn.sh @@ -152,7 +148,6 @@ jobs: env: msystem: UCRT64 PYTHONUTF8: "1" - GitVersion_BranchName: ${{ github.head_ref || github.ref_name }} run: | ./mk.sh build ${{matrix.flavour}} --github-repository="$GITHUB_REPOSITORY" - name: Package Oolite @@ -231,6 +226,7 @@ jobs: name: "Oolite ${{ steps.version.outputs.VER_FULL }}" tag_name: "${{ steps.version.outputs.VER_FULL }}" prerelease: true + target_commitish: ${{ github.event.pull_request.head.sha || github.sha }} files: | artifacts/oolite-windows-nsis-deployment/OoliteInstall-*.exe artifacts/oolite-windows-nsis-test/OoliteInstall-*.exe From 771e03d561504f6586a17d5a810db9924a37a14e Mon Sep 17 00:00:00 2001 From: mcarans Date: Mon, 20 Jul 2026 12:06:04 +1200 Subject: [PATCH 05/15] No need to call doGuiScreenResizeUpdates on Linux? --- src/SDL/MyOpenGLView.m | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 2d68cd658..e23a7fdc2 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -2639,13 +2639,6 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call [self initialiseGLWithSize: newSize]; [self saveWindowSize: newSize]; - - // certain gui screens will require an immediate redraw after - // a resize event - Nikos 20140129 - if ([PlayerEntity sharedPlayer]) - { - [[PlayerEntity sharedPlayer] doGuiScreenResizeUpdates]; - } } #endif } From 70021a2c0035909d04c8eadeb1914dd8865a4993 Mon Sep 17 00:00:00 2001 From: mcarans Date: Mon, 20 Jul 2026 13:19:45 +1200 Subject: [PATCH 06/15] try capturing event SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED for resize --- src/SDL/MyOpenGLView.m | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index e23a7fdc2..755e5f675 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -2471,10 +2471,10 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call } break; - case SDL_EVENT_WINDOW_RESIZED: + case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: { - SDL_WindowEvent *rsevt=(SDL_WindowEvent *)&event; #if OOLITE_WINDOWS + SDL_WindowEvent *rsevt=(SDL_WindowEvent *)&event; NSSize newSize=NSMakeSize(rsevt->data1, rsevt->data2); if (!fullScreen && updateContext) { @@ -2498,12 +2498,7 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call } } #else - int pixelWidth = 0; - int pixelHeight = 0; - if (SDL_GetWindowSizeInPixels(window, &pixelWidth, &pixelHeight) == 0) - { - newSize = NSMakeSize(pixelWidth, pixelHeight); - } + newSize = NSMakeSize(event.window.data1, event.window.data2); resize_pending = true; #endif break; From e620b04e6a56927a3c7e6e1d0dd7b96c110856f1 Mon Sep 17 00:00:00 2001 From: mcarans Date: Mon, 20 Jul 2026 16:11:20 +1200 Subject: [PATCH 07/15] Even more minimal --- src/SDL/MyOpenGLView.m | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 755e5f675..3e207472e 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -2632,7 +2632,35 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call { resize_pending = false; - [self initialiseGLWithSize: newSize]; + // 1. Tell SDL to update the window dimensions + SDL_SetWindowSize(window, newSize.width, newSize.height); + + // 2. Fetch actual pixel bounds back from SDL + int pixelWidth, pixelHeight; + SDL_GetWindowSizeInPixels(window, &pixelWidth, &pixelHeight); + bounds.size = NSMakeSize(pixelWidth, pixelHeight); + viewSize = bounds.size; + + // 3. Recalculate aspect-ratio-dependent projection offsets + if (bounds.size.width / bounds.size.height > 4.0 / 3.0) { + display_z = 480.0 * bounds.size.width / bounds.size.height; + x_offset = 240.0 * bounds.size.width / bounds.size.height; + y_offset = 240.0; + } else { + display_z = 640.0; + x_offset = 320.0; + y_offset = 320.0 * bounds.size.height / bounds.size.width; + } + + // 4. Update OpenGL Viewport and Projection Matrix + float ratio = 0.5; + float aspect = bounds.size.height / bounds.size.width; + + OOGL(glViewport(0, 0, bounds.size.width, bounds.size.height)); + OOGLResetProjection(); + OOGLFrustum(-ratio, ratio, -aspect * ratio, aspect * ratio, 1.0, MAX_CLEAR_DEPTH); + + // 5. Save the updated window size [self saveWindowSize: newSize]; } #endif From 7f53b960f0ccfff6044a57c9f9660665e84e3690 Mon Sep 17 00:00:00 2001 From: mcarans Date: Mon, 27 Jul 2026 19:43:04 +1200 Subject: [PATCH 08/15] Don't call SDL_SetWindowSize --- src/SDL/MyOpenGLView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 3e207472e..a6f187d27 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -2633,7 +2633,7 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call resize_pending = false; // 1. Tell SDL to update the window dimensions - SDL_SetWindowSize(window, newSize.width, newSize.height); +// SDL_SetWindowSize(window, newSize.width, newSize.height); // 2. Fetch actual pixel bounds back from SDL int pixelWidth, pixelHeight; From 92f38768e74ad3ae3854ddea412a6636342af73f Mon Sep 17 00:00:00 2001 From: mcarans Date: Tue, 28 Jul 2026 09:55:53 +1200 Subject: [PATCH 09/15] Remove another SDL_SetWindowSize probably called on every frame --- src/SDL/MyOpenGLView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index a6f187d27..53e73890e 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -798,7 +798,7 @@ - (void) updateScreen - (void) drawRect:(NSRect)rect { - SDL_SetWindowSize(window, (int)NSWidth(rect), (int)NSHeight(rect)); +// SDL_SetWindowSize(window, (int)NSWidth(rect), (int)NSHeight(rect)); [self updateScreenWithVideoMode:YES]; } From eaef846f2e904435b10117ff2f113570163d98ac Mon Sep 17 00:00:00 2001 From: mcarans Date: Tue, 28 Jul 2026 14:00:50 +1200 Subject: [PATCH 10/15] Clean up --- src/Core/GameController.m | 6 +++--- src/SDL/MyOpenGLView.m | 25 ++----------------------- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/src/Core/GameController.m b/src/Core/GameController.m index 2b297ad2f..195f0d2c5 100644 --- a/src/Core/GameController.m +++ b/src/Core/GameController.m @@ -344,7 +344,7 @@ - (void) beginSplashScreen [gameView initSplashScreen]; } #else - [gameView updateScreen]; + [gameView updateScreenWithVideoMode:YES]; #endif } @@ -404,7 +404,7 @@ - (void) doPerformGameTick @try { - [gameView display]; + [gameView updateScreenWithVideoMode:YES]; } @catch (id exception) {} } @@ -902,7 +902,7 @@ - (void) exitAppCommandQ - (void)windowDidResize:(NSNotification *)aNotification { - [gameView updateScreen]; + [gameView updateScreenWithVideoMode:YES]; } diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 53e73890e..0f1864e79 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -448,7 +448,7 @@ - (id) init OOLog(@"display.mode.list", @"%@", @"CREATING MODE LIST"); - + m_glContextInitialized = NO; #if OOLITE_WINDOWS ShowWindow(windowHandle,SW_SHOWMINIMIZED); updateContext = !showSplashScreen; @@ -477,8 +477,6 @@ - (id) init _mouseWheelDelta = 0.0f; - m_glContextInitialized = NO; - return self; } @@ -530,7 +528,7 @@ - (void) endSplashScreen #endif // OOLITE_WINDOWS - [self updateScreen]; + [self updateScreenWithVideoMode:YES]; [self autoShowMouse]; } @@ -786,22 +784,6 @@ - (NSSize) modeAsSize:(int)sizeIndex #endif -- (void) display -{ - [self updateScreen]; -} - -- (void) updateScreen -{ - [self drawRect: NSMakeRect(0, 0, viewSize.width, viewSize.height)]; -} - -- (void) drawRect:(NSRect)rect -{ -// SDL_SetWindowSize(window, (int)NSWidth(rect), (int)NSHeight(rect)); - [self updateScreenWithVideoMode:YES]; -} - - (void) updateScreenWithVideoMode:(BOOL) v_mode { SDL_Surface* surface = SDL_GetWindowSurface(window); @@ -809,9 +791,6 @@ - (void) updateScreenWithVideoMode:(BOOL) v_mode SDL_GetWindowSize(window, &windowWidth, &windowHeight); if ((viewSize.width != windowWidth)||(viewSize.height != windowHeight)) // resized { -#if OOLITE_LINUX - m_glContextInitialized = NO; //probably not needed -#endif viewSize.width = windowWidth; viewSize.height = windowHeight; } From 1a079eee980302de186e6b019bb759da1fb1a267 Mon Sep 17 00:00:00 2001 From: mcarans Date: Tue, 28 Jul 2026 14:53:43 +1200 Subject: [PATCH 11/15] Clean up --- src/SDL/MyOpenGLView.m | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 1f1c4650b..0daf16452 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -456,6 +456,7 @@ - (id) init if (!showSplashScreen) { // blank the surface / go to fullscreen + [self createWindowWithSize: firstScreen]; [self initialiseGLWithSize: firstScreen]; } @@ -1435,10 +1436,6 @@ - (void) initialiseGLWithSize:(NSSize) v_size - (void) initialiseGLWithSize:(NSSize) v_size useVideoMode:(BOOL) v_mode { - if (!window) - { - [self createWindowWithSize: v_size]; - } viewSize = v_size; OOLog(@"display.initGL", @"Requested a new surface of %d x %d, %@.", (int)viewSize.width, (int)viewSize.height,(fullScreen ? @"fullscreen" : @"windowed")); int pixelWidth, pixelHeight; From 660f3cddce3fa930beb27660c53172ae5d3983f1 Mon Sep 17 00:00:00 2001 From: mcarans Date: Wed, 29 Jul 2026 09:54:04 +1200 Subject: [PATCH 12/15] Use SDL_GetWindowSizeInPixels --- src/SDL/MyOpenGLView.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 0daf16452..15c34bec0 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -787,7 +787,7 @@ - (void) updateScreenWithVideoMode:(BOOL) v_mode { SDL_Surface* surface = SDL_GetWindowSurface(window); int windowWidth, windowHeight; - SDL_GetWindowSize(window, &windowWidth, &windowHeight); + SDL_GetWindowSizeInPixels(window, &windowWidth, &windowHeight); if ((viewSize.width != windowWidth)||(viewSize.height != windowHeight)) // resized { viewSize.width = windowWidth; From 3512c8689affcdf766d83d40e6051c61523136b3 Mon Sep 17 00:00:00 2001 From: mcarans Date: Wed, 29 Jul 2026 10:01:31 +1200 Subject: [PATCH 13/15] Add back Linux hack to always reinitialise GL on every frame --- src/SDL/MyOpenGLView.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 15c34bec0..335f86fde 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -790,6 +790,9 @@ - (void) updateScreenWithVideoMode:(BOOL) v_mode SDL_GetWindowSizeInPixels(window, &windowWidth, &windowHeight); if ((viewSize.width != windowWidth)||(viewSize.height != windowHeight)) // resized { +#if OOLITE_LINUX + m_glContextInitialized = NO; //probably not needed +#endif viewSize.width = windowWidth; viewSize.height = windowHeight; } From 4cced690cdb714248d8ee8e256e328d63e55d6eb Mon Sep 17 00:00:00 2001 From: Mike Date: Sat, 1 Aug 2026 16:21:16 +1200 Subject: [PATCH 14/15] Revert "Add back Linux hack to always reinitialise GL on every frame" This reverts commit 3512c8689affcdf766d83d40e6051c61523136b3. --- src/SDL/MyOpenGLView.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 335f86fde..15c34bec0 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -790,9 +790,6 @@ - (void) updateScreenWithVideoMode:(BOOL) v_mode SDL_GetWindowSizeInPixels(window, &windowWidth, &windowHeight); if ((viewSize.width != windowWidth)||(viewSize.height != windowHeight)) // resized { -#if OOLITE_LINUX - m_glContextInitialized = NO; //probably not needed -#endif viewSize.width = windowWidth; viewSize.height = windowHeight; } From 2c6b5ee55effb4eb4ba6629672edf5940726b19b Mon Sep 17 00:00:00 2001 From: mcarans Date: Mon, 3 Aug 2026 08:48:48 +1200 Subject: [PATCH 15/15] Move if ([PlayerEntity sharedPlayer]) block to right place --- src/SDL/MyOpenGLView.m | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/SDL/MyOpenGLView.m b/src/SDL/MyOpenGLView.m index 15c34bec0..b20cf433f 100644 --- a/src/SDL/MyOpenGLView.m +++ b/src/SDL/MyOpenGLView.m @@ -2463,14 +2463,14 @@ reset the virtual joystick (mouse) coordinates, we need to send a WarpMouse call [self initialiseGLWithSize: newSize]; [self saveWindowSize: newSize]; - // certain gui screens will require an immediate redraw after - // a resize event - Nikos 20140129 - if ([PlayerEntity sharedPlayer]) - { - [[PlayerEntity sharedPlayer] doGuiScreenResizeUpdates]; - } } } + // certain gui screens will require an immediate redraw after + // a resize event - Nikos 20140129 + if ([PlayerEntity sharedPlayer]) + { + [[PlayerEntity sharedPlayer] doGuiScreenResizeUpdates]; + } #else newSize = NSMakeSize(event.window.data1, event.window.data2); resize_pending = true;