00001 #include "VTransferFunction2D.h"
00002 #include "glew.h"
00003 #include <algorithm>
00004 #include "QVolRendCanvas.h"
00005
00006 VTransferFunction2D::~VTransferFunction2D()
00007 {
00008 if(m_VolumeHistogramDisplayList2D != 0)
00009 {
00010 glDeleteLists(m_VolumeHistogramDisplayList2D, 1);
00011 }
00012
00013 if(m_VolumeHistogram2D)
00014 {
00015 m_VolumeHistogram2D = 0;
00016 }
00017
00018 if(m_MainCanvas)
00019 {
00020 m_MainCanvas = NULL;
00021 }
00022
00023
00024 }
00025
00026 void VTransferFunction2D::reinit()
00027 {
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 }
00070
00071
00072 void VTransferFunction2D::draw2d()
00073 {
00074 if(m_VolumeHistogramDisplayList2D != 0)
00075 {
00076 glCallList(m_VolumeHistogramDisplayList2D);
00077 }
00078
00079 glEnable(GL_TEXTURE_2D);
00080 glDisable(GL_TEXTURE_2D);
00081
00082 glPointSize(7.0f);
00083 glBegin(GL_POINTS);
00084
00085 for(int i = 0; i < (int)m_FuncControlPoints.size(); i++)
00086 {
00087 vTransferFunction2DPoint ptmp = m_FuncControlPoints[i];
00088
00089 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00090 glVertex3f(ptmp.m_density * 2.0f - 1.0f, ptmp.m_gmag * 2.0f - 1.0f, -0.15f);
00091 }
00092 glEnd();
00093
00094 glPointSize(5.0f);
00095 glBegin(GL_POINTS);
00096
00097 for(int i = 0; i < (int)m_FuncControlPoints.size(); i++)
00098 {
00099 vTransferFunction2DPoint ptmp = m_FuncControlPoints[i];
00100
00101 glColor4f(ptmp.m_Color.getX(), ptmp.m_Color.getY(), ptmp.m_Color.getZ(), 1.0f);
00102 glVertex3f(ptmp.m_density * 2.0f - 1.0f, ptmp.m_gmag * 2.0f - 1.0f, -0.2f);
00103 }
00104 glEnd();
00105
00106 glLineWidth(1.0f);
00107 glBegin(GL_LINES);
00108 for (int i = 0; i < (int)m_FuncControlTriangles.size(); i++)
00109 {
00110 vTransferFunctionWannabeTriangle t;
00111 t = m_FuncControlTriangles[i];
00112
00113 glColor3f(1.0f, 1.0f, 1.0f);
00114 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00115 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00116
00117 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00118 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00119
00120 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00121 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00122 }
00123 glEnd();
00124
00125 glEnable(GL_BLEND);
00126 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00127
00128 glBegin(GL_QUADS);
00129 for (int i = 0; i < (int)m_FuncControlTriangles.size(); i++)
00130 {
00131 vTransferFunctionWannabeTriangle t;
00132 t = m_FuncControlTriangles[i];
00133
00134 float rgba[4];
00135 rgba[0] = t.point1.rgb.getX();
00136 rgba[1] = t.point1.rgb.getY();
00137 rgba[2] = t.point1.rgb.getZ();
00138 rgba[3] = t.point1.alpha*0.7f;
00139 glColor4fv(rgba);
00140 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00141
00142 rgba[0] = t.point2.rgb.getX();
00143 rgba[1] = t.point2.rgb.getY();
00144 rgba[2] = t.point2.rgb.getZ();
00145 rgba[3] = t.point2.alpha*0.7f;
00146 glColor4fv(rgba);
00147 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00148
00149 rgba[0] = t.point3.rgb.getX();
00150 rgba[1] = t.point3.rgb.getY();
00151 rgba[2] = t.point3.rgb.getZ();
00152 rgba[3] = t.point3.alpha*0.7f;
00153 glColor4fv(rgba);
00154 glVertex3f( t.point3.x, t.point3.y , -0.02f-i*0.01f);
00155
00156 rgba[0] = t.point4.rgb.getX();
00157 rgba[1] = t.point4.rgb.getY();
00158 rgba[2] = t.point4.rgb.getZ();
00159 rgba[3] = t.point4.alpha*0.7f;
00160 glColor4fv(rgba);
00161 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00162 }
00163 glEnd();
00164
00165 glDisable(GL_BLEND);
00166 }
00167
00168 void VTransferFunction2D::addTransferFunctionPoint( vTransferFunction2DPoint newPoint )
00169 {
00170 m_FuncControlPoints.push_back(newPoint);
00171
00172 vTransferFunctionWannabeTriangle t;
00173
00174 t.point1.x = newPoint.m_density * 2.0f - 1.0f;
00175 t.point1.y = (newPoint.m_gmag - 0.3f) * 2.0f - 1.0f;
00176 t.point1.rgb = newPoint.m_Color;
00177 t.point1.alpha = 0.0f,
00178
00179
00180 t.point2.x = (newPoint.m_density + 0.05f) * 2.0f - 1.0f;
00181 t.point2.y = (newPoint.m_gmag + 0.15f) * 2.0f - 1.0f;
00182 t.point2.rgb = VVector(0.0f,0.0f,0.0f);
00183 t.point2.alpha = 0.0f;
00184
00185
00186 t.point4.x = (newPoint.m_density - 0.05f) * 2.0f - 1.0f;
00187 t.point4.y = (newPoint.m_gmag + 0.15f) * 2.0f - 1.0f;
00188 t.point4.rgb = VVector(0.0f,0.0f,0.0f);
00189 t.point4.alpha = 0.0f;
00190
00191
00192 t.point3.x = (newPoint.m_density ) * 2.0f - 1.0f;
00193 t.point3.y = (newPoint.m_gmag + 0.15f) * 2.0f - 1.0f;
00194 t.point3.rgb = newPoint.m_Color;
00195 t.point3.alpha = newPoint.m_Alpha;
00196
00197
00198
00199 m_FuncControlTriangles.push_back(t);
00200 m_hasChanged = true;
00201
00202 }
00203
00204 VVector VTransferFunction2D::transferFunctionPointInRange(float selectedDensity, float gmag, float range)
00205 {
00206
00207 return VVector(0.0f,0.0f,-1.0f);
00208 }
00209
00210 void VTransferFunction2D::addTransferFunctionPoint(vTransferFunctionWannabeTriangle t, vTransferFunction2DPoint newPoint)
00211 {
00212 m_FuncControlPoints.push_back(newPoint);
00213 m_FuncControlTriangles.push_back(t);
00214 m_hasChanged = true;
00215 }
00216
00217 void VTransferFunction2D::removeTransferFunctionPoint(float density, float gmag, float tres)
00218 {
00219 std::vector<vTransferFunction2DPoint> _FuncControlPoints;
00220 std::vector<vTransferFunctionWannabeTriangle> _FuncControlTriangles;
00221
00222 for(int i = 0; i< (int)m_FuncControlPoints.size(); i++)
00223 {
00224 if(abs(m_FuncControlPoints[i].m_density - density) > tres || abs(m_FuncControlPoints[i].m_gmag - gmag) > tres)
00225 {
00226 _FuncControlPoints.push_back(m_FuncControlPoints[i]);
00227 _FuncControlTriangles.push_back(m_FuncControlTriangles[i]);
00228 }
00229 }
00230
00231 m_FuncControlPoints.clear();
00232 m_FuncControlTriangles.clear();
00233 m_FuncControlPoints = _FuncControlPoints;
00234 m_FuncControlTriangles = _FuncControlTriangles;
00235
00236 _FuncControlTriangles.clear();
00237 _FuncControlPoints.clear();
00238 m_hasChanged = true;
00239
00240 }
00241
00242 void VTransferFunction2D::changePointColor(float density, float gmag, VVector color, float alpha, float tres)
00243 {
00244
00245 for(int index = 0; index< (int)m_FuncControlPoints.size(); index++)
00246 {
00247 if(abs(m_FuncControlPoints[index].m_density - density) < tres && abs(m_FuncControlPoints[index].m_gmag - gmag) < tres)
00248 {
00249
00250 m_FuncControlPoints[index].m_Color = color;
00251 m_FuncControlPoints[index].m_Alpha = alpha;
00252
00253 m_FuncControlTriangles[index].point1.rgb = m_FuncControlPoints[index].m_Color;
00254 m_FuncControlTriangles[index].point1.alpha = 0.0f;
00255
00256 m_FuncControlTriangles[index].point2.rgb = VVector(0.0f,0.0f,0.0f);
00257 m_FuncControlTriangles[index].point2.alpha = 0.0f;
00258
00259 m_FuncControlTriangles[index].point4.rgb = VVector(0.0f,0.0f,0.0f);
00260 m_FuncControlTriangles[index].point4.alpha = 0.0f;
00261
00262 m_FuncControlTriangles[index].point3.rgb = m_FuncControlPoints[index].m_Color;
00263 m_FuncControlTriangles[index].point3.alpha = m_FuncControlPoints[index].m_Alpha;
00264 break;
00265 }
00266 }
00267
00268 m_hasChanged = true;
00269 }
00270
00271 void VTransferFunction2D::changeTriangleSize( int index, float offsetw, float offseth)
00272 {
00273
00274
00275 {
00276 m_FuncControlTriangles[index].point1.y -= 2.0f * offseth/3.0f;
00277 m_FuncControlTriangles[index].point2.y += offseth/3.0f;
00278 m_FuncControlTriangles[index].point3.y += offseth/3.0f;
00279 m_FuncControlTriangles[index].point4.y += offseth/3.0f;
00280
00281 m_FuncControlTriangles[index].a_offseth += offseth;
00282 }
00283
00284 if( m_FuncControlTriangles[index].point2.x - m_FuncControlTriangles[index].point4.x + offsetw > 0.025f)
00285 {
00286 m_FuncControlTriangles[index].point1.x -= 0.0f;
00287 m_FuncControlTriangles[index].point2.x += offsetw/2.0f;
00288 m_FuncControlTriangles[index].point3.x += 0.0f;
00289 m_FuncControlTriangles[index].point4.x -= offsetw/2.0f;
00290
00291 m_FuncControlTriangles[index].a_offsetw += offsetw;
00292 }
00293
00294 m_hasChanged = true;
00295 }
00296
00297 void VTransferFunction2D::changeTriangleSkew( int index, float skew )
00298 {
00299
00300 if( abs(m_FuncControlTriangles[index].a_skew + skew) < 0.1f)
00301 {
00302 m_FuncControlTriangles[index].point1.x += skew;
00303
00304 m_FuncControlTriangles[index].a_skew += skew;
00305 }
00306
00307 m_hasChanged = true;
00308 }
00309
00310 int VTransferFunction2D::findIndexTransferFunctionPoint(float density, float gmag, float tres)
00311 {
00312 int index = -1;
00313
00314 for(int i = 0; i< (int)m_FuncControlPoints.size(); i++)
00315 {
00316 if(abs(m_FuncControlPoints[i].m_density - density) < tres && abs(m_FuncControlPoints[i].m_gmag - gmag) < tres)
00317 {
00318 index = i;
00319 break;
00320 }
00321 }
00322
00323 return index;
00324
00325 }
00326
00327 void VTransferFunction2D::changePointPosition(int index, float newx, float newy)
00328 {
00329
00330
00331 if( index < 0 || index >= (int)m_FuncControlPoints.size()) return;
00332
00333 m_FuncControlPoints[index].m_density = newx*0.5f + 0.5f;
00334
00335 if(m_FuncControlPoints[index].m_density > 1.0f) m_FuncControlPoints[index].m_density = 1.0f;
00336 if(m_FuncControlPoints[index].m_density < 0.0f) m_FuncControlPoints[index].m_density = 0.0f;
00337
00338 m_FuncControlPoints[index].m_gmag = newy*0.5f + 0.5f;
00339 if(m_FuncControlPoints[index].m_gmag > 1.0f) m_FuncControlPoints[index].m_gmag = 1.0f;
00340 if(m_FuncControlPoints[index].m_gmag < 0.0f) m_FuncControlPoints[index].m_gmag = 0.0f;
00341
00342 m_FuncControlTriangles[index].point1.x = m_FuncControlPoints[index].m_density * 2.0f - 1.0f + m_FuncControlTriangles[index].a_skew;
00343 m_FuncControlTriangles[index].point1.y = (m_FuncControlPoints[index].m_gmag - 0.3f) * 2.0f - 1.0f - 2.0f * m_FuncControlTriangles[index].a_offseth / 3.0f;
00344
00345
00346 m_FuncControlTriangles[index].point2.x = (m_FuncControlPoints[index].m_density + 0.05f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offsetw / 2.0f;
00347 m_FuncControlTriangles[index].point2.y = (m_FuncControlPoints[index].m_gmag + 0.15f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offseth / 3.0f;
00348
00349
00350 m_FuncControlTriangles[index].point4.x = (m_FuncControlPoints[index].m_density - 0.05f) * 2.0f - 1.0f - + m_FuncControlTriangles[index].a_offsetw / 2.0f;
00351 m_FuncControlTriangles[index].point4.y = (m_FuncControlPoints[index].m_gmag + 0.15f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offseth / 3.0f;
00352
00353
00354 m_FuncControlTriangles[index].point3.x = (m_FuncControlPoints[index].m_density ) * 2.0f - 1.0f;
00355 m_FuncControlTriangles[index].point3.y = (m_FuncControlPoints[index].m_gmag + 0.15f) * 2.0f - 1.0f + m_FuncControlTriangles[index].a_offseth / 3.0f;
00356
00357 m_hasChanged = true;
00358 }
00359
00360
00361 void VTransferFunction2D::setHistogram2D(unsigned char * volumeHistogram2d)
00362 {
00363 this->clear();
00364 m_VolumeHistogram2D = volumeHistogram2d;
00365
00366 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00367
00368 glGenTextures(1, &m_Histogram2DTextureHandle);
00369
00370 glActiveTexture(GL_TEXTURE0);
00371 glBindTexture(GL_TEXTURE_2D,m_Histogram2DTextureHandle);
00372
00373 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
00374 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
00375 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
00376 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
00377
00378 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 1024, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
00379
00380 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,1024, 1024, GL_RGBA, GL_UNSIGNED_BYTE, &(m_VolumeHistogram2D[0]));
00381
00382 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
00383
00384 generateDisplayList2D();
00385
00386 reinit();
00387 }
00388
00389 void VTransferFunction2D::generateDisplayList2D()
00390 {
00391 if(m_VolumeHistogramDisplayList2D != 0)
00392 {
00393 glDeleteLists(m_VolumeHistogramDisplayList2D, 1);
00394 }
00395
00396 m_VolumeHistogramDisplayList2D = glGenLists(1);
00397 glNewList(m_VolumeHistogramDisplayList2D, GL_COMPILE);
00398
00399 glEnable(GL_TEXTURE_2D);
00400
00401 glBegin(GL_QUADS);
00402
00403
00404
00405 glTexCoord2f(0.0f, 0.0f);glVertex3f(-1.0f, -1.0f, 0.0f);
00406 glTexCoord2f(1.0f, 0.0f);glVertex3f( 1.0f, -1.0f, 0.0f);
00407 glTexCoord2f(1.0f, 1.0f);glVertex3f( 1.0f, 1.0f, 0.0f);
00408 glTexCoord2f(0.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 0.0f);
00409
00410 glEnd();
00411
00412 glDisable(GL_TEXTURE_2D);
00413
00414 glEndList();
00415
00416 }
00417
00418 void VTransferFunction2D::interpolateTransferTriangles()
00419 {
00420 if(!m_FramebufferObject)
00421 {
00422 m_FramebufferObject = new VFramebufferObject(1024,1024,GL_RGBA);
00423 }
00424
00425 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
00426 if(m_FramebufferObject->getFboHandle() == 0)
00427 {
00428 m_FramebufferObject->init();
00429 }
00430 m_FramebufferObject->bind();
00431
00432
00433
00434
00435 glBegin(GL_QUADS);
00436 for (int i = 0; i < (int)m_FuncControlTriangles.size(); i++)
00437 {
00438 vTransferFunctionWannabeTriangle t;
00439 t = m_FuncControlTriangles[i];
00440
00441 float rgba[4];
00442 rgba[0] = t.point1.rgb.getX();
00443 rgba[1] = t.point1.rgb.getY();
00444 rgba[2] = t.point1.rgb.getZ();
00445 rgba[3] = t.point1.alpha;
00446 glColor4fv(rgba);
00447 glVertex3f( t.point1.x, t.point1.y , -0.02f-i*0.01f);
00448
00449 rgba[0] = t.point2.rgb.getX();
00450 rgba[1] = t.point2.rgb.getY();
00451 rgba[2] = t.point2.rgb.getZ();
00452 rgba[3] = t.point2.alpha;
00453 glColor4fv(rgba);
00454 glVertex3f( t.point2.x, t.point2.y , -0.02f-i*0.01f);
00455
00456 rgba[0] = t.point3.rgb.getX();
00457 rgba[1] = t.point3.rgb.getY();
00458 rgba[2] = t.point3.rgb.getZ();
00459 rgba[3] = t.point3.alpha;
00460 glColor4fv(rgba);
00461 glVertex3f( t.point3.x, t.point3.y , -0.02f-i*0.01f);
00462
00463 rgba[0] = t.point4.rgb.getX();
00464 rgba[1] = t.point4.rgb.getY();
00465 rgba[2] = t.point4.rgb.getZ();
00466 rgba[3] = t.point4.alpha;
00467 glColor4fv(rgba);
00468 glVertex3f( t.point4.x, t.point4.y , -0.02f-i*0.01f);
00469 }
00470 glEnd();
00471
00472
00473 m_FramebufferObject->unbind();
00474
00475
00476
00477 m_hasChanged = false;
00478
00479 }
00480
00481 bool VTransferFunction2D::load(std::string filepath)
00482 {
00483 if(filepath == "")
00484 {
00485 return true;
00486 }
00487 FILE *fp = NULL;
00488
00489 fopen_s(&fp,filepath.c_str(),"rb");
00490
00491 if(!fp)
00492 {
00493 return false;
00494 }
00495 unsigned int numPoints;
00496
00497 fread(&numPoints,sizeof(unsigned int),1,fp);
00498
00499 m_FuncControlPoints.clear();
00500 m_FuncControlTriangles.clear();
00501 for(unsigned int i = 0; i < numPoints; ++i)
00502 {
00503 vTransferFunction2DPoint tmpp;
00504 vTransferFunctionWannabeTriangle tmpt;
00505
00506 float pValues[6];
00507 fread(pValues, sizeof(float), 6, fp);
00508 tmpp.m_Color.setX(pValues[0]);
00509 tmpp.m_Color.setY(pValues[1]);
00510 tmpp.m_Color.setZ(pValues[2]);
00511 tmpp.m_Alpha = pValues[3];
00512 tmpp.m_gmag = pValues[4];
00513 tmpp.m_density = pValues[5];
00514
00515
00516
00517 float p1Values[6];
00518 fread(p1Values, sizeof(float), 6, fp);
00519
00520 tmpt.point1.x = p1Values[0];
00521 tmpt.point1.y = p1Values[1];
00522 tmpt.point1.rgb.setX(p1Values[2]);
00523 tmpt.point1.rgb.setY(p1Values[3]);
00524 tmpt.point1.rgb.setZ(p1Values[4]);
00525 tmpt.point1.alpha = p1Values[5];
00526
00527 float p2Values[6];
00528 fread(p2Values, sizeof(float), 6, fp);
00529 tmpt.point2.x = p2Values[0];
00530 tmpt.point2.y = p2Values[1];
00531 tmpt.point2.rgb.setX(p2Values[2]);
00532 tmpt.point2.rgb.setY(p2Values[3]);
00533 tmpt.point2.rgb.setZ(p2Values[4]);
00534 tmpt.point2.alpha = p2Values[5];
00535
00536
00537 float p3Values[6];
00538 fread(p3Values, sizeof(float), 6, fp);
00539 tmpt.point3.x = p3Values[0];
00540 tmpt.point3.y = p3Values[1];
00541 tmpt.point3.rgb.setX(p3Values[2]);
00542 tmpt.point3.rgb.setY(p3Values[3]);
00543 tmpt.point3.rgb.setZ(p3Values[4]);
00544 tmpt.point3.alpha = p3Values[5];
00545
00546
00547 float p4Values[6];
00548 fread(p4Values, sizeof(float), 6, fp);
00549 tmpt.point4.x = p4Values[0];
00550 tmpt.point4.y = p4Values[1];
00551 tmpt.point4.rgb.setX(p4Values[2]);
00552 tmpt.point4.rgb.setY(p4Values[3]);
00553 tmpt.point4.rgb.setZ(p4Values[4]);
00554 tmpt.point4.alpha = p4Values[5];
00555
00556
00557 float addVals[3];
00558 fread(addVals, sizeof(float), 3, fp);
00559 tmpt.a_offsetw = addVals[0];
00560 tmpt.a_offseth = addVals[1];
00561 tmpt.a_skew = addVals[2];
00562
00563 m_FuncControlPoints.push_back(tmpp);
00564 m_FuncControlTriangles.push_back(tmpt);
00565 }
00566 fclose(fp);
00567 m_hasChanged = true;
00568 return true;
00569 }
00570
00571 bool VTransferFunction2D::save(std::string filepath)
00572 {
00573 if(filepath == "")
00574 {
00575 return true;
00576 }
00577 FILE *fp = NULL;
00578
00579
00580
00581 fopen_s(&fp,filepath.c_str(),"wb");
00582
00583 if(!fp)
00584 {
00585 return false;
00586 }
00587 unsigned int numPoints = (unsigned int)m_FuncControlPoints.size();
00588
00589 fwrite(reinterpret_cast<char*>(&numPoints), sizeof(unsigned int), 1,fp);
00590
00591 for(int i = 0; i < (int)m_FuncControlPoints.size(); ++i)
00592 {
00593 vTransferFunction2DPoint tmpp = m_FuncControlPoints[i];
00594 vTransferFunctionWannabeTriangle tmpt = m_FuncControlTriangles[i];
00595
00596 float pValues[6];
00597 pValues[0] = tmpp.m_Color.getX();
00598 pValues[1] = tmpp.m_Color.getY();
00599 pValues[2] = tmpp.m_Color.getZ();
00600 pValues[3] = tmpp.m_Alpha;
00601 pValues[4] = tmpp.m_gmag;
00602 pValues[5] = tmpp.m_density;
00603
00604 fwrite(reinterpret_cast<char*>(pValues), sizeof(float), 6, fp);
00605
00606 float p1Values[6];
00607 p1Values[0] = tmpt.point1.x;
00608 p1Values[1] = tmpt.point1.y;
00609 p1Values[2] = tmpt.point1.rgb.getX();
00610 p1Values[3] = tmpt.point1.rgb.getY();
00611 p1Values[4] = tmpt.point1.rgb.getZ();
00612 p1Values[5] = tmpt.point1.alpha;
00613 fwrite(reinterpret_cast<char*>(p1Values), sizeof(float), 6, fp);
00614
00615 float p2Values[6];
00616 p2Values[0] = tmpt.point2.x;
00617 p2Values[1] = tmpt.point2.y;
00618 p2Values[2] = tmpt.point2.rgb.getX();
00619 p2Values[3] = tmpt.point2.rgb.getY();
00620 p2Values[4] = tmpt.point2.rgb.getZ();
00621 p2Values[5] = tmpt.point2.alpha;
00622 fwrite(reinterpret_cast<char*>(p2Values), sizeof(float), 6, fp);
00623
00624 float p3Values[6];
00625 p3Values[0] = tmpt.point3.x;
00626 p3Values[1] = tmpt.point3.y;
00627 p3Values[2] = tmpt.point3.rgb.getX();
00628 p3Values[3] = tmpt.point3.rgb.getY();
00629 p3Values[4] = tmpt.point3.rgb.getZ();
00630 p3Values[5] = tmpt.point3.alpha;
00631 fwrite(reinterpret_cast<char*>(p3Values), sizeof(float), 6, fp);
00632
00633 float p4Values[6];
00634 p4Values[0] = tmpt.point4.x;
00635 p4Values[1] = tmpt.point4.y;
00636 p4Values[2] = tmpt.point4.rgb.getX();
00637 p4Values[3] = tmpt.point4.rgb.getY();
00638 p4Values[4] = tmpt.point4.rgb.getZ();
00639 p4Values[5] = tmpt.point4.alpha;
00640 fwrite(reinterpret_cast<char*>(p4Values), sizeof(float), 6, fp);
00641
00642 float addVals[3];
00643 addVals[0] = tmpt.a_offsetw;
00644 addVals[1] = tmpt.a_offseth;
00645 addVals[2] = tmpt.a_skew;
00646
00647 fwrite(reinterpret_cast<char*>(addVals), sizeof(float), 3, fp);
00648
00649 }
00650
00651 fclose(fp);
00652 return true;
00653 }