Changeset 491 for trunk/VUT/GtpVisibilityPreprocessor/src
- Timestamp:
- 01/03/06 18:37:32 (19 years ago)
- Location:
- trunk/VUT/GtpVisibilityPreprocessor/src
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/VUT/GtpVisibilityPreprocessor/src/Preprocessor.cpp
r490 r491 255 255 256 256 257 // use ascii format to store rays 258 #define USE_ASCII 0 259 260 257 261 inline bool ilt(Intersectable *obj1, Intersectable *obj2) 258 262 { … … 268 272 environment->GetStringValue("Preprocessor.samplesFilename", fileName); 269 273 270 Vector3 origin, termination; 271 // HACK: needed only for lower_bound algorithm 272 MeshInstance object(NULL); 273 ifstream samplesIn(fileName); 274 274 Vector3 origin, termination; 275 // HACK: needed only for lower_bound algorithm to find the 276 // intersected objects 277 MeshInstance sObj(NULL); 278 MeshInstance tObj(NULL); 279 280 #if USE_ASCII 281 ifstream samplesIn(fileName, ios::binary); 275 282 if (!samplesIn.is_open()) 276 283 return false; 277 284 278 285 string buf; 279 280 286 while (!(getline(samplesIn, buf)).eof()) 281 287 { 282 sscanf(buf.c_str(), "%f %f %f %f %f %f %d ",288 sscanf(buf.c_str(), "%f %f %f %f %f %f %d %d", 283 289 &origin.x, &origin.y, &origin.z, 284 &termination.x, &termination.y, &termination.z, &(object.mId)); 285 286 if (1) 290 &termination.x, &termination.y, &termination.z, 291 &(sObj.mId), &(tObj.mId)); 292 293 Intersectable *sourceObj = NULL; 294 Intersectable *termObj = NULL; 295 296 if (sObj.mId >= 0) 287 297 { 288 298 ObjectContainer::iterator oit = 289 lower_bound(objects.begin(), objects.end(), & object, ilt);290 291 samples.push_back(new VssRay(origin, termination, NULL, *oit));292 }293 else299 lower_bound(objects.begin(), objects.end(), &sObj, ilt); 300 sourceObj = *oit; 301 } 302 303 if (tObj.mId >= 0) 294 304 { 295 samples.push_back(new VssRay(origin, termination, NULL, objects[object.mId])); 296 } 297 } 298 305 ObjectContainer::iterator oit = 306 lower_bound(objects.begin(), objects.end(), &tObj, ilt); 307 termObj = *oit; 308 } 309 310 samples.push_back(new VssRay(origin, termination, sourceObj, termObj)); 311 } 312 #else 313 ifstream samplesIn(fileName, ios::binary); 314 if (!samplesIn.is_open()) 315 return false; 316 317 while (1) 318 { 319 samplesIn.read(reinterpret_cast<char *>(&origin), sizeof(Vector3)); 320 samplesIn.read(reinterpret_cast<char *>(&termination), sizeof(Vector3)); 321 samplesIn.read(reinterpret_cast<char *>(&(sObj.mId)), sizeof(int)); 322 samplesIn.read(reinterpret_cast<char *>(&(tObj.mId)), sizeof(int)); 323 324 if (samplesIn.eof()) 325 break; 326 327 Intersectable *sourceObj = NULL; 328 Intersectable *termObj = NULL; 329 330 if (sObj.mId >= 0) 331 { 332 ObjectContainer::iterator oit = 333 lower_bound(objects.begin(), objects.end(), &sObj, ilt); 334 sourceObj = *oit; 335 } 336 337 if (tObj.mId >= 0) 338 { 339 ObjectContainer::iterator oit = 340 lower_bound(objects.begin(), objects.end(), &tObj, ilt); 341 termObj = *oit; 342 } 343 344 samples.push_back(new VssRay(origin, termination, sourceObj, termObj)); 345 } 346 347 #endif 299 348 samplesIn.close(); 300 349 … … 304 353 bool Preprocessor::WriteSamples(const VssRayContainer &samples) const 305 354 { 306 char buf[100];307 environment->GetStringValue("Preprocessor.samplesFilename", buf);308 ofstream samplesOut(buf);355 char fileName[100]; 356 environment->GetStringValue("Preprocessor.samplesFilename", fileName); 357 309 358 310 359 VssRayContainer::const_iterator it, it_end = samples.end(); 311 360 361 #if USE_ASCII 362 ofstream samplesOut(fileName); 312 363 if (!samplesOut.is_open()) 313 364 return false; … … 316 367 { 317 368 VssRay *ray = *it; 318 369 int sourceid = ray->mOriginObject ? ray->mOriginObject->mId : -1; 370 int termid = ray->mTerminationObject ? ray->mTerminationObject->mId : -1; 371 319 372 samplesOut << ray->GetOrigin().x << " " << ray->GetOrigin().y << " " << ray->GetOrigin().z << " " 320 373 << ray->GetTermination().x << " " << ray->GetTermination().y << " " << ray->GetTermination().z << " " 321 << ray->mTerminationObject->mId << "\n"; 322 } 374 << sourceid << " " << termid << "\n"; 375 } 376 #else 377 ofstream samplesOut(fileName, ios::binary); 378 if (!samplesOut.is_open()) 379 return false; 380 381 for (it = samples.begin(); it != it_end; ++ it) 382 { 383 VssRay *ray = *it; 384 Vector3 origin(ray->GetOrigin()); 385 Vector3 termination(ray->GetTermination()); 386 387 int sourceid = ray->mOriginObject ? ray->mOriginObject->mId : -1; 388 int termid = ray->mTerminationObject ? ray->mTerminationObject->mId : -1; 389 390 samplesOut.write(reinterpret_cast<char *>(&origin), sizeof(Vector3)); 391 samplesOut.write(reinterpret_cast<char *>(&termination), sizeof(Vector3)); 392 samplesOut.write(reinterpret_cast<char *>(&sourceid), sizeof(int)); 393 samplesOut.write(reinterpret_cast<char *>(&termid), sizeof(int)); 394 } 395 #endif 323 396 samplesOut.close(); 324 325 397 return true; 326 398 } -
trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.cpp
r490 r491 314 314 polys.pop_back(); 315 315 316 //Debug << "New polygon with plane: " << poly->GetSupportingPlane() << "\n"; 317 318 // classify polygon 316 //-- classify polygon 319 317 const int cf = poly->ClassifyPlane(plane, mEpsilon); 320 318 … … 387 385 app << "#N_LEAVES ( Number of leaves )\n" << Leaves() << "\n"; 388 386 389 app << "#N_SPLITS ( Number of splits )\n" << splits << "\n"; 387 app << "#N_POLYSPLITS ( Number of polygon splits )\n" << polySplits << "\n"; 388 389 app << "#AXIS_ALIGNED_SPLITS (number of axis aligned splits)\n" << splits[0] + splits[1] + splits[2] << endl; 390 391 app << "#N_SPLITS ( Number of splits in axes x y z\n"; 392 393 for (int i = 0; i < 3; ++ i) 394 app << splits[i] << " "; 395 app << endl; 390 396 391 397 app << "#N_PMAXDEPTHLEAVES ( Percentage of leaves at maximum depth )\n" … … 420 426 421 427 app << "#N_ROUTPUT_INPUT_POLYGONS ( ratio polygons after subdivision / input polygons )\n" << 422 (polys + splits) / (double)polys << endl;428 (polys + polySplits) / (double)polys << endl; 423 429 424 430 app << "===== END OF BspTree statistics ==========\n"; … … 529 535 CLEAR_CONTAINER(coincident); 530 536 531 mStat. splits += splits;537 mStat.polySplits += splits; 532 538 533 539 // push the children on the stack … … 962 968 startTime = GetTime(); 963 969 // subdivide polygons with plane 964 mStat. splits += SplitPolygons(interior->GetPlane(),965 *tData.mPolygons,966 967 *backData.mPolygons,968 coincident);970 mStat.polySplits += SplitPolygons(interior->GetPlane(), 971 *tData.mPolygons, 972 *frontData.mPolygons, 973 *backData.mPolygons, 974 coincident); 969 975 970 976 Debug << "time used for polygon splitting: " << TimeDiff(startTime, GetTime())*1e-3 << "s" << endl; -
trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellBsp.h
r490 r491 93 93 int nodes; 94 94 // number of splits 95 int splits; 95 int splits[3]; 96 96 97 // totals number of rays 97 98 int rays; … … 129 130 /// number of invalid leaves 130 131 int invalidLeaves; 132 /// polygon splits 133 int polySplits; 131 134 132 135 // Constructor … … 146 149 { 147 150 nodes = 0; 148 splits = 0; 151 for (int i = 0; i < 3; ++ i) 152 splits[i] = 0; 149 153 150 154 maxDepth = 0; … … 165 169 maxPvs = 0; 166 170 invalidLeaves = 0; 171 polySplits = 0; 167 172 } 168 173 -
trunk/VUT/GtpVisibilityPreprocessor/src/ViewCellsManager.cpp
r490 r491 1643 1643 1644 1644 1645 /********************************************************************** /1646 /* VspBspViewCellsManager implementation */1647 /********************************************************************** /1645 /************************************************************************/ 1646 /* VspBspViewCellsManager implementation */ 1647 /************************************************************************/ 1648 1648 1649 1649 … … 1722 1722 1723 1723 Debug << mVspBspTree->GetStatistics() << endl; 1724 1724 1725 // collapse invalid regions 1726 cout << "collapsing invalid tree regions ... "; 1725 1727 mVspBspTree->CollapseTree(mVspBspTree->GetRoot()); 1728 cout << "finished" << endl; 1729 cout << "reseting view cell stats ... "; 1726 1730 ResetViewCells(); 1731 cout << "finished" << endl; 1727 1732 1728 1733 Debug << "\nView cells after construction:\n" << mViewCellsStats << endl; 1729 1734 1735 if (1) // export initial view cells 1736 { 1737 cout << "exporting initial view cells (=leaves) ... "; 1738 Exporter *exporter = Exporter::GetExporter("view_cells.x3d"); 1739 1740 if (exporter) 1741 { 1742 //exporter->SetWireframe(); 1743 exporter->SetFilled(); 1744 ExportViewCells(exporter); 1745 1746 //if (mExportRays) 1747 // exporter->ExportRays(postProcessRays, RgbColor(1, 1, 0)); 1748 1749 if (mExportGeometry) 1750 exporter->ExportGeometry(objects); 1751 1752 delete exporter; 1753 } 1754 cout << "finished" << endl; 1755 } 1756 1730 1757 long startTime = GetTime(); 1758 cout << "Computing remaining ray contributions ... "; 1731 1759 // recast rest of rays 1732 1760 ComputeSampleContributions(savedRays); 1733 1761 cout << "finished" << endl; 1762 1734 1763 Debug << "Computed remaining ray contribution in " << TimeDiff(startTime, GetTime()) * 1e-3 1735 1764 << " secs" << endl; … … 1806 1835 Debug << ss << endl; 1807 1836 1808 if (1) // export view cells1809 {1810 cout << "exporting initial view cells (=leaves) ... ";1811 Exporter *exporter = Exporter::GetExporter("view_cells.x3d");1812 1813 if (exporter)1814 {1815 //exporter->SetWireframe();1816 exporter->SetFilled();1817 ExportViewCells(exporter);1818 1819 if (mExportRays)1820 {1821 exporter->ExportRays(postProcessRays, RgbColor(1, 1, 0));1822 }1823 1824 if (mExportGeometry)1825 {1826 Material m;1827 m.mDiffuseColor = RgbColor(0, 1, 0);1828 exporter->SetForcedMaterial(m);1829 exporter->SetFilled();1830 1831 exporter->ExportGeometry(objects);1832 }1833 1834 delete exporter;1835 }1836 cout << "finished" << endl;1837 }1838 1839 1837 //-- merge or subdivide view cells 1840 1838 int merged = 0; … … 1853 1851 << TimeDiff(startTime, GetTime()) *1e-3 << " secs" << endl << endl; 1854 1852 1853 cout << "reseting view cell stats ... "; 1855 1854 ResetViewCells(); 1855 cout << "finished" << endl; 1856 1856 1857 //BspLeaf::NewMail(); 1857 1858 if (1) // export merged view cells -
trunk/VUT/GtpVisibilityPreprocessor/src/VspBspTree.cpp
r490 r491 34 34 35 35 float BspMergeCandidate::sOverallCost = 0; 36 37 38 /// Adds object to the pvs of the front and back node 39 inline void AddObject2Pvs(Intersectable *object, 40 const int side, 41 int &pvsBack, 42 int &pvsFront) 43 { 44 if (!object) 45 return; 46 47 if (side <= 0) 48 { 49 if (!object->Mailed() && !object->Mailed(2)) 50 { 51 ++ pvsBack; 52 53 if (object->Mailed(1)) 54 object->Mail(2); 55 else 56 object->Mail(); 57 } 58 } 59 60 if (side >= 0) 61 { 62 if (!object->Mailed(1) && !object->Mailed(2)) 63 { 64 ++ pvsFront; 65 66 if (object->Mailed()) 67 object->Mail(2); 68 else 69 object->Mail(1); 70 } 71 } 72 } 73 36 74 37 75 /****************************************************************/ … … 509 547 510 548 // subdivide polygons 511 mStat.splits +=SplitPolygons(interior->GetPlane(),512 513 514 515 549 SplitPolygons(interior->GetPlane(), 550 *tData.mPolygons, 551 *frontData.mPolygons, 552 *backData.mPolygons, 553 coincident); 516 554 517 555 … … 755 793 756 794 float VspBspTree::SelectAxisAlignedPlane(Plane3 &plane, 757 const VspBspTraversalData &tData) 795 const VspBspTraversalData &tData, 796 int &bestAxis) 758 797 { 759 798 AxisAlignedBox3 box; … … 771 810 float nPosition[3]; 772 811 float nCostRatio[3]; 773 intbestAxis = -1;812 bestAxis = -1; 774 813 775 814 const int sAxis = box.Size().DrivingAxis(); … … 815 854 Vector3 normal(0,0,0); normal[bestAxis] = 1; 816 855 plane = Plane3(normal, nPosition[bestAxis]); 817 856 818 857 return nCostRatio[bestAxis]; 819 858 } 859 860 861 float VspBspTree::EvalCostRatio(const VspBspTraversalData &tData, 862 const AxisAlignedBox3 &box, 863 const int axis, 864 const float position, 865 int &raysBack, 866 int &raysFront, 867 int &pvsBack, 868 int &pvsFront) 869 { 870 raysBack = 0; 871 raysFront = 0; 872 pvsFront = 0; 873 pvsBack = 0; 874 875 Intersectable::NewMail(3); 876 877 // eval pvs size 878 const int pvsSize = tData.mPvs; 879 880 // create unique ids for pvs heuristics 881 GenerateUniqueIdsForPvs(); 882 883 // this is the main ray classification loop! 884 for(RayInfoContainer::iterator ri = tData.mRays->begin(); 885 ri != tData.mRays->end(); ++ ri) 886 { 887 if (!(*ri).mRay->IsActive()) 888 continue; 889 890 // determine the side of this ray with respect to the plane 891 float t; 892 int side = (*ri).ComputeRayIntersection(axis, position, t); 893 894 if (side <= 0) 895 ++ raysBack; 896 897 if (side >= 0) 898 ++ raysFront; 899 900 AddObjToPvs((*ri).mRay->mTerminationObject, side, pvsBack, pvsFront); 901 } 902 903 //-- only one of these options should be one 904 905 if (0) //-- only pvs 906 { 907 const float sum = float(pvsBack + pvsFront); 908 const float oldCost = (float)pvsSize; 909 910 return sum / oldCost; 911 } 912 913 //-- pvs + probability heuristics 914 float pBack, pFront, pOverall; 915 916 if (0) 917 { 918 // box length substitute for probability 919 const float minBox = box.Min(axis); 920 const float maxBox = box.Max(axis); 921 922 pBack = position - minBox; 923 pFront = maxBox - position; 924 pOverall = maxBox - minBox; 925 } 926 927 if (1) //-- area substitute for probability 928 { 929 930 const bool useMidSplit = true; 931 //const bool useMidSplit = false; 932 933 pOverall = box.SurfaceArea(); 934 935 if (!useMidSplit) 936 { 937 Vector3 pos = box.Max(); pos[axis] = position; 938 pBack = AxisAlignedBox3(box.Min(), pos).SurfaceArea(); 939 940 pos = box.Min(); pos[axis] = position; 941 pFront = AxisAlignedBox3(pos, box.Max()).SurfaceArea(); 942 } 943 else 944 { 945 //-- simplified computation for mid split 946 const int axis2 = (axis + 1) % 3; 947 const int axis3 = (axis + 2) % 3; 948 949 const float faceArea = 950 (box.Max(axis2) - box.Min(axis2)) * 951 (box.Max(axis3) - box.Min(axis3)); 952 953 pBack = pFront = pOverall * 0.5f + faceArea; 954 } 955 } 956 957 //-- ray density substitute for probability 958 if (0) 959 { 960 pBack = (float)raysBack; 961 pFront = (float)raysFront; 962 pOverall = (float)tData.mRays->size(); 963 } 964 965 //Debug << axis << " " << pvsSize << " " << pvsBack << " " << pvsFront << endl; 966 //Debug << pFront << " " << pBack << " " << pOverall << endl; 967 968 // float sum = raysBack*(position - minBox) + raysFront*(maxBox - position); 969 const float newCost = pvsBack * pBack + pvsFront * pFront; 970 // float oldCost = leaf->mRays.size(); 971 const float oldCost = (float)pvsSize * pOverall; 972 973 return (mCtDivCi + newCost) / oldCost; 974 } 975 820 976 821 977 … … 835 991 return true; 836 992 } 837 else838 {839 //-- choose plane on midpoint of a ray840 const int candidateIdx = (int)RandomValue(0, (Real)((int)data.mRays->size() - 1));841 842 const Vector3 minPt = (*data.mRays)[candidateIdx].ExtrapOrigin();843 const Vector3 maxPt = (*data.mRays)[candidateIdx].ExtrapTermination();844 845 const Vector3 pt = (maxPt + minPt) * 0.5;846 847 const Vector3 normal = (*data.mRays)[candidateIdx].mRay->GetDir();848 849 plane = Plane3(normal, pt);850 return true;851 }852 853 return false;854 993 } 855 994 … … 938 1077 // intermediate plane 939 1078 Plane3 plane; 1079 bool useAxisAlignedPlane = false; 940 1080 941 1081 const int limit = Min((int)data.mPolygons->size(), mMaxPolyCandidates); … … 967 1107 } 968 1108 969 #if 0 970 //-- choose candidate planes extracted from rays 971 //-- different methods are available 972 for (int i = 0; i < mMaxRayCandidates; ++ i) 973 { 974 plane = ChooseCandidatePlane3(*data.mRays); 975 candidateCost = SplitPlaneCost(plane, data); 976 977 if (candidateCost < lowestCost) 978 { 979 bestPlane = plane; 980 lowestCost = candidateCost; 981 } 982 } 983 #endif 984 985 // axis aligned splits 986 candidateCost = SelectAxisAlignedPlane(plane, data); 1109 //-- axis aligned splits 1110 int axis; 1111 candidateCost = SelectAxisAlignedPlane(plane, data, axis); 987 1112 988 1113 if (candidateCost < lowestCost) 989 { 1114 { 1115 if (!useAxisAlignedPlane) 1116 { 1117 useAxisAlignedPlane = true; 1118 //! error also computed if cost ratio is missed 1119 ++ mStat.splits[axis]; 1120 } 1121 990 1122 bestPlane = plane; 991 1123 lowestCost = candidateCost; … … 1031 1163 if (mSplitPlaneStrategy & PVS) 1032 1164 { 1165 // matt: change back!! 1166 Intersectable::NewMail(3); 1033 1167 // create unique ids for pvs heuristics 1034 GenerateUniqueIdsForPvs();1168 //GenerateUniqueIdsForPvs(); 1035 1169 1036 1170 if (mPvsUseArea) // use front and back cell areas to approximate volume … … 1056 1190 bool useRand; 1057 1191 1058 // choose test polyongs randomly if over threshold1192 // choose test rays randomly if too much 1059 1193 if ((int)data.mRays->size() > mMaxTests) 1060 1194 { … … 1095 1229 1096 1230 // add the termination object 1097 AddObjToPvs(ray->mTerminationObject, cf, frontPvs, backPvs); 1231 //AddObjToPvs(ray->mTerminationObject, cf, frontPvs, backPvs); 1232 AddObject2Pvs(ray->mTerminationObject, cf, frontPvs, backPvs); 1098 1233 // add the source object 1099 AddObjToPvs(ray->mOriginObject, cf, frontPvs, backPvs);1100 1101 // use number o r length of rays to approximate volume1234 //AddObjToPvs(ray->mOriginObject, cf, frontPvs, backPvs); 1235 1236 // use number of rays to approximate volume 1102 1237 if (!mPvsUseArea) 1103 1238 { 1104 float len = 1; 1105 1106 if (pvsUseLen) // use length of rays 1107 len = rayInf.SqrSegmentLength(); 1108 1109 pOverall += len; 1110 1111 if (cf == 1) 1112 pFront += len; 1113 else if (cf == -1) 1114 pBack += len; 1115 else if (cf == 0) 1116 { 1117 // use length of rays to approximate volume 1118 if (pvsUseLen) 1119 { 1120 float newLen = len * 1121 (rayInf.GetMaxT() - t) / 1122 (rayInf.GetMaxT() - rayInf.GetMinT()); 1123 1124 if (candidatePlane.Side(rayInf.ExtrapOrigin()) <= 0) 1125 { 1126 pBack += newLen; 1127 pFront += len - newLen; 1128 } 1129 else 1130 { 1131 pFront += newLen; 1132 pBack += len - newLen; 1133 } 1134 } 1135 else 1136 { 1137 ++ pFront; 1138 ++ pBack; 1139 } 1140 } 1239 ++ pOverall; 1240 1241 if (cf >= 0) 1242 ++ pFront; 1243 if (cf <= 0) 1244 ++ pBack; 1141 1245 } 1142 1246 } … … 1215 1319 } 1216 1320 } 1321 1217 1322 1218 1323 void VspBspTree::CollectLeaves(vector<BspLeaf *> &leaves) const -
trunk/VUT/GtpVisibilityPreprocessor/src/VspBspTree.h
r489 r491 421 421 */ 422 422 float SelectAxisAlignedPlane(Plane3 &plane, 423 const VspBspTraversalData &tData); 423 const VspBspTraversalData &tData, 424 int &bestAxis); 424 425 425 426 /** Sorts split candidates for surface area heuristics for axis aligned splits. … … 438 439 float &position); 439 440 441 /** Evaluates cost ratio for axis aligned splits. 442 */ 443 float EvalCostRatio(const VspBspTraversalData &tData, 444 const AxisAlignedBox3 &box, 445 const int axis, 446 const float position, 447 int &raysBack, 448 int &raysFront, 449 int &pvsBack, 450 int &pvsFront); 451 440 452 /** Selects an axis aligned split plane. 441 Returns true if split is valied453 @Returns true if split is valied 442 454 */ 443 455 bool SelectAxisAlignedPlane(Plane3 &plane, const PolygonContainer &polys) const; -
trunk/VUT/GtpVisibilityPreprocessor/src/VspKdTree.cpp
r486 r491 831 831 return (mCtDivCi + newCost) / oldCost; 832 832 } 833 833 834 834 835 float VspKdTree::BestCostRatioRegular(VspKdLeaf *leaf, -
trunk/VUT/GtpVisibilityPreprocessor/src/VssPreprocessor.cpp
r490 r491 12 12 #include "RenderSimulator.h" 13 13 14 bool useViewSpaceBox = true;14 bool useViewSpaceBox = false; 15 15 bool use2dSampling = false; 16 bool useViewspacePlane = true;16 bool useViewspacePlane = false; 17 17 18 18 VssPreprocessor::VssPreprocessor(): … … 464 464 WriteSamples(mVssRays); 465 465 cout << "finished\n" << endl; 466 } 467 468 //VssRayContainer dummyRays; 469 //LoadSamples(dummyRays, mObjects); 470 //Debug << "rays " << (int)mVssRays.size() << " " << dummyRays.size() << endl; 466 467 /*VssRayContainer dummyRays; 468 LoadSamples(dummyRays, mObjects); 469 Debug << "rays " << (int)mVssRays.size() << " " << dummyRays.size() << endl; 470 471 for (int i = 0; i < (int)mVssRays.size(); ++ i) 472 { 473 Debug << mVssRays[i]->GetOrigin() << " " << mVssRays[i]->GetTermination() << " " << mVssRays[i]->mOriginObject << " " << mVssRays[i]->mTerminationObject << endl; 474 Debug << dummyRays[i]->GetOrigin() << " " << dummyRays[i]->GetTermination() << " " << dummyRays[i]->mOriginObject << " " << dummyRays[i]->mTerminationObject << endl << endl; 475 }*/ 476 } 471 477 472 478 //int numExportRays = 10000;
Note: See TracChangeset
for help on using the changeset viewer.