Changeset 2127 for GTP/trunk/Lib/Geom/shared/GeoTool
- Timestamp:
- 02/19/07 09:16:59 (18 years ago)
- Location:
- GTP/trunk/Lib/Geom/shared/GeoTool
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Geom/shared/GeoTool/include/GeoMeshView.h
r2090 r2127 37 37 bool mCW; 38 38 bool mCCW; 39 bool mBBox; 40 bool mAxes; 39 41 bool mPan; 40 42 bool mRotate; … … 116 118 void activeRotate(){mRotate = true;} 117 119 void deactiveRotate(){mRotate = false;} 120 121 // Counter Clockwise mode. 122 void activeAxes(){mAxes = true;} 123 void deactiveAxes(){mAxes = false;} 124 125 // Counter Clockwise mode. 126 void activeBoundingBox(){mBBox = true;} 127 void deactiveBoundingBox(){mBBox = false;} 118 128 119 129 // LodStrip mode. … … 170 180 void draw(); 171 181 172 // Gets the bounding box.173 //Geometry::GeometryBounds getBoundingBox();174 175 182 // Store one random color to each strip. 176 183 void setStripColors(); … … 211 218 int findLeavesSubMesh(void); 212 219 220 // Draw coordinates axes. 221 void drawAxes(); 222 223 // Draw bounding box. 224 void drawBoundingBox(); 225 213 226 private: 214 227 /* Draw the cube boundaries … … 242 255 float zMed; 243 256 257 float xMax; 258 float yMax; 259 float zMax; 260 float xMin; 261 float yMin; 262 float zMin; 263 244 264 int leavesSubMesh; 245 265 … … 257 277 258 278 virtual int handle(int event); 279 280 // Gets the bounding box. 281 void getBoundingBox(); 259 282 260 283 // Paint the mesh object. -
GTP/trunk/Lib/Geom/shared/GeoTool/include/GeoMeshViewUI.h
r2090 r2127 215 215 inline void cb_menuRenderTextures_i(fltk::Item*, void*); 216 216 static void cb_menuRenderTextures(fltk::Item*, void*); 217 inline void cb_menuRenderBoundingBox_i(fltk::Item*, void*); 218 static void cb_menuRenderBoundingBox(fltk::Item*, void*); 219 inline void cb_menuRenderAxes_i(fltk::Item*, void*); 220 static void cb_menuRenderAxes(fltk::Item*, void*); 217 221 inline void cb_menuStripify_i(fltk::Item*, void*); 218 222 static void cb_menuStripify(fltk::Item*, void*); -
GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshView.cpp
r2090 r2127 5 5 using namespace std; 6 6 7 //------------------------------------------------------------------------- --7 //------------------------------------------------------------------------- 8 8 // Handle events. 9 //------------------------------------------------------------------------- --9 //------------------------------------------------------------------------- 10 10 int GeoMeshView::handle(int event) 11 11 { … … 33 33 case fltk::DRAG: 34 34 35 button = fltk::event_ state();35 button = fltk::event_key(); 36 36 x = fltk::event_x(); 37 37 y = fltk::event_y(); 38 38 39 39 40 switch (button) 40 41 { 41 42 // Button 1 Pushed. 42 case 0x01100000:43 case 1: 43 44 44 45 if (x > mMouseX) … … 104 105 return 1; 105 106 106 case 0x04100000: 107 // Button 3 pushed. 108 case 2: 109 case 3: 107 110 108 111 if (y > mSizeY) … … 124 127 return 1; 125 128 126 } 129 } 127 130 128 131 case fltk::MOUSEWHEEL: … … 172 175 } 173 176 174 //------------------------------------------------------------------------- --177 //------------------------------------------------------------------------- 175 178 // Enable color strips. 176 //------------------------------------------------------------------------- --179 //------------------------------------------------------------------------- 177 180 void GeoMeshView::enableColorStrips() 178 181 { … … 180 183 } 181 184 182 //------------------------------------------------------------------------- --185 //------------------------------------------------------------------------- 183 186 // Disable color strips. 184 //------------------------------------------------------------------------- --187 //------------------------------------------------------------------------- 185 188 void GeoMeshView::disableColorStrips() 186 189 { … … 188 191 } 189 192 190 //------------------------------------------------------------------------- --193 //------------------------------------------------------------------------- 191 194 // Gets the color strips state. 192 //------------------------------------------------------------------------- --195 //------------------------------------------------------------------------- 193 196 bool GeoMeshView::getColorStrips() 194 197 { … … 196 199 } 197 200 198 //------------------------------------------------------------------------- --201 //------------------------------------------------------------------------- 199 202 // Set the color to the submesh sumbmeshIndex 200 //------------------------------------------------------------------------- --203 //------------------------------------------------------------------------- 201 204 void GeoMeshView::setSubMeshSelected(int submeshIndex) 202 205 { … … 204 207 } 205 208 206 //------------------------------------------------------------------------- --209 //------------------------------------------------------------------------- 207 210 // Sets the leaves submesh index. 208 //------------------------------------------------------------------------- --211 //------------------------------------------------------------------------- 209 212 void GeoMeshView::setLeavesSubMesh(int submeshIndex) 210 213 { … … 212 215 } 213 216 214 //------------------------------------------------------------------------- --217 //------------------------------------------------------------------------- 215 218 // Gets the leaves submesh index. 216 //------------------------------------------------------------------------- --219 //------------------------------------------------------------------------- 217 220 int GeoMeshView::getLeavesSubMesh() 218 221 { … … 220 223 } 221 224 222 //------------------------------------------------------------------------- --225 //------------------------------------------------------------------------- 223 226 // Set the list of strip colors. 224 //------------------------------------------------------------------------- --227 //------------------------------------------------------------------------- 225 228 void GeoMeshView::setStripColors() 226 229 { … … 253 256 } 254 257 } 255 256 258 257 259 // Sets random colors to each strip. 258 260 for (int submesh = 0; submesh < geoMesh->mSubMeshCount; submesh++) 259 { 261 { 260 262 // Gets the actual submesh. 261 263 geosubmesh = &geoMesh->mSubMesh[submesh]; … … 265 267 for (int strip = 0; strip < geosubmesh->mStripCount; strip++) 266 268 { 267 mStripColors[submesh][strip].r = rand()/((float)RAND_MAX);268 mStripColors[submesh][strip].g = rand()/((float)RAND_MAX);269 mStripColors[submesh][strip].b = rand()/((float)RAND_MAX);269 mStripColors[submesh][strip].r = (0.6 * rand() + 0.4 * (float)RAND_MAX)/((float)RAND_MAX); 270 mStripColors[submesh][strip].g = (0.6 * rand() + 0.4 * (float)RAND_MAX)/((float)RAND_MAX); 271 mStripColors[submesh][strip].b = (0.6 * rand() + 0.4 * (float)RAND_MAX)/((float)RAND_MAX); 270 272 } 271 273 } … … 276 278 } 277 279 278 /* 279 //--------------------------------------------------------------------------- 280 //------------------------------------------------------------------------- 280 281 // Get the bounding box of the object. 281 //--------------------------------------------------------------------------- 282 GeometryBounds GeoMeshView::getBoundingBox() 283 { 284 SubMesh *geosubmesh; 285 Index position; 286 Vector3 vector3; 287 GeometryBounds bounds; 288 float x,y,z; 289 float xMin,yMin,zMin; 290 float xMax,yMax,zMax; 291 292 // For each submesh. 293 for (int submesh = 0; submesh < geoMesh->mSubMeshCount; submesh++) 294 { 295 // Gets the actual submesh. 296 geosubmesh = &geoMesh->mSubMesh[submesh]; 297 298 // For each index of the strip. 299 for (int index = 0; index < geosubmesh->mIndexCount; index++) 300 { 301 position = geosubmesh->mIndex[index]; 302 303 // Gets the vertex coordinates. 304 vector3 = geosubmesh->mVertexBuffer->mPosition[position]; 305 306 x = vector3[0]; 307 y = vector3[1]; 308 z = vector3[2]; 309 310 // If is the first iteation. 311 if ((submesh == 0) && (index == 0)) 312 { 313 xMin = xMax = x; 314 yMin = yMax = y; 315 zMin = zMax = z; 316 } 317 else 318 { 319 if (x < xMin) 320 { 321 xMin = x; 322 } 323 else if (x > xMax) 324 { 325 xMax = x; 326 } 327 328 if (y < yMin) 329 { 330 yMin = y; 331 } 332 else if (y > yMax) 333 { 334 yMax = y; 335 } 336 337 if (z < zMin) 338 { 339 zMin = z; 340 } 341 else if (z > zMax) 342 { 343 zMax = z; 344 } 345 } 346 } 347 } 348 349 xMed = (xMax + xMin) / 2; 350 yMed = (yMax + yMin) / 2; 351 zMed = (zMax + zMin) / 2; 352 353 354 if ((xMax - xMin) > (yMax - yMin)) 355 { 356 if ((xMax - xMin) > (zMax - zMin)) 357 { 358 mScaleFactor = xMax - xMin; 359 } 360 else 361 { 362 mScaleFactor = zMax - zMin; 363 } 364 } 365 else 366 { 367 if ((yMax - yMin) > (zMax - zMin)) 368 { 369 mScaleFactor = yMax - yMin; 370 } 371 else 372 { 373 mScaleFactor = zMax - zMin; 374 } 375 } 376 377 // Set the bounds. 378 bounds.minx = xMin; 379 bounds.miny = yMin; 380 bounds.minz = zMin; 381 bounds.maxx = xMax; 382 bounds.maxy = yMax; 383 bounds.maxz = zMax; 384 bounds.radius = mScaleFactor; 385 386 return bounds; 387 } 388 */ 389 390 //--------------------------------------------------------------------------- 282 //------------------------------------------------------------------------- 283 void GeoMeshView::getBoundingBox() 284 { 285 float cx; 286 float cy; 287 float cz; 288 float scale; 289 290 xMax = geoMesh->mMeshBounds.maxX; 291 yMax = geoMesh->mMeshBounds.maxY; 292 zMax = geoMesh->mMeshBounds.maxZ; 293 xMin = geoMesh->mMeshBounds.minX; 294 yMin = geoMesh->mMeshBounds.minY; 295 zMin = geoMesh->mMeshBounds.minZ; 296 scale = geoMesh->mMeshBounds.scaleFactor; 297 298 // Calculate center of the model. 299 cx = (xMax + xMin) / 2.0f; 300 cy = (yMax + yMin) / 2.0f; 301 cz = (zMax + zMin) / 2.0f; 302 303 xMax -= cx; 304 yMax -= cy; 305 zMax -= cz; 306 xMin -= cx; 307 yMin -= cy; 308 zMin -= cz; 309 310 xMax *= scale; 311 yMax *= scale; 312 zMax *= scale; 313 xMin *= scale; 314 yMin *= scale; 315 zMin *= scale; 316 } 317 318 //------------------------------------------------------------------------- 391 319 // Constructor. 392 //------------------------------------------------------------------------- --320 //------------------------------------------------------------------------- 393 321 GeoMeshView::GeoMeshView( int x, 394 322 int y, … … 446 374 #define ALPHA 0.5 447 375 448 //------------------------------------------------------------------------- --376 //------------------------------------------------------------------------- 449 377 // Sets the Mesh to display. 450 //------------------------------------------------------------------------- --378 //------------------------------------------------------------------------- 451 379 void GeoMeshView::setMesh(Mesh *geomesh) 452 380 { … … 458 386 mScaleFactor = geomesh->mMeshBounds.scaleFactor; 459 387 388 // Gets boundings of mesh. 389 getBoundingBox(); 390 460 391 // Refresh vertices to the vertex array. 461 392 refreshVertices(geomesh); … … 478 409 } 479 410 480 //------------------------------------------------------------------------- --411 //------------------------------------------------------------------------- 481 412 // Refresh vertices to the vertex array. 482 //------------------------------------------------------------------------- --413 //------------------------------------------------------------------------- 483 414 void GeoMeshView::refreshVertices(Mesh *geomesh) 484 415 { … … 603 534 } 604 535 605 //------------------------------------------------------------------------- --536 //------------------------------------------------------------------------- 606 537 // Gets the triangle count of the current lod. 607 //------------------------------------------------------------------------- --538 //------------------------------------------------------------------------- 608 539 size_t GeoMeshView::getLodStripsTriangleCount() 609 540 { … … 618 549 } 619 550 620 //------------------------------------------------------------------------- --551 //------------------------------------------------------------------------- 621 552 // Repaint the Mesh. 622 //------------------------------------------------------------------------- --553 //------------------------------------------------------------------------- 623 554 void GeoMeshView::drawGeoMesh(bool paintWire) 624 555 { … … 667 598 }// End drawGeoMesh. 668 599 669 //------------------------------------------------------------------------- --600 //------------------------------------------------------------------------- 670 601 // Paint eah strip separately. 671 //------------------------------------------------------------------------- --602 //------------------------------------------------------------------------- 672 603 void GeoMeshView::drawTriangleStrip(int submesh) 673 604 { … … 745 676 } 746 677 747 748 678 //VERTEX ARRAYS 749 679 glEnableClientState(GL_VERTEX_ARRAY); … … 780 710 }//End drawTriangleStrip. 781 711 782 //------------------------------------------------------------------------- --783 // Paint the array of i dices.784 //------------------------------------------------------------------------- --712 //------------------------------------------------------------------------- 713 // Paint the array of indices. 714 //------------------------------------------------------------------------- 785 715 void GeoMeshView::drawTriangleList( int submesh, 786 716 bool selectedSubMesh, … … 895 825 }//End drawTriangleList 896 826 897 //------------------------------------------------------------------------- --827 //------------------------------------------------------------------------- 898 828 // Paint lodstrip object. 899 //------------------------------------------------------------------------- --829 //------------------------------------------------------------------------- 900 830 void GeoMeshView::drawLodStrip() 901 831 { … … 970 900 }//End drawTriangleStrip. 971 901 972 //------------------------------------------------------------------------- --902 //------------------------------------------------------------------------- 973 903 // Paint lodtree object. 974 //------------------------------------------------------------------------- --904 //------------------------------------------------------------------------- 975 905 void GeoMeshView::drawLodTree() 976 906 { … … 1090 1020 } 1091 1021 1092 //------------------------------------------------------------------------- --1022 //------------------------------------------------------------------------- 1093 1023 // Sets the lodstripslibrary object. 1094 //------------------------------------------------------------------------- --1024 //------------------------------------------------------------------------- 1095 1025 void GeoMeshView::setLodStripsLibrary(LodStripsLibrary *lodstrips) 1096 1026 { … … 1099 1029 } 1100 1030 1101 //------------------------------------------------------------------------- --1031 //------------------------------------------------------------------------- 1102 1032 // Sets the lodtreeslibrary object. 1103 //------------------------------------------------------------------------- --1033 //------------------------------------------------------------------------- 1104 1034 void GeoMeshView::setLodTreesLibrary(LodTreeLibrary *lodtrees) 1105 1035 { … … 1108 1038 } 1109 1039 1110 //------------------------------------------------------------------------- --1040 //------------------------------------------------------------------------- 1111 1041 // Change de Level of detail of the object. 1112 //------------------------------------------------------------------------- --1042 //------------------------------------------------------------------------- 1113 1043 void GeoMeshView::GoToLod_LodStrip(float lod) 1114 1044 { … … 1126 1056 } 1127 1057 1128 //------------------------------------------------------------------------- --1058 //------------------------------------------------------------------------- 1129 1059 // Change de Level of detail of the object. 1130 //------------------------------------------------------------------------- --1060 //------------------------------------------------------------------------- 1131 1061 void GeoMeshView::GoToLod_LodTree(float lod) 1132 1062 { … … 1139 1069 } 1140 1070 1141 //--------------------------------------------------------------------------- 1071 //------------------------------------------------------------------------- 1072 // Draw axes. 1073 //------------------------------------------------------------------------- 1074 void GeoMeshView::drawAxes() 1075 { 1076 float max; 1077 1078 max = xMax; 1079 1080 if (yMax > max) 1081 { 1082 max = yMax; 1083 } 1084 1085 if (zMax > max) 1086 { 1087 max = zMax; 1088 } 1089 1090 glDisable(GL_LIGHTING); 1091 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); 1092 glDisable(GL_CULL_FACE); 1093 1094 // Set white color to the object. 1095 glColor3d(1.0, 0.0, 0.0); 1096 1097 // X axis. 1098 glBegin(GL_LINES); 1099 glVertex3f(0.0f,0.0f,0.0f); 1100 glVertex3f(max,0.0f,0.0f); 1101 glEnd(); 1102 1103 // Set white color to the object. 1104 glColor3d(0.0, 1.0, 0.0); 1105 1106 // Y axis. 1107 glBegin(GL_LINES); 1108 glVertex3f(0.0f,0.0f,0.0f); 1109 glVertex3f(0.0f,max,0.0f); 1110 glEnd(); 1111 1112 // Set white color to the object. 1113 glColor3d(0.0, 0.0, 1.0); 1114 1115 // Z axis. 1116 glBegin(GL_LINES); 1117 glVertex3f(0.0f,0.0f,0.0f); 1118 glVertex3f(0.0f,0.0f,max); 1119 glEnd(); 1120 } 1121 1122 //------------------------------------------------------------------------- 1123 // Draw bounding box. 1124 //------------------------------------------------------------------------- 1125 void GeoMeshView::drawBoundingBox() 1126 { 1127 glDisable(GL_LIGHTING); 1128 glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); 1129 glDisable(GL_CULL_FACE); 1130 1131 // Set white color to the object. 1132 glColor3d(0.0, 0.0, 0.0); 1133 1134 glBegin(GL_QUADS); 1135 glVertex3f(xMin,yMin,zMin); 1136 glVertex3f(xMin,yMax,zMin); 1137 glVertex3f(xMax,yMax,zMin); 1138 glVertex3f(xMax,yMin,zMin); 1139 1140 glVertex3f(xMin,yMin,zMin); 1141 glVertex3f(xMin,yMax,zMin); 1142 glVertex3f(xMin,yMax,zMax); 1143 glVertex3f(xMin,yMin,zMax); 1144 1145 glVertex3f(xMax,yMin,zMin); 1146 glVertex3f(xMax,yMax,zMin); 1147 glVertex3f(xMax,yMax,zMax); 1148 glVertex3f(xMax,yMin,zMax); 1149 1150 glVertex3f(xMax,yMin,zMax); 1151 glVertex3f(xMax,yMax,zMax); 1152 glVertex3f(xMin,yMax,zMax); 1153 glVertex3f(xMin,yMin,zMax); 1154 1155 glVertex3f(xMin,yMin,zMax); 1156 glVertex3f(xMax,yMin,zMax); 1157 glVertex3f(xMax,yMin,zMin); 1158 glVertex3f(xMin,yMin,zMin); 1159 1160 glVertex3f(xMin,yMax,zMax); 1161 glVertex3f(xMax,yMax,zMax); 1162 glVertex3f(xMax,yMax,zMin); 1163 glVertex3f(xMin,yMax,zMin); 1164 1165 glEnd(); 1166 } 1167 1168 //------------------------------------------------------------------------- 1142 1169 // Draw the object in the window. 1143 //------------------------------------------------------------------------- --1170 //------------------------------------------------------------------------- 1144 1171 void GeoMeshView::draw() 1145 1172 { … … 1182 1209 //glTranslatef(-xMed,-yMed,-zMed); 1183 1210 1211 GLfloat color_blanco[] = {1.0f,1.0f,1.0f,1.0f}; 1212 1213 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color_blanco); 1214 1215 glClearColor(0.3,0.3,0.3,0); 1216 1217 if ((geoMesh != NULL) && mAxes) 1218 { 1219 // Draw coordinates axes. 1220 drawAxes(); 1221 } 1222 1223 if ((geoMesh != NULL) && mBBox) 1224 { 1225 // Draw bounding box. 1226 drawBoundingBox(); 1227 } 1228 1184 1229 // Set white color to the object. 1185 1230 glColor3d(1.0, 1.0, 1.0); 1186 1231 1187 GLfloat color_blanco[] = {1.0f,1.0f,1.0f,1.0f}; 1188 1189 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color_blanco); 1190 1191 glClearColor(0.3,0.3,0.3,0); 1192 1232 if (mLighting) 1233 { 1234 glEnable(GL_LIGHTING); 1235 } 1236 else 1237 { 1238 glDisable(GL_LIGHTING); 1239 } 1240 1193 1241 if (mCW) 1194 1242 { … … 1214 1262 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); 1215 1263 drawGeoMesh(false); 1216 }1217 1218 if (mLighting)1219 {1220 glEnable(GL_LIGHTING);1221 }1222 else1223 {1224 glDisable(GL_LIGHTING);1225 1264 } 1226 1265 … … 1264 1303 1265 1304 swap_buffers(); 1266 1267 // Calculate the FPS.1268 //calcFPS();1269 1305 } 1270 1306 -
GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshViewUI.cpp
r2103 r2127 653 653 -> 654 654 cb_menuRenderTextures_i(o,v); 655 } 656 657 //------------------------------------------------------------------------- 658 // Bounding Box callback 659 //------------------------------------------------------------------------- 660 inline void GeoMeshViewUI::cb_menuRenderBoundingBox_i(fltk::Item *item, 661 void *v) 662 { 663 // If the item is activated. 664 if (item->value()) 665 { 666 geoMeshView->activeBoundingBox(); 667 } 668 else 669 { 670 geoMeshView->deactiveBoundingBox(); 671 } 672 673 // Repaint the main window. 674 mMainWindow->redraw(); 675 } 676 677 void GeoMeshViewUI::cb_menuRenderBoundingBox(fltk::Item* o, void* v) 678 { 679 ((GeoMeshViewUI*) (o->parent()->parent()->parent()->user_data())) 680 -> 681 cb_menuRenderBoundingBox_i(o,v); 682 } 683 684 //------------------------------------------------------------------------- 685 // Axes callback 686 //------------------------------------------------------------------------- 687 inline void GeoMeshViewUI::cb_menuRenderAxes_i(fltk::Item *item, 688 void *v) 689 { 690 // If the item is activated. 691 if (item->value()) 692 { 693 geoMeshView->activeAxes(); 694 } 695 else 696 { 697 geoMeshView->deactiveAxes(); 698 } 699 700 // Repaint the main window. 701 mMainWindow->redraw(); 702 } 703 704 void GeoMeshViewUI::cb_menuRenderAxes(fltk::Item* o, void* v) 705 { 706 ((GeoMeshViewUI*) (o->parent()->parent()->parent()->user_data())) 707 -> 708 cb_menuRenderAxes_i(o,v); 655 709 } 656 710 … … 2468 2522 static char title[256]; 2469 2523 2470 fcho = new fltk::FileChooser("", "*.{mesh,obj}", fltk::FileChooser::CREATE, "Open a mesh"); 2524 fcho = new fltk::FileChooser("", 2525 "*.{mesh,obj}", 2526 fltk::FileChooser::CREATE, 2527 "Open a mesh"); 2471 2528 2472 2529 fcho->exec(); … … 2560 2617 } 2561 2618 } 2619 2562 2620 // Free memory. 2563 2621 delete fcho; … … 2993 3051 2994 3052 { 2995 fltk::Item* o = menuRenderTextures =new fltk::Item("Texture mapping");3053 fltk::Item* o = new fltk::Item("Texture mapping"); 2996 3054 o->type(fltk::Item::RADIO); 2997 3055 o->set_value(); 2998 3056 o->callback((fltk::Callback*)cb_menuRenderTextures); 3057 } 3058 3059 new fltk::Divider(); 3060 3061 { 3062 fltk::Item* o = new fltk::Item("Axis"); 3063 o->type(fltk::Item::RADIO); 3064 o->set_value(); 3065 o->callback((fltk::Callback*)cb_menuRenderAxes); 3066 } 3067 3068 { 3069 fltk::Item* o = new fltk::Item("Bounding Box"); 3070 o->type(fltk::Item::RADIO); 3071 o->set_value(); 3072 o->callback((fltk::Callback*)cb_menuRenderBoundingBox); 2999 3073 } 3000 3074 … … 3141 3215 GeoMeshViewUI::~GeoMeshViewUI() 3142 3216 { 3143 delete geoMeshLoader;3217 //delete geoMeshLoader; 3144 3218 mMainWindow->destroy(); 3145 3219 }
Note: See TracChangeset
for help on using the changeset viewer.