00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "nurbsCurveDrawer.h"
00020 #include "nurbsCurveInterface.h"
00021 #include "parametricCurve.h"
00022
00023
00024 TypeHandle NurbsCurveDrawer::_type_handle;
00025
00026
00027
00028
00029
00030
00031
00032 NurbsCurveDrawer::
00033 NurbsCurveDrawer() {
00034 set_cv_color(1.0f, 0.0f, 0.0f);
00035 set_hull_color(1.0f, 0.5, 0.5);
00036 set_knot_color(0.0f, 0.0f, 1.0f);
00037
00038 _cvs.set_thickness(4.0f);
00039 _hull.set_thickness(1.0f);
00040 _knots.set_thickness(4.0f);
00041
00042 _show_cvs = true;
00043 _show_hull = true;
00044 _show_knots = true;
00045 }
00046
00047
00048
00049
00050
00051
00052
00053 NurbsCurveDrawer::
00054 ~NurbsCurveDrawer() {
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00064 void NurbsCurveDrawer::
00065 set_cv_color(float r, float g, float b) {
00066 _cv_color.set(r, g, b);
00067 _cvs.set_color(r, g, b);
00068
00069 redraw();
00070 }
00071
00072
00073
00074
00075
00076
00077 void NurbsCurveDrawer::
00078 set_knot_color(float r, float g, float b) {
00079 _knot_color.set(r, g, b);
00080 _knots.set_color(r, g, b);
00081
00082 redraw();
00083 }
00084
00085
00086
00087
00088
00089
00090 void NurbsCurveDrawer::
00091 set_hull_color(float r, float g, float b) {
00092 _hull_color.set(r, g, b);
00093 _hull.set_color(r, g, b);
00094
00095 redraw();
00096 }
00097
00098
00099
00100
00101
00102
00103
00104
00105 bool NurbsCurveDrawer::
00106 draw() {
00107
00108 if (!ParametricCurveDrawer::draw()) {
00109 return false;
00110 }
00111
00112 ParametricCurve *curve = (ParametricCurve *)NULL;
00113 NurbsCurveInterface *nurbs = (NurbsCurveInterface *)NULL;
00114
00115 if (_curves != (ParametricCurveCollection *)NULL) {
00116 curve = _curves->get_default_curve();
00117
00118 if (curve != (ParametricCurve *)NULL) {
00119 nurbs = curve->get_nurbs_interface();
00120 }
00121 }
00122
00123 if (nurbs == (NurbsCurveInterface *)NULL) {
00124
00125 return true;
00126 }
00127
00128 int i;
00129 if (_show_knots) {
00130 _num_cvs = nurbs->get_num_cvs();
00131 _knotnums.erase(_knotnums.begin(), _knotnums.end());
00132
00133 float lt = -1.0f;
00134 int ki = -1;
00135 for (i = 0; i < _num_cvs; i++) {
00136 float t = nurbs->get_knot(i);
00137 if (t != lt) {
00138 lt = t;
00139 LVecBase3f knot_pos;
00140 curve->get_point(nurbs->get_knot(i), knot_pos);
00141 _knots.move_to(knot_pos);
00142 ki++;
00143 }
00144 _knotnums.push_back(ki);
00145 }
00146
00147 _knots.create(_geom_node, _frame_accurate);
00148 }
00149
00150 if (_show_cvs) {
00151 _num_cvs = nurbs->get_num_cvs();
00152 for (i = 0; i < _num_cvs; i++) {
00153 _cvs.move_to(nurbs->get_cv_point(i));
00154 }
00155
00156 _cvs.create(_geom_node, _frame_accurate);
00157 }
00158
00159 if (_show_hull) {
00160 _num_cvs = nurbs->get_num_cvs();
00161 for (i = 0; i < _num_cvs; i++) {
00162 _hull.draw_to(nurbs->get_cv_point(i));
00163 }
00164
00165 _hull.create(_geom_node, _frame_accurate);
00166 }
00167
00168 return true;
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178 bool NurbsCurveDrawer::
00179 recompute(float t1, float t2, ParametricCurve *curve) {
00180 return draw();
00181 }
00182
00183
00184
00185
00186
00187
00188
00189 void NurbsCurveDrawer::
00190 set_show_cvs(bool flag) {
00191 _show_cvs = flag;
00192 redraw();
00193 }
00194
00195
00196
00197
00198
00199
00200 bool NurbsCurveDrawer::
00201 get_show_cvs() const {
00202 return _show_cvs;
00203 }
00204
00205
00206
00207
00208
00209
00210 void NurbsCurveDrawer::
00211 set_show_hull(bool flag) {
00212 _show_hull = flag;
00213 redraw();
00214 }
00215
00216
00217
00218
00219
00220
00221 bool NurbsCurveDrawer::
00222 get_show_hull() const {
00223 return _show_hull;
00224 }
00225
00226
00227
00228
00229
00230
00231 void NurbsCurveDrawer::
00232 set_show_knots(bool flag) {
00233 _show_knots = flag;
00234 redraw();
00235 }
00236
00237
00238
00239
00240
00241
00242 bool NurbsCurveDrawer::
00243 get_show_knots() const {
00244 return _show_knots;
00245 }
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255 bool NurbsCurveDrawer::
00256 hilight(int n, float hr, float hg, float hb) {
00257 if (n < 0 || n >= _cvs.get_num_vertices()) {
00258
00259 return false;
00260 }
00261
00262 if (_show_cvs) {
00263 _cvs.set_vertex_color(n, hr, hg, hb);
00264 }
00265 if (_show_knots) {
00266 nassertr(_knotnums[n] >= 0 && _knotnums[n] < _knots.get_num_vertices(), false);
00267 _knots.set_vertex_color(_knotnums[n], hr, hg, hb);
00268 }
00269
00270 return true;
00271 }
00272
00273
00274
00275
00276
00277
00278
00279 bool NurbsCurveDrawer::
00280 unhilight(int n) {
00281 if (n < 0 || n >= _cvs.get_num_vertices()) {
00282 return false;
00283 }
00284
00285 if (_show_cvs) {
00286 _cvs.set_vertex_color(n, _cv_color[0], _cv_color[1], _cv_color[2]);
00287 }
00288 if (_show_knots) {
00289 nassertr(_knotnums[n] >= 0 && _knotnums[n] < _knots.get_num_vertices(), false);
00290 _knots.set_vertex_color(_knotnums[n],
00291 _knot_color[0], _knot_color[1], _knot_color[2]);
00292 }
00293
00294 return true;
00295 }
00296