Changeset 2539 for GTP/trunk/Lib/Vis/Preprocessing/src/VspTree.h
- Timestamp:
- 08/08/07 15:50:33 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/Lib/Vis/Preprocessing/src/VspTree.h
r2353 r2539 147 147 148 148 149 /** 150 VspNode abstract class serving for interior and leaf node implementation 149 /** VspNode abstract class serving for interior and leaf node implementation 151 150 */ 152 151 class VspNode 153 152 { 153 friend class VspTree; 154 154 155 public: 155 156 … … 172 173 */ 173 174 virtual bool IsRoot() const; 174 175 175 /** Returns parent node. 176 176 */ 177 177 VspInterior *GetParent(); 178 179 178 /** Sets parent node. 180 179 */ 181 180 void SetParent(VspInterior *parent); 182 183 181 /** Returns true if this node is a sibling of node n. 184 182 */ 185 183 bool IsSibling(VspNode *n) const; 186 187 184 /** returns depth of the node. 188 185 */ 189 186 int GetDepth() const; 190 191 /** returns true if the whole subtree is valid 187 /** Returns true if this node (which represents the whole subtree) is valid 192 188 */ 193 189 bool TreeValid() const; 194 190 /** Sets this node to valid. 191 */ 195 192 void SetTreeValid(const bool v); 196 197 193 /** Cost of mergin this node. 198 194 */ 199 195 float GetMergeCost() {return (float)-mTimeStamp; } 200 196 197 /// timestamp of this node 201 198 int mTimeStamp; 202 199 … … 212 209 int mMailbox; 213 210 214 //int mPvsEntriesIncr; 215 //float mMemoryIncr; 216 //float mRenderCostDecr; 217 211 218 212 protected: 219 213 220 214 /// if this sub tree is a completely valid view space region 221 215 bool mTreeValid; 222 223 216 /// parent of this node 224 217 VspInterior *mParent; … … 230 223 class VspInterior: public VspNode 231 224 { 225 friend class VspTree; 226 232 227 public: 233 228 … … 237 232 238 233 ~VspInterior(); 239 240 234 /** @return false since it is an interior node 241 235 */ 242 bool IsLeaf() const { 243 return false; 244 } 245 236 bool IsLeaf() const { return false; } 246 237 247 238 int Type() const; 248 249 VspNode *GetBack() { 250 return mBack; 251 } 252 253 254 VspNode *GetFront() { 255 return mFront; 256 } 257 239 /** Returns back child. 240 */ 241 VspNode *GetBack() { return mBack; } 242 /** Returns front child. 243 */ 244 VspNode *GetFront() { return mFront; } 258 245 /** Returns split plane. 259 246 */ 260 AxisAlignedPlane GetPlane() const { 261 return mPlane; 262 } 263 264 247 AxisAlignedPlane GetPlane() const { return mPlane; } 265 248 /** Returns position of split plane. 266 249 */ 267 float GetPosition() const { 268 return mPlane.mPosition; 269 } 270 250 float GetPosition() const { return mPlane.mPosition; } 271 251 /** Returns split axis. 272 252 */ 273 int GetAxis() const { 274 return mPlane.mAxis; 275 } 276 253 int GetAxis() const { return mPlane.mAxis; } 277 254 /** Replace front or back child with new child. 278 255 */ 279 256 void ReplaceChildLink(VspNode *oldChild, VspNode *newChild); 280 281 257 /** Replace front and back child. 282 258 */ 283 259 void SetupChildLinks(VspNode *front, VspNode *back); 260 /** Returns boundiŽng box of this node. 261 */ 262 AxisAlignedBox3 GetBoundingBox() const; 263 /** Sets boundiong box of this node. 264 */ 265 void SetBoundingBox(const AxisAlignedBox3 &box); 266 /** Computes intersection of this plane with the ray segment. 267 */ 268 int ComputeRayIntersection(const RayInfo &rayData, float &t) const 269 { 270 return rayData.ComputeRayIntersection(mPlane.mAxis, mPlane.mPosition, t); 271 } 284 272 285 273 friend std::ostream &operator<<(std::ostream &s, const VspInterior &A) … … 288 276 } 289 277 290 AxisAlignedBox3 GetBoundingBox() const;291 void SetBoundingBox(const AxisAlignedBox3 &box);292 293 /** Computes intersection of this plane with the ray segment.294 */295 int ComputeRayIntersection(const RayInfo &rayData, float &t) const296 {297 return rayData.ComputeRayIntersection(mPlane.mAxis, mPlane.mPosition, t);298 }299 300 278 301 279 protected: 280 302 281 /// bounding box for this interior node: should we really store this? 303 282 AxisAlignedBox3 mBoundingBox; 304 305 283 /// Splitting plane corresponding to this node 306 284 AxisAlignedPlane mPlane; 307 308 285 /// back node 309 286 VspNode *mBack; … … 329 306 /** @return true since it is an interior node 330 307 */ 331 bool IsLeaf() const { 332 return true; 333 } 308 bool IsLeaf() const { return true; } 334 309 335 310 int Type() const; … … 337 312 /** Returns pointer of view cell. 338 313 */ 339 ViewCellLeaf *GetViewCell() const { 340 return mViewCell; 341 } 342 314 ViewCellLeaf *GetViewCell() const { return mViewCell; } 343 315 /** Sets pointer to view cell. 344 316 */ … … 383 355 public: 384 356 357 /////////// 358 //-- Helper structs / classes 359 385 360 /** Additional data which is passed down the BSP tree during traversal. 386 361 */ 387 classVspTraversalData362 struct VspTraversalData 388 363 { 389 364 public: 390 365 391 /** Returns average ray contribution. 392 */ 393 float GetAvgRayContribution() const 394 { 395 return (float)mPvs / ((float)mRays->size() + Limits::Small); 396 } 397 398 399 /** Returns average rays per object. 400 */ 401 float GetAvgRaysPerObject() const 402 { 403 return (float)mRays->size() / ((float)mPvs + Limits::Small); 404 } 405 406 VspTraversalData(): 407 mNode(NULL), 408 mDepth(0), 409 mRays(NULL), 410 mPvs(0), 411 mProbability(0.0), 412 mMaxCostMisses(0), 413 mPriority(0), 414 mCorrectedPvs(0) 415 {} 366 VspTraversalData(); 416 367 417 368 VspTraversalData(VspLeaf *node, … … 420 371 const float pvs, 421 372 const float p, 422 const AxisAlignedBox3 &box): 423 mNode(node), 424 mDepth(depth), 425 mRays(rays), 426 mProbability(p), 427 mBoundingBox(box), 428 mMaxCostMisses(0), 429 mPriority(0), 430 mCorrectedPvs(0), 431 mPvs(pvs), 432 mRenderCost(0), 433 mCorrectedRenderCost(0) 434 {} 435 436 VspTraversalData(const int depth, 437 RayInfoContainer *rays, 438 const AxisAlignedBox3 &box): 439 mNode(NULL), 440 mDepth(depth), 441 mRays(rays), 442 mProbability(0), 443 mMaxCostMisses(0), 444 mBoundingBox(box), 445 mCorrectedPvs(0), 446 mPvs(0) , 447 mRenderCost(0), 448 mCorrectedRenderCost(0) 449 {} 450 373 const AxisAlignedBox3 &box); 374 375 451 376 /** Returns cost of the traversal data. 452 377 */ 453 float GetCost() const 454 { 455 return mPriority; 456 } 457 458 /// deletes contents and sets them to NULL 459 void Clear() 460 { 461 DEL_PTR(mRays); 462 463 if (mNode) 464 { 465 // delete old view cell 466 delete mNode->GetViewCell(); 467 468 delete mNode; 469 mNode = NULL; 470 } 471 } 378 inline float GetCost() const; 379 /** Returns average ray contribution. 380 */ 381 inline float GetAvgRayContribution() const; 382 /** Returns average rays per object. 383 */ 384 inline float GetAvgRaysPerObject() const; 385 /** deletes contents and sets them to NULL. 386 */ 387 void Clear(); 388 389 390 ////////////////////// 472 391 473 392 /// the current node … … 500 419 }; 501 420 421 /** Helper struct for data that comes with a split of a node. 422 */ 502 423 struct SplitData 503 424 { … … 511 432 mFrontTriangles(0), 512 433 mBackTriangles(0), 513 mTotalTriangles(0) {} 514 434 mTotalTriangles(0) 435 {} 436 437 ////////////// 515 438 516 439 float mFrontRenderCost; … … 580 503 {} 581 504 582 float GetPriority() const 583 { 584 return mPriority; 585 } 505 float GetPriority() const { return mPriority; } 506 586 507 587 508 //////////////////// 588 509 589 510 static VspTree* sVspTree; 590 591 511 /// the current split plane 592 512 AxisAlignedPlane mSplitPlane; … … 623 543 }; 624 544 545 546 ////////////////////// 547 548 625 549 /** Default constructor creating an empty tree. 626 550 */ … … 629 553 */ 630 554 ~VspTree(); 631 632 555 /** Returns BSP Tree statistics. 633 556 */ 634 557 const VspTreeStatistics &GetStatistics() const; 635 636 558 /** Returns bounding box of the specified node. 637 559 */ 638 560 AxisAlignedBox3 GetBoundingBox(VspNode *node) const; 639 640 561 /** Returns list of BSP leaves with pvs smaller than 641 562 a certain threshold. … … 646 567 const bool onlyUnmailed = false, 647 568 const int maxPvs = -1) const; 648 649 569 /** Returns box which bounds the whole tree. 650 570 */ 651 571 AxisAlignedBox3 GetBoundingBox() const; 652 653 572 /** Returns root of the view space partitioning tree. 654 573 */ 655 574 VspNode *GetRoot() const; 656 657 575 /** Collects the leaf view cells of the tree 658 576 @param viewCells returns the view cells 659 577 */ 660 578 void CollectViewCells(ViewCellContainer &viewCells, bool onlyValid) const; 661 662 579 /** A ray is cast possible intersecting the tree. 663 580 @param the ray that is cast. … … 665 582 */ 666 583 int CastRay(Ray &ray); 667 668 669 584 /** finds neighbouring leaves of this tree node. 670 585 */ … … 672 587 vector<VspLeaf *> &neighbors, 673 588 const bool onlyUnmailed) const; 674 675 589 /** Returns random leaf of BSP tree. 676 590 @param halfspace defines the halfspace from which the leaf is taken. … … 682 596 */ 683 597 VspLeaf *GetRandomLeaf(const bool onlyUnmailed = false); 684 685 598 /** Returns epsilon of this tree. 686 599 */ 687 600 float GetEpsilon() const; 688 689 601 /** Casts line segment into the tree. 690 602 @param origin the origin of the line segment … … 696 608 ViewCellContainer &viewcells, 697 609 const bool useMailboxing = true); 698 699 700 610 /** Sets pointer to view cells manager. 701 611 */ 702 612 void SetViewCellsManager(ViewCellsManager *vcm); 703 704 613 /** Returns view cell the current point is located in. 705 614 @param point the current view point … … 708 617 */ 709 618 ViewCell *GetViewCell(const Vector3 &point, const bool active = false); 710 711 712 619 /** Returns true if this view point is in a valid view space, 713 620 false otherwise. 714 621 */ 715 622 bool ViewPointValid(const Vector3 &viewPoint) const; 716 717 623 /** Returns view cell corresponding to 718 624 the invalid view space. 719 625 */ 720 626 VspViewCell *GetOutOfBoundsCell(); 721 722 /** Writes tree to output stream723 */724 bool Export(OUT_STREAM &stream);725 726 627 /** Casts beam, i.e. a 5D frustum of rays, into tree. 727 628 Tests conservative using the bounding box of the nodes. … … 729 630 */ 730 631 int CastBeam(Beam &beam); 731 732 632 /** Checks if tree validity-flags are right 733 633 with respect to view cell valitiy. … … 735 635 */ 736 636 void ValidateTree(); 737 738 637 /** Collects rays stored in the leaves. 739 638 */ 740 639 void CollectRays(VssRayContainer &rays); 741 742 640 /** Intersects box with the tree and returns the number of intersected boxes. 743 641 @returns number of view cells found … … 745 643 int ComputeBoxIntersections(const AxisAlignedBox3 &box, 746 644 ViewCellContainer &viewCells) const; 747 748 645 /** Returns view cells of this ray, either taking precomputed cells 749 646 or by recomputation. 750 647 */ 751 648 void GetViewCells(const VssRay &ray, ViewCellContainer &viewCells); 752 753 649 /** Returns view cells tree. 754 650 */ 755 651 ViewCellsTree *GetViewCellsTree() const { return mViewCellsTree; } 756 757 652 /** Sets the view cells tree. 758 653 */ 759 654 void SetViewCellsTree(ViewCellsTree *vt) { mViewCellsTree = vt; } 760 655 /** Writes vsp tree to output stream 656 */ 657 bool Export(OUT_STREAM &stream); 658 /** Writes vsp tree to binary output stream. 659 */ 660 bool ExportBinary(OUT_STREAM &stream); 661 /** Imports tree from binary format. 662 */ 663 bool ImportBinary(IN_STREAM &stream, ObjectContainer &pvsObjects); 664 665 666 //////////// 761 667 762 668 PerfTimer mSortTimer; … … 808 714 float &pFront, 809 715 float &pBack) const; 810 716 /** If != NULL, sets the bounding box to the forced bounding box. 717 Else computes the bounding box of the view space using the 718 hit points gathered from the ray-object intersections. 719 */ 811 720 void ComputeBoundingBox(const VssRayContainer &rays, 812 721 AxisAlignedBox3 *forcedBoundingBox); 813 814 722 /** Evaluates candidate for splitting. 815 723 */ 816 void EvalSubdivisionCandidate(VspSubdivisionCandidate & splitData,724 void EvalSubdivisionCandidate(VspSubdivisionCandidate &candidate, 817 725 bool computeSplitPlane = true); 818 819 726 /** Evaluates render cost decrease of next split. 820 727 */ 821 float EvalRenderCostDecrease(VspSubdivisionCandidate & splitData,728 float EvalRenderCostDecrease(VspSubdivisionCandidate &candidate, 822 729 float &normalizedOldRenderCost, 823 730 const SplitData &data) const; 824 825 731 /** Collects view cells in the subtree under root. 826 732 */ … … 829 735 ViewCellContainer &viewCells, 830 736 bool onlyUnmailed = false) const; 831 832 737 /** Returns view cell corresponding to 833 738 the invalid view space. If it does not exist, it is created. 834 739 */ 835 740 VspViewCell *GetOrCreateOutOfBoundsCell(); 836 837 741 /** Collapses the tree with respect to the view cell partition, 838 742 i.e. leaves having the same view cell are collapsed. … … 843 747 */ 844 748 VspNode *CollapseTree(VspNode *node, int &collapsed); 845 846 749 /** Helper function revalidating the view cell leaf list after merge. 847 750 */ 848 751 void RepairViewCellsLeafLists(); 849 850 752 /** Evaluates tree stats in the BSP tree leafs. 851 753 */ … … 861 763 SubdivisionCandidate *splitCandidate, 862 764 const bool globalCriteriaMet); 863 864 765 /** Adds stats to subdivision log file. 865 766 */ … … 868 769 const float totalRenderCost, 869 770 const float avgRenderCost); 870 871 771 /** Subdivides leaf. 872 873 772 @param tData data object holding, e.g., a pointer to the leaf 874 773 @param frontData returns the data (e.g., pointer to the leaf) in front of the split plane 875 774 @param backData returns the data (e.g., pointer to the leaf) in the back of the split plane 876 877 @param rays the polygons to be filtered878 @param frontRays returns the polygons in front of the split plane879 775 880 776 @returns the root of the subdivision … … 891 787 float &pFront, 892 788 float &pBack); 893 894 789 /** Sorts split candidates along the specified axis. 895 790 The split candidates are generated on possible visibility … … 905 800 float minBand, 906 801 float maxBand); 907 908 802 /** Evaluate render cost of this pvs. 909 803 */ … … 912 806 int EvalPvsEntriesIncr(VspSubdivisionCandidate &splitCandidate, 913 807 const SplitData &sData) const; 914 915 808 /** Returns number of effective entries in the pvs. 916 809 */ … … 918 811 919 812 int EvalPvsEntriesContribution(const VssRay &ray, const bool isTermination) const; 920 921 813 /** Computes best cost for axis aligned planes. 922 814 */ … … 928 820 929 821 930 /////////////////////// ///////////////////931 // Helper function for computing heuristics822 /////////////////////// 823 //-- Helper function for computing heuristics 932 824 933 825 /** Evaluates the contribution to left and right pvs at a visibility event ve. … … 937 829 */ 938 830 inline void EvalHeuristics(const SortableEntry &ve, float &pvsLeft, float &pvsRight) const; 939 940 831 /** Evaluates contribution of min event to pvs 941 832 */ 942 833 inline float EvalMinEventContribution(const VssRay &ray, const bool isTermination) const; 943 944 834 /** Evaluates contribution of max event to pvs 945 835 */ 946 836 inline float EvalMaxEventContribution(const VssRay &ray, const bool isTermination) const; 947 948 837 /** Evaluates contribution of kd leaf when encountering a min event 949 838 */ 950 839 inline float EvalMinEventContribution(KdLeaf *leaf) const; 951 952 840 /** Evaluates contribution of kd leaf when encountering a max event 953 841 */ 954 842 inline float EvalMaxEventContribution(KdLeaf *leaf) const; 955 956 843 /** Prepares objects for the heuristics. 957 844 @returns pvs size as seen by the rays. 958 845 */ 959 846 float PrepareHeuristics(const RayInfoContainer &rays); 960 961 847 /** Prepare a single ray for heuristics. 962 848 */ 963 849 float PrepareHeuristics(const VssRay &ray, const bool isTermination); 964 965 850 /** Prepare a single kd leaf for heuristics. 966 851 */ 967 852 float PrepareHeuristics(KdLeaf *leaf); 968 853 /** Evaluates minimal and maximal depth in the tree. 854 */ 969 855 void EvalMinMaxDepth(int &minDepth, int &maxDepth); 970 971 972 973 ///////////////////////////////////////////////////////////// 974 856 /** Writes the node to disk 857 @note: should be implemented as visitor. 858 */ 859 void ExportNode(VspNode *node, OUT_STREAM &stream); 860 861 862 //////////////// 863 864 void ExportBinInterior(OUT_STREAM &stream, VspInterior *interior); 865 void ExportBinLeaf(OUT_STREAM &stream, VspLeaf *leaf); 866 867 VspInterior *ImportBinInterior(IN_STREAM &stream, VspInterior *parent); 868 VspLeaf *ImportBinLeaf(IN_STREAM &stream, VspInterior *parent, const ObjectContainer &pvsObjects); 869 870 VspNode *ImportNextNode(IN_STREAM &stream, 871 VspInterior *parent, 872 const ObjectContainer &pvsObjects); 873 874 875 ////////////////////////////////////////////////// 975 876 976 877 /** Subdivides the rays into front and back rays according to the split plane. 977 978 878 @param plane the split plane 979 879 @param rays contains the rays to be split. The rays are … … 988 888 RayInfoContainer &frontRays, 989 889 RayInfoContainer &backRays) const; 990 991 890 /** Add contributions of this ray to fron, back, and overall pvs of the parent. 891 */ 992 892 inline void UpdatePvsEntriesContribution(const VssRay &ray, 993 893 const bool isTermination, … … 996 896 float &backPvs, 997 897 float &totalPvs) const; 998 999 898 /** Classfifies the object with respect to the 1000 899 pvs of the front and back leaf and updates pvs size … … 1013 912 float &backPvs, 1014 913 float &totalPvs) const; 1015 1016 914 /** Evaluates the contribution for objects. 1017 915 */ … … 1021 919 float &backPvs, 1022 920 float &totalPvs) const; 1023 1024 921 /** Evaluates the contribution for bounding volume leaves. 1025 922 */ … … 1030 927 float &totalPvs, 1031 928 const bool countEntries) const; 1032 929 /** Updates contribution to pvs caused by this bvh leaf. 930 */ 1033 931 inline void UpdateContributionsToPvs(BvhLeaf *leaf, 1034 932 const int cf, 1035 933 SplitData &sdata) const; 1036 1037 934 /** Evaluates the contribution for kd leaves. 1038 935 */ … … 1042 939 float &backPvs, 1043 940 float &totalPvs) const; 1044 1045 941 /** Returns true if tree can be terminated. 1046 942 */ 1047 943 inline bool LocalTerminationCriteriaMet(const VspTraversalData &data) const; 1048 1049 944 /** Returns true if global tree can be terminated. 1050 945 */ 1051 946 bool GlobalTerminationCriteriaMet(const VspTraversalData &data) const; 1052 1053 947 /** Adds ray sample contributions to the PVS. 1054 948 @param sampleContributions the number contributions of the samples … … 1060 954 float &sampleContributions, 1061 955 int &contributingSamples); 1062 1063 956 /** Propagates valid flag up the tree. 1064 957 */ 1065 958 void PropagateUpValidity(VspNode *node); 1066 1067 /** Writes the node to disk1068 @note: should be implemented as visitor.1069 */1070 void ExportNode(VspNode *node, OUT_STREAM &stream);1071 1072 959 /** Returns estimated memory usage of tree. 1073 960 */ 1074 961 float GetMemUsage() const; 1075 1076 962 /** Updates view cell pvs of objects. 1077 963 */ … … 1079 965 ViewCell *front, 1080 966 ViewCell *back) const; 1081 967 /** Creates a new view cell from the traversal data. 968 */ 1082 969 void CreateViewCell(VspTraversalData &tData, 1083 970 const bool updatePvs, 1084 971 const float renderCost, 1085 972 const int pvs); 1086 1087 973 /** Collect split candidates which are affected by the last split 1088 974 and must be reevaluated. … … 1091 977 vector<SubdivisionCandidate *> &dirtyList, 1092 978 const bool onlyUnmailed); 1093 1094 void CollectDirtyCandidate(const VssRay &ray, 979 /** Adds the split candidate associated with this ray to the dirty list. 980 */ 981 void AddCandidateToDirtyList(const VssRay &ray, 1095 982 const bool isTermination, 1096 983 vector<SubdivisionCandidate *> &dirtyList, 1097 984 const bool onlyUnmailed) const; 1098 1099 985 /** Rays will be clipped to the bounding box. 1100 986 */ 1101 987 void PreprocessRays(const VssRayContainer &sampleRays, RayInfoContainer &rays); 1102 1103 988 /** Evaluate subdivision statistics. 1104 989 */ 1105 990 void EvalSubdivisionStats(const SubdivisionCandidate &tData); 1106 991 /** Prepares the construction of the vsp tree. 992 */ 1107 993 void PrepareConstruction(SplitQueue &tQueue, 1108 994 const VssRayContainer &sampleRays, 1109 995 RayInfoContainer &rays); 1110 1111 996 /** Evaluates pvs contribution of this ray. 1112 997 */ 1113 998 float EvalContributionToPvs(const VssRay &ray, const bool isTermination) const; 1114 1115 999 /** Evaluates pvs contribution of a kd node. 1116 1000 */ 1117 1001 float EvalContributionToPvs(KdLeaf *leaf) const; 1118 1119 1002 /** Creates new root of hierarchy and computes bounding box. 1120 1003 Has to be called before the preparation of the subdivision. … … 1197 1080 int mStackPtr; 1198 1081 int mDepth; 1199 1200 1082 }; 1201 1083 … … 1207 1089 /// pointer to the hierarchy of view cells 1208 1090 ViewCellsTree *mViewCellsTree; 1209 1091 /// Pointer to the hierarchy manager which is responsible for both 1092 /// view and object space 1210 1093 HierarchyManager *mHierarchyManager; 1094 /// Pointer to the bv hierarchy 1211 1095 BvHierarchy *mBvHierarchy; 1212 1096 /// Pointer to the view cells manager 1213 1097 ViewCellsManager *mViewCellsManager; 1214 1098 /// Buffer for subdivision candidates used for split heuristics evaluation 1215 1099 vector<SortableEntry> *mLocalSubdivisionCandidates; 1216 1217 1100 /// Pointer to the root of the tree 1218 1101 VspNode *mRoot; 1219 1102 /// The statistics 1220 1103 VspTreeStatistics mVspStats; 1221 1222 1104 /// View cell corresponding to the space outside the valid view space 1223 1105 VspViewCell *mOutOfBoundsCell; 1224 1225 1106 /// box around the whole view domain 1226 1107 AxisAlignedBox3 mBoundingBox; … … 1281 1162 // if rays should be stored in leaves 1282 1163 bool mStoreRays; 1283 1284 1164 /// epsilon for geometric comparisons 1285 1165 float mEpsilon; 1286 1287 1166 /// subdivision stats output file 1288 1167 std::ofstream mSubdivisionStats; 1289 1168 /// keeps track of cost during subdivision 1290 1169 float mTotalCost; 1170 /// keeps track of #pvs entries during subdivison 1291 1171 int mPvsEntries; 1292 1172 /// keeps track of overall pvs size during subdivision … … 1297 1177 /// weight between render cost decrease and node render cost 1298 1178 float mRenderCostDecreaseWeight; 1299 1179 /// maximal #of rays used for heuristics evalution 1300 1180 int mMaxTests; 1301 1302 1181 /// constant value for driving the heuristics 1303 1182 float mMemoryConst;
Note: See TracChangeset
for help on using the changeset viewer.