Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

747 lines
18 KiB

  1. /**********************************Module**********************************\
  2. *
  3. * ssflwbox.c
  4. *
  5. * 3D FlowerBox screen saver
  6. *
  7. * History:
  8. * Wed Jul 19 14:50:27 1995 -by- Drew Bliss [drewb]
  9. * Created
  10. *
  11. * Copyright (c) 1995 Microsoft Corporation
  12. *
  13. \**************************************************************************/
  14. #include "precomp.h"
  15. #pragma hdrstop
  16. // Minimum and maximum image sizes
  17. #define MINIMAGESIZE 10
  18. #define MAXIMAGESIZE 100
  19. // Color tables for checkboard, per-side and single color modes
  20. GLfloat base_checker_cols[MAXSIDES][NCCOLS][4] =
  21. {
  22. 1.0f, 0.0f, 0.0f, 1.0f,
  23. 0.0f, 1.0f, 0.0f, 1.0f,
  24. 0.0f, 1.0f, 0.0f, 1.0f,
  25. 0.0f, 0.0f, 1.0f, 1.0f,
  26. 0.0f, 0.0f, 1.0f, 1.0f,
  27. 1.0f, 0.0f, 1.0f, 1.0f,
  28. 1.0f, 0.0f, 1.0f, 1.0f,
  29. 0.0f, 1.0f, 1.0f, 1.0f,
  30. 0.0f, 1.0f, 1.0f, 1.0f,
  31. 1.0f, 1.0f, 0.0f, 1.0f,
  32. 1.0f, 1.0f, 0.0f, 1.0f,
  33. 0.5f, 0.5f, 1.0f, 1.0f,
  34. 0.5f, 0.5f, 1.0f, 1.0f,
  35. 1.0f, 0.5f, 0.5f, 1.0f,
  36. 1.0f, 0.5f, 0.5f, 1.0f,
  37. 1.0f, 0.0f, 0.0f, 1.0f
  38. };
  39. GLfloat checker_cols[MAXSIDES][NCCOLS][4];
  40. GLfloat base_side_cols[MAXSIDES][4] =
  41. {
  42. 1.0f, 0.0f, 0.0f, 1.0f,
  43. 0.0f, 1.0f, 0.0f, 1.0f,
  44. 0.0f, 0.0f, 1.0f, 1.0f,
  45. 1.0f, 0.0f, 1.0f, 1.0f,
  46. 0.0f, 1.0f, 1.0f, 1.0f,
  47. 1.0f, 1.0f, 0.0f, 1.0f,
  48. 0.5f, 0.5f, 1.0f, 1.0f,
  49. 1.0f, 0.5f, 0.5f, 1.0f
  50. };
  51. GLfloat side_cols[MAXSIDES][4];
  52. GLfloat base_solid_cols[4] =
  53. {
  54. 1.0f, 1.0f, 1.0f, 1.0f
  55. };
  56. GLfloat solid_cols[4];
  57. // Current geometry
  58. GEOMETRY *cur_geom;
  59. // Set when a rendering context is available
  60. BOOL gbGlInit = FALSE;
  61. // Common library context
  62. SSContext gssc;
  63. // Spin rotations
  64. double xr = 0, yr = 0, zr = 0;
  65. // Scale factor and increment
  66. FLT sf;
  67. FLT sfi;
  68. // Color cycling hue phase
  69. FLT phase = 0.0f;
  70. // Default configuration
  71. CONFIG config =
  72. {
  73. TRUE, FALSE, FALSE, TRUE, TRUE, MAXSUBDIV, ID_COL_PER_SIDE,
  74. (MAXIMAGESIZE+MINIMAGESIZE)/2, GEOM_CUBE, GL_FRONT
  75. };
  76. // A slider range
  77. typedef struct _RANGE
  78. {
  79. int min_val;
  80. int max_val;
  81. int step;
  82. int page_step;
  83. } RANGE;
  84. RANGE complexity_range = {MINSUBDIV, MAXSUBDIV, 1, 2};
  85. RANGE image_size_range = {MINIMAGESIZE, MAXIMAGESIZE, 1, 10};
  86. // True if the current OpenGL version is 1.1
  87. BOOL bOgl11;
  88. // True if checkered mode is on
  89. BOOL bCheckerOn;
  90. /******************************Public*Routine******************************\
  91. *
  92. * dprintf
  93. *
  94. * Debug output printf
  95. *
  96. * History:
  97. * Wed Jul 26 15:16:11 1995 -by- Drew Bliss [drewb]
  98. * Created
  99. *
  100. \**************************************************************************/
  101. #if DBG
  102. void dprintf_out(char *fmt, ...)
  103. {
  104. va_list args;
  105. char dbg[256];
  106. va_start(args, fmt);
  107. vsprintf(dbg, fmt, args);
  108. va_end(args);
  109. OutputDebugStringA(dbg);
  110. }
  111. #endif
  112. /******************************Public*Routine******************************\
  113. *
  114. * assert_failed
  115. *
  116. * Assertion failure handler
  117. *
  118. * History:
  119. * Fri Jul 28 17:40:28 1995 -by- Drew Bliss [drewb]
  120. * Created
  121. *
  122. \**************************************************************************/
  123. #if DBG
  124. void assert_failed(char *file, int line, char *msg)
  125. {
  126. dprintf(("Assertion failed %s(%d): %s\n", file, line, msg));
  127. DebugBreak();
  128. }
  129. #endif
  130. /******************************Public*Routine******************************\
  131. *
  132. * V3Len
  133. *
  134. * Vector length
  135. *
  136. * History:
  137. * Wed Jul 19 14:52:21 1995 -by- Drew Bliss [drewb]
  138. * Created
  139. *
  140. \**************************************************************************/
  141. FLT V3Len(PT3 *v)
  142. {
  143. return (FLT)sqrt(v->x*v->x+v->y*v->y+v->z*v->z);
  144. }
  145. /******************************Public*Routine******************************\
  146. *
  147. * ComputeHsvColors
  148. *
  149. * Compute a smooth range of colors depending on the current color mode
  150. *
  151. * History:
  152. * Wed Jul 19 14:53:32 1995 -by- Drew Bliss [drewb]
  153. * Created
  154. *
  155. \**************************************************************************/
  156. void ComputeHsvColors(void)
  157. {
  158. GLfloat *cols;
  159. int ncols;
  160. FLT ang, da;
  161. int hex;
  162. FLT fhex, frac;
  163. FLT p, q, t;
  164. FLT sat, val;
  165. switch(config.color_pick)
  166. {
  167. case ID_COL_CHECKER:
  168. ncols = MAXSIDES*NCCOLS;
  169. cols = &checker_cols[0][0][0];
  170. break;
  171. case ID_COL_PER_SIDE:
  172. ncols = MAXSIDES;
  173. cols = &side_cols[0][0];
  174. break;
  175. case ID_COL_SINGLE:
  176. ncols = 1;
  177. cols = &solid_cols[0];
  178. break;
  179. }
  180. ang = phase;
  181. da = (FLT)((2*PI)/ncols);
  182. val = sat = 1.0f;
  183. while (ncols > 0)
  184. {
  185. fhex = (FLT)(6*ang/(2*PI));
  186. hex = (int)fhex;
  187. frac = fhex-hex;
  188. hex = hex % 6;
  189. p = val*(1-sat);
  190. q = val*(1-sat*frac);
  191. t = val*(1-sat*(1-frac));
  192. switch(hex)
  193. {
  194. case 0:
  195. cols[0] = val;
  196. cols[1] = t;
  197. cols[2] = p;
  198. break;
  199. case 1:
  200. cols[0] = q;
  201. cols[1] = val;
  202. cols[2] = p;
  203. break;
  204. case 2:
  205. cols[0] = p;
  206. cols[1] = val;
  207. cols[2] = t;
  208. break;
  209. case 3:
  210. cols[0] = p;
  211. cols[1] = q;
  212. cols[2] = val;
  213. break;
  214. case 4:
  215. cols[0] = t;
  216. cols[1] = p;
  217. cols[2] = val;
  218. break;
  219. case 5:
  220. cols[0] = val;
  221. cols[1] = p;
  222. cols[2] = q;
  223. break;
  224. }
  225. ang += da;
  226. cols += 4;
  227. ncols--;
  228. }
  229. }
  230. /******************************Public*Routine******************************\
  231. *
  232. * Draw
  233. *
  234. * Draw everything
  235. *
  236. * History:
  237. * Wed Jul 19 14:54:16 1995 -by- Drew Bliss [drewb]
  238. * Created
  239. *
  240. \**************************************************************************/
  241. void Draw(void)
  242. {
  243. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  244. glLoadIdentity();
  245. glRotated(xr, 1, 0, 0);
  246. glRotated(yr, 0, 1, 0);
  247. glRotated(zr, 0, 0, 1);
  248. DrawGeom(cur_geom);
  249. glFlush();
  250. }
  251. /******************************Public*Routine******************************\
  252. *
  253. * Update
  254. *
  255. * Update all varying values, called by the common library
  256. *
  257. * History:
  258. * Wed Jul 19 14:54:24 1995 -by- Drew Bliss [drewb]
  259. * Created
  260. *
  261. \**************************************************************************/
  262. void Update(void *data)
  263. {
  264. if (config.spin)
  265. {
  266. xr += 3;
  267. yr += 2;
  268. }
  269. if (config.bloom)
  270. {
  271. sf += sfi;
  272. if (sf > cur_geom->max_sf ||
  273. sf < cur_geom->min_sf)
  274. {
  275. sfi = -sfi;
  276. }
  277. UpdatePts(cur_geom, sf);
  278. }
  279. if (config.cycle_colors)
  280. {
  281. ComputeHsvColors();
  282. phase += (FLT)(2.5*PI/180.);
  283. }
  284. Draw();
  285. }
  286. // String storage
  287. TCHAR geom_names[IDS_GEOM_COUNT][20];
  288. /******************************Public*Routine******************************\
  289. * getIniSettings
  290. *
  291. * Get the screen saver configuration options from .INI file/registry.
  292. *
  293. \**************************************************************************/
  294. static void
  295. getIniSettings()
  296. {
  297. // Get registry settings
  298. if( ! ss_RegistrySetup( GetModuleHandle(NULL), IDS_INI_SECTION,
  299. IDS_INIFILE ) )
  300. return;
  301. config.smooth_colors =
  302. ss_GetRegistryInt( IDS_CONFIG_SMOOTH_COLORS, config.smooth_colors );
  303. config.triangle_colors =
  304. ss_GetRegistryInt( IDS_CONFIG_TRIANGLE_COLORS, config.triangle_colors );
  305. config.cycle_colors =
  306. ss_GetRegistryInt( IDS_CONFIG_CYCLE_COLORS, config.cycle_colors );
  307. config.spin =
  308. ss_GetRegistryInt( IDS_CONFIG_SPIN, config.spin );
  309. config.bloom =
  310. ss_GetRegistryInt( IDS_CONFIG_BLOOM, config.bloom );
  311. config.subdiv =
  312. ss_GetRegistryInt( IDS_CONFIG_SUBDIV, config.subdiv );
  313. config.color_pick =
  314. ss_GetRegistryInt( IDS_CONFIG_COLOR_PICK, config.color_pick );
  315. config.image_size =
  316. ss_GetRegistryInt( IDS_CONFIG_IMAGE_SIZE, config.image_size );
  317. config.geom =
  318. ss_GetRegistryInt( IDS_CONFIG_GEOM, config.geom );
  319. config.two_sided =
  320. ss_GetRegistryInt( IDS_CONFIG_TWO_SIDED, config.two_sided );
  321. }
  322. /******************************Public*Routine******************************\
  323. * saveIniSettings
  324. *
  325. * Save the screen saver configuration option to the .INI file/registry.
  326. *
  327. \**************************************************************************/
  328. static void
  329. saveIniSettings()
  330. {
  331. if( ! ss_RegistrySetup( GetModuleHandle(NULL), IDS_INI_SECTION,
  332. IDS_INIFILE ) )
  333. return;
  334. ss_WriteRegistryInt( IDS_CONFIG_SMOOTH_COLORS, config.smooth_colors );
  335. ss_WriteRegistryInt( IDS_CONFIG_TRIANGLE_COLORS, config.triangle_colors );
  336. ss_WriteRegistryInt( IDS_CONFIG_CYCLE_COLORS, config.cycle_colors );
  337. ss_WriteRegistryInt( IDS_CONFIG_SPIN, config.spin );
  338. ss_WriteRegistryInt( IDS_CONFIG_BLOOM, config.bloom );
  339. ss_WriteRegistryInt( IDS_CONFIG_SUBDIV, config.subdiv );
  340. ss_WriteRegistryInt( IDS_CONFIG_COLOR_PICK, config.color_pick );
  341. ss_WriteRegistryInt( IDS_CONFIG_IMAGE_SIZE, config.image_size );
  342. ss_WriteRegistryInt( IDS_CONFIG_GEOM, config.geom );
  343. ss_WriteRegistryInt( IDS_CONFIG_TWO_SIDED, config.two_sided );
  344. }
  345. /******************************Public*Routine******************************\
  346. *
  347. * NewConfig
  348. *
  349. * Set up a new configuration
  350. *
  351. * History:
  352. * Wed Jul 19 14:55:34 1995 -by- Drew Bliss [drewb]
  353. * Created
  354. *
  355. \**************************************************************************/
  356. void NewConfig(CONFIG *cnf)
  357. {
  358. // Set new config
  359. config = *cnf;
  360. // Save to ini file
  361. saveIniSettings();
  362. // Reset colors
  363. memcpy(checker_cols, base_checker_cols, sizeof(checker_cols));
  364. memcpy(side_cols, base_side_cols, sizeof(side_cols));
  365. memcpy(solid_cols, base_solid_cols, sizeof(solid_cols));
  366. // Reset geometry
  367. cur_geom = geom_table[config.geom];
  368. cur_geom->init(cur_geom);
  369. if (bOgl11 && !bCheckerOn) DrawWithVArrays (cur_geom);
  370. assert(cur_geom->total_pts <= MAXPTS);
  371. InitVlen(cur_geom, cur_geom->total_pts, cur_geom->pts);
  372. sf = 0.0f;
  373. sfi = cur_geom->sf_inc;
  374. UpdatePts(cur_geom, sf);
  375. // Reset OpenGL parameters according to configuration
  376. // Only done if GL has been initialized
  377. if (gbGlInit)
  378. {
  379. GLfloat fv4[4];
  380. if (config.two_sided == GL_FRONT_AND_BACK)
  381. {
  382. glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  383. glDisable(GL_CULL_FACE);
  384. }
  385. else
  386. {
  387. glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
  388. glEnable(GL_CULL_FACE);
  389. }
  390. fv4[0] = fv4[1] = fv4[2] = .8f;
  391. fv4[3] = 1.0f;
  392. glMaterialfv(config.two_sided, GL_SPECULAR, fv4);
  393. glMaterialf(config.two_sided, GL_SHININESS, 30.0f);
  394. }
  395. }
  396. /******************************Public*Routine******************************\
  397. *
  398. * RegisterDialogClasses
  399. *
  400. * Standard screensaver hook
  401. *
  402. * History:
  403. * Wed Jul 19 15:18:14 1995 -by- Drew Bliss [drewb]
  404. * Created
  405. *
  406. \**************************************************************************/
  407. BOOL WINAPI RegisterDialogClasses(HANDLE hinst)
  408. {
  409. return TRUE;
  410. }
  411. // Temporary configuration for when the configuration dialog is active
  412. // If the dialog is ok'ed then this becomes the current configuration,
  413. // otherwise it is discarded
  414. CONFIG temp_config;
  415. /******************************Public*Routine******************************\
  416. *
  417. * ScreenSaverConfigureDialog
  418. *
  419. * Standard screensaver hook
  420. *
  421. * History:
  422. * Wed Jul 19 14:56:41 1995 -by- Drew Bliss [drewb]
  423. * Created
  424. *
  425. \**************************************************************************/
  426. BOOL CALLBACK ScreenSaverConfigureDialog(HWND hdlg, UINT msg,
  427. WPARAM wpm, LPARAM lpm)
  428. {
  429. WORD pos;
  430. RANGE *rng;
  431. HWND hCtrl;
  432. int i;
  433. switch(msg)
  434. {
  435. case WM_INITDIALOG:
  436. InitCommonControls();
  437. getIniSettings();
  438. temp_config = config;
  439. CheckRadioButton(hdlg, ID_COL_PICK_FIRST, ID_COL_PICK_LAST,
  440. config.color_pick);
  441. CheckDlgButton(hdlg, ID_COL_SMOOTH, config.smooth_colors);
  442. CheckDlgButton(hdlg, ID_COL_TRIANGLE, config.triangle_colors);
  443. CheckDlgButton(hdlg, ID_COL_CYCLE, config.cycle_colors);
  444. CheckDlgButton(hdlg, ID_SPIN, config.spin);
  445. CheckDlgButton(hdlg, ID_BLOOM, config.bloom);
  446. CheckDlgButton(hdlg, ID_TWO_SIDED,
  447. config.two_sided == GL_FRONT_AND_BACK);
  448. ss_SetupTrackbar( hdlg, ID_COMPLEXITY, MINSUBDIV, MAXSUBDIV,
  449. complexity_range.step,
  450. complexity_range.page_step,
  451. config.subdiv);
  452. ss_SetupTrackbar( hdlg, ID_IMAGE_SIZE, MINIMAGESIZE, MAXIMAGESIZE,
  453. image_size_range.step,
  454. image_size_range.page_step,
  455. config.image_size);
  456. hCtrl = GetDlgItem(hdlg, ID_GEOM);
  457. SendMessage(hCtrl, CB_RESETCONTENT, 0, 0);
  458. for (i = 0; i < IDS_GEOM_COUNT; i++)
  459. {
  460. LoadString( hMainInstance, i+IDS_GEOM_FIRST, geom_names[i],
  461. sizeof(geom_names)/IDS_GEOM_COUNT );
  462. SendMessage(hCtrl, CB_ADDSTRING, 0, (LPARAM)geom_names[i]);
  463. }
  464. SendMessage(hCtrl, CB_SETCURSEL, config.geom, 0);
  465. SetFocus(GetDlgItem(hdlg, ID_COMPLEXITY));
  466. return FALSE;
  467. case WM_COMMAND:
  468. switch(LOWORD(wpm))
  469. {
  470. case ID_COL_CHECKER:
  471. case ID_COL_PER_SIDE:
  472. case ID_COL_SINGLE:
  473. temp_config.color_pick = LOWORD(wpm);
  474. break;
  475. case ID_COL_SMOOTH:
  476. temp_config.smooth_colors = !temp_config.smooth_colors;
  477. break;
  478. case ID_COL_TRIANGLE:
  479. temp_config.triangle_colors = !temp_config.triangle_colors;
  480. break;
  481. case ID_COL_CYCLE:
  482. temp_config.cycle_colors = !temp_config.cycle_colors;
  483. break;
  484. case ID_SPIN:
  485. temp_config.spin = !temp_config.spin;
  486. break;
  487. case ID_BLOOM:
  488. temp_config.bloom = !temp_config.bloom;
  489. break;
  490. case ID_TWO_SIDED:
  491. temp_config.two_sided =
  492. temp_config.two_sided == GL_FRONT_AND_BACK ? GL_FRONT :
  493. GL_FRONT_AND_BACK;
  494. break;
  495. case IDOK:
  496. temp_config.subdiv =
  497. ss_GetTrackbarPos(hdlg, ID_COMPLEXITY);
  498. temp_config.image_size =
  499. ss_GetTrackbarPos(hdlg, ID_IMAGE_SIZE);
  500. temp_config.geom =
  501. (int)SendMessage(GetDlgItem(hdlg, ID_GEOM), CB_GETCURSEL, 0, 0);
  502. NewConfig(&temp_config);
  503. // Fall through
  504. case IDCANCEL:
  505. EndDialog(hdlg, LOWORD(wpm));
  506. break;
  507. }
  508. return TRUE;
  509. }
  510. return FALSE;
  511. }
  512. /******************************Public*Routine******************************\
  513. *
  514. * Init
  515. *
  516. * Drawing initialization, called by common library
  517. *
  518. * History:
  519. * Wed Jul 19 14:47:13 1995 -by- Drew Bliss [drewb]
  520. * Created
  521. *
  522. \**************************************************************************/
  523. void Init(void *data)
  524. {
  525. GLfloat fv4[4];
  526. gbGlInit = TRUE;
  527. bOgl11 = ss_fOnGL11();
  528. if (config.color_pick == ID_COL_CHECKER) bCheckerOn = TRUE;
  529. else bCheckerOn = FALSE;
  530. glMatrixMode(GL_PROJECTION);
  531. glLoadIdentity();
  532. gluPerspective(45, 1, 2, 5); // for object range -1.5 to 1.5
  533. gluLookAt(0, 0, 3.5, 0, 0, 0, 0, 1, 0);
  534. glMatrixMode(GL_MODELVIEW);
  535. glEnable(GL_DEPTH_TEST);
  536. glClearDepth(1);
  537. glCullFace(GL_BACK);
  538. fv4[0] = 2.0f;
  539. fv4[1] = 2.0f;
  540. fv4[2] = 10.0f;
  541. fv4[3] = 1.0f;
  542. glLightfv(GL_LIGHT0, GL_POSITION, fv4);
  543. glEnable(GL_LIGHTING);
  544. glEnable(GL_LIGHT0);
  545. glEnable(GL_NORMALIZE);
  546. // Make default configuration current
  547. NewConfig(&config);
  548. }
  549. /******************************Public*Routine******************************\
  550. * SetFloaterInfo
  551. *
  552. * Set the size and motion of the floating window
  553. *
  554. * History
  555. * Apr. 28, 95 : [marcfo]
  556. * - Wrote it
  557. *
  558. \**************************************************************************/
  559. void
  560. SetFloaterInfo( ISIZE *pParentSize, CHILD_INFO *pChild )
  561. {
  562. float sizeFact;
  563. float sizeScale;
  564. int size;
  565. ISIZE *pChildSize = &pChild->size;
  566. MOTION_INFO *pMotion = &pChild->motionInfo;
  567. sizeScale = (float)config.image_size / 100.0f;
  568. sizeFact = 0.25f + (0.5f * sizeScale); // range 25-75%
  569. size = (int) (sizeFact * ( ((float)(pParentSize->width + pParentSize->height)) / 2.0f ));
  570. SS_CLAMP_TO_RANGE2( size, 0, pParentSize->width );
  571. SS_CLAMP_TO_RANGE2( size, 0, pParentSize->height );
  572. pChildSize->width = pChildSize->height = size;
  573. // Floater motion
  574. pMotion->posInc.x = .005f * (float) size;
  575. if( pMotion->posInc.x < 1.0f )
  576. pMotion->posInc.x = 1.0f;
  577. pMotion->posInc.y = pMotion->posInc.x;
  578. pMotion->posIncVary.x = .4f * pMotion->posInc.x;
  579. pMotion->posIncVary.y = pMotion->posIncVary.x;
  580. }
  581. /******************************Public*Routine******************************\
  582. *
  583. * FloaterFail
  584. *
  585. * Called when the floating window cannot be created
  586. *
  587. * History:
  588. * Wed Jul 19 15:06:18 1995 -by- Drew Bliss [drewb]
  589. * Taken from text3d
  590. *
  591. \**************************************************************************/
  592. void FloaterFail(void *data)
  593. {
  594. HINSTANCE hinst;
  595. TCHAR error_str[20];
  596. TCHAR start_failed[80];
  597. hinst = GetModuleHandle(NULL);
  598. if (LoadString(hinst, IDS_ERROR,
  599. error_str, sizeof(error_str)) &&
  600. LoadString(hinst, IDS_START_FAILED,
  601. start_failed, sizeof(start_failed)))
  602. {
  603. MessageBox(NULL, start_failed, error_str, MB_OK);
  604. }
  605. }
  606. /******************************Public*Routine******************************\
  607. *
  608. * ss_Init
  609. *
  610. * Screensaver initialization routine, called at startup by common library
  611. *
  612. * History:
  613. * Wed Jul 19 14:44:46 1995 -by- Drew Bliss [drewb]
  614. * Created
  615. *
  616. \**************************************************************************/
  617. SSContext *ss_Init(void)
  618. {
  619. getIniSettings();
  620. ss_InitFunc(Init);
  621. ss_UpdateFunc(Update);
  622. gssc.bFloater = TRUE;
  623. gssc.floaterInfo.bMotion = TRUE;
  624. gssc.floaterInfo.ChildSizeFunc = SetFloaterInfo;
  625. gssc.bDoubleBuf = TRUE;
  626. gssc.depthType = SS_DEPTH16;
  627. return &gssc;
  628. }
  629. /**************************************************************************\
  630. * ConfigInit
  631. *
  632. * Dialog box version of ss_Init. Used for setting up any gl drawing on the
  633. * dialog.
  634. *
  635. \**************************************************************************/
  636. BOOL
  637. ss_ConfigInit( HWND hDlg )
  638. {
  639. return TRUE;
  640. }