Humble beginnings of box volume too. Allow to save and restore GeomInput state.
This commit is contained in:
parent
d6a5eb5ee2
commit
1753297fd5
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -281,14 +281,13 @@
|
|||||||
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
|
<key>PBXSmartGroupTreeModuleOutlineStateSelectionKey</key>
|
||||||
<array>
|
<array>
|
||||||
<array>
|
<array>
|
||||||
<integer>32</integer>
|
<integer>61</integer>
|
||||||
<integer>23</integer>
|
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
</array>
|
</array>
|
||||||
</array>
|
</array>
|
||||||
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
|
<key>PBXSmartGroupTreeModuleOutlineStateVisibleRectKey</key>
|
||||||
<string>{{0, 247}, {358, 643}}</string>
|
<string>{{0, 752}, {358, 643}}</string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>PBXTopSmartGroupGIDs</key>
|
<key>PBXTopSmartGroupGIDs</key>
|
||||||
<array/>
|
<array/>
|
||||||
@ -323,7 +322,7 @@
|
|||||||
<key>PBXProjectModuleGUID</key>
|
<key>PBXProjectModuleGUID</key>
|
||||||
<string>6B8632A30F78115100E2684A</string>
|
<string>6B8632A30F78115100E2684A</string>
|
||||||
<key>PBXProjectModuleLabel</key>
|
<key>PBXProjectModuleLabel</key>
|
||||||
<string>Sample_SoloMeshTiled.cpp</string>
|
<string>InputGeom.cpp</string>
|
||||||
<key>PBXSplitModuleInNavigatorKey</key>
|
<key>PBXSplitModuleInNavigatorKey</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Split0</key>
|
<key>Split0</key>
|
||||||
@ -331,11 +330,11 @@
|
|||||||
<key>PBXProjectModuleGUID</key>
|
<key>PBXProjectModuleGUID</key>
|
||||||
<string>6B8632A40F78115100E2684A</string>
|
<string>6B8632A40F78115100E2684A</string>
|
||||||
<key>PBXProjectModuleLabel</key>
|
<key>PBXProjectModuleLabel</key>
|
||||||
<string>Sample_SoloMeshTiled.cpp</string>
|
<string>InputGeom.cpp</string>
|
||||||
<key>_historyCapacity</key>
|
<key>_historyCapacity</key>
|
||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<key>bookmark</key>
|
<key>bookmark</key>
|
||||||
<string>6BF7C3791112FE75002B3F46</string>
|
<string>6BF7C4061113209A002B3F46</string>
|
||||||
<key>history</key>
|
<key>history</key>
|
||||||
<array>
|
<array>
|
||||||
<string>6B8DE70D10B01BBF00DF20FB</string>
|
<string>6B8DE70D10B01BBF00DF20FB</string>
|
||||||
@ -344,7 +343,6 @@
|
|||||||
<string>6BBB883C10EA9B6F008FEA1F</string>
|
<string>6BBB883C10EA9B6F008FEA1F</string>
|
||||||
<string>6BB7FDC010F37703006DA0A6</string>
|
<string>6BB7FDC010F37703006DA0A6</string>
|
||||||
<string>6BB7FDC110F37703006DA0A6</string>
|
<string>6BB7FDC110F37703006DA0A6</string>
|
||||||
<string>6BB7FE1010F37CF7006DA0A6</string>
|
|
||||||
<string>6BB7FF6D10F4E8E2006DA0A6</string>
|
<string>6BB7FF6D10F4E8E2006DA0A6</string>
|
||||||
<string>6B69739F10FFCA4500984788</string>
|
<string>6B69739F10FFCA4500984788</string>
|
||||||
<string>6BCF325F1104CFE7009445BF</string>
|
<string>6BCF325F1104CFE7009445BF</string>
|
||||||
@ -360,38 +358,39 @@
|
|||||||
<string>6BF7C0EF11116E74002B3F46</string>
|
<string>6BF7C0EF11116E74002B3F46</string>
|
||||||
<string>6BF7C0F011116E74002B3F46</string>
|
<string>6BF7C0F011116E74002B3F46</string>
|
||||||
<string>6BF7C0F311116E74002B3F46</string>
|
<string>6BF7C0F311116E74002B3F46</string>
|
||||||
<string>6BF7C13411118CEB002B3F46</string>
|
|
||||||
<string>6BF7C16211119C69002B3F46</string>
|
<string>6BF7C16211119C69002B3F46</string>
|
||||||
<string>6BF7C16C11119D8F002B3F46</string>
|
|
||||||
<string>6BF7C1CF1111BCF2002B3F46</string>
|
|
||||||
<string>6BF7C1D01111BCF2002B3F46</string>
|
<string>6BF7C1D01111BCF2002B3F46</string>
|
||||||
<string>6BF7C1E21111BD81002B3F46</string>
|
<string>6BF7C1E21111BD81002B3F46</string>
|
||||||
<string>6BF7C1ED1111C0A6002B3F46</string>
|
<string>6BF7C1ED1111C0A6002B3F46</string>
|
||||||
<string>6BF7C20F1111D361002B3F46</string>
|
|
||||||
<string>6BF7C2431111DAC1002B3F46</string>
|
|
||||||
<string>6BF7C2441111DAC1002B3F46</string>
|
<string>6BF7C2441111DAC1002B3F46</string>
|
||||||
<string>6BF7C2591112B456002B3F46</string>
|
|
||||||
<string>6BF7C25A1112B456002B3F46</string>
|
|
||||||
<string>6BF7C25B1112B456002B3F46</string>
|
|
||||||
<string>6BF7C2761112BE4F002B3F46</string>
|
<string>6BF7C2761112BE4F002B3F46</string>
|
||||||
<string>6BF7C2851112C348002B3F46</string>
|
<string>6BF7C2851112C348002B3F46</string>
|
||||||
<string>6BF7C2A51112D13E002B3F46</string>
|
<string>6BF7C2A51112D13E002B3F46</string>
|
||||||
<string>6BF7C2BD1112D453002B3F46</string>
|
<string>6BF7C2BD1112D453002B3F46</string>
|
||||||
<string>6BF7C2BE1112D453002B3F46</string>
|
|
||||||
<string>6BF7C2BF1112D453002B3F46</string>
|
|
||||||
<string>6BF7C2DB1112D4DA002B3F46</string>
|
<string>6BF7C2DB1112D4DA002B3F46</string>
|
||||||
<string>6BF7C2EF1112D646002B3F46</string>
|
<string>6BF7C2EF1112D646002B3F46</string>
|
||||||
<string>6BF7C2F51112D716002B3F46</string>
|
<string>6BF7C2F51112D716002B3F46</string>
|
||||||
<string>6BF7C2F61112D716002B3F46</string>
|
<string>6BF7C2F61112D716002B3F46</string>
|
||||||
<string>6BF7C3201112DB82002B3F46</string>
|
|
||||||
<string>6BF7C3211112DB82002B3F46</string>
|
<string>6BF7C3211112DB82002B3F46</string>
|
||||||
<string>6BF7C3281112DDCE002B3F46</string>
|
<string>6BF7C3281112DDCE002B3F46</string>
|
||||||
<string>6BF7C3431112E74B002B3F46</string>
|
<string>6BF7C3431112E74B002B3F46</string>
|
||||||
<string>6BF7C35D1112EA84002B3F46</string>
|
|
||||||
<string>6BF7C36A1112EB0C002B3F46</string>
|
|
||||||
<string>6BF7C36E1112EB25002B3F46</string>
|
<string>6BF7C36E1112EB25002B3F46</string>
|
||||||
<string>6BF7C3761112FE75002B3F46</string>
|
<string>6BF7C37C1113026E002B3F46</string>
|
||||||
<string>6BF7C3771112FE75002B3F46</string>
|
<string>6BF7C37D1113026E002B3F46</string>
|
||||||
|
<string>6BF7C392111316AD002B3F46</string>
|
||||||
|
<string>6BF7C393111316AD002B3F46</string>
|
||||||
|
<string>6BF7C394111316AD002B3F46</string>
|
||||||
|
<string>6BF7C395111316AD002B3F46</string>
|
||||||
|
<string>6BF7C3BC111318BA002B3F46</string>
|
||||||
|
<string>6BF7C3CC11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3CD11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3CE11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3CF11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3D011131F26002B3F46</string>
|
||||||
|
<string>6BF7C3F611131F84002B3F46</string>
|
||||||
|
<string>6BF7C3FA11132015002B3F46</string>
|
||||||
|
<string>6BF7C4021113209A002B3F46</string>
|
||||||
|
<string>6BF7C4031113209A002B3F46</string>
|
||||||
</array>
|
</array>
|
||||||
<key>prevStack</key>
|
<key>prevStack</key>
|
||||||
<array>
|
<array>
|
||||||
@ -402,10 +401,7 @@
|
|||||||
<string>6BBB885510EA9ECC008FEA1F</string>
|
<string>6BBB885510EA9ECC008FEA1F</string>
|
||||||
<string>6BBB889D10EAA094008FEA1F</string>
|
<string>6BBB889D10EAA094008FEA1F</string>
|
||||||
<string>6BB7FDC710F37703006DA0A6</string>
|
<string>6BB7FDC710F37703006DA0A6</string>
|
||||||
<string>6BB7FDD910F37703006DA0A6</string>
|
|
||||||
<string>6BB7FDDA10F37703006DA0A6</string>
|
<string>6BB7FDDA10F37703006DA0A6</string>
|
||||||
<string>6BB7FDDC10F37703006DA0A6</string>
|
|
||||||
<string>6BB7FDDD10F37703006DA0A6</string>
|
|
||||||
<string>6BB7FE1A10F37CF7006DA0A6</string>
|
<string>6BB7FE1A10F37CF7006DA0A6</string>
|
||||||
<string>6BB7FE2110F37CF7006DA0A6</string>
|
<string>6BB7FE2110F37CF7006DA0A6</string>
|
||||||
<string>6BB7FE2210F37CF7006DA0A6</string>
|
<string>6BB7FE2210F37CF7006DA0A6</string>
|
||||||
@ -414,7 +410,6 @@
|
|||||||
<string>6BB7FF2410F4D699006DA0A6</string>
|
<string>6BB7FF2410F4D699006DA0A6</string>
|
||||||
<string>6BB7FF9610F4E8E2006DA0A6</string>
|
<string>6BB7FF9610F4E8E2006DA0A6</string>
|
||||||
<string>6BB700C310FA3AB1006DA0A6</string>
|
<string>6BB700C310FA3AB1006DA0A6</string>
|
||||||
<string>6B69739810FFC43600984788</string>
|
|
||||||
<string>6B6973A210FFCA4500984788</string>
|
<string>6B6973A210FFCA4500984788</string>
|
||||||
<string>6BCF32441104CDB5009445BF</string>
|
<string>6BCF32441104CDB5009445BF</string>
|
||||||
<string>6BCF324A1104CDB5009445BF</string>
|
<string>6BCF324A1104CDB5009445BF</string>
|
||||||
@ -463,7 +458,6 @@
|
|||||||
<string>6BF7C14F11119BB4002B3F46</string>
|
<string>6BF7C14F11119BB4002B3F46</string>
|
||||||
<string>6BF7C15411119BB4002B3F46</string>
|
<string>6BF7C15411119BB4002B3F46</string>
|
||||||
<string>6BF7C16611119C69002B3F46</string>
|
<string>6BF7C16611119C69002B3F46</string>
|
||||||
<string>6BF7C16711119C69002B3F46</string>
|
|
||||||
<string>6BF7C16E11119D8F002B3F46</string>
|
<string>6BF7C16E11119D8F002B3F46</string>
|
||||||
<string>6BF7C17511119EDD002B3F46</string>
|
<string>6BF7C17511119EDD002B3F46</string>
|
||||||
<string>6BF7C17711119EDD002B3F46</string>
|
<string>6BF7C17711119EDD002B3F46</string>
|
||||||
@ -486,8 +480,6 @@
|
|||||||
<string>6BF7C1F21111C0A6002B3F46</string>
|
<string>6BF7C1F21111C0A6002B3F46</string>
|
||||||
<string>6BF7C15711119BB4002B3F46</string>
|
<string>6BF7C15711119BB4002B3F46</string>
|
||||||
<string>6BF7C20B1111D299002B3F46</string>
|
<string>6BF7C20B1111D299002B3F46</string>
|
||||||
<string>6BF7C2131111D361002B3F46</string>
|
|
||||||
<string>6BF7C2141111D361002B3F46</string>
|
|
||||||
<string>6BF7C2151111D361002B3F46</string>
|
<string>6BF7C2151111D361002B3F46</string>
|
||||||
<string>6BF7C2161111D361002B3F46</string>
|
<string>6BF7C2161111D361002B3F46</string>
|
||||||
<string>6BF7C2171111D361002B3F46</string>
|
<string>6BF7C2171111D361002B3F46</string>
|
||||||
@ -504,12 +496,8 @@
|
|||||||
<string>6BF7C2271111D491002B3F46</string>
|
<string>6BF7C2271111D491002B3F46</string>
|
||||||
<string>6BF7C2461111DAC1002B3F46</string>
|
<string>6BF7C2461111DAC1002B3F46</string>
|
||||||
<string>6BF7C2471111DAC1002B3F46</string>
|
<string>6BF7C2471111DAC1002B3F46</string>
|
||||||
<string>6BF7C2481111DAC1002B3F46</string>
|
|
||||||
<string>6BF7C2491111DAC1002B3F46</string>
|
<string>6BF7C2491111DAC1002B3F46</string>
|
||||||
<string>6BF7C25D1112B456002B3F46</string>
|
<string>6BF7C25D1112B456002B3F46</string>
|
||||||
<string>6BF7C25E1112B456002B3F46</string>
|
|
||||||
<string>6BF7C25F1112B456002B3F46</string>
|
|
||||||
<string>6BF7C2601112B456002B3F46</string>
|
|
||||||
<string>6BF7C2701112B56F002B3F46</string>
|
<string>6BF7C2701112B56F002B3F46</string>
|
||||||
<string>6BF7C2791112BE4F002B3F46</string>
|
<string>6BF7C2791112BE4F002B3F46</string>
|
||||||
<string>6BF7C27A1112BE4F002B3F46</string>
|
<string>6BF7C27A1112BE4F002B3F46</string>
|
||||||
@ -517,7 +505,6 @@
|
|||||||
<string>6BF7C28A1112C349002B3F46</string>
|
<string>6BF7C28A1112C349002B3F46</string>
|
||||||
<string>6BF7C28B1112C349002B3F46</string>
|
<string>6BF7C28B1112C349002B3F46</string>
|
||||||
<string>6BF7C28C1112C349002B3F46</string>
|
<string>6BF7C28C1112C349002B3F46</string>
|
||||||
<string>6BF7C28D1112C349002B3F46</string>
|
|
||||||
<string>6BF7C2971112C4A2002B3F46</string>
|
<string>6BF7C2971112C4A2002B3F46</string>
|
||||||
<string>6BF7C2A81112D13E002B3F46</string>
|
<string>6BF7C2A81112D13E002B3F46</string>
|
||||||
<string>6BF7C2A91112D13E002B3F46</string>
|
<string>6BF7C2A91112D13E002B3F46</string>
|
||||||
@ -536,46 +523,89 @@
|
|||||||
<string>6BF7C2CB1112D453002B3F46</string>
|
<string>6BF7C2CB1112D453002B3F46</string>
|
||||||
<string>6BF7C2CD1112D453002B3F46</string>
|
<string>6BF7C2CD1112D453002B3F46</string>
|
||||||
<string>6BF7C2CF1112D453002B3F46</string>
|
<string>6BF7C2CF1112D453002B3F46</string>
|
||||||
<string>6BF7C2D01112D453002B3F46</string>
|
|
||||||
<string>6BF7C2D11112D453002B3F46</string>
|
<string>6BF7C2D11112D453002B3F46</string>
|
||||||
<string>6BF7C2D71112D479002B3F46</string>
|
|
||||||
<string>6BF7C2E21112D520002B3F46</string>
|
<string>6BF7C2E21112D520002B3F46</string>
|
||||||
<string>6BF7C2E81112D611002B3F46</string>
|
|
||||||
<string>6BF7C2E91112D611002B3F46</string>
|
<string>6BF7C2E91112D611002B3F46</string>
|
||||||
<string>6BF7C2F11112D646002B3F46</string>
|
|
||||||
<string>6BF7C2F21112D646002B3F46</string>
|
<string>6BF7C2F21112D646002B3F46</string>
|
||||||
<string>6BF7C2F91112D716002B3F46</string>
|
<string>6BF7C2F91112D716002B3F46</string>
|
||||||
<string>6BF7C2FA1112D716002B3F46</string>
|
<string>6BF7C2FA1112D716002B3F46</string>
|
||||||
<string>6BF7C3061112D780002B3F46</string>
|
|
||||||
<string>6BF7C30C1112D8C1002B3F46</string>
|
<string>6BF7C30C1112D8C1002B3F46</string>
|
||||||
<string>6BF7C30D1112D8C1002B3F46</string>
|
|
||||||
<string>6BF7C3141112DAFB002B3F46</string>
|
<string>6BF7C3141112DAFB002B3F46</string>
|
||||||
<string>6BF7C3161112DAFB002B3F46</string>
|
|
||||||
<string>6BF7C3171112DAFB002B3F46</string>
|
<string>6BF7C3171112DAFB002B3F46</string>
|
||||||
<string>6BF7C3231112DB82002B3F46</string>
|
|
||||||
<string>6BF7C3241112DB82002B3F46</string>
|
<string>6BF7C3241112DB82002B3F46</string>
|
||||||
<string>6BF7C3251112DB82002B3F46</string>
|
<string>6BF7C3251112DB82002B3F46</string>
|
||||||
<string>6BF7C32A1112DDCE002B3F46</string>
|
<string>6BF7C32A1112DDCE002B3F46</string>
|
||||||
<string>6BF7C3371112E571002B3F46</string>
|
|
||||||
<string>6BF7C33C1112E5D1002B3F46</string>
|
<string>6BF7C33C1112E5D1002B3F46</string>
|
||||||
<string>6BF7C3451112E74B002B3F46</string>
|
|
||||||
<string>6BF7C3461112E74B002B3F46</string>
|
<string>6BF7C3461112E74B002B3F46</string>
|
||||||
<string>6BF7C3471112E74B002B3F46</string>
|
|
||||||
<string>6BF7C3481112E74B002B3F46</string>
|
<string>6BF7C3481112E74B002B3F46</string>
|
||||||
<string>6BF7C3551112E875002B3F46</string>
|
|
||||||
<string>6BF7C3601112EA84002B3F46</string>
|
<string>6BF7C3601112EA84002B3F46</string>
|
||||||
<string>6BF7C3611112EA84002B3F46</string>
|
<string>6BF7C3611112EA84002B3F46</string>
|
||||||
<string>6BF7C3621112EA84002B3F46</string>
|
<string>6BF7C3621112EA84002B3F46</string>
|
||||||
<string>6BF7C3631112EA84002B3F46</string>
|
|
||||||
<string>6BF7C3641112EA84002B3F46</string>
|
<string>6BF7C3641112EA84002B3F46</string>
|
||||||
<string>6BF7C3651112EA84002B3F46</string>
|
<string>6BF7C3651112EA84002B3F46</string>
|
||||||
<string>6BF7C3661112EA84002B3F46</string>
|
<string>6BF7C3661112EA84002B3F46</string>
|
||||||
<string>6BF7C3671112EA84002B3F46</string>
|
<string>6BF7C3671112EA84002B3F46</string>
|
||||||
<string>6BF7C3681112EA84002B3F46</string>
|
<string>6BF7C3681112EA84002B3F46</string>
|
||||||
<string>6BF7C36C1112EB0C002B3F46</string>
|
|
||||||
<string>6BF7C3701112EB25002B3F46</string>
|
<string>6BF7C3701112EB25002B3F46</string>
|
||||||
<string>6BF7C3711112EB25002B3F46</string>
|
<string>6BF7C3711112EB25002B3F46</string>
|
||||||
<string>6BF7C3781112FE75002B3F46</string>
|
<string>6BF7C3781112FE75002B3F46</string>
|
||||||
|
<string>6BF7C37F1113026E002B3F46</string>
|
||||||
|
<string>6BF7C3801113026E002B3F46</string>
|
||||||
|
<string>6BF7C3811113026E002B3F46</string>
|
||||||
|
<string>6BF7C38A11130EA2002B3F46</string>
|
||||||
|
<string>6BF7C390111313CC002B3F46</string>
|
||||||
|
<string>6BF7C398111316AD002B3F46</string>
|
||||||
|
<string>6BF7C399111316AD002B3F46</string>
|
||||||
|
<string>6BF7C39A111316AD002B3F46</string>
|
||||||
|
<string>6BF7C39B111316AD002B3F46</string>
|
||||||
|
<string>6BF7C39C111316AD002B3F46</string>
|
||||||
|
<string>6BF7C39D111316AD002B3F46</string>
|
||||||
|
<string>6BF7C39E111316AD002B3F46</string>
|
||||||
|
<string>6BF7C39F111316AD002B3F46</string>
|
||||||
|
<string>6BF7C3A0111316AD002B3F46</string>
|
||||||
|
<string>6BF7C3A1111316AD002B3F46</string>
|
||||||
|
<string>6BF7C3A2111316AD002B3F46</string>
|
||||||
|
<string>6BF7C3A3111316AD002B3F46</string>
|
||||||
|
<string>6BF7C3A4111316AD002B3F46</string>
|
||||||
|
<string>6BF7C3B1111317BF002B3F46</string>
|
||||||
|
<string>6BB7FDD910F37703006DA0A6</string>
|
||||||
|
<string>6BF7C16711119C69002B3F46</string>
|
||||||
|
<string>6BF7C3BE111318BA002B3F46</string>
|
||||||
|
<string>6BF7C3D511131F26002B3F46</string>
|
||||||
|
<string>6BF7C3D611131F26002B3F46</string>
|
||||||
|
<string>6BF7C3D711131F26002B3F46</string>
|
||||||
|
<string>6BF7C3D811131F26002B3F46</string>
|
||||||
|
<string>6BF7C3D911131F26002B3F46</string>
|
||||||
|
<string>6BF7C3DA11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3DB11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3DC11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3DD11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3DE11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3DF11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E011131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E111131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E211131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E311131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E411131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E511131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E611131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E711131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E811131F26002B3F46</string>
|
||||||
|
<string>6BF7C3E911131F26002B3F46</string>
|
||||||
|
<string>6BF7C3EA11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3EB11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3EC11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3ED11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3EE11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3EF11131F26002B3F46</string>
|
||||||
|
<string>6BF7C3F011131F26002B3F46</string>
|
||||||
|
<string>6BF7C3F111131F26002B3F46</string>
|
||||||
|
<string>6BF7C3F211131F26002B3F46</string>
|
||||||
|
<string>6BF7C3F311131F26002B3F46</string>
|
||||||
|
<string>6BF7C3F811131F84002B3F46</string>
|
||||||
|
<string>6BF7C3FC11132015002B3F46</string>
|
||||||
|
<string>6BF7C4041113209A002B3F46</string>
|
||||||
|
<string>6BF7C4051113209A002B3F46</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
<key>SplitCount</key>
|
<key>SplitCount</key>
|
||||||
@ -589,18 +619,18 @@
|
|||||||
<key>GeometryConfiguration</key>
|
<key>GeometryConfiguration</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Frame</key>
|
<key>Frame</key>
|
||||||
<string>{{0, 0}, {876, 502}}</string>
|
<string>{{0, 0}, {876, 563}}</string>
|
||||||
<key>RubberWindowFrame</key>
|
<key>RubberWindowFrame</key>
|
||||||
<string>11 76 1256 702 0 0 1280 778 </string>
|
<string>11 76 1256 702 0 0 1280 778 </string>
|
||||||
</dict>
|
</dict>
|
||||||
<key>Module</key>
|
<key>Module</key>
|
||||||
<string>PBXNavigatorGroup</string>
|
<string>PBXNavigatorGroup</string>
|
||||||
<key>Proportion</key>
|
<key>Proportion</key>
|
||||||
<string>502pt</string>
|
<string>563pt</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Proportion</key>
|
<key>Proportion</key>
|
||||||
<string>154pt</string>
|
<string>93pt</string>
|
||||||
<key>Tabs</key>
|
<key>Tabs</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
@ -668,7 +698,7 @@
|
|||||||
<key>GeometryConfiguration</key>
|
<key>GeometryConfiguration</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Frame</key>
|
<key>Frame</key>
|
||||||
<string>{{10, 27}, {876, 127}}</string>
|
<string>{{10, 27}, {876, 66}}</string>
|
||||||
<key>RubberWindowFrame</key>
|
<key>RubberWindowFrame</key>
|
||||||
<string>11 76 1256 702 0 0 1280 778 </string>
|
<string>11 76 1256 702 0 0 1280 778 </string>
|
||||||
</dict>
|
</dict>
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
6BB93CF610CFEC4500F74F2B /* RecastDump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BB93CF510CFEC4500F74F2B /* RecastDump.cpp */; };
|
6BB93CF610CFEC4500F74F2B /* RecastDump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BB93CF510CFEC4500F74F2B /* RecastDump.cpp */; };
|
||||||
6BCF32361104CD05009445BF /* OffMeshConnectionTool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */; };
|
6BCF32361104CD05009445BF /* OffMeshConnectionTool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */; };
|
||||||
6BF7C1401111953A002B3F46 /* TestCase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BF7C13F1111953A002B3F46 /* TestCase.cpp */; };
|
6BF7C1401111953A002B3F46 /* TestCase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BF7C13F1111953A002B3F46 /* TestCase.cpp */; };
|
||||||
|
6BF7C3C511131B1F002B3F46 /* BoxVolumeTool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6BF7C3C411131B1F002B3F46 /* BoxVolumeTool.cpp */; };
|
||||||
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
|
||||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
@ -113,6 +114,8 @@
|
|||||||
6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OffMeshConnectionTool.cpp; path = ../../Source/OffMeshConnectionTool.cpp; sourceTree = SOURCE_ROOT; };
|
6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OffMeshConnectionTool.cpp; path = ../../Source/OffMeshConnectionTool.cpp; sourceTree = SOURCE_ROOT; };
|
||||||
6BF7C13E11119520002B3F46 /* TestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestCase.h; path = ../../Include/TestCase.h; sourceTree = SOURCE_ROOT; };
|
6BF7C13E11119520002B3F46 /* TestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestCase.h; path = ../../Include/TestCase.h; sourceTree = SOURCE_ROOT; };
|
||||||
6BF7C13F1111953A002B3F46 /* TestCase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestCase.cpp; path = ../../Source/TestCase.cpp; sourceTree = SOURCE_ROOT; };
|
6BF7C13F1111953A002B3F46 /* TestCase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TestCase.cpp; path = ../../Source/TestCase.cpp; sourceTree = SOURCE_ROOT; };
|
||||||
|
6BF7C3C311131B0F002B3F46 /* BoxVolumeTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BoxVolumeTool.h; path = ../../Include/BoxVolumeTool.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
6BF7C3C411131B1F002B3F46 /* BoxVolumeTool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = BoxVolumeTool.cpp; path = ../../Source/BoxVolumeTool.cpp; sourceTree = SOURCE_ROOT; };
|
||||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
8D1107320486CEB800E47090 /* Recast.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Recast.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
8D1107320486CEB800E47090 /* Recast.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Recast.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
@ -268,6 +271,8 @@
|
|||||||
6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */,
|
6BCF32351104CD05009445BF /* OffMeshConnectionTool.cpp */,
|
||||||
6BB7FC0910EBB6AA006DA0A6 /* NavMeshTesterTool.h */,
|
6BB7FC0910EBB6AA006DA0A6 /* NavMeshTesterTool.h */,
|
||||||
6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */,
|
6BB7FC0A10EBB6AA006DA0A6 /* NavMeshTesterTool.cpp */,
|
||||||
|
6BF7C3C311131B0F002B3F46 /* BoxVolumeTool.h */,
|
||||||
|
6BF7C3C411131B1F002B3F46 /* BoxVolumeTool.cpp */,
|
||||||
);
|
);
|
||||||
name = Tools;
|
name = Tools;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -389,6 +394,7 @@
|
|||||||
6BB7FDA510F36F0E006DA0A6 /* InputGeom.cpp in Sources */,
|
6BB7FDA510F36F0E006DA0A6 /* InputGeom.cpp in Sources */,
|
||||||
6BCF32361104CD05009445BF /* OffMeshConnectionTool.cpp in Sources */,
|
6BCF32361104CD05009445BF /* OffMeshConnectionTool.cpp in Sources */,
|
||||||
6BF7C1401111953A002B3F46 /* TestCase.cpp in Sources */,
|
6BF7C1401111953A002B3F46 /* TestCase.cpp in Sources */,
|
||||||
|
6BF7C3C511131B1F002B3F46 /* BoxVolumeTool.cpp in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
47
RecastDemo/Include/BoxVolumeTool.h
Normal file
47
RecastDemo/Include/BoxVolumeTool.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2009 Mikko Mononen memon@inside.org
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef BOXVOLUMETOOL_H
|
||||||
|
#define BOXVOLUMETOOL_H
|
||||||
|
|
||||||
|
#include "Sample.h"
|
||||||
|
|
||||||
|
// Tool to create box volumess for InputGeom
|
||||||
|
|
||||||
|
class BoxVolumeTool : public SampleTool
|
||||||
|
{
|
||||||
|
Sample* m_sample;
|
||||||
|
float m_hitPos[3];
|
||||||
|
bool m_hitPosSet;
|
||||||
|
float m_areaType;
|
||||||
|
float m_boxHeight;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BoxVolumeTool();
|
||||||
|
~BoxVolumeTool();
|
||||||
|
|
||||||
|
virtual int type() { return TOOL_BOX_VOLUME; }
|
||||||
|
virtual void init(Sample* sample);
|
||||||
|
virtual void reset();
|
||||||
|
virtual void handleMenu();
|
||||||
|
virtual void handleClick(const float* p, bool shift);
|
||||||
|
virtual void handleRender();
|
||||||
|
virtual void handleRenderOverlay(double* proj, double* model, int* view);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // BOXVOLUMETOOL_H
|
@ -28,12 +28,18 @@ class InputGeom
|
|||||||
rcMeshLoaderObj* m_mesh;
|
rcMeshLoaderObj* m_mesh;
|
||||||
float m_meshBMin[3], m_meshBMax[3];
|
float m_meshBMin[3], m_meshBMax[3];
|
||||||
|
|
||||||
|
// Off-Mesh connections.
|
||||||
static const int MAX_OFFMESH_CONNECTIONS = 256;
|
static const int MAX_OFFMESH_CONNECTIONS = 256;
|
||||||
|
|
||||||
float m_offMeshConVerts[MAX_OFFMESH_CONNECTIONS*3*2];
|
float m_offMeshConVerts[MAX_OFFMESH_CONNECTIONS*3*2];
|
||||||
float m_offMeshConRads[MAX_OFFMESH_CONNECTIONS];
|
float m_offMeshConRads[MAX_OFFMESH_CONNECTIONS];
|
||||||
unsigned char m_offMeshConDirs[MAX_OFFMESH_CONNECTIONS];
|
unsigned char m_offMeshConDirs[MAX_OFFMESH_CONNECTIONS];
|
||||||
int m_offMeshConCount;
|
int m_offMeshConCount;
|
||||||
|
|
||||||
|
// Box Volumes.
|
||||||
|
static const int MAX_BOX_VOLUMES = 256;
|
||||||
|
float m_boxVolVerts[MAX_BOX_VOLUMES*3*2];
|
||||||
|
unsigned char m_boxVolTypes[MAX_BOX_VOLUMES];
|
||||||
|
int m_boxVolCount;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
InputGeom();
|
InputGeom();
|
||||||
@ -41,6 +47,9 @@ public:
|
|||||||
|
|
||||||
bool loadMesh(const char* filepath);
|
bool loadMesh(const char* filepath);
|
||||||
|
|
||||||
|
bool load(const char* filepath);
|
||||||
|
bool save(const char* filepath);
|
||||||
|
|
||||||
// Method to return static mesh data.
|
// Method to return static mesh data.
|
||||||
inline const rcMeshLoaderObj* getMesh() const { return m_mesh; }
|
inline const rcMeshLoaderObj* getMesh() const { return m_mesh; }
|
||||||
inline const float* getMeshBoundsMin() const { return m_meshBMin; }
|
inline const float* getMeshBoundsMin() const { return m_meshBMin; }
|
||||||
@ -48,7 +57,7 @@ public:
|
|||||||
inline const rcChunkyTriMesh* getChunkyMesh() const { return m_chunkyMesh; }
|
inline const rcChunkyTriMesh* getChunkyMesh() const { return m_chunkyMesh; }
|
||||||
bool raycastMesh(float* src, float* dst, float& tmin);
|
bool raycastMesh(float* src, float* dst, float& tmin);
|
||||||
|
|
||||||
// Extra links
|
// Off-Mesh connections.
|
||||||
int getOffMeshConnectionCount() const { return m_offMeshConCount; }
|
int getOffMeshConnectionCount() const { return m_offMeshConCount; }
|
||||||
const float* getOffMeshConnectionVerts() const { return m_offMeshConVerts; }
|
const float* getOffMeshConnectionVerts() const { return m_offMeshConVerts; }
|
||||||
const float* getOffMeshConnectionRads() const { return m_offMeshConRads; }
|
const float* getOffMeshConnectionRads() const { return m_offMeshConRads; }
|
||||||
@ -56,6 +65,14 @@ public:
|
|||||||
void addOffMeshConnection(const float* spos, const float* epos, const float rad, unsigned char bidir);
|
void addOffMeshConnection(const float* spos, const float* epos, const float rad, unsigned char bidir);
|
||||||
void deleteOffMeshConnection(int i);
|
void deleteOffMeshConnection(int i);
|
||||||
void drawOffMeshConnections(struct duDebugDraw* dd, bool hilight = false);
|
void drawOffMeshConnections(struct duDebugDraw* dd, bool hilight = false);
|
||||||
|
|
||||||
|
// Box Volumes.
|
||||||
|
int getBoxVolumeCount() const { return m_boxVolCount; }
|
||||||
|
const float* getBoxVolumeVerts() const { return m_boxVolVerts; }
|
||||||
|
const unsigned char* getBoxVolumeTypes() const { return m_boxVolTypes; }
|
||||||
|
void addBoxVolume(const float* bmin, const float* bmax, unsigned char type);
|
||||||
|
void deleteBoxVolume(int i);
|
||||||
|
void drawBoxVolumes(struct duDebugDraw* dd, bool hilight = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INPUTGEOM_H
|
#endif // INPUTGEOM_H
|
||||||
|
@ -32,12 +32,14 @@ public:
|
|||||||
inline const int* getTris() const { return m_tris; }
|
inline const int* getTris() const { return m_tris; }
|
||||||
inline int getVertCount() const { return m_vertCount; }
|
inline int getVertCount() const { return m_vertCount; }
|
||||||
inline int getTriCount() const { return m_triCount; }
|
inline int getTriCount() const { return m_triCount; }
|
||||||
|
inline const char* getFileName() const { return m_filename; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void addVertex(float x, float y, float z, int& cap);
|
void addVertex(float x, float y, float z, int& cap);
|
||||||
void addTriangle(int a, int b, int c, int& cap);
|
void addTriangle(int a, int b, int c, int& cap);
|
||||||
|
|
||||||
|
char m_filename[260];
|
||||||
|
|
||||||
float* m_verts;
|
float* m_verts;
|
||||||
int* m_tris;
|
int* m_tris;
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
#include "Sample.h"
|
#include "Sample.h"
|
||||||
|
|
||||||
// Tool to create extra links for InputGeom
|
// Tool to create off-mesh connection for InputGeom
|
||||||
|
|
||||||
class OffMeshConnectionTool : public SampleTool
|
class OffMeshConnectionTool : public SampleTool
|
||||||
{
|
{
|
||||||
|
@ -37,6 +37,7 @@ enum SampleToolType
|
|||||||
TOOL_TILE_EDIT,
|
TOOL_TILE_EDIT,
|
||||||
TOOL_NAVMESH_TESTER,
|
TOOL_NAVMESH_TESTER,
|
||||||
TOOL_OFFMESH_CONNECTION,
|
TOOL_OFFMESH_CONNECTION,
|
||||||
|
TOOL_BOX_VOLUME,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SampleTool
|
struct SampleTool
|
||||||
@ -89,7 +90,6 @@ public:
|
|||||||
virtual void handleRenderOverlay(double* proj, double* model, int* view);
|
virtual void handleRenderOverlay(double* proj, double* model, int* view);
|
||||||
virtual void handleMeshChanged(class InputGeom* geom);
|
virtual void handleMeshChanged(class InputGeom* geom);
|
||||||
virtual bool handleBuild();
|
virtual bool handleBuild();
|
||||||
// virtual void handleNavMeshChanged();
|
|
||||||
|
|
||||||
virtual class InputGeom* getInputGeom() { return m_geom; }
|
virtual class InputGeom* getInputGeom() { return m_geom; }
|
||||||
virtual class dtNavMesh* getNavMesh() { return m_navMesh; }
|
virtual class dtNavMesh* getNavMesh() { return m_navMesh; }
|
||||||
|
152
RecastDemo/Source/BoxVolumeTool.cpp
Normal file
152
RecastDemo/Source/BoxVolumeTool.cpp
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2009 Mikko Mononen memon@inside.org
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied
|
||||||
|
// warranty. In no event will the authors be held liable for any damages
|
||||||
|
// arising from the use of this software.
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it
|
||||||
|
// freely, subject to the following restrictions:
|
||||||
|
// 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
// claim that you wrote the original software. If you use this software
|
||||||
|
// in a product, an acknowledgment in the product documentation would be
|
||||||
|
// appreciated but is not required.
|
||||||
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
// misrepresented as being the original software.
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
|
||||||
|
#define _USE_MATH_DEFINES
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include "SDL.h"
|
||||||
|
#include "SDL_opengl.h"
|
||||||
|
#include "imgui.h"
|
||||||
|
#include "BoxVolumeTool.h"
|
||||||
|
#include "InputGeom.h"
|
||||||
|
#include "Sample.h"
|
||||||
|
#include "Recast.h"
|
||||||
|
#include "RecastDebugDraw.h"
|
||||||
|
#include "DetourDebugDraw.h"
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
# define snprintf _snprintf
|
||||||
|
#endif
|
||||||
|
|
||||||
|
BoxVolumeTool::BoxVolumeTool() :
|
||||||
|
m_sample(0),
|
||||||
|
m_hitPosSet(0),
|
||||||
|
m_areaType(1),
|
||||||
|
m_boxHeight(5.0f)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BoxVolumeTool::~BoxVolumeTool()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxVolumeTool::init(Sample* sample)
|
||||||
|
{
|
||||||
|
m_sample = sample;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxVolumeTool::reset()
|
||||||
|
{
|
||||||
|
m_hitPosSet = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxVolumeTool::handleMenu()
|
||||||
|
{
|
||||||
|
imguiSlider("Box Height", &m_boxHeight, 0.1f, 20.0f, 0.1f);
|
||||||
|
imguiSlider("Area Type", &m_areaType, 1.0f, 20.0f, 1.0f);
|
||||||
|
|
||||||
|
if (!m_hitPosSet)
|
||||||
|
{
|
||||||
|
imguiValue("Click to set connection start.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
imguiValue("Click to set connection end.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxVolumeTool::handleClick(const float* p, bool shift)
|
||||||
|
{
|
||||||
|
if (!m_sample) return;
|
||||||
|
InputGeom* geom = m_sample->getInputGeom();
|
||||||
|
if (!geom) return;
|
||||||
|
|
||||||
|
if (shift)
|
||||||
|
{
|
||||||
|
// Delete
|
||||||
|
// Find nearest link end-point
|
||||||
|
int nearestIndex = -1;
|
||||||
|
const float* verts = geom->getBoxVolumeVerts();
|
||||||
|
for (int i = 0; i < geom->getBoxVolumeCount(); ++i)
|
||||||
|
{
|
||||||
|
const float* bmin = &verts[(i*2+0)*3];
|
||||||
|
const float* bmax = &verts[(i*2+1)*3];
|
||||||
|
if (p[0] >= bmin[0] && p[0] <= bmax[0] &&
|
||||||
|
p[1] >= bmin[1] && p[1] <= bmax[1] &&
|
||||||
|
p[2] >= bmin[2] && p[2] <= bmax[2])
|
||||||
|
{
|
||||||
|
nearestIndex = i; // Each link has two vertices.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If end point close enough, delete it.
|
||||||
|
if (nearestIndex != -1)
|
||||||
|
{
|
||||||
|
geom->deleteBoxVolume(nearestIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Create
|
||||||
|
if (!m_hitPosSet)
|
||||||
|
{
|
||||||
|
vcopy(m_hitPos, p);
|
||||||
|
m_hitPosSet = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
float bmin[3], bmax[3];
|
||||||
|
vcopy(bmin, m_hitPos);
|
||||||
|
vcopy(bmax, m_hitPos);
|
||||||
|
vmin(bmin, p);
|
||||||
|
vmax(bmax, p);
|
||||||
|
bmin[1] -= m_boxHeight/4.0f;
|
||||||
|
bmax[1] = bmin[1]+m_boxHeight;
|
||||||
|
geom->addBoxVolume(bmin, bmax, (unsigned char)m_areaType);
|
||||||
|
|
||||||
|
m_hitPosSet = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxVolumeTool::handleRender()
|
||||||
|
{
|
||||||
|
DebugDrawGL dd;
|
||||||
|
const float s = m_sample->getAgentRadius();
|
||||||
|
|
||||||
|
if (m_hitPosSet)
|
||||||
|
duDebugDrawCross(&dd, m_hitPos[0],m_hitPos[1]+0.1f,m_hitPos[2], s, duRGBA(0,0,0,128), 2.0f);
|
||||||
|
|
||||||
|
InputGeom* geom = m_sample->getInputGeom();
|
||||||
|
if (geom)
|
||||||
|
geom->drawBoxVolumes(&dd, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BoxVolumeTool::handleRenderOverlay(double* proj, double* model, int* view)
|
||||||
|
{
|
||||||
|
GLdouble x, y, z;
|
||||||
|
|
||||||
|
// Draw start and end point labels
|
||||||
|
if (m_hitPosSet && gluProject((GLdouble)m_hitPos[0], (GLdouble)m_hitPos[1], (GLdouble)m_hitPos[2],
|
||||||
|
model, proj, view, &x, &y, &z))
|
||||||
|
{
|
||||||
|
imguiDrawText((int)x, (int)(y-25), IMGUI_ALIGN_CENTER, "Start", imguiRGBA(0,0,0,220));
|
||||||
|
}
|
||||||
|
}
|
@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
#define _USE_MATH_DEFINES
|
#define _USE_MATH_DEFINES
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include "Recast.h"
|
#include "Recast.h"
|
||||||
#include "RecastLog.h"
|
#include "RecastLog.h"
|
||||||
#include "InputGeom.h"
|
#include "InputGeom.h"
|
||||||
@ -67,12 +69,46 @@ static bool intersectSegmentTriangle(const float* sp, const float* sq,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char* parseRow(char* buf, char* bufEnd, char* row, int len)
|
||||||
|
{
|
||||||
|
bool start = true;
|
||||||
|
bool done = false;
|
||||||
|
int n = 0;
|
||||||
|
while (!done && buf < bufEnd)
|
||||||
|
{
|
||||||
|
char c = *buf;
|
||||||
|
buf++;
|
||||||
|
// multirow
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '\n':
|
||||||
|
if (start) break;
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
case '\r':
|
||||||
|
break;
|
||||||
|
case '\t':
|
||||||
|
case ' ':
|
||||||
|
if (start) break;
|
||||||
|
default:
|
||||||
|
start = false;
|
||||||
|
row[n++] = c;
|
||||||
|
if (n >= len-1)
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row[n] = '\0';
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
InputGeom::InputGeom() :
|
InputGeom::InputGeom() :
|
||||||
m_chunkyMesh(0),
|
m_chunkyMesh(0),
|
||||||
m_mesh(0),
|
m_mesh(0),
|
||||||
m_offMeshConCount(0)
|
m_offMeshConCount(0),
|
||||||
|
m_boxVolCount(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,6 +128,7 @@ bool InputGeom::loadMesh(const char* filepath)
|
|||||||
m_mesh = 0;
|
m_mesh = 0;
|
||||||
}
|
}
|
||||||
m_offMeshConCount = 0;
|
m_offMeshConCount = 0;
|
||||||
|
m_boxVolCount = 0;
|
||||||
|
|
||||||
m_mesh = new rcMeshLoaderObj;
|
m_mesh = new rcMeshLoaderObj;
|
||||||
if (!m_mesh)
|
if (!m_mesh)
|
||||||
@ -125,7 +162,123 @@ bool InputGeom::loadMesh(const char* filepath)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool InputGeom::load(const char* filePath)
|
||||||
|
{
|
||||||
|
char* buf = 0;
|
||||||
|
FILE* fp = fopen(filePath, "rb");
|
||||||
|
if (!fp)
|
||||||
|
return false;
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
int bufSize = ftell(fp);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
buf = new char[bufSize];
|
||||||
|
if (!buf)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fread(buf, bufSize, 1, fp);
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
m_offMeshConCount = 0;
|
||||||
|
m_boxVolCount = 0;
|
||||||
|
delete m_mesh;
|
||||||
|
m_mesh = 0;
|
||||||
|
|
||||||
|
char* src = buf;
|
||||||
|
char* srcEnd = buf + bufSize;
|
||||||
|
char row[512];
|
||||||
|
while (src < srcEnd)
|
||||||
|
{
|
||||||
|
// Parse one row
|
||||||
|
row[0] = '\0';
|
||||||
|
src = parseRow(src, srcEnd, row, sizeof(row)/sizeof(char));
|
||||||
|
if (row[0] == 'f')
|
||||||
|
{
|
||||||
|
// File name.
|
||||||
|
const char* name = row+1;
|
||||||
|
// Skip white spaces
|
||||||
|
while (*name && isspace(*name))
|
||||||
|
name++;
|
||||||
|
if (*name)
|
||||||
|
{
|
||||||
|
if (!loadMesh(name))
|
||||||
|
{
|
||||||
|
delete [] buf;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row[0] == 'c')
|
||||||
|
{
|
||||||
|
// Off-mesh connection
|
||||||
|
if (m_offMeshConCount < MAX_OFFMESH_CONNECTIONS)
|
||||||
|
{
|
||||||
|
float* v = &m_offMeshConVerts[m_offMeshConCount*3*2];
|
||||||
|
int bidir;
|
||||||
|
float rad;
|
||||||
|
sscanf(row+1, "%f %f %f %f %f %f %f %d",
|
||||||
|
&v[0], &v[1], &v[2], &v[3], &v[4], &v[5], &rad, &bidir);
|
||||||
|
m_offMeshConRads[m_offMeshConCount] = rad;
|
||||||
|
m_offMeshConDirs[m_offMeshConCount] = bidir;
|
||||||
|
m_offMeshConCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (row[0] == 'b')
|
||||||
|
{
|
||||||
|
// Box volumes
|
||||||
|
if (m_boxVolCount < MAX_BOX_VOLUMES)
|
||||||
|
{
|
||||||
|
float* v = &m_boxVolVerts[m_boxVolCount*3*2];
|
||||||
|
int type;
|
||||||
|
sscanf(row+1, "%f %f %f %f %f %f %d",
|
||||||
|
&v[0], &v[1], &v[2], &v[3], &v[4], &v[5], &type);
|
||||||
|
m_boxVolTypes[m_boxVolCount] = (unsigned char)type;
|
||||||
|
m_boxVolCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete [] buf;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool InputGeom::save(const char* filepath)
|
||||||
|
{
|
||||||
|
if (!m_mesh) return false;
|
||||||
|
|
||||||
|
FILE* fp = fopen(filepath, "w");
|
||||||
|
if (!fp) return false;
|
||||||
|
|
||||||
|
// Store mesh filename.
|
||||||
|
fprintf(fp, "f %s\n", m_mesh->getFileName());
|
||||||
|
|
||||||
|
// Store off-mesh links.
|
||||||
|
for (int i = 0; i < m_offMeshConCount; ++i)
|
||||||
|
{
|
||||||
|
const float* v = &m_offMeshConVerts[i*3*2];
|
||||||
|
const float rad = m_offMeshConRads[i];
|
||||||
|
const int bidir = m_offMeshConDirs[i];
|
||||||
|
fprintf(fp, "c %f %f %f %f %f %f %f %d\n",
|
||||||
|
v[0], v[1], v[2], v[3], v[4], v[5], rad, bidir);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Box volumes
|
||||||
|
for (int i = 0; i < m_boxVolCount; ++i)
|
||||||
|
{
|
||||||
|
const float* v = &m_boxVolVerts[i*3*2];
|
||||||
|
const int bidir = m_boxVolTypes[i];
|
||||||
|
fprintf(fp, "b %f %f %f %f %f %f %d\n",
|
||||||
|
v[0], v[1], v[2], v[3], v[4], v[5], bidir);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool InputGeom::raycastMesh(float* src, float* dst, float& tmin)
|
bool InputGeom::raycastMesh(float* src, float* dst, float& tmin)
|
||||||
{
|
{
|
||||||
float dir[3];
|
float dir[3];
|
||||||
@ -211,3 +364,39 @@ void InputGeom::drawOffMeshConnections(duDebugDraw* dd, bool hilight)
|
|||||||
|
|
||||||
dd->depthMask(true);
|
dd->depthMask(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InputGeom::addBoxVolume(const float* bmin, const float* bmax, unsigned char type)
|
||||||
|
{
|
||||||
|
if (m_boxVolCount >= MAX_OFFMESH_CONNECTIONS) return;
|
||||||
|
float* v = &m_boxVolVerts[m_boxVolCount*3*2];
|
||||||
|
m_boxVolTypes[m_boxVolCount] = type;
|
||||||
|
vcopy(&v[0], bmin);
|
||||||
|
vcopy(&v[3], bmax);
|
||||||
|
m_boxVolCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputGeom::deleteBoxVolume(int i)
|
||||||
|
{
|
||||||
|
m_boxVolCount--;
|
||||||
|
float* src = &m_boxVolVerts[m_boxVolCount*3*2];
|
||||||
|
float* dst = &m_boxVolVerts[i*3*2];
|
||||||
|
vcopy(&dst[0], &src[0]);
|
||||||
|
vcopy(&dst[3], &src[3]);
|
||||||
|
m_boxVolTypes[i] = m_boxVolTypes[m_boxVolCount];
|
||||||
|
}
|
||||||
|
|
||||||
|
void InputGeom::drawBoxVolumes(struct duDebugDraw* dd, bool hilight)
|
||||||
|
{
|
||||||
|
dd->depthMask(false);
|
||||||
|
|
||||||
|
dd->begin(DU_DRAW_LINES, 1.0f);
|
||||||
|
for (int i = 0; i < m_boxVolCount; ++i)
|
||||||
|
{
|
||||||
|
unsigned int col = duIntToCol(m_boxVolTypes[i], 220);
|
||||||
|
const float* bounds = &m_boxVolVerts[i*3*2];
|
||||||
|
duAppendBoxWire(dd, bounds[0],bounds[1],bounds[2],bounds[3],bounds[4],bounds[5], col);
|
||||||
|
}
|
||||||
|
dd->end();
|
||||||
|
|
||||||
|
dd->depthMask(true);
|
||||||
|
}
|
||||||
|
@ -215,5 +215,8 @@ bool rcMeshLoaderObj::load(const char* filename)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
strncpy(m_filename, filename, sizeof(m_filename));
|
||||||
|
m_filename[sizeof(m_filename)-1] = '\0';
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -112,8 +112,6 @@ void OffMeshConnectionTool::handleClick(const float* p, bool shift)
|
|||||||
{
|
{
|
||||||
geom->deleteOffMeshConnection(nearestIndex);
|
geom->deleteOffMeshConnection(nearestIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// geom->updateOffMeshConnectionVisibility(m_sample->getNavMesh());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -127,7 +125,6 @@ void OffMeshConnectionTool::handleClick(const float* p, bool shift)
|
|||||||
{
|
{
|
||||||
geom->addOffMeshConnection(m_hitPos, p, m_sample->getAgentRadius(), m_bidir ? 1 : 0);
|
geom->addOffMeshConnection(m_hitPos, p, m_sample->getAgentRadius(), m_bidir ? 1 : 0);
|
||||||
m_hitPosSet = false;
|
m_hitPosSet = false;
|
||||||
// geom->updateOffMeshConnectionVisibility(m_sample->getNavMesh());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "DetourDebugDraw.h"
|
#include "DetourDebugDraw.h"
|
||||||
#include "NavMeshTesterTool.h"
|
#include "NavMeshTesterTool.h"
|
||||||
#include "OffMeshConnectionTool.h"
|
#include "OffMeshConnectionTool.h"
|
||||||
|
#include "BoxVolumeTool.h"
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
# define snprintf _snprintf
|
# define snprintf _snprintf
|
||||||
@ -99,6 +100,10 @@ void Sample_SoloMeshSimple::handleTools()
|
|||||||
{
|
{
|
||||||
setTool(new OffMeshConnectionTool);
|
setTool(new OffMeshConnectionTool);
|
||||||
}
|
}
|
||||||
|
if (imguiCheck("Create Box Volumes", type == TOOL_BOX_VOLUME))
|
||||||
|
{
|
||||||
|
setTool(new BoxVolumeTool);
|
||||||
|
}
|
||||||
|
|
||||||
imguiSeparator();
|
imguiSeparator();
|
||||||
|
|
||||||
@ -198,6 +203,7 @@ void Sample_SoloMeshSimple::handleRender()
|
|||||||
m_geom->getMesh()->getTris(), m_geom->getMesh()->getNormals(), m_geom->getMesh()->getTriCount(),
|
m_geom->getMesh()->getTris(), m_geom->getMesh()->getNormals(), m_geom->getMesh()->getTriCount(),
|
||||||
m_agentMaxSlope);
|
m_agentMaxSlope);
|
||||||
m_geom->drawOffMeshConnections(&dd);
|
m_geom->drawOffMeshConnections(&dd);
|
||||||
|
m_geom->drawBoxVolumes(&dd);
|
||||||
}
|
}
|
||||||
else if (m_drawMode != DRAWMODE_NAVMESH_TRANS)
|
else if (m_drawMode != DRAWMODE_NAVMESH_TRANS)
|
||||||
{
|
{
|
||||||
@ -205,6 +211,7 @@ void Sample_SoloMeshSimple::handleRender()
|
|||||||
duDebugDrawTriMesh(&dd, m_geom->getMesh()->getVerts(), m_geom->getMesh()->getVertCount(),
|
duDebugDrawTriMesh(&dd, m_geom->getMesh()->getVerts(), m_geom->getMesh()->getVertCount(),
|
||||||
m_geom->getMesh()->getTris(), m_geom->getMesh()->getNormals(), m_geom->getMesh()->getTriCount(), 0);
|
m_geom->getMesh()->getTris(), m_geom->getMesh()->getNormals(), m_geom->getMesh()->getTriCount(), 0);
|
||||||
m_geom->drawOffMeshConnections(&dd);
|
m_geom->drawOffMeshConnections(&dd);
|
||||||
|
m_geom->drawBoxVolumes(&dd);
|
||||||
}
|
}
|
||||||
|
|
||||||
glDisable(GL_FOG);
|
glDisable(GL_FOG);
|
||||||
|
@ -256,6 +256,49 @@ int main(int argc, char *argv[])
|
|||||||
showTestCases = true;
|
showTestCases = true;
|
||||||
scanDirectory("Tests", ".txt", files);
|
scanDirectory("Tests", ".txt", files);
|
||||||
}
|
}
|
||||||
|
else if (event.key.keysym.sym == SDLK_1)
|
||||||
|
{
|
||||||
|
if (geom)
|
||||||
|
geom->save("geomset.txt");
|
||||||
|
}
|
||||||
|
else if (event.key.keysym.sym == SDLK_2)
|
||||||
|
{
|
||||||
|
delete geom;
|
||||||
|
geom = new InputGeom;
|
||||||
|
if (!geom || !geom->load("geomset.txt"))
|
||||||
|
{
|
||||||
|
delete geom;
|
||||||
|
geom = 0;
|
||||||
|
|
||||||
|
showLog = true;
|
||||||
|
logScroll = 0;
|
||||||
|
printf("Geom load log %s:\n", meshName);
|
||||||
|
for (int i = 0; i < log.getMessageCount(); ++i)
|
||||||
|
printf("%s\n", log.getMessageText(i));
|
||||||
|
}
|
||||||
|
if (sample && geom)
|
||||||
|
{
|
||||||
|
sample->handleMeshChanged(geom);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (geom)
|
||||||
|
{
|
||||||
|
const float* bmin = geom->getMeshBoundsMin();
|
||||||
|
const float* bmax = geom->getMeshBoundsMax();
|
||||||
|
// Reset camera and fog to match the mesh bounds.
|
||||||
|
camr = sqrtf(rcSqr(bmax[0]-bmin[0]) +
|
||||||
|
rcSqr(bmax[1]-bmin[1]) +
|
||||||
|
rcSqr(bmax[2]-bmin[2])) / 2;
|
||||||
|
camx = (bmax[0] + bmin[0]) / 2 + camr;
|
||||||
|
camy = (bmax[1] + bmin[1]) / 2 + camr;
|
||||||
|
camz = (bmax[2] + bmin[2]) / 2 + camr;
|
||||||
|
camr *= 3;
|
||||||
|
rx = 45;
|
||||||
|
ry = -45;
|
||||||
|
glFogf(GL_FOG_START, camr*0.2f);
|
||||||
|
glFogf(GL_FOG_END, camr*1.25f);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user