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 #include "common.h"
00039
00040
00041
00042 #include <stdio.h>
00043
00044 #include "machine.h"
00045 #include "vmath.h"
00046 #include "nmg.h"
00047 #include "raytrace.h"
00048 #include "nurb.h"
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 int
00066 rt_nurb_bezier(struct bu_list *bezier_hd, const struct face_g_snurb *orig_surf, struct resource *res)
00067 {
00068 struct face_g_snurb *s;
00069 int dir;
00070 struct bu_list todo;
00071
00072 NMG_CK_SNURB(orig_surf);
00073
00074 if( (dir = rt_bez_check( orig_surf )) == -1) {
00075 s = rt_nurb_scopy( orig_surf, res );
00076 BU_LIST_APPEND( bezier_hd, &s->l );
00077 return 1;
00078 }
00079
00080 BU_LIST_INIT( &todo );
00081 rt_nurb_s_split( &todo, orig_surf, dir, res );
00082
00083 while( BU_LIST_WHILE( s, face_g_snurb, &todo ) ) {
00084 if( (dir = rt_bez_check(s)) == -1) {
00085
00086 BU_LIST_DEQUEUE( &s->l );
00087 BU_LIST_APPEND( bezier_hd, &s->l );
00088 } else {
00089
00090 BU_LIST_DEQUEUE( &s->l );
00091 rt_nurb_s_split( &todo, s, dir, res );
00092 rt_nurb_free_snurb(s, res);
00093 }
00094 }
00095 return 0;
00096 }
00097
00098 int
00099 rt_bez_check(const struct face_g_snurb *srf)
00100 {
00101 NMG_CK_SNURB(srf);
00102
00103 if( srf->u.k_size > (2.0 * srf->order[0]))
00104 return 0;
00105 if( srf->v.k_size > (2.0 * srf->order[1]))
00106 return 1;
00107
00108 return -1;
00109 }
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 int
00121 nurb_crv_is_bezier(const struct edge_g_cnurb *crv)
00122 {
00123 int i;
00124 fastf_t knot_min, knot_max;
00125 int bezier=1;
00126
00127 knot_min = crv->k.knots[0];
00128 knot_max = crv->k.knots[crv->k.k_size-1];
00129
00130 for( i=1 ; i<crv->k.k_size-1 ; i++ )
00131 {
00132 if( crv->k.knots[i] != knot_min && crv->k.knots[i] != knot_max )
00133 {
00134 bezier = 0;
00135 break;
00136 }
00137 }
00138
00139 return( bezier );
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149 void
00150 nurb_c_to_bezier(struct bu_list *clist, struct edge_g_cnurb *crv)
00151 {
00152 fastf_t knot_min, knot_max;
00153 int i;
00154 struct edge_g_cnurb *crv1, *crv_copy;
00155 int done;
00156
00157
00158 crv_copy = rt_nurb_crv_copy( crv );
00159
00160
00161 done = 0;
00162 while( !done )
00163 {
00164 fastf_t split;
00165
00166 knot_min = crv_copy->k.knots[0];
00167 knot_max = crv_copy->k.knots[crv_copy->k.k_size-1];
00168
00169 split = MAX_FASTF;
00170 for( i=1 ; i<crv_copy->k.k_size-1 ; i++ )
00171 {
00172 if( crv_copy->k.knots[i] != knot_min && crv_copy->k.knots[i] != knot_max )
00173 {
00174 split = crv_copy->k.knots[i];
00175 break;
00176 }
00177 }
00178
00179 if( split == MAX_FASTF )
00180 {
00181 done = 1;
00182 BU_LIST_APPEND( clist, &crv_copy->l );
00183 break;
00184 }
00185
00186 crv1 = rt_nurb_c_xsplit( crv_copy, split );
00187
00188 rt_nurb_free_cnurb( crv_copy );
00189 crv_copy = BU_LIST_PNEXT( edge_g_cnurb, &crv1->l );
00190 BU_LIST_DEQUEUE( &crv_copy->l );
00191
00192 BU_LIST_APPEND( clist, &crv1->l );
00193 }
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204