00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "eggNurbsSurface.h"
00016
00017 #include "indent.h"
00018
00019 TypeHandle EggNurbsSurface::_type_handle;
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 void EggNurbsSurface::
00033 setup(int u_order, int v_order,
00034 int num_u_knots, int num_v_knots) {
00035 _u_order = u_order;
00036 _v_order = v_order;
00037 _u_knots.clear();
00038 _v_knots.clear();
00039
00040 int i;
00041 _u_knots.reserve(num_u_knots);
00042 for (i = 0; i < num_u_knots; i++) {
00043 _u_knots.push_back((double)i);
00044 }
00045 _v_knots.reserve(num_v_knots);
00046 for (i = 0; i < num_v_knots; i++) {
00047 _v_knots.push_back((double)i);
00048 }
00049 }
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 void EggNurbsSurface::
00063 set_num_u_knots(int num) {
00064 if ((int)_u_knots.size() >= num) {
00065
00066 _u_knots.erase(_u_knots.begin() + num, _u_knots.end());
00067 } else {
00068
00069 _u_knots.reserve(num);
00070 for (int i = _u_knots.size(); i < num; i++) {
00071 _u_knots.push_back(0.0);
00072 }
00073 }
00074 }
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 void EggNurbsSurface::
00088 set_num_v_knots(int num) {
00089 if ((int)_v_knots.size() >= num) {
00090
00091 _v_knots.erase(_v_knots.begin() + num, _v_knots.end());
00092 } else {
00093
00094 _v_knots.reserve(num);
00095 for (int i = _v_knots.size(); i < num; i++) {
00096 _v_knots.push_back(0.0);
00097 }
00098 }
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 bool EggNurbsSurface::
00110 is_valid() const {
00111 if (_u_order < 1 || _u_order > 4 || _v_order < 1 || _v_order > 4) {
00112
00113 return false;
00114 }
00115
00116 if (get_num_cvs() != (int)size()) {
00117
00118 return false;
00119 }
00120
00121
00122 int i;
00123 for (i = 1; i < get_num_u_knots(); i++) {
00124 if (get_u_knot(i) < get_u_knot(i - 1)) {
00125 return false;
00126 }
00127 }
00128 for (i = 1; i < get_num_v_knots(); i++) {
00129 if (get_v_knot(i) < get_v_knot(i - 1)) {
00130 return false;
00131 }
00132 }
00133
00134
00135 return true;
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 bool EggNurbsSurface::
00148 is_closed_u() const {
00149
00150
00151
00152
00153
00154
00155 int i;
00156 for (i = 1; i < get_u_order(); i++) {
00157 if (get_u_knot(i) != get_u_knot(i-1)) {
00158 return true;
00159 }
00160 }
00161 return false;
00162 }
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 bool EggNurbsSurface::
00174 is_closed_v() const {
00175 int i;
00176 for (i = 1; i < get_v_order(); i++) {
00177 if (get_v_knot(i) != get_v_knot(i-1)) {
00178 return true;
00179 }
00180 }
00181 return false;
00182 }
00183
00184
00185
00186
00187
00188
00189
00190 void EggNurbsSurface::
00191 write(ostream &out, int indent_level) const {
00192 write_header(out, indent_level, "<NurbsSurface>");
00193
00194 Trims::const_iterator ti;
00195 for (ti = _trims.begin(); ti != _trims.end(); ++ti) {
00196 indent(out, indent_level + 2) << "<Trim> {\n";
00197 Loops::const_iterator li;
00198 for (li = (*ti).begin(); li != (*ti).end(); ++li) {
00199 indent(out, indent_level + 4) << "<Loop> {\n";
00200 Curves::const_iterator ci;
00201 for (ci = (*li).begin(); ci != (*li).end(); ++ci) {
00202 (*ci)->write(out, indent_level + 6);
00203 }
00204 indent(out, indent_level + 4) << "}\n";
00205 }
00206 indent(out, indent_level + 2) << "}\n";
00207 }
00208
00209 if (get_u_subdiv() != 0) {
00210 indent(out, indent_level + 2)
00211 << "<Scalar> U-subdiv { " << get_u_subdiv() << " }\n";
00212 }
00213 if (get_v_subdiv() != 0) {
00214 indent(out, indent_level + 2)
00215 << "<Scalar> V-subdiv { " << get_v_subdiv() << " }\n";
00216 }
00217 indent(out, indent_level + 2)
00218 << "<Order> { " << get_u_order() << " " << get_v_order() << " }\n";
00219 indent(out, indent_level + 2)
00220 << "<U-Knots> {\n";
00221 write_long_list(out, indent_level+4, _u_knots.begin(), _u_knots.end(),
00222 "", "", 72);
00223 indent(out, indent_level + 2)
00224 << "}\n";
00225 indent(out, indent_level + 2)
00226 << "<V-Knots> {\n";
00227 write_long_list(out, indent_level+4, _v_knots.begin(), _v_knots.end(),
00228 "", "", 72);
00229 indent(out, indent_level + 2)
00230 << "}\n";
00231
00232 write_body(out, indent_level+2);
00233
00234 Curves::const_iterator ci;
00235 for (ci = _curves_on_surface.begin(); ci != _curves_on_surface.end(); ++ci) {
00236 (*ci)->write(out, indent_level + 2);
00237 }
00238
00239 indent(out, indent_level) << "}\n";
00240 }
00241
00242
00243
00244
00245
00246
00247 void EggNurbsSurface::
00248 r_apply_texmats(EggTextureCollection &textures) {
00249
00250
00251 }