00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "egg_parametrics.h"
00016 #include "config_egg2pg.h"
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 PT(NurbsSurfaceEvaluator)
00028 make_nurbs_surface(EggNurbsSurface *egg_surface, const LMatrix4d &mat) {
00029 if (egg_surface->get_u_order() < 1 || egg_surface->get_u_order() > 4) {
00030 egg2pg_cat.error()
00031 << "Invalid NURBSSurface U order for " << egg_surface->get_name() << ": "
00032 << egg_surface->get_u_order() << "\n";
00033 return NULL;
00034 }
00035
00036 if (egg_surface->get_v_order() < 1 || egg_surface->get_v_order() > 4) {
00037 egg2pg_cat.error()
00038 << "Invalid NURBSSurface V order for " << egg_surface->get_name() << ": "
00039 << egg_surface->get_v_order() << "\n";
00040 return NULL;
00041 }
00042
00043 PT(NurbsSurfaceEvaluator) nurbs = new NurbsSurfaceEvaluator;
00044
00045 nurbs->set_u_order(egg_surface->get_u_order());
00046 nurbs->set_v_order(egg_surface->get_v_order());
00047
00048 int num_u_vertices = egg_surface->get_num_u_cvs();
00049 int num_v_vertices = egg_surface->get_num_v_cvs();
00050 nurbs->reset(num_u_vertices, num_v_vertices);
00051 for (int ui = 0; ui < num_u_vertices; ui++) {
00052 for (int vi = 0; vi < num_v_vertices; vi++) {
00053 int i = egg_surface->get_vertex_index(ui, vi);
00054 EggVertex *egg_vertex = egg_surface->get_vertex(i);
00055 nurbs->set_vertex(ui, vi, LCAST(PN_stdfloat, egg_vertex->get_pos4() * mat));
00056
00057 LColor color = egg_vertex->get_color();
00058 nurbs->set_extended_vertices(ui, vi, 0, color.get_data(), 4);
00059 }
00060 }
00061
00062 int num_u_knots = egg_surface->get_num_u_knots();
00063 if (num_u_knots != nurbs->get_num_u_knots()) {
00064 egg2pg_cat.error()
00065 << "Invalid NURBSSurface number of U knots for "
00066 << egg_surface->get_name() << ": got " << num_u_knots
00067 << " knots, expected " << nurbs->get_num_u_knots() << "\n";
00068 return NULL;
00069 }
00070
00071 int num_v_knots = egg_surface->get_num_v_knots();
00072 if (num_v_knots != nurbs->get_num_v_knots()) {
00073 egg2pg_cat.error()
00074 << "Invalid NURBSSurface number of U knots for "
00075 << egg_surface->get_name() << ": got " << num_v_knots
00076 << " knots, expected " << nurbs->get_num_v_knots() << "\n";
00077 return NULL;
00078 }
00079
00080 int i;
00081 for (i = 0; i < num_u_knots; i++) {
00082 nurbs->set_u_knot(i, egg_surface->get_u_knot(i));
00083 }
00084 for (i = 0; i < num_v_knots; i++) {
00085 nurbs->set_v_knot(i, egg_surface->get_v_knot(i));
00086 }
00087
00088 return nurbs;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 PT(NurbsCurveEvaluator)
00101 make_nurbs_curve(EggNurbsCurve *egg_curve, const LMatrix4d &mat) {
00102 if (egg_curve->get_order() < 1 || egg_curve->get_order() > 4) {
00103 egg2pg_cat.error()
00104 << "Invalid NURBSCurve order for " << egg_curve->get_name() << ": "
00105 << egg_curve->get_order() << "\n";
00106 return NULL;
00107 }
00108
00109 PT(NurbsCurveEvaluator) nurbs = new NurbsCurveEvaluator;
00110 nurbs->set_order(egg_curve->get_order());
00111
00112 nurbs->reset(egg_curve->size());
00113 EggPrimitive::const_iterator pi;
00114 int vi = 0;
00115 for (pi = egg_curve->begin(); pi != egg_curve->end(); ++pi) {
00116 EggVertex *egg_vertex = (*pi);
00117 nurbs->set_vertex(vi, LCAST(PN_stdfloat, egg_vertex->get_pos4() * mat));
00118 LColor color = egg_vertex->get_color();
00119 nurbs->set_extended_vertices(vi, 0, color.get_data(), 4);
00120 vi++;
00121 }
00122
00123 int num_knots = egg_curve->get_num_knots();
00124 if (num_knots != nurbs->get_num_knots()) {
00125 egg2pg_cat.error()
00126 << "Invalid NURBSCurve number of knots for "
00127 << egg_curve->get_name() << ": got " << num_knots
00128 << " knots, expected " << nurbs->get_num_knots() << "\n";
00129 return NULL;
00130 }
00131
00132 for (int i = 0; i < num_knots; i++) {
00133 nurbs->set_knot(i, egg_curve->get_knot(i));
00134 }
00135
00136 return nurbs;
00137 }