segment.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:12k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * MODULE NAME: segment.c
  3.  *
  4.  * FUNCTION:
  5.  * This module contains code that draws cylinder sections.  There are a
  6.  * number of different segment routines presented: with and without colors,
  7.  * with and without normals, with and without front and back normals.
  8.  *
  9.  * HISTORY:
  10.  * written by Linas Vepstas August/September 1991
  11.  * split into multiple compile units, Linas, October 1991
  12.  * added normal vectors Linas, October 1991
  13.  * consoldated from other modules,  Linas Vepstas, March 1993
  14.  */
  15. #include <malloc.h>
  16. #include <stdlib.h>
  17. #include <math.h>
  18. #include <string.h> /* for the memcpy() subroutine */
  19. #include "GL/tube.h"
  20. #include "port.h"
  21. #include "extrude.h"
  22. #include "tube_gc.h"
  23. #include "segment.h"
  24. /* ============================================================ */
  25. void draw_segment_plain (int ncp, /* number of contour points */
  26.                          gleDouble front_contour[][3],
  27.                          gleDouble back_contour[][3],
  28.                          int inext, double len)
  29. {
  30.    int j;
  31.    /* draw the tube segment */
  32.    BGNTMESH (inext, len);
  33.    for (j=0; j<ncp; j++) {
  34.       V3F (front_contour[j], j, FRONT);
  35.       V3F (back_contour[j], j, BACK);
  36.    }
  37.    if (__TUBE_CLOSE_CONTOUR) {
  38.       /* connect back up to first point of contour */
  39.       V3F (front_contour[0], 0, FRONT);
  40.       V3F (back_contour[0], 0, BACK);
  41.    }
  42.    ENDTMESH ();
  43. }
  44. /* ============================================================ */
  45. void draw_segment_color (int ncp, /* number of contour points */
  46.                          gleDouble front_contour[][3],
  47.                          gleDouble back_contour[][3],
  48.                          float color_last[3],
  49.                          float color_next[3],
  50.                          int inext, double len)
  51. {
  52.    int j;
  53.    /* draw the tube segment */
  54.    BGNTMESH (inext, len);
  55.    for (j=0; j<ncp; j++) {
  56.       C3F (color_last);
  57.       V3F (front_contour[j], j, FRONT);
  58.       C3F (color_next);
  59.       V3F (back_contour[j], j, BACK);
  60.    }
  61.    if (__TUBE_CLOSE_CONTOUR) {
  62.       /* connect back up to first point of contour */
  63.       C3F (color_last);
  64.       V3F (front_contour[0], 0, FRONT);
  65.       C3F (color_next);
  66.       V3F (back_contour[0], 0, BACK);
  67.    }
  68.    ENDTMESH ();
  69. }
  70. /* ============================================================ */
  71. void draw_segment_edge_n (int ncp, /* number of contour points */
  72.                            gleDouble front_contour[][3],
  73.                            gleDouble back_contour[][3],
  74.                            double norm_cont[][3],
  75.                            int inext, double len)
  76. {
  77.    int j;
  78.    /* draw the tube segment */
  79.    BGNTMESH (inext,len);
  80.    for (j=0; j<ncp; j++) {
  81.       N3F_D (norm_cont[j]);
  82.       V3F (front_contour[j], j, FRONT);
  83.       V3F (back_contour[j], j, BACK);
  84.    }
  85.    if (__TUBE_CLOSE_CONTOUR) {
  86.       /* connect back up to first point of contour */
  87.       N3F_D (norm_cont[0]);
  88.       V3F (front_contour[0], 0, FRONT);
  89.       V3F (back_contour[0], 0, BACK);
  90.    }
  91.    ENDTMESH ();
  92. }
  93. /* ============================================================ */
  94. void draw_segment_c_and_edge_n (int ncp, /* number of contour points */
  95.                            gleDouble front_contour[][3],
  96.                            gleDouble back_contour[][3],
  97.                            double norm_cont[][3],
  98.                            float color_last[3],
  99.                            float color_next[3],
  100.                            int inext, double len)
  101. {
  102.    int j;
  103.    /* draw the tube segment */
  104.    BGNTMESH (inext, len);
  105.    for (j=0; j<ncp; j++) {
  106.       C3F (color_last);
  107.       N3F_D (norm_cont[j]);
  108.       V3F (front_contour[j], j, FRONT);
  109.       C3F (color_next);
  110.       N3F_D (norm_cont[j]);
  111.       V3F (back_contour[j], j, BACK);
  112.    }
  113.    if (__TUBE_CLOSE_CONTOUR) {
  114.       /* connect back up to first point of contour */
  115.       C3F (color_last);
  116.       N3F_D (norm_cont[0]);
  117.       V3F (front_contour[0], 0, FRONT);
  118.    
  119.       C3F (color_next);
  120.       N3F_D (norm_cont[0]);
  121.       V3F (back_contour[0], 0, BACK);
  122.    }
  123.    ENDTMESH ();
  124. }
  125. /* ============================================================ */
  126. void draw_segment_facet_n (int ncp, /* number of contour points */
  127.                            gleDouble front_contour[][3],
  128.                            gleDouble back_contour[][3],
  129.                            double norm_cont[][3],
  130.                            int inext, double len)
  131. {
  132.    int j;
  133.    /* draw the tube segment */
  134.    BGNTMESH (inext, len);
  135.    for (j=0; j<ncp-1; j++) {
  136.       N3F_D (norm_cont[j]);
  137.       V3F (front_contour[j], j, FRONT);
  138.       V3F (back_contour[j], j, BACK);
  139.       V3F (front_contour[j+1], j+1, FRONT);
  140.       V3F (back_contour[j+1], j+1, BACK);
  141.    }
  142.    if (__TUBE_CLOSE_CONTOUR) {
  143.       /* connect back up to first point of contour */
  144.       N3F_D (norm_cont[ncp-1]);
  145.       V3F (front_contour[ncp-1], ncp-1, FRONT);
  146.       V3F (back_contour[ncp-1], ncp-1, BACK);
  147.       V3F (front_contour[0], 0, FRONT);
  148.       V3F (back_contour[0], 0, BACK);
  149.    }
  150.    ENDTMESH ();
  151. }
  152. /* ============================================================ */
  153. void draw_segment_c_and_facet_n (int ncp, /* number of contour points */
  154.                            gleDouble front_contour[][3],
  155.                            gleDouble back_contour[][3],
  156.                            double norm_cont[][3],
  157.                            float color_last[3],
  158.                            float color_next[3],
  159.                            int inext, double len)
  160. {
  161.    int j;
  162.    /* Note about this code:
  163.     * At first, when looking at this code, it appears to be really dumb:
  164.     * the N3F() call appears to be repeated multiple times, for no
  165.     * apparent purpose.  It would seem that a performance improvement
  166.     * would be gained by stripping it out. !DONT DO IT!
  167.     * When there are no local lights or viewers, the V3F() subroutine
  168.     * does not trigger a recalculation of the lighting equations.
  169.     * However, we MUST trigger lighting, since otherwise colors come out
  170.     * wrong.  Trigger lighting by doing an N3F call.
  171.     */
  172.    /* draw the tube segment */
  173.    BGNTMESH (inext, len);
  174.    for (j=0; j<ncp-1; j++) {
  175.       C3F (color_last);
  176.       N3F_D (norm_cont[j]);
  177.       V3F (front_contour[j], j, FRONT);
  178.       C3F (color_next);
  179.       N3F_D (norm_cont[j]);
  180.       V3F (back_contour[j], j, BACK);
  181.       C3F (color_last);
  182.       N3F_D (norm_cont[j]);
  183.       V3F (front_contour[j+1], j+1, FRONT);
  184.       C3F (color_next);
  185.       N3F_D (norm_cont[j]);
  186.       V3F (back_contour[j+1], j+1, BACK);
  187.    }
  188.    if (__TUBE_CLOSE_CONTOUR) {
  189.       /* connect back up to first point of contour */
  190.       C3F (color_last);
  191.       N3F_D (norm_cont[ncp-1]);
  192.       V3F (front_contour[ncp-1], ncp-1, FRONT);
  193.    
  194.       C3F (color_next);
  195.       N3F_D (norm_cont[ncp-1]);
  196.       V3F (back_contour[ncp-1], ncp-1, BACK);
  197.    
  198.       C3F (color_last);
  199.       N3F_D (norm_cont[ncp-1]);
  200.       V3F (front_contour[0], 0, FRONT);
  201.    
  202.       C3F (color_next);
  203.       N3F_D (norm_cont[ncp-1]);
  204.       V3F (back_contour[0], 0, BACK);
  205.    }
  206.    ENDTMESH ();
  207. }
  208. /* ============================================================ */
  209. /* ============================================================ */
  210. /* 
  211.  * This routine draws a segment with normals specified at each end.
  212.  */
  213. void draw_binorm_segment_edge_n (int ncp,      /* number of contour points */
  214.                            double front_contour[][3],
  215.                            double back_contour[][3],
  216.                            double front_norm[][3],
  217.                            double back_norm[][3],
  218.                            int inext, double len)
  219. {
  220.    int j;
  221.    /* draw the tube segment */
  222.    BGNTMESH (inext, len);
  223.    for (j=0; j<ncp; j++) {
  224.       N3F_D (front_norm[j]);
  225.       V3F_D (front_contour[j], j, FRONT);
  226.       N3F_D (back_norm[j]);
  227.       V3F_D (back_contour[j], j, BACK);
  228.    }
  229.    if (__TUBE_CLOSE_CONTOUR) {
  230.       /* connect back up to first point of contour */
  231.       N3F_D (front_norm[0]);
  232.       V3F_D (front_contour[0], 0, FRONT);
  233.       N3F_D (back_norm[0]);
  234.       V3F_D (back_contour[0], 0, BACK);
  235.    }
  236.    ENDTMESH ();
  237. }
  238. /* ============================================================ */
  239. void draw_binorm_segment_c_and_edge_n (int ncp, /* number of contour points */
  240.                            double front_contour[][3],
  241.                            double back_contour[][3],
  242.                            double front_norm[][3],
  243.                            double back_norm[][3],
  244.                            float color_last[3],
  245.                            float color_next[3],
  246.                            int inext, double len)
  247. {
  248.    int j;
  249.    /* draw the tube segment */
  250.    BGNTMESH (inext, len);
  251.    for (j=0; j<ncp; j++) {
  252.       C3F (color_last);
  253.       N3F_D (front_norm[j]);
  254.       V3F_D (front_contour[j], j, FRONT);
  255.       C3F (color_next);
  256.       N3F_D (back_norm[j]);
  257.       V3F_D (back_contour[j], j, BACK);
  258.    }
  259.    if (__TUBE_CLOSE_CONTOUR) {
  260.       /* connect back up to first point of contour */
  261.       C3F (color_last);
  262.       N3F_D (front_norm[0]);
  263.       V3F_D (front_contour[0], 0, FRONT);
  264.    
  265.       C3F (color_next);
  266.       N3F_D (back_norm[0]);
  267.       V3F_D (back_contour[0], 0, BACK);
  268.    }
  269.    ENDTMESH ();
  270. }
  271. /* ============================================================ */
  272. /* 
  273.  * This routine draws a piece of the round segment with psuedo-facet
  274.  * normals.  I say "psuedo-facet" because the resulting object looks 
  275.  * much, much better than real facet normals, and is what the  round
  276.  * join style was meant to accomplish for face normals.   
  277.  */
  278. void draw_binorm_segment_facet_n (int ncp,      /* number of contour points */
  279.                            double front_contour[][3],
  280.                            double back_contour[][3],
  281.                            double front_norm[][3],
  282.                            double back_norm[][3],
  283.                            int inext, double len)
  284. {
  285.    int j;
  286.    /* draw the tube segment */
  287.    BGNTMESH (inext, len);
  288.    for (j=0; j<ncp-1; j++) {
  289.       N3F_D (front_norm[j]);
  290.       V3F_D (front_contour[j], j, FRONT);
  291.       N3F_D (back_norm[j]);
  292.       V3F_D (back_contour[j], j, BACK);
  293.       N3F_D (front_norm[j]);
  294.       V3F_D (front_contour[j+1], j+1, FRONT);
  295.       N3F_D (back_norm[j]);
  296.       V3F_D (back_contour[j+1], j+1, BACK);
  297.    }
  298.    if (__TUBE_CLOSE_CONTOUR) {
  299.       /* connect back up to first point of contour */
  300.       N3F_D (front_norm[ncp-1]);
  301.       V3F_D (front_contour[ncp-1], ncp-1, FRONT);
  302.       N3F_D (back_norm[ncp-1]);
  303.       V3F_D (back_contour[ncp-1], ncp-1, BACK);
  304.       N3F_D (front_norm[ncp-1]);
  305.       V3F_D (front_contour[0], 0, FRONT);
  306.       N3F_D (back_norm[ncp-1]);
  307.       V3F_D (back_contour[0], 0, BACK);
  308.    }
  309.    ENDTMESH ();
  310. }
  311. /* ============================================================ */
  312. void draw_binorm_segment_c_and_facet_n (int ncp,
  313.                            double front_contour[][3],
  314.                            double back_contour[][3],
  315.                            double front_norm[][3],
  316.                            double back_norm[][3],
  317.                            float color_last[3],
  318.                            float color_next[3],
  319.                            int inext, double len)
  320. {
  321.    int j;
  322.    /* draw the tube segment */
  323.    BGNTMESH (inext, len);
  324.    for (j=0; j<ncp-1; j++) {
  325.       C3F (color_last);
  326.       N3F_D (front_norm[j]);
  327.       V3F_D (front_contour[j], j, FRONT);
  328.       C3F (color_next);
  329.       N3F_D (back_norm[j]);
  330.       V3F_D (back_contour[j], j, BACK);
  331.       C3F (color_last);
  332.       N3F_D (front_norm[j]);
  333.       V3F_D (front_contour[j+1], j+1, FRONT);
  334.       C3F (color_next);
  335.       N3F_D (back_norm[j]);
  336.       V3F_D (back_contour[j+1], j+1, BACK);
  337.    }
  338.    if (__TUBE_CLOSE_CONTOUR) {
  339.       /* connect back up to first point of contour */
  340.       C3F (color_last);
  341.       N3F_D (front_norm[ncp-1]);
  342.       V3F_D (front_contour[ncp-1], ncp-1, FRONT);
  343.    
  344.       C3F (color_next);
  345.       N3F_D (back_norm[ncp-1]);
  346.       V3F_D (back_contour[ncp-1], ncp-1, BACK);
  347.    
  348.       C3F (color_last);
  349.       N3F_D (front_norm[ncp-1]);
  350.       V3F_D (front_contour[0], 0, FRONT);
  351.    
  352.       C3F (color_next);
  353.       N3F_D (back_norm[ncp-1]);
  354.       V3F_D (back_contour[0], 0, BACK);
  355.    }
  356.    ENDTMESH ();
  357. }
  358. /* ==================== END OF FILE =========================== */