home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / toollib_2 / Examples / Tree / Builds / c / treeparams < prev    next >
Encoding:
Text File  |  1996-06-13  |  4.2 KB  |  125 lines

  1. /*** treeparams.h ***/
  2. /* A (shared) window containing the tree parameters
  3.  * (c) Paul Field 1995
  4.  * v1.00 - 22/11/1995
  5.  */
  6.  
  7. #include "treeparams.h"
  8.  
  9. #include <assert.h>
  10.  
  11. #include "hourglass.h"
  12. #include "numberrange.h"
  13. #include "toolbox.h"
  14.  
  15. #include "error.h"
  16. #include "exception.h"
  17. #include "nev_toolbox.h"
  18.  
  19. #include "line_storer.h"
  20. #include "tree.h"
  21. #include "treewindow.h"
  22.  
  23.  
  24. /* Macros for converting between MM and OS units */
  25. /* The conversion factor for mm to os is 907/128 is about 180/25.4 and for os to mm is 18/128 is about 25.4/180
  26.  * because there are 180 OS units in an Inch and 25.4 mm in an Inch.
  27.  * A division factor of 128 is used because division by a power of 2 is optimised to a bit shift by
  28.  * Norcroft C.
  29.  */
  30.  
  31. #define MMtoOS(mm) (((mm)*908+64)/128)
  32. #define OStoMM(os) (((os)*18+64)/128)
  33.  
  34.  
  35. /* Actions that concern this window */
  36. enum { action_DRAW_TREE = 0x100 };
  37.  
  38.  
  39. /* Gadgets in the parameters window */
  40. enum
  41.  { segments_id,
  42.    length_id,
  43.    length_scale_id,
  44.    left_offset_id,
  45.    right_offset_id,
  46.    angle_id,
  47.    angle_scale_id,
  48.    depth_id,
  49.    length_scale_scale_id
  50.  };
  51.  
  52.  
  53. /* Object id of the parameter window */
  54. static toolbox_o tree_params_id;
  55.  
  56.  
  57.  
  58. static void tree_params_fill(const tree_def *tree)
  59.  { numberrange_set_value(0, tree_params_id, length_id, OStoMM(tree->initial_state.segment_length));
  60.    numberrange_set_value(0, tree_params_id, angle_id,  tree->initial_state.branch_angle);
  61.    numberrange_set_value(0, tree_params_id, depth_id,  tree->initial_state.remaining_depth);
  62.  
  63.    numberrange_set_value(0, tree_params_id, segments_id,           tree->parameters.segments);
  64.    numberrange_set_value(0, tree_params_id, left_offset_id,        (int)(tree->parameters.left_proportion    * 100.0));
  65.    numberrange_set_value(0, tree_params_id, right_offset_id,       (int)(tree->parameters.right_proportion   * 100.0));
  66.    numberrange_set_value(0, tree_params_id, length_scale_id,       (int)(tree->parameters.length_scale       * 100.0));
  67.    numberrange_set_value(0, tree_params_id, length_scale_scale_id, (int)(tree->parameters.length_scale_scale * 100.0));
  68.    numberrange_set_value(0, tree_params_id, angle_scale_id,        (int)(tree->parameters.angle_scale        * 100.0));
  69.  }
  70.  
  71.  
  72.  
  73. static nevent_result tree_params_draw(bits action_code, toolbox_action *action, toolbox_block *id_block, void *handle)
  74.  { tree_def  tree;
  75.  
  76.    assert(action_code == action_DRAW_TREE);
  77.    assert(id_block->this_obj == tree_params_id);
  78.    NOT_USED(action_code);
  79.    NOT_USED(action);
  80.    NOT_USED(id_block);
  81.    NOT_USED(handle);
  82.  
  83.    tree.initial_state.segment_length  = MMtoOS(numberrange_get_value(0, tree_params_id, length_id));
  84.    tree.initial_state.tree_angle      = 0;
  85.    tree.initial_state.branch_angle    = numberrange_get_value(0, tree_params_id, angle_id);
  86.    tree.initial_state.remaining_depth = numberrange_get_value(0, tree_params_id, depth_id);
  87.  
  88.    tree.parameters.segments           = numberrange_get_value(0, tree_params_id, segments_id);
  89.    tree.parameters.left_proportion    = numberrange_get_value(0, tree_params_id, left_offset_id) / 100.0;
  90.    tree.parameters.right_proportion   = numberrange_get_value(0, tree_params_id, right_offset_id) / 100.0;
  91.    tree.parameters.length_scale       = numberrange_get_value(0, tree_params_id, length_scale_id) / 100.0;
  92.    tree.parameters.length_scale_scale = numberrange_get_value(0, tree_params_id, length_scale_scale_id) / 100.0;
  93.    tree.parameters.angle_scale        = numberrange_get_value(0, tree_params_id, angle_scale_id) / 100.0;
  94.  
  95.    /* Update the window parameters to reflect the value actually read.
  96.     * For example, the user could type in an out-of-range value which will be returned
  97.     * as the maximum (or minimum) value but not updated on screen without this call
  98.     */
  99.    tree_params_fill(&tree);
  100.  
  101.    try
  102.     { hourglass_on();
  103.       tree_calculate(640, 200, &tree, &line_storer);
  104.       hourglass_off();
  105.     }
  106.    catch
  107.     { /* If there's an error we'll report it and then carry on -
  108.        * the user will see an incomplete tree
  109.        */
  110.       error_report_exception(exception_current());
  111.     }
  112.    catch_end
  113.  
  114.    tree_window_update();
  115.  
  116.    return nevent_HANDLED;
  117.  }
  118.  
  119.  
  120.  
  121. void tree_params_initialise(void)
  122.  { tree_params_id = toolbox_create_object(0, (toolbox_id)"Parameters");
  123.    nevent_toolbox_register_handler(tree_params_id, action_DRAW_TREE, tree_params_draw, NULL);
  124.  }
  125.