home *** CD-ROM | disk | FTP | other *** search
/ gondwana.ecr.mu.oz.au/pub/ / Graphics.tar / Graphics / VOGLE.ZIP / EXAMPLES / SUNVIEW / SVLCUBE.C < prev   
C/C++ Source or Header  |  1994-04-27  |  4KB  |  270 lines

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <suntool/sunview.h>
  4. #include <suntool/canvas.h>
  5. #include <suntool/panel.h>
  6. #include "vogle.h"
  7.  
  8. #define SIZE    512
  9.  
  10. int    back = 0;
  11. int    doubleb = 1;
  12. int    fill = 0;
  13. int    hatch = 0;
  14.  
  15. #define TRANS           25.0
  16. #define SCAL            0.1
  17. #define FILLED          2
  18. #define OUTLINE         3
  19.  
  20. float   tdir = TRANS;
  21. float   scal = 1.0 + SCAL;
  22. int     but, nplanes;
  23.  
  24. do_plus()
  25. {
  26.     tdir = TRANS;
  27. }
  28.  
  29. do_minus()
  30. {
  31.     tdir = -tdir;
  32.  
  33.     if (scal < 1.0)
  34.         scal = 1.0 + SCAL;
  35.     else
  36.         scal = 1.0 - SCAL;
  37. }
  38.  
  39. do_back()
  40. {
  41.     back = !back;
  42.     backface(back);
  43. }
  44.  
  45. do_fill()
  46. {
  47.     fill = !fill;
  48.     hatch = 0;
  49.  
  50.         polyfill(fill);
  51. }
  52.  
  53. do_hatch()
  54. {
  55.     hatch = !hatch;
  56.     fill = 0;
  57.  
  58.         polyhatch(hatch);
  59. }
  60.  
  61. do_scale()
  62. {
  63.     scale(scal, scal, scal);
  64. }
  65.  
  66. do_x()
  67. {
  68.     translate(tdir, 0.0, 0.0);
  69. }
  70. do_y()
  71. {
  72.     translate(0.0, tdir, 0.0);
  73. }
  74.  
  75. do_z()
  76. {
  77.     translate(0.0, 0.0, tdir);
  78. }
  79.  
  80. do_double()
  81. {
  82.     doubleb = !doubleb;
  83.  
  84.     if (doubleb) {
  85.         fprintf(stderr, "Double buffer on\n");
  86.         backbuffer(1);
  87.     } else
  88.         frontbuffer();
  89. }
  90.  
  91. quit()
  92. {
  93.     vexit();
  94.     exit(0);
  95. }
  96.  
  97. resize()
  98. {
  99.     int    w, h;
  100.  
  101.     fprintf(stderr, "Resize proc\n");
  102. }
  103.  
  104. main(ac, av)
  105.     int    ac;
  106.     char    **av;
  107. {
  108.     Frame        frame;
  109.     Canvas        canvas;
  110.     Panel        panel;
  111.     int        w, h;
  112.     Notify_value    drawscene();
  113.  
  114.     frame = window_create(
  115.             0, FRAME,
  116.             FRAME_LABEL, av[1],
  117.         0);
  118.  
  119.     canvas = window_create(
  120.             frame, CANVAS,
  121.             CANVAS_RESIZE_PROC, resize,
  122.             WIN_HEIGHT, SIZE,
  123.             WIN_WIDTH, SIZE,
  124.         0);
  125.  
  126.  
  127.  
  128.     panel = window_create(
  129.             frame, PANEL, 
  130.             WIN_BELOW, canvas,
  131.             WIN_X, 0,
  132.         0);
  133.  
  134.  
  135.     panel_create_item(
  136.         panel, PANEL_BUTTON,
  137.         PANEL_LABEL_IMAGE, panel_button_image(panel, "Backface", 0, 0),
  138.  
  139.         PANEL_NOTIFY_PROC, do_back,
  140.     0);
  141.     panel_create_item(
  142.         panel, PANEL_BUTTON,
  143.         PANEL_LABEL_IMAGE, panel_button_image(panel, "Fill", 0, 0),
  144.  
  145.         PANEL_NOTIFY_PROC, do_fill,
  146.     0);
  147.     panel_create_item(
  148.         panel, PANEL_BUTTON,
  149.         PANEL_LABEL_IMAGE, panel_button_image(panel, "Hatch", 0, 0),
  150.  
  151.         PANEL_NOTIFY_PROC, do_hatch,
  152.     0);
  153.  
  154.     panel_create_item(
  155.         panel, PANEL_BUTTON,
  156.         PANEL_LABEL_IMAGE, panel_button_image(panel, "Scale", 0, 0),
  157.  
  158.         PANEL_NOTIFY_PROC, do_scale,
  159.     0);
  160.  
  161.     panel_create_item(
  162.         panel, PANEL_BUTTON,
  163.         PANEL_LABEL_IMAGE, panel_button_image(panel, "X-trans", 0, 0),
  164.  
  165.         PANEL_NOTIFY_PROC, do_x,
  166.     0);
  167.  
  168.     panel_create_item(
  169.         panel, PANEL_BUTTON,
  170.         PANEL_LABEL_IMAGE, panel_button_image(panel, "Y-trans", 0, 0),
  171.  
  172.         PANEL_NOTIFY_PROC, do_y,
  173.     0);
  174.  
  175.     panel_create_item(
  176.         panel, PANEL_BUTTON,
  177.         PANEL_LABEL_IMAGE, panel_button_image(panel, "Z-trans", 0, 0),
  178.  
  179.         PANEL_NOTIFY_PROC, do_z,
  180.     0);
  181.  
  182.     panel_create_item(
  183.         panel, PANEL_BUTTON,
  184.         PANEL_LABEL_IMAGE, panel_button_image(panel, "Double buffer", 0, 0),
  185.  
  186.         PANEL_NOTIFY_PROC, do_double,
  187.     0);
  188.  
  189.     panel_create_item(
  190.         panel, PANEL_BUTTON,
  191.         PANEL_LABEL_IMAGE, panel_button_image(panel, "QUIT", 0, 0),
  192.  
  193.         PANEL_NOTIFY_PROC, quit,
  194.     0);
  195.  
  196.     panel_create_item(
  197.         panel, PANEL_BUTTON,
  198.         PANEL_LABEL_IMAGE, panel_button_image(panel, " + ", 0, 0),
  199.  
  200.         PANEL_NOTIFY_PROC, do_plus,
  201.     0);
  202.     panel_create_item(
  203.         panel, PANEL_BUTTON,
  204.         PANEL_LABEL_IMAGE, panel_button_image(panel, " - ", 0, 0),
  205.  
  206.         PANEL_NOTIFY_PROC, do_minus,
  207.     0);
  208.  
  209.     window_fit(panel);
  210.     window_fit(frame);
  211.     w = (int)window_get(canvas, WIN_WIDTH);
  212.     h = (int)window_get(canvas, WIN_HEIGHT);
  213.     vo_sunview_canvas(canvas, w, h);
  214.     fprintf(stderr, "After vo_sunview_canvas\n");
  215.  
  216.     vinit("");
  217.  
  218.     fprintf(stderr, "After vinit(%d)\n", vdevice.initialised);
  219.  
  220.     setup_lcube();
  221.     fprintf(stderr, "After setup lcube(%d)\n", vdevice.initialised);
  222.  
  223. #undef USE_TIMER
  224. #ifdef USE_TIMER
  225. /* The following sets the timer */
  226.  
  227.     /* FAST AS POSSIBLE */
  228.  
  229.     notify_set_itimer_func(frame,
  230.         (Notify_func)drawscene, ITIMER_REAL, &NOTIFY_POLLING_ITIMER, NULL);
  231.  
  232.     window_main_loop(frame);
  233.  
  234. #else
  235.     window_set(frame, WIN_SHOW, TRUE, NULL);
  236.  
  237.     while(1) {
  238.         notify_dispatch();
  239.         drawscene((Notify_client)canvas, 1);
  240.     }
  241. #endif
  242. }
  243.  
  244. Notify_value
  245. drawscene(c, fd)
  246.     Notify_client c;
  247.     int    fd;
  248. {
  249.     float    x, y;
  250.  
  251.     but = slocator(&x, &y);
  252.     pushmatrix();
  253.         rotate(100.0 * x, 'y');
  254.         rotate(100.0 * y, 'x');
  255.         color(BLACK);
  256.         clear();
  257.         callobj(FILLED);    /* The filled or hatched one */
  258. /*
  259.         if (nplanes == 1 && (fill || hatch))
  260.             callobj(OUTLINE);    /* The outline */
  261.  
  262.     popmatrix();
  263.  
  264.     if (doubleb)
  265.         swapbuffers();
  266.  
  267.     return NOTIFY_DONE;
  268. }
  269.  
  270.