00001
00002 #include "FacetBaseData.h"
00003
00004
00005 using namespace jbxl;
00006
00007
00009
00010
00011
00012 void FacetTriIndex::set(int w1, int w2, int w3, int m1, int m2, int m3, int u1, int u2, int u3)
00013 {
00014 v1 = w1; v2 = w2; v3 = w3;
00015 n1 = m1; n2 = m2; n3 = m3;
00016 uv1 = u1; uv2 = u2, uv3 = u3;
00017 }
00018
00019
00020 void FacetTriIndex::mlt_set(int d1, int d2, int d3)
00021 {
00022 v1 = d1; v2 = d2; v3 = d3;
00023 n1 = d1; n2 = d2; n3 = d3;
00024 uv1 = d1; uv2 = d2, uv3 = d3;
00025 }
00026
00027
00028
00030
00031
00032
00033 void FacetTriData::init(void)
00034 {
00035 facetNum = 0;
00036
00037 v1.init();
00038 v2.init();
00039 v3.init();
00040 n1.init();
00041 n2.init();
00042 n3.init();
00043 uv1.init();
00044 uv2.init();
00045 uv3.init();
00046 }
00047
00048
00049
00050 void FacetTriData::execScale(double x, double y, double z)
00051 {
00052 v1.x *= x;
00053 v1.y *= y;
00054 v1.z *= z;
00055 v2.x *= x;
00056 v2.y *= y;
00057 v2.z *= z;
00058 v3.x *= x;
00059 v3.y *= y;
00060 v3.z *= z;
00061 }
00062
00063
00064
00065 void FacetTriData::execRotate(Quaternion<double> q)
00066 {
00067 v1 = q.execRotation(v1);
00068 v2 = q.execRotation(v2);
00069 v3 = q.execRotation(v3);
00070 n1 = q.execRotation(n1);
00071 n2 = q.execRotation(n2);
00072 n3 = q.execRotation(n3);
00073 }
00074
00075
00076
00077
00079
00080
00081
00082 void FacetBaseData::init(int idx, int num)
00083 {
00084 num_index = idx;
00085 num_data = num;
00086 vcount = 3;
00087
00088 index = NULL;
00089 vertex = NULL;
00090 normal = NULL;
00091 texcrd = NULL;
00092 }
00093
00094
00095
00096 void FacetBaseData::free(void)
00097 {
00098 freeNull(index);
00099
00100 freeNull(vertex);
00101 freeNull(normal);
00102 freeNull(texcrd);
00103
00104 init();
00105 }
00106
00107
00108
00109 bool FacetBaseData::getm(void)
00110 {
00111 index = (int*)malloc(sizeof(int)*num_index);
00112
00113 vertex = (Vector<double>*)malloc(sizeof(Vector<double>)*num_data);
00114 normal = (Vector<double>*)malloc(sizeof(Vector<double>)*num_data);
00115 texcrd = (UVMap <double>*)malloc(sizeof(UVMap <double>)*num_data);
00116
00117 if (index==NULL || vertex==NULL || normal==NULL || texcrd==NULL) {
00118 this->free();
00119 return false;
00120 }
00121
00122 return true;
00123 }
00124
00125
00126
00127 void FacetBaseData::dup(FacetBaseData a)
00128 {
00129 num_index = a.num_index;
00130 num_data = a.num_data;
00131 vcount = a.vcount;
00132
00133 if (getm()) {
00134 for (int i=0; i<num_index; i++) index[i] = a.index[i];
00135 for (int i=0; i<num_data; i++) {
00136 vertex[i] = a.vertex[i];
00137 normal[i] = a.normal[i];
00138 texcrd[i] = a.texcrd[i];
00139 }
00140 }
00141 return;
00142 }
00143
00144
00145
00146 void FacetBaseData::execScale(Vector<double> scale)
00147 {
00148 for (int i=0; i<num_data; i++) {
00149 vertex[i].x *= scale.x;
00150 vertex[i].y *= scale.y;
00151 vertex[i].z *= scale.z;
00152 }
00153 }
00154
00155
00156
00157 void FacetBaseData::execShift(Vector<double> shift)
00158 {
00159 for (int i=0; i<num_data; i++) {
00160 vertex[i].x += shift.x;
00161 vertex[i].y += shift.y;
00162 vertex[i].z += shift.z;
00163 }
00164 }
00165
00166
00167
00168 void FacetBaseData::execRotate(Quaternion<double> quat)
00169 {
00170 for (int i=0; i<num_data; i++) {
00171 vertex[i] = VectorRotation(vertex[i], quat);
00172 normal[i] = VectorRotation(normal[i], quat);
00173 }
00174 }
00175
00176
00177
00178
00180
00181
00182
00183 void TriPolyData::init(void)
00184 {
00185 facetNum = -1;
00186 has_normal = false;
00187 has_texcrd = false;
00188 }
00189
00190
00191
00192 void TriPolyData::dup(TriPolyData a)
00193 {
00194 *this = a;
00195 }
00196
00197
00198
00199 void TriPolyData::execScale(Vector<double> scale)
00200 {
00201 for (int i=0; i<3; i++) {
00202 vertex[i].x *= scale.x;
00203 vertex[i].y *= scale.y;
00204 vertex[i].z *= scale.z;
00205 }
00206 }
00207
00208
00209
00210 void TriPolyData::execShift(Vector<double> shift)
00211 {
00212 for (int i=0; i<3; i++) {
00213 vertex[i].x += shift.x;
00214 vertex[i].y += shift.y;
00215 vertex[i].z += shift.z;
00216 }
00217 }
00218
00219
00220
00221 void TriPolyData::execRotate(Quaternion<double> quat)
00222 {
00223 for (int i=0; i<3; i++) {
00224 vertex[i] = VectorRotation(vertex[i], quat);
00225 normal[i] = VectorRotation(normal[i], quat);
00226 }
00227 }
00228
00229
00230
00231
00233
00234
00235 TriPolyData* jbxl::dupTriPolyData(TriPolyData* data, int num)
00236 {
00237 if (data==NULL) return NULL;
00238
00239 TriPolyData* dup = (TriPolyData*)malloc(num*sizeof(TriPolyData));
00240 if (dup==NULL) return NULL;
00241
00242 for (int i=0; i<num; i++) dup[i].dup(data[i]);
00243 return dup;
00244 }
00245
00246
00247
00248 TriPolyData* jbxl::joinTriPolyData(TriPolyData*& first, int num_f, TriPolyData*& next, int num_n)
00249 {
00250 if (first==NULL) return next;
00251 if (next ==NULL) return first;
00252
00253 TriPolyData* join = (TriPolyData*)malloc((num_f+num_n)*sizeof(TriPolyData));
00254 if (join==NULL) return NULL;
00255
00256 int fnum = 0;
00257 for (int i=0; i<num_f; i++) {
00258 join[i].dup(first[i]);
00259 if (join[i].facetNum>fnum) fnum = join[i].facetNum;
00260 }
00261 fnum += 1;
00262
00263 for (int i=0; i<num_n; i++) {
00264 join[num_f+i].dup(next[i]);
00265 join[num_f+i].facetNum += fnum;
00266 }
00267
00268 freeTriPolyData(first, num_f);
00269 freeTriPolyData(next, num_n);
00270
00271 return join;
00272 }
00273
00274
00275
00276 void jbxl::freeTriPolyData(TriPolyData*& tridata, int n)
00277 {
00278 if (tridata!=NULL) {
00279 for (int i=0; i<n; i++) {
00280 tridata[i].free();
00281 }
00282 ::free(tridata);
00283 tridata = NULL;
00284 }
00285 }
00286
00287