00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include "common.h"
00041
00042
00043
00044 #include <stdio.h>
00045 #include <sys/types.h>
00046 #include <fcntl.h>
00047
00048 #include "machine.h"
00049 #include "vmath.h"
00050 #include "raytrace.h"
00051 #include "nurb.h"
00052 #include "plot3.h"
00053
00054
00055
00056
00057 void
00058 rt_nurb_plot_snurb(FILE *fp, const struct face_g_snurb *srf)
00059 {
00060 int i,j;
00061 const fastf_t * m_ptr = srf->ctl_points;
00062 int evp = RT_NURB_EXTRACT_COORDS( srf->pt_type);
00063 int rat = RT_NURB_IS_PT_RATIONAL( srf->pt_type);
00064 point_t pt;
00065
00066 NMG_CK_SNURB(srf);
00067
00068 for( i = 0; i < srf->s_size[0]; i++)
00069 {
00070 for( j = 0; j < srf->s_size[1]; j++)
00071 {
00072 if ( rat )
00073 {
00074 pt[0] = m_ptr[0]/ m_ptr[3];
00075 pt[1] = m_ptr[1]/ m_ptr[3];
00076 pt[2] = m_ptr[2]/ m_ptr[3];
00077 } else
00078 {
00079 pt[0] = m_ptr[0];
00080 pt[1] = m_ptr[1];
00081 pt[2] = m_ptr[2];
00082
00083 }
00084
00085 if( j == 0)
00086 {
00087 pdv_3move( fp, pt );
00088 } else
00089 pdv_3cont( fp, pt );
00090
00091 m_ptr += evp;
00092 }
00093 }
00094
00095 for( j = 0; j < srf->s_size[1]; j++)
00096 {
00097 int stride;
00098 stride = srf->s_size[1] * evp;
00099 m_ptr = &srf->ctl_points[j * evp];
00100 for( i = 0; i < srf->s_size[0]; i++)
00101 {
00102 if ( rat )
00103 {
00104 pt[0] = m_ptr[0]/ m_ptr[3];
00105 pt[1] = m_ptr[1]/ m_ptr[3];
00106 pt[2] = m_ptr[2]/ m_ptr[3];
00107 } else
00108 {
00109 pt[0] = m_ptr[0];
00110 pt[1] = m_ptr[1];
00111 pt[2] = m_ptr[2];
00112
00113 }
00114
00115
00116 if( i == 0)
00117 pdv_3move( fp, pt );
00118 else
00119 pdv_3cont( fp, pt );
00120
00121 m_ptr += stride;
00122 }
00123 }
00124 }
00125
00126
00127
00128
00129 void
00130 rt_nurb_plot_cnurb(FILE *fp, const struct edge_g_cnurb *crv)
00131 {
00132 register int i, k;
00133 const fastf_t * m_ptr = crv->ctl_points;
00134 int evp = RT_NURB_EXTRACT_COORDS( crv->pt_type);
00135 int rat = RT_NURB_IS_PT_RATIONAL( crv->pt_type);
00136 point_t ptr;
00137
00138 for( i = 0; i < crv->c_size; i++) {
00139 if( rat )
00140 {
00141 for(k = 0; k < evp; k++)
00142 ptr[k] = m_ptr[k] / m_ptr[evp-1];
00143
00144 } else
00145 {
00146 for(k = 0; k < evp; k++)
00147 ptr[k] = m_ptr[k];
00148
00149 }
00150 if( i == 0 )
00151 pdv_3move( fp, ptr );
00152 else
00153 pdv_3cont( fp, ptr );
00154 m_ptr += evp;
00155 }
00156 }
00157
00158
00159 void rt_nurb_setfile(int n)
00160 {
00161 pl_color(stdout, n * 25 % 255, n * 50 % 255, n * 75 %255);
00162 }
00163
00164 void
00165 rt_nurb_closefile(void)
00166 {
00167 }
00168
00169 void rt_nurb_s_plot(const struct face_g_snurb *srf)
00170 {
00171 rt_nurb_plot_snurb( stdout, srf );
00172 }
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182