W3DProgressBar.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. /*
  2. ** Command & Conquer Generals(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. ////////////////////////////////////////////////////////////////////////////////
  19. // //
  20. // (c) 2001-2003 Electronic Arts Inc. //
  21. // //
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // FILE: W3DProgressBar.cpp ///////////////////////////////////////////////////
  24. //-----------------------------------------------------------------------------
  25. //
  26. // Westwood Studios Pacific.
  27. //
  28. // Confidential Information
  29. // Copyright (C) 2001 - All Rights Reserved
  30. //
  31. //-----------------------------------------------------------------------------
  32. //
  33. // Project: RTS3
  34. //
  35. // File name: W3DProgressBar.cpp
  36. //
  37. // Created: Colin Day, June 2001
  38. //
  39. // Desc: W3D implementation for the progress bar GUI control
  40. //
  41. //-----------------------------------------------------------------------------
  42. ///////////////////////////////////////////////////////////////////////////////
  43. // SYSTEM INCLUDES ////////////////////////////////////////////////////////////
  44. #include <stdlib.h>
  45. // USER INCLUDES //////////////////////////////////////////////////////////////
  46. #include "GameClient/GameWindowGlobal.h"
  47. #include "GameClient/GameWindowManager.h"
  48. #include "GameClient/GadgetProgressBar.h"
  49. #include "W3DDevice/GameClient/W3DGadget.h"
  50. #include "W3DDevice/GameClient/W3DDisplay.h"
  51. // DEFINES ////////////////////////////////////////////////////////////////////
  52. // PRIVATE TYPES //////////////////////////////////////////////////////////////
  53. // PRIVATE DATA ///////////////////////////////////////////////////////////////
  54. // PUBLIC DATA ////////////////////////////////////////////////////////////////
  55. // PRIVATE PROTOTYPES /////////////////////////////////////////////////////////
  56. // PRIVATE FUNCTIONS //////////////////////////////////////////////////////////
  57. ///////////////////////////////////////////////////////////////////////////////
  58. // PUBLIC FUNCTIONS ///////////////////////////////////////////////////////////
  59. ///////////////////////////////////////////////////////////////////////////////
  60. // W3DGadgetProgressBarDraw ===================================================
  61. /** Draw colored Progress Bar using standard graphics */
  62. //=============================================================================
  63. void W3DGadgetProgressBarDraw( GameWindow *window, WinInstanceData *instData )
  64. {
  65. ICoord2D origin, size, start, end;
  66. Color backColor, backBorder, barColor, barBorder;
  67. Int progress = (Int)window->winGetUserData();
  68. // get window size and position
  69. window->winGetScreenPosition( &origin.x, &origin.y );
  70. window->winGetSize( &size.x, &size.y );
  71. // get the right colors to use
  72. if( BitTest( window->winGetStatus(), WIN_STATUS_ENABLED ) == FALSE )
  73. {
  74. backColor = GadgetProgressBarGetDisabledColor( window );
  75. backBorder = GadgetProgressBarGetDisabledBorderColor( window );
  76. barColor = GadgetProgressBarGetDisabledBarColor( window );
  77. barBorder = GadgetProgressBarGetDisabledBarBorderColor( window );
  78. } // end if, disabled
  79. else if( BitTest( instData->getState(), WIN_STATE_HILITED ) )
  80. {
  81. backColor = GadgetProgressBarGetHiliteColor( window );
  82. backBorder = GadgetProgressBarGetHiliteBorderColor( window );
  83. barColor = GadgetProgressBarGetHiliteBarColor( window );
  84. barBorder = GadgetProgressBarGetHiliteBarBorderColor( window );
  85. } // end else if, hilited
  86. else
  87. {
  88. backColor = GadgetProgressBarGetEnabledColor( window );
  89. backBorder = GadgetProgressBarGetEnabledBorderColor( window );
  90. barColor = GadgetProgressBarGetEnabledBarColor( window );
  91. barBorder = GadgetProgressBarGetEnabledBarBorderColor( window );
  92. } // end else, enabled
  93. // draw background border
  94. if( backBorder != WIN_COLOR_UNDEFINED )
  95. {
  96. start.x = origin.x;
  97. start.y = origin.y;
  98. end.x = start.x + size.x;
  99. end.y = start.y + size.y;
  100. TheWindowManager->winOpenRect( backBorder, WIN_DRAW_LINE_WIDTH,
  101. start.x, start.y, end.x, end.y );
  102. } // end if
  103. // draw background fill
  104. if( backColor != WIN_COLOR_UNDEFINED )
  105. {
  106. start.x = origin.x + 1;
  107. start.y = origin.y + 1;
  108. end.x = start.x + size.x - 2;
  109. end.y = start.y + size.y - 2;
  110. TheWindowManager->winFillRect( backColor, WIN_DRAW_LINE_WIDTH,
  111. start.x, start.y, end.x, end.y );
  112. } // end if
  113. // draw the progress so far
  114. if( progress )
  115. {
  116. // draw bar border
  117. if( barBorder != WIN_COLOR_UNDEFINED )
  118. {
  119. start.x = origin.x;
  120. start.y = origin.y;
  121. end.x = start.x + (size.x * progress) / 100;
  122. end.y = start.y + size.y;
  123. if(end.x- start.x > 1 )
  124. {
  125. TheWindowManager->winOpenRect( barBorder, WIN_DRAW_LINE_WIDTH,
  126. start.x, start.y, end.x, end.y );
  127. }
  128. } // end if
  129. // draw bar fill
  130. if( barColor != WIN_COLOR_UNDEFINED )
  131. {
  132. start.x = origin.x + 1;
  133. start.y = origin.y + 1;
  134. end.x = start.x + (size.x * progress) / 100 - 2;
  135. end.y = start.y + size.y - 2;
  136. // TheWindowManager->winOpenRect( barColor, WIN_DRAW_LINE_WIDTH,
  137. // start.x, start.y, end.x, end.y );
  138. if(end.x- start.x > 1 )
  139. {
  140. TheWindowManager->winFillRect( barColor,WIN_DRAW_LINE_WIDTH,
  141. start.x, start.y, end.x, end.y );
  142. TheWindowManager->winDrawLine(GameMakeColor(255,255,255,255),WIN_DRAW_LINE_WIDTH, start.x, start.y, end.x, start.y);
  143. TheWindowManager->winDrawLine(GameMakeColor(200,200,200,255),WIN_DRAW_LINE_WIDTH, start.x, start.y, start.x, end.y);
  144. }
  145. } // end if
  146. } // end if
  147. } // end W3DGadgetProgressBarDraw
  148. // W3DGadgetProgressBarImageDraw ==============================================
  149. /** Draw Progress Bar with user supplied images */
  150. //=============================================================================
  151. void W3DGadgetProgressBarImageDrawA( GameWindow *window, WinInstanceData *instData )
  152. {
  153. ICoord2D origin, size;
  154. const Image *barCenter, *barRight, *left, *right, *center;
  155. Int progress = (Int)window->winGetUserData();
  156. Int xOffset, yOffset;
  157. Int i;
  158. // get window size and position
  159. window->winGetScreenPosition( &origin.x, &origin.y );
  160. window->winGetSize( &size.x, &size.y );
  161. // get offset
  162. xOffset = instData->m_imageOffset.x;
  163. yOffset = instData->m_imageOffset.y;
  164. barCenter = GadgetProgressBarGetEnabledBarImageCenter( window );
  165. barRight = GadgetProgressBarGetEnabledBarImageRight( window );
  166. left = GadgetProgressBarGetEnabledImageLeft( window );
  167. right = GadgetProgressBarGetEnabledImageRight( window );
  168. center = GadgetProgressBarGetEnabledImageCenter( window );
  169. if(!barCenter || !barRight || !left || !right || !center)
  170. return;
  171. Int width = barCenter->getImageWidth();
  172. // Int height = barCenter->getImageHeight();
  173. Int drawWidth = (size.x * progress) / 100;
  174. Int pieces = drawWidth / width;
  175. Int x = origin.x;
  176. for( i = 0; i < pieces; i ++)
  177. {
  178. TheWindowManager->winDrawImage( barCenter,
  179. x, origin.y,
  180. x + width, origin.y + size.y );
  181. x += width;
  182. }
  183. }
  184. void W3DGadgetProgressBarImageDraw( GameWindow *window, WinInstanceData *instData )
  185. {
  186. ICoord2D origin, size, start, end;
  187. const Image *backLeft, *backRight, *backCenter,
  188. *barRight, *barCenter;//*backSmallCenter,*barLeft,, *barSmallCenter;
  189. Int progress = (Int)window->winGetUserData();
  190. Int xOffset, yOffset;
  191. Int i;
  192. // get window size and position
  193. window->winGetScreenPosition( &origin.x, &origin.y );
  194. window->winGetSize( &size.x, &size.y );
  195. // get offset
  196. xOffset = instData->m_imageOffset.x;
  197. yOffset = instData->m_imageOffset.y;
  198. // get the right images to use
  199. if( BitTest( window->winGetStatus(), WIN_STATUS_ENABLED ) == FALSE )
  200. {
  201. backLeft = GadgetProgressBarGetDisabledImageLeft( window );
  202. //barLeft = GadgetProgressBarGetDisabledBarImageLeft( window );
  203. backRight = GadgetProgressBarGetDisabledImageRight( window );
  204. barRight = GadgetProgressBarGetDisabledBarImageRight( window );
  205. backCenter = GadgetProgressBarGetDisabledImageCenter( window );
  206. barCenter = GadgetProgressBarGetDisabledBarImageCenter( window );
  207. //backSmallCenter = GadgetProgressBarGetDisabledImageSmallCenter( window );
  208. //barSmallCenter = GadgetProgressBarGetDisabledBarImageSmallCenter( window );
  209. } // end if, disabled
  210. else if( BitTest( instData->getState(), WIN_STATE_HILITED ) )
  211. {
  212. backLeft = GadgetProgressBarGetHiliteImageLeft( window );
  213. //barLeft = GadgetProgressBarGetHiliteBarImageLeft( window );
  214. backRight = GadgetProgressBarGetHiliteImageRight( window );
  215. barRight = GadgetProgressBarGetHiliteBarImageRight( window );
  216. backCenter = GadgetProgressBarGetHiliteImageCenter( window );
  217. barCenter = GadgetProgressBarGetHiliteBarImageCenter( window );
  218. //backSmallCenter = GadgetProgressBarGetHiliteImageSmallCenter( window );
  219. //barSmallCenter = GadgetProgressBarGetHiliteBarImageSmallCenter( window );
  220. } // end else if, hilited
  221. else
  222. {
  223. backLeft = GadgetProgressBarGetEnabledImageLeft( window );
  224. //barLeft = GadgetProgressBarGetEnabledBarImageLeft( window );
  225. backRight = GadgetProgressBarGetEnabledImageRight( window );
  226. barRight = GadgetProgressBarGetEnabledBarImageRight( window );
  227. backCenter = GadgetProgressBarGetEnabledImageCenter( window );
  228. barCenter = GadgetProgressBarGetEnabledBarImageCenter( window );
  229. //backSmallCenter = GadgetProgressBarGetEnabledImageSmallCenter( window );
  230. //barSmallCenter = GadgetProgressBarGetEnabledBarImageSmallCenter( window );
  231. } // end else, enabled
  232. // sanity
  233. if( backLeft == NULL || backRight == NULL ||
  234. backCenter == NULL ||
  235. barRight == NULL)
  236. // backSmallCenter == NULL ||barLeft == NULL ||barCenter == NULL || barSmallCenter == NULL )
  237. return;
  238. // get image sizes for the ends
  239. ICoord2D leftSize, rightSize;
  240. leftSize.x = backLeft->getImageWidth();
  241. leftSize.y = backLeft->getImageHeight();
  242. rightSize.x = backRight->getImageWidth();
  243. rightSize.y = backRight->getImageHeight();
  244. // get two key points used in the end drawing
  245. ICoord2D leftEnd, rightStart;
  246. leftEnd.x = origin.x + leftSize.x + xOffset;
  247. leftEnd.y = origin.y + size.y + yOffset;
  248. rightStart.x = origin.x + size.x - rightSize.x + xOffset;
  249. rightStart.y = origin.y + yOffset;
  250. // draw the center repeating bar
  251. Int centerWidth, pieces;
  252. // get width we have to draw our repeating center in
  253. centerWidth = rightStart.x - leftEnd.x;
  254. // how many whole repeating pieces will fit in that width
  255. pieces = centerWidth / backCenter->getImageWidth();
  256. // draw the pieces
  257. start.x = leftEnd.x;
  258. start.y = origin.y + yOffset;
  259. end.y = start.y + size.y;
  260. for( i = 0; i < pieces; i++ )
  261. {
  262. end.x = start.x + backCenter->getImageWidth();
  263. TheWindowManager->winDrawImage( backCenter,
  264. start.x, start.y,
  265. end.x, end.y );
  266. start.x += backCenter->getImageWidth();
  267. } // end for i
  268. //
  269. // how many small repeating pieces will fit in the gap from where the
  270. // center repeating bar stopped and the right image, draw them
  271. // and overlapping underneath where the right end will go
  272. //
  273. // centerWidth = rightStart.x - start.x;
  274. // pieces = centerWidth / backCenter->getImageWidth() + 1;
  275. // end.y = start.y + size.y;
  276. // IRegion2D clipRegion;
  277. //
  278. // TheDisplay->setClipRegion()
  279. // for( i = 0; i < pieces; i++ )
  280. // {
  281. //
  282. // end.x = start.x + backCenter->getImageWidth();
  283. // TheWindowManager->winDrawImage( backCenter,
  284. // start.x, start.y,
  285. // end.x, end.y );
  286. // start.x += backCenter->getImageWidth();
  287. //
  288. // } // end for i
  289. //
  290. IRegion2D reg;
  291. reg.lo.x = start.x;
  292. reg.lo.y = start.y;
  293. reg.hi.x = rightStart.x;
  294. reg.hi.y = end.y;
  295. centerWidth = rightStart.x - start.x;
  296. if( centerWidth > 0)
  297. {
  298. TheDisplay->setClipRegion(&reg);
  299. end.x = start.x + backCenter->getImageWidth();
  300. TheWindowManager->winDrawImage( backCenter,
  301. start.x, start.y,
  302. end.x, end.y );
  303. TheDisplay->enableClipping(FALSE);
  304. }
  305. // draw left end
  306. start.x = origin.x + xOffset;
  307. start.y = origin.y + yOffset;
  308. end = leftEnd;
  309. TheWindowManager->winDrawImage(backLeft, start.x, start.y, end.x, end.y);
  310. // draw right end
  311. start = rightStart;
  312. end.x = start.x + rightSize.x;
  313. end.y = start.y + size.y;
  314. TheWindowManager->winDrawImage(backRight, start.x, start.y, end.x, end.y);
  315. ICoord2D barWindowSize; // end point of bar from window origin
  316. barWindowSize.x = ((size.x - 20) * progress) / 100;
  317. barWindowSize.y = size.y;
  318. pieces = barWindowSize.x / barCenter->getImageWidth();
  319. // draw the pieces
  320. start.x = origin.x +10;
  321. start.y = origin.y + yOffset +5;
  322. end.y = start.y + size.y - 10;
  323. for( i = 0; i < pieces; i++ )
  324. {
  325. end.x = start.x + barCenter->getImageWidth();
  326. TheWindowManager->winDrawImage( barCenter,
  327. start.x, start.y,
  328. end.x, end.y );
  329. start.x += barCenter->getImageWidth();
  330. } // end for i
  331. start.x = origin.x + 10 + barCenter->getImageWidth() * pieces;
  332. //pieces = (size.x - barWindowSize.x -20) / barRight->getImageWidth();
  333. //Changed By Saad for flashing grey piece
  334. pieces = ((size.x - 20) / barCenter->getImageWidth()) - pieces;
  335. for( i = 0; i < pieces; i++ )
  336. {
  337. end.x = start.x + barRight->getImageWidth();
  338. TheWindowManager->winDrawImage( barRight,
  339. start.x, start.y,
  340. end.x, end.y );
  341. start.x += barRight->getImageWidth();
  342. } // end for i
  343. } // end W3DGadgetProgressBarImageDraw