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 #ifndef lint
00037 static const char RCSid[] = "@(#)$Header: /cvsroot/brlcad/brlcad/src/librt/nurb_util.c,v 14.12 2006/09/16 02:04:25 lbutler Exp $ (ARL)";
00038 #endif
00039 
00040 #include "common.h"
00041 
00042 
00043 
00044 #include <stdio.h>
00045 #include "machine.h"
00046 #include "vmath.h"
00047 #include "nmg.h"
00048 #include "raytrace.h"
00049 #include "nurb.h"
00050 
00051 
00052 
00053 struct face_g_snurb *
00054 rt_nurb_new_snurb(int u_order, int v_order, int n_u, int n_v, int n_rows, int n_cols, int pt_type, struct resource *res)
00055 {
00056         register struct face_g_snurb * srf;
00057         int pnum;
00058 
00059         GET_SNURB(srf);
00060         srf->order[0] = u_order;
00061         srf->order[1] = v_order;
00062         srf->dir = RT_NURB_SPLIT_ROW;
00063 
00064         srf->u.k_size = n_u;
00065         srf->v.k_size = n_v;
00066         srf->s_size[0] = n_rows;
00067         srf->s_size[1] = n_cols;
00068         srf->pt_type = pt_type;
00069 
00070         pnum = sizeof (fastf_t) * n_rows * n_cols * RT_NURB_EXTRACT_COORDS(pt_type);
00071 
00072         srf->u.knots = (fastf_t *) bu_malloc (
00073                         n_u * sizeof (fastf_t ), "rt_nurb_new_snurb: u kv knot values");
00074         srf->v.knots = (fastf_t *) bu_malloc (
00075                         n_v * sizeof (fastf_t ), "rt_nurb_new_snurb: v kv knot values");
00076         srf->ctl_points = ( fastf_t *) bu_malloc(
00077                         pnum, "rt_nurb_new_snurb: control mesh points");
00078 
00079         return srf;
00080 }
00081 
00082 
00083 struct edge_g_cnurb *
00084 rt_nurb_new_cnurb(int order, int n_knots, int n_pts, int pt_type)
00085 {
00086         register struct edge_g_cnurb * crv;
00087 
00088         GET_CNURB(crv);
00089         crv->order = order;
00090 
00091         crv->k.k_size = n_knots;
00092         crv->k.knots = (fastf_t *)
00093                 bu_malloc(n_knots * sizeof(fastf_t),
00094                         "rt_nurb_new_cnurb: knot values");
00095 
00096         crv->c_size = n_pts;
00097         crv->pt_type = pt_type;
00098 
00099         crv->ctl_points = (fastf_t *)
00100                 bu_malloc( sizeof(fastf_t) * RT_NURB_EXTRACT_COORDS(pt_type) *
00101                         n_pts,
00102                         "rt_nurb_new_cnurb: mesh point values");
00103 
00104         return crv;
00105 }
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 void
00115 rt_nurb_clean_snurb(struct face_g_snurb *srf, struct resource *res)
00116 {
00117         NMG_CK_SNURB(srf);
00118 
00119         bu_free( (char *)srf->u.knots, "rt_nurb_clean_snurb() u.knots" );
00120         bu_free( (char *)srf->v.knots, "rt_nurb_free_snurb() v.knots" );
00121         bu_free( (char *)srf->ctl_points, "rt_nurb_free_snurb() ctl_points");
00122 
00123         
00124         srf->u.knots = (fastf_t *)NULL;
00125         srf->v.knots = (fastf_t *)NULL;
00126         srf->ctl_points = (fastf_t *)NULL;
00127         srf->order[0] = srf->order[1] = -1;
00128         srf->l.magic = 0;
00129 }
00130 
00131 
00132 
00133 
00134 void
00135 rt_nurb_free_snurb(struct face_g_snurb *srf, struct resource *res)
00136 {
00137         NMG_CK_SNURB(srf);
00138 
00139         
00140 
00141         bu_free( (char *)srf->u.knots, "rt_nurb_free_snurb: u kv knots" );
00142         bu_free( (char *)srf->v.knots, "rt_nurb_free_snurb: v kv knots" );
00143         bu_free( (char *)srf->ctl_points, "rt_nurb_free_snurb: mesh points");
00144 
00145         srf->l.magic = 0;
00146         bu_free( (char *)srf, "rt_nurb_free_snurb: snurb struct" );
00147 }
00148 
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 void
00158 rt_nurb_clean_cnurb(struct edge_g_cnurb *crv)
00159 {
00160         NMG_CK_CNURB(crv);
00161         bu_free( (char*)crv->k.knots, "rt_nurb_free_cnurb: knots");
00162         bu_free( (char*)crv->ctl_points, "rt_nurb_free_cnurb: control points");
00163         
00164         crv->k.knots = (fastf_t *)NULL;
00165         crv->ctl_points = (fastf_t *)NULL;
00166         crv->c_size = 0;
00167         crv->order = -1;
00168         crv->l.magic = 0;
00169 }
00170 
00171 
00172 
00173 
00174 
00175 
00176 void
00177 rt_nurb_free_cnurb(struct edge_g_cnurb *crv)
00178 {
00179         NMG_CK_CNURB(crv);
00180         bu_free( (char*)crv->k.knots, "rt_nurb_free_cnurb: knots");
00181         bu_free( (char*)crv->ctl_points, "rt_nurb_free_cnurb: control points");
00182         crv->l.magic = 0;               
00183         bu_free( (char*)crv, "rt_nurb_free_cnurb: cnurb struct");
00184 }
00185 
00186 void
00187 rt_nurb_c_print(const struct edge_g_cnurb *crv)
00188 {
00189         register fastf_t * ptr;
00190         int i,j;
00191 
00192         NMG_CK_CNURB(crv);
00193         bu_log("curve = {\n");
00194         bu_log("\tOrder = %d\n", crv->order);
00195         bu_log("\tKnot Vector = {\n\t\t");
00196 
00197         for( i = 0; i < crv->k.k_size; i++)
00198                 bu_log("%10.8f ", crv->k.knots[i]);
00199 
00200         bu_log("\n\t}\n");
00201         bu_log("\t");
00202         rt_nurb_print_pt_type(crv->pt_type);
00203         bu_log("\tmesh = {\n");
00204         for( ptr = &crv->ctl_points[0], i= 0;
00205                 i < crv->c_size; i++, ptr += RT_NURB_EXTRACT_COORDS(crv->pt_type))
00206         {
00207                 bu_log("\t\t");
00208                 for(j = 0; j < RT_NURB_EXTRACT_COORDS(crv->pt_type); j++)
00209                         bu_log("%4.5f\t", ptr[j]);
00210                 bu_log("\n");
00211 
00212         }
00213         bu_log("\t}\n}\n");
00214 
00215 
00216 }
00217 
00218 void
00219 rt_nurb_s_print(char *c, const struct face_g_snurb *srf)
00220 {
00221 
00222     bu_log("%s\n", c );
00223 
00224     bu_log("order %d %d\n", srf->order[0], srf->order[1] );
00225 
00226     bu_log( "u knot vector \n");
00227 
00228     rt_nurb_pr_kv( &srf->u );
00229 
00230     bu_log( "v knot vector \n");
00231 
00232     rt_nurb_pr_kv( &srf->v );
00233 
00234     rt_nurb_pr_mesh( srf );
00235 
00236 }
00237 
00238 void
00239 rt_nurb_pr_kv(const struct knot_vector *kv)
00240 {
00241     register fastf_t * ptr = kv->knots;
00242     int i;
00243 
00244     bu_log("[%d]\t", kv->k_size );
00245 
00246 
00247     for( i = 0; i < kv->k_size; i++)
00248     {
00249         bu_log("%2.5f  ", *ptr++);
00250     }
00251     bu_log("\n");
00252 }
00253 
00254 void
00255 rt_nurb_pr_mesh(const struct face_g_snurb *m)
00256 {
00257         int i,j,k;
00258         fastf_t * m_ptr = m->ctl_points;
00259         int evp = RT_NURB_EXTRACT_COORDS(m->pt_type);
00260 
00261         NMG_CK_SNURB(m);
00262 
00263         bu_log("\t[%d] [%d]\n", m->s_size[0], m->s_size[1] );
00264 
00265         for( i = 0; i < m->s_size[0]; i++)
00266         {
00267                 for( j =0; j < m->s_size[1]; j++)
00268                 {
00269                         bu_log("\t");
00270 
00271                         for(k = 0; k < evp; k++)
00272                                 bu_log("%f    ", m_ptr[k]);
00273 
00274                         bu_log("\n");
00275                         m_ptr += RT_NURB_EXTRACT_COORDS(m->pt_type);
00276                 }
00277                 bu_log("\n");
00278         }
00279 }
00280 
00281 void
00282 rt_nurb_print_pt_type(int c)
00283 {
00284         int rat;
00285 
00286         rat = RT_NURB_IS_PT_RATIONAL(c);
00287 
00288         if( RT_NURB_EXTRACT_PT_TYPE(c) == RT_NURB_PT_XY)
00289                 bu_log("Point Type = RT_NURB_PT_XY");
00290         else
00291         if( RT_NURB_EXTRACT_PT_TYPE(c) == RT_NURB_PT_XYZ)
00292                 bu_log("Point Type = RT_NURB_PT_XYX");
00293         else
00294         if( RT_NURB_EXTRACT_PT_TYPE(c) == RT_NURB_PT_UV)
00295                 bu_log("Point Type = RT_NURB_PT_UV");
00296 
00297         if( rat )
00298                 bu_log("W\n");
00299         else
00300                 bu_log("\n");
00301 }
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311