00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "GUI/ViewPort3D.H"
00037 #include "GUI/SuperQuadric.H"
00038 #include "Util/log.H"
00039 #include "Util/WorkThreadServer.H"
00040 #include "Util/JobWithSemaphore.H"
00041 #include "Component/ModelManager.H"
00042 #include "Raster/GenericFrame.H"
00043 #include "Image/Layout.H"
00044 #include "Image/MatrixOps.H"
00045 #include "Image/DrawOps.H"
00046 #include "GUI/DebugWin.H"
00047 #include "Media/FrameSeries.H"
00048 #include "Transport/FrameInfo.H"
00049 #include <stdlib.h>
00050 #include <math.h>
00051
00052
00053 int main(int argc, char *argv[]){
00054
00055 ModelManager manager("Test Viewport");
00056
00057 nub::ref<OutputFrameSeries> ofs(new OutputFrameSeries(manager));
00058 manager.addSubComponent(ofs);
00059
00060
00061 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00062
00063 manager.start();
00064
00065 bool testTexture = false;
00066 bool testFeedback = false;
00067 bool testSQ = false;
00068 bool testGetPosition = true;
00069
00070
00071
00072 if (testTexture)
00073 {
00074 ViewPort3D vp(320,240, false, false, false);
00075 vp.setCamera(Point3D<float>(0,0,300), Point3D<float>(0,0,0));
00076
00077 vp.initFrame();
00078 Image<PixRGB<byte> > texture1(64,64,ZEROS);
00079 for(int i=0; i<texture1.getHeight(); i++)
00080 for(int j=0; j<texture1.getWidth(); j++)
00081 {
00082 int c = ((((i&0x8)==0)^((j&0x8)==0)))*255;
00083 texture1.setVal(j,i, PixRGB<byte>(0,c,c));
00084 }
00085 uint checkBoard1 = vp.addTexture(texture1);
00086
00087 for(uint i=0; i<360*2; i++)
00088 {
00089 LINFO("i %i", i);
00090
00091 vp.initFrame();
00092 vp.bindTexture(checkBoard1);
00093
00094 glRotatef(i, 0,1,0);
00095 glBegin(GL_QUADS);
00096
00097
00098 glTexCoord2f(0.0, 0.0);
00099 glVertex3f( 40, 40, 0);
00100
00101 glTexCoord2f(0.0, 1.0);
00102 glVertex3f(-40, 40, 0);
00103
00104 glTexCoord2f(1.0, 1.0);
00105 glVertex3f(-40,-40, 0);
00106
00107 glTexCoord2f(1.0, 0.0);
00108 glVertex3f( 40,-40, 0);
00109 glEnd();
00110
00111 Image<PixRGB<byte> > img = flipVertic(vp.getFrame());
00112 ofs->writeRGB(img, "ViewPort3D", FrameInfo("ViewPort3D", SRC_POS));
00113 usleep(10000);
00114 }
00115 }
00116
00117
00118
00119 if (testFeedback)
00120 {
00121 ViewPort3D vp(320,240, true, true, true);
00122
00123 vp.setCamera(Point3D<float>(0,0,350), Point3D<float>(0,0,0));
00124
00125 vp.initFrame();
00126
00127 glPassThrough (1.0);
00128 vp.drawBox( Point3D<float>(60,60,0),
00129 Point3D<float>(0,0,0),
00130 Point3D<float>(30, 30, 50),
00131 PixRGB<byte>(0,256,0)
00132 );
00133 glPassThrough (2.0);
00134
00135 vp.drawCylinder( Point3D<float>(-60,-60,0),
00136 Point3D<float>(0,0,0),
00137 30,
00138 50,
00139 PixRGB<byte>(256,256,0)
00140 );
00141
00142
00143
00144 Image<PixRGB<byte> > tmp(320, 240, ZEROS);
00145 std::vector<ViewPort3D::Line> lines = vp.getFrameLines();
00146 for(uint i=0; i<lines.size(); i++)
00147 drawLine(tmp, Point2D<int>(lines[i].p1), Point2D<int>(lines[i].p2), PixRGB<byte>(255,0,0));
00148 LINFO("Lines feedback");
00149 SHOWIMG(tmp);
00150
00151 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
00152
00153 }
00154
00155
00156
00157
00158
00159
00160 if (testGetPosition)
00161 {
00162 ViewPort3D vp(320,240, false, false, false);
00163 vp.setProjectionMatrix(90, 320/240, 0.005, 500);
00164 vp.setCamera(Point3D<float>(0,0,30), Point3D<float>(-200,0,0));
00165 while(1)
00166 {
00167 vp.initFrame();
00168
00169 vp.setColor(PixRGB<byte>(255,255,255));
00170 vp.drawGrid(Dims(300,300), Dims(10,10));
00171 vp.drawCircle(Point3D<float>(0,0,0),
00172 Point3D<float>(0,0,0),
00173 1, PixRGB<byte>(255,0,0));
00174
00175 Image<PixRGB<byte> > img = flipVertic(vp.getFrame());
00176
00177 Point3D<float> loc2D(159,164,1);
00178 Point3D<float> loc3D = vp.getPosition(loc2D);
00179 LINFO("2D loc %f,%f,%f => 3D loc %f,%f,%f",
00180 loc2D.x, loc2D.y, loc2D.z,
00181 loc3D.x, loc3D.y, loc3D.z);
00182
00183 loc2D = Point3D<float>(159,23,1);
00184 loc3D = vp.getPosition(loc2D);
00185 LINFO("2D loc %f,%f,%f => 3D loc %f,%f,%f",
00186 loc2D.x, loc2D.y, loc2D.z,
00187 loc3D.x, loc3D.y, loc3D.z);
00188
00189 SHOWIMG(img);
00190 ofs->writeRGB(img, "ViewPort3D", FrameInfo("ViewPort3D", SRC_POS));
00191 }
00192
00193
00194 vp.initFrame();
00195
00196 vp.drawGrid(Dims(300,300), Dims(10,10));
00197
00198 Point3D<float> loc2D(158,120,1);
00199 Point3D<float> loc3D = vp.getPosition(loc2D);
00200 LINFO("2D loc %f,%f,%f => 3D loc %f,%f,%f",
00201 loc2D.x, loc2D.y, loc2D.z,
00202 loc3D.x, loc3D.y, loc3D.z);
00203
00204 loc2D = Point3D<float>(213,160,1);
00205 loc3D = vp.getPosition(loc2D);
00206 LINFO("2D loc %f,%f,%f => 3D loc %f,%f,%f",
00207 loc2D.x, loc2D.y, loc2D.z,
00208 loc3D.x, loc3D.y, loc3D.z);
00209
00210
00211 Image<PixRGB<byte> > tmp(320, 240, ZEROS);
00212 std::vector<ViewPort3D::Line> lines = vp.getFrameLines();
00213 for(uint i=0; i<lines.size(); i++)
00214 drawLine(tmp, Point2D<int>(lines[i].p1), Point2D<int>(lines[i].p2), PixRGB<byte>(255,0,0));
00215 LINFO("Lines feedback");
00216 SHOWIMG(tmp);
00217
00218 }
00219
00220 ViewPort3D vp(320,240, false, true, false);
00221 vp.setCamera(Point3D<float>(0,0,350), Point3D<float>(-180,0,0));
00222
00223
00224 if (testSQ)
00225 {
00226 SuperQuadric superQuadric;
00227 while(1)
00228 {
00229 for(float n=0; n<1; n+=0.5)
00230 for(float e=0; e<1; e+=0.5)
00231 {
00232 for(float rot=0; rot<360; rot++)
00233 {
00234 vp.initFrame();
00235
00236 vp.setColor(PixRGB<byte>(255,255,255));
00237 glRotatef(rot, 0,0,1);
00238 glRotatef(45, 1,0,0);
00239
00240
00241 superQuadric.its_a1 =30;
00242 superQuadric.its_a2 = 30;
00243 superQuadric.its_a3 = 30;
00244 superQuadric.its_n = n;
00245 superQuadric.its_e = e;
00246 superQuadric.its_u1 = -M_PI / 2;
00247 superQuadric.its_u2 = M_PI / 2;
00248 superQuadric.its_v1 = -M_PI;
00249 superQuadric.its_v2 = M_PI;
00250 superQuadric.its_s1 = 0.0f;
00251 superQuadric.its_t1 = 0.0f;
00252 superQuadric.its_s2 = 1.0f;
00253 superQuadric.its_t2 = 1.0f;
00254
00255
00256
00257 superQuadric.solidEllipsoid();
00258
00259 Image<PixRGB<byte> > img = flipVertic(vp.getFrame());
00260 ofs->writeRGB(img, "ViewPort3D", FrameInfo("ViewPort3D", SRC_POS));
00261 usleep(10000);
00262 }
00263 }
00264 }
00265 }
00266
00267 int rot = 0;
00268 while(1)
00269 {
00270 vp.initFrame();
00271
00272 rot = ((rot +1)%360);
00273
00274
00275
00276
00277
00278 std::vector<Point2D<float> > contour;
00279
00280 float scale = 5;
00281 contour.push_back(Point2D<float>(0, 3)*scale);
00282 contour.push_back(Point2D<float>(1, 1)*scale);
00283 contour.push_back(Point2D<float>(5, 1)*scale);
00284 contour.push_back(Point2D<float>(8, 4)*scale);
00285 contour.push_back(Point2D<float>(10, 4)*scale);
00286 contour.push_back(Point2D<float>(11, 5)*scale);
00287 contour.push_back(Point2D<float>(11, 11.5)*scale);
00288 contour.push_back(Point2D<float>(13, 12)*scale);
00289 contour.push_back(Point2D<float>(13, 13)*scale);
00290 contour.push_back(Point2D<float>(10, 13.5)*scale);
00291 contour.push_back(Point2D<float>(13, 14)*scale);
00292 contour.push_back(Point2D<float>(13, 15)*scale);
00293 contour.push_back(Point2D<float>(11, 16)*scale);
00294 contour.push_back(Point2D<float>(8, 16)*scale);
00295 contour.push_back(Point2D<float>(7, 15)*scale);
00296 contour.push_back(Point2D<float>(7, 13)*scale);
00297 contour.push_back(Point2D<float>(8, 12)*scale);
00298 contour.push_back(Point2D<float>(7, 11)*scale);
00299 contour.push_back(Point2D<float>(6, 6)*scale);
00300 contour.push_back(Point2D<float>(4, 3)*scale);
00301 contour.push_back(Point2D<float>(3, 2)*scale);
00302 contour.push_back(Point2D<float>(1, 2)*scale);
00303
00304
00305 Point2D<float> center = centroid(contour);
00306 for(uint i=0; i<contour.size(); i++)
00307 contour[i] -= center;
00308
00309 vp.drawExtrudedContour(contour,
00310 Point3D<float>(-60,60,0),
00311 Point3D<float>(rot,rot,0),
00312 30.0F,
00313 PixRGB<byte>(256,0,0));
00314
00315
00316
00317 vp.drawBox( Point3D<float>(60,60,0),
00318 Point3D<float>(rot,rot,0),
00319 Point3D<float>(30, 30, 50),
00320 PixRGB<byte>(0,256,0)
00321 );
00322
00323
00324 vp.drawSphere( Point3D<float>(60,-60,0),
00325 Point3D<float>(rot,rot,0),
00326 Point3D<float>(30, 30, 60),
00327 PixRGB<byte>(0,0,256)
00328 );
00329
00330
00331 vp.drawCone( Point3D<float>(-60,-60,0),
00332 Point3D<float>(rot,rot,0),
00333 30,
00334 50,
00335 PixRGB<byte>(256,256,0)
00336 );
00337
00338 Image<PixRGB<byte> > img = flipVertic(vp.getFrame());
00339 ofs->writeRGB(img, "ViewPort3D", FrameInfo("ViewPort3D", SRC_POS));
00340 usleep(10000);
00341 }
00342
00343
00344 exit(0);
00345
00346 }
00347
00348