From 10d71c3b6926b8e717a59e053cde099eb2e53ff0 Mon Sep 17 00:00:00 2001 From: James Packer Date: Tue, 3 Mar 2026 08:23:02 +0000 Subject: [PATCH 1/3] Set radar screen brilliance when rendering and drawing overlay. --- src/GUIMain.cpp | 27 ++++++++++++------- src/GUIMain.hpp | 1 + src/NumberToImage.cpp | 4 +-- src/NumberToImage.hpp | 2 +- src/RadarCalculation.cpp | 57 ++++++++++++++++++++++++++-------------- src/RadarCalculation.hpp | 11 +++++--- src/SimulationModel.cpp | 10 +++++++ src/SimulationModel.hpp | 2 ++ 8 files changed, 80 insertions(+), 34 deletions(-) diff --git a/src/GUIMain.cpp b/src/GUIMain.cpp index b3b7e3a3f..1bf895c8c 100644 --- a/src/GUIMain.cpp +++ b/src/GUIMain.cpp @@ -1686,6 +1686,8 @@ guiTideHeight = guiData->tideHeight; irr::s32 centreY; irr::s32 radius; + irr::f32 brilliance = model->getBrilliance(); + if (radarLarge) { centreX = largeRadarScreenCentreX; centreY = largeRadarScreenCentreY; @@ -1700,7 +1702,7 @@ guiTideHeight = guiData->tideHeight; //If full screen radar, draw a 4:3 box around the radar display area if (radarLarge) { - device->getVideoDriver()->draw2DRectangleOutline(radarLargeRect,irr::video::SColor(255,0,0,0)); + device->getVideoDriver()->draw2DRectangleOutline(radarLargeRect,brill(irr::video::SColor(255,0,0,0), brilliance)); } irr::f32 radarHeadingIndicator; @@ -1713,7 +1715,7 @@ guiTideHeight = guiData->tideHeight; irr::s32 deltaY = -1*radius*cos(irr::core::DEGTORAD*radarHeadingIndicator); irr::core::position2d radarCentre (centreX,centreY); irr::core::position2d radarHeading (centreX+deltaX,centreY+deltaY); - device->getVideoDriver()->draw2DLine(radarCentre,radarHeading,irr::video::SColor(255, 255, 255, 255)); //Todo: Make these colours configurable + device->getVideoDriver()->draw2DLine(radarCentre,radarHeading,brill(irr::video::SColor(255, 255, 255, 255), brilliance)); //Todo: Make these colours configurable //draw a look direction line if (radarHeadUp) { @@ -1725,19 +1727,19 @@ guiTideHeight = guiData->tideHeight; irr::s32 deltaYView = -1*radius*cos(irr::core::DEGTORAD*radarHeadingIndicator); irr::core::position2d lookInner (centreX + 0.9*deltaXView,centreY + 0.9*deltaYView); irr::core::position2d lookOuter (centreX + deltaXView,centreY + deltaYView); - device->getVideoDriver()->draw2DLine(lookInner,lookOuter,irr::video::SColor(255, 255, 0, 0)); //Todo: Make these colours configurable + device->getVideoDriver()->draw2DLine(lookInner,lookOuter,brill(irr::video::SColor(255, 255, 0, 0), brilliance)); //Todo: Make these colours configurable //draw an EBL line irr::s32 deltaXEBL = radius*sin(irr::core::DEGTORAD*guiRadarEBLBrg); irr::s32 deltaYEBL = -1*radius*cos(irr::core::DEGTORAD*guiRadarEBLBrg); irr::core::position2d eblOuter (centreX + deltaXEBL,centreY + deltaYEBL); - device->getVideoDriver()->draw2DLine(radarCentre,eblOuter,irr::video::SColor(255, 255, 0, 0)); + device->getVideoDriver()->draw2DLine(radarCentre,eblOuter,brill(irr::video::SColor(255, 255, 0, 0), brilliance)); //draw EBL range if (guiRadarEBLRangeNm > 0 && guiRadarRangeNm >= guiRadarEBLRangeNm) { irr::f32 eblRangePx = radius*guiRadarEBLRangeNm/guiRadarRangeNm; irr::u8 noSegments = eblRangePx/2; if (noSegments < 10) {noSegments=10;} - device->getVideoDriver()->draw2DPolygon(radarCentre,eblRangePx,irr::video::SColor(255, 255, 0, 0),noSegments); //An n segment polygon, to approximate a circle + device->getVideoDriver()->draw2DPolygon(radarCentre,eblRangePx,brill(irr::video::SColor(255, 255, 0, 0), brilliance),noSegments); //An n segment polygon, to approximate a circle } //draw radar cursor @@ -1747,7 +1749,7 @@ guiTideHeight = guiData->tideHeight; //Plot if within the display and not at zero range if (cursorPixelRadius <= radius && guiRadarCursorRangeNm > 0) { irr::core::position2d cursorCentre (centreX + deltaXCursor,centreY + deltaYCursor); - device->getVideoDriver()->draw2DPolygon(cursorCentre,radius/20,irr::video::SColor(255, 255, 0, 0),4); //a 4 segment polygon, i.e. a square! + device->getVideoDriver()->draw2DPolygon(cursorCentre,radius/20,brill(irr::video::SColor(255, 255, 0, 0), brilliance),4); //a 4 segment polygon, i.e. a square! } //Draw compass rose around radar (?Rotate with radar in head up and course up?) @@ -1772,7 +1774,7 @@ guiTideHeight = guiData->tideHeight; irr::core::position2d ticInner (centreX + scaling*deltaXTic,centreY + scaling*deltaYTic); irr::core::position2d ticOuter (centreX + deltaXTic,centreY + deltaYTic); - device->getVideoDriver()->draw2DLine(ticInner,ticOuter,irr::video::SColor(255, 128, 128, 128)); + device->getVideoDriver()->draw2DLine(ticInner,ticOuter,brill(irr::video::SColor(255, 128, 128, 128), brilliance)); //Show the angle if needed if (showValue) { @@ -1785,7 +1787,7 @@ guiTideHeight = guiData->tideHeight; irr::s32 textEndX = textStartX+textWidth; irr::s32 textStartY = centreY + 0.8*deltaYTic-0.5*textHeight; irr::s32 textEndY = textStartY+textHeight; - guienv->getSkin()->getFont()->draw(angleText,irr::core::rect(textStartX,textStartY,textEndX,textEndY),irr::video::SColor(255,128,128,128)); + guienv->getSkin()->getFont()->draw(angleText,irr::core::rect(textStartX,textStartY,textEndX,textEndY),brill(irr::video::SColor(255,128,128,128), brilliance)); } } @@ -1802,7 +1804,7 @@ guiTideHeight = guiData->tideHeight; for (unsigned int i = 1; igetVideoDriver()->draw2DPolygon(radarCentre,ringRadius,irr::video::SColor(128, 128, 128, 128),noSegments); + device->getVideoDriver()->draw2DPolygon(radarCentre,ringRadius,brill(irr::video::SColor(128, 128, 128, 128), brilliance),noSegments); } } @@ -1867,3 +1869,10 @@ guiTideHeight = guiData->tideHeight; { linesText->setText(irr::core::stringw(textToShow.c_str()).c_str()); } + + irr::video::SColor GUIMain::brill(irr::video::SColor originalColour, irr::f32 brilliance) const + { + irr::video::SColor black = irr::video::SColor(255, 0, 0, 0); + return originalColour.getInterpolated(black, brilliance); + + } \ No newline at end of file diff --git a/src/GUIMain.hpp b/src/GUIMain.hpp index e319b2aaa..520762dd1 100644 --- a/src/GUIMain.hpp +++ b/src/GUIMain.hpp @@ -432,6 +432,7 @@ class GUIMain //Create, build and update GUI std::wstring f32To3dp(irr::f32 value); bool manuallyTriggerClick(irr::gui::IGUIButton* button); bool manuallyTriggerScroll(irr::gui::IGUIScrollBar* bar); + irr::video::SColor brill(irr::video::SColor originalColour, irr::f32 brilliance) const; }; diff --git a/src/NumberToImage.cpp b/src/NumberToImage.cpp index ff9392a44..61b42f450 100644 --- a/src/NumberToImage.cpp +++ b/src/NumberToImage.cpp @@ -25,7 +25,7 @@ namespace NumberToImage const irr::u32 PADDING_PX = 1; const irr::video::SColor BG_COLOUR = irr::video::SColor(0,0,0,0); - irr::video::IImage* getImage(irr::u32 number, irr::IrrlichtDevice* dev) + irr::video::IImage* getImage(irr::u32 number, irr::f32 brilliance, irr::IrrlichtDevice* dev) { irr::core::stringc numberString = irr::core::stringc(number); @@ -73,7 +73,7 @@ namespace NumberToImage for (irr::u32 character = 0; character sourceRect = irr::core::rect(0,0,numberImages[character]->getDimension().Width,numberImages[character]->getDimension().Height); - numberImages[character]->copyToWithAlpha(numberImage,irr::core::vector2d(nextXStart,0),sourceRect,irr::video::SColor(255,255,255,255)); + numberImages[character]->copyToWithAlpha(numberImage,irr::core::vector2d(nextXStart,0),sourceRect,irr::video::SColor(255,255 * brilliance,255 * brilliance,255 * brilliance)); nextXStart += numberImages[character]->getDimension().Width + PADDING_PX; numberImages[character]->drop(); } diff --git a/src/NumberToImage.hpp b/src/NumberToImage.hpp index 3cab279f1..1e35709f7 100644 --- a/src/NumberToImage.hpp +++ b/src/NumberToImage.hpp @@ -22,7 +22,7 @@ namespace NumberToImage { - irr::video::IImage* getImage(irr::u32 number, irr::IrrlichtDevice* dev); + irr::video::IImage* getImage(irr::u32 number, irr::f32 brilliance, irr::IrrlichtDevice* dev); } diff --git a/src/RadarCalculation.cpp b/src/RadarCalculation.cpp index 26a8f8e31..0749a6320 100644 --- a/src/RadarCalculation.cpp +++ b/src/RadarCalculation.cpp @@ -62,6 +62,8 @@ RadarCalculation::RadarCalculation() : rangeResolution(128), angularResolution(3 radarOn = true; + brilliance = 1.0; + //Radar modes: North up (false, false). Course up (true, true). Head up (true, false) headUp = false; stabilised = false; @@ -1537,10 +1539,7 @@ void RadarCalculation::render(irr::video::IImage * radarImage, irr::video::IImag cellMaxRange[currentStep], cellMinAngle, cellMaxAngle, - thisColour.getAlpha(), - thisColour.getRed(), - thisColour.getGreen(), - thisColour.getBlue(), + brill(thisColour, brilliance), ownShipHeading); scanArrayToPlotPrevious[scanLine][currentStep] = scanArrayToPlot[scanLine][currentStep]; //Record what we have plotted @@ -1587,7 +1586,7 @@ void RadarCalculation::render(irr::video::IImage * radarImage, irr::video::IImag irr::f32 x_2=x_a + halfChord * sinPIbrg; irr::f32 z_2=z_a + halfChord * cosPIbrg; - drawLine(radarImageOverlaid,x_1,z_1,x_2,z_2,255,255,255,255); + drawLine(radarImageOverlaid,x_1,z_1,x_2,z_2,brill(irr::video::SColor(255,255,255,255), brilliance)); //Show line number //Find point towards centre from the line @@ -1602,7 +1601,7 @@ void RadarCalculation::render(irr::video::IImage * radarImage, irr::video::IImag irr::s32 xTextPos = x_a + 15*xDirection; irr::s32 yTextPos = z_a + 15*yDirection; - irr::video::IImage* idNumberImage = NumberToImage::getImage(i+1,device); + irr::video::IImage* idNumberImage = NumberToImage::getImage(i+1, brilliance, device); if (idNumberImage) { irr::core::rect sourceRect = irr::core::rect(0,0,idNumberImage->getDimension().Width,idNumberImage->getDimension().Height); idNumberImage->copyToWithAlpha(radarImageOverlaid,irr::core::position2d(xTextPos,yTextPos),sourceRect,irr::video::SColor(255,255,255,255)); @@ -1632,10 +1631,10 @@ void RadarCalculation::render(irr::video::IImage * radarImage, irr::video::IImag irr::s32 deltaY = centrePixel - contactRangePx * cos((thisEstimate.bearing+radarOffsetAngle)*RAD_IN_DEG); //Show contact on screen - drawCircle(radarImageOverlaid,deltaX,deltaY,radarRadiusPx/40,255,255,255,255); //Draw circle around contact + drawCircle(radarImageOverlaid,deltaX,deltaY,radarRadiusPx/40,brill(irr::video::SColor(255,255,255,255), brilliance)); //Draw circle around contact //Draw contact's display ID : - irr::video::IImage* idNumberImage = NumberToImage::getImage(thisEstimate.displayID,device); + irr::video::IImage* idNumberImage = NumberToImage::getImage(thisEstimate.displayID, brilliance, device); if (idNumberImage) { irr::core::rect sourceRect = irr::core::rect(0,0,idNumberImage->getDimension().Width,idNumberImage->getDimension().Height); @@ -1672,7 +1671,7 @@ void RadarCalculation::render(irr::video::IImage * radarImage, irr::video::IImag //std::cout << headingVectorX << " " << headingVectorY << std::endl; - drawLine(radarImageOverlaid,deltaX,deltaY,deltaX + headingVectorX,deltaY+headingVectorY,255,255,255,255); + drawLine(radarImageOverlaid,deltaX,deltaY,deltaX + headingVectorX,deltaY+headingVectorY,brill(irr::video::SColor(255,255,255,255), brilliance)); } } @@ -1680,7 +1679,7 @@ void RadarCalculation::render(irr::video::IImage * radarImage, irr::video::IImag } -void RadarCalculation::drawSector(irr::video::IImage * radarImage,irr::f32 centreX, irr::f32 centreY, irr::f32 innerRadius, irr::f32 outerRadius, irr::f32 startAngle, irr::f32 endAngle, irr::u32 alpha, irr::u32 red, irr::u32 green, irr::u32 blue, irr::f32 ownShipHeading) +void RadarCalculation::drawSector(irr::video::IImage * radarImage,irr::f32 centreX, irr::f32 centreY, irr::f32 innerRadius, irr::f32 outerRadius, irr::f32 startAngle, irr::f32 endAngle, irr::video::SColor colour, irr::f32 ownShipHeading) //draw a bounded sector { @@ -1733,7 +1732,7 @@ void RadarCalculation::drawSector(irr::video::IImage * radarImage,irr::f32 centr //if (Angles::isAngleBetween(localAngle,startAngle,endAngle)) { if (Angles::isAngleBetween(irr::core::vector2df(localX,-1*localY),irr::core::vector2df(sinStartAngle,cosStartAngle),irr::core::vector2df(sinEndAngle,cosEndAngle))) { //Plot i,j - if (i >= 0 && j >= 0) {radarImage->setPixel(i,j,irr::video::SColor(alpha,red,green,blue));} + if (i >= 0 && j >= 0) {radarImage->setPixel(i,j,colour);} } } } @@ -1741,7 +1740,7 @@ void RadarCalculation::drawSector(irr::video::IImage * radarImage,irr::f32 centr } -void RadarCalculation::drawLine(irr::video::IImage * radarImage, irr::f32 startX, irr::f32 startY, irr::f32 endX, irr::f32 endY, irr::u32 alpha, irr::u32 red, irr::u32 green, irr::u32 blue)//Try with irr::f32 as inputs so we can do interpolation based on the theoretical start and end +void RadarCalculation::drawLine(irr::video::IImage * radarImage, irr::f32 startX, irr::f32 startY, irr::f32 endX, irr::f32 endY, irr::video::SColor colour)//Try with irr::f32 as inputs so we can do interpolation based on the theoretical start and end { irr::f32 deltaX = endX - startX; @@ -1760,7 +1759,7 @@ void RadarCalculation::drawLine(irr::video::IImage * radarImage, irr::f32 startX irr::s32 centreToY = thisY - radarRadiusPx; if (pow(centreToX,2) + pow(centreToY,2) <= radiusSquared) { if (thisX >= 0 && thisY >= 0) { - radarImage->setPixel(thisX,thisY,irr::video::SColor(alpha,red,green,blue)); + radarImage->setPixel(thisX,thisY,colour); } } } @@ -1771,12 +1770,12 @@ void RadarCalculation::drawLine(irr::video::IImage * radarImage, irr::f32 startX irr::s32 centreToX = thisX - radarRadiusPx; irr::s32 centreToY = thisY - radarRadiusPx; if (pow(centreToX,2) + pow(centreToY,2) <= radiusSquared) { - if (thisX >= 0 && thisY >= 0) {radarImage->setPixel(thisX,thisY,irr::video::SColor(alpha,red,green,blue));} + if (thisX >= 0 && thisY >= 0) {radarImage->setPixel(thisX,thisY, colour);} } } } -void RadarCalculation::drawCircle(irr::video::IImage * radarImage, irr::f32 centreX, irr::f32 centreY, irr::f32 radius, irr::u32 alpha, irr::u32 red, irr::u32 green, irr::u32 blue)//Try with irr::f32 as inputs so we can do interpolation based on the theoretical start and end +void RadarCalculation::drawCircle(irr::video::IImage * radarImage, irr::f32 centreX, irr::f32 centreY, irr::f32 radius, irr::video::SColor colour)//Try with irr::f32 as inputs so we can do interpolation based on the theoretical start and end { irr::f32 circumference = 2.0 * PI * radius; @@ -1791,7 +1790,7 @@ void RadarCalculation::drawCircle(irr::video::IImage * radarImage, irr::f32 cent irr::s32 centreToY = thisY - radarRadiusPx; if (pow(centreToX,2) + pow(centreToY,2) <= radiusSquared) { if (thisX >= 0 && thisY >= 0) { - radarImage->setPixel(thisX,thisY,irr::video::SColor(alpha,red,green,blue)); + radarImage->setPixel(thisX,thisY, colour); } } } @@ -1803,7 +1802,7 @@ void RadarCalculation::drawCircle(irr::video::IImage * radarImage, irr::f32 cent irr::s32 centreToY = thisY - radarRadiusPx; if (pow(centreToX,2) + pow(centreToY,2) <= radiusSquared) { if (thisX >= 0 && thisY >= 0) { - radarImage->setPixel(thisX,thisY,irr::video::SColor(alpha,red,green,blue)); + radarImage->setPixel(thisX,thisY, colour); } } } @@ -1939,10 +1938,30 @@ irr::video::SColor RadarCalculation::getRadarBackgroundColour() const irr::video::SColor RadarCalculation::getRadarSurroundColour() const { + irr::video::SColor resultColour; if (currentRadarColourChoice < radarSurroundColours.size()) { - return radarSurroundColours.at(currentRadarColourChoice); + resultColour = radarSurroundColours.at(currentRadarColourChoice); } else { - return irr::video::SColor(255, 128, 128, 128); + resultColour = irr::video::SColor(255, 128, 128, 128); } + + return brill(resultColour, brilliance); +} + +irr::video::SColor RadarCalculation::brill(irr::video::SColor originalColour, irr::f32 brilliance) const +{ + irr::video::SColor black = irr::video::SColor(255, 0, 0, 0); + return originalColour.getInterpolated(black, brilliance); + +} + +irr::f32 RadarCalculation::getBrilliance() const +{ + return brilliance; +} + +void RadarCalculation::setBrilliance(irr::f32 brilliance) +{ + this->brilliance = brilliance; } \ No newline at end of file diff --git a/src/RadarCalculation.hpp b/src/RadarCalculation.hpp index 8495278c4..c669dacde 100644 --- a/src/RadarCalculation.hpp +++ b/src/RadarCalculation.hpp @@ -169,6 +169,8 @@ class RadarCalculation irr::video::SColor getRadarForegroundColour() const; irr::video::SColor getRadarBackgroundColour() const; irr::video::SColor getRadarSurroundColour() const; + irr::f32 getBrilliance() const; + void setBrilliance(irr::f32 brilliance); void update(irr::video::IImage * radarImage, irr::video::IImage * radarImageOverlaid, irr::core::vector3d offsetPosition, const Terrain& terrain, const OwnShip& ownShip, const Buoys& buoys, const OtherShips& otherShips, irr::f32 weather, irr::f32 rain, irr::f32 tideHeight, irr::f32 deltaTime, uint64_t absoluteTime, irr::core::vector2di mouseRelPosition, bool isMouseDown); private: @@ -224,6 +226,8 @@ class RadarCalculation std::vector radarSurroundColours; irr::u32 currentRadarColourChoice; + irr::f32 brilliance; + std::vector radarRangeNm; void scan(irr::core::vector3d offsetPosition, const Terrain& terrain, const OwnShip& ownShip, const Buoys& buoys, const OtherShips& otherShips, irr::f32 weather, irr::f32 rain, irr::f32 tideHeight, irr::f32 deltaTime, uint64_t absoluteTime); void updateARPA(irr::core::vector3d offsetPosition, const OwnShip& ownShip, uint64_t absoluteTime); @@ -231,10 +235,11 @@ class RadarCalculation irr::f32 radarNoise(irr::f32 radarNoiseLevel, irr::f32 radarSeaClutter, irr::f32 radarRainClutter, irr::f32 weather, irr::f32 radarRange,irr::f32 radarBrgDeg, irr::f32 windDirectionDeg, irr::f32 radarInclinationAngle, irr::f32 rainIntensity); void render(irr::video::IImage * radarImage, irr::video::IImage * radarImageOverlaid, irr::f32 ownShipHeading, irr::f32 ownShipSpeed); irr::f32 rangeAtAngle(irr::f32 checkAngle,irr::f32 centreX, irr::f32 centreZ, irr::f32 heading); - void drawSector(irr::video::IImage * radarImage,irr::f32 centreX, irr::f32 centreY, irr::f32 innerRadius, irr::f32 outerRadius, irr::f32 startAngle, irr::f32 endAngle, irr::u32 alpha, irr::u32 red, irr::u32 green, irr::u32 blue, irr::f32 ownShipHeading); - void drawLine(irr::video::IImage * radarImage, irr::f32 startX, irr::f32 startY, irr::f32 endX, irr::f32 endY, irr::u32 alpha, irr::u32 red, irr::u32 green, irr::u32 blue);//Try with f32 as inputs so we can do interpolation based on the theoretical start and end - void drawCircle(irr::video::IImage * radarImage, irr::f32 centreX, irr::f32 centreY, irr::f32 radius, irr::u32 alpha, irr::u32 red, irr::u32 green, irr::u32 blue);//Try with f32 as inputs so we can do interpolation based on the theoretical start and end + void drawSector(irr::video::IImage * radarImage,irr::f32 centreX, irr::f32 centreY, irr::f32 innerRadius, irr::f32 outerRadius, irr::f32 startAngle, irr::f32 endAngle, irr::video::SColor colour, irr::f32 ownShipHeading); + void drawLine(irr::video::IImage * radarImage, irr::f32 startX, irr::f32 startY, irr::f32 endX, irr::f32 endY, irr::video::SColor colour);//Try with f32 as inputs so we can do interpolation based on the theoretical start and end + void drawCircle(irr::video::IImage * radarImage, irr::f32 centreX, irr::f32 centreY, irr::f32 radius, irr::video::SColor colour);//Try with f32 as inputs so we can do interpolation based on the theoretical start and end bool isPointInEllipse(irr::f32 pointX, irr::f32 pointZ, irr::f32 centreX, irr::f32 centreZ, irr::f32 width, irr::f32 length, irr::f32 angle); + irr::video::SColor brill(irr::video::SColor originalColour, irr::f32 brilliance) const; }; diff --git a/src/SimulationModel.cpp b/src/SimulationModel.cpp index c1e2725ef..edf4e0aa5 100644 --- a/src/SimulationModel.cpp +++ b/src/SimulationModel.cpp @@ -1384,6 +1384,16 @@ SimulationModel::~SimulationModel() return radarCalculation.getARPAContactFromTrackIndex(index); } + irr::f32 SimulationModel::getBrilliance() const + { + return radarCalculation.getBrilliance(); + } + + void SimulationModel::setBrilliance(irr::f32 brilliance) + { + radarCalculation.setBrilliance(brilliance); + } + void SimulationModel::setMainCameraActive() { camera.setActive(); diff --git a/src/SimulationModel.hpp b/src/SimulationModel.hpp index 595250874..3586fad9c 100644 --- a/src/SimulationModel.hpp +++ b/src/SimulationModel.hpp @@ -292,6 +292,8 @@ class SimulationModel //Start of the 'Model' part of MVC void clearTargetFromCursor(); irr::u32 getARPATracksSize() const; ARPAContact getARPAContactFromTrackIndex(irr::u32 index) const; + irr::f32 getBrilliance() const; + void setBrilliance(irr::f32 brilliance); void setMainCameraActive(); void setRadarCameraActive(); void updateViewport(irr::f32 aspect); From 4a9ff229658f2dda1dd737463f5b2d2775f48ad9 Mon Sep 17 00:00:00 2001 From: James Packer Date: Tue, 3 Mar 2026 08:52:55 +0000 Subject: [PATCH 2/3] Set brilliance from GUI. Interface location needs to be corrected. --- src/GUIMain.cpp | 10 ++++++++++ src/GUIMain.hpp | 5 +++++ src/MyEventReceiver.cpp | 5 +++++ src/RadarCalculation.cpp | 5 ++++- src/SimulationModel.cpp | 1 + 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/GUIMain.cpp b/src/GUIMain.cpp index 1bf895c8c..da9ce9adb 100644 --- a/src/GUIMain.cpp +++ b/src/GUIMain.cpp @@ -565,12 +565,15 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vector(0.0850*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_GAIN_SCROLL_BAR); radarClutterScrollbar = new irr::gui::ScrollDial(irr::core::vector2d(0.1425*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_CLUTTER_SCROLL_BAR); radarRainScrollbar = new irr::gui::ScrollDial(irr::core::vector2d(0.2000*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_RAIN_SCROLL_BAR); + radarBrillScrollbar = new irr::gui::ScrollDial(irr::core::vector2d(0.2575*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_BRILL_SCROLL_BAR); (guienv->addStaticText(language->translate("gain").c_str(),irr::core::rect(0.0600*su,0.070*sh,0.1100*su,0.100*sh),false,true,mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("clutter").c_str(),irr::core::rect(0.1165*su,0.070*sh,0.1675*su,0.100*sh),false,true,mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("rain").c_str(),irr::core::rect(0.1750*su,0.070*sh,0.2250*su,0.100*sh),false,true,mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); + (guienv->addStaticText(language->translate("brill").c_str(), irr::core::rect(0.2335 * su, 0.070 * sh, 0.2250 * su, 0.100 * sh), false, true, mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); radarGainScrollbar->setSmallStep(2); radarClutterScrollbar->setSmallStep(2); radarRainScrollbar->setSmallStep(2); + radarBrillScrollbar->setSmallStep(2); eblLeftButton = guienv->addButton(irr::core::rect(0.060*su,0.160*sh,0.115*su,0.190*sh),mainRadarTab,GUI_ID_RADAR_EBL_LEFT_BUTTON,language->translate("eblLeft").c_str()); eblRightButton = guienv->addButton(irr::core::rect(0.170*su,0.160*sh,0.225*su,0.190*sh),mainRadarTab,GUI_ID_RADAR_EBL_RIGHT_BUTTON,language->translate("eblRight").c_str()); @@ -585,14 +588,17 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vector(0.040*radarSu,0.040*radarSu),0.03*radarSu,guienv,largeRadarControls,GUI_ID_RADAR_GAIN_SCROLL_BAR); radarClutterScrollbar2 = new irr::gui::ScrollDial(irr::core::vector2d(0.105*radarSu,0.040*radarSu),0.03*radarSu,guienv,largeRadarControls,GUI_ID_RADAR_CLUTTER_SCROLL_BAR); radarRainScrollbar2 = new irr::gui::ScrollDial(irr::core::vector2d(0.170*radarSu,0.040*radarSu),0.03*radarSu,guienv,largeRadarControls,GUI_ID_RADAR_RAIN_SCROLL_BAR); + radarBrillScrollbar2 = new irr::gui::ScrollDial(irr::core::vector2d(0.235 * radarSu, 0.040 * radarSu), 0.03 * radarSu, guienv, largeRadarControls, GUI_ID_RADAR_BRILL_SCROLL_BAR); radarGainScrollbar2->setSmallStep(2); radarClutterScrollbar2->setSmallStep(2); radarRainScrollbar2->setSmallStep(2); + radarBrillScrollbar2->setSmallStep(2); (guienv->addStaticText(language->translate("gain").c_str(),irr::core::rect(0.010*radarSu,0.070*radarSu,0.070*radarSu,0.100*radarSu),false,true,largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("clutter").c_str(),irr::core::rect(0.075*radarSu,0.070*radarSu,0.135*radarSu,0.100*radarSu),false,true,largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("rain").c_str(),irr::core::rect(0.140*radarSu,0.070*radarSu,0.200*radarSu,0.100*radarSu),false,true,largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); + (guienv->addStaticText(language->translate("brill").c_str(), irr::core::rect(0.205 * radarSu, 0.070 * radarSu, 0.200 * radarSu, 0.100 * radarSu), false, true, largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); guienv->addButton(irr::core::rect(0.025*radarSu,0.110*radarSu,0.085*radarSu,0.160*radarSu),largeRadarControls,GUI_ID_RADAR_INCREASE_BUTTON,language->translate("increaserange").c_str()); guienv->addButton(irr::core::rect(0.025*radarSu,0.165*radarSu,0.085*radarSu,0.210*radarSu),largeRadarControls,GUI_ID_RADAR_DECREASE_BUTTON,language->translate("decreaserange").c_str()); @@ -770,10 +776,12 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vectordrop(); radarClutterScrollbar->drop(); radarRainScrollbar->drop(); + radarBrillScrollbar->drop(); radarGainScrollbar2->drop(); radarClutterScrollbar2->drop(); radarRainScrollbar2->drop(); + radarBrillScrollbar2->drop(); //largeRadarControls->drop(); @@ -1185,10 +1193,12 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vectorsetPos(Utilities::round(guiData->radarGain)); radarClutterScrollbar->setPos(Utilities::round(guiData->radarClutter)); radarRainScrollbar->setPos(Utilities::round(guiData->radarRain)); + radarBrillScrollbar->setPos(Utilities::round(guiData->radarBrill * 100)); radarGainScrollbar2->setPos(Utilities::round(guiData->radarGain)); radarClutterScrollbar2->setPos(Utilities::round(guiData->radarClutter)); radarRainScrollbar2->setPos(Utilities::round(guiData->radarRain)); + radarBrillScrollbar2->setPos(Utilities::round(guiData->radarBrill * 100)); weatherScrollbar->setPos(Utilities::round(guiData->weather*10.0)); //(Weather scroll bar is 0-120, weather is 0-12) rainScrollbar->setPos(Utilities::round(guiData->rain*10.0)); //(Rain scroll bar is 0-100, rain is 0-10) diff --git a/src/GUIMain.hpp b/src/GUIMain.hpp index 520762dd1..a96ebe4c2 100644 --- a/src/GUIMain.hpp +++ b/src/GUIMain.hpp @@ -64,6 +64,7 @@ struct GUIData { irr::f32 radarGain; irr::f32 radarClutter; irr::f32 radarRain; + irr::f32 radarBrill; irr::f32 guiRadarEBLBrg; irr::f32 guiRadarEBLRangeNm; irr::f32 guiRadarCursorBrg; @@ -136,6 +137,7 @@ class GUIMain //Create, build and update GUI GUI_ID_RADAR_GAIN_SCROLL_BAR, GUI_ID_RADAR_CLUTTER_SCROLL_BAR, GUI_ID_RADAR_RAIN_SCROLL_BAR, + GUI_ID_RADAR_BRILL_SCROLL_BAR, GUI_ID_RADAR_EBL_LEFT_BUTTON, GUI_ID_RADAR_EBL_RIGHT_BUTTON, GUI_ID_RADAR_EBL_UP_BUTTON, @@ -297,12 +299,15 @@ class GUIMain //Create, build and update GUI irr::gui::IGUIScrollBar* radarGainScrollbar; irr::gui::IGUIScrollBar* radarClutterScrollbar; irr::gui::IGUIScrollBar* radarRainScrollbar; + irr::gui::IGUIScrollBar* radarBrillScrollbar; irr::gui::IGUIRectangle* largeRadarControls; //Parent rectangle for large radar controls irr::gui::IGUIRectangle* largeRadarPIControls; //Parent for PI controls on large radar irr::gui::IGUIScrollBar* radarGainScrollbar2; //For large radar irr::gui::IGUIScrollBar* radarClutterScrollbar2; //For large radar irr::gui::IGUIScrollBar* radarRainScrollbar2; //For large radar + irr::gui::IGUIScrollBar* radarBrillScrollbar2; //For large radar + irr::gui::IGUIButton* eblLeftButton2; irr::gui::IGUIButton* eblRightButton2; irr::gui::IGUIButton* eblUpButton2; diff --git a/src/MyEventReceiver.cpp b/src/MyEventReceiver.cpp index 3963fe2b1..1362c22fa 100644 --- a/src/MyEventReceiver.cpp +++ b/src/MyEventReceiver.cpp @@ -415,6 +415,11 @@ bool MyEventReceiver::OnEvent(const irr::SEvent &event) { model->setRadarRain(((irr::gui::IGUIScrollBar *)event.GUIEvent.Caller)->getPos()); } + if (id == GUIMain::GUI_ID_RADAR_BRILL_SCROLL_BAR) + { + irr::f32 value = ((irr::gui::IGUIScrollBar*)event.GUIEvent.Caller)->getPos() / 100.0; // Convert to from 0-100 to 0-1 + model->setBrilliance(value); + } if (id == GUIMain::GUI_ID_WEATHER_SCROLL_BAR) { model->setWeather(((irr::gui::IGUIScrollBar *)event.GUIEvent.Caller)->getPos() / 10.0); // Scroll bar 0-120, weather 0-12 diff --git a/src/RadarCalculation.cpp b/src/RadarCalculation.cpp index 0749a6320..45d37f271 100644 --- a/src/RadarCalculation.cpp +++ b/src/RadarCalculation.cpp @@ -1963,5 +1963,8 @@ irr::f32 RadarCalculation::getBrilliance() const void RadarCalculation::setBrilliance(irr::f32 brilliance) { - this->brilliance = brilliance; + if (this->brilliance != brilliance) { + radarScreenStale = true; + this->brilliance = brilliance; + } } \ No newline at end of file diff --git a/src/SimulationModel.cpp b/src/SimulationModel.cpp index edf4e0aa5..1d144b0ee 100644 --- a/src/SimulationModel.cpp +++ b/src/SimulationModel.cpp @@ -2038,6 +2038,7 @@ SimulationModel::~SimulationModel() guiData->radarGain = radarCalculation.getGain(); guiData->radarClutter = radarCalculation.getClutter(); guiData->radarRain = radarCalculation.getRainClutter(); + guiData->radarBrill = radarCalculation.getBrilliance(); guiData->guiRadarEBLBrg = radarCalculation.getEBLBrg(); guiData->guiRadarEBLRangeNm = radarCalculation.getEBLRangeNm(); guiData->guiRadarCursorBrg = radarCalculation.getCursorBrg(); From 0d4be36951fc4c8a2c5a0ab2d6e457df9dad1c44 Mon Sep 17 00:00:00 2001 From: James Packer Date: Tue, 3 Mar 2026 18:49:15 +0000 Subject: [PATCH 3/3] Set brilliance control positions. --- bin/language-en.txt | 1 + bin/language-es.txt | 1 + bin/language-fr.txt | 1 + src/GUIMain.cpp | 11 ++++++----- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/bin/language-en.txt b/bin/language-en.txt index dd8366e11..f361f0e7d 100644 --- a/bin/language-en.txt +++ b/bin/language-en.txt @@ -79,6 +79,7 @@ clear="Clear" past="Past" gain="Gain" rain="Rain" +brill="Brill" weather = "Weather" visibility="Visibility" windDirection="Wind direction" diff --git a/bin/language-es.txt b/bin/language-es.txt index d47edd679..60d76484e 100644 --- a/bin/language-es.txt +++ b/bin/language-es.txt @@ -79,6 +79,7 @@ clear="Borrar" past="Pasado" gain="Ganancia" rain="Lluvia" +brill="Brill" weather ="Meteorología" visibility="Visibilidad" windDirection ="Dirección del viento" diff --git a/bin/language-fr.txt b/bin/language-fr.txt index a3c2839a6..6cedd3f2d 100644 --- a/bin/language-fr.txt +++ b/bin/language-fr.txt @@ -79,6 +79,7 @@ clear="Effacer" past="Passé" gain="Gain" rain="Pluie" +brill="Brill" weather = "Météo" visibility="Visibilité" windDirection = "Direction du vent" diff --git a/src/GUIMain.cpp b/src/GUIMain.cpp index da9ce9adb..cf2fe47f2 100644 --- a/src/GUIMain.cpp +++ b/src/GUIMain.cpp @@ -565,11 +565,11 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vector(0.0850*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_GAIN_SCROLL_BAR); radarClutterScrollbar = new irr::gui::ScrollDial(irr::core::vector2d(0.1425*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_CLUTTER_SCROLL_BAR); radarRainScrollbar = new irr::gui::ScrollDial(irr::core::vector2d(0.2000*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_RAIN_SCROLL_BAR); - radarBrillScrollbar = new irr::gui::ScrollDial(irr::core::vector2d(0.2575*su,0.040*sh),0.02*su,guienv,mainRadarTab,GUI_ID_RADAR_BRILL_SCROLL_BAR); + radarBrillScrollbar = new irr::gui::ScrollDial(irr::core::vector2d(0.2000 * su, 0.115 * sh), 0.01 * su, guienv, mainRadarTab, GUI_ID_RADAR_BRILL_SCROLL_BAR); (guienv->addStaticText(language->translate("gain").c_str(),irr::core::rect(0.0600*su,0.070*sh,0.1100*su,0.100*sh),false,true,mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("clutter").c_str(),irr::core::rect(0.1165*su,0.070*sh,0.1675*su,0.100*sh),false,true,mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("rain").c_str(),irr::core::rect(0.1750*su,0.070*sh,0.2250*su,0.100*sh),false,true,mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); - (guienv->addStaticText(language->translate("brill").c_str(), irr::core::rect(0.2335 * su, 0.070 * sh, 0.2250 * su, 0.100 * sh), false, true, mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); + (guienv->addStaticText(language->translate("brill").c_str(), irr::core::rect(0.1750 * su, 0.125 * sh, 0.2250 * su, 0.155 * sh), false, true, mainRadarTab))->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); radarGainScrollbar->setSmallStep(2); radarClutterScrollbar->setSmallStep(2); radarRainScrollbar->setSmallStep(2); @@ -588,7 +588,8 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vector(0.040*radarSu,0.040*radarSu),0.03*radarSu,guienv,largeRadarControls,GUI_ID_RADAR_GAIN_SCROLL_BAR); radarClutterScrollbar2 = new irr::gui::ScrollDial(irr::core::vector2d(0.105*radarSu,0.040*radarSu),0.03*radarSu,guienv,largeRadarControls,GUI_ID_RADAR_CLUTTER_SCROLL_BAR); radarRainScrollbar2 = new irr::gui::ScrollDial(irr::core::vector2d(0.170*radarSu,0.040*radarSu),0.03*radarSu,guienv,largeRadarControls,GUI_ID_RADAR_RAIN_SCROLL_BAR); - radarBrillScrollbar2 = new irr::gui::ScrollDial(irr::core::vector2d(0.235 * radarSu, 0.040 * radarSu), 0.03 * radarSu, guienv, largeRadarControls, GUI_ID_RADAR_BRILL_SCROLL_BAR); + radarBrillScrollbar2 = new irr::gui::ScrollDial(irr::core::vector2d(radarTL.X + 0.050 * radarSu, radarTL.Y + 0.700 * radarSu), 0.03 * radarSu, guienv, guienv->getRootGUIElement(), GUI_ID_RADAR_BRILL_SCROLL_BAR); + radarBrillScrollbar2->setToolTipText(language->translate("brill").c_str()); radarGainScrollbar2->setSmallStep(2); radarClutterScrollbar2->setSmallStep(2); @@ -598,8 +599,7 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vectoraddStaticText(language->translate("gain").c_str(),irr::core::rect(0.010*radarSu,0.070*radarSu,0.070*radarSu,0.100*radarSu),false,true,largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("clutter").c_str(),irr::core::rect(0.075*radarSu,0.070*radarSu,0.135*radarSu,0.100*radarSu),false,true,largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); (guienv->addStaticText(language->translate("rain").c_str(),irr::core::rect(0.140*radarSu,0.070*radarSu,0.200*radarSu,0.100*radarSu),false,true,largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER,irr::gui::EGUIA_CENTER); - (guienv->addStaticText(language->translate("brill").c_str(), irr::core::rect(0.205 * radarSu, 0.070 * radarSu, 0.200 * radarSu, 0.100 * radarSu), false, true, largeRadarControls))->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER); - + guienv->addButton(irr::core::rect(0.025*radarSu,0.110*radarSu,0.085*radarSu,0.160*radarSu),largeRadarControls,GUI_ID_RADAR_INCREASE_BUTTON,language->translate("increaserange").c_str()); guienv->addButton(irr::core::rect(0.025*radarSu,0.165*radarSu,0.085*radarSu,0.210*radarSu),largeRadarControls,GUI_ID_RADAR_DECREASE_BUTTON,language->translate("decreaserange").c_str()); @@ -960,6 +960,7 @@ void GUIMain::load(irr::IrrlichtDevice* device, Lang* language, std::vectorsetVisible(radarLarge); radarCursorUpButton2->setVisible(radarLarge); radarCursorDownButton2->setVisible(radarLarge); + radarBrillScrollbar2->setVisible(radarLarge); //weatherScrollbar->setVisible(showInterface); //rainScrollbar->setVisible(showInterface);